[gnome-panel/wip/geiger/geometry] panel-struts: replace use of GdkScreen



commit 3710c450cbc694d5d940c182c10c4cf600e949bf
Author: Sebastian Geiger <sbastig gmx net>
Date:   Sat Feb 17 23:32:04 2018 +0100

    panel-struts: replace use of GdkScreen

 gnome-panel/panel-struts.c   |  187 +++++++++++++++++++++++++++++-------------
 gnome-panel/panel-struts.h   |    1 -
 gnome-panel/panel-toplevel.c |    1 -
 3 files changed, 131 insertions(+), 58 deletions(-)
---
diff --git a/gnome-panel/panel-struts.c b/gnome-panel/panel-struts.c
index 5a988fc..64743ef 100644
--- a/gnome-panel/panel-struts.c
+++ b/gnome-panel/panel-struts.c
@@ -23,7 +23,6 @@
 
 #include "panel-struts.h"
 
-#include "panel-multiscreen.h"
 #include "panel-xutils.h"
 #include "panel-monitor.h"
 
@@ -31,9 +30,8 @@
 typedef struct {
         PanelToplevel    *toplevel;
 
-       GdkScreen        *screen;
-       int               monitor;
-       
+       GdkMonitor       *monitor;
+
         PanelOrientation  orientation;
        GdkRectangle      geometry;
         int               strut_size;
@@ -166,8 +164,7 @@ panel_struts_allocation_overlapped (PanelStrut   *strut,
 
 static gboolean
 panel_struts_allocate_struts (PanelToplevel *toplevel,
-                             GdkScreen     *screen,
-                             int            monitor)
+                             GdkMonitor    *monitor)
 {
        GSList   *allocated = NULL;
        GSList   *l;
@@ -177,17 +174,15 @@ panel_struts_allocate_struts (PanelToplevel *toplevel,
                PanelStrut   *strut = l->data;
                PanelStrut   *overlap;
                GdkRectangle  geometry;
-               int           monitor_x, monitor_y;
-               int           monitor_width, monitor_height;
+               GdkRectangle  monitor_geometry;
                gboolean      moved_down;
                int           skip;
 
-               if (strut->screen != screen || strut->monitor != monitor)
+               if (strut->monitor != monitor)
                        continue;
 
-               panel_monitor_get_geometry (strut->monitor,
-                                           &monitor_x, &monitor_y,
-                                           &monitor_height, &monitor_width);
+               gdk_monitor_get_geometry (strut->monitor,
+                                         &monitor_geometry);
 
                strut->allocated_strut_size  = strut->strut_size;
                strut->allocated_strut_start = strut->strut_start;
@@ -204,13 +199,13 @@ panel_struts_allocate_struts (PanelToplevel *toplevel,
                // TODO: shouldn't there be some assignment for x values and width here?
 
                if (strut->orientation & PANEL_VERTICAL_MASK) {
-                       if (geometry.y < monitor_y) {
-                               geometry.height = geometry.y + geometry.height - monitor_y;
-                               geometry.y      = monitor_y;
+                       if (geometry.y < monitor_geometry.y) {
+                               geometry.height = geometry.y + geometry.height - monitor_geometry.y;
+                               geometry.y      = monitor_geometry.y;
                        }
                                
-                       if (geometry.y + geometry.height > monitor_y + monitor_height)
-                               geometry.height = monitor_y + monitor_height - geometry.y;
+                       if (geometry.y + geometry.height > monitor_geometry.y + monitor_geometry.height)
+                               geometry.height = monitor_geometry.y + monitor_geometry.height - geometry.y;
                }
 
                if (strut->allocated_geometry.x      != geometry.x     ||
@@ -233,15 +228,102 @@ panel_struts_allocate_struts (PanelToplevel *toplevel,
        return toplevel_changed;
 }
 
+typedef struct {
+  int x0;
+  int y0;
+  int x1;
+  int y1;
+} MonitorBounds;
+
+static inline void
+get_monitor_bounds (GdkMonitor    *monitor,
+                   MonitorBounds *bounds)
+{
+       GdkRectangle geometry;
+
+       g_assert (bounds != NULL);
+
+       gdk_monitor_get_geometry (monitor,
+                                 &geometry);
+
+       bounds->x0 = geometry.x;
+       bounds->y0 = geometry.y;
+       bounds->x1 = bounds->x0 + geometry.width;
+       bounds->y1 = bounds->y0 + geometry.height;
+}
+
+/* Determines whether a given monitor is along the visible
+ * edge of the logical screen.
+ */
+static void
+find_logical_monitor_edges (GdkMonitor *monitor,
+                           gboolean   *leftmost,
+                           gboolean   *rightmost,
+                           gboolean   *topmost,
+                           gboolean   *bottommost)
+{
+       GdkDisplay *display;
+       MonitorBounds bounds;
+       int i, n_monitors;
+
+       g_return_if_fail (monitor != NULL);
+
+       bounds = {};
+
+       display = gdk_display_get_default ();
+
+       n_monitors = gdk_display_get_n_monitors (display);
+
+       *leftmost   = TRUE;
+       *rightmost  = TRUE;
+       *topmost    = TRUE;
+       *bottommost = TRUE;
+
+       get_monitor_bounds (monitor, &bounds);
+
+       /* go through each monitor and try to find one either right,
+        * below, above, or left of the specified monitor
+        */
+       for (i = 0; i < n_monitors; i++) {
+               MonitorBounds iter;
+               GdkMonitor *currentMonitor;
+               
+               currentMonitor = gdk_display_get_monitor (display, i);
+
+               if (monitor == currentMonitor)
+                       continue;
+
+               get_monitor_bounds (currentMonitor, &iter);
+
+               if ((iter.y0 >= bounds.y0 && iter.y0 <  bounds.y1) ||
+                   (iter.y1 >  bounds.y0 && iter.y1 <= bounds.y1))
+               {
+                       if (iter.x0 < bounds.x0)
+                               *leftmost = FALSE;
+                       if (iter.x1 > bounds.x1)
+                               *rightmost = FALSE;
+               }
+
+               if ((iter.x0 >= bounds.x0 && iter.x0 <  bounds.x1) ||
+                   (iter.x1 >  bounds.x0 && iter.x1 <= bounds.x1))
+               {
+                       if (iter.y0 < bounds.y0)
+                               *topmost = FALSE;
+                       if (iter.y1 > bounds.y1)
+                               *bottommost = FALSE;
+               }
+       }
+}
+
 void
 panel_struts_set_window_hint (PanelToplevel *toplevel)
 {
        GtkWidget  *widget;
        PanelStrut *strut;
        int         strut_size;
-       int         monitor_x, monitor_y, monitor_width, monitor_height;
        int         screen_width, screen_height;
        int         leftmost, rightmost, topmost, bottommost;
+       GdkRectangle geometry;
 
        widget = GTK_WIDGET (toplevel);
 
@@ -258,35 +340,34 @@ panel_struts_set_window_hint (PanelToplevel *toplevel)
        screen_width  = gdk_screen_get_width  (strut->screen);
        screen_height = gdk_screen_get_height (strut->screen);
 
-       panel_monitor_get_geometry (strut->monitor,
-                                   &monitor_x, &monitor_y,
-                                   &monitor_height, &monitor_width);
+       gdk_monitor_get_geometry (strut->monitor,
+                                 &geometry);
 
-       panel_multiscreen_is_at_visible_extreme (strut->monitor,
-                                                &leftmost,
-                                                &rightmost,
-                                                &topmost,
-                                                &bottommost);
+       find_logical_monitor_edges (strut->monitor,
+                                   &leftmost,
+                                   &rightmost,
+                                   &topmost,
+                                   &bottommost);
 
        switch (strut->orientation) {
        case PANEL_ORIENTATION_TOP:
-               if (monitor_y > 0)
-                       strut_size += monitor_y;
+               if (geometry.y > 0)
+                       strut_size += geometry.y;
                if (!topmost) strut_size = 0;
                break;
        case PANEL_ORIENTATION_BOTTOM:
-               if (monitor_y + monitor_height < screen_height)
-                       strut_size += screen_height - (monitor_y + monitor_height);
+               if (geometry.y + geometry.height < screen_height)
+                       strut_size += screen_height - (geometry.y + geometry.height);
                if (!bottommost) strut_size = 0;
                break;
        case PANEL_ORIENTATION_LEFT:
-               if (leftmost && monitor_x > 0)
-                       strut_size += monitor_x;
+               if (leftmost && geometry.x > 0)
+                       strut_size += geometry.x;
                if (!leftmost) strut_size = 0;
                break;
        case PANEL_ORIENTATION_RIGHT:
-               if (monitor_x + monitor_width < screen_width)
-                       strut_size += screen_width - (monitor_x + monitor_width);
+               if (geometry.x + geometry.width < screen_width)
+                       strut_size += screen_width - (geometry.x + geometry.width);
                if (!rightmost) strut_size = 0;
                break;
        default:
@@ -339,12 +420,9 @@ static int
 panel_struts_compare (const PanelStrut *s1,
                      const PanelStrut *s2)
 {
-       if (s1->screen != s2->screen)
-               return gdk_screen_get_number (s1->screen) -
-                       gdk_screen_get_number (s2->screen);
-
        if (s1->monitor != s2->monitor)
-               return s1->monitor - s2->monitor;
+               return panel_monitor_get_index (s1->monitor) -
+                               panel_monitor_get_index (s2->monitor);
 
         if (s1->orientation != s2->orientation)
                 return orientation_to_order (s1->orientation) -
@@ -361,8 +439,7 @@ panel_struts_compare (const PanelStrut *s1,
 
 gboolean
 panel_struts_register_strut (PanelToplevel    *toplevel,
-                            GdkScreen        *screen,
-                            int               monitor,
+                            int               monitor_index,
                             PanelOrientation  orientation,
                             int               strut_size,
                             int               strut_start,
@@ -370,7 +447,11 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
 {
        PanelStrut *strut;
        gboolean    new_strut = FALSE;
-       int         monitor_x, monitor_y, monitor_width, monitor_height;
+       GdkMonitor *monitor;
+       GdkRectangle geometry;
+
+       monitor = gdk_display_get_monitor (gdk_display_get_default (),
+                                          monitor_index);
 
        if (!(strut = panel_struts_find_strut (toplevel))) {
                strut = g_new0 (PanelStrut, 1);
@@ -378,7 +459,6 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
 
        } else if (strut->toplevel    == toplevel    &&
                   strut->orientation == orientation &&
-                  strut->screen      == screen      &&
                   strut->monitor     == monitor     &&
                   strut->strut_size  == strut_size  &&
                   strut->strut_start == strut_start &&
@@ -387,37 +467,34 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
 
        strut->toplevel    = toplevel;
        strut->orientation = orientation;
-       strut->screen      = screen;
        strut->monitor     = monitor;
        strut->strut_size  = strut_size;
        strut->strut_start = strut_start;
        strut->strut_end   = strut_end;
 
-       panel_monitor_get_geometry (monitor,
-                                   &monitor_x, &monitor_y,
-                                   &monitor_height, &monitor_width);
+       gdk_monitor_get_geometry (monitor, &geometry);
 
        switch (strut->orientation) {
        case PANEL_ORIENTATION_TOP:
                strut->geometry.x      = strut->strut_start;
-               strut->geometry.y      = monitor_y;
+               strut->geometry.y      = geometry.y;
                strut->geometry.width  = strut->strut_end - strut->strut_start + 1;
                strut->geometry.height = strut->strut_size;
                break;
        case PANEL_ORIENTATION_BOTTOM:
                strut->geometry.x      = strut->strut_start;
-               strut->geometry.y      = monitor_y + monitor_height - strut->strut_size;
+               strut->geometry.y      = geometry.y + geometry.height - strut->strut_size;
                strut->geometry.width  = strut->strut_end - strut->strut_start + 1;
                strut->geometry.height = strut->strut_size;
                break;
        case PANEL_ORIENTATION_LEFT:
-               strut->geometry.x      = monitor_x;
+               strut->geometry.x      = geometry.x;
                strut->geometry.y      = strut->strut_start;
                strut->geometry.width  = strut->strut_size;
                strut->geometry.height = strut->strut_end - strut->strut_start + 1;
                break;
        case PANEL_ORIENTATION_RIGHT:
-               strut->geometry.x      = monitor_x + monitor_width - strut->strut_size;
+               strut->geometry.x      = geometry.x + geometry.width - strut->strut_size;
                strut->geometry.y      = strut->strut_start;
                strut->geometry.width  = strut->strut_size;
                strut->geometry.height = strut->strut_end - strut->strut_start + 1;
@@ -430,26 +507,24 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
        panel_struts_list = g_slist_sort (panel_struts_list,
                                          (GCompareFunc) panel_struts_compare);
 
-       return panel_struts_allocate_struts (toplevel, screen, monitor);
+       return panel_struts_allocate_struts (toplevel, monitor);
 }
 
 void
 panel_struts_unregister_strut (PanelToplevel *toplevel)
 {
        PanelStrut *strut;
-       GdkScreen  *screen;
-       int         monitor;
+       GdkMonitor *monitor;
 
        if (!(strut = panel_struts_find_strut (toplevel)))
                return;
 
-       screen  = strut->screen;
        monitor = strut->monitor;
 
        panel_struts_list = g_slist_remove (panel_struts_list, strut);
        g_free (strut);
 
-       panel_struts_allocate_struts (toplevel, screen, monitor);
+       panel_struts_allocate_struts (toplevel, monitor);
 }
 
 gboolean
diff --git a/gnome-panel/panel-struts.h b/gnome-panel/panel-struts.h
index f4ef9af..f06e351 100644
--- a/gnome-panel/panel-struts.h
+++ b/gnome-panel/panel-struts.h
@@ -27,7 +27,6 @@
 G_BEGIN_DECLS
 
 gboolean panel_struts_register_strut           (PanelToplevel    *toplevel,
-                                               GdkScreen        *screen,
                                                int               monitor,
                                                PanelOrientation  orientation,
                                                int               strut_size,
diff --git a/gnome-panel/panel-toplevel.c b/gnome-panel/panel-toplevel.c
index ea94de3..31b8c24 100644
--- a/gnome-panel/panel-toplevel.c
+++ b/gnome-panel/panel-toplevel.c
@@ -1541,7 +1541,6 @@ panel_toplevel_update_struts (PanelToplevel *toplevel, gboolean end_of_animation
 
        if (strut > 0)
                geometry_changed = panel_struts_register_strut (toplevel,
-                                                               gdk_screen_get_default(),
                                                                toplevel->priv->monitor,
                                                                orientation,
                                                                strut,


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