[gtk+/wip/matthiasc/monitor] Move some monitor apis to GdkDisplay
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/monitor] Move some monitor apis to GdkDisplay
- Date: Mon, 4 Apr 2016 00:02:44 +0000 (UTC)
commit de2837056a1782b6f3aa541e948e7fff472fe954
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Apr 3 20:01:20 2016 -0400
Move some monitor apis to GdkDisplay
gdk/gdkdisplay.c | 87 ++++++++++++++++++++++++++++++++++++++++
gdk/gdkdisplay.h | 8 ++++
gdk/gdkscreen.c | 117 ++++++++++++-----------------------------------------
3 files changed, 122 insertions(+), 90 deletions(-)
---
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c
index f56ad65..01f4326 100644
--- a/gdk/gdkdisplay.c
+++ b/gdk/gdkdisplay.c
@@ -2502,6 +2502,93 @@ gdk_display_get_primary_monitor (GdkDisplay *display)
return NULL;
}
+GdkMonitor *
+gdk_display_get_monitor_at_point (GdkDisplay *display,
+ int x,
+ int y)
+{
+ GdkMonitor **monitors;
+ GdkMonitor *nearest;
+ int nearest_dist = G_MAXINT;
+ int n_monitors, i;
+
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+
+ monitors = gdk_display_get_monitors (display, &n_monitors);
+ for (i = 0; i < n_monitors; i++)
+ {
+ GdkRectangle geometry;
+ int dist_x, dist_y, dist;
+
+ gdk_monitor_get_geometry (monitors[i], &geometry);
+
+ if (x < geometry.x)
+ dist_x = geometry.x - x;
+ else if (geometry.x + geometry.width <= x)
+ dist_x = x - (geometry.x + geometry.width) + 1;
+ else
+ dist_x = 0;
+
+ if (y < geometry.y)
+ dist_y = geometry.y - y;
+ else if (geometry.y + geometry.height <= y)
+ dist_y = y - (geometry.y + geometry.height) + 1;
+ else
+ dist_y = 0;
+
+ dist = dist_x + dist_y;
+ if (dist < nearest_dist)
+ {
+ nearest_dist = dist;
+ nearest = monitors[i];
+ }
+
+ if (nearest_dist == 0)
+ break;
+ }
+
+ return nearest;
+}
+
+GdkMonitor *
+gdk_display_get_monitor_at_window (GdkDisplay *display,
+ GdkWindow *window)
+{
+ GdkRectangle win;
+ GdkMonitor **monitors;
+ int n_monitors, i;
+ int area = 0;
+ GdkMonitor *best = NULL;
+
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+
+ gdk_window_get_geometry (window, &win.x, &win.y, &win.width, &win.height);
+ gdk_window_get_origin (window, &win.x, &win.y);
+
+ monitors = gdk_display_get_monitors (display, &n_monitors);
+ for (i = 0; i < n_monitors; i++)
+ {
+ GdkRectangle mon, intersect;
+ int overlap;
+
+ gdk_monitor_get_geometry (monitors[i], &mon);
+ gdk_rectangle_intersect (&win, &mon, &intersect);
+ overlap = intersect.width *intersect.height;
+ if (overlap > area)
+ {
+ area = overlap;
+ best = monitors[i];
+ }
+ }
+
+ if (best)
+ return best;
+
+ return gdk_display_get_monitor_at_point (display,
+ win.x + win.width / 2,
+ win.y + win.height / 2);
+}
+
void
gdk_display_monitor_added (GdkDisplay *display,
GdkMonitor *monitor)
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index e0adfa3..ac50639 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -184,6 +184,14 @@ GdkMonitor ** gdk_display_get_monitors (GdkDisplay *display,
int *n_monitors);
GDK_AVAILABLE_IN_3_22
GdkMonitor * gdk_display_get_primary_monitor (GdkDisplay *display);
+GDK_AVAILABLE_IN_3_22
+GdkMonitor * gdk_display_get_monitor_at_point (GdkDisplay *display,
+ int x,
+ int y);
+GDK_AVAILABLE_IN_3_22
+GdkMonitor * gdk_display_get_monitor_at_window (GdkDisplay *dsplay,
+ GdkWindow *window);
+
G_END_DECLS
diff --git a/gdk/gdkscreen.c b/gdk/gdkscreen.c
index 30a9471..7fba30b 100644
--- a/gdk/gdkscreen.c
+++ b/gdk/gdkscreen.c
@@ -194,52 +194,21 @@ _gdk_screen_close (GdkScreen *screen)
}
}
-/* Fallback used when the monitor "at" a point or window
- * doesn’t exist.
- */
-static gint
-get_nearest_monitor (GdkScreen *screen,
- gint x,
- gint y)
+static int
+get_monitor_num (GdkMonitor *monitor)
{
- gint num_monitors, i;
- gint nearest_dist = G_MAXINT;
- gint nearest_monitor = 0;
-
- g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+ GdkDisplay *display;
+ GdkMonitor **monitors;
+ int n_monitors, i;
- num_monitors = gdk_screen_get_n_monitors (screen);
-
- for (i = 0; i < num_monitors; i++)
+ display = gdk_monitor_get_display (monitor);
+ monitors = gdk_display_get_monitors (display, &n_monitors);
+ for (i = 0; i < n_monitors; i++)
{
- GdkRectangle monitor;
- gint dist_x, dist_y, dist;
-
- gdk_screen_get_monitor_geometry (screen, i, &monitor);
-
- if (x < monitor.x)
- dist_x = monitor.x - x;
- else if (x >= monitor.x + monitor.width)
- dist_x = x - (monitor.x + monitor.width) + 1;
- else
- dist_x = 0;
-
- if (y < monitor.y)
- dist_y = monitor.y - y;
- else if (y >= monitor.y + monitor.height)
- dist_y = y - (monitor.y + monitor.height) + 1;
- else
- dist_y = 0;
-
- dist = dist_x + dist_y;
- if (dist < nearest_dist)
- {
- nearest_dist = dist;
- nearest_monitor = i;
- }
+ if (monitors[i] == monitor)
+ return i;
}
-
- return nearest_monitor;
+ return -1;
}
/**
@@ -255,31 +224,19 @@ get_nearest_monitor (GdkScreen *screen,
*
* Since: 2.2
**/
-gint
+gint
gdk_screen_get_monitor_at_point (GdkScreen *screen,
gint x,
gint y)
{
- gint num_monitors, i;
-
- g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+ GdkDisplay *display;
+ GdkMonitor *monitor;
- num_monitors = gdk_screen_get_n_monitors (screen);
-
- for (i=0;i<num_monitors;i++)
- {
- GdkRectangle monitor;
-
- gdk_screen_get_monitor_geometry (screen, i, &monitor);
-
- if (x >= monitor.x &&
- x < monitor.x + monitor.width &&
- y >= monitor.y &&
- y < (monitor.y + monitor.height))
- return i;
- }
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
- return get_nearest_monitor (screen, x, y);
+ display = gdk_screen_get_display (screen);
+ monitor = gdk_display_get_monitor_at_point (display, x, y);
+ return get_monitor_num (monitor);
}
/**
@@ -296,39 +253,19 @@ gdk_screen_get_monitor_at_point (GdkScreen *screen,
*
* Since: 2.2
**/
-gint
-gdk_screen_get_monitor_at_window (GdkScreen *screen,
- GdkWindow *window)
+gint
+gdk_screen_get_monitor_at_window (GdkScreen *screen,
+ GdkWindow *window)
{
- gint num_monitors, i, area = 0, screen_num = -1;
- GdkRectangle win_rect;
+ GdkDisplay *display;
+ GdkMonitor *monitor;
g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+ g_return_val_if_fail (GDK_IS_WINDOW (window), -1);
- gdk_window_get_geometry (window, &win_rect.x, &win_rect.y, &win_rect.width,
- &win_rect.height);
- gdk_window_get_origin (window, &win_rect.x, &win_rect.y);
- num_monitors = gdk_screen_get_n_monitors (screen);
-
- for (i=0;i<num_monitors;i++)
- {
- GdkRectangle tmp_monitor, intersect;
-
- gdk_screen_get_monitor_geometry (screen, i, &tmp_monitor);
- gdk_rectangle_intersect (&win_rect, &tmp_monitor, &intersect);
-
- if (intersect.width * intersect.height > area)
- {
- area = intersect.width * intersect.height;
- screen_num = i;
- }
- }
- if (screen_num >= 0)
- return screen_num;
- else
- return get_nearest_monitor (screen,
- win_rect.x + win_rect.width / 2,
- win_rect.y + win_rect.height / 2);
+ display = gdk_screen_get_display (screen);
+ monitor = gdk_display_get_monitor_at_window (display, window);
+ return get_monitor_num (monitor);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]