| 65 |
65 |
| 66 } GaimNotifySearchResultsButtonData; |
66 } GaimNotifySearchResultsButtonData; |
| 67 |
67 |
| 68 enum |
68 enum |
| 69 { |
69 { |
| 70 GAIM_MAIL_ICON, |
70 PIDGIN_MAIL_ICON, |
| 71 GAIM_MAIL_TEXT, |
71 PIDGIN_MAIL_TEXT, |
| 72 GAIM_MAIL_DATA, |
72 PIDGIN_MAIL_DATA, |
| 73 COLUMNS_GAIM_MAIL |
73 COLUMNS_PIDGIN_MAIL |
| 74 }; |
74 }; |
| 75 |
75 |
| 76 typedef struct _GaimMailDialog GaimMailDialog; |
76 typedef struct _PidginMailDialog PidginMailDialog; |
| 77 |
77 |
| 78 struct _GaimMailDialog |
78 struct _PidginMailDialog |
| 79 { |
79 { |
| 80 GtkWidget *dialog; |
80 GtkWidget *dialog; |
| 81 GtkWidget *treeview; |
81 GtkWidget *treeview; |
| 82 GtkTreeStore *treemodel; |
82 GtkTreeStore *treemodel; |
| 83 GtkLabel *label; |
83 GtkLabel *label; |
| 84 GtkWidget *open_button; |
84 GtkWidget *open_button; |
| 85 int total_count; |
85 int total_count; |
| 86 gboolean in_use; |
86 gboolean in_use; |
| 87 }; |
87 }; |
| 88 |
88 |
| 89 static GaimMailDialog *mail_dialog = NULL; |
89 static PidginMailDialog *mail_dialog = NULL; |
| 90 |
90 |
| 91 static void *pidgin_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, |
91 static void *pidgin_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, |
| 92 const char **subjects, |
92 const char **subjects, |
| 93 const char **froms, const char **tos, |
93 const char **froms, const char **tos, |
| 94 const char **urls); |
94 const char **urls); |
| 98 { |
98 { |
| 99 gaim_notify_close(GAIM_NOTIFY_MESSAGE, widget); |
99 gaim_notify_close(GAIM_NOTIFY_MESSAGE, widget); |
| 100 } |
100 } |
| 101 |
101 |
| 102 static void |
102 static void |
| 103 email_response_cb(GtkDialog *dlg, gint id, GaimMailDialog *dialog) |
103 email_response_cb(GtkDialog *dlg, gint id, PidginMailDialog *dialog) |
| 104 { |
104 { |
| 105 GaimNotifyMailData *data = NULL; |
105 GaimNotifyMailData *data = NULL; |
| 106 GtkTreeIter iter; |
106 GtkTreeIter iter; |
| 107 |
107 |
| 108 if (id == GTK_RESPONSE_YES) |
108 if (id == GTK_RESPONSE_YES) |
| 112 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); |
112 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); |
| 113 |
113 |
| 114 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) |
114 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) |
| 115 { |
115 { |
| 116 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, |
116 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, |
| 117 GAIM_MAIL_DATA, &data, -1); |
117 PIDGIN_MAIL_DATA, &data, -1); |
| 118 gaim_notify_uri(NULL, data->url); |
118 gaim_notify_uri(NULL, data->url); |
| 119 |
119 |
| 120 gtk_tree_store_remove(dialog->treemodel, &iter); |
120 gtk_tree_store_remove(dialog->treemodel, &iter); |
| 121 gaim_notify_close(GAIM_NOTIFY_EMAILS, data); |
121 gaim_notify_close(GAIM_NOTIFY_EMAILS, data); |
| 122 |
122 |
| 129 else |
129 else |
| 130 { |
130 { |
| 131 while (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) |
131 while (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) |
| 132 { |
132 { |
| 133 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, |
133 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, |
| 134 GAIM_MAIL_DATA, &data, -1); |
134 PIDGIN_MAIL_DATA, &data, -1); |
| 135 |
135 |
| 136 if (id == GTK_RESPONSE_ACCEPT) |
136 if (id == GTK_RESPONSE_ACCEPT) |
| 137 gaim_notify_uri(NULL, data->url); |
137 gaim_notify_uri(NULL, data->url); |
| 138 |
138 |
| 139 gtk_tree_store_remove(dialog->treemodel, &iter); |
139 gtk_tree_store_remove(dialog->treemodel, &iter); |
| 275 |
275 |
| 276 return dialog; |
276 return dialog; |
| 277 } |
277 } |
| 278 |
278 |
| 279 static void |
279 static void |
| 280 selection_changed_cb(GtkTreeSelection *sel, GaimMailDialog *dialog) |
280 selection_changed_cb(GtkTreeSelection *sel, PidginMailDialog *dialog) |
| 281 { |
281 { |
| 282 GtkTreeIter iter; |
282 GtkTreeIter iter; |
| 283 GtkTreeModel *model; |
283 GtkTreeModel *model; |
| 284 GaimNotifyMailData *data; |
284 GaimNotifyMailData *data; |
| 285 gboolean active = TRUE; |
285 gboolean active = TRUE; |
| 286 |
286 |
| 287 if (gtk_tree_selection_get_selected(sel, &model, &iter) == FALSE) |
287 if (gtk_tree_selection_get_selected(sel, &model, &iter) == FALSE) |
| 288 active = FALSE; |
288 active = FALSE; |
| 289 else |
289 else |
| 290 { |
290 { |
| 291 gtk_tree_model_get(model, &iter, GAIM_MAIL_DATA, &data, -1); |
291 gtk_tree_model_get(model, &iter, PIDGIN_MAIL_DATA, &data, -1); |
| 292 if (data->url == NULL) |
292 if (data->url == NULL) |
| 293 active = FALSE; |
293 active = FALSE; |
| 294 } |
294 } |
| 295 |
295 |
| 296 gtk_widget_set_sensitive(dialog->open_button, active); |
296 gtk_widget_set_sensitive(dialog->open_button, active); |
| 353 |
353 |
| 354 sw = gtk_scrolled_window_new(NULL, NULL); |
354 sw = gtk_scrolled_window_new(NULL, NULL); |
| 355 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
355 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
| 356 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); |
356 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); |
| 357 |
357 |
| 358 mail_dialog = g_new0(GaimMailDialog, 1); |
358 mail_dialog = g_new0(PidginMailDialog, 1); |
| 359 mail_dialog->dialog = dialog; |
359 mail_dialog->dialog = dialog; |
| 360 mail_dialog->open_button = button; |
360 mail_dialog->open_button = button; |
| 361 |
361 |
| 362 mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_GAIM_MAIL, |
362 mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL, |
| 363 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
363 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
| 364 mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel)); |
364 mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel)); |
| 365 gtk_tree_view_set_search_column(GTK_TREE_VIEW(mail_dialog->treeview), GAIM_MAIL_TEXT); |
365 gtk_tree_view_set_search_column(GTK_TREE_VIEW(mail_dialog->treeview), PIDGIN_MAIL_TEXT); |
| 366 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(mail_dialog->treeview), |
366 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(mail_dialog->treeview), |
| 367 pidgin_tree_view_search_equal_func, NULL, NULL); |
367 pidgin_tree_view_search_equal_func, NULL, NULL); |
| 368 |
368 |
| 369 g_signal_connect(G_OBJECT(dialog), "response", |
369 g_signal_connect(G_OBJECT(dialog), "response", |
| 370 G_CALLBACK(email_response_cb), mail_dialog); |
370 G_CALLBACK(email_response_cb), mail_dialog); |
| 377 |
377 |
| 378 column = gtk_tree_view_column_new(); |
378 column = gtk_tree_view_column_new(); |
| 379 gtk_tree_view_column_set_resizable(column, TRUE); |
379 gtk_tree_view_column_set_resizable(column, TRUE); |
| 380 rend = gtk_cell_renderer_pixbuf_new(); |
380 rend = gtk_cell_renderer_pixbuf_new(); |
| 381 gtk_tree_view_column_pack_start(column, rend, FALSE); |
381 gtk_tree_view_column_pack_start(column, rend, FALSE); |
| 382 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", GAIM_MAIL_ICON, NULL); |
382 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", PIDGIN_MAIL_ICON, NULL); |
| 383 rend = gtk_cell_renderer_text_new(); |
383 rend = gtk_cell_renderer_text_new(); |
| 384 gtk_tree_view_column_pack_start(column, rend, TRUE); |
384 gtk_tree_view_column_pack_start(column, rend, TRUE); |
| 385 gtk_tree_view_column_set_attributes(column, rend, "markup", GAIM_MAIL_TEXT, NULL); |
385 gtk_tree_view_column_set_attributes(column, rend, "markup", PIDGIN_MAIL_TEXT, NULL); |
| 386 gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); |
386 gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); |
| 387 |
387 |
| 388 label = gtk_label_new(NULL); |
388 label = gtk_label_new(NULL); |
| 389 gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have mail!</span>")); |
389 gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have mail!</span>")); |
| 390 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
390 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
| 412 if (count > 0) { |
412 if (count > 0) { |
| 413 /* Allow only one non-detailed email notification for each account */ |
413 /* Allow only one non-detailed email notification for each account */ |
| 414 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treemodel), &iter)) { |
414 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treemodel), &iter)) { |
| 415 do { |
415 do { |
| 416 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter, |
416 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter, |
| 417 GAIM_MAIL_DATA, &data, -1); |
417 PIDGIN_MAIL_DATA, &data, -1); |
| 418 if (data->account == account && data->count > 0) { |
418 if (data->account == account && data->count > 0) { |
| 419 new_n = FALSE; |
419 new_n = FALSE; |
| 420 g_free(data->url); |
420 g_free(data->url); |
| 421 data->url = NULL; |
421 data->url = NULL; |
| 422 mail_dialog->total_count -= data->count; |
422 mail_dialog->total_count -= data->count; |
| 433 |
433 |
| 434 if (url != NULL) |
434 if (url != NULL) |
| 435 data->url = g_strdup(url); |
435 data->url = g_strdup(url); |
| 436 |
436 |
| 437 gtk_tree_store_set(treemodel, &iter, |
437 gtk_tree_store_set(treemodel, &iter, |
| 438 GAIM_MAIL_ICON, icon, |
438 PIDGIN_MAIL_ICON, icon, |
| 439 GAIM_MAIL_TEXT, notification, |
439 PIDGIN_MAIL_TEXT, notification, |
| 440 GAIM_MAIL_DATA, data, |
440 PIDGIN_MAIL_DATA, data, |
| 441 -1); |
441 -1); |
| 442 data->iter = iter; /* XXX: Do we use this for something? */ |
442 data->iter = iter; /* XXX: Do we use this for something? */ |
| 443 data->account = account; |
443 data->account = account; |
| 444 data->count = count; |
444 data->count = count; |
| 445 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter, |
445 gtk_tree_model_get(GTK_TREE_MODEL(treemodel), &iter, |
| 446 GAIM_MAIL_DATA, &data, -1); |
446 PIDGIN_MAIL_DATA, &data, -1); |
| 447 if (icon) |
447 if (icon) |
| 448 g_object_unref(icon); |
448 g_object_unref(icon); |
| 449 return data; |
449 return data; |
| 450 } |
450 } |
| 451 |
451 |