diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c index bd35745f..d6cbf891 100644 --- a/src/common/cfgfiles.c +++ b/src/common/cfgfiles.c @@ -411,6 +411,7 @@ const struct prefs vars[] = {"gui_chanlist_width_topic", P_OFFINT (hex_gui_chanlist_width_topic), TYPE_INT}, {"gui_chanlist_width_users", P_OFFINT (hex_gui_chanlist_width_users), TYPE_INT}, {"gui_compact", P_OFFINT (hex_gui_compact), TYPE_BOOL}, + {"gui_ctrlq_quit", P_OFFINT (hex_gui_ctrlq_quit), TYPE_BOOL}, {"gui_dialog_height", P_OFFINT (hex_gui_dialog_height), TYPE_INT}, {"gui_dialog_left", P_OFFINT (hex_gui_dialog_left), TYPE_INT}, {"gui_dialog_top", P_OFFINT (hex_gui_dialog_top), TYPE_INT}, @@ -765,6 +766,7 @@ load_default_config(void) #ifdef HAVE_GTK_MAC prefs.hex_gui_hide_menu = 1; #endif + prefs.hex_gui_ctrlq_quit = 1; prefs.hex_gui_input_attr = 1; prefs.hex_gui_input_icon = 1; prefs.hex_gui_input_nick = 1; diff --git a/src/common/zoitechat.h b/src/common/zoitechat.h index 61ad8c8d..50ffd8ea 100644 --- a/src/common/zoitechat.h +++ b/src/common/zoitechat.h @@ -122,6 +122,7 @@ struct zoitechatprefs unsigned int hex_gui_autoopen_recv; unsigned int hex_gui_autoopen_send; unsigned int hex_gui_compact; + unsigned int hex_gui_ctrlq_quit; unsigned int hex_gui_filesize_iec; unsigned int hex_gui_focus_omitalerts; unsigned int hex_gui_hide_menu; diff --git a/src/fe-gtk/fe-gtk.h b/src/fe-gtk/fe-gtk.h index 3ddddeb0..bdb3de16 100644 --- a/src/fe-gtk/fe-gtk.h +++ b/src/fe-gtk/fe-gtk.h @@ -170,7 +170,7 @@ typedef struct session_gui GtkWidget *shbox, *shentry; /* search bar hbox */ gulong search_changed_signal; /* hook for search change event so blanking the box doesn't suck */ -#define MENU_ID_NUM 14 +#define MENU_ID_NUM 15 GtkWidget *menu_item[MENU_ID_NUM+1]; /* some items we may change state of */ void *chanview; /* chanview.h */ diff --git a/src/fe-gtk/menu.c b/src/fe-gtk/menu.c index 1a31397a..efbd4726 100644 --- a/src/fe-gtk/menu.c +++ b/src/fe-gtk/menu.c @@ -1802,6 +1802,44 @@ menu_change_layout (void) } } +void +menu_update_quit_accel (void) +{ + GSList *list; + + list = sess_list; + while (list) + { + session *sess = list->data; + session_gui *gui = sess->gui; + GtkWidget *item; + GtkAccelGroup *accel_group; + int enabled; + + list = list->next; + if (!gui) + continue; + + item = gui->menu_item[MENU_ID_QUIT]; + if (!item) + continue; + + enabled = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "zc-ctrlq-enabled")); + if (enabled == (int)prefs.hex_gui_ctrlq_quit) + continue; + + accel_group = g_object_get_data (G_OBJECT (item), "zc-quit-accel-group"); + if (!accel_group) + continue; + + if (prefs.hex_gui_ctrlq_quit) + gtk_widget_add_accelerator (item, "activate", accel_group, GDK_KEY_q, STATE_CTRL, GTK_ACCEL_VISIBLE); + else + gtk_widget_remove_accelerator (item, accel_group, GDK_KEY_q, STATE_CTRL); + g_object_set_data (G_OBJECT (item), "zc-ctrlq-enabled", GINT_TO_POINTER (prefs.hex_gui_ctrlq_quit)); + } +} + static void menu_layout_cb (GtkWidget *item, gpointer none) { @@ -1977,7 +2015,7 @@ static struct mymenu mymenu[] = { #define CLOSE_OFFSET (13) {0, menu_close, 0, M_MENUITEM, 0, 0, 1}, {0, 0, 0, M_SEP, 0, 0, 0}, - {N_("_Quit"), menu_quit, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_q}, /* 15 */ + {N_("_Quit"), menu_quit, 0, M_MENUITEM, MENU_ID_QUIT, 0, 1, GDK_KEY_q}, /* 15 */ {N_("_View"), 0, 0, M_NEWMENU, 0, 0, 1}, #define MENUBAR_OFFSET (17) @@ -2661,7 +2699,7 @@ menu_create_main (void *accel_group, int bar, int away, int toplevel, case M_MENUITEM: item = gtk_menu_item_new_with_mnemonic (_(mymenu[i].text)); normalitem: - if (mymenu[i].key != 0) + if (mymenu[i].key != 0 && !(mymenu[i].id == MENU_ID_QUIT && !prefs.hex_gui_ctrlq_quit)) gtk_widget_add_accelerator (item, "activate", accel_group, mymenu[i].key, mymenu[i].key == GDK_KEY_F1 ? 0 : @@ -2671,6 +2709,11 @@ normalitem: STATE_SHIFT | STATE_CTRL : STATE_CTRL, GTK_ACCEL_VISIBLE); + if (mymenu[i].id == MENU_ID_QUIT) + { + g_object_set_data (G_OBJECT (item), "zc-quit-accel-group", accel_group); + g_object_set_data (G_OBJECT (item), "zc-ctrlq-enabled", GINT_TO_POINTER (prefs.hex_gui_ctrlq_quit)); + } if (mymenu[i].callback) g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (mymenu[i].callback), 0); diff --git a/src/fe-gtk/menu.h b/src/fe-gtk/menu.h index 4e9abf83..52454f58 100644 --- a/src/fe-gtk/menu.h +++ b/src/fe-gtk/menu.h @@ -38,6 +38,7 @@ void menu_create (GtkWidget *menu, GSList *list, char *target, int check_path); void menu_bar_toggle (void); void menu_add_plugin_items (GtkWidget *menu, char *root, char *target); void menu_change_layout (void); +void menu_update_quit_accel (void); void menu_set_away (session_gui *gui, int away); void menu_set_fullscreen (session_gui *gui, int fullscreen); @@ -63,8 +64,9 @@ void menu_set_fullscreen (session_gui *gui, int fullscreen); #define MENU_ID_USERMENU 12 #define MENU_ID_FULLSCREEN 13 #define MENU_ID_ZOITECHAT 14 +#define MENU_ID_QUIT 15 -#if (MENU_ID_NUM < MENU_ID_ZOITECHAT) +#if (MENU_ID_NUM < MENU_ID_QUIT) #error MENU_ID_NUM is set wrong #endif diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index 72719116..857ae1ff 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -536,6 +536,7 @@ static const setting general_settings[] = {ST_TOGGLE, N_("WHOIS on notify"), P_OFFINTNL(hex_notify_whois_online), N_("Sends a /WHOIS when a user comes online in your notify list."), 0, 0}, {ST_TOGGLE, N_("Hide join and part messages"), P_OFFINTNL(hex_irc_conf_mode), N_("Hide channel join/part messages by default."), 0, 0}, {ST_TOGGLE, N_("Hide nick change messages"), P_OFFINTNL(hex_irc_hide_nickchange), 0, 0, 0}, + {ST_TOGGLE, N_("Enable Ctrl+Q to quit"), P_OFFINTNL(hex_gui_ctrlq_quit), 0, 0, 0}, {ST_END, 0, 0, 0, 0, 0} }; @@ -2070,6 +2071,7 @@ setup_apply_real (const ThemeChangedEvent *event) } mg_apply_setup (); + menu_update_quit_accel (); tray_apply_setup (); zoitechat_reinit_timers ();