1 /*
2 * xfce4-mailwatch-plugin - a mail notification applet for the xfce4 panel
3 * Copyright (c) 2005-2008 Brian Tarricone <bjt23@cornell.edu>
4 * Copyright (c) 2005 Jasper Huijsmans <jasper@xfce.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License ONLY.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 /*
21 * Source code of functions mailwatch_help_auto_toggled_cb,
22 * mailwatch_help_show_uri, mailwatch_help_response_cb and
23 * mailwatch_help_clicked_cb was taken from the xfce-dialogs.c file of
24 * libxfce4ui library and modified on (dd-mm-yyyy):
25 *
26 * 15-10-2013
27 *
28 * Below is the copyright notice of the xfce-dialogs.c code.
29 *
30 * Copyright (c) 2006-2007 Benedikt Meurer <benny@xfce.org>
31 * Copyright (c) 2007 The Xfce Development Team
32 *
33 * This library is free software; you can redistribute it and/or
34 * modify it under the terms of the GNU Library General Public
35 * License as published by the Free Software Foundation; either
36 * version 2 of the License, or (at your option) any later version.
37 *
38 * This library is distributed in the hope that it will be useful,
39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41 * Library General Public License for more details.
42 *
43 * You should have received a copy of the GNU Library General Public
44 * License along with this library; if not, write to the Free Software
45 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
46 * MA 02110-1301 USA
47 */
48
49 #ifdef HAVE_CONFIG_H
50 #include <config.h>
51 #endif
52
53 #ifdef HAVE_SIGNAL_H
54 #include <signal.h>
55 #endif
56
57 #include <string.h>
58 #include <stdlib.h>
59 #include <gtk/gtk.h>
60
61 #include <libxfce4util/libxfce4util.h>
62 #include <libxfce4ui/libxfce4ui.h>
63 #include <libxfce4panel/libxfce4panel.h>
64 #include <exo/exo.h>
65
66 #include "mailwatch.h"
67 #include "mailwatch-mailbox.h"
68 #include "mailwatch-utils.h"
69
70 #define BORDER 8
71 #define DEFAULT_LOG_LINES 500
72 #define DEFAULT_NORMAL_ICON "xfce-nomail"
73 #define DEFAULT_NEW_MAIL_ICON "xfce-newmail"
74 #define MOUSE_BUTTON_LEFT 1
75 #define MOUSE_BUTTON_MIDDLE 2
76
77 typedef struct
78 {
79 XfcePanelPlugin *plugin;
80 XfceMailwatch *mailwatch;
81
82 GtkWidget *button;
83 GtkWidget *image;
84
85 gboolean newmail_icon_visible;
86 guint new_messages;
87
88 gchar *click_command;
89 gchar *new_messages_command;
90 gchar *count_changed_command;
91
92 GdkPixbuf *pix_normal;
93 GdkPixbuf *pix_newmail;
94 gchar *normal_icon;
95 gchar *new_mail_icon;
96
97 GtkWidget *log_dialog;
98 guint log_lines;
99 gboolean show_log_status;
100 GdkPixbuf *pix_log[XFCE_MAILWATCH_N_LOG_LEVELS];
101 XfceMailwatchLogLevel log_status;
102 GtkListStore *loglist;
103
104 gboolean auto_open_online_doc;
105 } XfceMailwatchPlugin;
106
107 enum {
108 ICON_TYPE_NORMAL,
109 ICON_TYPE_NEW_MAIL,
110 XFCE_MAILWATCH_RESPONSE_CLEAR
111 };
112
113 enum {
114 LOGLIST_COLUMN_PIXBUF = 0,
115 LOGLIST_COLUMN_TIME,
116 LOGLIST_COLUMN_MESSAGE,
117 LOGLIST_N_COLUMNS
118 };
119
120 static gboolean mailwatch_set_size(XfcePanelPlugin *plugin,
121 gint wsize,
122 XfceMailwatchPlugin *mwp);
123
124 static void
mailwatch_set_default_config(XfceMailwatchPlugin * mwp)125 mailwatch_set_default_config(XfceMailwatchPlugin *mwp)
126 {
127 mwp->log_lines = 200;
128 mwp->show_log_status = TRUE;
129 }
130
131 static void
mailwatch_new_messages_changed_cb(XfceMailwatch * mailwatch,gpointer new_message_count,gpointer user_data)132 mailwatch_new_messages_changed_cb(XfceMailwatch *mailwatch,
133 gpointer new_message_count,
134 gpointer user_data)
135 {
136 XfceMailwatchPlugin *mwp = user_data;
137 guint new_messages = GPOINTER_TO_UINT(new_message_count);
138
139 if (new_messages == 0 && mwp->newmail_icon_visible) {
140 mwp->newmail_icon_visible = FALSE;
141 mwp->new_messages = 0;
142 mailwatch_set_size(mwp->plugin,
143 xfce_panel_plugin_get_size(mwp->plugin),
144 mwp);
145 gtk_widget_set_tooltip_text(mwp->button, _("No new mail"));
146 gtk_widget_trigger_tooltip_query(mwp->button);
147 /* Run command on any change of count of new messages. */
148 if (mwp->count_changed_command)
149 xfce_spawn_command_line_on_screen(gdk_screen_get_default(),
150 mwp->count_changed_command,
151 FALSE, FALSE, NULL);
152 } else if (new_messages > 0) {
153 if (!mwp->newmail_icon_visible) {
154 mwp->newmail_icon_visible = TRUE;
155 mailwatch_set_size(mwp->plugin,
156 xfce_panel_plugin_get_size(mwp->plugin),
157 mwp);
158 }
159 if (new_messages != mwp->new_messages) {
160 GString *ttip_str = g_string_sized_new(64);
161 gchar **mailbox_names = NULL;
162 guint *new_message_counts = NULL;
163 gint i;
164
165 g_string_append_printf(ttip_str,
166 ngettext("You have %d new message:",
167 "You have %d new messages:",
168 new_messages), new_messages);
169
170 xfce_mailwatch_get_new_message_breakdown(mwp->mailwatch,
171 &mailbox_names, &new_message_counts);
172 for (i = 0; mailbox_names[i]; i++) {
173 if (new_message_counts[i] > 0) {
174 g_string_append_c(ttip_str, '\n');
175 g_string_append_printf(ttip_str,
176 Q_("tells how many new messages in each mailbox| %d in %s"),
177 new_message_counts[i],
178 mailbox_names[i]);
179 }
180 }
181
182 g_strfreev(mailbox_names);
183 g_free(new_message_counts);
184
185 gtk_widget_set_tooltip_text(mwp->button, ttip_str->str);
186 gtk_widget_trigger_tooltip_query(mwp->button);
187 g_string_free(ttip_str, TRUE);
188 /* Run command when count of new messages changes from
189 * zero to non-zero. */
190 if (mwp->new_messages == 0 && mwp->new_messages_command)
191 xfce_spawn_command_line_on_screen(gdk_screen_get_default(),
192 mwp->new_messages_command,
193 FALSE, FALSE, NULL);
194 /* Run command on any change of count of new messages. */
195 if (mwp->count_changed_command)
196 xfce_spawn_command_line_on_screen(gdk_screen_get_default(),
197 mwp->count_changed_command,
198 FALSE, FALSE, NULL);
199 /* Save the actual count of new messages.*/
200 mwp->new_messages = new_messages;
201 }
202 }
203 }
204
205 static gboolean
mailwatch_button_press_cb(GtkWidget * w,GdkEventButton * evt,gpointer user_data)206 mailwatch_button_press_cb(GtkWidget *w,
207 GdkEventButton *evt,
208 gpointer user_data)
209 {
210 return FALSE;
211 }
212
213 static gboolean
mailwatch_button_release_cb(GtkWidget * w,GdkEventButton * evt,gpointer user_data)214 mailwatch_button_release_cb(GtkWidget *w,
215 GdkEventButton *evt,
216 gpointer user_data)
217 {
218 XfceMailwatchPlugin *mwp = user_data;
219 GtkAllocation allocation;
220
221 gtk_widget_get_allocation(w, &allocation);
222 if (evt->x >= allocation.x
223 && evt->x < allocation.x + allocation.width
224 && evt->y >= allocation.y
225 && evt->y < allocation.y + allocation.height)
226 {
227 switch (evt->button) {
228 case MOUSE_BUTTON_LEFT:
229 if (mwp->click_command && *mwp->click_command)
230 xfce_spawn_command_line_on_screen(gdk_screen_get_default(),
231 mwp->click_command,
232 FALSE, FALSE, NULL);
233 break;
234
235 case MOUSE_BUTTON_MIDDLE:
236 xfce_mailwatch_force_update(mwp->mailwatch);
237 break;
238 }
239 }
240
241 return FALSE;
242 }
243
244 static void
mailwatch_log_message_cb(XfceMailwatch * mailwatch,gpointer arg,gpointer user_data)245 mailwatch_log_message_cb(XfceMailwatch *mailwatch,
246 gpointer arg,
247 gpointer user_data)
248 {
249 XfceMailwatchLogEntry *entry = arg;
250 XfceMailwatchPlugin *mwp = user_data;
251 GtkTreeIter iter;
252 struct tm ltm;
253 gchar time_str[256] = "", *new_message = NULL;
254
255 if (localtime_r(&entry->timestamp, <m))
256 strftime(time_str, 256, "%x %T:", <m);
257
258 if (entry->level >= XFCE_MAILWATCH_N_LOG_LEVELS)
259 entry->level = XFCE_MAILWATCH_N_LOG_LEVELS - 1;
260
261 if (entry->mailbox_name) {
262 new_message = g_strdup_printf("[%s] %s", entry->mailbox_name,
263 entry->message);
264 }
265
266 gtk_list_store_append(mwp->loglist, &iter);
267 gtk_list_store_set(mwp->loglist, &iter,
268 LOGLIST_COLUMN_PIXBUF, mwp->pix_log[entry->level],
269 LOGLIST_COLUMN_TIME, time_str,
270 LOGLIST_COLUMN_MESSAGE, new_message ? new_message : entry->message,
271 -1);
272
273 g_free(new_message);
274
275 if (entry->level > mwp->log_status) {
276 mwp->log_status = entry->level;
277 mailwatch_set_size(mwp->plugin,
278 xfce_panel_plugin_get_size(mwp->plugin),
279 mwp);
280 }
281
282 while (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(mwp->loglist), NULL) > (gint)mwp->log_lines) {
283 if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(mwp->loglist), &iter, NULL, 0))
284 gtk_list_store_remove(mwp->loglist, &iter);
285 }
286 }
287
288 static GdkPixbuf *
mailwatch_get_mini_icon(GtkWidget * dummy,const gchar * icon_name,gint size)289 mailwatch_get_mini_icon(GtkWidget *dummy,
290 const gchar *icon_name,
291 gint size)
292 {
293 GdkPixbuf *pix;
294
295 pix = gtk_icon_theme_load_icon(gtk_icon_theme_get_default (), icon_name,
296 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
297 if (pix) {
298 if (size / 2 != gdk_pixbuf_get_width(pix)) {
299 GdkPixbuf *tmp = gdk_pixbuf_scale_simple(pix, size / 2,
300 size / 2,
301 GDK_INTERP_BILINEAR);
302 g_object_unref(G_OBJECT(pix));
303 pix = tmp;
304 }
305 }
306
307 return pix;
308 }
309
310 static GdkPixbuf *
mailwatch_build_icon(XfceMailwatchPlugin * mwp,gboolean newmail)311 mailwatch_build_icon(XfceMailwatchPlugin *mwp,
312 gboolean newmail)
313 {
314 GdkPixbuf *pb = newmail ? gdk_pixbuf_copy(mwp->pix_newmail)
315 : gdk_pixbuf_copy(mwp->pix_normal);
316 GdkPixbuf *overlay = NULL;
317
318 if (mwp->log_status && mwp->show_log_status
319 && mwp->log_status < XFCE_MAILWATCH_N_LOG_LEVELS)
320 {
321 overlay = mwp->pix_log[mwp->log_status];
322 }
323
324 if (overlay) {
325 gint h, ow, oh;
326
327 h = gdk_pixbuf_get_height(pb);
328 ow = gdk_pixbuf_get_width(overlay);
329 oh = gdk_pixbuf_get_height(overlay);
330 gdk_pixbuf_composite(overlay, pb, 0, h - oh, ow, oh, 0, h - oh,
331 1.0, 1.0, GDK_INTERP_HYPER, 255);
332 }
333
334 return pb;
335 }
336
337 static gboolean
mailwatch_set_size(XfcePanelPlugin * plugin,gint wsize,XfceMailwatchPlugin * mwp)338 mailwatch_set_size(XfcePanelPlugin *plugin,
339 gint wsize,
340 XfceMailwatchPlugin *mwp)
341 {
342 gint size, isize, img_width, img_height, width, height, i;
343 const gchar *icon;
344 GdkPixbuf *pb;
345 GtkIconTheme *itheme;
346 GtkIconInfo *info = NULL;
347
348 GtkBorder button_padding;
349 gint xthickness;
350 gint ythickness;
351
352 /* The plugin only occupies a single row */
353 wsize /= xfce_panel_plugin_get_nrows (plugin);
354
355 gtk_style_context_get_padding (gtk_widget_get_style_context (GTK_WIDGET (mwp->button)),
356 GTK_STATE_FLAG_NORMAL, &button_padding);
357 xthickness = button_padding.left + button_padding.right;
358 ythickness = button_padding.top + button_padding.bottom;
359
360 /* Calculate the size of the space left for the icon */
361 size = wsize - 2 - MAX(xthickness, ythickness);
362
363 /* Since symbolic icons are usually only provided in 16px we
364 * try to be clever and use size steps */
365 if (size <= 21)
366 isize = 16;
367 else if (size >=22 && size <= 29)
368 isize = 24;
369 else if (size >= 30 && size <= 40)
370 isize = 32;
371 else
372 isize = size;
373
374 if(xfce_panel_plugin_get_orientation(plugin) == GTK_ORIENTATION_HORIZONTAL) {
375 img_width = -1;
376 img_height = isize;
377 } else {
378 img_width = isize;
379 img_height = -1;
380 }
381
382 if (mwp->pix_normal)
383 g_object_unref(G_OBJECT(mwp->pix_normal));
384 if (mwp->pix_newmail)
385 g_object_unref(G_OBJECT(mwp->pix_newmail));
386
387 for (i = 0; i < XFCE_MAILWATCH_N_LOG_LEVELS; i++) {
388 if (mwp->pix_log[i])
389 g_object_unref(G_OBJECT(mwp->pix_log[i]));
390 }
391
392 /* find and load the two main icons, preserving aspect ratio */
393 itheme = gtk_icon_theme_get_for_screen(gtk_widget_get_screen(GTK_WIDGET(plugin)));
394
395 icon = mwp->normal_icon ? mwp->normal_icon : DEFAULT_NORMAL_ICON;
396 if (!g_path_is_absolute(icon)) {
397 info = gtk_icon_theme_lookup_icon(itheme, icon, isize, 0);
398 if (info)
399 icon = gtk_icon_info_get_filename(info);
400 }
401
402 mwp->pix_normal = gdk_pixbuf_new_from_file_at_scale(icon, img_width,
403 img_height, TRUE,
404 NULL);
405 if (info) {
406 g_object_unref(G_OBJECT(info));
407 info = NULL;
408 }
409
410 icon = mwp->new_mail_icon ? mwp->new_mail_icon : DEFAULT_NEW_MAIL_ICON;
411 if (!g_path_is_absolute(icon)) {
412 info = gtk_icon_theme_lookup_icon(itheme, icon, isize, 0);
413 if (info)
414 icon = gtk_icon_info_get_filename(info);
415 }
416
417 mwp->pix_newmail = gdk_pixbuf_new_from_file_at_scale(icon, img_width,
418 img_height, TRUE,
419 NULL);
420 if (info) {
421 g_object_unref(G_OBJECT(info));
422 info = NULL;
423 }
424
425 /* find the smallest dimensions of the two icons */
426 width = gdk_pixbuf_get_width(mwp->pix_normal);
427 if (gdk_pixbuf_get_width(mwp->pix_newmail) < width)
428 width = gdk_pixbuf_get_width(mwp->pix_newmail);
429 height = gdk_pixbuf_get_height(mwp->pix_normal);
430 if (gdk_pixbuf_get_height(mwp->pix_newmail) < height)
431 height = gdk_pixbuf_get_height(mwp->pix_newmail);
432
433 if (!gtk_widget_get_realized(GTK_WIDGET(plugin)))
434 gtk_widget_realize(GTK_WIDGET(plugin));
435
436 /* load log mini-icons. use the smallest dimension of the smaller
437 * main icon as a base for the mini icons to ensure they aren't too
438 * large in the smaller dimension */
439 mwp->pix_log[XFCE_MAILWATCH_LOG_INFO] =
440 mailwatch_get_mini_icon(GTK_WIDGET(plugin), "dialog-info",
441 width < height ? width : height);
442 mwp->pix_log[XFCE_MAILWATCH_LOG_WARNING] =
443 mailwatch_get_mini_icon(GTK_WIDGET(plugin), "dialog-warning",
444 width < height ? width : height);
445 mwp->pix_log[XFCE_MAILWATCH_LOG_ERROR] =
446 mailwatch_get_mini_icon(GTK_WIDGET(plugin), "dialog-error",
447 width < height ? width : height);
448
449 pb = mailwatch_build_icon(mwp, mwp->newmail_icon_visible);
450 width = gdk_pixbuf_get_width(pb);
451 height = gdk_pixbuf_get_height(pb);
452 gtk_image_set_from_pixbuf(GTK_IMAGE(mwp->image), pb);
453 g_object_unref(G_OBJECT(pb));
454
455 width += wsize - isize;
456 height += wsize - isize;
457 gtk_widget_set_size_request(mwp->button, width, height);
458
459 return TRUE;
460 }
461
462 static XfceMailwatchPlugin *
mailwatch_create(XfcePanelPlugin * plugin)463 mailwatch_create(XfcePanelPlugin *plugin)
464 {
465 XfceMailwatchPlugin *mwp = g_new0(XfceMailwatchPlugin, 1);
466
467 mwp->plugin = plugin;
468 mwp->mailwatch = xfce_mailwatch_new();
469
470 if (G_UNLIKELY(!mwp->mailwatch)) {
471 xfce_message_dialog(NULL, _("Xfce Mailwatch"), "dialog-error",
472 _("The mailwatch applet cannot be added to the panel."),
473 _("It is possible that your version of GLib does not have threads support."),
474 _("_Close"), GTK_RESPONSE_ACCEPT,
475 NULL);
476 g_free(mwp);
477 return NULL;
478 }
479
480 mwp->button = xfce_panel_create_button();
481 gtk_button_set_relief(GTK_BUTTON(mwp->button), GTK_RELIEF_NONE);
482 gtk_widget_show(mwp->button);
483 gtk_container_add(GTK_CONTAINER(plugin), mwp->button);
484 g_signal_connect(mwp->button, "button-press-event",
485 G_CALLBACK(mailwatch_button_press_cb), mwp);
486 g_signal_connect(mwp->button, "button-release-event",
487 G_CALLBACK(mailwatch_button_release_cb), mwp);
488
489 gtk_widget_set_tooltip_text(mwp->button, _("No new mail"));
490
491 xfce_panel_plugin_add_action_widget(plugin, mwp->button);
492
493 mwp->image = gtk_image_new();
494 gtk_widget_show(mwp->image);
495 gtk_container_add(GTK_CONTAINER(mwp->button), mwp->image);
496
497 mwp->log_dialog = NULL;
498 mwp->loglist = gtk_list_store_new(LOGLIST_N_COLUMNS,
499 GDK_TYPE_PIXBUF,
500 G_TYPE_STRING,
501 G_TYPE_STRING );
502
503 xfce_mailwatch_signal_connect(mwp->mailwatch,
504 XFCE_MAILWATCH_SIGNAL_NEW_MESSAGE_COUNT_CHANGED,
505 mailwatch_new_messages_changed_cb, mwp);
506 xfce_mailwatch_signal_connect( mwp->mailwatch,
507 XFCE_MAILWATCH_SIGNAL_LOG_MESSAGE,
508 mailwatch_log_message_cb, mwp);
509
510 return mwp;
511 }
512
513 static void
mailwatch_read_config(XfcePanelPlugin * plugin,XfceMailwatchPlugin * mwp)514 mailwatch_read_config(XfcePanelPlugin *plugin,
515 XfceMailwatchPlugin *mwp)
516 {
517 const char *value;
518 gchar *file;
519 gboolean reload_icon = TRUE;
520 XfceRc *rc;
521
522 DBG("entering");
523
524 file = xfce_panel_plugin_lookup_rc_file(plugin);
525 if (!file) {
526 DBG("Mailwatch: no config found; setting defaults");
527 mailwatch_set_default_config(mwp);
528 return;
529 }
530
531 rc = xfce_rc_simple_open(file, TRUE);
532 if (!rc) {
533 DBG("Mailwatch: no config found in \"%s\"; setting defaults", file);
534 g_free(file);
535 mailwatch_set_default_config(mwp);
536 return;
537 }
538
539 xfce_rc_set_group(rc, "mailwatch-plugin");
540
541 value = xfce_rc_read_entry(rc, "click_command", NULL);
542 if(value)
543 mwp->click_command = g_strdup(value);
544
545 value = xfce_rc_read_entry(rc, "new_messages_command", NULL);
546 if(value)
547 mwp->new_messages_command = g_strdup(value);
548
549 value = xfce_rc_read_entry(rc, "count_changed_command", NULL);
550 if(value)
551 mwp->count_changed_command = g_strdup(value);
552
553 value = xfce_rc_read_entry(rc, "normal_icon", NULL);
554 if (value) {
555 mwp->normal_icon = g_strdup(value);
556 reload_icon = TRUE;
557 } else {
558 mwp->normal_icon = g_strdup(DEFAULT_NORMAL_ICON);
559 }
560
561 value = xfce_rc_read_entry(rc, "new_mail_icon", NULL);
562 if (value) {
563 mwp->new_mail_icon = g_strdup(value);
564 reload_icon = TRUE;
565 } else {
566 mwp->new_mail_icon = g_strdup(DEFAULT_NEW_MAIL_ICON);
567 }
568
569 if(reload_icon)
570 mailwatch_set_size(plugin, xfce_panel_plugin_get_size(plugin), mwp);
571
572 mwp->log_lines = xfce_rc_read_int_entry(rc, "log_lines", DEFAULT_LOG_LINES);
573
574 mwp->show_log_status = xfce_rc_read_bool_entry(rc, "show_log_status", TRUE);
575
576 mwp->auto_open_online_doc = xfce_rc_read_bool_entry(rc, "auto_open_online_doc", FALSE);
577
578 xfce_rc_close(rc);
579
580 xfce_mailwatch_set_config_file(mwp->mailwatch, file);
581 xfce_mailwatch_load_config(mwp->mailwatch);
582
583 g_free(file);
584 }
585
586 static void
mailwatch_write_config(XfcePanelPlugin * plugin,XfceMailwatchPlugin * mwp)587 mailwatch_write_config(XfcePanelPlugin *plugin,
588 XfceMailwatchPlugin *mwp)
589 {
590 gchar *file;
591 XfceRc *rc;
592
593 TRACE("entering");
594
595 file = xfce_panel_plugin_save_location(plugin, TRUE);
596 if (!file) {
597 g_critical("Mailwatch: Unable to find save location for configuration file");
598 return;
599 }
600
601 rc = xfce_rc_simple_open(file, FALSE);
602 if (!rc) {
603 g_critical("Mailwatch: Unable to open \"%s\" for writing", file);
604 g_free(file);
605 return;
606 }
607
608 xfce_rc_set_group(rc, "mailwatch-plugin");
609
610 xfce_rc_write_entry(rc, "click_command",
611 mwp->click_command?mwp->click_command:"");
612 xfce_rc_write_entry(rc, "new_messages_command",
613 mwp->new_messages_command?mwp->new_messages_command:"");
614 xfce_rc_write_entry(rc, "count_changed_command",
615 mwp->count_changed_command?mwp->count_changed_command:"");
616 xfce_rc_write_entry(rc, "normal_icon",
617 mwp->normal_icon?mwp->normal_icon:DEFAULT_NORMAL_ICON);
618 xfce_rc_write_entry(rc, "new_mail_icon",
619 mwp->new_mail_icon?mwp->new_mail_icon:DEFAULT_NEW_MAIL_ICON);
620 xfce_rc_write_int_entry(rc, "log_lines", mwp->log_lines);
621 xfce_rc_write_bool_entry(rc, "show_log_status", mwp->show_log_status);
622 xfce_rc_write_bool_entry(rc, "auto_open_online_doc", mwp->auto_open_online_doc);
623
624 xfce_rc_close(rc);
625
626 xfce_mailwatch_set_config_file(mwp->mailwatch, file);
627 xfce_mailwatch_save_config(mwp->mailwatch);
628
629 g_free(file);
630 }
631
632 static gboolean
mailwatch_click_command_focusout_cb(GtkWidget * w,GdkEventFocus * evt,gpointer user_data)633 mailwatch_click_command_focusout_cb(GtkWidget *w,
634 GdkEventFocus *evt,
635 gpointer user_data)
636 {
637 XfceMailwatchPlugin *mwp = user_data;
638 gchar *command;
639
640 g_free(mwp->click_command);
641
642 command = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1);
643 mwp->click_command = g_strdup(command ? command : "");
644
645 return FALSE;
646 }
647
648 static void
mailwatch_log_window_response_cb(GtkDialog * dialog,gint response,gpointer user_data)649 mailwatch_log_window_response_cb(GtkDialog *dialog,
650 gint response,
651 gpointer user_data)
652 {
653 if(response == XFCE_MAILWATCH_RESPONSE_CLEAR) {
654 GtkListStore *ls = user_data;
655 gtk_list_store_clear(ls);
656 } else {
657 gtk_widget_destroy(GTK_WIDGET(dialog));
658 }
659 }
660
661 static void
mailwatch_zero_pointer(GtkWidget ** w)662 mailwatch_zero_pointer(GtkWidget **w)
663 {
664 if(w)
665 *w = NULL;
666 }
667
668 static void
mailwatch_log_lines_changed_cb(GtkWidget * w,gpointer user_data)669 mailwatch_log_lines_changed_cb(GtkWidget *w,
670 gpointer user_data)
671 {
672 XfceMailwatchPlugin *mwp = user_data;
673
674 mwp->log_lines = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w));
675 }
676
677 static void
mailwatch_log_status_toggled_cb(GtkToggleButton * tb,gpointer user_data)678 mailwatch_log_status_toggled_cb(GtkToggleButton *tb,
679 gpointer user_data)
680 {
681 XfceMailwatchPlugin *mwp = user_data;
682
683 mwp->show_log_status = gtk_toggle_button_get_active(tb);
684
685 xfce_mailwatch_get_new_messages(mwp->mailwatch);
686 mailwatch_set_size(mwp->plugin,
687 xfce_panel_plugin_get_size(mwp->plugin),
688 mwp);
689 }
690
691 static void
mailwatch_view_log_clicked_cb(GtkWidget * widget,gpointer user_data)692 mailwatch_view_log_clicked_cb(GtkWidget *widget,
693 gpointer user_data )
694 {
695 XfceMailwatchPlugin *mwp = user_data;
696 GtkWidget *vbox, *scrollw, *treeview, *button;
697
698 if (mwp->log_dialog) {
699 gtk_window_present(GTK_WINDOW(mwp->log_dialog));
700 return;
701 }
702
703 mwp->log_status = 0;
704 mailwatch_set_size(mwp->plugin,
705 xfce_panel_plugin_get_size(mwp->plugin),
706 mwp);
707
708 mwp->log_dialog = gtk_dialog_new_with_buttons(_( "Mailwatch log" ),
709 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
710 GTK_DIALOG_DESTROY_WITH_PARENT,
711 NULL, NULL);
712 gtk_window_set_default_size(GTK_WINDOW(mwp->log_dialog), 480, 240 );
713 #if LIBXFCE4UI_CHECK_VERSION (4, 15, 1)
714 xfce_titled_dialog_create_action_area(XFCE_TITLED_DIALOG(mwp->log_dialog));
715 #endif
716 gtk_button_box_set_layout(GTK_BUTTON_BOX(exo_gtk_dialog_get_action_area(GTK_DIALOG(mwp->log_dialog))),
717 GTK_BUTTONBOX_EDGE);
718 g_signal_connect(G_OBJECT(mwp->log_dialog), "response",
719 G_CALLBACK(mailwatch_log_window_response_cb), mwp->loglist);
720 g_signal_connect_swapped(G_OBJECT(mwp->log_dialog), "destroy",
721 G_CALLBACK(mailwatch_zero_pointer), &mwp->log_dialog);
722
723 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER/2);
724 gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER/2);
725 gtk_widget_show(vbox);
726 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(mwp->log_dialog))),
727 vbox, TRUE, TRUE, 0);
728
729 scrollw = gtk_scrolled_window_new( NULL, NULL );
730 gtk_widget_show( scrollw );
731 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrollw ),
732 GTK_POLICY_AUTOMATIC,
733 GTK_POLICY_AUTOMATIC );
734 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scrollw ),
735 GTK_SHADOW_IN );
736 gtk_box_pack_start( GTK_BOX( vbox ), scrollw, TRUE, TRUE, 0 );
737
738 treeview = gtk_tree_view_new_with_model( GTK_TREE_MODEL( mwp->loglist ) );
739 gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( treeview ), FALSE );
740 gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW( treeview ),
741 -1,
742 "Level",
743 gtk_cell_renderer_pixbuf_new(),
744 "pixbuf", LOGLIST_COLUMN_PIXBUF,
745 NULL );
746 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), -1,
747 "Timestamp",
748 gtk_cell_renderer_text_new(),
749 "text", LOGLIST_COLUMN_TIME,
750 NULL);
751 gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW( treeview ),
752 -1,
753 "Message",
754 gtk_cell_renderer_text_new(),
755 "text", LOGLIST_COLUMN_MESSAGE,
756 NULL );
757 g_object_set(G_OBJECT(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 0)),
758 "expand", FALSE, NULL);
759 g_object_set(G_OBJECT(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 1)),
760 "expand", FALSE, NULL);
761 g_object_set(G_OBJECT(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 2)),
762 "expand", TRUE, NULL);
763 gtk_widget_show( treeview );
764 gtk_container_add( GTK_CONTAINER( scrollw ), treeview );
765
766 button = gtk_button_new_with_mnemonic(_("C_lear"));
767 gtk_button_set_image(GTK_BUTTON(button),
768 gtk_image_new_from_icon_name("edit-clear",
769 GTK_ICON_SIZE_BUTTON));
770 gtk_widget_show( button );
771 #if LIBXFCE4UI_CHECK_VERSION (4, 15, 1)
772 xfce_titled_dialog_add_action_widget(XFCE_TITLED_DIALOG(mwp->log_dialog), button,
773 XFCE_MAILWATCH_RESPONSE_CLEAR);
774 #else
775 gtk_dialog_add_action_widget(GTK_DIALOG(mwp->log_dialog), button,
776 XFCE_MAILWATCH_RESPONSE_CLEAR);
777 #endif
778
779 button = gtk_button_new_with_mnemonic(_("_Close"));
780 gtk_widget_show( button );
781 #if LIBXFCE4UI_CHECK_VERSION (4, 15, 1)
782 xfce_titled_dialog_add_action_widget(XFCE_TITLED_DIALOG(mwp->log_dialog), button,
783 GTK_RESPONSE_ACCEPT);
784 #else
785 gtk_dialog_add_action_widget(GTK_DIALOG(mwp->log_dialog), button,
786 GTK_RESPONSE_ACCEPT);
787 #endif
788
789 gtk_widget_show(mwp->log_dialog);
790 }
791
792 static gboolean
mailwatch_newmsg_command_focusout_cb(GtkWidget * w,GdkEventFocus * evt,gpointer user_data)793 mailwatch_newmsg_command_focusout_cb(GtkWidget *w,
794 GdkEventFocus *evt,
795 gpointer user_data)
796 {
797 XfceMailwatchPlugin *mwp = user_data;
798 gchar *command;
799
800 g_free(mwp->new_messages_command);
801
802 command = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1);
803 mwp->new_messages_command = g_strdup(command ? command : NULL);
804
805 return FALSE;
806 }
807
808 static gboolean
mailwatch_count_changed_command_focusout_cb(GtkWidget * w,GdkEventFocus * evt,gpointer user_data)809 mailwatch_count_changed_command_focusout_cb(GtkWidget *w,
810 GdkEventFocus *evt,
811 gpointer user_data)
812 {
813 XfceMailwatchPlugin *mwp = user_data;
814 gchar *command;
815
816 g_free(mwp->count_changed_command);
817
818 command = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1);
819 mwp->count_changed_command = g_strdup(command ? command : NULL);
820
821 return FALSE;
822 }
823
824 static void
mailwatch_iconbtn_clicked_cb(GtkWidget * w,XfceMailwatchPlugin * mwp)825 mailwatch_iconbtn_clicked_cb(GtkWidget *w,
826 XfceMailwatchPlugin *mwp)
827 {
828 GtkWidget *chooser, *toplevel;
829 gint icon_type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),
830 "mailwatch-icontype"));
831
832 g_return_if_fail(icon_type == ICON_TYPE_NORMAL || icon_type == ICON_TYPE_NEW_MAIL);
833
834 toplevel = gtk_widget_get_toplevel(w);
835 chooser = exo_icon_chooser_dialog_new (_("Select Icon"),
836 GTK_WINDOW(gtk_widget_get_toplevel(toplevel)),
837 _("_Cancel"), GTK_RESPONSE_CANCEL,
838 _("_OK"), GTK_RESPONSE_ACCEPT,
839 NULL);
840 gtk_dialog_set_default_response(GTK_DIALOG(chooser), GTK_RESPONSE_ACCEPT);
841 /* Preselect actually used icon */
842 switch(icon_type) {
843 case ICON_TYPE_NORMAL:
844 exo_icon_chooser_dialog_set_icon (EXO_ICON_CHOOSER_DIALOG (chooser),
845 exo_str_is_empty (mwp->normal_icon) ?
846 DEFAULT_NORMAL_ICON : mwp->normal_icon);
847 break;
848 case ICON_TYPE_NEW_MAIL:
849 exo_icon_chooser_dialog_set_icon (EXO_ICON_CHOOSER_DIALOG (chooser),
850 exo_str_is_empty (mwp->new_mail_icon) ?
851 DEFAULT_NEW_MAIL_ICON : mwp->new_mail_icon);
852 break;
853 }
854
855 if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) {
856 gchar *filename = exo_icon_chooser_dialog_get_icon(EXO_ICON_CHOOSER_DIALOG(chooser));
857 if(filename) {
858 GtkWidget *image, *vbox;
859 GtkWidget *label = NULL;
860 GdkPixbuf **icon_pix = NULL;
861 gchar **icon_path = NULL;
862
863 switch(icon_type) {
864 case ICON_TYPE_NORMAL:
865 icon_path = &(mwp->normal_icon);
866 icon_pix = &(mwp->pix_normal);
867 label = gtk_label_new_with_mnemonic(_("_Normal"));
868 break;
869 case ICON_TYPE_NEW_MAIL:
870 icon_path = &(mwp->new_mail_icon);
871 icon_pix = &(mwp->pix_newmail);
872 label = gtk_label_new_with_mnemonic(_("Ne_w mail"));
873 break;
874 }
875
876 g_free(*icon_path);
877 *icon_path = filename;
878 mailwatch_set_size(mwp->plugin,
879 xfce_panel_plugin_get_size(mwp->plugin), mwp);
880
881 gtk_container_remove(GTK_CONTAINER(w), gtk_bin_get_child(GTK_BIN(w)));
882
883 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER / 2);
884 gtk_widget_show(vbox);
885 gtk_container_add(GTK_CONTAINER(w), vbox);
886
887 image = gtk_image_new_from_pixbuf(*icon_pix);
888 gtk_widget_show(image);
889 gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);
890
891 gtk_widget_show(label);
892 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
893 }
894 }
895 gtk_widget_destroy(chooser);
896 }
897
898 static void
mailwatch_help_auto_toggled_cb(GtkWidget * button,gpointer user_data)899 mailwatch_help_auto_toggled_cb(GtkWidget *button,
900 gpointer user_data)
901 {
902 XfceMailwatchPlugin *mwp = user_data;
903
904 if (button != NULL)
905 mwp->auto_open_online_doc = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
906 else
907 mwp->auto_open_online_doc = FALSE;
908 }
909
910 static void
mailwatch_help_show_uri(GdkScreen * screen,GtkWindow * parent)911 mailwatch_help_show_uri(GdkScreen *screen,
912 GtkWindow *parent)
913 {
914 GError *error = NULL;
915
916 g_return_if_fail(GDK_IS_SCREEN(screen));
917 g_return_if_fail(parent == NULL || GTK_IS_WINDOW(parent));
918
919 #if GTK_CHECK_VERSION(3,22,0)
920 if (!gtk_show_uri_on_window(parent, WEBSITE, gtk_get_current_event_time(), &error)) {
921 #else
922 if (!gtk_show_uri(screen, WEBSITE, gtk_get_current_event_time(), &error)) {
923 #endif
924 xfce_dialog_show_error(parent, error,
925 _("Failed to open web browser for online documentation"));
926 g_error_free(error);
927 }
928 }
929
930 static void
931 mailwatch_help_response_cb(GtkWidget *dialog,
932 gint response_id,
933 gpointer user_data)
934 {
935 XfceMailwatchPlugin *mwp = user_data;
936
937 gtk_widget_hide(dialog);
938
939 if (response_id == GTK_RESPONSE_YES) {
940 mailwatch_help_show_uri(gtk_widget_get_screen(dialog),
941 gtk_window_get_transient_for(GTK_WINDOW(dialog)));
942 } else {
943 /* Unset auto. */
944 mailwatch_help_auto_toggled_cb(NULL, mwp);
945 }
946
947 gtk_widget_destroy(dialog);
948 }
949
950 static void
951 mailwatch_help_clicked_cb(GtkWidget *w,
952 gpointer user_data)
953 {
954 GtkWidget *dialog;
955 GtkWidget *message_box;
956 GtkWidget *button;
957 GdkScreen *screen;
958 GtkWidget *toplevel;
959 GtkWindow *parent;
960 XfceMailwatchPlugin *mwp = user_data;
961
962 toplevel = gtk_widget_get_toplevel(w);
963 g_return_if_fail(gtk_widget_is_toplevel(toplevel) && GTK_IS_WINDOW(toplevel));
964 parent = (GtkWindow *) toplevel;
965 /* Check if we should automatically go online. */
966 if (mwp->auto_open_online_doc) {
967 screen = gtk_window_get_screen (GTK_WINDOW (parent));
968 mailwatch_help_show_uri (screen, parent);
969 return;
970 }
971
972 dialog = xfce_message_dialog_new (parent,
973 _("Online Documentation"), "dialog-question",
974 _("Do you want to read the manual online?"),
975 _("You will be redirected to the documentation website "
976 "where the help pages are maintained."),
977 _("_Cancel"), GTK_RESPONSE_NO,
978 _("_Read Online"), GTK_RESPONSE_YES,
979 NULL);
980
981 #if GTK_CHECK_VERSION(2, 22, 0)
982 message_box = gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog));
983 #else
984 message_box = gtk_widget_get_parent (GTK_MESSAGE_DIALOG (dialog)->label);
985 g_return_if_fail (GTK_IS_VBOX (message_box));
986 #endif
987
988 button = gtk_check_button_new_with_mnemonic (_("_Always go directly to the online documentation"));
989 gtk_box_pack_end (GTK_BOX (message_box), button, FALSE, TRUE, 0);
990 g_signal_connect (G_OBJECT (button), "toggled",
991 G_CALLBACK (mailwatch_help_auto_toggled_cb), mwp);
992 gtk_widget_show (button);
993
994 /* Don't focus the checkbutton. */
995 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
996 button = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
997 gtk_widget_grab_focus (button);
998
999 /* Show the dialog without locking the mainloop. */
1000 g_signal_connect (G_OBJECT (dialog), "response",
1001 G_CALLBACK (mailwatch_help_response_cb), mwp);
1002 gtk_window_present (GTK_WINDOW (dialog));
1003 }
1004
1005 static void
1006 mailwatch_dialog_response(GtkWidget *dlg,
1007 int response,
1008 XfceMailwatchPlugin *mwp)
1009 {
1010 gtk_widget_destroy(dlg);
1011 xfce_panel_plugin_unblock_menu(mwp->plugin);
1012 mailwatch_write_config(mwp->plugin, mwp);
1013 }
1014
1015 static void
1016 mailwatch_create_options(XfcePanelPlugin *plugin,
1017 XfceMailwatchPlugin *mwp)
1018 {
1019 GtkWidget *dlg, *topvbox, *frame, *frame_bin, *grid, *hbox, *lbl, *entry,
1020 *btn, *vbox, *img, *sbtn, *chk;
1021 GtkContainer *cfg_page;
1022 GtkSizeGroup *sg;
1023
1024 xfce_panel_plugin_block_menu(plugin);
1025
1026 dlg = xfce_titled_dialog_new_with_buttons(_("Mail Watcher"),
1027 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(plugin))),
1028 GTK_DIALOG_DESTROY_WITH_PARENT, NULL);
1029 #if LIBXFCE4UI_CHECK_VERSION (4, 15, 1)
1030 xfce_titled_dialog_create_action_area(XFCE_TITLED_DIALOG(dlg));
1031 #endif
1032 gtk_button_box_set_layout(GTK_BUTTON_BOX(exo_gtk_dialog_get_action_area(GTK_DIALOG(dlg))),
1033 GTK_BUTTONBOX_EDGE);
1034 g_signal_connect(G_OBJECT(dlg), "response",
1035 G_CALLBACK(mailwatch_dialog_response), mwp);
1036
1037 gtk_container_set_border_width(GTK_CONTAINER(dlg), 2);
1038 gtk_window_set_icon_name(GTK_WINDOW(dlg), "xfce4-settings");
1039
1040 btn = gtk_button_new_with_mnemonic(_("_Help"));
1041 gtk_box_pack_start(GTK_BOX(exo_gtk_dialog_get_action_area(GTK_DIALOG(dlg))),
1042 btn, FALSE, FALSE, 0);
1043
1044 g_signal_connect(G_OBJECT(btn), "clicked",
1045 G_CALLBACK(mailwatch_help_clicked_cb), mwp);
1046
1047 btn = gtk_button_new_with_mnemonic(_("_Close"));
1048 #if LIBXFCE4UI_CHECK_VERSION (4, 15, 1)
1049 xfce_titled_dialog_add_action_widget(XFCE_TITLED_DIALOG(dlg), btn, GTK_RESPONSE_ACCEPT);
1050 #else
1051 gtk_dialog_add_action_widget(GTK_DIALOG(dlg), btn, GTK_RESPONSE_ACCEPT);
1052 #endif
1053
1054 topvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER);
1055 gtk_container_set_border_width(GTK_CONTAINER(topvbox), BORDER - 2);
1056 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg))),
1057 topvbox, TRUE, TRUE, 0);
1058
1059 cfg_page = xfce_mailwatch_get_configuration_page(mwp->mailwatch);
1060 if(cfg_page)
1061 gtk_box_pack_start(GTK_BOX(topvbox), GTK_WIDGET(cfg_page), TRUE, TRUE, 0);
1062
1063 /* External programs. */
1064 frame = xfce_gtk_frame_box_new(_("External Programs"), &frame_bin);
1065 gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
1066
1067 grid = gtk_grid_new();
1068 gtk_grid_set_column_spacing(GTK_GRID(grid), BORDER/2);
1069 gtk_grid_set_row_spacing(GTK_GRID(grid), BORDER/2);
1070 gtk_container_add(GTK_CONTAINER(frame_bin), grid);
1071
1072 lbl = gtk_label_new_with_mnemonic(_("Run _on click:"));
1073 gtk_label_set_xalign(GTK_LABEL(lbl), 0.0);
1074 gtk_grid_attach(GTK_GRID(grid), lbl, 0, 0, 1, 1);
1075
1076 entry = gtk_entry_new();
1077 gtk_widget_set_hexpand(entry, TRUE);
1078 if(mwp->click_command)
1079 gtk_entry_set_text(GTK_ENTRY(entry), mwp->click_command);
1080 gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry);
1081 g_signal_connect(G_OBJECT(entry), "focus-out-event",
1082 G_CALLBACK(mailwatch_click_command_focusout_cb), mwp);
1083 gtk_grid_attach(GTK_GRID(grid), entry, 1, 0, 1, 1);
1084
1085 lbl = gtk_label_new_with_mnemonic(_("Run on first new _message:"));
1086 gtk_label_set_xalign(GTK_LABEL(lbl), 0.0);
1087 gtk_grid_attach(GTK_GRID(grid), lbl, 0, 1, 1, 1);
1088
1089 entry = gtk_entry_new();
1090 gtk_widget_set_hexpand(entry, TRUE);
1091 if(mwp->new_messages_command)
1092 gtk_entry_set_text(GTK_ENTRY(entry), mwp->new_messages_command);
1093 gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry);
1094 g_signal_connect(G_OBJECT(entry), "focus-out-event",
1095 G_CALLBACK(mailwatch_newmsg_command_focusout_cb), mwp);
1096 gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 1, 1);
1097
1098 lbl = gtk_label_new_with_mnemonic(_("Run on _each change of new message count:"));
1099 gtk_label_set_xalign(GTK_LABEL(lbl), 0.0);
1100 gtk_grid_attach(GTK_GRID(grid), lbl, 0, 2, 1, 1);
1101
1102 entry = gtk_entry_new();
1103 gtk_widget_set_hexpand(entry, TRUE);
1104 if(mwp->count_changed_command)
1105 gtk_entry_set_text(GTK_ENTRY(entry), mwp->count_changed_command);
1106 gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry);
1107 g_signal_connect(G_OBJECT(entry), "focus-out-event",
1108 G_CALLBACK(mailwatch_count_changed_command_focusout_cb), mwp);
1109 gtk_grid_attach(GTK_GRID(grid), entry, 1, 2, 1, 1);
1110
1111 /* Icons. */
1112 frame = xfce_gtk_frame_box_new(_("Icons"), &frame_bin);
1113 gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
1114
1115 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
1116
1117 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER/2);
1118 gtk_container_add(GTK_CONTAINER(frame_bin), hbox);
1119
1120 btn = gtk_button_new();
1121 g_object_set_data(G_OBJECT(btn), "mailwatch-icontype",
1122 GINT_TO_POINTER(ICON_TYPE_NORMAL));
1123 gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 0);
1124 g_signal_connect(G_OBJECT(btn), "clicked",
1125 G_CALLBACK(mailwatch_iconbtn_clicked_cb), mwp);
1126 gtk_size_group_add_widget(sg, btn);
1127
1128 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER/2);
1129 gtk_container_add(GTK_CONTAINER(btn), vbox);
1130
1131 img = gtk_image_new_from_pixbuf(mwp->pix_normal);
1132 gtk_box_pack_start(GTK_BOX(vbox), img, TRUE, TRUE, 0);
1133
1134 lbl = gtk_label_new_with_mnemonic(_("_Normal"));
1135 gtk_box_pack_start(GTK_BOX(vbox), lbl, FALSE, FALSE, 0);
1136
1137 btn = gtk_button_new();
1138 g_object_set_data(G_OBJECT(btn), "mailwatch-icontype",
1139 GINT_TO_POINTER(ICON_TYPE_NEW_MAIL));
1140 gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 0);
1141 g_signal_connect(G_OBJECT(btn), "clicked",
1142 G_CALLBACK(mailwatch_iconbtn_clicked_cb), mwp);
1143 gtk_size_group_add_widget(sg, btn);
1144
1145 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER/2);
1146 gtk_container_add(GTK_CONTAINER(btn), vbox);
1147
1148 img = gtk_image_new_from_pixbuf(mwp->pix_newmail);
1149 gtk_box_pack_start(GTK_BOX(vbox), img, TRUE, TRUE, 0);
1150
1151 lbl = gtk_label_new_with_mnemonic(_("Ne_w Mail"));
1152 gtk_box_pack_start(GTK_BOX(vbox), lbl, FALSE, FALSE, 0);
1153
1154 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER/2);
1155 gtk_box_pack_start(GTK_BOX(topvbox), hbox, FALSE, FALSE, 0);
1156
1157 /* Log */
1158 frame = xfce_gtk_frame_box_new(_("Log"), &frame_bin);
1159 gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
1160
1161 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER/2);
1162 gtk_container_add(GTK_CONTAINER(frame_bin), vbox);
1163
1164 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER/2);
1165 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1166
1167 lbl = gtk_label_new_with_mnemonic(_("Log _lines:"));
1168 gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, FALSE, 0);
1169
1170 sbtn = gtk_spin_button_new_with_range(0.0, G_MAXDOUBLE, 1.0);
1171 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(sbtn), 0);
1172 gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(sbtn), TRUE);
1173 gtk_spin_button_set_value(GTK_SPIN_BUTTON(sbtn), mwp->log_lines);
1174 gtk_box_pack_start(GTK_BOX(hbox), sbtn, FALSE, FALSE, 0);
1175 g_signal_connect(G_OBJECT(sbtn), "value-changed",
1176 G_CALLBACK(mailwatch_log_lines_changed_cb), mwp);
1177 gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbtn);
1178
1179 btn = gtk_button_new_with_mnemonic(_("_View Log..."));
1180 gtk_button_set_image(GTK_BUTTON(btn),
1181 gtk_image_new_from_icon_name("document-properties",
1182 GTK_ICON_SIZE_BUTTON));
1183 gtk_box_pack_end(GTK_BOX(hbox), btn, FALSE, FALSE, 0);
1184
1185 g_signal_connect(G_OBJECT(btn), "clicked",
1186 G_CALLBACK(mailwatch_view_log_clicked_cb), mwp);
1187
1188 chk = gtk_check_button_new_with_mnemonic(_("Show log _status in icon"));
1189 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), mwp->show_log_status);
1190 gtk_box_pack_start(GTK_BOX(vbox), chk, FALSE, FALSE, 0);
1191 g_signal_connect(G_OBJECT(chk), "toggled",
1192 G_CALLBACK(mailwatch_log_status_toggled_cb), mwp);
1193
1194 gtk_widget_show_all(dlg);
1195 }
1196
1197 static void
1198 mailwatch_free(XfcePanelPlugin *plugin,
1199 XfceMailwatchPlugin *mwp)
1200 {
1201 gint i;
1202
1203 #ifdef HAVE_XFCE_POSIX_SIGNAL_HANDLER_INIT
1204 xfce_posix_signal_handler_restore_handler(SIGUSR2);
1205 #endif
1206
1207 xfce_mailwatch_destroy(mwp->mailwatch);
1208
1209 g_free(mwp->normal_icon);
1210 g_free(mwp->new_mail_icon);
1211
1212 if(mwp->pix_normal)
1213 g_object_unref(G_OBJECT(mwp->pix_normal));
1214 if(mwp->pix_newmail)
1215 g_object_unref(G_OBJECT(mwp->pix_newmail));
1216
1217 for(i = 0; i < XFCE_MAILWATCH_N_LOG_LEVELS; i++) {
1218 if(mwp->pix_log[i])
1219 g_object_unref(G_OBJECT(mwp->pix_log[i]));
1220 }
1221
1222 g_object_unref(G_OBJECT(mwp->loglist));
1223
1224 g_free(mwp);
1225 }
1226
1227 static void
1228 mailwatch_update_now_clicked_cb(GtkMenuItem *mi,
1229 gpointer user_data)
1230 {
1231 XfceMailwatchPlugin *mwp = user_data;
1232 xfce_mailwatch_force_update(mwp->mailwatch);
1233 }
1234
1235 static void
1236 mailwatch_show_about(XfcePanelPlugin *plugin,
1237 gpointer user_data)
1238 {
1239 GdkPixbuf *icon;
1240
1241 const gchar *auth[] = { "Brian J. Tarricone bjt23@cornell.edu Maintainer, Original Author",
1242 "Pasi Orovuo pasi.ov@gmail.com Developer",
1243 NULL };
1244
1245 icon = xfce_panel_pixbuf_from_source("mail-send", NULL, 32);
1246
1247 gtk_show_about_dialog(NULL,
1248 "logo", icon,
1249 "program-name", _("Xfce4 Mailwatch Plugin"),
1250 "license", xfce_get_license_text (XFCE_LICENSE_TEXT_GPL),
1251 "version", VERSION,
1252 "comments", _("A featureful mail-checker applet for the Xfce Panel"),
1253 "website", WEBSITE,
1254 "copyright", _("Copyright (c) 2005-2008 Brian Tarricone\n"
1255 "Copyright (c) 2005 Pasi Orovuo"),
1256 "authors", auth,
1257 NULL);
1258
1259 if(icon)
1260 g_object_unref(G_OBJECT(icon));
1261 }
1262
1263 static void
1264 mailwatch_handle_sigusr2(gint signal_,
1265 gpointer user_data)
1266 {
1267 XfceMailwatchPlugin *mwp = user_data;
1268 xfce_mailwatch_force_update(mwp->mailwatch);
1269 }
1270
1271 static void
1272 mailwatch_construct(XfcePanelPlugin *plugin)
1273 {
1274 XfceMailwatchPlugin *mwp;
1275 GtkWidget *mi;
1276 struct sigaction sa = {
1277 .sa_handler = SIG_IGN,
1278 #ifdef SA_RESTART
1279 .sa_flags = SA_RESTART,
1280 #endif
1281 };
1282
1283 xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
1284
1285 if(!(mwp = mailwatch_create(plugin)))
1286 exit(1);
1287
1288 mailwatch_read_config(plugin, mwp);
1289
1290 if(xfce_posix_signal_handler_init(NULL)) {
1291 GError *error = NULL;
1292
1293 if(!xfce_posix_signal_handler_set_handler(SIGUSR2,
1294 mailwatch_handle_sigusr2,
1295 mwp, &error))
1296 {
1297 g_warning("Failed to set SIGUSR2 handler: %s", error->message);
1298 g_error_free(error);
1299 sigaction(SIGUSR2, &sa, NULL);
1300 }
1301 } else {
1302 g_warning("failed to init POSIX signal handler helper");
1303 sigaction(SIGUSR2, &sa, NULL);
1304 }
1305
1306 g_signal_connect(plugin, "free-data",
1307 G_CALLBACK(mailwatch_free), mwp);
1308
1309 g_signal_connect(plugin, "save",
1310 G_CALLBACK(mailwatch_write_config), mwp);
1311
1312 xfce_panel_plugin_menu_show_configure(plugin);
1313 g_signal_connect(plugin, "configure-plugin",
1314 G_CALLBACK(mailwatch_create_options), mwp);
1315
1316 xfce_panel_plugin_menu_show_about(plugin);
1317 g_signal_connect(plugin, "about",
1318 G_CALLBACK(mailwatch_show_about), mwp);
1319
1320 g_signal_connect(plugin, "size-changed",
1321 G_CALLBACK(mailwatch_set_size), mwp);
1322
1323 xfce_panel_plugin_set_small (plugin, TRUE);
1324
1325 mi = gtk_menu_item_new_with_label(_("Update Now"));
1326 gtk_widget_show(mi);
1327 g_signal_connect(G_OBJECT(mi), "activate",
1328 G_CALLBACK(mailwatch_update_now_clicked_cb), mwp);
1329 xfce_panel_plugin_menu_insert_item(plugin, GTK_MENU_ITEM(mi));
1330
1331 xfce_mailwatch_force_update(mwp->mailwatch);
1332 }
1333
1334 XFCE_PANEL_PLUGIN_REGISTER(mailwatch_construct);
1335