From ed671eac2525f4940ef9534cf74dec94c1c67494 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Tue, 31 Mar 2026 18:10:28 -0600 Subject: [PATCH] Add pref for tab close buttons --- src/common/cfgfiles.c | 2 ++ src/common/zoitechat.h | 1 + src/fe-gtk/chanview-tabs.c | 8 +++++--- src/fe-gtk/menu.c | 12 +++++------- src/fe-gtk/setup.c | 3 +++ 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c index d6cbf891..299e7caf 100644 --- a/src/common/cfgfiles.c +++ b/src/common/cfgfiles.c @@ -445,6 +445,7 @@ const struct prefs vars[] = {"gui_dark_mode", P_OFFINT (hex_gui_dark_mode), TYPE_INT}, {"gui_gtk3_variant", P_OFFINT (hex_gui_gtk3_variant), TYPE_INT}, {"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT}, + {"gui_tab_closebuttons", P_OFFINT (hex_gui_tab_closebuttons), TYPE_BOOL}, {"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL}, {"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT}, {"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT}, @@ -777,6 +778,7 @@ load_default_config(void) prefs.hex_gui_tab_chans = 1; prefs.hex_gui_tab_dialogs = 1; prefs.hex_gui_tab_icons = 1; + prefs.hex_gui_tab_closebuttons = 1; prefs.hex_gui_tab_middleclose = 1; prefs.hex_gui_tab_server = 1; prefs.hex_gui_tab_sort = 1; diff --git a/src/common/zoitechat.h b/src/common/zoitechat.h index 50ffd8ea..adf8ca30 100644 --- a/src/common/zoitechat.h +++ b/src/common/zoitechat.h @@ -265,6 +265,7 @@ struct zoitechatprefs int hex_gui_search_pos; int hex_gui_slist_select; int hex_gui_tab_layout; + int hex_gui_tab_closebuttons; int hex_gui_tab_middleclose; int hex_gui_tab_newtofront; int hex_gui_tab_pos; diff --git a/src/fe-gtk/chanview-tabs.c b/src/fe-gtk/chanview-tabs.c index b610b88b..41b74739 100644 --- a/src/fe-gtk/chanview-tabs.c +++ b/src/fe-gtk/chanview-tabs.c @@ -653,7 +653,7 @@ tab_click_cb (GtkWidget *wid, GdkEventButton *event, chan *ch) if (event->button == 1 && event->type == GDK_BUTTON_PRESS) { close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button"); - if (close_button && + if (prefs.hex_gui_tab_closebuttons && close_button && gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y)) { gtk_widget_get_allocation (close_button, &close_alloc); @@ -679,7 +679,7 @@ tab_close_motion_cb (GtkWidget *wid, GdkEventMotion *event, chan *ch) gboolean hover = FALSE; close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button"); - if (close_button && + if (prefs.hex_gui_tab_closebuttons && close_button && gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y)) { gtk_widget_get_allocation (close_button, &close_alloc); @@ -714,7 +714,7 @@ tab_close_leave_cb (GtkWidget *wid, GdkEventCrossing *event, chan *ch) GtkWidget *close_button; close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button"); - if (close_button) + if (prefs.hex_gui_tab_closebuttons && close_button) gtk_widget_unset_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT); if (gtk_widget_get_window (wid)) gdk_window_set_cursor (gtk_widget_get_window (wid), NULL); @@ -780,6 +780,8 @@ cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent) G_CALLBACK (tab_toggled_cb), ch); g_object_set_data (G_OBJECT (but), "u", ch->userdata); gtk_widget_show_all (hbox); + if (!prefs.hex_gui_tab_closebuttons) + gtk_widget_hide (close_button); tab_add_real (cv, but, ch); diff --git a/src/fe-gtk/menu.c b/src/fe-gtk/menu.c index 90fa4847..153eaf0f 100644 --- a/src/fe-gtk/menu.c +++ b/src/fe-gtk/menu.c @@ -1888,8 +1888,7 @@ menu_about (GtkWidget *wid, gpointer sess) GtkWidget *license; GtkWidget *close; GtkWidget *actions; - GList *children; - GList *child; + GtkWidget *default_close; static const gchar *empty_people[] = { NULL }; theme_manager_attach_window (GTK_WIDGET (dialog)); char comment[512]; @@ -1918,14 +1917,13 @@ menu_about (GtkWidget *wid, gpointer sess) gtk_about_dialog_set_logo (dialog, pix_zoitechat); gtk_about_dialog_set_copyright (dialog, "\302\251 1998-2010 Peter \305\275elezn\303\275\n\302\251 2009-2014 Berke Viktor\n\302\251 2015-2025 Patrick Griffis\n\302\251 2026 deepend"); gtk_about_dialog_set_comments (dialog, comment); - actions = gtk_dialog_get_action_area (GTK_DIALOG (dialog)); - children = gtk_container_get_children (GTK_CONTAINER (actions)); - for (child = children; child; child = child->next) - gtk_widget_destroy (GTK_WIDGET (child->data)); - g_list_free (children); + default_close = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); + if (default_close) + gtk_widget_destroy (default_close); website = gtk_dialog_add_button (GTK_DIALOG (dialog), "Website", GTK_RESPONSE_HELP); license = gtk_dialog_add_button (GTK_DIALOG (dialog), "License", GTK_RESPONSE_APPLY); close = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Close"), GTK_RESPONSE_CLOSE); + actions = gtk_widget_get_parent (close); gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (actions), website, TRUE); gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (actions), license, TRUE); gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (actions), close, FALSE); diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index af32e719..f4250c67 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -330,6 +330,7 @@ static const setting tabs_settings[] = {ST_TOGGLE, N_("Show icons in the channel tree"), P_OFFINTNL(hex_gui_tab_icons), 0, 0, 0}, {ST_TOGGLE, N_("Show dotted lines in the channel tree"), P_OFFINTNL(hex_gui_tab_dots), 0, 0, 0}, {ST_TOGGLE, N_("Scroll mouse-wheel to change tabs"), P_OFFINTNL (hex_gui_tab_scrollchans), 0, 0, 0}, + {ST_TOGGLE, N_("Show close button on tabs"), P_OFFINTNL(hex_gui_tab_closebuttons), 0, 0, 0}, {ST_TOGGLE, N_("Middle click to close tab"), P_OFFINTNL(hex_gui_tab_middleclose), 0, 0, 0}, {ST_TOGGLE, N_("Smaller text"), P_OFFINTNL(hex_gui_tab_small), 0, 0, 0}, {ST_MENU, N_("Focus new tabs:"), P_OFFINTNL(hex_gui_tab_newtofront), 0, focusnewtabsmenu, 0}, @@ -2186,6 +2187,8 @@ setup_apply (struct zoitechatprefs *pr) noapply = TRUE; if (DIFF (hex_gui_tab_icons)) noapply = TRUE; + if (DIFF (hex_gui_tab_closebuttons)) + noapply = TRUE; if (DIFF (hex_gui_tab_server)) noapply = TRUE; if (DIFF (hex_gui_tab_small))