[mutter] screen: Don't use monitor indices in check_fullscreen_func



commit 410bad88a88d8fc3ac30e0230a810fddb601d113
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Dec 2 15:38:08 2016 +0800

    screen: Don't use monitor indices in check_fullscreen_func
    
    Rewrite check_fullscreen_func to not use indexes (and
    offset-index-as-pointer) tricks. This also removes the usage of an API
    constructing temporary logical monitor arrays carrying indices.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/core/screen.c         |   40 ++++++++++++++++++++++------------------
 src/core/window-private.h |    1 +
 src/core/window.c         |    6 ++++++
 3 files changed, 29 insertions(+), 18 deletions(-)
---
diff --git a/src/core/screen.c b/src/core/screen.c
index 4aa2597..4b60065 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -2633,30 +2633,31 @@ check_fullscreen_func (gpointer data)
       else if (window->maximized_horizontally &&
                window->maximized_vertically)
         {
-          int monitor_index = meta_window_get_monitor (window);
-          /* + 1 to avoid NULL */
-          gpointer monitor_p = GINT_TO_POINTER(monitor_index + 1);
-          if (!g_slist_find (obscured_monitors, monitor_p))
-            obscured_monitors = g_slist_prepend (obscured_monitors, monitor_p);
+          MetaLogicalMonitor *logical_monitor;
+
+          logical_monitor = meta_window_get_main_logical_monitor (window);
+          if (!g_slist_find (obscured_monitors, logical_monitor))
+            obscured_monitors = g_slist_prepend (obscured_monitors,
+                                                 logical_monitor);
         }
 
       if (covers_monitors)
         {
-          int *monitors;
-          gsize n_monitors;
-          gsize j;
+          MetaRectangle window_rect;
+
+          meta_window_get_frame_rect (window, &window_rect);
 
-          monitors = meta_window_get_all_monitors (window, &n_monitors);
-          for (j = 0; j < n_monitors; j++)
+          for (i = 0; i < n_logical_monitors; i++)
             {
-              /* + 1 to avoid NULL */
-              gpointer monitor_p = GINT_TO_POINTER(monitors[j] + 1);
-              if (!g_slist_find (fullscreen_monitors, monitor_p) &&
-                  !g_slist_find (obscured_monitors, monitor_p))
-                fullscreen_monitors = g_slist_prepend (fullscreen_monitors, monitor_p);
+              MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
+
+              if (meta_rectangle_overlap (&window_rect,
+                                          &logical_monitor->rect) &&
+                  !g_slist_find (fullscreen_monitors, logical_monitor) &&
+                  !g_slist_find (obscured_monitors, logical_monitor))
+                fullscreen_monitors = g_slist_prepend (fullscreen_monitors,
+                                                       logical_monitor);
             }
-
-          g_free (monitors);
         }
     }
 
@@ -2665,7 +2666,10 @@ check_fullscreen_func (gpointer data)
   for (i = 0; i < n_logical_monitors; i++)
     {
       MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
-      gboolean in_fullscreen = g_slist_find (fullscreen_monitors, GINT_TO_POINTER (i + 1)) != NULL;
+      gboolean in_fullscreen;
+
+      in_fullscreen = g_slist_find (fullscreen_monitors,
+                                    logical_monitor) != NULL;
       if (in_fullscreen != logical_monitor->in_fullscreen)
         {
           logical_monitor->in_fullscreen = in_fullscreen;
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 726e1b1..f54ffaf 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -731,6 +731,7 @@ void meta_window_activate_full (MetaWindow     *window,
 
 MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window);
 
+MetaLogicalMonitor * meta_window_get_main_logical_monitor (MetaWindow *window);
 void meta_window_update_monitor (MetaWindow *window,
                                  gboolean    user_op);
 
diff --git a/src/core/window.c b/src/core/window.c
index 0aedf35..8c732df 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -3548,6 +3548,12 @@ meta_window_get_monitor (MetaWindow *window)
   return window->monitor->number;
 }
 
+MetaLogicalMonitor *
+meta_window_get_main_logical_monitor (MetaWindow *window)
+{
+  return window->monitor;
+}
+
 static MetaLogicalMonitor *
 find_monitor_by_winsys_id (MetaWindow *window,
                            guint       winsys_id)


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