comparison pidgin/gtknotify.c @ 27344:975a29213f35

Use mail_dialog consistently, instead of switching from one line to the next. Various other cleanups, too.
author Paul Aurich <paul@darkrain42.org>
date Fri, 03 Jul 2009 05:03:20 +0000
parents 8796eaaca38a
children f058edca3d66 f6cdf5f72479 fe75cd926073
comparison
equal deleted inserted replaced
27343:d2d796aed2c7 27344:975a29213f35
95 PIDGIN_POUNCE_ALIAS, 95 PIDGIN_POUNCE_ALIAS,
96 PIDGIN_POUNCE_EVENT, 96 PIDGIN_POUNCE_EVENT,
97 PIDGIN_POUNCE_TEXT, 97 PIDGIN_POUNCE_TEXT,
98 PIDGIN_POUNCE_DATE, 98 PIDGIN_POUNCE_DATE,
99 PIDGIN_POUNCE_DATA, 99 PIDGIN_POUNCE_DATA,
100 PIDGIN_POUNCE_COLUMNS 100 COLUMNS_PIDGIN_POUNCE
101 }; 101 };
102 102
103 103
104 typedef struct _PidginNotifyDialog 104 typedef struct _PidginNotifyDialog
105 { 105 {
126 } PidginNotifyType; 126 } PidginNotifyType;
127 127
128 static PidginNotifyDialog *mail_dialog = NULL; 128 static PidginNotifyDialog *mail_dialog = NULL;
129 static PidginNotifyDialog *pounce_dialog = NULL; 129 static PidginNotifyDialog *pounce_dialog = NULL;
130 130
131 static PidginNotifyDialog *pidgin_get_notification_dialog(PidginNotifyType type); 131 static PidginNotifyDialog *pidgin_create_notification_dialog(PidginNotifyType type);
132 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed, 132 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed,
133 const char **subjects, 133 const char **subjects,
134 const char **froms, const char **tos, 134 const char **froms, const char **tos,
135 const char **urls); 135 const char **urls);
136 136
304 g_free(mail_dialog); 304 g_free(mail_dialog);
305 mail_dialog = NULL; 305 mail_dialog = NULL;
306 } 306 }
307 307
308 static void 308 static void
309 email_response_cb(GtkDialog *dlg, gint id, PidginNotifyDialog *dialog) 309 email_response_cb(GtkDialog *unused, gint id, PidginNotifyDialog *unused2)
310 { 310 {
311 PidginNotifyMailData *data = NULL; 311 PidginNotifyMailData *data = NULL;
312 GtkTreeModel *model = GTK_TREE_MODEL(mail_dialog->treemodel);
312 GtkTreeIter iter; 313 GtkTreeIter iter;
313 314
314 if (id == GTK_RESPONSE_YES) 315 if (id == GTK_RESPONSE_YES)
315 { 316 {
316 /* A single row activated. Remove that row. */ 317 /* A single row activated. Remove that row. */
317 GtkTreeSelection *selection; 318 GtkTreeSelection *selection;
318 319
319 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); 320 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(mail_dialog->treeview));
320 321
321 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) 322 if (gtk_tree_selection_get_selected(selection, NULL, &iter))
322 { 323 {
323 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, 324 gtk_tree_model_get(model, &iter, PIDGIN_MAIL_DATA, &data, -1);
324 PIDGIN_MAIL_DATA, &data, -1);
325 purple_notify_uri(NULL, data->url); 325 purple_notify_uri(NULL, data->url);
326 326
327 gtk_tree_store_remove(dialog->treemodel, &iter); 327 gtk_tree_store_remove(mail_dialog->treemodel, &iter);
328 if (data->purple_has_handle) 328 if (data->purple_has_handle)
329 purple_notify_close(PURPLE_NOTIFY_EMAILS, data); 329 purple_notify_close(PURPLE_NOTIFY_EMAILS, data);
330 else 330 else
331 pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data); 331 pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data);
332 332
333 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) 333 if (gtk_tree_model_get_iter_first(model, &iter))
334 return; 334 return;
335 } 335 }
336 else 336 else
337 return; 337 return;
338 } 338 }
339 else 339 else
340 { 340 {
341 /* Remove all the rows */ 341 /* Remove all the rows */
342 while (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) 342 while (gtk_tree_model_get_iter_first(model, &iter))
343 { 343 {
344 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, 344 gtk_tree_model_get(model, &iter, PIDGIN_MAIL_DATA, &data, -1);
345 PIDGIN_MAIL_DATA, &data, -1);
346 345
347 if (id == GTK_RESPONSE_ACCEPT) 346 if (id == GTK_RESPONSE_ACCEPT)
348 purple_notify_uri(NULL, data->url); 347 purple_notify_uri(NULL, data->url);
349 348
350 gtk_tree_store_remove(dialog->treemodel, &iter); 349 gtk_tree_store_remove(mail_dialog->treemodel, &iter);
351 if (data->purple_has_handle) 350 if (data->purple_has_handle)
352 purple_notify_close(PURPLE_NOTIFY_EMAILS, data); 351 purple_notify_close(PURPLE_NOTIFY_EMAILS, data);
353 else 352 else
354 pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data); 353 pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data);
355 } 354 }
356 } 355 }
357 356
358 reset_mail_dialog(NULL); 357 reset_mail_dialog(NULL);
359 } 358 }
360 359
361 static void email_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { 360 static void
362 email_response_cb(GTK_DIALOG(mail_dialog->dialog), GTK_RESPONSE_YES, mail_dialog); 361 email_row_activated_cb(GtkTreeView *tv, GtkTreePath *path,
362 GtkTreeViewColumn *col, gpointer data)
363 {
364 email_response_cb(NULL, GTK_RESPONSE_YES, NULL);
363 } 365 }
364 366
365 static gboolean 367 static gboolean
366 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data) 368 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data)
367 { 369 {
609 static void * 611 static void *
610 pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed, 612 pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed,
611 const char **subjects, const char **froms, 613 const char **subjects, const char **froms,
612 const char **tos, const char **urls) 614 const char **tos, const char **urls)
613 { 615 {
614 PidginNotifyDialog *notification_dialog;
615 GtkWidget *dialog;
616 char *notification; 616 char *notification;
617 PurpleAccount *account; 617 PurpleAccount *account;
618 PidginNotifyMailData *data = NULL, *data2; 618 PidginNotifyMailData *data = NULL, *data2;
619 gboolean new_data = FALSE; 619 gboolean new_data = FALSE;
620 620
621 /* Don't bother updating if there aren't new emails and we don't have any displayed currently */ 621 /* Don't bother updating if there aren't new emails and we don't have any displayed currently */
622 if (count == 0 && mail_dialog == NULL) 622 if (count == 0 && mail_dialog == NULL)
623 return NULL; 623 return NULL;
624 624
625 account = purple_connection_get_account(gc); 625 account = purple_connection_get_account(gc);
626 /* This creates the mail dialog (mail_dialog) if necessary */ 626 if (mail_dialog == NULL)
627 notification_dialog = pidgin_get_notification_dialog(PIDGIN_NOTIFY_MAIL); 627 mail_dialog = pidgin_create_notification_dialog(PIDGIN_NOTIFY_MAIL);
628 dialog = notification_dialog->dialog;
629 628
630 mail_dialog->total_count += count; 629 mail_dialog->total_count += count;
631 if (detailed) { 630 if (detailed) {
632 for ( ; count; --count) { 631 for ( ; count; --count) {
633 char *to_text = NULL; 632 char *to_text = NULL;
702 return NULL; 701 return NULL;
703 } 702 }
704 } 703 }
705 } 704 }
706 705
707 if (!GTK_WIDGET_VISIBLE(dialog)) { 706 if (!GTK_WIDGET_VISIBLE(mail_dialog->dialog)) {
708 GdkPixbuf *pixbuf = gtk_widget_render_icon(dialog, PIDGIN_STOCK_DIALOG_MAIL, 707 GdkPixbuf *pixbuf = gtk_widget_render_icon(mail_dialog->dialog, PIDGIN_STOCK_DIALOG_MAIL,
709 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), NULL); 708 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), NULL);
710 char *label_text = g_strdup_printf(ngettext("<b>%d new email.</b>", 709 char *label_text = g_strdup_printf(ngettext("<b>%d new email.</b>",
711 "<b>%d new emails.</b>", 710 "<b>%d new emails.</b>",
712 mail_dialog->total_count), mail_dialog->total_count); 711 mail_dialog->total_count), mail_dialog->total_count);
713 mail_dialog->in_use = TRUE; /* So that _set_headline doesn't accidentally 712 mail_dialog->in_use = TRUE; /* So that _set_headline doesn't accidentally
714 remove the notifications when replacing an 713 remove the notifications when replacing an
715 old notification. */ 714 old notification. */
716 pidgin_blist_set_headline(label_text, 715 pidgin_blist_set_headline(label_text,
717 pixbuf, G_CALLBACK(gtk_widget_show_all), dialog, 716 pixbuf, G_CALLBACK(gtk_widget_show_all), mail_dialog->dialog,
718 (GDestroyNotify)reset_mail_dialog); 717 (GDestroyNotify)reset_mail_dialog);
719 mail_dialog->in_use = FALSE; 718 mail_dialog->in_use = FALSE;
720 g_free(label_text); 719 g_free(label_text);
721 if (pixbuf) 720 if (pixbuf)
722 g_object_unref(pixbuf); 721 g_object_unref(pixbuf);
723 } else if (!GTK_WIDGET_HAS_FOCUS(dialog)) 722 } else if (!GTK_WIDGET_HAS_FOCUS(mail_dialog->dialog))
724 pidgin_set_urgent(GTK_WINDOW(dialog), TRUE); 723 pidgin_set_urgent(GTK_WINDOW(mail_dialog->dialog), TRUE);
725 724
726 return data; 725 return data;
727 } 726 }
728 727
729 static gboolean 728 static gboolean
1347 1346
1348 void 1347 void
1349 pidgin_notify_pounce_add(PurpleAccount *account, PurplePounce *pounce, 1348 pidgin_notify_pounce_add(PurpleAccount *account, PurplePounce *pounce,
1350 const char *alias, const char *event, const char *message, const char *date) 1349 const char *alias, const char *event, const char *message, const char *date)
1351 { 1350 {
1352 PidginNotifyDialog *notification_dialog;
1353 GtkWidget *dialog;
1354 GdkPixbuf *icon; 1351 GdkPixbuf *icon;
1355 GtkTreeIter iter; 1352 GtkTreeIter iter;
1356 PidginNotifyPounceData *pounce_data; 1353 PidginNotifyPounceData *pounce_data;
1357 1354
1358 notification_dialog = pidgin_get_notification_dialog(PIDGIN_NOTIFY_POUNCE); 1355 if (pounce_dialog == NULL)
1359 dialog = notification_dialog->dialog; 1356 pounce_dialog = pidgin_create_notification_dialog(PIDGIN_NOTIFY_POUNCE);
1360 1357
1361 icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); 1358 icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
1362 1359
1363 pounce_data = g_new(PidginNotifyPounceData, 1); 1360 pounce_data = g_new(PidginNotifyPounceData, 1);
1364 1361
1377 -1); 1374 -1);
1378 1375
1379 if (icon) 1376 if (icon)
1380 g_object_unref(icon); 1377 g_object_unref(icon);
1381 1378
1382 gtk_widget_show_all(dialog); 1379 gtk_widget_show_all(pounce_dialog->dialog);
1383 1380
1384 return; 1381 return;
1385 } 1382 }
1386 1383
1387 static PidginNotifyDialog * 1384 static PidginNotifyDialog *
1388 pidgin_get_notification_dialog(PidginNotifyType type) 1385 pidgin_create_notification_dialog(PidginNotifyType type)
1389 { 1386 {
1390 GtkTreeStore *model = NULL; 1387 GtkTreeStore *model = NULL;
1391 GtkWidget *dialog = NULL; 1388 GtkWidget *dialog = NULL;
1392 GtkWidget *label = NULL; 1389 GtkWidget *label = NULL;
1393 GtkWidget *sw; 1390 GtkWidget *sw;
1399 PidginNotifyDialog *spec_dialog = NULL; 1396 PidginNotifyDialog *spec_dialog = NULL;
1400 1397
1401 g_return_val_if_fail(type < PIDGIN_NOTIFY_TYPES, NULL); 1398 g_return_val_if_fail(type < PIDGIN_NOTIFY_TYPES, NULL);
1402 1399
1403 if (type == PIDGIN_NOTIFY_MAIL) { 1400 if (type == PIDGIN_NOTIFY_MAIL) {
1404 if (mail_dialog != NULL) 1401 g_return_val_if_fail(mail_dialog == NULL, mail_dialog);
1405 return mail_dialog;
1406 1402
1407 model = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL, 1403 model = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL,
1408 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); 1404 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
1409 1405
1410 } else if (type == PIDGIN_NOTIFY_POUNCE) { 1406 } else if (type == PIDGIN_NOTIFY_POUNCE) {
1411 1407 g_return_val_if_fail(pounce_dialog == NULL, pounce_dialog);
1412 if (pounce_dialog != NULL) 1408
1413 return pounce_dialog; 1409 model = gtk_tree_store_new(COLUMNS_PIDGIN_POUNCE,
1414
1415 model = gtk_tree_store_new(PIDGIN_POUNCE_COLUMNS,
1416 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, 1410 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
1417 G_TYPE_STRING, G_TYPE_POINTER); 1411 G_TYPE_STRING, G_TYPE_POINTER);
1418 } 1412 }
1419 1413
1420 dialog = gtk_dialog_new_with_buttons(NULL, NULL, 0, 1414 dialog = gtk_dialog_new_with_buttons(NULL, NULL, 0,
1549 1543
1550 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 1544 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1551 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); 1545 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1552 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); 1546 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1553 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 2); 1547 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 2);
1554
1555 if (type == PIDGIN_NOTIFY_MAIL)
1556 mail_dialog = spec_dialog;
1557 else if (type == PIDGIN_NOTIFY_POUNCE) {
1558 pounce_dialog = spec_dialog;
1559 }
1560 1548
1561 return spec_dialog; 1549 return spec_dialog;
1562 } 1550 }
1563 1551
1564 static void 1552 static void