[mutter] Move more logical monitor getters from the screen to the monitor manager



commit af616c96d40a37e9868842f63a1e96cabebacdb8
Author: Jonas Ådahl <jadahl gmail com>
Date:   Thu Dec 1 12:52:07 2016 +0800

    Move more logical monitor getters from the screen to the monitor manager
    
    Turning a rectangle into a logical monitor also has nothing to do with
    the screen (MetaScreen) so move it to MetaMonitorManager which has that
    information.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-monitor-manager-private.h |    3 +
 src/backends/meta-monitor-manager.c         |   41 ++++++++++++++++
 src/core/constraints.c                      |   28 +++++++----
 src/core/screen-private.h                   |    2 -
 src/core/screen.c                           |   68 +++++----------------------
 src/core/workspace.c                        |   11 ++++-
 src/wayland/meta-window-wayland.c           |    7 ++-
 7 files changed, 90 insertions(+), 70 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index c07cc88..0920da9 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -377,6 +377,9 @@ MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_at (MetaMonitorMana
                                                                  int                 x,
                                                                  int                 y);
 
+MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager,
+                                                                        MetaRectangle      *rect);
+
 MetaOutput         *meta_monitor_manager_get_outputs       (MetaMonitorManager *manager,
                                                            unsigned int       *n_outputs);
 
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index aeede6e..da52478 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1345,6 +1345,47 @@ meta_monitor_manager_get_logical_monitor_at (MetaMonitorManager *manager,
   return NULL;
 }
 
+MetaLogicalMonitor *
+meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager,
+                                                    MetaRectangle      *rect)
+{
+  MetaLogicalMonitor *best_logical_monitor;
+  int best_logical_monitor_area;
+  unsigned int i;
+
+  best_logical_monitor = NULL;
+  best_logical_monitor_area = 0;
+
+  for (i = 0; i < manager->n_logical_monitors; i++)
+    {
+      MetaLogicalMonitor *logical_monitor = &manager->logical_monitors[i];
+      MetaRectangle intersection;
+      int intersection_area;
+
+      if (!meta_rectangle_intersect (&logical_monitor->rect,
+                                     rect,
+                                     &intersection))
+        continue;
+
+      intersection_area = meta_rectangle_area (&intersection);
+
+      if (intersection_area > best_logical_monitor_area)
+        {
+          best_logical_monitor = logical_monitor;
+          best_logical_monitor_area = intersection_area;
+        }
+    }
+
+  if (!best_logical_monitor && (rect->width == 0 || rect->height == 0))
+    best_logical_monitor =
+      meta_monitor_manager_get_logical_monitor_at (manager, rect->x, rect->y);
+
+  if (!best_logical_monitor)
+    best_logical_monitor = manager->primary_logical_monitor;
+
+  return best_logical_monitor;
+}
+
 MetaOutput *
 meta_monitor_manager_get_outputs (MetaMonitorManager *manager,
                                   unsigned int       *n_outputs)
diff --git a/src/core/constraints.c b/src/core/constraints.c
index f307866..7ccce51 100644
--- a/src/core/constraints.c
+++ b/src/core/constraints.c
@@ -330,7 +330,10 @@ setup_constraint_info (ConstraintInfo      *info,
                        const MetaRectangle *orig,
                        MetaRectangle       *new)
 {
-  const MetaLogicalMonitor *logical_monitor;
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
+  MetaLogicalMonitor *logical_monitor;
   MetaWorkspace *cur_workspace;
 
   info->orig    = *orig;
@@ -379,10 +382,11 @@ setup_constraint_info (ConstraintInfo      *info,
     info->fixed_directions = FIXED_DIRECTION_NONE;
 
   logical_monitor =
-    meta_screen_get_logical_monitor_for_rect (window->screen, &info->current);
-  meta_window_get_work_area_for_monitor (window,
-                                         logical_monitor->number,
-                                         &info->work_area_monitor);
+    meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
+                                                        &info->current);
+  meta_window_get_work_area_for_logical_monitor (window,
+                                                 logical_monitor,
+                                                 &info->work_area_monitor);
 
   if (!window->fullscreen || !meta_window_has_fullscreen_monitors (window))
     {
@@ -459,10 +463,13 @@ place_window_if_needed(MetaWindow     *window,
       !window->minimized &&
       !window->fullscreen)
     {
+      MetaBackend *backend = meta_get_backend ();
+      MetaMonitorManager *monitor_manager =
+        meta_backend_get_monitor_manager (backend);
       MetaRectangle orig_rect;
       MetaRectangle placed_rect;
       MetaWorkspace *cur_workspace;
-      const MetaLogicalMonitor *logical_monitor;
+      MetaLogicalMonitor *logical_monitor;
 
       placed_rect = (MetaRectangle) {
         .x = window->rect.x,
@@ -481,11 +488,12 @@ place_window_if_needed(MetaWindow     *window,
        * new monitor and update the ConstraintInfo
        */
       logical_monitor =
-        meta_screen_get_logical_monitor_for_rect (window->screen, &placed_rect);
+        meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
+                                                            &placed_rect);
       info->entire_monitor = logical_monitor->rect;
-      meta_window_get_work_area_for_monitor (window,
-                                             logical_monitor->number,
-                                             &info->work_area_monitor);
+      meta_window_get_work_area_for_logical_monitor (window,
+                                                     logical_monitor,
+                                                     &info->work_area_monitor);
       cur_workspace = window->screen->active_workspace;
       info->usable_monitor_region =
         meta_workspace_get_onmonitor_region (cur_workspace,
diff --git a/src/core/screen-private.h b/src/core/screen-private.h
index a1ebc99..e9eb7aa 100644
--- a/src/core/screen-private.h
+++ b/src/core/screen-private.h
@@ -137,8 +137,6 @@ MetaLogicalMonitor * meta_screen_get_current_logical_monitor (MetaScreen    *scr
 MetaLogicalMonitor * meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
                                                                       int         x,
                                                                       int         y);
-MetaLogicalMonitor * meta_screen_get_logical_monitor_for_rect (MetaScreen    *screen,
-                                                               MetaRectangle *rect);
 MetaLogicalMonitor * meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
                                                                        MetaWindow *window);
 
diff --git a/src/core/screen.c b/src/core/screen.c
index 0f14d18..bbea61f 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -44,6 +44,7 @@
 #include "core.h"
 #include "meta-cursor-tracker-private.h"
 #include "boxes-private.h"
+#include "backends/meta-backend-private.h"
 
 #include <X11/extensions/Xinerama.h>
 #include <X11/extensions/Xcomposite.h>
@@ -1403,77 +1404,32 @@ meta_screen_get_mouse_window (MetaScreen  *screen,
 }
 
 MetaLogicalMonitor *
-meta_screen_get_logical_monitor_for_rect (MetaScreen    *screen,
-                                          MetaRectangle *rect)
+meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
+                                                  MetaWindow *window)
 {
   MetaBackend *backend = meta_get_backend ();
   MetaMonitorManager *monitor_manager =
     meta_backend_get_monitor_manager (backend);
-  MetaLogicalMonitor *logical_monitors;
-  unsigned int n_logical_monitors;
-  unsigned int i, best_monitor;
-  int monitor_score, rect_area;
-
-  logical_monitors =
-    meta_monitor_manager_get_logical_monitors (monitor_manager,
-                                               &n_logical_monitors);
-
-  if (n_logical_monitors == 1)
-    return &logical_monitors[0];
-
-  best_monitor = 0;
-  monitor_score = -1;
-
-  rect_area = meta_rectangle_area (rect);
-  for (i = 0; i < n_logical_monitors; i++)
-    {
-      gboolean result;
-      int cur;
-
-      if (rect_area > 0)
-        {
-          MetaRectangle dest;
-          result = meta_rectangle_intersect (&logical_monitors[i].rect,
-                                             rect,
-                                             &dest);
-          cur = meta_rectangle_area (&dest);
-        }
-      else
-        {
-          result = meta_rectangle_contains_rect (&logical_monitors[i].rect,
-                                                 rect);
-          cur = rect_area;
-        }
-
-      if (result && cur > monitor_score)
-        {
-          monitor_score = cur;
-          best_monitor = i;
-        }
-    }
-
-  return &logical_monitors[best_monitor];
-}
-
-MetaLogicalMonitor *
-meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
-                                                  MetaWindow *window)
-{
   MetaRectangle window_rect;
 
   meta_window_get_frame_rect (window, &window_rect);
 
-  return meta_screen_get_logical_monitor_for_rect (screen, &window_rect);
+  return meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
+                                                             &window_rect);
 }
 
 int
 meta_screen_get_monitor_index_for_rect (MetaScreen    *screen,
                                         MetaRectangle *rect)
 {
-  MetaLogicalMonitor *monitor;
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
+  MetaLogicalMonitor *logical_monitor;
 
-  monitor = meta_screen_get_logical_monitor_for_rect (screen, rect);
-  return monitor->number;
+  logical_monitor =
+    meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager, rect);
+  return logical_monitor->number;
 }
 
 MetaLogicalMonitor *
diff --git a/src/core/workspace.c b/src/core/workspace.c
index 1633c80..ea465a7 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -955,13 +955,22 @@ void
 meta_workspace_set_builtin_struts (MetaWorkspace *workspace,
                                    GSList        *struts)
 {
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
   MetaScreen *screen = workspace->screen;
   GSList *l;
 
   for (l = struts; l; l = l->next)
     {
       MetaStrut *strut = l->data;
-      int idx = meta_screen_get_monitor_index_for_rect (screen, &strut->rect);
+      MetaLogicalMonitor *logical_monitor;
+      int idx;
+
+      logical_monitor =
+        meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
+                                                            &strut->rect);
+      idx = logical_monitor->number;
 
       switch (strut->side)
         {
diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c
index 20d2c06..9ac4573 100644
--- a/src/wayland/meta-window-wayland.c
+++ b/src/wayland/meta-window-wayland.c
@@ -35,6 +35,7 @@
 #include "meta-wayland-private.h"
 #include "meta-wayland-surface.h"
 #include "meta-wayland-xdg-shell.h"
+#include "backends/meta-backend-private.h"
 #include "compositor/meta-surface-actor-wayland.h"
 
 struct _MetaWindowWayland
@@ -334,6 +335,9 @@ scale_rect_size (MetaRectangle *rect,
 static void
 meta_window_wayland_update_main_monitor (MetaWindow *window)
 {
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
   MetaWindow *toplevel_window;
   const MetaLogicalMonitor *from;
   const MetaLogicalMonitor *to;
@@ -376,7 +380,8 @@ meta_window_wayland_update_main_monitor (MetaWindow *window)
   scale = (float)to->scale / from->scale;
   rect = window->rect;
   scale_rect_size (&rect, scale);
-  scaled_new = meta_screen_get_logical_monitor_for_rect (window->screen, &rect);
+  scaled_new =
+    meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager, &rect);
   if (to != scaled_new)
     return;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]