Marco Trevisan (Treviño) has proposed merging
~3v1n0/ubuntu/+source/mutter:ubuntu/xrandr-scaling into
~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master.
Requested reviews:
Ubuntu Desktop (ubuntu-desktop)
Related bugs:
Bug #1822616 in budgie-desktop (Ubuntu): "[regression][nvidia]
gnome-shell/budgie-wm crashed with SIGABRT "assertion failed: (width > 0 &&
height > 0 && scale > 0)" in meta_monitor_manager_xrandr_update_screen_size"
https://bugs.launchpad.net/ubuntu/+source/budgie-desktop/+bug/1822616
Bug #1823485 in mutter (Ubuntu): "X11: switching integer scaling values when
fractional is enabled doesn't always work"
https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1823485
For more details, see:
https://code.launchpad.net/~3v1n0/ubuntu/+source/mutter/+git/mutter/+merge/365624
--
Your team Ubuntu Desktop is requested to review the proposed merge of
~3v1n0/ubuntu/+source/mutter:ubuntu/xrandr-scaling into
~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master.
diff --git a/debian/changelog b/debian/changelog
index 67c17c0..f60a939 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,10 @@ mutter (3.32.0-1ubuntu2) UNRELEASED; urgency=medium
* debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch:
- Don't invert the screen size when rotation is enabled (LP: #1822513)
- Remove unneeded cleanup changes
+ - Update screen size only after monitors modes have been derived
+ (LP: #1822616)
+ - Trigger a monitors rebuild only if scale has changed (LP: #1823485)
+ - Only update UI scaling when output scaling is enabled (LP: #1822478)
-- Marco Trevisan (Treviño) <[email protected]> Wed, 03 Apr 2019 19:19:59 -0400
diff --git a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
index ea6c35f..28df9a3 100644
--- a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
+++ b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
@@ -5,7 +5,6 @@ MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
-commit ed760c44b1998fc5fadde18186c51e74525038cc
Author: Marco Trevisan (Treviño) <[email protected]>
Date: Wed Apr 3 18:57:28 2019 -0400
@@ -19,31 +18,31 @@ Forwarded: No, forwarding is in progress and planned though
data/org.gnome.mutter.gschema.xml.in | 5 +
data/org.gnome.mutter.x11.gschema.xml.in | 30 ++
src/backends/meta-crtc.h | 1 +
- src/backends/meta-monitor-config-manager.c | 150 +++++++++-
+ src/backends/meta-monitor-config-manager.c | 150 +++++++-
src/backends/meta-monitor-config-migration.c | 15 +-
src/backends/meta-monitor-config-store.c | 1 +
src/backends/meta-monitor-manager-dummy.c | 24 +-
- src/backends/meta-monitor-manager-private.h | 28 +-
- src/backends/meta-monitor-manager.c | 349 ++++++++++++++++++---
- src/backends/meta-monitor.c | 60 ++--
+ src/backends/meta-monitor-manager-private.h | 34 +-
+ src/backends/meta-monitor-manager.c | 353 ++++++++++++++++--
+ src/backends/meta-monitor.c | 60 +--
src/backends/meta-monitor.h | 6 +-
src/backends/meta-settings-private.h | 9 +
- src/backends/meta-settings.c | 76 ++++-
+ src/backends/meta-settings.c | 76 +++-
src/backends/native/meta-monitor-manager-kms.c | 44 ++-
- src/backends/x11/meta-crtc-xrandr.c | 87 +++++-
+ src/backends/x11/meta-crtc-xrandr.c | 87 ++++-
src/backends/x11/meta-crtc-xrandr.h | 13 +-
- src/backends/x11/meta-gpu-xrandr.c | 89 +++++-
+ src/backends/x11/meta-gpu-xrandr.c | 89 ++++-
src/backends/x11/meta-gpu-xrandr.h | 4 +
- src/backends/x11/meta-monitor-manager-xrandr.c | 399 +++++++++++++++++--------
+ src/backends/x11/meta-monitor-manager-xrandr.c | 493 ++++++++++++++++++-------
src/backends/x11/meta-monitor-manager-xrandr.h | 4 +-
src/backends/x11/meta-output-xrandr.c | 5 +-
- src/compositor/compositor.c | 54 ++++
+ src/compositor/compositor.c | 54 +++
src/core/boxes-private.h | 4 +
src/core/boxes.c | 21 ++
- src/core/window.c | 19 ++
+ src/core/window.c | 19 +
src/org.gnome.Mutter.DisplayConfig.xml | 5 +
src/tests/meta-monitor-manager-test.c | 14 +-
- 28 files changed, 1269 insertions(+), 254 deletions(-)
+ 28 files changed, 1367 insertions(+), 260 deletions(-)
create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in
diff --git a/data/meson.build b/data/meson.build
@@ -630,7 +629,7 @@ index 46c3b8c..29fde36 100644
settings,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER))
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
-index 3b951c6..3b375a0 100644
+index 3b951c6..2ba9ced 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -44,7 +44,9 @@ typedef enum _MetaMonitorManagerCapability
@@ -670,7 +669,27 @@ index 3b951c6..3b375a0 100644
GList *logical_monitors;
MetaLogicalMonitor *primary_logical_monitor;
-@@ -229,9 +234,10 @@ struct _MetaMonitorManagerClass
+@@ -156,6 +161,9 @@ struct _MetaMonitorManager
+ * @apply_monitors_config: Tries to apply the given config using the given
+ * method. Throws an error if something went wrong.
+ *
++ * @update_screen_size_derived: Computes the screen size for derived
++ * configuration.
++ *
+ * @set_power_save_mode: Sets the #MetaPowerSave mode (for all displays).
+ *
+ * @change_backlight: Changes the backlight intensity to the given value (in
+@@ -199,6 +207,9 @@ struct _MetaMonitorManagerClass
+ MetaMonitorsConfigMethod ,
+ GError **);
+
++ void (*update_screen_size_derived) (MetaMonitorManager *,
++ MetaMonitorsConfig *);
++
+ void (*set_power_save_mode) (MetaMonitorManager *,
+ MetaPowerSave);
+
+@@ -229,9 +240,10 @@ struct _MetaMonitorManagerClass
MetaCrtc *,
MetaMonitorTransform);
@@ -684,7 +703,7 @@ index 3b951c6..3b375a0 100644
float * (*calculate_supported_scales) (MetaMonitorManager *,
MetaLogicalMonitorLayoutMode ,
-@@ -350,9 +356,10 @@ void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManage
+@@ -350,9 +362,10 @@ void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManage
gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager);
@@ -698,7 +717,7 @@ index 3b951c6..3b375a0 100644
float * meta_monitor_manager_calculate_supported_scales (MetaMonitorManager *,
MetaLogicalMonitorLayoutMode ,
-@@ -366,6 +373,11 @@ gboolean meta_monitor_manager_is_scale_supported (MetaMonitorManager
+@@ -366,6 +379,11 @@ gboolean meta_monitor_manager_is_scale_supported (MetaMonitorManager
MetaMonitorMode *monitor_mode,
float scale);
@@ -711,7 +730,7 @@ index 3b951c6..3b375a0 100644
meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
-index c4ed245..8b5b983 100644
+index c4ed245..d055eec 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -104,8 +104,18 @@ static gboolean
@@ -1268,6 +1287,21 @@ index c4ed245..8b5b983 100644
meta_monitor_manager_rebuild_logical_monitors_derived (manager, config);
}
+@@ -2910,10 +3181,14 @@ void
+ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
+ MetaMonitorsConfig *config)
+ {
++ MetaMonitorManagerClass *klass = META_MONITOR_MANAGER_GET_CLASS (manager);
+ GList *old_logical_monitors;
+
+ meta_monitor_manager_update_monitor_modes_derived (manager);
+
++ if (klass->update_screen_size_derived)
++ klass->update_screen_size_derived (manager, config);
++
+ if (manager->in_init)
+ return;
+
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 22a3e45..d1f73a1 100644
--- a/src/backends/meta-monitor.c
@@ -1996,7 +2030,7 @@ index aad49d0..4ac32b9 100644
int *max_width,
int *max_height);
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
-index 784bbde..47d19d6 100644
+index 784bbde..3502ddf 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -63,6 +63,9 @@
@@ -2099,9 +2133,37 @@ index 784bbde..47d19d6 100644
static xcb_randr_rotation_t
meta_monitor_transform_to_xrandr (MetaMonitorTransform transform)
{
-@@ -204,9 +256,10 @@ xrandr_set_crtc_config (MetaMonitorManagerXrandr *manager_xrandr,
+@@ -203,13 +255,45 @@ xrandr_set_crtc_config (MetaMonitorManagerXrandr *manager_xrandr,
+ return TRUE;
}
++static float
++get_maximum_crtc_info_scale (MetaCrtcInfo **crtc_infos,
++ unsigned int n_crtc_infos,
++ unsigned int *valid_crtcs)
++{
++ float max_scale = 1.0f;
++ unsigned int i;
++
++ if (valid_crtcs)
++ valid_crtcs = 0;
++
++ for (i = 0; i < n_crtc_infos; i++)
++ {
++ MetaCrtcInfo *crtc_info = crtc_infos[i];
++
++ if (crtc_info->mode == NULL)
++ continue;
++
++ if (valid_crtcs)
++ (*valid_crtcs)++;
++
++ max_scale = MAX (max_scale, crtc_info->scale);
++ }
++
++ return max_scale;
++}
++
static gboolean
-is_crtc_assignment_changed (MetaCrtc *crtc,
- MetaCrtcInfo **crtc_infos,
@@ -2111,23 +2173,54 @@ index 784bbde..47d19d6 100644
+ MetaCrtcInfo **crtc_infos,
+ unsigned int n_crtc_infos)
{
++ gboolean have_scaling;
unsigned int i;
-@@ -230,6 +283,13 @@ is_crtc_assignment_changed (MetaCrtc *crtc,
++ have_scaling = meta_monitor_manager_get_capabilities (monitor_manager) &
++ META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING;
++
+ for (i = 0; i < n_crtc_infos; i++)
+ {
+ MetaCrtcInfo *crtc_info = crtc_infos[i];
+@@ -230,6 +314,37 @@ is_crtc_assignment_changed (MetaCrtc *crtc,
if (crtc->transform != crtc_info->transform)
return TRUE;
-+ if ((meta_monitor_manager_get_capabilities (monitor_manager) &
-+ META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING))
++ if (have_scaling)
+ {
-+ if (fabs (crtc->scale - crtc_info->scale) > 0.001)
++ float crtc_scale = crtc->scale;
++ float req_output_scale = crtc_info->scale;
++ MetaLogicalMonitorLayoutMode layout_mode =
++ meta_monitor_manager_get_default_layout_mode (monitor_manager);
++
++ if (layout_mode == META_LOGICAL_MONITOR_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
++ {
++ float max_crtc_scale =
++ meta_monitor_manager_get_maximum_crtc_scale (monitor_manager);
++ float max_req_scale =
++ get_maximum_crtc_info_scale (crtc_infos, n_crtc_infos, NULL);
++
++ /* In scale ui-down mode we need to check if the actual output
++ * scale that will be applied to the crtc has actually changed
++ * from the current value, so we need to compare the current crtc
++ * scale with the scale that will be applied taking care of the
++ * UI scale (max crtc scale) and of the requested maximum scale.
++ * If we don't do this, we'd try to call randr calls which won't
++ * ever trigger a RRScreenChangeNotify, as no actual change is
++ * needed, and thus we won't ever emit a monitors-changed signal.
++ */
++ crtc_scale /= ceilf (max_crtc_scale);
++ req_output_scale /= ceilf (max_req_scale);
++ }
++
++ if (fabs (crtc_scale - req_output_scale) > 0.001)
+ return TRUE;
+ }
+
for (j = 0; j < crtc_info->outputs->len; j++)
{
MetaOutput *output = ((MetaOutput**) crtc_info->outputs->pdata)[j];
-@@ -315,7 +375,7 @@ is_assignments_changed (MetaMonitorManager *manager,
+@@ -315,7 +430,7 @@ is_assignments_changed (MetaMonitorManager *manager,
{
MetaCrtc *crtc = l->data;
@@ -2136,7 +2229,40 @@ index 784bbde..47d19d6 100644
return TRUE;
}
-@@ -343,33 +403,67 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -331,6 +446,32 @@ is_assignments_changed (MetaMonitorManager *manager,
+ return TRUE;
+ }
+
++ if (meta_monitor_manager_get_default_layout_mode (manager) ==
++ META_LOGICAL_MONITOR_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
++ {
++ /* If nothing has changed, ensure that the crtc logical scaling matches
++ * with the requested one, as in case of global UI logical layout we might
++ * assume that it is in fact equal, while it's techincally different.
++ * Not doing this would then cause a wrong computation of the max crtc
++ * scale and thus of the UI scaling. */
++ for (l = meta_gpu_get_crtcs (manager_xrandr->gpu); l; l = l->next)
++ {
++ MetaCrtc *crtc = l->data;
++ unsigned int i;
++
++ for (i = 0; i < n_crtc_infos; i++)
++ {
++ MetaCrtcInfo *crtc_info = crtc_infos[i];
++
++ if (crtc_info->crtc == crtc)
++ {
++ crtc->scale = crtc_info->scale;
++ break;
++ }
++ }
++ }
++ }
++
+ return FALSE;
+ }
+
+@@ -343,33 +484,57 @@ apply_crtc_assignments (MetaMonitorManager *manager,
unsigned int n_outputs)
{
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
@@ -2158,18 +2284,8 @@ index 784bbde..47d19d6 100644
+ have_scaling = meta_monitor_manager_get_capabilities (manager) &
+ META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING;
+
-+ valid_crtcs = 0;
-+ max_scale = 1.0f;
-+ for (i = 0; i < n_crtcs; i++)
-+ {
-+ MetaCrtcInfo *crtc_info = crtcs[i];
-+
-+ if (crtc_info->mode == NULL)
-+ continue;
-+
-+ valid_crtcs++;
-+ max_scale = MAX (max_scale, crtc_info->scale);
-+ }
++ valid_crtcs = 1.0f;
++ max_scale = get_maximum_crtc_info_scale (crtcs, n_crtcs, &valid_crtcs);
+
+ /* Compute the new size of the screen (framebuffer) */
width = 0; height = 0;
@@ -2211,11 +2327,13 @@ index 784bbde..47d19d6 100644
}
/* Second disable all newly disabled CRTCs, or CRTCs that in the previous
-@@ -394,12 +488,14 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -394,12 +559,16 @@ apply_crtc_assignments (MetaMonitorManager *manager,
0, 0, XCB_NONE,
XCB_RANDR_ROTATION_ROTATE_0,
NULL, 0);
-+ meta_crtc_xrandr_set_scale (crtc, (xcb_randr_crtc_t) crtc->crtc_id, 1);
++ if (have_scaling)
++ meta_crtc_xrandr_set_scale (crtc,
++ (xcb_randr_crtc_t) crtc->crtc_id, 1.0f);
crtc->rect.x = 0;
crtc->rect.y = 0;
@@ -2226,11 +2344,13 @@ index 784bbde..47d19d6 100644
}
}
-@@ -424,25 +520,18 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -424,25 +593,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
0, 0, XCB_NONE,
XCB_RANDR_ROTATION_ROTATE_0,
NULL, 0);
-+ meta_crtc_xrandr_set_scale (crtc, (xcb_randr_crtc_t) crtc->crtc_id, 1.0f);
++ if (have_scaling)
++ meta_crtc_xrandr_set_scale (crtc,
++ (xcb_randr_crtc_t) crtc->crtc_id, 1.0f);
crtc->rect.x = 0;
crtc->rect.y = 0;
@@ -2256,7 +2376,7 @@ index 784bbde..47d19d6 100644
for (i = 0; i < n_crtcs; i++)
{
-@@ -455,12 +544,21 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -455,12 +619,21 @@ apply_crtc_assignments (MetaMonitorManager *manager,
g_autofree xcb_randr_output_t *output_ids = NULL;
unsigned int j, n_output_ids;
xcb_randr_rotation_t rotation;
@@ -2278,7 +2398,7 @@ index 784bbde..47d19d6 100644
for (j = 0; j < n_output_ids; j++)
{
MetaOutput *output;
-@@ -473,6 +571,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -473,6 +646,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
output_ids[j] = output->winsys_id;
}
@@ -2299,7 +2419,7 @@ index 784bbde..47d19d6 100644
rotation = meta_monitor_transform_to_xrandr (crtc_info->transform);
if (!xrandr_set_crtc_config (manager_xrandr,
crtc,
-@@ -508,6 +620,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
+@@ -508,6 +695,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
crtc->rect.height = height;
crtc->current_mode = mode;
crtc->transform = crtc_info->transform;
@@ -2307,7 +2427,14 @@ index 784bbde..47d19d6 100644
}
}
-@@ -568,8 +681,56 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager,
+@@ -563,14 +751,60 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
+ }
+
+ static void
+-meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager,
+- MetaMonitorsConfig *config)
++meta_monitor_manager_xrandr_update_screen_size_derived (MetaMonitorManager *manager,
++ MetaMonitorsConfig *config)
{
MetaMonitorManagerXrandr *manager_xrandr =
META_MONITOR_MANAGER_XRANDR (manager);
@@ -2332,7 +2459,9 @@ index 784bbde..47d19d6 100644
+
+ if (crtc->current_mode == NULL)
+ continue;
-+
+
+- g_clear_pointer (&manager_xrandr->supported_scales, g_free);
+- meta_monitor_manager_rebuild_derived (manager, config);
+ if (!have_scaling || scale_mode != META_X11_SCALE_MODE_UI_DOWN)
+ {
+ /* When scaling up we should not reduce the screen size, or X will
@@ -2360,31 +2489,47 @@ index 784bbde..47d19d6 100644
+ meta_monitor_manager_xrandr_update_screen_size (manager_xrandr,
+ screen_width, screen_height,
+ average_scale);
-
-- g_clear_pointer (&manager_xrandr->supported_scales, g_free);
- meta_monitor_manager_rebuild_derived (manager, config);
}
-@@ -595,6 +756,9 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
+ static gboolean
+@@ -584,7 +818,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
- if (method != META_MONITORS_CONFIG_METHOD_VERIFY)
+ if (!config)
{
-+ MetaBackend *backend = meta_monitor_manager_get_backend (manager);
-+ MetaSettings *settings = meta_backend_get_settings (backend);
+- meta_monitor_manager_xrandr_rebuild_derived (manager, NULL);
++ meta_monitor_manager_rebuild_derived (manager, NULL);
+ return TRUE;
+ }
+
+@@ -609,16 +843,26 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
+ (MetaOutputInfo **) output_infos->pdata,
+ output_infos->len))
+ {
++ MetaLogicalMonitorLayoutMode layout_mode =
++ meta_monitor_manager_get_default_layout_mode (manager);
+
- /*
- * If the assignment has not changed, we won't get any notification about
- * any new configuration from the X server; but we still need to update
-@@ -615,6 +779,8 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
+ apply_crtc_assignments (manager,
+ TRUE,
+ (MetaCrtcInfo **) crtc_infos->pdata,
crtc_infos->len,
(MetaOutputInfo **) output_infos->pdata,
output_infos->len);
+
-+ meta_settings_update_ui_scaling_factor (settings);
++ if (layout_mode == META_LOGICAL_MONITOR_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
++ {
++ MetaBackend *backend = meta_monitor_manager_get_backend (manager);
++ MetaSettings *settings = meta_backend_get_settings (backend);
++ meta_settings_update_ui_scaling_factor (settings);
++ }
}
else
{
-@@ -748,7 +914,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager,
+- meta_monitor_manager_xrandr_rebuild_derived (manager, config);
++ meta_monitor_manager_rebuild_derived (manager, config);
+ }
+ }
+
+@@ -748,7 +992,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager,
GList *l;
int i;
@@ -2394,7 +2539,7 @@ index 784bbde..47d19d6 100644
return;
product = meta_monitor_get_product (monitor);
-@@ -797,7 +964,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
+@@ -797,7 +1042,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
int monitor_count;
@@ -2404,7 +2549,7 @@ index 784bbde..47d19d6 100644
return;
monitor_xrandr_data = meta_monitor_xrandr_data_from_monitor (monitor);
-@@ -815,10 +983,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
+@@ -815,10 +1061,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
static void
meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xrandr)
{
@@ -2418,7 +2563,7 @@ index 784bbde..47d19d6 100644
return;
/* delete any tiled monitors setup, as mutter will want to recreate
-@@ -849,83 +1019,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager,
+@@ -849,83 +1097,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager,
return TRUE;
}
@@ -2457,12 +2602,7 @@ index 784bbde..47d19d6 100644
-static int
-compare_scales (gconstpointer a,
- gconstpointer b)
-+static float
-+meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager,
-+ MetaLogicalMonitorLayoutMode layout_mode,
-+ MetaMonitor *monitor,
-+ MetaMonitorMode *monitor_mode)
- {
+-{
- float f = *(float *) a - *(float *) b;
-
- if (f < 0)
@@ -2474,7 +2614,12 @@ index 784bbde..47d19d6 100644
-
-static void
-ensure_supported_monitor_scales (MetaMonitorManager *manager)
--{
++static float
++meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager,
++ MetaLogicalMonitorLayoutMode layout_mode,
++ MetaMonitor *monitor,
++ MetaMonitorMode *monitor_mode)
+ {
- MetaMonitorManagerXrandr *manager_xrandr =
- META_MONITOR_MANAGER_XRANDR (manager);
- MetaMonitorScalesConstraint constraints;
@@ -2516,7 +2661,7 @@ index 784bbde..47d19d6 100644
}
static float *
-@@ -935,21 +1048,35 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager
+@@ -935,21 +1126,35 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager
MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{
@@ -2562,7 +2707,7 @@ index 784bbde..47d19d6 100644
}
static gboolean
-@@ -966,9 +1093,30 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager,
+@@ -966,9 +1171,34 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager,
return TRUE;
}
@@ -2570,6 +2715,10 @@ index 784bbde..47d19d6 100644
+scale_mode_changed (MetaSettings *settings,
+ MetaMonitorManager *manager)
+{
++ if (!(meta_monitor_manager_get_capabilities(manager) &
++ META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING))
++ return;
++
+ meta_monitor_manager_on_hotplug (manager);
+ meta_settings_update_ui_scaling_factor (settings);
+}
@@ -2593,7 +2742,7 @@ index 784bbde..47d19d6 100644
return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
}
-@@ -978,10 +1126,15 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
+@@ -978,10 +1208,11 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
MetaMonitorManagerXrandr *manager_xrandr =
META_MONITOR_MANAGER_XRANDR (object);
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
@@ -2602,17 +2751,13 @@ index 784bbde..47d19d6 100644
+ MetaBackend *backend = meta_monitor_manager_get_backend (manager);
+ MetaSettings *settings = meta_backend_get_settings (backend);
+ MetaBackendX11 *x11_backend = META_BACKEND_X11 (backend);
-+
-+ manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (x11_backend);
- manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend);
-+ meta_settings_update_ui_scaling_factor (settings);
-+ g_signal_connect_object (settings, "x11-scale-mode-changed",
-+ G_CALLBACK (scale_mode_changed), manager_xrandr, 0);
++ manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (x11_backend);
manager_xrandr->gpu = META_GPU (meta_gpu_xrandr_new (manager_xrandr));
meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu);
-@@ -1003,16 +1156,13 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
+@@ -1003,19 +1234,19 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
| RRCrtcChangeNotifyMask
| RROutputPropertyNotifyMask);
@@ -2634,7 +2779,13 @@ index 784bbde..47d19d6 100644
meta_monitor_manager_xrandr_init_monitors (manager_xrandr);
}
-@@ -1026,7 +1176,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
++ g_signal_connect_object (settings, "x11-scale-mode-changed",
++ G_CALLBACK (scale_mode_changed), manager_xrandr, 0);
++
+ G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->constructed (object);
+ }
+
+@@ -1026,7 +1257,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
g_clear_object (&manager_xrandr->gpu);
g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
@@ -2642,6 +2793,23 @@ index 784bbde..47d19d6 100644
G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object);
}
+@@ -1048,6 +1278,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
+ manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
+ manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config;
+ manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config;
++ manager_class->update_screen_size_derived = meta_monitor_manager_xrandr_update_screen_size_derived;
+ manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
+ manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
+ manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
+@@ -1108,7 +1339,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
+ config = NULL;
+ }
+
+- meta_monitor_manager_xrandr_rebuild_derived (manager, config);
++ meta_monitor_manager_rebuild_derived (manager, config);
+ }
+
+ return TRUE;
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.h b/src/backends/x11/meta-monitor-manager-xrandr.h
index d55b3d2..515f938 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.h
--
ubuntu-desktop mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-desktop