b5c970e13e
The bug that made the cups client in the panel crash is now fixed and the panel is finally usable
210 lines
8.8 KiB
Diff
210 lines
8.8 KiB
Diff
From 7611eb809fee7da48b255535695836f91b14e8e9 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
|
|
Date: Tue, 24 Aug 2021 18:25:05 +0200
|
|
Subject: [PATCH 2/8] display: Use ComboBox when folded
|
|
|
|
On small window sizes the ButtonBox can overflow the panel. This is
|
|
especially true in single display mode when no other elemnts prevent
|
|
shrinking to e.g. 360px width on phones. Use the ComboBox introduced in
|
|
632cb3c907922d4449e5758d218612ad5d8735c6 in these cases.
|
|
|
|
For that we introduce cc_display_settings_refresh_layout() to refresh
|
|
the layout when the folded state changes. This can later on be used for
|
|
more tweaks to shrink to smaller sizes.
|
|
---
|
|
panels/display/cc-display-panel.c | 19 ++++++-
|
|
panels/display/cc-display-settings.c | 84 +++++++++++++++-------------
|
|
panels/display/cc-display-settings.h | 2 +
|
|
3 files changed, 65 insertions(+), 40 deletions(-)
|
|
|
|
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
|
|
index f9d4ae044..91b3f3387 100644
|
|
--- a/panels/display/cc-display-panel.c
|
|
+++ b/panels/display/cc-display-panel.c
|
|
@@ -457,6 +457,7 @@ static void
|
|
cc_display_panel_dispose (GObject *object)
|
|
{
|
|
CcDisplayPanel *self = CC_DISPLAY_PANEL (object);
|
|
+ GtkWidget *toplevel = cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (self)));
|
|
|
|
reset_titlebar (CC_DISPLAY_PANEL (object));
|
|
|
|
@@ -474,6 +475,8 @@ cc_display_panel_dispose (GObject *object)
|
|
|
|
g_clear_pointer ((GtkWidget **) &self->night_light_dialog, gtk_widget_destroy);
|
|
|
|
+ g_signal_handlers_disconnect_by_data (toplevel, self);
|
|
+
|
|
G_OBJECT_CLASS (cc_display_panel_parent_class)->dispose (object);
|
|
}
|
|
|
|
@@ -645,12 +648,26 @@ on_primary_display_selected_index_changed_cb (CcDisplayPanel *panel)
|
|
update_apply_button (panel);
|
|
}
|
|
|
|
+static void
|
|
+on_toplevel_folded (CcDisplayPanel *panel, GParamSpec *pspec, GtkWidget *toplevel)
|
|
+{
|
|
+ gboolean folded;
|
|
+
|
|
+ g_object_get (toplevel, "folded", &folded, NULL);
|
|
+ cc_display_settings_refresh_layout (panel->settings, folded);
|
|
+}
|
|
+
|
|
static void
|
|
cc_display_panel_constructed (GObject *object)
|
|
{
|
|
+ GtkWidget *toplevel = cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (object)));
|
|
+
|
|
g_signal_connect_object (cc_panel_get_shell (CC_PANEL (object)), "notify::active-panel",
|
|
G_CALLBACK (active_panel_changed), object, G_CONNECT_SWAPPED);
|
|
|
|
+ g_signal_connect_swapped (toplevel, "notify::folded", G_CALLBACK (on_toplevel_folded), object);
|
|
+ on_toplevel_folded (CC_DISPLAY_PANEL (object), NULL, toplevel);
|
|
+
|
|
G_OBJECT_CLASS (cc_display_panel_parent_class)->constructed (object);
|
|
}
|
|
|
|
@@ -928,7 +945,7 @@ reset_current_config (CcDisplayPanel *panel)
|
|
|
|
if (!current)
|
|
return;
|
|
-
|
|
+
|
|
cc_display_config_set_minimum_size (current, MINIMUM_WIDTH, MINIMUM_HEIGHT);
|
|
panel->current_config = current;
|
|
|
|
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
|
|
index a4f914ecd..efda19473 100644
|
|
--- a/panels/display/cc-display-settings.c
|
|
+++ b/panels/display/cc-display-settings.c
|
|
@@ -35,6 +35,8 @@ struct _CcDisplaySettings
|
|
GtkDrawingArea object;
|
|
|
|
gboolean updating;
|
|
+ gboolean num_scales;
|
|
+ gboolean folded;
|
|
guint idle_udpate_id;
|
|
|
|
gboolean has_accelerometer;
|
|
@@ -393,57 +395,49 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
|
|
/* Scale row is usually shown. */
|
|
gtk_container_foreach (GTK_CONTAINER (self->scale_bbox), (GtkCallback) gtk_widget_destroy, NULL);
|
|
g_list_store_remove_all (self->scale_list);
|
|
- gtk_widget_set_visible (self->scale_buttons_row, FALSE);
|
|
- gtk_widget_set_visible (self->scale_combo_row, FALSE);
|
|
scales = cc_display_mode_get_supported_scales (current_mode);
|
|
+ self->num_scales = scales->len;
|
|
for (i = 0; i < scales->len; i++)
|
|
{
|
|
g_autofree gchar *scale_str = NULL;
|
|
+ g_autoptr(HdyValueObject) value_object = NULL;
|
|
double scale = g_array_index (scales, double, i);
|
|
+ GtkWidget *scale_btn;
|
|
gboolean is_selected;
|
|
|
|
+ /* ComboRow */
|
|
scale_str = make_scale_string (scale);
|
|
is_selected = G_APPROX_VALUE (cc_display_monitor_get_scale (self->selected_output),
|
|
scale, DBL_EPSILON);
|
|
|
|
- if (scales->len > MAX_SCALE_BUTTONS)
|
|
- {
|
|
- g_autoptr(HdyValueObject) value_object = NULL;
|
|
-
|
|
- value_object = hdy_value_object_new_collect (G_TYPE_STRING, scale_str);
|
|
- g_list_store_append (self->scale_list, value_object);
|
|
- g_object_set_data_full (G_OBJECT (value_object), "scale",
|
|
- g_memdup2 (&scale, sizeof (double)), g_free);
|
|
- if (is_selected)
|
|
- hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->scale_combo_row),
|
|
- g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) - 1);
|
|
- }
|
|
- else
|
|
- {
|
|
- GtkWidget *scale_btn = gtk_radio_button_new_with_label_from_widget (group, scale_str);
|
|
- g_object_set_data_full (G_OBJECT (scale_btn), "scale",
|
|
- g_memdup2 (&scale, sizeof (double)), g_free);
|
|
-
|
|
- if (!group)
|
|
- group = GTK_RADIO_BUTTON (scale_btn);
|
|
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (scale_btn), FALSE);
|
|
- gtk_widget_show (scale_btn);
|
|
- gtk_container_add (GTK_CONTAINER (self->scale_bbox), scale_btn);
|
|
- /* Set active before connecting the signal */
|
|
- if (is_selected)
|
|
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scale_btn), TRUE);
|
|
-
|
|
- g_signal_connect_object (scale_btn,
|
|
- "notify::active",
|
|
- G_CALLBACK (on_scale_btn_active_changed_cb),
|
|
- self, 0);
|
|
- }
|
|
+ value_object = hdy_value_object_new_collect (G_TYPE_STRING, scale_str);
|
|
+ g_list_store_append (self->scale_list, value_object);
|
|
+ g_object_set_data_full (G_OBJECT (value_object), "scale",
|
|
+ g_memdup2 (&scale, sizeof (double)), g_free);
|
|
+ if (is_selected)
|
|
+ hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->scale_combo_row),
|
|
+ g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) - 1);
|
|
+
|
|
+ /* ButtonBox */
|
|
+ scale_btn = gtk_radio_button_new_with_label_from_widget (group, scale_str);
|
|
+ g_object_set_data_full (G_OBJECT (scale_btn), "scale",
|
|
+ g_memdup2 (&scale, sizeof (double)), g_free);
|
|
+
|
|
+ if (!group)
|
|
+ group = GTK_RADIO_BUTTON (scale_btn);
|
|
+ gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (scale_btn), FALSE);
|
|
+ gtk_widget_show (scale_btn);
|
|
+ gtk_container_add (GTK_CONTAINER (self->scale_bbox), scale_btn);
|
|
+ /* Set active before connecting the signal */
|
|
+ if (is_selected)
|
|
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scale_btn), TRUE);
|
|
+
|
|
+ g_signal_connect_object (scale_btn,
|
|
+ "notify::active",
|
|
+ G_CALLBACK (on_scale_btn_active_changed_cb),
|
|
+ self, 0);
|
|
}
|
|
-
|
|
- if (scales->len > MAX_SCALE_BUTTONS)
|
|
- gtk_widget_set_visible (self->scale_combo_row, TRUE);
|
|
- else
|
|
- gtk_widget_set_visible (self->scale_buttons_row, scales->len > 1);
|
|
+ cc_display_settings_refresh_layout (self, self->folded);
|
|
|
|
gtk_widget_set_visible (self->underscanning_row,
|
|
cc_display_monitor_supports_underscanning (self->selected_output) &&
|
|
@@ -843,3 +837,15 @@ cc_display_settings_set_selected_output (CcDisplaySettings *self,
|
|
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_SELECTED_OUTPUT]);
|
|
}
|
|
|
|
+void
|
|
+cc_display_settings_refresh_layout (CcDisplaySettings *self,
|
|
+ gboolean folded)
|
|
+{
|
|
+ gboolean use_combo;
|
|
+
|
|
+ self->folded = folded;
|
|
+ use_combo = self->num_scales > MAX_SCALE_BUTTONS || (self->num_scales > 2 && folded);
|
|
+
|
|
+ gtk_widget_set_visible (self->scale_combo_row, use_combo);
|
|
+ gtk_widget_set_visible (self->scale_buttons_row, self->num_scales > 1 && !use_combo);
|
|
+}
|
|
diff --git a/panels/display/cc-display-settings.h b/panels/display/cc-display-settings.h
|
|
index 58709ddf7..de3c88d48 100644
|
|
--- a/panels/display/cc-display-settings.h
|
|
+++ b/panels/display/cc-display-settings.h
|
|
@@ -39,6 +39,8 @@ void cc_display_settings_set_config (CcDisplaySettings
|
|
CcDisplayMonitor* cc_display_settings_get_selected_output (CcDisplaySettings *settings);
|
|
void cc_display_settings_set_selected_output (CcDisplaySettings *settings,
|
|
CcDisplayMonitor *output);
|
|
+void cc_display_settings_refresh_layout (CcDisplaySettings *settings,
|
|
+ gboolean folded);
|
|
|
|
G_END_DECLS
|
|
|
|
--
|
|
2.25.1
|
|
|