diff --git a/gnome-control-center.spec b/gnome-control-center.spec index 1ab0603..7e89e7d 100644 --- a/gnome-control-center.spec +++ b/gnome-control-center.spec @@ -32,6 +32,8 @@ Patch1: subscription-manager-translations.patch Patch2: toggle-activities-overview-shortcut.patch # https://issues.redhat.com/browse/RHEL-81055 Patch3: wwan-apn-attach.patch +# https://issues.redhat.com/browse/RHEL-22606 +Patch4: multitasking-add-window-control-settings.patch BuildRequires: desktop-file-utils BuildRequires: docbook-style-xsl libxslt diff --git a/multitasking-add-window-control-settings.patch b/multitasking-add-window-control-settings.patch new file mode 100644 index 0000000..74ece84 --- /dev/null +++ b/multitasking-add-window-control-settings.patch @@ -0,0 +1,158 @@ +From b404400352ab118b77bf8ddf42db477087a1ef87 Mon Sep 17 00:00:00 2001 +From: Felipe Borges +Date: Fri, 6 Jun 2025 10:30:00 +0200 +Subject: [PATCH] multitasking: Introduce "Window Controls" section + +This allows setting the visibility of the minimize and maximize +window control buttons. These buttons are standard on other platforms +and some users/vendors might opt to expose them. + +This setting is present in GNOME Tweaks but given its not available in +RHEL, we are bringing a subset of this setting to GNOME Settings. + +By design: + + * We don't allow reordering the buttons neither moving them to the + opposite side of the window. + + * We only allow toggling the visibility of "maximize" and/or + "minimize" buttons. + + * The "close" button is always visible. The pre-dermined order is + always: "minimize,maximize,close". + +There are prior discussions about this feature in: +- Teams/Design/whiteboards#87 +- #2006 +- https://discourse.gnome.org/t/titlebar-buttons/10669/32 + +Related: RHEL-22606 +--- + panels/multitasking/cc-multitasking-panel.c | 54 ++++++++++++++++++++ + panels/multitasking/cc-multitasking-panel.ui | 21 ++++++++ + 2 files changed, 75 insertions(+) + +diff --git a/panels/multitasking/cc-multitasking-panel.c b/panels/multitasking/cc-multitasking-panel.c +index be3d3dec7..cb667df3e 100644 +--- a/panels/multitasking/cc-multitasking-panel.c ++++ b/panels/multitasking/cc-multitasking-panel.c +@@ -41,6 +41,8 @@ struct _CcMultitaskingPanel + GtkCheckButton *fixed_workspaces_radio; + CcIllustratedRow *hot_corner_row; + GtkSwitch *hot_corner_switch; ++ AdwSwitchRow *maximize_row; ++ AdwSwitchRow *minimize_row; + AdwSpinRow *number_of_workspaces_spin_row; + GtkCheckButton *workspaces_primary_display_radio; + GtkCheckButton *workspaces_span_displays_radio; +@@ -48,6 +50,48 @@ struct _CcMultitaskingPanel + + CC_PANEL_REGISTER (CcMultitaskingPanel, cc_multitasking_panel) + ++static void ++set_window_controls (CcMultitaskingPanel *self) ++{ ++ g_autofree gchar *layout = NULL; ++ g_autofree gchar *topbar_layout = NULL; ++ gboolean maximize, minimize; ++ ++ maximize = adw_switch_row_get_active (self->maximize_row);; ++ minimize = adw_switch_row_get_active (self->minimize_row);; ++ ++ if (minimize && maximize) ++ layout = g_strdup ("minimize,maximize,"); ++ else if (minimize) ++ layout = g_strdup ("minimize,"); ++ else if (maximize) ++ layout = g_strdup ("maximize,"); ++ else ++ layout = g_strdup (""); ++ ++ topbar_layout = g_strdup_printf ("appmnenu:%sclose", layout); ++ g_settings_set_string (self->wm_settings, ++ "button-layout", ++ topbar_layout); ++} ++ ++static void ++get_window_controls (CcMultitaskingPanel *self) ++{ ++ g_autofree gchar *layout = NULL; ++ ++ layout = g_settings_get_string (self->wm_settings, "button-layout"); ++ ++ g_signal_handlers_block_by_func (self->maximize_row, set_window_controls, self); ++ g_signal_handlers_block_by_func (self->minimize_row, set_window_controls, self); ++ ++ adw_switch_row_set_active (self->maximize_row, g_strrstr (layout, "maximize") != NULL); ++ adw_switch_row_set_active (self->minimize_row, g_strrstr (layout, "minimize") != NULL); ++ ++ g_signal_handlers_unblock_by_func (self->maximize_row, set_window_controls, self); ++ g_signal_handlers_unblock_by_func (self->minimize_row, set_window_controls, self); ++} ++ + /* GObject overrides */ + + static void +@@ -83,9 +127,13 @@ cc_multitasking_panel_class_init (CcMultitaskingPanelClass *klass) + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, fixed_workspaces_radio); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, hot_corner_row); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, hot_corner_switch); ++ gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, maximize_row); ++ gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, minimize_row); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, number_of_workspaces_spin_row); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_primary_display_radio); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_span_displays_radio); ++ ++ gtk_widget_class_bind_template_callback (widget_class, set_window_controls); + } + + static void +@@ -138,6 +186,12 @@ cc_multitasking_panel_init (CcMultitaskingPanel *self) + "value", + G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_NO_SENSITIVITY); + ++ g_signal_connect_swapped (self->wm_settings, ++ "changed::button-layout", ++ G_CALLBACK (get_window_controls), ++ self); ++ get_window_controls (self); ++ + self->shell_settings = g_settings_new ("org.gnome.shell.app-switcher"); + + if (g_settings_get_boolean (self->shell_settings, "current-workspace-only")) +diff --git a/panels/multitasking/cc-multitasking-panel.ui b/panels/multitasking/cc-multitasking-panel.ui +index 019e46430..5e2f5742a 100644 +--- a/panels/multitasking/cc-multitasking-panel.ui ++++ b/panels/multitasking/cc-multitasking-panel.ui +@@ -97,6 +97,27 @@ + + + ++ ++ ++ ++ Window Controls ++ ++ ++ True ++ _Maximize ++ ++ ++ ++ ++ ++ True ++ Minimi_ze ++ ++ ++ ++ ++ ++ + + + Multi-Monitor +-- +2.47.1 +