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, &ltm))
256         strftime(time_str, 256, "%x %T:", &ltm);
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