Mercurial > pidgin.yaz
comparison src/gtklog.c @ 13434:ffd724befbf8
[gaim-migrate @ 15809]
Cleanup the busy cursor handling code to eliminate a bunch of these loops:
while (gtk_events_pending())
gtk_main_iteration();
They seem like a race condition waiting to happen. This code is also simpler,
and more generic.
This leaves only one such loop, in src/gtkblist.c's gaim_gtk_blist_expand_contact_cb().
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 07 Mar 2006 05:48:54 +0000 |
parents | 3de53fe8345f |
children | 6034444bbcf5 |
comparison
equal
deleted
inserted
replaced
13433:7ef6a2d0d9da | 13434:ffd724befbf8 |
---|---|
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; | |
91 | 90 |
92 if (lv->search != NULL) | 91 if (lv->search != NULL) |
93 g_free(lv->search); | 92 g_free(lv->search); |
94 | 93 |
95 gtk_tree_store_clear(lv->treestore); | 94 gtk_tree_store_clear(lv->treestore); |
101 return; | 100 return; |
102 } | 101 } |
103 | 102 |
104 lv->search = g_strdup(search_term); | 103 lv->search = g_strdup(search_term); |
105 | 104 |
106 cursor = gdk_cursor_new(GDK_WATCH); | 105 gaim_gtk_set_cursor(lv->window, GDK_WATCH); |
107 gdk_window_set_cursor(lv->window->window, cursor); | |
108 gdk_cursor_unref(cursor); | |
109 while (gtk_events_pending()) | |
110 gtk_main_iteration(); | |
111 | 106 |
112 for (logs = lv->logs; logs != NULL; logs = logs->next) { | 107 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
113 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | 108 char *read = gaim_log_read((GaimLog*)logs->data, NULL); |
114 if (read && *read && gaim_strcasestr(read, search_term)) { | 109 if (read && *read && gaim_strcasestr(read, search_term)) { |
115 GtkTreeIter iter; | 110 GtkTreeIter iter; |
121 1, log, -1); | 116 1, log, -1); |
122 } | 117 } |
123 g_free(read); | 118 g_free(read); |
124 } | 119 } |
125 | 120 |
126 gdk_window_set_cursor(lv->window->window, NULL); | 121 gaim_gtk_clear_cursor(lv->window); |
127 } | 122 } |
128 | 123 |
129 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { | 124 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
130 GaimGtkLogViewer *lv = syslog_viewer; | 125 GaimGtkLogViewer *lv = syslog_viewer; |
131 | 126 |
169 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { | 164 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
170 GtkTreeIter iter; | 165 GtkTreeIter iter; |
171 GValue val; | 166 GValue val; |
172 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); | 167 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); |
173 GaimLog *log = NULL; | 168 GaimLog *log = NULL; |
174 GdkCursor *cursor; | |
175 GaimLogReadFlags flags; | 169 GaimLogReadFlags flags; |
176 char *read = NULL; | 170 char *read = NULL; |
177 | 171 |
178 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) | 172 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
179 return; | 173 return; |
184 g_value_unset(&val); | 178 g_value_unset(&val); |
185 | 179 |
186 if (log == NULL) | 180 if (log == NULL) |
187 return; | 181 return; |
188 | 182 |
189 /* When we set the initial log, this gets called and the window is still NULL. */ | 183 gaim_gtk_set_cursor(viewer->window, GDK_WATCH); |
190 if (viewer->window->window != NULL) | |
191 { | |
192 cursor = gdk_cursor_new(GDK_WATCH); | |
193 gdk_window_set_cursor(viewer->window->window, cursor); | |
194 gdk_cursor_unref(cursor); | |
195 while (gtk_events_pending()) | |
196 gtk_main_iteration(); | |
197 } | |
198 | 184 |
199 if (log->type != GAIM_LOG_SYSTEM) { | 185 if (log->type != GAIM_LOG_SYSTEM) { |
200 char *title; | 186 char *title; |
201 if (log->type == GAIM_LOG_CHAT) | 187 if (log->type == GAIM_LOG_CHAT) |
202 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"), | 188 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"), |
230 if (viewer->search != NULL) { | 216 if (viewer->search != NULL) { |
231 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); | 217 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
232 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); | 218 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
233 } | 219 } |
234 | 220 |
235 /* When we set the initial log, this gets called and the window is still NULL. */ | 221 gaim_gtk_clear_cursor(viewer->window); |
236 if (viewer->window->window != NULL) | |
237 gdk_window_set_cursor(viewer->window->window, NULL); | |
238 } | 222 } |
239 | 223 |
240 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | 224 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. |
241 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | 225 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," |
242 * "August," "2002," etc. based on how many conversation took place in each subdivision. | 226 * "August," "2002," etc. based on how many conversation took place in each subdivision. |