comparison pidgin/gtknotify.c @ 22826:66914f306712

More plumbing work.
author Daniel Atallah <daniel.atallah@gmail.com>
date Mon, 05 May 2008 22:39:55 +0000
parents c77098cebf23
children 502bac8b2b4c
comparison
equal deleted inserted replaced
22823:750813c2db46 22826:66914f306712
50 PurpleAccount *account; 50 PurpleAccount *account;
51 char *url; 51 char *url;
52 GtkWidget *label; 52 GtkWidget *label;
53 GtkTreeIter iter; 53 GtkTreeIter iter;
54 int count; 54 int count;
55 gboolean purple_has_handle;
55 } PidginNotifyMailData; 56 } PidginNotifyMailData;
56 57
57 typedef struct 58 typedef struct
58 { 59 {
59 PurpleAccount *account; 60 PurpleAccount *account;
98 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed, 99 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed,
99 const char **subjects, 100 const char **subjects,
100 const char **froms, const char **tos, 101 const char **froms, const char **tos,
101 const char **urls); 102 const char **urls);
102 103
104 static void pidgin_close_notify(PurpleNotifyType type, void *ui_handle);
105
103 static void 106 static void
104 message_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) 107 message_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget)
105 { 108 {
106 purple_notify_close(PURPLE_NOTIFY_MESSAGE, widget); 109 purple_notify_close(PURPLE_NOTIFY_MESSAGE, widget);
107 } 110 }
142 145
143 if (id == GTK_RESPONSE_ACCEPT) 146 if (id == GTK_RESPONSE_ACCEPT)
144 purple_notify_uri(NULL, data->url); 147 purple_notify_uri(NULL, data->url);
145 148
146 gtk_tree_store_remove(dialog->treemodel, &iter); 149 gtk_tree_store_remove(dialog->treemodel, &iter);
147 purple_notify_close(PURPLE_NOTIFY_EMAILS, data); 150 if (data->purple_has_handle)
151 purple_notify_close(PURPLE_NOTIFY_EMAILS, data);
152 else
153 pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data);
148 } 154 }
149 } 155 }
150 gtk_widget_destroy(dialog->dialog); 156 gtk_widget_destroy(dialog->dialog);
151 g_free(dialog); 157 g_free(dialog);
152 mail_dialog = NULL; 158 mail_dialog = NULL;
463 469
464 icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); 470 icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM);
465 471
466 if (new_n) { 472 if (new_n) {
467 data = g_new0(PidginNotifyMailData, 1); 473 data = g_new0(PidginNotifyMailData, 1);
474 data->purple_has_handle = TRUE;
468 gtk_tree_store_append(treemodel, &iter, NULL); 475 gtk_tree_store_append(treemodel, &iter, NULL);
469 } 476 }
470 477
471 if (url != NULL) 478 if (url != NULL)
472 data->url = g_strdup(url); 479 data->url = g_strdup(url);
477 PIDGIN_MAIL_DATA, data, 484 PIDGIN_MAIL_DATA, data,
478 -1); 485 -1);
479 data->iter = iter; /* XXX: Do we use this for something? */ 486 data->iter = iter; /* XXX: Do we use this for something? */
480 data->account = account; 487 data->account = account;
481 data->count = count; 488 data->count = count;
489
490 /* Why is this necessary?*/
482 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter, 491 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter,
483 PIDGIN_MAIL_DATA, &data, -1); 492 PIDGIN_MAIL_DATA, &data, -1);
484 if (icon) 493 if (icon)
485 g_object_unref(icon); 494 g_object_unref(icon);
486 return data; 495 return data;
538 #undef SAFE 547 #undef SAFE
539 g_free(to_text); 548 g_free(to_text);
540 g_free(from_text); 549 g_free(from_text);
541 g_free(subject_text); 550 g_free(subject_text);
542 551
552 /* If we don't keep track of this, will leak "data" for each of the notifications except the last */
553 if (data)
554 data->purple_has_handle = FALSE;
543 data = pidgin_notify_add_mail(mail_dialog->treemodel, account, notification, urls ? *urls : NULL, 0, FALSE); 555 data = pidgin_notify_add_mail(mail_dialog->treemodel, account, notification, urls ? *urls : NULL, 0, FALSE);
544 g_free(notification); 556 g_free(notification);
545 557
546 if (urls != NULL) 558 if (urls != NULL)
547 urls++; 559 urls++;
586 if (pixbuf) 598 if (pixbuf)
587 g_object_unref(pixbuf); 599 g_object_unref(pixbuf);
588 } else if (!GTK_WIDGET_HAS_FOCUS(dialog)) 600 } else if (!GTK_WIDGET_HAS_FOCUS(dialog))
589 pidgin_set_urgent(GTK_WINDOW(dialog), TRUE); 601 pidgin_set_urgent(GTK_WINDOW(dialog), TRUE);
590 602
591 return NULL; 603 return data;
592 } 604 }
593 605
594 static gboolean 606 static gboolean
595 formatted_input_cb(GtkWidget *win, GdkEventKey *event, gpointer data) 607 formatted_input_cb(GtkWidget *win, GdkEventKey *event, gpointer data)
596 { 608 {
805 col_types[0] = GDK_TYPE_PIXBUF; 817 col_types[0] = GDK_TYPE_PIXBUF;
806 for (i = 1; i < col_num; i++) { 818 for (i = 1; i < col_num; i++) {
807 col_types[i] = G_TYPE_STRING; 819 col_types[i] = G_TYPE_STRING;
808 } 820 }
809 model = gtk_list_store_newv(col_num, col_types); 821 model = gtk_list_store_newv(col_num, col_types);
822 g_free(col_types);
810 823
811 /* Setup the scrolled window containing the treeview */ 824 /* Setup the scrolled window containing the treeview */
812 sw = gtk_scrolled_window_new(NULL, NULL); 825 sw = gtk_scrolled_window_new(NULL, NULL);
813 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 826 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
814 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); 827 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);