comparison plugins/notify.c @ 11581:9b3833da6840

[gaim-migrate @ 13851] goodbye GaimConvWindow. Still some problems with this patch: - Scarey warnings console with gaim -d when closing tab - I tried to seperate gtkconv and gtkconvwin, but failed, as a result it has its own header, but the code is in the same file, which is rather weird. Also some code got moved around for no good reason. Feel free to move it back or reorganize it. - I broke the gesters plugin, and just disabled it. Hopefully someone with more time will fix it, it shouldn't take long, but I didn't feel like bothering. - This list is incomplete. committer: Tailor Script <tailor@pidgin.im>
author Tim Ringenbach <marv@pidgin.im>
date Sun, 02 Oct 2005 00:32:49 +0000
parents ef6e94bdda08
children 243dd81341a7
comparison
equal deleted inserted replaced
11580:24169af08585 11581:9b3833da6840
38 * 22:23:25 <deryni> seanegan: To what? 38 * 22:23:25 <deryni> seanegan: To what?
39 * 22:23:42 <seanegan> deryni: I dunno. Flash it between the regular icon and 39 * 22:23:42 <seanegan> deryni: I dunno. Flash it between the regular icon and
40 * blank or something. 40 * blank or something.
41 * 22:23:53 <deryni> Also I think gaim might re-set that sort of frequently, 41 * 22:23:53 <deryni> Also I think gaim might re-set that sort of frequently,
42 * but I'd have to look. 42 * but I'd have to look.
43 * 22:25:16 <seanegan> deryni: I keep my conversations in one workspace and am 43 * 22:25:16 <seanegan> deryni: I keep my conversations in one workspace and am
44 * frequently in an another, and the icon flashing in the pager would be a 44 * frequently in an another, and the icon flashing in the pager would be a
45 * neat visual clue. 45 * neat visual clue.
46 */ 46 */
47 47
48 /* 48 /*
95 #include "gtkprefs.h" 95 #include "gtkprefs.h"
96 96
97 #include "prefs.h" 97 #include "prefs.h"
98 #include "signals.h" 98 #include "signals.h"
99 #include "version.h" 99 #include "version.h"
100 #include "debug.h"
100 101
101 #include "gtkplugin.h" 102 #include "gtkplugin.h"
102 #include "gtkutils.h" 103 #include "gtkutils.h"
103 104
104 #include <X11/Xatom.h> 105 #include <X11/Xatom.h>
109 110
110 static GaimPlugin *my_plugin = NULL; 111 static GaimPlugin *my_plugin = NULL;
111 112
112 /* notification set/unset */ 113 /* notification set/unset */
113 static int notify(GaimConversation *conv, gboolean increment); 114 static int notify(GaimConversation *conv, gboolean increment);
114 static void notify_win(GaimConvWindow *gaimwin); 115 static void notify_win(GaimGtkWindow *gaimwin);
115 static void unnotify(GaimConversation *conv, gboolean reset); 116 static void unnotify(GaimConversation *conv, gboolean reset);
116 static int unnotify_cb(GtkWidget *widget, gpointer data, GaimConversation *conv); 117 static int unnotify_cb(GtkWidget *widget, gpointer data, GaimConversation *conv);
117 118
118 /* gtk widget callbacks for prefs panel */ 119 /* gtk widget callbacks for prefs panel */
119 static void type_toggle_cb(GtkWidget *widget, gpointer data); 120 static void type_toggle_cb(GtkWidget *widget, gpointer data);
122 static gboolean options_entry_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); 123 static gboolean options_entry_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data);
123 static void apply_method(); 124 static void apply_method();
124 static void apply_notify(); 125 static void apply_notify();
125 126
126 /* string function */ 127 /* string function */
127 static void handle_string(GaimConvWindow *gaimwin); 128 static void handle_string(GaimGtkWindow *gaimwin);
128 129
129 /* count function */ 130 /* count function */
130 static void handle_count(GaimConvWindow *gaimwin); 131 static void handle_count(GaimGtkWindow *gaimwin);
131 132
132 /* urgent function */ 133 /* urgent function */
133 static void handle_urgent(GaimConvWindow *gaimwin, gboolean add); 134 static void handle_urgent(GaimGtkWindow *gaimwin, gboolean add);
134 135
135 /* raise function */ 136 /* raise function */
136 static void handle_raise(GaimConvWindow *gaimwin); 137 static void handle_raise(GaimGtkWindow *gaimwin);
137 138
138 /****************************************/ 139 /****************************************/
139 /* Begin doing stuff below this line... */ 140 /* Begin doing stuff below this line... */
140 /****************************************/ 141 /****************************************/
141 static int 142 static int
142 count_messages(GaimConvWindow *gaimwin) 143 count_messages(GaimGtkWindow *gaimwin)
143 { 144 {
144 gint count = 0; 145 gint count = 0;
145 GList *convs = NULL; 146 GList *convs = NULL, *l;
146 147
147 for (convs = gaim_conv_window_get_conversations(gaimwin); 148 for (convs = gaimwin->gtkconvs; convs != NULL; convs = convs->next) {
148 convs != NULL; convs = convs->next) { 149 GaimGtkConversation *conv = convs->data;
149 GaimConversation *conv = convs->data; 150 for (l = conv->convs; l != NULL; l = l->next) {
150 count += GPOINTER_TO_INT(gaim_conversation_get_data(conv, "notify-message-count")); 151 count += GPOINTER_TO_INT(gaim_conversation_get_data(l->data, "notify-message-count"));
152 }
151 } 153 }
152 154
153 return count; 155 return count;
154 } 156 }
155 157
156 static int 158 static int
157 notify(GaimConversation *conv, gboolean increment) 159 notify(GaimConversation *conv, gboolean increment)
158 { 160 {
159 GaimConvWindow *gaimwin = NULL; 161 GaimGtkWindow *gaimwin = NULL;
160 gint count; 162 gint count;
161 gboolean has_focus; 163 gboolean has_focus;
162 164
163 if (conv == NULL) 165 if (conv == NULL)
164 return 0; 166 return 0;
165 167
166 /* We want to remove the notifications, but not reset the counter */ 168 /* We want to remove the notifications, but not reset the counter */
167 unnotify(conv, FALSE); 169 unnotify(conv, FALSE);
168 170
169 gaimwin = gaim_conversation_get_window(conv); 171 gaimwin = GAIM_GTK_CONVERSATION(conv)->win;
170 172
171 /* If we aren't doing notifications for this type of conversation, return */ 173 /* If we aren't doing notifications for this type of conversation, return */
172 if (((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) && 174 if (((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) &&
173 !gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_im")) || 175 !gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_im")) ||
174 ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) && 176 ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) &&
175 !gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_chat"))) 177 !gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_chat")))
176 return 0; 178 return 0;
177 179
178 g_object_get(G_OBJECT(GAIM_GTK_WINDOW(gaimwin)->window), 180 g_object_get(G_OBJECT(gaimwin->window),
179 "has-toplevel-focus", &has_focus, NULL); 181 "has-toplevel-focus", &has_focus, NULL);
180 182
181 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_focused") || 183 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/type_focused") ||
182 !has_focus) { 184 !has_focus) {
183 if (increment) { 185 if (increment) {
191 193
192 return 0; 194 return 0;
193 } 195 }
194 196
195 static void 197 static void
196 notify_win(GaimConvWindow *gaimwin) 198 notify_win(GaimGtkWindow *gaimwin)
197 { 199 {
198 if (count_messages(gaimwin) <= 0) 200 if (count_messages(gaimwin) <= 0)
199 return; 201 return;
200 202
201 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/method_count")) 203 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/method_count"))
210 212
211 static void 213 static void
212 unnotify(GaimConversation *conv, gboolean reset) 214 unnotify(GaimConversation *conv, gboolean reset)
213 { 215 {
214 GaimConversation *active_conv = NULL; 216 GaimConversation *active_conv = NULL;
215 GaimConvWindow *gaimwin = NULL; 217 GaimGtkWindow *gaimwin = NULL;
216 218
217 g_return_if_fail(conv != NULL); 219 g_return_if_fail(conv != NULL);
218 220
219 gaimwin = gaim_conversation_get_window(conv); 221 gaimwin = GAIM_GTK_CONVERSATION(conv)->win;
220 active_conv = gaim_conv_window_get_active_conversation(gaimwin); 222 active_conv = gaim_gtk_conv_window_get_active_conversation(gaimwin);
221 223
222 /* reset the conversation window title */ 224 /* reset the conversation window title */
223 gaim_conversation_autoset_title(active_conv); 225 gaim_conversation_autoset_title(active_conv);
224 226
225 if (reset) { 227 if (reset) {
291 GaimGtkWindow *gtkwin = NULL; 293 GaimGtkWindow *gtkwin = NULL;
292 GSList *window_ids = NULL, *imhtml_ids = NULL, *entry_ids = NULL; 294 GSList *window_ids = NULL, *imhtml_ids = NULL, *entry_ids = NULL;
293 guint id; 295 guint id;
294 296
295 gtkconv = GAIM_GTK_CONVERSATION(conv); 297 gtkconv = GAIM_GTK_CONVERSATION(conv);
296 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); 298 if (!gtkconv) {
299 gaim_debug_misc("notify", "Failed to find gtkconv\n");
300 return 0;
301 }
302
303 gtkwin = gtkconv->win;
297 304
298 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/notify_focus")) { 305 if (gaim_prefs_get_bool("/plugins/gtk/X11/notify/notify_focus")) {
299 /* TODO should really find a way to make this work no matter where the 306 /* TODO should really find a way to make this work no matter where the
300 * focus is inside the conv window, without having to bind to 307 * focus is inside the conv window, without having to bind to
301 * focus-in-event on the g(d|t)kwindow */ 308 * focus-in-event on the g(d|t)kwindow */
341 GaimGtkConversation *gtkconv = NULL; 348 GaimGtkConversation *gtkconv = NULL;
342 GaimGtkWindow *gtkwin = NULL; 349 GaimGtkWindow *gtkwin = NULL;
343 GSList *ids = NULL; 350 GSList *ids = NULL;
344 351
345 gtkconv = GAIM_GTK_CONVERSATION(conv); 352 gtkconv = GAIM_GTK_CONVERSATION(conv);
346 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); 353 if (!gtkconv)
354 return;
355 gtkwin = gtkconv->win;
347 356
348 ids = gaim_conversation_get_data(conv, "notify-window-signals"); 357 ids = gaim_conversation_get_data(conv, "notify-window-signals");
349 for (; ids != NULL; ids = ids->next) 358 for (; ids != NULL; ids = ids->next)
350 g_signal_handler_disconnect(gtkwin->window, GPOINTER_TO_INT(ids->data)); 359 g_signal_handler_disconnect(gtkwin->window, GPOINTER_TO_INT(ids->data));
351 360
365 } 374 }
366 375
367 static void 376 static void
368 conv_created(GaimConversation *conv) 377 conv_created(GaimConversation *conv)
369 { 378 {
370 GaimConvWindow *gaimwin = NULL;
371 GaimGtkWindow *gtkwin = NULL;
372
373 gaimwin = gaim_conversation_get_window(conv);
374
375 if (gaimwin == NULL)
376 return;
377
378 gtkwin = GAIM_GTK_WINDOW(gaimwin);
379
380 gaim_conversation_set_data(conv, "notify-message-count", GINT_TO_POINTER(0)); 379 gaim_conversation_set_data(conv, "notify-message-count", GINT_TO_POINTER(0));
381 380
382 /* always attach the signals, notify() will take care of conversation type 381 /* always attach the signals, notify() will take care of conversation type
383 * checking */ 382 * checking */
384 attach_signals(conv); 383 attach_signals(conv);
386 385
387 static void 386 static void
388 conv_switched(GaimConversation *old_conv, GaimConversation *new_conv) 387 conv_switched(GaimConversation *old_conv, GaimConversation *new_conv)
389 { 388 {
390 #if 0 389 #if 0
391 GaimConvWindow *gaimwin = gaim_conversation_get_window(new_conv); 390 GaimGtkWindow *gaimwin = gaim_conversation_get_window(new_conv);
392 #endif 391 #endif
393 392
394 /* 393 /*
395 * If the conversation was switched, then make sure we re-notify 394 * If the conversation was switched, then make sure we re-notify
396 * because Gaim will have overwritten our custom window title. 395 * because Gaim will have overwritten our custom window title.
412 } 411 }
413 412
414 static void 413 static void
415 deleting_conv(GaimConversation *conv) 414 deleting_conv(GaimConversation *conv)
416 { 415 {
417 GaimConvWindow *gaimwin = NULL; 416 GaimGtkWindow *gaimwin = NULL;
418 417
419 detach_signals(conv); 418 detach_signals(conv);
420 419
421 unnotify(conv, TRUE); 420 unnotify(conv, TRUE);
422 421
423 gaimwin = gaim_conversation_get_window(conv); 422 gaimwin = GAIM_GTK_CONVERSATION(conv)->win;
423 #if 0
424 /* i think this line crashes */
424 if (count_messages(gaimwin)) 425 if (count_messages(gaimwin))
425 notify_win(gaimwin); 426 notify_win(gaimwin);
427 #endif
426 } 428 }
427 429
428 #if 0 430 #if 0
429 static void 431 static void
430 conversation_dragging(GaimConversation *active_conv, 432 conversation_dragging(GaimConversation *active_conv,
431 GaimConvWindow *old_gaimwin, 433 GaimGtkWindow *old_gaimwin,
432 GaimConvWindow *new_gaimwin) 434 GaimGtkWindow *new_gaimwin)
433 { 435 {
434 if (old_gaimwin != new_gaimwin) { 436 if (old_gaimwin != new_gaimwin) {
435 if (old_gaimwin == NULL) { 437 if (old_gaimwin == NULL) {
436 /* 438 /*
437 gaim_conversation_autoset_title(active_conv); 439 gaim_conversation_autoset_title(active_conv);
473 } 475 }
474 } 476 }
475 #endif 477 #endif
476 478
477 static void 479 static void
478 handle_string(GaimConvWindow *gaimwin) 480 handle_string(GaimGtkWindow *gaimwin)
479 { 481 {
480 GtkWindow *window = NULL; 482 GtkWindow *window = NULL;
481 gchar newtitle[256]; 483 gchar newtitle[256];
482 484
483 g_return_if_fail(gaimwin != NULL); 485 g_return_if_fail(gaimwin != NULL);
484 486
485 window = GTK_WINDOW(GAIM_GTK_WINDOW(gaimwin)->window); 487 window = GTK_WINDOW(gaimwin->window);
486 g_return_if_fail(window != NULL); 488 g_return_if_fail(window != NULL);
487 489
488 g_snprintf(newtitle, sizeof(newtitle), "%s%s", 490 g_snprintf(newtitle, sizeof(newtitle), "%s%s",
489 gaim_prefs_get_string("/plugins/gtk/X11/notify/title_string"), 491 gaim_prefs_get_string("/plugins/gtk/X11/notify/title_string"),
490 gtk_window_get_title(window)); 492 gtk_window_get_title(window));
491 gtk_window_set_title(window, newtitle); 493 gtk_window_set_title(window, newtitle);
492 } 494 }
493 495
494 static void 496 static void
495 handle_count(GaimConvWindow *gaimwin) 497 handle_count(GaimGtkWindow *gaimwin)
496 { 498 {
497 GtkWindow *window; 499 GtkWindow *window;
498 char newtitle[256]; 500 char newtitle[256];
499 501
500 g_return_if_fail(gaimwin != NULL); 502 g_return_if_fail(gaimwin != NULL);
501 503
502 window = GTK_WINDOW(GAIM_GTK_WINDOW(gaimwin)->window); 504 window = GTK_WINDOW(gaimwin->window);
503 g_return_if_fail(window != NULL); 505 g_return_if_fail(window != NULL);
504 506
505 g_snprintf(newtitle, sizeof(newtitle), "[%d] %s", 507 g_snprintf(newtitle, sizeof(newtitle), "[%d] %s",
506 count_messages(gaimwin), gtk_window_get_title(window)); 508 count_messages(gaimwin), gtk_window_get_title(window));
507 gtk_window_set_title(window, newtitle); 509 gtk_window_set_title(window, newtitle);
508 } 510 }
509 511
510 static void 512 static void
511 handle_urgent(GaimConvWindow *gaimwin, gboolean add) 513 handle_urgent(GaimGtkWindow *win, gboolean add)
512 { 514 {
513 XWMHints *hints; 515 XWMHints *hints;
514 GaimGtkWindow *gtkwin = GAIM_GTK_WINDOW(gaimwin); 516
515 517 g_return_if_fail(win != NULL);
516 g_return_if_fail(gtkwin != NULL); 518 g_return_if_fail(win->window != NULL);
517 g_return_if_fail(gtkwin->window != NULL); 519 g_return_if_fail(win->window->window != NULL);
518 g_return_if_fail(gtkwin->window->window != NULL); 520
519 521 hints = XGetWMHints(GDK_WINDOW_XDISPLAY(win->window->window),
520 hints = XGetWMHints(GDK_WINDOW_XDISPLAY(gtkwin->window->window), 522 GDK_WINDOW_XWINDOW(win->window->window));
521 GDK_WINDOW_XWINDOW(gtkwin->window->window));
522 if (add) 523 if (add)
523 hints->flags |= XUrgencyHint; 524 hints->flags |= XUrgencyHint;
524 else 525 else
525 hints->flags &= ~XUrgencyHint; 526 hints->flags &= ~XUrgencyHint;
526 XSetWMHints(GDK_WINDOW_XDISPLAY(gtkwin->window->window), 527 XSetWMHints(GDK_WINDOW_XDISPLAY(win->window->window),
527 GDK_WINDOW_XWINDOW(gtkwin->window->window), hints); 528 GDK_WINDOW_XWINDOW(win->window->window), hints);
528 XFree(hints); 529 XFree(hints);
529 } 530 }
530 531
531 static void 532 static void
532 handle_raise(GaimConvWindow *gaimwin) 533 handle_raise(GaimGtkWindow *gaimwin)
533 { 534 {
534 gaim_conv_window_raise(gaimwin); 535 gaim_gtk_conv_window_raise(gaimwin);
535 } 536 }
536 537
537 static void 538 static void
538 type_toggle_cb(GtkWidget *widget, gpointer data) 539 type_toggle_cb(GtkWidget *widget, gpointer data)
539 { 540 {
594 } 595 }
595 596
596 static void 597 static void
597 apply_method() { 598 apply_method() {
598 GList *convs = gaim_get_conversations(); 599 GList *convs = gaim_get_conversations();
599 GaimConvWindow *gaimwin = NULL; 600 GaimGtkWindow *gaimwin = NULL;
600 601
601 for (convs = gaim_get_conversations(); convs != NULL; convs = convs->next) { 602 for (convs = gaim_get_conversations(); convs != NULL; convs = convs->next) {
602 GaimConversation *conv = (GaimConversation *)convs->data; 603 GaimConversation *conv = (GaimConversation *)convs->data;
603 604
604 /* remove notifications */ 605 /* remove notifications */
605 unnotify(conv, FALSE); 606 unnotify(conv, FALSE);
606 607
607 gaimwin = gaim_conversation_get_window(conv); 608 gaimwin = GAIM_GTK_CONVERSATION(conv)->win;
608 if (GPOINTER_TO_INT(gaim_conversation_get_data(conv, "notify-message-count")) != 0) 609 if (GPOINTER_TO_INT(gaim_conversation_get_data(conv, "notify-message-count")) != 0)
609 /* reattach appropriate notifications */ 610 /* reattach appropriate notifications */
610 notify(conv, FALSE); 611 notify(conv, FALSE);
611 } 612 }
612 } 613 }