comparison pidgin/gtknotify.c @ 26268:3d997c09b94e

A patch from Jorge Villaseor which makes all pounces share a single window. The window is based on the one used by the mail notifications. I made some extra changes on top of the patch to clean things up a little bit, mainly to improve strings. Blame me if something breaks! Thanks to bjlockie for helping with testing. Closes #190
author Kevin Stange <kevin@simguy.net>
date Mon, 16 Mar 2009 17:07:41 +0000
parents f10aba5592c6
children c637ddabb491 1688f7e15530
comparison
equal deleted inserted replaced
26267:da9e022befd9 26268:3d997c09b94e
26 #include "internal.h" 26 #include "internal.h"
27 #include "pidgin.h" 27 #include "pidgin.h"
28 28
29 #include <gdk/gdkkeysyms.h> 29 #include <gdk/gdkkeysyms.h>
30 30
31 #include "account.h"
31 #include "connection.h" 32 #include "connection.h"
32 #include "debug.h" 33 #include "debug.h"
33 #include "prefs.h" 34 #include "prefs.h"
34 #include "pidginstock.h" 35 #include "pidginstock.h"
35 #include "util.h" 36 #include "util.h"
36 37
37 #include "gtkblist.h" 38 #include "gtkblist.h"
38 #include "gtkimhtml.h" 39 #include "gtkimhtml.h"
39 #include "gtknotify.h" 40 #include "gtknotify.h"
41 #include "gtkpounce.h"
40 #include "gtkutils.h" 42 #include "gtkutils.h"
41 43
42 typedef struct 44 typedef struct
43 { 45 {
44 GtkWidget *window; 46 GtkWidget *window;
55 } PidginNotifyMailData; 57 } PidginNotifyMailData;
56 58
57 typedef struct 59 typedef struct
58 { 60 {
59 PurpleAccount *account; 61 PurpleAccount *account;
62 PurplePounce *pounce;
63 } PidginNotifyPounceData;
64
65
66 typedef struct
67 {
68 PurpleAccount *account;
60 GtkListStore *model; 69 GtkListStore *model;
61 GtkWidget *treeview; 70 GtkWidget *treeview;
62 GtkWidget *window; 71 GtkWidget *window;
63 gpointer user_data; 72 gpointer user_data;
64 PurpleNotifySearchResults *results; 73 PurpleNotifySearchResults *results;
78 PIDGIN_MAIL_TEXT, 87 PIDGIN_MAIL_TEXT,
79 PIDGIN_MAIL_DATA, 88 PIDGIN_MAIL_DATA,
80 COLUMNS_PIDGIN_MAIL 89 COLUMNS_PIDGIN_MAIL
81 }; 90 };
82 91
83 typedef struct _PidginMailDialog PidginMailDialog; 92 enum
84 93 {
85 struct _PidginMailDialog 94 PIDGIN_POUNCE_ICON,
95 PIDGIN_POUNCE_ALIAS,
96 PIDGIN_POUNCE_EVENT,
97 PIDGIN_POUNCE_TEXT,
98 PIDGIN_POUNCE_DATE,
99 PIDGIN_POUNCE_DATA,
100 PIDGIN_POUNCE_COLUMNS
101 };
102
103 typedef struct _PidginNotifyDialog PidginNotifyDialog;
104 typedef PidginNotifyDialog PidginMailDialog;
105
106 struct _PidginNotifyDialog
86 { 107 {
87 GtkWidget *dialog; 108 GtkWidget *dialog;
88 GtkWidget *treeview; 109 GtkWidget *treeview;
89 GtkTreeStore *treemodel; 110 GtkTreeStore *treemodel;
90 GtkLabel *label; 111 GtkLabel *label;
91 GtkWidget *open_button; 112 GtkWidget *open_button;
113 GtkWidget *dismiss_button;
114 GtkWidget *edit_button;
92 int total_count; 115 int total_count;
93 gboolean in_use; 116 gboolean in_use;
94 }; 117 };
95 118
96 static PidginMailDialog *mail_dialog = NULL; 119 typedef enum
97 120 {
121 PIDGIN_NOTIFY_MAIL,
122 PIDGIN_NOTIFY_POUNCE,
123 PIDGIN_NOTIFY_TYPES
124 } PidginNotifyType;
125
126 static PidginNotifyDialog *mail_dialog = NULL;
127 static PidginNotifyDialog *pounce_dialog = NULL;
128
129 static GtkWidget *pidgin_get_notification_dialog(PidginNotifyType type);
98 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed, 130 static void *pidgin_notify_emails(PurpleConnection *gc, size_t count, gboolean detailed,
99 const char **subjects, 131 const char **subjects,
100 const char **froms, const char **tos, 132 const char **froms, const char **tos,
101 const char **urls); 133 const char **urls);
102 134
104 136
105 static void 137 static void
106 message_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) 138 message_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget)
107 { 139 {
108 purple_notify_close(PURPLE_NOTIFY_MESSAGE, widget); 140 purple_notify_close(PURPLE_NOTIFY_MESSAGE, widget);
141 }
142
143 static void
144 pounce_response_close(PidginNotifyDialog *dialog)
145 {
146 GtkTreeIter iter;
147 PidginNotifyPounceData *pounce_data;
148
149 while (gtk_tree_model_get_iter_first(
150 GTK_TREE_MODEL(pounce_dialog->treemodel), &iter)) {
151 gtk_tree_model_get(GTK_TREE_MODEL(pounce_dialog->treemodel), &iter,
152 PIDGIN_POUNCE_DATA, &pounce_data,
153 -1);
154 gtk_tree_store_remove(dialog->treemodel, &iter);
155
156 g_free(pounce_data);
157 }
158
159 gtk_widget_destroy(pounce_dialog->dialog);
160 g_free(pounce_dialog);
161 pounce_dialog = NULL;
162 }
163
164 static void
165 delete_foreach(GtkTreeModel *model, GtkTreePath *path,
166 GtkTreeIter *iter, gpointer data)
167 {
168 PidginNotifyPounceData *pounce_data;
169
170 gtk_tree_model_get(model, iter,
171 PIDGIN_POUNCE_DATA, &pounce_data,
172 -1);
173
174 if (pounce_data != NULL)
175 g_free(pounce_data);
176 }
177
178 static void
179 append_to_list(GtkTreeModel *model, GtkTreePath *path,
180 GtkTreeIter *iter, gpointer data)
181 {
182 GList **list = data;
183 *list = g_list_prepend(*list, gtk_tree_path_copy(path));
184 }
185 static void
186 pounce_response_dismiss()
187 {
188 GtkTreeSelection *selection;
189 GList *list = NULL;
190
191 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
192 gtk_tree_selection_selected_foreach(selection, delete_foreach, pounce_dialog);
193 gtk_tree_selection_selected_foreach(selection, append_to_list, &list);
194
195 while (list) {
196 GtkTreeIter iter;
197 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(pounce_dialog->treemodel), &iter,
198 list->data)) {
199 gtk_tree_store_remove(GTK_TREE_STORE(pounce_dialog->treemodel), &iter);
200 }
201 gtk_tree_path_free(list->data);
202 list = g_list_delete_link(list, list);
203 }
204 }
205
206 static void
207 pounce_response_edit_cb(GtkTreeModel *model, GtkTreePath *path,
208 GtkTreeIter *iter, gpointer data)
209 {
210 PidginNotifyPounceData *pounce_data;
211 PidginNotifyDialog *dialog = (PidginNotifyDialog*)data;
212 PurplePounce *pounce;
213 GList *list;
214
215 list = purple_pounces_get_all();
216
217 gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), iter,
218 PIDGIN_POUNCE_DATA, &pounce_data,
219 -1);
220
221 for (; list != NULL; list = list->next) {
222 pounce = list->data;
223 if (pounce == pounce_data->pounce) {
224 pidgin_pounce_editor_show(pounce_data->account, NULL, pounce_data->pounce);
225 return;
226 }
227 }
228
229 purple_debug_warning("gtknotify", "Pounce was destroyed.\n");
230 }
231
232 static void
233 pounce_response_cb(GtkDialog *dlg, gint id, PidginNotifyDialog *dialog)
234 {
235 GtkTreeSelection *selection = NULL;
236
237 switch (id) {
238 case GTK_RESPONSE_CLOSE:
239 case GTK_RESPONSE_DELETE_EVENT:
240 pounce_response_close(dialog);
241 break;
242 case GTK_RESPONSE_NO:
243 pounce_response_dismiss();
244 break;
245 case GTK_RESPONSE_APPLY:
246 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
247 gtk_tree_selection_selected_foreach(selection, pounce_response_edit_cb,
248 dialog);
249 break;
250 }
251 }
252
253 static void
254 pounce_row_selected_cb(GtkTreeView *tv, GtkTreePath *path,
255 GtkTreeViewColumn *col, gpointer data)
256 {
257 GtkTreeIter iter;
258 GtkTreeSelection *selection;
259 gboolean selected;
260 GList *list;
261
262 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
263
264 selected = gtk_tree_selection_get_selected(selection,
265 NULL, &iter);
266
267 if (selected) {
268 PurplePounce *pounce;
269 PidginNotifyPounceData *pounce_data;
270
271 list = purple_pounces_get_all();
272
273 gtk_tree_model_get(GTK_TREE_MODEL(pounce_dialog->treemodel), &iter,
274 PIDGIN_POUNCE_DATA, &pounce_data,
275 -1);
276
277 gtk_widget_set_sensitive(pounce_dialog->edit_button, FALSE);
278
279 for (; list != NULL; list = list->next) {
280 pounce = list->data;
281 if (pounce == pounce_data->pounce) {
282 gtk_widget_set_sensitive(pounce_dialog->edit_button, TRUE);
283 break;
284 }
285 }
286
287 gtk_widget_set_sensitive(pounce_dialog->dismiss_button, TRUE);
288 } else {
289 gtk_widget_set_sensitive(pounce_dialog->edit_button, FALSE);
290 gtk_widget_set_sensitive(pounce_dialog->dismiss_button, FALSE);
291 }
292
293
109 } 294 }
110 295
111 static void 296 static void
112 email_response_cb(GtkDialog *dlg, gint id, PidginMailDialog *dialog) 297 email_response_cb(GtkDialog *dlg, gint id, PidginMailDialog *dialog)
113 { 298 {
340 } 525 }
341 526
342 static GtkWidget * 527 static GtkWidget *
343 pidgin_get_mail_dialog(void) 528 pidgin_get_mail_dialog(void)
344 { 529 {
345 if (mail_dialog == NULL) { 530 return pidgin_get_notification_dialog(PIDGIN_NOTIFY_MAIL);
346 GtkWidget *dialog = NULL;
347 GtkWidget *label;
348 GtkWidget *sw;
349 GtkCellRenderer *rend;
350 GtkTreeViewColumn *column;
351 GtkWidget *button = NULL;
352 GtkWidget *vbox = NULL;
353
354 dialog = gtk_dialog_new_with_buttons(_("New Mail"), NULL, 0,
355 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
356 NULL);
357 gtk_window_set_role(GTK_WINDOW(dialog), "new_mail_detailed");
358 g_signal_connect(G_OBJECT(dialog), "focus-in-event",
359 G_CALLBACK(mail_window_focus_cb), NULL);
360
361 gtk_dialog_add_button(GTK_DIALOG(dialog),
362 _("Open All Messages"), GTK_RESPONSE_ACCEPT);
363
364 button = gtk_dialog_add_button(GTK_DIALOG(dialog),
365 PIDGIN_STOCK_OPEN_MAIL, GTK_RESPONSE_YES);
366
367 /* make "Open All Messages" the default response */
368 gtk_dialog_set_default_response(GTK_DIALOG(dialog),
369 GTK_RESPONSE_ACCEPT);
370
371 /* Setup the dialog */
372 gtk_container_set_border_width(GTK_CONTAINER(dialog), PIDGIN_HIG_BOX_SPACE);
373 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), PIDGIN_HIG_BOX_SPACE);
374 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
375 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), PIDGIN_HIG_BORDER);
376
377 /* Vertical box */
378 vbox = GTK_DIALOG(dialog)->vbox;
379
380 /* Golden ratio it up! */
381 gtk_widget_set_size_request(dialog, 550, 400);
382
383 sw = gtk_scrolled_window_new(NULL, NULL);
384 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
385 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
386
387 mail_dialog = g_new0(PidginMailDialog, 1);
388 mail_dialog->dialog = dialog;
389 mail_dialog->open_button = button;
390
391 mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL,
392 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
393 mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel));
394 g_object_unref(G_OBJECT(mail_dialog->treemodel));
395 gtk_tree_view_set_search_column(GTK_TREE_VIEW(mail_dialog->treeview), PIDGIN_MAIL_TEXT);
396 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(mail_dialog->treeview),
397 pidgin_tree_view_search_equal_func, NULL, NULL);
398
399 g_signal_connect(G_OBJECT(dialog), "response",
400 G_CALLBACK(email_response_cb), mail_dialog);
401 g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(mail_dialog->treeview))),
402 "changed", G_CALLBACK(selection_changed_cb), mail_dialog);
403 g_signal_connect(G_OBJECT(mail_dialog->treeview), "row-activated", G_CALLBACK(email_row_activated_cb), NULL);
404
405 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mail_dialog->treeview), FALSE);
406 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(mail_dialog->treeview), TRUE);
407 gtk_container_add(GTK_CONTAINER(sw), mail_dialog->treeview);
408
409 column = gtk_tree_view_column_new();
410 gtk_tree_view_column_set_resizable(column, TRUE);
411 rend = gtk_cell_renderer_pixbuf_new();
412 gtk_tree_view_column_pack_start(column, rend, FALSE);
413 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", PIDGIN_MAIL_ICON, NULL);
414 rend = gtk_cell_renderer_text_new();
415 gtk_tree_view_column_pack_start(column, rend, TRUE);
416 gtk_tree_view_column_set_attributes(column, rend, "markup", PIDGIN_MAIL_TEXT, NULL);
417 gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column);
418
419 label = gtk_label_new(NULL);
420 gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have mail!</span>"));
421 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
422 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
423 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
424 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
425 }
426
427 return mail_dialog->dialog;
428 } 531 }
429 532
430 /* count == 0 means this is a detailed mail notification. 533 /* count == 0 means this is a detailed mail notification.
431 * count > 0 mean non-detailed. 534 * count > 0 mean non-detailed.
432 */ 535 */
999 { 1102 {
1000 if (type == PURPLE_NOTIFY_EMAIL || type == PURPLE_NOTIFY_EMAILS) 1103 if (type == PURPLE_NOTIFY_EMAIL || type == PURPLE_NOTIFY_EMAILS)
1001 { 1104 {
1002 PidginNotifyMailData *data = (PidginNotifyMailData *)ui_handle; 1105 PidginNotifyMailData *data = (PidginNotifyMailData *)ui_handle;
1003 1106
1004 g_free(data->url); 1107 if (data) {
1005 g_free(data); 1108 g_free(data->url);
1109 g_free(data);
1110 }
1006 } 1111 }
1007 else if (type == PURPLE_NOTIFY_SEARCHRESULTS) 1112 else if (type == PURPLE_NOTIFY_SEARCHRESULTS)
1008 { 1113 {
1009 PidginNotifySearchResultsData *data = (PidginNotifySearchResultsData *)ui_handle; 1114 PidginNotifySearchResultsData *data = (PidginNotifySearchResultsData *)ui_handle;
1010 1115
1230 #else /* !_WIN32 */ 1335 #else /* !_WIN32 */
1231 winpidgin_notify_uri(uri); 1336 winpidgin_notify_uri(uri);
1232 #endif /* !_WIN32 */ 1337 #endif /* !_WIN32 */
1233 1338
1234 return NULL; 1339 return NULL;
1340 }
1341
1342 static GtkWidget *
1343 pidgin_get_dialog(PidginNotifyType type, GtkTreeStore *treemodel)
1344 {
1345 GtkWidget *dialog = NULL;
1346 GtkWidget *label = NULL;
1347 GtkWidget *sw;
1348 GtkCellRenderer *rend;
1349 GtkTreeViewColumn *column;
1350 GtkWidget *button = NULL;
1351 GtkWidget *vbox = NULL;
1352 GtkTreeSelection *sel;
1353 PidginNotifyDialog *spec_dialog = NULL;
1354
1355 g_return_val_if_fail(type < PIDGIN_NOTIFY_TYPES, NULL);
1356
1357 dialog = gtk_dialog_new_with_buttons(NULL, NULL, 0,
1358 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1359 NULL);
1360
1361 /* Setup the dialog */
1362 gtk_container_set_border_width(GTK_CONTAINER(dialog), PIDGIN_HIG_BOX_SPACE);
1363 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), PIDGIN_HIG_BOX_SPACE);
1364 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
1365 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), PIDGIN_HIG_BORDER);
1366
1367 /* Vertical box */
1368 vbox = GTK_DIALOG(dialog)->vbox;
1369
1370 /* Golden ratio it up! */
1371 gtk_widget_set_size_request(dialog, 550, 400);
1372
1373 sw = gtk_scrolled_window_new(NULL, NULL);
1374 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
1375 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1376
1377 spec_dialog = g_new0(PidginNotifyDialog, 1);
1378 spec_dialog->dialog = dialog;
1379 spec_dialog->open_button = button;
1380
1381 spec_dialog->treemodel = treemodel;
1382 spec_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(spec_dialog->treemodel));
1383 g_object_unref(G_OBJECT(spec_dialog->treemodel));
1384
1385 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(spec_dialog->treeview), TRUE);
1386 gtk_container_add(GTK_CONTAINER(sw), spec_dialog->treeview);
1387
1388 if (type == PIDGIN_NOTIFY_MAIL) {
1389 gtk_window_set_title(GTK_WINDOW(dialog), _("New Mail"));
1390 gtk_window_set_role(GTK_WINDOW(dialog), "new_mail_detailed");
1391 g_signal_connect(G_OBJECT(dialog), "focus-in-event",
1392 G_CALLBACK(mail_window_focus_cb), NULL);
1393
1394 gtk_dialog_add_button(GTK_DIALOG(dialog),
1395 _("Open All Messages"), GTK_RESPONSE_ACCEPT);
1396
1397 button = gtk_dialog_add_button(GTK_DIALOG(dialog),
1398 PIDGIN_STOCK_OPEN_MAIL, GTK_RESPONSE_YES);
1399
1400 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(spec_dialog->treeview), FALSE);
1401
1402 gtk_tree_view_set_search_column(GTK_TREE_VIEW(spec_dialog->treeview), PIDGIN_MAIL_TEXT);
1403 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(spec_dialog->treeview),
1404 pidgin_tree_view_search_equal_func, NULL, NULL);
1405
1406 g_signal_connect(G_OBJECT(dialog), "response",
1407 G_CALLBACK(email_response_cb), spec_dialog);
1408 g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(spec_dialog->treeview))),
1409 "changed", G_CALLBACK(selection_changed_cb), spec_dialog);
1410 g_signal_connect(G_OBJECT(spec_dialog->treeview), "row-activated", G_CALLBACK(email_row_activated_cb), NULL);
1411
1412 column = gtk_tree_view_column_new();
1413 gtk_tree_view_column_set_resizable(column, TRUE);
1414 rend = gtk_cell_renderer_pixbuf_new();
1415 gtk_tree_view_column_pack_start(column, rend, FALSE);
1416
1417 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", PIDGIN_MAIL_ICON, NULL);
1418 rend = gtk_cell_renderer_text_new();
1419 gtk_tree_view_column_pack_start(column, rend, TRUE);
1420 gtk_tree_view_column_set_attributes(column, rend, "markup", PIDGIN_MAIL_TEXT, NULL);
1421 gtk_tree_view_append_column(GTK_TREE_VIEW(spec_dialog->treeview), column);
1422
1423 label = gtk_label_new(NULL);
1424 gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have mail!</span>"));
1425
1426 } else if (type == PIDGIN_NOTIFY_POUNCE) {
1427 gtk_window_set_title(GTK_WINDOW(dialog), _("New Pounces"));
1428
1429 button = gtk_dialog_add_button(GTK_DIALOG(dialog),
1430 _("Dismiss"), GTK_RESPONSE_NO);
1431 gtk_widget_set_sensitive(button, FALSE);
1432 spec_dialog->dismiss_button = button;
1433
1434 button = gtk_dialog_add_button(GTK_DIALOG(dialog),
1435 PIDGIN_STOCK_EDIT, GTK_RESPONSE_APPLY);
1436 gtk_widget_set_sensitive(button, FALSE);
1437 spec_dialog->edit_button = button;
1438
1439 g_signal_connect(G_OBJECT(dialog), "response",
1440 G_CALLBACK(pounce_response_cb), spec_dialog);
1441
1442 column = gtk_tree_view_column_new();
1443 gtk_tree_view_column_set_title(column, _("Buddy"));
1444 gtk_tree_view_column_set_resizable(column, TRUE);
1445 rend = gtk_cell_renderer_pixbuf_new();
1446 gtk_tree_view_column_pack_start(column, rend, FALSE);
1447
1448 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", PIDGIN_POUNCE_ICON, NULL);
1449 rend = gtk_cell_renderer_text_new();
1450 gtk_tree_view_column_pack_start(column, rend, FALSE);
1451 gtk_tree_view_column_add_attribute(column, rend, "text", PIDGIN_POUNCE_ALIAS);
1452 gtk_tree_view_append_column(GTK_TREE_VIEW(spec_dialog->treeview), column);
1453
1454 column = gtk_tree_view_column_new();
1455 gtk_tree_view_column_set_title(column, _("Event"));
1456 gtk_tree_view_column_set_resizable(column, TRUE);
1457 rend = gtk_cell_renderer_text_new();
1458 gtk_tree_view_column_pack_start(column, rend, FALSE);
1459 gtk_tree_view_column_add_attribute(column, rend, "text", PIDGIN_POUNCE_EVENT);
1460 gtk_tree_view_append_column(GTK_TREE_VIEW(spec_dialog->treeview), column);
1461
1462 column = gtk_tree_view_column_new();
1463 gtk_tree_view_column_set_title(column, _("Message"));
1464 gtk_tree_view_column_set_resizable(column, TRUE);
1465 rend = gtk_cell_renderer_text_new();
1466 gtk_tree_view_column_pack_start(column, rend, FALSE);
1467 gtk_tree_view_column_add_attribute(column, rend, "text", PIDGIN_POUNCE_TEXT);
1468 gtk_tree_view_append_column(GTK_TREE_VIEW(spec_dialog->treeview), column);
1469
1470 column = gtk_tree_view_column_new();
1471 gtk_tree_view_column_set_title(column, _("Date"));
1472 gtk_tree_view_column_set_resizable(column, TRUE);
1473 rend = gtk_cell_renderer_text_new();
1474 gtk_tree_view_column_pack_start(column, rend, FALSE);
1475 gtk_tree_view_column_add_attribute(column, rend, "text", PIDGIN_POUNCE_DATE);
1476 gtk_tree_view_append_column(GTK_TREE_VIEW(spec_dialog->treeview), column);
1477
1478 label = gtk_label_new(NULL);
1479 gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have pounced!</span>"));
1480
1481 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(spec_dialog->treeview));
1482 gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
1483 g_signal_connect(G_OBJECT(sel), "changed",
1484 G_CALLBACK(pounce_row_selected_cb), NULL);
1485 }
1486
1487 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1488 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1489 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1490 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 2);
1491
1492 if (type == PIDGIN_NOTIFY_MAIL)
1493 mail_dialog = spec_dialog;
1494 else if (type == PIDGIN_NOTIFY_POUNCE) {
1495 pounce_dialog = spec_dialog;
1496 }
1497
1498 return spec_dialog->dialog;
1499
1500 }
1501
1502 void
1503 pidgin_notify_pounce_add(PurpleAccount *account, PurplePounce *pounce,
1504 const char *alias, const char *event, const char *message, const char *date)
1505 {
1506 GtkWidget *dialog;
1507 GdkPixbuf *icon;
1508 GtkTreeIter iter;
1509 PidginNotifyPounceData *pounce_data;
1510
1511 dialog = pidgin_get_notification_dialog(PIDGIN_NOTIFY_POUNCE);
1512
1513 icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
1514
1515 pounce_data = g_new(PidginNotifyPounceData, 1);
1516
1517 pounce_data->account = account;
1518 pounce_data->pounce = pounce;
1519
1520 gtk_tree_store_append(pounce_dialog->treemodel, &iter, NULL);
1521
1522 gtk_tree_store_set(pounce_dialog->treemodel, &iter,
1523 PIDGIN_POUNCE_ICON, icon,
1524 PIDGIN_POUNCE_ALIAS, alias,
1525 PIDGIN_POUNCE_EVENT, event,
1526 PIDGIN_POUNCE_TEXT, (message != NULL)? message : _("No message"),
1527 PIDGIN_POUNCE_DATE, date,
1528 PIDGIN_POUNCE_DATA, pounce_data,
1529 -1);
1530
1531 if (icon)
1532 g_object_unref(icon);
1533
1534 gtk_widget_show_all(dialog);
1535
1536 return;
1537 }
1538
1539 static GtkWidget *
1540 pidgin_get_notification_dialog(PidginNotifyType type)
1541 {
1542 GtkTreeStore *model = NULL;
1543
1544 if (type == PIDGIN_NOTIFY_MAIL) {
1545 if (mail_dialog != NULL)
1546 return mail_dialog->dialog;
1547
1548 model = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL,
1549 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
1550
1551 } else if (type == PIDGIN_NOTIFY_POUNCE) {
1552
1553 if (pounce_dialog != NULL)
1554 return pounce_dialog->dialog;
1555
1556 model = gtk_tree_store_new(PIDGIN_POUNCE_COLUMNS,
1557 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
1558 G_TYPE_STRING, G_TYPE_POINTER);
1559 }
1560
1561 return pidgin_get_dialog(type, model);
1235 } 1562 }
1236 1563
1237 static PurpleNotifyUiOps ops = 1564 static PurpleNotifyUiOps ops =
1238 { 1565 {
1239 pidgin_notify_message, 1566 pidgin_notify_message,