Add option to hide join/part hostmasks

This commit is contained in:
2026-06-10 15:09:47 -06:00
parent 97534b0670
commit 900066b9d4
3 changed files with 224 additions and 84 deletions

View File

@@ -80,7 +80,7 @@ void key_action_tab_clean (void);
*/ */
/* Remember that the *number* of actions is this *plus* 1 --AGL */ /* Remember that the *number* of actions is this *plus* 1 --AGL */
#define KEY_MAX_ACTIONS 14 #define KEY_MAX_ACTIONS 16
struct key_binding struct key_binding
{ {
@@ -142,6 +142,13 @@ static int key_action_move_tab_family_right (GtkWidget * wid, GdkEventKey * evt,
static int key_action_put_history (GtkWidget * wid, GdkEventKey * evt, static int key_action_put_history (GtkWidget * wid, GdkEventKey * evt,
char *d1, char *d2, char *d1, char *d2,
struct session *sess); struct session *sess);
static int key_action_menu_shortcut (GtkWidget * wid, GdkEventKey * evt,
char *d1, char *d2,
struct session *sess);
static int key_action_reopen_closed_tab (GtkWidget * wid, GdkEventKey * evt,
char *d1, char *d2,
struct session *sess);
static GSList *keybind_list = NULL; static GSList *keybind_list = NULL;
@@ -287,6 +294,10 @@ static const struct key_action key_actions[KEY_MAX_ACTIONS + 1] = {
N_("This command moves the current tab family to the right")}, N_("This command moves the current tab family to the right")},
{key_action_put_history, "Push input line into history", {key_action_put_history, "Push input line into history",
N_("Push input line into history but doesn't send to server")}, N_("Push input line into history but doesn't send to server")},
{key_action_menu_shortcut, "Menu Shortcut",
N_("Runs one of the built-in menu shortcuts. Set Data 1 to: network-list, new-server-tab, new-server-window, close, quit, menu-toggle, user-list-toggle, fullscreen-toggle, away-toggle, reset-marker, move-marker, copy-selection, search-text, search-next, search-previous or contents.")},
{key_action_reopen_closed_tab, "Reopen Closed Tab",
N_("Reopens the most recently closed channel tab")},
}; };
#define default_kb_cfg \ #define default_kb_cfg \
@@ -329,7 +340,86 @@ static const struct key_action key_actions[KEY_MAX_ACTIONS + 1] = {
"ACCEL=<Alt>Right\nMove front tab right\nD1!\nD2!\n\n"\ "ACCEL=<Alt>Right\nMove front tab right\nD1!\nD2!\n\n"\
"ACCEL=<Primary><Shift>Page_Up\nMove tab family left\nD1!\nD2!\n\n"\ "ACCEL=<Primary><Shift>Page_Up\nMove tab family left\nD1!\nD2!\n\n"\
"ACCEL=<Primary><Shift>Page_Down\nMove tab family right\nD1!\nD2!\n\n"\ "ACCEL=<Primary><Shift>Page_Down\nMove tab family right\nD1!\nD2!\n\n"\
"ACCEL=F9\nRun Command\nD1:/GUI MENU TOGGLE\nD2!\n\n" "ACCEL=<Primary>s\nMenu Shortcut\nD1:network-list\nD2!\n\n"\
"ACCEL=<Primary>t\nMenu Shortcut\nD1:new-server-tab\nD2!\n\n"\
"ACCEL=<Primary>n\nMenu Shortcut\nD1:new-server-window\nD2!\n\n"\
"ACCEL=<Primary>w\nMenu Shortcut\nD1:close\nD2!\n\n"\
"ACCEL=<Primary>q\nMenu Shortcut\nD1:quit\nD2!\n\n"\
"ACCEL=<Primary>F9\nMenu Shortcut\nD1:menu-toggle\nD2!\n\n"\
"ACCEL=F7\nMenu Shortcut\nD1:user-list-toggle\nD2!\n\n"\
"ACCEL=F11\nMenu Shortcut\nD1:fullscreen-toggle\nD2!\n\n"\
"ACCEL=<Alt>a\nMenu Shortcut\nD1:away-toggle\nD2!\n\n"\
"ACCEL=<Primary>m\nMenu Shortcut\nD1:reset-marker\nD2!\n\n"\
"ACCEL=<Primary><Shift>M\nMenu Shortcut\nD1:move-marker\nD2!\n\n"\
"ACCEL=<Primary><Shift>C\nMenu Shortcut\nD1:copy-selection\nD2!\n\n"\
"ACCEL=<Primary>f\nMenu Shortcut\nD1:search-text\nD2!\n\n"\
"ACCEL=<Primary>g\nMenu Shortcut\nD1:search-next\nD2!\n\n"\
"ACCEL=<Primary><Shift>G\nMenu Shortcut\nD1:search-previous\nD2!\n\n"\
"ACCEL=F1\nMenu Shortcut\nD1:contents\nD2!\n\n"\
"ACCEL=<Primary><Shift>T\nReopen Closed Tab\nD1!\nD2!\n\n"
static gboolean
key_builtin_data_match (char *line, char *data)
{
if (line[2] == '!')
return data == NULL || data[0] == 0;
if (line[2] == ':')
return !strcmp (&line[3], data ? data : "");
return FALSE;
}
static gboolean
key_binding_is_builtin (struct key_binding *kb)
{
char *buf, *ibuf;
char *action;
int pnt = 0;
int state = 0;
gboolean match = FALSE;
gboolean d1_match = FALSE;
off_t size;
if (kb->action < 0 || kb->action > KEY_MAX_ACTIONS)
return FALSE;
action = key_actions[kb->action].name;
ibuf = g_strdup (default_kb_cfg);
size = strlen (default_kb_cfg);
while (buf_get_line (ibuf, &buf, &pnt, size))
{
if (strlen (buf) == 0)
continue;
switch (state)
{
case 0:
state = 1;
break;
case 1:
match = !strcmp (buf, action);
state = 2;
break;
case 2:
d1_match = match && key_builtin_data_match (buf, kb->data1);
state = 3;
break;
case 3:
if (d1_match && key_builtin_data_match (buf, kb->data2))
{
g_free (ibuf);
return TRUE;
}
state = 0;
break;
}
}
g_free (ibuf);
return FALSE;
}
void void
key_init () key_init ()
@@ -443,28 +533,6 @@ key_handle_key_press (GtkWidget *wid, GdkEventKey *evt, session *sess)
if (!list) if (!list)
return FALSE; return FALSE;
current_sess = sess; current_sess = sess;
if ((evt->state & GDK_CONTROL_MASK) &&
!(evt->state & (GDK_MOD1_MASK | GDK_META_MASK)))
{
if (!(evt->state & GDK_SHIFT_MASK) &&
(evt->keyval == GDK_KEY_w || evt->keyval == GDK_KEY_W))
{
if (sess->type == SESS_CHANNEL)
{
fe_close_window (sess);
g_signal_stop_emission_by_name (G_OBJECT (wid), "key-press-event");
return 1;
}
}
if ((evt->state & GDK_SHIFT_MASK) &&
(evt->keyval == GDK_KEY_t || evt->keyval == GDK_KEY_T))
{
mg_reopen_closed_channel_tab ();
g_signal_stop_emission_by_name (G_OBJECT (wid), "key-press-event");
return 1;
}
}
if (plugin_emit_keypress (sess, evt->state, evt->keyval, gdk_keyval_to_unicode (evt->keyval))) if (plugin_emit_keypress (sess, evt->state, evt->keyval, gdk_keyval_to_unicode (evt->keyval)))
return 1; return 1;
@@ -518,6 +586,7 @@ enum
ACTION_COLUMN, ACTION_COLUMN,
D1_COLUMN, D1_COLUMN,
D2_COLUMN, D2_COLUMN,
CUSTOM_COLUMN,
N_COLUMNS N_COLUMNS
}; };
@@ -642,16 +711,32 @@ key_dialog_keypress (GtkWidget *wid, GdkEventKey *evt, gpointer userdata)
if (handled) if (handled)
{ {
gboolean custom1, custom2;
sel = gtk_tree_view_get_selection (view); sel = gtk_tree_view_get_selection (view);
gtk_tree_selection_get_selected (sel, &store, &iter1); if (!gtk_tree_selection_get_selected (sel, &store, &iter1))
return FALSE;
path = gtk_tree_model_get_path (store, &iter1); path = gtk_tree_model_get_path (store, &iter1);
if (delta == 1) if (delta == 1)
gtk_tree_path_next (path); gtk_tree_path_next (path);
else else if (!gtk_tree_path_prev (path))
gtk_tree_path_prev (path); {
gtk_tree_model_get_iter (store, &iter2, path); gtk_tree_path_free (path);
return FALSE;
}
if (!gtk_tree_model_get_iter (store, &iter2, path))
{
gtk_tree_path_free (path);
return FALSE;
}
gtk_tree_path_free (path); gtk_tree_path_free (path);
gtk_list_store_swap (GTK_LIST_STORE (store), &iter1, &iter2); gtk_tree_model_get (store, &iter1, CUSTOM_COLUMN, &custom1, -1);
gtk_tree_model_get (store, &iter2, CUSTOM_COLUMN, &custom2, -1);
if (custom1 && custom2)
gtk_list_store_swap (GTK_LIST_STORE (store), &iter1, &iter2);
} }
return handled; return handled;
@@ -663,14 +748,23 @@ key_dialog_selection_changed (GtkTreeSelection *sel, gpointer userdata)
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter iter; GtkTreeIter iter;
GtkXText *xtext; GtkXText *xtext;
GtkWidget *delete_button;
char *actiontext; char *actiontext;
gboolean custom;
int action; int action;
delete_button = g_object_get_data (G_OBJECT (key_dialog), "delete_button");
if (!gtk_tree_selection_get_selected (sel, &model, &iter) || model == NULL) if (!gtk_tree_selection_get_selected (sel, &model, &iter) || model == NULL)
{
if (delete_button)
gtk_widget_set_sensitive (delete_button, FALSE);
return; return;
}
xtext = GTK_XTEXT (g_object_get_data (G_OBJECT (key_dialog), "xtext")); xtext = GTK_XTEXT (g_object_get_data (G_OBJECT (key_dialog), "xtext"));
gtk_tree_model_get (model, &iter, ACTION_COLUMN, &actiontext, -1); gtk_tree_model_get (model, &iter, ACTION_COLUMN, &actiontext, CUSTOM_COLUMN, &custom, -1);
if (delete_button)
gtk_widget_set_sensitive (delete_button, custom);
if (actiontext) if (actiontext)
{ {
@@ -758,6 +852,7 @@ key_dialog_add (GtkWidget *wid, gpointer userdata)
GtkTreePath *path; GtkTreePath *path;
gtk_list_store_append (store, &iter); gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, CUSTOM_COLUMN, TRUE, -1);
/* make sure the new row is visible and selected */ /* make sure the new row is visible and selected */
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
@@ -774,9 +869,14 @@ key_dialog_delete (GtkWidget *wid, gpointer userdata)
GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (view)); GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
GtkTreeIter iter; GtkTreeIter iter;
GtkTreePath *path; GtkTreePath *path;
gboolean custom;
if (gtkutil_treeview_get_selected (view, &iter, -1)) if (gtkutil_treeview_get_selected (view, &iter, -1))
{ {
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, CUSTOM_COLUMN, &custom, -1);
if (!custom)
return;
/* delete this row, select next one */ /* delete this row, select next one */
if (gtk_list_store_remove (store, &iter)) if (gtk_list_store_remove (store, &iter))
{ {
@@ -803,13 +903,13 @@ key_dialog_treeview_new (GtkWidget *box)
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING); G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (store != NULL, NULL);
view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE); gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);
gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view), FALSE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view), FALSE);
gtk_tree_view_set_reorderable (GTK_TREE_VIEW (view), TRUE); gtk_tree_view_set_reorderable (GTK_TREE_VIEW (view), FALSE);
g_signal_connect (G_OBJECT (view), "key-press-event", g_signal_connect (G_OBJECT (view), "key-press-event",
G_CALLBACK (key_dialog_keypress), NULL); G_CALLBACK (key_dialog_keypress), NULL);
@@ -879,7 +979,8 @@ key_dialog_treeview_new (GtkWidget *box)
G_CALLBACK (key_dialog_combo_changed), combostore); G_CALLBACK (key_dialog_combo_changed), combostore);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), ACTION_COLUMN, gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), ACTION_COLUMN,
"Action", render, "Action", render,
"text", ACTION_COLUMN, "text", ACTION_COLUMN,
"editable", CUSTOM_COLUMN,
NULL); NULL);
render = gtk_cell_renderer_text_new (); render = gtk_cell_renderer_text_new ();
@@ -890,6 +991,7 @@ key_dialog_treeview_new (GtkWidget *box)
GTK_TREE_VIEW (view), D1_COLUMN, GTK_TREE_VIEW (view), D1_COLUMN,
"Data1", render, "Data1", render,
"text", D1_COLUMN, "text", D1_COLUMN,
"editable", CUSTOM_COLUMN,
NULL); NULL);
render = gtk_cell_renderer_text_new (); render = gtk_cell_renderer_text_new ();
@@ -900,6 +1002,7 @@ key_dialog_treeview_new (GtkWidget *box)
GTK_TREE_VIEW (view), D2_COLUMN, GTK_TREE_VIEW (view), D2_COLUMN,
"Data2", render, "Data2", render,
"text", D2_COLUMN, "text", D2_COLUMN,
"editable", CUSTOM_COLUMN,
NULL); NULL);
col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), KEY_COLUMN); col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), KEY_COLUMN);
@@ -945,7 +1048,8 @@ key_dialog_load (GtkListStore *store)
ACCEL_COLUMN, accel_text, ACCEL_COLUMN, accel_text,
ACTION_COLUMN, key_actions[kb->action].name, ACTION_COLUMN, key_actions[kb->action].name,
D1_COLUMN, kb->data1, D1_COLUMN, kb->data1,
D2_COLUMN, kb->data2, -1); D2_COLUMN, kb->data2,
CUSTOM_COLUMN, !key_binding_is_builtin (kb), -1);
g_free (accel_text); g_free (accel_text);
g_free (label_text); g_free (label_text);
@@ -958,7 +1062,7 @@ void
key_dialog_show () key_dialog_show ()
{ {
GtkWidget *vbox, *box; GtkWidget *vbox, *box;
GtkWidget *view, *xtext; GtkWidget *view, *xtext, *delete_button;
GtkListStore *store; GtkListStore *store;
XTextColor xtext_palette[XTEXT_COLS]; XTextColor xtext_palette[XTEXT_COLS];
char buf[128]; char buf[128];
@@ -992,8 +1096,10 @@ key_dialog_show ()
gtkutil_button (box, ICON_FKEYS_NEW, NULL, key_dialog_add, gtkutil_button (box, ICON_FKEYS_NEW, NULL, key_dialog_add,
NULL, _("Add")); NULL, _("Add"));
gtkutil_button (box, ICON_FKEYS_DELETE, NULL, key_dialog_delete, delete_button = gtkutil_button (box, ICON_FKEYS_DELETE, NULL, key_dialog_delete,
NULL, _("Delete")); NULL, _("Delete"));
g_object_set_data (G_OBJECT (key_dialog), "delete_button", delete_button);
gtk_widget_set_sensitive (delete_button, FALSE);
gtkutil_button (box, ICON_FKEYS_CANCEL, NULL, key_dialog_close, gtkutil_button (box, ICON_FKEYS_CANCEL, NULL, key_dialog_close,
NULL, _("Cancel")); NULL, _("Cancel"));
gtkutil_button (box, ICON_FKEYS_SAVE, NULL, key_dialog_save, gtkutil_button (box, ICON_FKEYS_SAVE, NULL, key_dialog_save,
@@ -1289,6 +1395,24 @@ key_action_handle_command (GtkWidget * wid, GdkEventKey * evt, char *d1,
return 0; return 0;
} }
static int
key_action_menu_shortcut (GtkWidget * wid, GdkEventKey * evt, char *d1,
char *d2, struct session *sess)
{
if (menu_key_action (d1, evt->keyval, evt->state))
return 2;
return 0;
}
static int
key_action_reopen_closed_tab (GtkWidget * wid, GdkEventKey * evt, char *d1,
char *d2, struct session *sess)
{
mg_reopen_closed_channel_tab ();
return 2;
}
/* /*
* Check if the given session is inside the main window. This predicate * Check if the given session is inside the main window. This predicate
* is passed to lastact_getfirst() as a way to filter out detached sessions. * is passed to lastact_getfirst() as a way to filter out detached sessions.

View File

@@ -1758,39 +1758,6 @@ menu_change_layout (void)
void void
menu_update_quit_accel (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 static void
@@ -1939,13 +1906,13 @@ menu_about (GtkWidget *wid, gpointer sess)
static struct mymenu mymenu[] = { static struct mymenu mymenu[] = {
{N_("_ZoiteChat"), 0, 0, M_NEWMENU, MENU_ID_ZOITECHAT, 0, 1}, {N_("_ZoiteChat"), 0, 0, M_NEWMENU, MENU_ID_ZOITECHAT, 0, 1},
{N_("Network Li_st"), menu_open_server_list, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_s}, {N_("Network Li_st"), menu_open_server_list, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("_New"), 0, 0, M_MENUSUB, 0, 0, 1}, {N_("_New"), 0, 0, M_MENUSUB, 0, 0, 1},
{N_("Server Tab"), menu_newserver_tab, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_t}, {N_("Server Tab"), menu_newserver_tab, 0, M_MENUITEM, 0, 0, 1},
{N_("Channel Tab"), menu_newchannel_tab, 0, M_MENUITEM, 0, 0, 1}, {N_("Channel Tab"), menu_newchannel_tab, 0, M_MENUITEM, 0, 0, 1},
{N_("Server Window"), menu_newserver_window, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_n}, {N_("Server Window"), menu_newserver_window, 0, M_MENUITEM, 0, 0, 1},
{N_("Channel Window"), menu_newchannel_window, 0, M_MENUITEM, 0, 0, 1}, {N_("Channel Window"), menu_newchannel_window, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
@@ -1957,13 +1924,13 @@ static struct mymenu mymenu[] = {
#define CLOSE_OFFSET (13) #define CLOSE_OFFSET (13)
{0, menu_close, 0, M_MENUITEM, 0, 0, 1}, {0, menu_close, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("_Quit"), menu_quit, 0, M_MENUITEM, MENU_ID_QUIT, 0, 1, GDK_KEY_q}, /* 15 */ {N_("_Quit"), menu_quit, 0, M_MENUITEM, MENU_ID_QUIT, 0, 1}, /* 15 */
{N_("_View"), 0, 0, M_NEWMENU, 0, 0, 1}, {N_("_View"), 0, 0, M_NEWMENU, 0, 0, 1},
#define MENUBAR_OFFSET (17) #define MENUBAR_OFFSET (17)
{N_("_Menu Bar"), menu_bar_toggle_cb, 0, M_MENUTOG, MENU_ID_MENUBAR, 0, 1, GDK_KEY_F9}, {N_("_Menu Bar"), menu_bar_toggle_cb, 0, M_MENUTOG, MENU_ID_MENUBAR, 0, 1},
{N_("_Topic Bar"), menu_topicbar_toggle, 0, M_MENUTOG, MENU_ID_TOPICBAR, 0, 1}, {N_("_Topic Bar"), menu_topicbar_toggle, 0, M_MENUTOG, MENU_ID_TOPICBAR, 0, 1},
{N_("_User List"), menu_userlist_toggle, 0, M_MENUTOG, MENU_ID_USERLIST, 0, 1, GDK_KEY_F7}, {N_("_User List"), menu_userlist_toggle, 0, M_MENUTOG, MENU_ID_USERLIST, 0, 1},
{N_("U_ser List Buttons"), menu_ulbuttons_toggle, 0, M_MENUTOG, MENU_ID_ULBUTTONS, 0, 1}, {N_("U_ser List Buttons"), menu_ulbuttons_toggle, 0, M_MENUTOG, MENU_ID_ULBUTTONS, 0, 1},
{N_("M_ode Buttons"), menu_cmbuttons_toggle, 0, M_MENUTOG, MENU_ID_MODEBUTTONS, 0, 1}, {N_("M_ode Buttons"), menu_cmbuttons_toggle, 0, M_MENUTOG, MENU_ID_MODEBUTTONS, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
@@ -1980,7 +1947,7 @@ static struct mymenu mymenu[] = {
{N_("Both"), menu_metres_both, 0, M_MENURADIO, 0, 0, 1}, {N_("Both"), menu_metres_both, 0, M_MENURADIO, 0, 0, 1},
{0, 0, 0, M_END, 0, 0, 0}, /* 32 */ {0, 0, 0, M_END, 0, 0, 0}, /* 32 */
{ 0, 0, 0, M_SEP, 0, 0, 0 }, { 0, 0, 0, M_SEP, 0, 0, 0 },
{N_ ("_Fullscreen"), menu_fullscreen_toggle, 0, M_MENUTOG, MENU_ID_FULLSCREEN, 0, 1, GDK_KEY_F11}, {N_ ("_Fullscreen"), menu_fullscreen_toggle, 0, M_MENUTOG, MENU_ID_FULLSCREEN, 0, 1},
{N_("_Server"), 0, 0, M_NEWMENU, 0, 0, 1}, {N_("_Server"), 0, 0, M_NEWMENU, 0, 0, 1},
{N_("_Disconnect"), menu_disconnect, 0, M_MENUITEM, MENU_ID_DISCONNECT, 0, 1}, {N_("_Disconnect"), menu_disconnect, 0, M_MENUITEM, MENU_ID_DISCONNECT, 0, 1},
@@ -1989,7 +1956,7 @@ static struct mymenu mymenu[] = {
{N_("Channel _List"), menu_chanlist, 0, M_MENUITEM, 0, 0, 1}, {N_("Channel _List"), menu_chanlist, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
#define AWAY_OFFSET (41) #define AWAY_OFFSET (41)
{N_("Marked _Away"), menu_away_toggle, 0, M_MENUITEM, MENU_ID_AWAY, 0, 1, GDK_KEY_a}, {N_("Marked _Away"), menu_away_toggle, 0, M_MENUITEM, MENU_ID_AWAY, 0, 1},
{N_("_Usermenu"), 0, 0, M_NEWMENU, MENU_ID_USERMENU, 0, 1}, /* 40 */ {N_("_Usermenu"), 0, 0, M_NEWMENU, MENU_ID_USERMENU, 0, 1}, /* 40 */
@@ -2017,25 +1984,73 @@ static struct mymenu mymenu[] = {
{N_("_Raw Log"), menu_rawlog, 0, M_MENUITEM, 0, 0, 1}, /* 61 */ {N_("_Raw Log"), menu_rawlog, 0, M_MENUITEM, 0, 0, 1}, /* 61 */
{N_("_URL Grabber"), url_opengui, 0, M_MENUITEM, 0, 0, 1}, {N_("_URL Grabber"), url_opengui, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("Reset Marker Line"), menu_resetmarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_m}, {N_("Reset Marker Line"), menu_resetmarker, 0, M_MENUITEM, 0, 0, 1},
{N_("Move to Marker Line"), menu_movetomarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_M}, {N_("Move to Marker Line"), menu_movetomarker, 0, M_MENUITEM, 0, 0, 1},
{N_("_Copy Selection"), menu_copy_selection, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_C}, {N_("_Copy Selection"), menu_copy_selection, 0, M_MENUITEM, 0, 0, 1},
{N_("C_lear Text"), menu_flushbuffer, 0, M_MENUITEM, 0, 0, 1}, {N_("C_lear Text"), menu_flushbuffer, 0, M_MENUITEM, 0, 0, 1},
{N_("Save Text" ELLIPSIS), menu_savebuffer, 0, M_MENUITEM, 0, 0, 1}, {N_("Save Text" ELLIPSIS), menu_savebuffer, 0, M_MENUITEM, 0, 0, 1},
#define SEARCH_OFFSET (70) #define SEARCH_OFFSET (70)
{N_("Search"), 0, 0, M_MENUSUB, 0, 0, 1}, {N_("Search"), 0, 0, M_MENUSUB, 0, 0, 1},
{N_("Search Text" ELLIPSIS), menu_search, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_f}, {N_("Search Text" ELLIPSIS), menu_search, 0, M_MENUITEM, 0, 0, 1},
{N_("Search Next" ), menu_search_next, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_g}, {N_("Search Next" ), menu_search_next, 0, M_MENUITEM, 0, 0, 1},
{N_("Search Previous" ), menu_search_prev, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_G}, {N_("Search Previous" ), menu_search_prev, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
{N_("_Help"), 0, 0, M_NEWMENU, 0, 0, 1}, /* 74 */ {N_("_Help"), 0, 0, M_NEWMENU, 0, 0, 1}, /* 74 */
{N_("_Contents"), menu_docs, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_F1}, {N_("_Contents"), menu_docs, 0, M_MENUITEM, 0, 0, 1},
{N_("_About"), menu_about, 0, M_MENUITEM, 0, 0, 1}, {N_("_About"), menu_about, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
}; };
gboolean
menu_key_action (const char *name, guint keyval, GdkModifierType state)
{
if (!name)
return FALSE;
if (!strcmp (name, "network-list"))
menu_open_server_list (NULL, NULL);
else if (!strcmp (name, "new-server-tab"))
menu_newserver_tab (NULL, NULL);
else if (!strcmp (name, "new-server-window"))
menu_newserver_window (NULL, NULL);
else if (!strcmp (name, "close"))
menu_close (NULL, NULL);
else if (!strcmp (name, "quit"))
{
if (!prefs.hex_gui_ctrlq_quit && keyval == GDK_KEY_q && (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == STATE_CTRL)
return FALSE;
menu_quit (NULL, NULL);
}
else if (!strcmp (name, "menu-toggle"))
menu_bar_toggle_cb ();
else if (!strcmp (name, "user-list-toggle"))
menu_userlist_toggle (NULL, NULL);
else if (!strcmp (name, "fullscreen-toggle"))
menu_fullscreen_toggle (NULL, NULL);
else if (!strcmp (name, "away-toggle"))
menu_away_toggle (NULL, NULL);
else if (!strcmp (name, "reset-marker"))
menu_resetmarker (NULL, NULL);
else if (!strcmp (name, "move-marker"))
menu_movetomarker (NULL, NULL);
else if (!strcmp (name, "copy-selection"))
menu_copy_selection (NULL, NULL);
else if (!strcmp (name, "search-text"))
menu_search ();
else if (!strcmp (name, "search-next"))
menu_search_next (NULL);
else if (!strcmp (name, "search-previous"))
menu_search_prev (NULL);
else if (!strcmp (name, "contents"))
menu_docs (NULL, NULL);
else
return FALSE;
return TRUE;
}
void void
menu_set_away (session_gui *gui, int away) menu_set_away (session_gui *gui, int away)
{ {

View File

@@ -39,6 +39,7 @@ void menu_bar_toggle (void);
void menu_add_plugin_items (GtkWidget *menu, char *root, char *target); void menu_add_plugin_items (GtkWidget *menu, char *root, char *target);
void menu_change_layout (void); void menu_change_layout (void);
void menu_update_quit_accel (void); void menu_update_quit_accel (void);
gboolean menu_key_action (const char *name, guint keyval, GdkModifierType state);
void menu_set_away (session_gui *gui, int away); void menu_set_away (session_gui *gui, int away);
void menu_set_fullscreen (session_gui *gui, int fullscreen); void menu_set_fullscreen (session_gui *gui, int fullscreen);