Skip to content
Snippets Groups Projects
Commit a92dbe89 authored by Marco Trevisan (Treviño)'s avatar Marco Trevisan (Treviño)
Browse files

display: Don't disable fractional scaling immediately on integer changes

Ensure the user is requested to apply changes if the requested configuration
uses UI scaling and the current widget scaling value doesn't match the
requested one.

LP: #1887707
parent 0ffa0d3c
No related branches found
No related tags found
No related merge requests found
......@@ -9,41 +9,17 @@ Origin: https://gitlab.gnome.org/3v1n0/gnome-control-center/commits/layout-globa
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1820850
Forwarded: No, MPs will follow shortly
---
panels/display/cc-display-arrangement.c | 45 +++++++++++++++++++++++++++++----
panels/display/cc-display-config-dbus.c | 41 +++++++++++++++++++++++++++---
panels/display/cc-display-config.c | 6 +++++
panels/display/cc-display-config.h | 2 ++
4 files changed, 86 insertions(+), 8 deletions(-)
panels/display/cc-display-arrangement.c | 25 ++++++++++++++++----
panels/display/cc-display-config-dbus.c | 41 ++++++++++++++++++++++++++++++---
panels/display/cc-display-config.c | 26 +++++++++++++++++++++
panels/display/cc-display-config.h | 4 ++++
4 files changed, 88 insertions(+), 8 deletions(-)
diff --git a/panels/display/cc-display-arrangement.c b/panels/display/cc-display-arrangement.c
index adbbcbc..7080bf6 100644
index adbbcbc..9b3cdc8 100644
--- a/panels/display/cc-display-arrangement.c
+++ b/panels/display/cc-display-arrangement.c
@@ -95,10 +95,31 @@ apply_rotation_to_geometry (CcDisplayMonitor *output,
}
}
+static double
+get_maximum_scale (CcDisplayConfig *config)
+{
+ GList *outputs, *l;
+ double max_scale = 1.0;
+ outputs = cc_display_config_get_monitors (config);
+
+ for (l = outputs; l; l = l->next)
+ {
+ CcDisplayMonitor *output = l->data;
+
+ if (!cc_display_monitor_is_useful (output))
+ continue;
+
+ max_scale = MAX (max_scale, cc_display_monitor_get_scale (output));
+ }
+
+ return max_scale;
+}
+
/* get_geometry */
@@ -99,6 +99,7 @@ apply_rotation_to_geometry (CcDisplayMonitor *output,
static void
get_scaled_geometry (CcDisplayConfig *config,
CcDisplayMonitor *output,
......@@ -51,7 +27,7 @@ index adbbcbc..7080bf6 100644
int *x,
int *y,
int *w,
@@ -117,6 +138,10 @@ get_scaled_geometry (CcDisplayConfig *config,
@@ -117,6 +118,10 @@ get_scaled_geometry (CcDisplayConfig *config,
if (cc_display_config_is_layout_logical (config))
{
double scale = cc_display_monitor_get_scale (output);
......@@ -62,7 +38,7 @@ index adbbcbc..7080bf6 100644
*w = round (*w / scale);
*h = round (*h / scale);
}
@@ -134,6 +159,7 @@ get_bounding_box (CcDisplayConfig *config,
@@ -134,6 +139,7 @@ get_bounding_box (CcDisplayConfig *config,
gint *max_h)
{
GList *outputs, *l;
......@@ -70,15 +46,15 @@ index adbbcbc..7080bf6 100644
g_assert (x1 && y1 && x2 && y2);
@@ -141,6 +167,7 @@ get_bounding_box (CcDisplayConfig *config,
@@ -141,6 +147,7 @@ get_bounding_box (CcDisplayConfig *config,
*x2 = *y2 = G_MININT;
*max_w = 0;
*max_h = 0;
+ max_scale = get_maximum_scale (config);
+ max_scale = cc_display_config_get_maximum_scaling (config);
outputs = cc_display_config_get_monitors (config);
for (l = outputs; l; l = l->next)
@@ -151,7 +178,7 @@ get_bounding_box (CcDisplayConfig *config,
@@ -151,7 +158,7 @@ get_bounding_box (CcDisplayConfig *config,
if (!cc_display_monitor_is_useful (output))
continue;
......@@ -87,19 +63,19 @@ index adbbcbc..7080bf6 100644
*x1 = MIN (*x1, x);
*y1 = MIN (*y1, y);
@@ -171,8 +198,10 @@ monitor_get_drawing_rect (CcDisplayArrangement *self,
@@ -171,8 +178,10 @@ monitor_get_drawing_rect (CcDisplayArrangement *self,
gint *y2)
{
gdouble x, y;
+ gdouble max_scale;
- get_scaled_geometry (self->config, output, x1, y1, x2, y2);
+ max_scale = get_maximum_scale (self->config);
+ max_scale = cc_display_config_get_maximum_scaling (self->config);
+ get_scaled_geometry (self->config, output, max_scale, x1, y1, x2, y2);
/* get_scaled_geometry returns the width and height */
*x2 = *x1 + *x2;
@@ -325,10 +354,12 @@ find_best_snapping (CcDisplayConfig *config,
@@ -325,10 +334,12 @@ find_best_snapping (CcDisplayConfig *config,
GList *outputs, *l;
gint x1, y1, x2, y2;
gint w, h;
......@@ -108,12 +84,12 @@ index adbbcbc..7080bf6 100644
g_assert (snap_data != NULL);
- get_scaled_geometry (config, snap_output, &x1, &y1, &w, &h);
+ max_scale = get_maximum_scale (config);
+ max_scale = cc_display_config_get_maximum_scaling (config);
+ get_scaled_geometry (config, snap_output, max_scale, &x1, &y1, &w, &h);
x2 = x1 + w;
y2 = y1 + h;
@@ -344,6 +375,7 @@ find_best_snapping (CcDisplayConfig *config,
@@ -344,6 +355,7 @@ find_best_snapping (CcDisplayConfig *config,
gint left_snap_pos;
gint right_snap_pos;
gdouble dist_x, dist_y;
......@@ -121,17 +97,17 @@ index adbbcbc..7080bf6 100644
gdouble tmp;
if (output == snap_output)
@@ -352,7 +384,8 @@ find_best_snapping (CcDisplayConfig *config,
@@ -352,7 +364,8 @@ find_best_snapping (CcDisplayConfig *config,
if (!cc_display_monitor_is_useful (output))
continue;
- get_scaled_geometry (config, output, &_x1, &_y1, &_w, &_h);
+ max_scale = get_maximum_scale (config);
+ max_scale = cc_display_config_get_maximum_scaling (config);
+ get_scaled_geometry (config, output, max_scale, &_x1, &_y1, &_w, &_h);
_x2 = _x1 + _w;
_y2 = _y1 + _h;
@@ -965,6 +998,7 @@ cc_display_config_snap_output (CcDisplayConfig *config,
@@ -965,6 +978,7 @@ cc_display_config_snap_output (CcDisplayConfig *config,
{
SnapData snap_data;
gint x, y, w, h;
......@@ -139,12 +115,12 @@ index adbbcbc..7080bf6 100644
if (!cc_display_monitor_is_useful (output))
return;
@@ -972,7 +1006,8 @@ cc_display_config_snap_output (CcDisplayConfig *config,
@@ -972,7 +986,8 @@ cc_display_config_snap_output (CcDisplayConfig *config,
if (cc_display_config_count_useful_monitors (config) <= 1)
return;
- get_scaled_geometry (config, output, &x, &y, &w, &h);
+ max_scale = get_maximum_scale (config);
+ max_scale = cc_display_config_get_maximum_scaling (config);
+ get_scaled_geometry (config, output, max_scale, &x, &y, &w, &h);
snap_data.snapped = SNAP_DIR_NONE;
......@@ -237,10 +213,10 @@ index aa7c673..fc050a3 100644
return width;
}
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
index 80aabc4..2a8907b 100644
index 80aabc4..552a1a6 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
@@ -627,3 +627,9 @@ cc_display_config_is_scaled_mode_valid (CcDisplayConfig *self,
@@ -627,3 +627,29 @@ cc_display_config_is_scaled_mode_valid (CcDisplayConfig *self,
g_return_val_if_fail (CC_IS_DISPLAY_MODE (mode), FALSE);
return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_scaled_mode_valid (self, mode, scale);
}
......@@ -250,8 +226,28 @@ index 80aabc4..2a8907b 100644
+{
+ return CC_DISPLAY_CONFIG_GET_CLASS (self)->layout_use_ui_scale (self);
+}
+
+double
+cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
+{
+ GList *outputs, *l;
+ double max_scale = 1.0;
+ outputs = cc_display_config_get_monitors (self);
+
+ for (l = outputs; l; l = l->next)
+ {
+ CcDisplayMonitor *output = l->data;
+
+ if (!cc_display_monitor_is_useful (output))
+ continue;
+
+ max_scale = MAX (max_scale, cc_display_monitor_get_scale (output));
+ }
+
+ return max_scale;
+}
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
index ef4332f..2f246ff 100644
index ef4332f..1361f16 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -160,6 +160,7 @@ struct _CcDisplayConfigClass
......@@ -262,11 +258,13 @@ index ef4332f..2f246ff 100644
};
@@ -186,6 +187,7 @@ void cc_display_config_set_minimum_size (CcDisplayConfig
@@ -186,6 +187,9 @@ void cc_display_config_set_minimum_size (CcDisplayConfig
gboolean cc_display_config_is_scaled_mode_valid (CcDisplayConfig *self,
CcDisplayMode *mode,
double scale);
+gboolean cc_display_config_layout_use_ui_scale (CcDisplayConfig *self);
+
+double cc_display_config_get_maximum_scaling (CcDisplayConfig *self);
const char* cc_display_monitor_get_display_name (CcDisplayMonitor *monitor);
gboolean cc_display_monitor_is_active (CcDisplayMonitor *monitor);
......@@ -3,14 +3,70 @@ Date: Sun, 15 Mar 2020 09:07:51 +0100
Subject: [PATCH 24/26] display: Allow fractional scaling to be enabled
---
panels/display/cc-display-config.c | 218 ++++++++++++++++++++++++++++++++++
panels/display/cc-display-config.h | 4 +
panels/display/cc-display-settings.c | 28 ++++-
panels/display/cc-display-settings.ui | 16 +++
4 files changed, 265 insertions(+), 1 deletion(-)
panels/display/cc-display-config-dbus.c | 16 +++
panels/display/cc-display-config.c | 237 ++++++++++++++++++++++++++++++++
panels/display/cc-display-config.h | 5 +
panels/display/cc-display-settings.c | 28 +++-
panels/display/cc-display-settings.ui | 16 +++
5 files changed, 301 insertions(+), 1 deletion(-)
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
index fc050a3..7eda67a 100644
--- a/panels/display/cc-display-config-dbus.c
+++ b/panels/display/cc-display-config-dbus.c
@@ -887,6 +887,7 @@ struct _CcDisplayConfigDBus
gboolean supports_changing_layout_mode;
gboolean global_scale_required;
CcDisplayLayoutMode layout_mode;
+ gint legacy_ui_scale;
GList *monitors;
CcDisplayMonitorDBus *primary;
@@ -1059,6 +1060,9 @@ cc_display_config_dbus_equal (CcDisplayConfig *pself,
g_return_val_if_fail (pself, FALSE);
g_return_val_if_fail (pother, FALSE);
+ if (self->layout_mode != other->layout_mode)
+ return FALSE;
+
cc_display_config_dbus_ensure_non_offset_coords (self);
cc_display_config_dbus_ensure_non_offset_coords (other);
@@ -1215,6 +1219,13 @@ cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
}
+static gint
+cc_display_config_dbus_get_legacy_ui_scale (CcDisplayConfig *pself)
+{
+ CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
+ return self->legacy_ui_scale;
+}
+
static gboolean
is_scaled_mode_allowed (CcDisplayConfigDBus *self,
CcDisplayMode *pmode,
@@ -1469,6 +1480,10 @@ cc_display_config_dbus_constructed (GObject *object)
{
g_variant_get (v, "b", &self->global_scale_required);
}
+ else if (g_str_equal (s, "legacy-ui-scaling-factor"))
+ {
+ g_variant_get (v, "i", &self->legacy_ui_scale);
+ }
else if (g_str_equal (s, "layout-mode"))
{
guint32 u = 0;
@@ -1565,6 +1580,7 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
parent_class->is_scaled_mode_valid = cc_display_config_dbus_is_scaled_mode_valid;
parent_class->set_minimum_size = cc_display_config_dbus_set_minimum_size;
parent_class->layout_use_ui_scale = cc_display_config_dbus_layout_use_ui_scale;
+ parent_class->get_legacy_ui_scale = cc_display_config_dbus_get_legacy_ui_scale;
pspec = g_param_spec_variant ("state",
"GVariant",
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
index 2a8907b..441960a 100644
index 552a1a6..2ff5a06 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
@@ -17,10 +17,23 @@
......@@ -176,10 +232,16 @@ index 2a8907b..441960a 100644
return CC_DISPLAY_CONFIG_GET_CLASS (self)->apply (self, error);
}
@@ -618,13 +719,25 @@ cc_display_config_set_minimum_size (CcDisplayConfig *self,
@@ -618,13 +719,31 @@ cc_display_config_set_minimum_size (CcDisplayConfig *self,
CC_DISPLAY_CONFIG_GET_CLASS (self)->set_minimum_size (self, width, height);
}
+gint
+cc_display_config_get_legacy_ui_scale (CcDisplayConfig *self)
+{
+ return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_legacy_ui_scale (self);
+}
+
+static gboolean
+scale_value_is_fractional (double scale)
+{
......@@ -202,9 +264,9 @@ index 2a8907b..441960a 100644
return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_scaled_mode_valid (self, mode, scale);
}
@@ -633,3 +746,108 @@ cc_display_config_layout_use_ui_scale (CcDisplayConfig *self)
{
return CC_DISPLAY_CONFIG_GET_CLASS (self)->layout_use_ui_scale (self);
@@ -653,3 +772,121 @@ cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
return max_scale;
}
+
+static gboolean
......@@ -297,9 +359,22 @@ index 2a8907b..441960a 100644
+
+ if (!set_monitors_scaling_to_preferred_integers (self))
+ {
+ priv->fractional_scaling_pending_disable = FALSE;
+ reset_monitors_scaling_to_selected_values (self);
+ set_fractional_scaling_active (self, enabled);
+ gboolean disable_now = FALSE;
+
+ if (cc_display_config_layout_use_ui_scale (self))
+ {
+ disable_now =
+ G_APPROX_VALUE (cc_display_config_get_legacy_ui_scale (self),
+ cc_display_config_get_maximum_scaling (self),
+ DBL_EPSILON);
+ }
+
+ if (disable_now)
+ {
+ priv->fractional_scaling_pending_disable = FALSE;
+ reset_monitors_scaling_to_selected_values (self);
+ set_fractional_scaling_active (self, enabled);
+ }
+ }
+ }
+}
......@@ -312,20 +387,30 @@ index 2a8907b..441960a 100644
+ return priv->fractional_scaling;
+}
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
index 2f246ff..65719c8 100644
index 1361f16..4a1548e 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -189,6 +189,10 @@ gboolean cc_display_config_is_scaled_mode_valid (CcDisplayConfig
@@ -161,6 +161,7 @@ struct _CcDisplayConfigClass
CcDisplayMode *mode,
double scale);
gboolean (*layout_use_ui_scale) (CcDisplayConfig *self);
+ gint (*get_legacy_ui_scale) (CcDisplayConfig *self);
};
@@ -188,8 +189,12 @@ gboolean cc_display_config_is_scaled_mode_valid (CcDisplayConfig
CcDisplayMode *mode,
double scale);
gboolean cc_display_config_layout_use_ui_scale (CcDisplayConfig *self);
+gint cc_display_config_get_legacy_ui_scale (CcDisplayConfig *self);
double cc_display_config_get_maximum_scaling (CcDisplayConfig *self);
+void cc_display_config_set_fractional_scaling (CcDisplayConfig *self,
+ gboolean enabled);
+gboolean cc_display_config_get_fractional_scaling (CcDisplayConfig *self);
+
const char* cc_display_monitor_get_display_name (CcDisplayMonitor *monitor);
gboolean cc_display_monitor_is_active (CcDisplayMonitor *monitor);
void cc_display_monitor_set_active (CcDisplayMonitor *monitor,
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
index d793fcc..947335a 100644
--- a/panels/display/cc-display-settings.c
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment