[gnome-panel/wip/geiger/geometry] panel-struts: replace use of GdkScreen
- From: Sebastian Geiger <segeiger src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-panel/wip/geiger/geometry] panel-struts: replace use of GdkScreen
- Date: Sat, 17 Feb 2018 22:32:36 +0000 (UTC)
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]