Newer
Older
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Marco Trevisan (Treviño)
committed
Date: Wed, 27 Mar 2019 05:42:41 +0100
Robert Ancell
committed
Subject: [PATCH 19/26] display: Support UI scaled logical monitor mode
Marco Trevisan (Treviño)
committed
When this mode is selected we need to assume that all the monitors are scaled
by their scaling and the global UI scale.
Origin: https://gitlab.gnome.org/3v1n0/gnome-control-center/commits/layout-global-scale
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1820850
Forwarded: No, MPs will follow shortly
---
Marco Trevisan (Treviño)
committed
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(-)
Marco Trevisan (Treviño)
committed
diff --git a/panels/display/cc-display-arrangement.c b/panels/display/cc-display-arrangement.c
Marco Trevisan (Treviño)
committed
index adbbcbc..9b3cdc8 100644
--- a/panels/display/cc-display-arrangement.c
+++ b/panels/display/cc-display-arrangement.c
Marco Trevisan (Treviño)
committed
@@ -99,6 +99,7 @@ apply_rotation_to_geometry (CcDisplayMonitor *output,
Marco Trevisan (Treviño)
committed
static void
get_scaled_geometry (CcDisplayConfig *config,
CcDisplayMonitor *output,
+ double max_scale,
int *x,
int *y,
int *w,
Marco Trevisan (Treviño)
committed
@@ -117,6 +118,10 @@ get_scaled_geometry (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
if (cc_display_config_is_layout_logical (config))
{
double scale = cc_display_monitor_get_scale (output);
+
+ if (cc_display_config_layout_use_ui_scale (config))
Marco Trevisan (Treviño)
committed
+ scale /= ceil (max_scale);
Marco Trevisan (Treviño)
committed
+
*w = round (*w / scale);
*h = round (*h / scale);
}
Marco Trevisan (Treviño)
committed
@@ -134,6 +139,7 @@ get_bounding_box (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
gint *max_h)
{
GList *outputs, *l;
+ gdouble max_scale;
g_assert (x1 && y1 && x2 && y2);
Marco Trevisan (Treviño)
committed
@@ -141,6 +147,7 @@ get_bounding_box (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
*x2 = *y2 = G_MININT;
*max_w = 0;
*max_h = 0;
Marco Trevisan (Treviño)
committed
+ max_scale = cc_display_config_get_maximum_scaling (config);
Marco Trevisan (Treviño)
committed
outputs = cc_display_config_get_monitors (config);
for (l = outputs; l; l = l->next)
Marco Trevisan (Treviño)
committed
@@ -151,7 +158,7 @@ get_bounding_box (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
if (!cc_display_monitor_is_useful (output))
continue;
- get_scaled_geometry (config, output, &x, &y, &w, &h);
+ get_scaled_geometry (config, output, max_scale, &x, &y, &w, &h);
*x1 = MIN (*x1, x);
*y1 = MIN (*y1, y);
Marco Trevisan (Treviño)
committed
@@ -171,8 +178,10 @@ monitor_get_drawing_rect (CcDisplayArrangement *self,
Marco Trevisan (Treviño)
committed
gint *y2)
{
gdouble x, y;
+ gdouble max_scale;
- get_scaled_geometry (self->config, output, x1, y1, x2, y2);
Marco Trevisan (Treviño)
committed
+ max_scale = cc_display_config_get_maximum_scaling (self->config);
Marco Trevisan (Treviño)
committed
+ get_scaled_geometry (self->config, output, max_scale, x1, y1, x2, y2);
/* get_scaled_geometry returns the width and height */
*x2 = *x1 + *x2;
Marco Trevisan (Treviño)
committed
@@ -325,10 +334,12 @@ find_best_snapping (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
GList *outputs, *l;
gint x1, y1, x2, y2;
gint w, h;
+ double max_scale;
g_assert (snap_data != NULL);
- get_scaled_geometry (config, snap_output, &x1, &y1, &w, &h);
Marco Trevisan (Treviño)
committed
+ max_scale = cc_display_config_get_maximum_scaling (config);
Marco Trevisan (Treviño)
committed
+ get_scaled_geometry (config, snap_output, max_scale, &x1, &y1, &w, &h);
x2 = x1 + w;
y2 = y1 + h;
Marco Trevisan (Treviño)
committed
@@ -344,6 +355,7 @@ find_best_snapping (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
gint left_snap_pos;
gint right_snap_pos;
gdouble dist_x, dist_y;
+ gdouble max_scale;
gdouble tmp;
if (output == snap_output)
Marco Trevisan (Treviño)
committed
@@ -352,7 +364,8 @@ find_best_snapping (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
if (!cc_display_monitor_is_useful (output))
continue;
- get_scaled_geometry (config, output, &_x1, &_y1, &_w, &_h);
Marco Trevisan (Treviño)
committed
+ max_scale = cc_display_config_get_maximum_scaling (config);
Marco Trevisan (Treviño)
committed
+ get_scaled_geometry (config, output, max_scale, &_x1, &_y1, &_w, &_h);
_x2 = _x1 + _w;
_y2 = _y1 + _h;
Marco Trevisan (Treviño)
committed
@@ -965,6 +978,7 @@ cc_display_config_snap_output (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
{
SnapData snap_data;
gint x, y, w, h;
+ gdouble max_scale;
if (!cc_display_monitor_is_useful (output))
return;
Marco Trevisan (Treviño)
committed
@@ -972,7 +986,8 @@ cc_display_config_snap_output (CcDisplayConfig *config,
Marco Trevisan (Treviño)
committed
if (cc_display_config_count_useful_monitors (config) <= 1)
return;
- get_scaled_geometry (config, output, &x, &y, &w, &h);
Marco Trevisan (Treviño)
committed
+ max_scale = cc_display_config_get_maximum_scaling (config);
Marco Trevisan (Treviño)
committed
+ get_scaled_geometry (config, output, max_scale, &x, &y, &w, &h);
snap_data.snapped = SNAP_DIR_NONE;
snap_data.mon_x = x;
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
index aa7c673..fc050a3 100644
--- a/panels/display/cc-display-config-dbus.c
+++ b/panels/display/cc-display-config-dbus.c
@@ -861,7 +861,8 @@ cc_display_monitor_dbus_new (GVariant *variant,
Marco Trevisan (Treviño)
committed
typedef enum _CcDisplayLayoutMode
{
CC_DISPLAY_LAYOUT_MODE_LOGICAL = 1,
- CC_DISPLAY_LAYOUT_MODE_PHYSICAL = 2
+ CC_DISPLAY_LAYOUT_MODE_PHYSICAL = 2,
+ CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL = 3
} CcDisplayLayoutMode;
typedef enum _CcDisplayConfigMethod
@@ -1203,7 +1204,15 @@ cc_display_config_dbus_is_layout_logical (CcDisplayConfig *pself)
Marco Trevisan (Treviño)
committed
{
CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
- return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL;
+ return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL ||
+ self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
+}
+
+static gboolean
+cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
+{
+ CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
+ return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
}
@@ -1465,7 +1474,7 @@ cc_display_config_dbus_constructed (GObject *object)
Marco Trevisan (Treviño)
committed
guint32 u = 0;
g_variant_get (v, "u", &u);
if (u >= CC_DISPLAY_LAYOUT_MODE_LOGICAL &&
- u <= CC_DISPLAY_LAYOUT_MODE_PHYSICAL)
+ u <= CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
self->layout_mode = u;
}
}
@@ -1555,6 +1564,7 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
Marco Trevisan (Treviño)
committed
parent_class->is_layout_logical = cc_display_config_dbus_is_layout_logical;
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;
Marco Trevisan (Treviño)
committed
+ parent_class->layout_use_ui_scale = cc_display_config_dbus_layout_use_ui_scale;
pspec = g_param_spec_variant ("state",
"GVariant",
@@ -1615,6 +1625,26 @@ logical_monitor_is_rotated (CcDisplayLogicalMonitor *lm)
Marco Trevisan (Treviño)
committed
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
}
}
+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;
+}
+
static int
logical_monitor_width (CcDisplayLogicalMonitor *lm)
{
@@ -1633,6 +1663,11 @@ logical_monitor_width (CcDisplayLogicalMonitor *lm)
Marco Trevisan (Treviño)
committed
if (monitor->config->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL)
return round (width / lm->scale);
+ if (monitor->config->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
+ {
+ double max_scale = get_maximum_scale(CC_DISPLAY_CONFIG (monitor->config));
+ return round ((width * ceil (max_scale)) / lm->scale);
+ }
else
return width;
}
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
Marco Trevisan (Treviño)
committed
index 80aabc4..552a1a6 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
Marco Trevisan (Treviño)
committed
@@ -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);
Marco Trevisan (Treviño)
committed
}
+
+gboolean
+cc_display_config_layout_use_ui_scale (CcDisplayConfig *self)
+{
+ return CC_DISPLAY_CONFIG_GET_CLASS (self)->layout_use_ui_scale (self);
+}
Marco Trevisan (Treviño)
committed
+
+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
Marco Trevisan (Treviño)
committed
index ef4332f..1361f16 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -160,6 +160,7 @@ struct _CcDisplayConfigClass
gboolean (*is_scaled_mode_valid) (CcDisplayConfig *self,
CcDisplayMode *mode,
double scale);
Marco Trevisan (Treviño)
committed
+ gboolean (*layout_use_ui_scale) (CcDisplayConfig *self);
};
Marco Trevisan (Treviño)
committed
@@ -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);
Marco Trevisan (Treviño)
committed
+gboolean cc_display_config_layout_use_ui_scale (CcDisplayConfig *self);
Marco Trevisan (Treviño)
committed
+
+double cc_display_config_get_maximum_scaling (CcDisplayConfig *self);
Marco Trevisan (Treviño)
committed
const char* cc_display_monitor_get_display_name (CcDisplayMonitor *monitor);
gboolean cc_display_monitor_is_active (CcDisplayMonitor *monitor);