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

Reply via email to