comparison src/gtklog.c @ 12232:375f1f3817a8

[gaim-migrate @ 14534] Displaying large logs is slow. Let's show the busy cursor whenever possible. This currently doesn't show the busy cursor over the IMHTMLs in a conversation window even though I set a busy cursor for the conversation window. I looked into fixing that, but I'm not sure exactly what the best way to deal with it is. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Sun, 27 Nov 2005 03:20:35 +0000
parents 3ba50c385299
children e856f985a0b9
comparison
equal deleted inserted replaced
12231:c342eb6e8cd3 12232:375f1f3817a8
85 85
86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) 86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv)
87 { 87 {
88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); 88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry));
89 GList *logs; 89 GList *logs;
90 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); 90 GdkCursor *cursor;
91 91
92 if (lv->search != NULL) 92 if (lv->search != NULL)
93 g_free(lv->search); 93 g_free(lv->search);
94 94
95 gtk_tree_store_clear(lv->treestore); 95 gtk_tree_store_clear(lv->treestore);
96 if (strlen(search_term) == 0) {/* reset the tree */ 96 if (!(*search_term)) {
97 /* reset the tree */
97 populate_log_tree(lv); 98 populate_log_tree(lv);
98 lv->search = NULL; 99 lv->search = NULL;
99 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); 100 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml));
100 return; 101 return;
101 } 102 }
102 103
103 lv->search = g_strdup(search_term); 104 lv->search = g_strdup(search_term);
104 105
106 cursor = gdk_cursor_new(GDK_WATCH);
105 gdk_window_set_cursor(lv->window->window, cursor); 107 gdk_window_set_cursor(lv->window->window, cursor);
108 gdk_cursor_unref(cursor);
106 while (gtk_events_pending()) 109 while (gtk_events_pending())
107 gtk_main_iteration(); 110 gtk_main_iteration();
108 gdk_cursor_unref(cursor);
109 111
110 for (logs = lv->logs; logs != NULL; logs = logs->next) { 112 for (logs = lv->logs; logs != NULL; logs = logs->next) {
111 char *read = gaim_log_read((GaimLog*)logs->data, NULL); 113 char *read = gaim_log_read((GaimLog*)logs->data, NULL);
112 if (gaim_strcasestr(read, search_term)) { 114 if (read && *read && gaim_strcasestr(read, search_term)) {
113 GtkTreeIter iter; 115 GtkTreeIter iter;
114 GaimLog *log = logs->data; 116 GaimLog *log = logs->data;
115 char title[64]; 117 char title[64];
116 char *title_utf8; /* temporary variable for utf8 conversion */ 118 char *title_utf8; /* temporary variable for utf8 conversion */
119
117 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); 120 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time));
118 title_utf8 = gaim_utf8_try_convert(title); 121 title_utf8 = gaim_utf8_try_convert(title);
119 strncpy(title, title_utf8, sizeof(title)); 122 strncpy(title, title_utf8, sizeof(title));
120 g_free(title_utf8); 123 g_free(title_utf8);
124
121 gtk_tree_store_append (lv->treestore, &iter, NULL); 125 gtk_tree_store_append (lv->treestore, &iter, NULL);
122 gtk_tree_store_set(lv->treestore, &iter, 126 gtk_tree_store_set(lv->treestore, &iter,
123 0, title, 127 0, title,
124 1, log, -1); 128 1, log, -1);
125 } 129 }
126 g_free(read); 130 g_free(read);
127 } 131 }
128 132
129 133 gdk_window_set_cursor(lv->window->window, NULL);
130 cursor = gdk_cursor_new(GDK_LEFT_PTR);
131 gdk_window_set_cursor(lv->window->window, cursor);
132 gdk_cursor_unref(cursor);
133 } 134 }
134 135
135 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { 136 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) {
136 GaimGtkLogViewer *lv = syslog_viewer; 137 GaimGtkLogViewer *lv = syslog_viewer;
137 138
175 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { 176 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) {
176 GtkTreeIter iter; 177 GtkTreeIter iter;
177 GValue val = { 0, }; 178 GValue val = { 0, };
178 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); 179 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore);
179 GaimLog *log = NULL; 180 GaimLog *log = NULL;
181 GdkCursor *cursor;
180 GaimLogReadFlags flags; 182 GaimLogReadFlags flags;
181 char *read = NULL; 183 char *read = NULL;
182 char time[64]; 184 char time[64];
183 185
184 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) 186 if (!gtk_tree_selection_get_selected(sel, &model, &iter))
187 log = g_value_get_pointer(&val); 189 log = g_value_get_pointer(&val);
188 g_value_unset(&val); 190 g_value_unset(&val);
189 191
190 if (log == NULL) 192 if (log == NULL)
191 return; 193 return;
194
195 /* When we set the initial log, this gets called and the window is still NULL. */
196 if (viewer->window->window != NULL)
197 {
198 cursor = gdk_cursor_new(GDK_WATCH);
199 gdk_window_set_cursor(viewer->window->window, cursor);
200 gdk_cursor_unref(cursor);
201 while (gtk_events_pending())
202 gtk_main_iteration();
203 }
192 204
193 if (log->type != GAIM_LOG_SYSTEM) { 205 if (log->type != GAIM_LOG_SYSTEM) {
194 char *title; 206 char *title;
195 char *title_utf8; /* temporary variable for utf8 conversion */ 207 char *title_utf8; /* temporary variable for utf8 conversion */
196 208
218 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), 230 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml),
219 gaim_account_get_protocol_name(log->account)); 231 gaim_account_get_protocol_name(log->account));
220 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, 232 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read,
221 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | 233 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL |
222 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); 234 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0));
235 g_free(read);
223 236
224 if (viewer->search != NULL) { 237 if (viewer->search != NULL) {
225 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); 238 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml));
226 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); 239 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search);
227 } 240 }
228 241
229 g_free(read); 242 /* When we set the initial log, this gets called and the window is still NULL. */
243 if (viewer->window->window != NULL)
244 gdk_window_set_cursor(viewer->window->window, NULL);
230 } 245 }
231 246
232 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. 247 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet.
233 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," 248 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week,"
234 * "August," "2002," etc. based on how many conversation took place in each subdivision. 249 * "August," "2002," etc. based on how many conversation took place in each subdivision.