/* Notification plugin for Claws-Mail
* Copyright (C) 2005-2007 Holger Berndt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "pluginconfig.h"
#include
#include "prefs.h"
#include "prefs_gtk.h"
#include "common/utils.h"
#include "common/defs.h"
#include "gtk/gtkutils.h"
#include "main.h"
#include "gettext.h"
#include "notification_prefs.h"
#include "notification_plugin.h"
#include "notification_core.h"
#include "notification_popup.h"
#include "notification_command.h"
#include "notification_lcdproc.h"
#include "notification_trayicon.h"
#include "notification_foldercheck.h"
typedef struct {
PrefsPage page;
GtkWidget *include_mail;
GtkWidget *include_news;
GtkWidget *include_rss;
GtkWidget *include_calendar;
} NotifyPage;
NotifyPrefs notify_config;
NotifyPage notify_page;
#ifdef NOTIFICATION_BANNER
typedef struct {
PrefsPage page;
GtkWidget *banner_show;
GtkWidget *banner_speed;
GtkWidget *banner_include_unread;
GtkWidget *banner_max_msgs;
GtkWidget *banner_sticky;
GtkWidget *banner_folder_specific;
GtkWidget *banner_enable_colors;
GtkWidget *banner_color_bg;
GtkWidget *banner_color_fg;
GtkWidget *banner_cont_enable;
GtkWidget *banner_cont_folder_specific;
GtkWidget *banner_cont_color_sel;
} NotifyBannerPage;
NotifyBannerPage banner_page;
#endif /* NOTIFICATION_BANNER */
#ifdef NOTIFICATION_POPUP
typedef struct {
PrefsPage page;
GtkWidget *popup_show;
GtkWidget *popup_timeout;
GtkWidget *popup_folder_specific;
GtkWidget *popup_cont_enable;
GtkWidget *popup_cont_folder_specific;
#ifndef HAVE_LIBNOTIFY
GtkWidget *popup_sticky;
GtkWidget *popup_enable_colors;
GtkWidget *popup_color_bg;
GtkWidget *popup_color_fg;
GtkWidget *popup_cont_color_sel;
#endif /* !HAVE_LIBNOTIFY */
} NotifyPopupPage;
NotifyPopupPage popup_page;
#endif /* NOTIFICATION_POPUP */
#ifdef NOTIFICATION_COMMAND
typedef struct {
PrefsPage page;
GtkWidget *command_enabled;
GtkWidget *command_timeout;
GtkWidget *command_folder_specific;
GtkWidget *command_line;
GtkWidget *command_cont_enable;
GtkWidget *command_cont_folder_specific;
} NotifyCommandPage;
NotifyCommandPage command_page;
#endif /* NOTIFICATION_COMMAND */
#ifdef NOTIFICATION_LCDPROC
typedef struct {
PrefsPage page;
GtkWidget *lcdproc_enabled;
GtkWidget *lcdproc_cont_enable;
GtkWidget *lcdproc_hostname;
GtkWidget *lcdproc_port;
} NotifyLCDProcPage;
NotifyLCDProcPage lcdproc_page;
#endif
#ifdef NOTIFICATION_TRAYICON
typedef struct {
PrefsPage page;
GtkWidget *trayicon_enabled;
GtkWidget *trayicon_cont_enable;
GtkWidget *trayicon_hide_at_startup;
GtkWidget *trayicon_close_to_tray;
GtkWidget *trayicon_hide_when_iconified;
#ifdef HAVE_LIBNOTIFY
GtkWidget *trayicon_popup_enabled;
GtkWidget *trayicon_popup_cont_enable;
GtkWidget *trayicon_popup_timeout;
GtkWidget *trayicon_popup_folder_specific;
GtkWidget *trayicon_popup_cont_folder_specific;
#endif
} NotifyTrayiconPage;
NotifyTrayiconPage trayicon_page;
#endif
PrefParam notify_param[] = {
{"include_mail", "TRUE", ¬ify_config.include_mail, P_BOOL, NULL,
NULL, NULL},
{"include_news", "TRUE", ¬ify_config.include_news, P_BOOL, NULL,
NULL, NULL},
{"include_rss", "TRUE", ¬ify_config.include_rss, P_BOOL, NULL,
NULL, NULL},
{"include_calendar", "TRUE", ¬ify_config.include_calendar, P_BOOL, NULL,
NULL, NULL},
#ifdef NOTIFICATION_BANNER
{"banner_show", "0", ¬ify_config.banner_show, P_INT, NULL, NULL, NULL},
{"banner_speed", "30", ¬ify_config.banner_speed, P_INT, NULL, NULL, NULL},
{"banner_include_unread", "FALSE", ¬ify_config.banner_include_unread,
P_BOOL, NULL, NULL, NULL},
{"banner_max_msgs", "100", ¬ify_config.banner_max_msgs, P_INT,
NULL, NULL, NULL},
{"banner_sticky", "FALSE", ¬ify_config.banner_sticky,
P_BOOL, NULL, NULL, NULL},
{"banner_root_x", "0", ¬ify_config.banner_root_x, P_INT,
NULL, NULL, NULL},
{"banner_root_y", "10", ¬ify_config.banner_root_y, P_INT,
NULL, NULL, NULL},
{"banner_folder_specific", "FALSE", ¬ify_config.banner_folder_specific,
P_BOOL, NULL, NULL, NULL},
{"banner_enable_colors", "FALSE", ¬ify_config.banner_enable_colors,
P_BOOL, NULL, NULL, NULL},
{"banner_color_bg", "0", ¬ify_config.banner_color_bg, P_COLOR,
NULL, NULL, NULL},
{"banner_color_fg", "16776704", ¬ify_config.banner_color_fg, P_COLOR,
NULL, NULL, NULL},
#endif
#ifdef NOTIFICATION_POPUP
{"popup_show", "TRUE", ¬ify_config.popup_show, P_BOOL, NULL, NULL, NULL},
{"popup_timeout", "5000", ¬ify_config.popup_timeout,
P_INT, NULL, NULL, NULL},
{"popup_folder_specific", "FALSE", ¬ify_config.popup_folder_specific,
P_BOOL, NULL, NULL, NULL},
#ifndef HAVE_LIBNOTIFY
{"popup_sticky", "TRUE", ¬ify_config.popup_sticky, P_BOOL,
NULL, NULL, NULL},
{"popup_root_x", "10", ¬ify_config.popup_root_x,
P_INT, NULL, NULL, NULL},
{"popup_root_y", "10", ¬ify_config.popup_root_y,
P_INT, NULL, NULL, NULL},
{"popup_width", "100", ¬ify_config.popup_width,
P_INT, NULL, NULL, NULL},
{"popup_enable_colors", "FALSE", ¬ify_config.popup_enable_colors, P_BOOL,
NULL, NULL, NULL},
{"popup_color_bg", "0", ¬ify_config.popup_color_bg, P_COLOR,
NULL, NULL, NULL},
{"popup_color_fg", "16776704", ¬ify_config.popup_color_fg, P_COLOR,
NULL, NULL, NULL},
#endif /* !HAVE_LIBNOTIFY */
#endif
#ifdef NOTIFICATION_COMMAND
{"command_enabled", "FALSE", ¬ify_config.command_enabled, P_BOOL,
NULL, NULL, NULL},
{"command_timeout", "60000", ¬ify_config.command_timeout, P_INT,
NULL, NULL, NULL},
{"command_folder_specific", "FALSE", ¬ify_config.command_folder_specific,
P_BOOL, NULL, NULL, NULL},
{"command_line", "", ¬ify_config.command_line, P_STRING,
NULL, NULL, NULL},
#endif
#ifdef NOTIFICATION_LCDPROC
{"lcdproc_enabled", "FALSE", ¬ify_config.lcdproc_enabled, P_BOOL,
NULL, NULL, NULL},
{"lcdproc_hostname", "localhost", ¬ify_config.lcdproc_hostname, P_STRING,
NULL, NULL, NULL},
{"lcdproc_port", "13666", ¬ify_config.lcdproc_port, P_INT,
NULL, NULL, NULL},
#endif
#ifdef NOTIFICATION_TRAYICON
{"trayicon_enabled", "FALSE", ¬ify_config.trayicon_enabled, P_BOOL,
NULL, NULL, NULL},
{"trayicon_hide_at_startup", "FALSE",
¬ify_config.trayicon_hide_at_startup, P_BOOL, NULL, NULL, NULL},
{"trayicon_close_to_tray", "FALSE",
¬ify_config.trayicon_close_to_tray, P_BOOL, NULL, NULL, NULL},
{"trayicon_hide_when_iconified", "FALSE",
¬ify_config.trayicon_hide_when_iconified, P_BOOL, NULL, NULL, NULL},
#ifdef HAVE_LIBNOTIFY
{"trayicon_popup_enabled", "TRUE", ¬ify_config.trayicon_popup_enabled,
P_BOOL, NULL, NULL, NULL},
{"trayicon_popup_timeout", "5000", ¬ify_config.trayicon_popup_timeout,
P_INT, NULL, NULL, NULL},
{"trayicon_popup_folder_specific", "FALSE",
¬ify_config.trayicon_popup_folder_specific,
P_BOOL, NULL, NULL, NULL},
#endif /* HAVE_LIBNOTIFY */
#endif
{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
};
static void notify_create_prefs_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_prefs_page(PrefsPage*);
static void notify_save_prefs(PrefsPage*);
#ifdef NOTIFICATION_BANNER
static void notify_create_banner_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_banner_page(PrefsPage*);
static void notify_save_banner(PrefsPage*);
static void notify_banner_enable_set_sensitivity(GtkComboBox*, gpointer);
static void notify_banner_color_sel_set_sensitivity(GtkToggleButton*,gpointer);
static void notify_banner_folder_specific_set_sensitivity(GtkToggleButton*,
gpointer);
#endif
#ifdef NOTIFICATION_POPUP
static void notify_create_popup_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_popup_page(PrefsPage*);
static void notify_save_popup(PrefsPage*);
static void notify_popup_folder_specific_set_sensitivity(GtkToggleButton*,
gpointer);
static void notify_popup_enable_set_sensitivity(GtkToggleButton*, gpointer);
#ifndef HAVE_LIBNOTIFY
static void notify_popup_set_done_cb(GtkWidget*, gpointer);
static void notify_popup_set_cb(GtkWidget*, gpointer);
static void notify_popup_color_sel_set_sensitivity(GtkToggleButton*,gpointer);
#endif /* !HAVE_LIBNOTIFY */
#endif
#ifdef NOTIFICATION_COMMAND
static void notify_create_command_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_command_page(PrefsPage*);
static void notify_save_command(PrefsPage*);
static void notify_command_enable_set_sensitivity(GtkToggleButton*, gpointer);
static void notify_command_folder_specific_set_sensitivity(GtkToggleButton*,
gpointer);
#endif
#ifdef NOTIFICATION_LCDPROC
static void notify_create_lcdproc_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_lcdproc_page(PrefsPage*);
static void notify_save_lcdproc(PrefsPage*);
static void notify_lcdproc_enable_set_sensitivity(GtkToggleButton*, gpointer);
#endif
#ifdef NOTIFICATION_TRAYICON
static void notify_create_trayicon_page(PrefsPage*, GtkWindow*, gpointer);
static void notify_destroy_trayicon_page(PrefsPage*);
static void notify_save_trayicon(PrefsPage*);
static void notify_trayicon_enable_set_sensitivity(GtkToggleButton*, gpointer);
#ifdef HAVE_LIBNOTIFY
static void notify_trayicon_popup_enable_set_sensitivity(GtkToggleButton*,
gpointer);
static void notify_trayicon_popup_folder_specific_set_sensitivity(GtkToggleButton*,
gpointer);
#endif
#endif
static gint conv_color_to_int(GdkColor*);
void notify_gtk_init(void)
{
static gchar *path[3];
path[0] = _("Plugins");
path[1] = _("Notification");
path[2] = NULL;
notify_page.page.path = path;
notify_page.page.create_widget = notify_create_prefs_page;
notify_page.page.destroy_widget = notify_destroy_prefs_page;
notify_page.page.save_page = notify_save_prefs;
prefs_gtk_register_page((PrefsPage*) ¬ify_page);
#ifdef NOTIFICATION_BANNER
{
static gchar *banner_path[4];
banner_path[0] = _("Plugins");
banner_path[1] = _("Notification");
banner_path[2] = _("Banner");
banner_path[3] = NULL;
banner_page.page.path = banner_path;
banner_page.page.create_widget = notify_create_banner_page;
banner_page.page.destroy_widget = notify_destroy_banner_page;
banner_page.page.save_page = notify_save_banner;
prefs_gtk_register_page((PrefsPage*) &banner_page);
}
#endif /* NOTIFICATION_BANNER */
#ifdef NOTIFICATION_POPUP
{
static gchar *popup_path[4];
popup_path[0] = _("Plugins");
popup_path[1] = _("Notification");
popup_path[2] = _("Popup");
popup_path[3] = NULL;
popup_page.page.path = popup_path;
popup_page.page.create_widget = notify_create_popup_page;
popup_page.page.destroy_widget = notify_destroy_popup_page;
popup_page.page.save_page = notify_save_popup;
prefs_gtk_register_page((PrefsPage*) &popup_page);
}
#endif /* NOTIFICATION_POPUP */
#ifdef NOTIFICATION_COMMAND
{
static gchar *command_path[4];
command_path[0] = _("Plugins");
command_path[1] = _("Notification");
command_path[2] = _("Command");
command_path[3] = NULL;
command_page.page.path = command_path;
command_page.page.create_widget = notify_create_command_page;
command_page.page.destroy_widget = notify_destroy_command_page;
command_page.page.save_page = notify_save_command;
prefs_gtk_register_page((PrefsPage*) &command_page);
}
#endif /* NOTIFICATION_COMMAND */
#ifdef NOTIFICATION_LCDPROC
{
static gchar *lcdproc_path[4];
lcdproc_path[0] = _("Plugins");
lcdproc_path[1] = _("Notification");
lcdproc_path[2] = _("LCD");
lcdproc_path[3] = NULL;
lcdproc_page.page.path = lcdproc_path;
lcdproc_page.page.create_widget = notify_create_lcdproc_page;
lcdproc_page.page.destroy_widget = notify_destroy_lcdproc_page;
lcdproc_page.page.save_page = notify_save_lcdproc;
prefs_gtk_register_page((PrefsPage*) &lcdproc_page);
}
#endif /* NOTIFICATION_LCDPROC */
#ifdef NOTIFICATION_TRAYICON
{
static gchar *trayicon_path[4];
trayicon_path[0] = _("Plugins");
trayicon_path[1] = _("Notification");
trayicon_path[2] = _("SysTrayicon");
trayicon_path[3] = NULL;
trayicon_page.page.path = trayicon_path;
trayicon_page.page.create_widget = notify_create_trayicon_page;
trayicon_page.page.destroy_widget = notify_destroy_trayicon_page;
trayicon_page.page.save_page = notify_save_trayicon;
prefs_gtk_register_page((PrefsPage*) &trayicon_page);
}
#endif /* NOTIFICATION_TRAYICON */
}
void notify_gtk_done(void)
{
if(claws_is_exiting())
return;
prefs_gtk_unregister_page((PrefsPage*) ¬ify_page);
#ifdef NOTIFICATION_BANNER
prefs_gtk_unregister_page((PrefsPage*) &banner_page);
#endif
#ifdef NOTIFICATION_POPUP
prefs_gtk_unregister_page((PrefsPage*) &popup_page);
#endif
#ifdef NOTIFICATION_COMMAND
prefs_gtk_unregister_page((PrefsPage*) &command_page);
#endif
#ifdef NOTIFICATION_LCDPROC
prefs_gtk_unregister_page((PrefsPage*) &lcdproc_page);
#endif
#ifdef NOTIFICATION_TRAYICON
prefs_gtk_unregister_page((PrefsPage*) &trayicon_page);
#endif
}
void notify_save_config(void)
{
PrefFile *pfile;
gchar *rcpath;
debug_print("Saving Notification plugin configuration...\n");
rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
pfile = prefs_write_open(rcpath);
g_free(rcpath);
if(!pfile || (prefs_set_block_label(pfile, "NotificationPlugin") < 0))
return;
if(prefs_write_param(notify_param, pfile->fp) < 0) {
debug_print("failed!\n");
g_warning(_("\nNotification Plugin: Failed to write plugin configuration "
"to file\n"));
prefs_file_close_revert(pfile);
return;
}
fprintf(pfile->fp, "\n");
prefs_file_close(pfile);
debug_print("done.\n");
}
static void notify_create_prefs_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *checkbox;
GtkWidget *frame;
GtkWidget *label;
/* Page vbox */
pvbox = gtk_vbox_new(FALSE, 0);
/* Frame */
frame = gtk_frame_new(_("Include folder types"));
gtk_container_set_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(pvbox), frame, FALSE, FALSE, 0);
/* Frame vbox */
vbox = gtk_vbox_new(FALSE, 4);
gtk_container_add(GTK_CONTAINER(frame), vbox);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
/* Include mail folders */
checkbox = gtk_check_button_new_with_label(_("Mail folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.include_mail);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
notify_page.include_mail = checkbox;
/* Include news folders */
checkbox = gtk_check_button_new_with_label(_("News folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.include_news);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
notify_page.include_news = checkbox;
/* Include RSS folders */
checkbox = gtk_check_button_new_with_label(_("RSS folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.include_rss);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
notify_page.include_rss = checkbox;
/* Include calendar folders */
checkbox = gtk_check_button_new_with_label(_("Calendar folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.include_calendar);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
notify_page.include_calendar = checkbox;
/* Warning-Label */
label = gtk_label_new(_("These settings overwrite folder-specific "
"selections."));
gtk_misc_set_alignment(GTK_MISC(label),0,0.5);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
/* Done. */
gtk_widget_show(frame);
gtk_widget_show(vbox);
gtk_widget_show(pvbox);
page->widget = pvbox;
}
static void notify_destroy_prefs_page(PrefsPage *page)
{
}
static void notify_save_prefs(PrefsPage *page)
{
notify_config.include_mail =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(notify_page.include_mail));
notify_config.include_news =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(notify_page.include_news));
notify_config.include_rss =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(notify_page.include_rss));
notify_config.include_calendar =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(notify_page.include_calendar));
}
#ifdef NOTIFICATION_BANNER
static void notify_create_banner_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
GtkRequisition requisition;
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *table;
GtkWidget *checkbox;
GtkWidget *button;
GtkWidget *combo;
GtkWidget *spinner;
GtkWidget *label;
GtkWidget *slider;
GtkWidget *color_sel;
GdkColor bg;
GdkColor fg;
pvbox = gtk_vbox_new(FALSE, 20);
gtk_container_set_border_width(GTK_CONTAINER(pvbox), 10);
/* Always / Never / Only when non-empty */
hbox = gtk_hbox_new(FALSE, 20);
gtk_box_pack_start(GTK_BOX(pvbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new(_("Show banner"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
combo = gtk_combo_box_new_text();
gtk_combo_box_insert_text(GTK_COMBO_BOX(combo), NOTIFY_BANNER_SHOW_NEVER,
_("Never"));
gtk_combo_box_insert_text(GTK_COMBO_BOX(combo), NOTIFY_BANNER_SHOW_ALWAYS,
_("Always"));
gtk_combo_box_insert_text(GTK_COMBO_BOX(combo), NOTIFY_BANNER_SHOW_NONEMPTY,
_("Only when not empty"));
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), notify_config.banner_show);
gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(combo), "changed",
G_CALLBACK(notify_banner_enable_set_sensitivity), NULL);
gtk_widget_show(combo);
gtk_widget_show(hbox);
banner_page.banner_show = combo;
/* Container vbox for greying out everything */
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(pvbox), vbox, FALSE, FALSE, 0);
gtk_widget_show(vbox);
banner_page.banner_cont_enable = vbox;
/* Banner speed */
table = gtk_table_new(2, 3, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
label = gtk_label_new(_("slow"));
gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
gtk_widget_show(label);
label = gtk_label_new(_("fast"));
gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 0, 1);
gtk_misc_set_alignment(GTK_MISC(label), 1, 0);
gtk_widget_show(label);
label = gtk_label_new(_("Banner speed"));
gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
gtk_widget_show(label);
slider = gtk_hscale_new_with_range(10., 70., 10.);
gtk_scale_set_digits(GTK_SCALE(slider), 0);
gtk_widget_size_request(combo, &requisition);
gtk_widget_set_size_request(slider, requisition.width, -1);
gtk_range_set_increments(GTK_RANGE(slider), 10., 10.);
gtk_range_set_inverted(GTK_RANGE(slider), TRUE);
gtk_scale_set_draw_value(GTK_SCALE(slider), FALSE);
gtk_range_set_value(GTK_RANGE(slider), notify_config.banner_speed);
gtk_table_attach_defaults(GTK_TABLE(table), slider, 1, 3, 1, 2);
gtk_widget_show(slider);
gtk_widget_show(table);
banner_page.banner_speed = slider;
/* Maximum number of messages in banner */
hbox = gtk_hbox_new(FALSE, 10);
label = gtk_label_new(_("Maximum number of messages (0 means unlimited)"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
spinner = gtk_spin_button_new_with_range(0., 1000., 1.);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner), 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner), notify_config.banner_max_msgs);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(spinner);
gtk_widget_show(hbox);
banner_page.banner_max_msgs = spinner;
/* Include unread */
checkbox = gtk_check_button_new_with_label(_("Include unread mails in banner"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.banner_include_unread);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
banner_page.banner_include_unread = checkbox;
/* Check button sticky */
checkbox = gtk_check_button_new_with_label(_("Make banner sticky"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.banner_sticky);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
banner_page.banner_sticky = checkbox;
/* Check box for enabling folder specific selection */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
checkbox = gtk_check_button_new_with_label(_("Only include selected folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.banner_folder_specific);
gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_banner_folder_specific_set_sensitivity),
NULL);
gtk_widget_show(checkbox);
banner_page.banner_folder_specific = checkbox;
button = gtk_button_new_with_label(_("Select folders..."));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notification_foldercheck_sel_folders_cb),
BANNER_SPECIFIC_FOLDER_ID_STR);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
banner_page.banner_cont_folder_specific = button;
gtk_widget_show(button);
gtk_widget_show(hbox);
/* Check box for enabling custom colors */
checkbox = gtk_check_button_new_with_label(_("Use custom colors"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.banner_enable_colors);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_banner_color_sel_set_sensitivity), NULL);
gtk_widget_show(checkbox);
banner_page.banner_enable_colors = checkbox;
/* Color selection dialogs for foreground and background color */
/* foreground */
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
label = gtk_label_new(_("Foreground"));
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
gtk_widget_show(label);
color_sel = gtk_color_button_new();
gtkut_convert_int_to_gdk_color(notify_config.banner_color_fg,&fg);
gtk_color_button_set_color(GTK_COLOR_BUTTON(color_sel),&fg);
gtk_color_button_set_title(GTK_COLOR_BUTTON(color_sel),_("Foreground color"));
gtk_table_attach_defaults(GTK_TABLE(table),color_sel,1,2,0,1);
gtk_widget_show(color_sel);
banner_page.banner_color_fg = color_sel;
/* background */
label = gtk_label_new(_("Background"));
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
gtk_widget_show(label);
color_sel = gtk_color_button_new();
gtkut_convert_int_to_gdk_color(notify_config.banner_color_bg,&bg);
gtk_color_button_set_color(GTK_COLOR_BUTTON(color_sel),&bg);
gtk_color_button_set_title(GTK_COLOR_BUTTON(color_sel), _("Background color"));
gtk_table_attach_defaults(GTK_TABLE(table),color_sel,1,2,1,2);
gtk_widget_show(color_sel);
gtk_widget_show(table);
banner_page.banner_color_bg = color_sel;
banner_page.banner_cont_color_sel = table;
notify_banner_color_sel_set_sensitivity
(GTK_TOGGLE_BUTTON(banner_page.banner_enable_colors), NULL);
notify_banner_folder_specific_set_sensitivity
(GTK_TOGGLE_BUTTON(banner_page.banner_folder_specific), NULL);
notify_banner_enable_set_sensitivity(GTK_COMBO_BOX(combo), NULL);
gtk_widget_show(pvbox);
banner_page.page.widget = pvbox;
}
static void notify_destroy_banner_page(PrefsPage *page)
{
}
static void notify_save_banner(PrefsPage *page)
{
gdouble range_val;
GdkColor color;
notify_config.banner_show =
gtk_combo_box_get_active(GTK_COMBO_BOX(banner_page.banner_show));
notify_config.banner_max_msgs =
gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(banner_page.banner_max_msgs));
notify_config.banner_include_unread =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_include_unread));
range_val= gtk_range_get_value(GTK_RANGE(banner_page.banner_speed));
notify_config.banner_speed = (gint)ceil(range_val);
notify_config.banner_sticky =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_sticky));
notify_config.banner_folder_specific =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_folder_specific));
notify_config.banner_enable_colors =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_enable_colors));
/* Color dialogs are a bit more complicated */
gtk_color_button_get_color(GTK_COLOR_BUTTON(banner_page.banner_color_fg),
&color);
notify_config.banner_color_fg = conv_color_to_int(&color);
gtk_color_button_get_color(GTK_COLOR_BUTTON(banner_page.banner_color_bg),
&color);
notify_config.banner_color_bg = conv_color_to_int(&color);
notification_update_banner();
}
static void notify_banner_enable_set_sensitivity(GtkComboBox *combo,
gpointer data)
{
NotifyBannerShow show;
show = gtk_combo_box_get_active(GTK_COMBO_BOX(banner_page.banner_show));
gtk_widget_set_sensitive(banner_page.banner_cont_enable,
(show == NOTIFY_BANNER_SHOW_NEVER) ? FALSE : TRUE);
}
static void notify_banner_color_sel_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_enable_colors));
gtk_widget_set_sensitive(banner_page.banner_cont_color_sel, active);
}
static void notify_banner_folder_specific_set_sensitivity(GtkToggleButton *bu,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(banner_page.banner_folder_specific));
gtk_widget_set_sensitive(banner_page.banner_cont_folder_specific, active);
}
#endif /* NOTIFICATION_BANNER */
#ifdef NOTIFICATION_POPUP
static void notify_create_popup_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
gdouble timeout;
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *checkbox;
GtkWidget *hbox;
GtkWidget *spinner;
GtkWidget *label;
GtkWidget *button;
#ifndef HAVE_LIBNOTIFY
GdkColor bg;
GdkColor fg;
GtkWidget *table;
GtkWidget *color_sel;
#endif /* !HAVE_LIBNOTIFY */
pvbox = gtk_vbox_new(FALSE, 20);
gtk_container_set_border_width(GTK_CONTAINER(pvbox), 10);
/* Enable popup */
checkbox = gtk_check_button_new_with_label(_("Enable popup"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.popup_show);
gtk_box_pack_start(GTK_BOX(pvbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_popup_enable_set_sensitivity), NULL);
gtk_widget_show(checkbox);
popup_page.popup_show = checkbox;
/* Container vbox for greying out everything */
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(pvbox), vbox, FALSE, FALSE, 0);
gtk_widget_show(vbox);
popup_page.popup_cont_enable = vbox;
/* Popup timeout */
hbox = gtk_hbox_new(FALSE, 10);
label = gtk_label_new(_("Popup timeout:"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
spinner = gtk_spin_button_new_with_range(0.2, 60., 0.5);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner), 1);
timeout = notify_config.popup_timeout/1000.;
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner), timeout);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(spinner);
label = gtk_label_new(_("seconds"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
popup_page.popup_timeout = spinner;
/* Check box for enabling folder specific selection */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
checkbox = gtk_check_button_new_with_label(_("Only include selected folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.popup_folder_specific);
gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_popup_folder_specific_set_sensitivity),
NULL);
gtk_widget_show(checkbox);
popup_page.popup_folder_specific = checkbox;
button = gtk_button_new_with_label(_("Select folders..."));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notification_foldercheck_sel_folders_cb),
POPUP_SPECIFIC_FOLDER_ID_STR);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
popup_page.popup_cont_folder_specific = button;
gtk_widget_show(button);
gtk_widget_show(hbox);
#ifndef HAVE_LIBNOTIFY
/* Sticky check button */
checkbox = gtk_check_button_new_with_label(_("Make popup sticky"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.popup_sticky);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
popup_page.popup_sticky = checkbox;
/* Button to set size and position of popup window */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
button = gtk_button_new_with_label(_("Set popup window width and position"));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notify_popup_set_cb), NULL);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
label = gtk_label_new(_("(the window manager is free to ignore this)"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
/* Check box for enabling custom colors */
checkbox = gtk_check_button_new_with_label(_("Use custom colors"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.popup_enable_colors);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_popup_color_sel_set_sensitivity), NULL);
gtk_widget_show(checkbox);
popup_page.popup_enable_colors = checkbox;
/* Color selection dialogs for foreground and background color */
table = gtk_table_new(2,2,FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
/* foreground */
label = gtk_label_new(_("Foreground"));
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
gtk_widget_show(label);
color_sel = gtk_color_button_new();
gtkut_convert_int_to_gdk_color(notify_config.popup_color_fg,&fg);
gtk_color_button_set_color(GTK_COLOR_BUTTON(color_sel),&fg);
gtk_color_button_set_title(GTK_COLOR_BUTTON(color_sel),_("Foreground color"));
gtk_table_attach_defaults(GTK_TABLE(table),color_sel,1,2,0,1);
gtk_widget_show(color_sel);
popup_page.popup_color_fg = color_sel;
/* background */
label = gtk_label_new(_("Background"));
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
gtk_widget_show(label);
color_sel = gtk_color_button_new();
gtkut_convert_int_to_gdk_color(notify_config.popup_color_bg,&bg);
gtk_color_button_set_color(GTK_COLOR_BUTTON(color_sel),&bg);
gtk_color_button_set_title(GTK_COLOR_BUTTON(color_sel),_("Background color"));
gtk_table_attach_defaults(GTK_TABLE(table),color_sel,1,2,1,2);
gtk_widget_show(color_sel);
gtk_widget_show(table);
popup_page.popup_color_bg = color_sel;
popup_page.popup_cont_color_sel = table;
notify_popup_color_sel_set_sensitivity
(GTK_TOGGLE_BUTTON(popup_page.popup_enable_colors), NULL);
#endif /* !HAVE_LIBNOTIFY */
notify_popup_enable_set_sensitivity
(GTK_TOGGLE_BUTTON(popup_page.popup_show), NULL);
notify_popup_folder_specific_set_sensitivity
(GTK_TOGGLE_BUTTON(popup_page.popup_folder_specific), NULL);
gtk_widget_show(pvbox);
popup_page.page.widget = pvbox;
}
static void notify_destroy_popup_page(PrefsPage *page)
{
}
static void notify_save_popup(PrefsPage *page)
{
gdouble timeout;
#ifndef HAVE_LIBNOTIFY
GdkColor color;
#endif /* !HAVE_LIBNOTIFY */
notify_config.popup_show =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(popup_page.popup_show));
timeout =
gtk_spin_button_get_value(GTK_SPIN_BUTTON(popup_page.popup_timeout));
notify_config.popup_timeout = (gint)floor(timeout*1000+0.5);
notify_config.popup_folder_specific =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(popup_page.popup_folder_specific));
#ifndef HAVE_LIBNOTIFY
notify_config.popup_sticky =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(popup_page.popup_sticky));
notify_config.popup_enable_colors =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(popup_page.popup_enable_colors));
/* Color dialogs are a bit more complicated */
gtk_color_button_get_color(GTK_COLOR_BUTTON(popup_page.popup_color_fg),
&color);
notify_config.popup_color_fg = conv_color_to_int(&color);
gtk_color_button_get_color(GTK_COLOR_BUTTON(popup_page.popup_color_bg),
&color);
notify_config.popup_color_bg = conv_color_to_int(&color);
#endif /* !HAVE_LIBNOTIFY */
}
#ifndef HAVE_LIBNOTIFY
static void notify_popup_set_cb(GtkWidget *widget, gpointer data)
{
GtkWidget *win;
GtkWidget *button;
win = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "notification_prefs");
gtk_window_set_title(GTK_WINDOW(win), _("Sample popup window"));
gtk_window_set_modal(GTK_WINDOW(win), TRUE);
gtk_window_set_keep_above(GTK_WINDOW(win), TRUE);
gtk_window_set_resizable(GTK_WINDOW(win), TRUE);
gtk_container_set_border_width(GTK_CONTAINER(win), 5);
button = gtk_button_new_with_label(_("Done"));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notify_popup_set_done_cb), win);
gtk_container_add(GTK_CONTAINER(win), button);
gtk_widget_show_all(win);
}
static void notify_popup_set_done_cb(GtkWidget *widget, gpointer data)
{
GtkWidget *win = data;
gint dummy;
gtk_window_get_position(GTK_WINDOW(win),
&(notify_config.popup_root_x),
&(notify_config.popup_root_y));
gtk_window_get_size(GTK_WINDOW(win),
&(notify_config.popup_width), &dummy);
gtk_widget_destroy(win);
}
static void notify_popup_color_sel_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(popup_page.popup_enable_colors));
gtk_widget_set_sensitive(popup_page.popup_cont_color_sel, active);
}
#endif /* !HAVE_LIBNOTIFY */
static void notify_popup_enable_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(popup_page.popup_show));
gtk_widget_set_sensitive(popup_page.popup_cont_enable, active);
}
static void notify_popup_folder_specific_set_sensitivity(GtkToggleButton *bu,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(popup_page.popup_folder_specific));
gtk_widget_set_sensitive(popup_page.popup_cont_folder_specific, active);
}
#endif /* NOTIFICATION_POPUP */
#ifdef NOTIFICATION_COMMAND
static void notify_create_command_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *checkbox;
GtkWidget *hbox;
GtkWidget *spinner;
GtkWidget *entry;
GtkWidget *label;
GtkWidget *button;
gdouble timeout;
pvbox = gtk_vbox_new(FALSE, 20);
gtk_container_set_border_width(GTK_CONTAINER(pvbox), 10);
/* Enable command */
checkbox = gtk_check_button_new_with_label(_("Enable command"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.command_enabled);
gtk_box_pack_start(GTK_BOX(pvbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_command_enable_set_sensitivity), NULL);
gtk_widget_show(checkbox);
command_page.command_enabled = checkbox;
/* Container vbox for greying out everything */
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(pvbox), vbox, FALSE, FALSE, 0);
gtk_widget_show(vbox);
command_page.command_cont_enable = vbox;
/* entry field for command to execute */
hbox = gtk_hbox_new(FALSE, 10);
label = gtk_label_new(_("Command to execute:"));
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry), notify_config.command_line);
gtk_widget_show(entry);
gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
command_page.command_line = entry;
/* Spin button for command timeout */
hbox = gtk_hbox_new(FALSE, 10);
label = gtk_label_new(_("Block command after execution for"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
spinner = gtk_spin_button_new_with_range(0., 600., 1.);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner), 0);
timeout = notify_config.command_timeout/1000.;
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner), timeout);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(spinner);
label = gtk_label_new(_("seconds"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
command_page.command_timeout = spinner;
/* Check box for enabling folder specific selection */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
checkbox = gtk_check_button_new_with_label(_("Only include selected folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.command_folder_specific);
gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_command_folder_specific_set_sensitivity),
NULL);
gtk_widget_show(checkbox);
command_page.command_folder_specific = checkbox;
button = gtk_button_new_with_label(_("Select folders..."));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notification_foldercheck_sel_folders_cb),
COMMAND_SPECIFIC_FOLDER_ID_STR);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
command_page.command_cont_folder_specific = button;
gtk_widget_show(button);
gtk_widget_show(hbox);
notify_command_enable_set_sensitivity
(GTK_TOGGLE_BUTTON(command_page.command_enabled), NULL);
notify_command_folder_specific_set_sensitivity
(GTK_TOGGLE_BUTTON(command_page.command_folder_specific), NULL);
gtk_widget_show(pvbox);
command_page.page.widget = pvbox;
}
static void notify_destroy_command_page(PrefsPage *page)
{
}
static void notify_save_command(PrefsPage *page)
{
gdouble timeout;
const gchar *tmp_str;
notify_config.command_enabled =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(command_page.command_enabled));
timeout =
gtk_spin_button_get_value(GTK_SPIN_BUTTON(command_page.command_timeout));
notify_config.command_timeout = (gint)floor(timeout*1000+0.5);
notify_config.command_folder_specific =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(command_page.command_folder_specific));
tmp_str = gtk_entry_get_text(GTK_ENTRY(command_page.command_line));
if(notify_config.command_line)
g_free(notify_config.command_line);
notify_config.command_line = g_strdup(tmp_str);
}
static void notify_command_enable_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(command_page.command_enabled));
gtk_widget_set_sensitive(command_page.command_cont_enable, active);
}
static void notify_command_folder_specific_set_sensitivity(GtkToggleButton *bu,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(command_page.command_folder_specific));
gtk_widget_set_sensitive(command_page.command_cont_folder_specific, active);
}
#endif /* NOTIFICATION_COMMAND */
#ifdef NOTIFICATION_LCDPROC
static void notify_create_lcdproc_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *spinner;
GtkWidget *checkbox;
GtkWidget *hbox;
pvbox = gtk_vbox_new(FALSE, 20);
gtk_container_set_border_width(GTK_CONTAINER(pvbox), 10);
/* Enable lcdproc */
checkbox = gtk_check_button_new_with_label(_("Enable LCD"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.lcdproc_enabled);
gtk_box_pack_start(GTK_BOX(pvbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_lcdproc_enable_set_sensitivity), NULL);
gtk_widget_show(checkbox);
lcdproc_page.lcdproc_enabled = checkbox;
/* Container vbox for greying out everything */
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(pvbox), vbox, FALSE, FALSE, 0);
gtk_widget_show(vbox);
lcdproc_page.lcdproc_cont_enable = vbox;
/* Hostname and port information */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
label = gtk_label_new(_("Hostname:Port of LCDd server:"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry), notify_config.lcdproc_hostname);
gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
gtk_widget_show(entry);
gtk_widget_show(label);
label = gtk_label_new(":");
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
spinner = gtk_spin_button_new_with_range(1., 65535., 1.);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner), 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner),
notify_config.lcdproc_port);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_widget_show(spinner);
lcdproc_page.lcdproc_hostname = entry;
lcdproc_page.lcdproc_port = spinner;
notify_lcdproc_enable_set_sensitivity
(GTK_TOGGLE_BUTTON(lcdproc_page.lcdproc_enabled), NULL);
gtk_widget_show(pvbox);
lcdproc_page.page.widget = pvbox;
}
static void notify_destroy_lcdproc_page(PrefsPage *page)
{
}
static void notify_save_lcdproc(PrefsPage *page)
{
notify_config.lcdproc_enabled =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(lcdproc_page.lcdproc_enabled));
if(notify_config.lcdproc_hostname)
g_free(notify_config.lcdproc_hostname);
notify_config.lcdproc_hostname =
g_strdup(gtk_entry_get_text(GTK_ENTRY(lcdproc_page.lcdproc_hostname)));
notify_config.lcdproc_port =
gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lcdproc_page.lcdproc_port));
if(notify_config.lcdproc_enabled)
notification_lcdproc_connect();
else
notification_lcdproc_disconnect();
}
static void notify_lcdproc_enable_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(lcdproc_page.lcdproc_enabled));
gtk_widget_set_sensitive(lcdproc_page.lcdproc_cont_enable, active);
}
#endif /* NOTIFICATION_LCDPROC */
#ifdef NOTIFICATION_TRAYICON
static void notify_create_trayicon_page(PrefsPage *page, GtkWindow *window,
gpointer data)
{
GtkWidget *pvbox;
GtkWidget *vbox;
GtkWidget *checkbox;
#ifdef HAVE_LIBNOTIFY
GtkWidget *svbox;
GtkWidget *ssvbox;
GtkWidget *frame;
GtkWidget *label;
GtkWidget *spinner;
GtkWidget *hbox;
GtkWidget *button;
gdouble timeout;
#endif
pvbox = gtk_vbox_new(FALSE, 20);
gtk_container_set_border_width(GTK_CONTAINER(pvbox), 10);
/* Enable trayicon */
checkbox = gtk_check_button_new_with_label(_("Enable Trayicon"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_enabled);
gtk_box_pack_start(GTK_BOX(pvbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_trayicon_enable_set_sensitivity), NULL);
gtk_widget_show(checkbox);
trayicon_page.trayicon_enabled = checkbox;
/* Container vbox for greying out everything */
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(pvbox), vbox, FALSE, FALSE, 0);
gtk_widget_show(vbox);
trayicon_page.trayicon_cont_enable = vbox;
/* Hide at startup */
checkbox = gtk_check_button_new_with_label(_("Hide at start-up"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_hide_at_startup);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
trayicon_page.trayicon_hide_at_startup = checkbox;
/* Close to tray */
checkbox = gtk_check_button_new_with_label(_("Close to tray"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_close_to_tray);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
trayicon_page.trayicon_close_to_tray = checkbox;
/* Hide when iconified */
checkbox = gtk_check_button_new_with_label(_("Hide when iconified"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_hide_when_iconified);
gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
trayicon_page.trayicon_hide_when_iconified = checkbox;
#ifdef HAVE_LIBNOTIFY
/* Frame for trayicon popup stuff */
frame = gtk_frame_new(_("Passive toaster popup"));
gtk_container_set_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
/* vbox for frame */
svbox = gtk_vbox_new(FALSE, 10);
gtk_container_add(GTK_CONTAINER(frame), svbox);
gtk_widget_show(svbox);
/* Enable popup for the tray icon */
checkbox = gtk_check_button_new_with_label(_("Enable Popup"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_popup_enabled);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_trayicon_popup_enable_set_sensitivity),
NULL);
gtk_box_pack_start(GTK_BOX(svbox), checkbox, FALSE, FALSE, 0);
gtk_widget_show(checkbox);
trayicon_page.trayicon_popup_enabled = checkbox;
/* vbox for trayicon popup stuff enabled/disabled container */
ssvbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(svbox), ssvbox, FALSE, FALSE, 0);
gtk_widget_show(ssvbox);
trayicon_page.trayicon_popup_cont_enable = ssvbox;
/* timeout */
hbox = gtk_hbox_new(FALSE, 10);
label = gtk_label_new(_("Popup timeout:"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
spinner = gtk_spin_button_new_with_range(0.2, 60., 0.5);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner), 1);
timeout = notify_config.trayicon_popup_timeout/1000.;
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner), timeout);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(ssvbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(spinner);
label = gtk_label_new(_("seconds"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
trayicon_page.trayicon_popup_timeout = spinner;
/* folder specific */
hbox = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(ssvbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
checkbox = gtk_check_button_new_with_label(_("Only include selected folders"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
notify_config.trayicon_popup_folder_specific);
gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(checkbox), "toggled",
G_CALLBACK(notify_trayicon_popup_folder_specific_set_sensitivity),
NULL);
gtk_widget_show(checkbox);
trayicon_page.trayicon_popup_folder_specific = checkbox;
button = gtk_button_new_with_label(_("Select folders..."));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(notification_foldercheck_sel_folders_cb),
TRAYICON_POPUP_SPECIFIC_FOLDER_ID_STR);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
trayicon_page.trayicon_popup_cont_folder_specific = button;
gtk_widget_show(button);
#endif
notify_trayicon_enable_set_sensitivity
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_enabled), NULL);
#ifdef HAVE_LIBNOTIFY
notify_trayicon_popup_enable_set_sensitivity
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_enabled), NULL);
notify_trayicon_popup_folder_specific_set_sensitivity
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_folder_specific), NULL);
#endif
gtk_widget_show(pvbox);
trayicon_page.page.widget = pvbox;
}
static void notify_destroy_trayicon_page(PrefsPage *page)
{
}
static void notify_save_trayicon(PrefsPage *page)
{
#ifdef HAVE_LIBNOTIFY
gdouble timeout;
#endif
notify_config.trayicon_enabled =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_enabled));
notify_config.trayicon_hide_at_startup =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_hide_at_startup));
notify_config.trayicon_close_to_tray =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_close_to_tray));
notify_config.trayicon_hide_when_iconified =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_hide_when_iconified));
#ifdef HAVE_LIBNOTIFY
notify_config.trayicon_popup_enabled =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_enabled));
timeout =
gtk_spin_button_get_value(GTK_SPIN_BUTTON
(trayicon_page.trayicon_popup_timeout));
notify_config.trayicon_popup_timeout = (gint)floor(timeout*1000+0.5);
notify_config.trayicon_popup_folder_specific =
gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_folder_specific));
#endif
if(notify_config.trayicon_enabled)
notification_update_msg_counts(NULL);
else
notification_trayicon_destroy();
}
static void notify_trayicon_enable_set_sensitivity(GtkToggleButton *button,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_enabled));
gtk_widget_set_sensitive(trayicon_page.trayicon_cont_enable, active);
}
#ifdef HAVE_LIBNOTIFY
static void notify_trayicon_popup_enable_set_sensitivity(GtkToggleButton *bu,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_enabled));
gtk_widget_set_sensitive(trayicon_page.trayicon_popup_cont_enable, active);
}
static void notify_trayicon_popup_folder_specific_set_sensitivity(GtkToggleButton *bu,
gpointer data)
{
gboolean active;
active = gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(trayicon_page.trayicon_popup_folder_specific));
gtk_widget_set_sensitive(trayicon_page.trayicon_popup_cont_folder_specific, active);
}
#endif /* HAVE_LIBNOTIFY */
#endif /* NOTIFICATION_TRAYICON */
/* This feels so wrong... */
static gint conv_color_to_int(GdkColor *color)
{
gint result;
guint red,green,blue;
red = (guint) ((gdouble)(color->red) /65535.*255.);
green = (guint) ((gdouble)(color->green) /65535.*255.);
blue = (guint) ((gdouble)(color->blue) /65535.*255.);
result = (gint) (blue | (green<<8) | (red<<16));
return result;
}