[mutter] Move current logical monitor retrieval to the backends



commit 5a8509f89503f035e1f70518c7d5aaebc65fc287
Author: Jonas Ådahl <jadahl gmail com>
Date:   Thu Dec 1 12:59:47 2016 +0800

    Move current logical monitor retrieval to the backends
    
    The method used for getting the current logical monitor (the monitor
    where the pointer cursor is currently at) depends on the backend type,
    so move that logic to the corresponding backends.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-backend-private.h       |    4 +
 src/backends/meta-backend.c               |    6 ++
 src/backends/native/meta-backend-native.c |   16 ++++
 src/backends/x11/meta-backend-x11.c       |   50 ++++++++++++
 src/backends/x11/meta-backend-x11.h       |    3 +
 src/core/display.c                        |    5 +-
 src/core/place.c                          |   10 ++-
 src/core/screen-private.h                 |    7 --
 src/core/screen.c                         |  117 ++---------------------------
 src/core/window-private.h                 |    2 +
 src/x11/events.c                          |    8 ++-
 11 files changed, 101 insertions(+), 127 deletions(-)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 4395b00..57ae8a7 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -71,6 +71,8 @@ struct _MetaBackendClass
                          int          x,
                          int          y);
 
+  MetaLogicalMonitor * (* get_current_logical_monitor) (MetaBackend *backend);
+
   void (* set_keymap) (MetaBackend *backend,
                        const char  *layouts,
                        const char  *variants,
@@ -122,6 +124,8 @@ void meta_backend_warp_pointer (MetaBackend *backend,
                                 int          x,
                                 int          y);
 
+MetaLogicalMonitor * meta_backend_get_current_logical_monitor (MetaBackend *backend);
+
 struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
 
 void meta_backend_update_last_device (MetaBackend *backend,
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index c781ae3..1f24a90 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -572,6 +572,12 @@ meta_backend_warp_pointer (MetaBackend *backend,
   META_BACKEND_GET_CLASS (backend)->warp_pointer (backend, x, y);
 }
 
+MetaLogicalMonitor *
+meta_backend_get_current_logical_monitor (MetaBackend *backend)
+{
+  return META_BACKEND_GET_CLASS (backend)->get_current_logical_monitor (backend);
+}
+
 void
 meta_backend_set_keymap (MetaBackend *backend,
                          const char  *layouts,
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 37e8ccf..90949b4 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -37,6 +37,7 @@
 #include "meta-cursor-renderer-native.h"
 #include "meta-launcher.h"
 #include "backends/meta-cursor-tracker-private.h"
+#include "backends/meta-monitor-manager-private.h"
 #include "backends/meta-pointer-constraint.h"
 #include "backends/meta-stage.h"
 #include "backends/native/meta-clutter-backend-native.h"
@@ -336,6 +337,18 @@ meta_backend_native_warp_pointer (MetaBackend *backend,
   meta_cursor_tracker_update_position (cursor_tracker, x, y);
 }
 
+static MetaLogicalMonitor *
+meta_backend_native_get_current_logical_monitor (MetaBackend *backend)
+{
+  MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
+  int x, y;
+
+  meta_cursor_tracker_get_pointer (cursor_tracker, &x, &y, NULL);
+  return meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
+}
+
 static void
 meta_backend_native_set_keymap (MetaBackend *backend,
                                 const char  *layouts,
@@ -436,6 +449,9 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
   backend_class->create_renderer = meta_backend_native_create_renderer;
 
   backend_class->warp_pointer = meta_backend_native_warp_pointer;
+
+  backend_class->get_current_logical_monitor = meta_backend_native_get_current_logical_monitor;
+
   backend_class->set_keymap = meta_backend_native_set_keymap;
   backend_class->get_keymap = meta_backend_native_get_keymap;
   backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index 7c8a5cb..a545859 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -45,6 +45,7 @@
 #include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
 #include "backends/x11/meta-clutter-backend-x11.h"
 #include "backends/x11/meta-renderer-x11.h"
+#include "meta/meta-cursor-tracker.h"
 #include "meta-cursor-renderer-x11.h"
 #ifdef HAVE_WAYLAND
 #include "wayland/meta-wayland.h"
@@ -92,6 +93,8 @@ struct _MetaBackendX11Private
   gchar *keymap_variants;
   gchar *keymap_options;
   int locked_group;
+
+  MetaLogicalMonitor *cached_current_logical_monitor;
 };
 typedef struct _MetaBackendX11Private MetaBackendX11Private;
 
@@ -448,10 +451,21 @@ on_device_added (ClutterDeviceManager *device_manager,
 }
 
 static void
+on_monitors_changed (MetaMonitorManager *manager,
+                     MetaBackend        *backend)
+{
+  MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
+  MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
+
+  priv->cached_current_logical_monitor = NULL;
+}
+
+static void
 meta_backend_x11_post_init (MetaBackend *backend)
 {
   MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
   MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
+  MetaMonitorManager *monitor_manager;
   int major, minor;
   gboolean has_xi = FALSE;
 
@@ -500,6 +514,10 @@ meta_backend_x11_post_init (MetaBackend *backend)
                            G_CALLBACK (on_device_added), backend, 0);
 
   META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
+
+  monitor_manager = meta_backend_get_monitor_manager (backend);
+  g_signal_connect (monitor_manager, "monitors-changed",
+                    G_CALLBACK (on_monitors_changed), backend);
 }
 
 static ClutterBackend *
@@ -622,6 +640,29 @@ meta_backend_x11_warp_pointer (MetaBackend *backend,
                  x, y);
 }
 
+static MetaLogicalMonitor *
+meta_backend_x11_get_current_logical_monitor (MetaBackend *backend)
+{
+  MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
+  MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
+  MetaCursorTracker *cursor_tracker;
+  int x, y;
+  MetaMonitorManager *monitor_manager;
+  MetaLogicalMonitor *logical_monitor;
+
+  if (priv->cached_current_logical_monitor)
+    return priv->cached_current_logical_monitor;
+
+  cursor_tracker = meta_backend_get_cursor_tracker (backend);
+  meta_cursor_tracker_get_pointer (cursor_tracker, &x, &y, NULL);
+  monitor_manager = meta_backend_get_monitor_manager (backend);
+  logical_monitor =
+    meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
+
+  priv->cached_current_logical_monitor = logical_monitor;
+  return priv->cached_current_logical_monitor;
+}
+
 static void
 get_xkbrf_var_defs (Display           *xdisplay,
                     const char        *layouts,
@@ -811,6 +852,14 @@ meta_backend_x11_set_numlock (MetaBackend *backend,
   /* TODO: Currently handled by gnome-settings-deamon */
 }
 
+void
+meta_backend_x11_handle_event (MetaBackendX11 *x11,
+                               XEvent      *xevent)
+{
+  MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
+
+  priv->cached_current_logical_monitor = NULL;
+}
 
 static void
 meta_backend_x11_update_screen_size (MetaBackend *backend,
@@ -899,6 +948,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
   backend_class->grab_device = meta_backend_x11_grab_device;
   backend_class->ungrab_device = meta_backend_x11_ungrab_device;
   backend_class->warp_pointer = meta_backend_x11_warp_pointer;
+  backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor;
   backend_class->set_keymap = meta_backend_x11_set_keymap;
   backend_class->get_keymap = meta_backend_x11_get_keymap;
   backend_class->lock_layout_group = meta_backend_x11_lock_layout_group;
diff --git a/src/backends/x11/meta-backend-x11.h b/src/backends/x11/meta-backend-x11.h
index d3854b2..b24e518 100644
--- a/src/backends/x11/meta-backend-x11.h
+++ b/src/backends/x11/meta-backend-x11.h
@@ -39,4 +39,7 @@ Display * meta_backend_x11_get_xdisplay (MetaBackendX11 *backend);
 
 Window meta_backend_x11_get_xwindow (MetaBackendX11 *backend);
 
+void meta_backend_x11_handle_event (MetaBackendX11 *x11,
+                                    XEvent         *xevent);
+
 #endif /* META_BACKEND_X11_H */
diff --git a/src/core/display.c b/src/core/display.c
index c064620..998fbae 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -651,8 +651,6 @@ meta_display_open (void)
   display->leader_window = None;
   display->timestamp_pinging_window = None;
 
-  display->monitor_cache_invalidated = TRUE;
-
   display->groups_by_leader = NULL;
 
   display->screen = NULL;
@@ -3085,6 +3083,7 @@ meta_display_request_pad_osd (MetaDisplay        *display,
                               ClutterInputDevice *pad,
                               gboolean            edition_mode)
 {
+  MetaBackend *backend = meta_get_backend ();
   MetaInputSettings *input_settings;
   const gchar *layout_path = NULL;
   ClutterActor *osd;
@@ -3119,7 +3118,7 @@ meta_display_request_pad_osd (MetaDisplay        *display,
     return;
 
   if (!logical_monitor)
-    logical_monitor = meta_screen_get_current_logical_monitor (display->screen);
+    logical_monitor = meta_backend_get_current_logical_monitor (backend);
 
   g_signal_emit (display, display_signals[SHOW_PAD_OSD], 0,
                  pad, settings, layout_path,
diff --git a/src/core/place.c b/src/core/place.c
index 6e6f1eb..357184f 100644
--- a/src/core/place.c
+++ b/src/core/place.c
@@ -81,6 +81,7 @@ find_next_cascade (MetaWindow *window,
                    int        *new_x,
                    int        *new_y)
 {
+  MetaBackend *backend = meta_get_backend ();
   GList *tmp;
   GList *sorted;
   int cascade_x, cascade_y;
@@ -114,7 +115,7 @@ find_next_cascade (MetaWindow *window,
    * of NW corner of window frame.
    */
 
-  current = meta_screen_get_current_logical_monitor (window->screen);
+  current = meta_backend_get_current_logical_monitor (backend);
   meta_window_get_work_area_for_logical_monitor (window, current, &work_area);
 
   cascade_x = MAX (0, work_area.x);
@@ -665,6 +666,7 @@ meta_window_place (MetaWindow        *window,
                    int               *new_x,
                    int               *new_y)
 {
+  MetaBackend *backend = meta_get_backend ();
   GList *windows = NULL;
   MetaLogicalMonitor *logical_monitor;
 
@@ -815,7 +817,7 @@ meta_window_place (MetaWindow        *window,
       meta_window_get_frame_rect (window, &frame_rect);
 
       /* Warning, this function is a round trip! */
-      logical_monitor = meta_screen_get_current_logical_monitor (window->screen);
+      logical_monitor = meta_backend_get_current_logical_monitor (backend);
 
       w = logical_monitor->rect.width;
       h = logical_monitor->rect.height;
@@ -859,8 +861,8 @@ meta_window_place (MetaWindow        *window,
     g_slist_free (all_windows);
   }
 
-  /* Warning, this is a round trip! */
-  logical_monitor = meta_screen_get_current_logical_monitor (window->screen);
+  /* Warning, on X11 this might be a round trip! */
+  logical_monitor = meta_backend_get_current_logical_monitor (backend);
 
   /* Maximize windows if they are too big for their work area (bit of
    * a hack here). Assume undecorated windows probably don't intend to
diff --git a/src/core/screen-private.h b/src/core/screen-private.h
index e9eb7aa..8c0d00a 100644
--- a/src/core/screen-private.h
+++ b/src/core/screen-private.h
@@ -77,9 +77,6 @@ struct _MetaScreen
 
   gboolean has_xinerama_indices;
 
-  /* Cache the current monitor */
-  int last_monitor_index;
-
   GSList *startup_sequences;
 
   Window wm_cm_selection_window;
@@ -133,10 +130,6 @@ void          meta_screen_hide_tile_preview            (MetaScreen    *screen);
 MetaWindow*   meta_screen_get_mouse_window     (MetaScreen                 *screen,
                                                 MetaWindow                 *not_this_one);
 
-MetaLogicalMonitor * meta_screen_get_current_logical_monitor (MetaScreen    *screen);
-MetaLogicalMonitor * meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
-                                                                      int         x,
-                                                                      int         y);
 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 bbea61f..b4bfe93 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -430,9 +430,7 @@ reload_logical_monitors (MetaScreen *screen)
       meta_workspace_invalidate_work_area (space);
     }
 
-  screen->last_monitor_index = 0;
   screen->has_xinerama_indices = FALSE;
-  screen->display->monitor_cache_invalidated = TRUE;
 }
 
 /* The guard window allows us to leave minimized windows mapped so
@@ -1488,97 +1486,6 @@ meta_screen_get_monitor_neighbor_index (MetaScreen         *screen,
   return logical_monitor ? logical_monitor->number : -1;
 }
 
-MetaLogicalMonitor *
-meta_screen_get_current_logical_monitor (MetaScreen *screen)
-{
-  MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  MetaLogicalMonitor *logical_monitors;
-  unsigned int n_logical_monitors;
-  int monitor_index;
-
-  logical_monitors =
-    meta_monitor_manager_get_logical_monitors (monitor_manager,
-                                               &n_logical_monitors);
-  monitor_index = meta_screen_get_current_monitor (screen);
-
-  return &logical_monitors[monitor_index];
-}
-
-static int
-meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
-                                         int         x,
-                                         int         y);
-
-MetaLogicalMonitor *
-meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
-                                                 int         x,
-                                                 int         y)
-{
-  MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  MetaLogicalMonitor *logical_monitors;
-  unsigned int n_logical_monitors;
-  int monitor_index;
-
-  logical_monitors =
-    meta_monitor_manager_get_logical_monitors (monitor_manager,
-                                               &n_logical_monitors);
-  monitor_index = meta_screen_get_current_monitor_for_pos (screen, x, y);
-
-  return &logical_monitors[monitor_index];
-}
-
-static int
-meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
-                                         int x,
-                                         int y)
-{
-  MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  MetaLogicalMonitor *logical_monitors;
-  unsigned int n_logical_monitors;
-
-  logical_monitors =
-    meta_monitor_manager_get_logical_monitors (monitor_manager,
-                                               &n_logical_monitors);
-
-  if (n_logical_monitors == 1)
-    return 0;
-  else if (screen->display->monitor_cache_invalidated)
-    {
-      unsigned int i;
-      MetaRectangle pointer_position;
-      pointer_position.x = x;
-      pointer_position.y = y;
-      pointer_position.width = pointer_position.height = 1;
-
-      screen->display->monitor_cache_invalidated = FALSE;
-      screen->last_monitor_index = 0;
-
-      for (i = 0; i < n_logical_monitors; i++)
-        {
-          if (meta_rectangle_contains_rect (&logical_monitors[i].rect,
-                                            &pointer_position))
-            {
-              screen->last_monitor_index = i;
-              break;
-            }
-        }
-
-      meta_topic (META_DEBUG_XINERAMA,
-                  "Rechecked current monitor, now %d\n",
-                  screen->last_monitor_index);
-
-    }
-
-    return screen->last_monitor_index;
-}
-
-
 /**
  * meta_screen_get_current_monitor:
  * @screen: a #MetaScreen
@@ -1591,27 +1498,15 @@ int
 meta_screen_get_current_monitor (MetaScreen *screen)
 {
   MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
-  int n_logical_monitors =
-    meta_monitor_manager_get_num_logical_monitors (monitor_manager);
+  MetaLogicalMonitor *logical_monitor;
 
-  if (n_logical_monitors == 1)
-    return 0;
+  logical_monitor = meta_backend_get_current_logical_monitor (backend);
 
-  /* Sadly, we have to do it this way. Yuck.
-   */
-
-  if (screen->display->monitor_cache_invalidated)
-    {
-      int x, y;
-
-      meta_cursor_tracker_get_pointer (cursor_tracker, &x, &y, NULL);
-      meta_screen_get_current_monitor_for_pos (screen, x, y);
-    }
+  /* Pretend its the first when there is no actual current monitor. */
+  if (!logical_monitor)
+    return 0;
 
-  return screen->last_monitor_index;
+  return logical_monitor->number;
 }
 
 /**
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 389aad8..cd79bde 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -729,6 +729,8 @@ void meta_window_activate_full (MetaWindow     *window,
                                 MetaClientType  source_indication,
                                 MetaWorkspace  *workspace);
 
+MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window);
+
 void meta_window_update_monitor (MetaWindow *window,
                                  gboolean    user_op);
 
diff --git a/src/x11/events.c b/src/x11/events.c
index e0458ae..49f2569 100644
--- a/src/x11/events.c
+++ b/src/x11/events.c
@@ -28,11 +28,12 @@
 #include <X11/extensions/shape.h>
 
 #include <meta/errors.h>
+#include "meta/meta-backend.h"
 #include "bell.h"
 #include "display-private.h"
 #include "window-private.h"
 #include "workspace-private.h"
-
+#include "backends/x11/meta-backend-x11.h"
 #include "x11/window-x11.h"
 #include "x11/xprops.h"
 
@@ -1697,6 +1698,7 @@ static gboolean
 meta_display_handle_xevent (MetaDisplay *display,
                             XEvent      *event)
 {
+  MetaBackend *backend = meta_get_backend ();
   Window modified;
   gboolean bypass_compositor = FALSE, bypass_gtk = FALSE;
   XIEvent *input_event;
@@ -1722,7 +1724,9 @@ meta_display_handle_xevent (MetaDisplay *display,
 #endif
 
   display->current_time = event_get_time (display, event);
-  display->monitor_cache_invalidated = TRUE;
+
+  if (META_IS_BACKEND_X11 (backend))
+    meta_backend_x11_handle_event (META_BACKEND_X11 (backend), event);
 
   if (display->focused_by_us &&
       event->xany.serial > display->focus_serial &&


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