From de2837056a1782b6f3aa541e948e7fff472fe954 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 3 Apr 2016 20:01:20 -0400 Subject: [PATCH] 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 f56ad65588..01f4326e74 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 e0adfa3430..ac50639cfc 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 30a9471962..7fba30b757 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; + GdkDisplay *display; + GdkMonitor **monitors; + int n_monitors, i; - g_return_val_if_fail (GDK_IS_SCREEN (screen), -1); - - 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; - + GdkDisplay *display; + GdkMonitor *monitor; + g_return_val_if_fail (GDK_IS_SCREEN (screen), -1); - num_monitors = gdk_screen_get_n_monitors (screen); - - for (i=0;i= monitor.x && - x < monitor.x + monitor.width && - y >= monitor.y && - y < (monitor.y + monitor.height)) - return i; - } - - 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 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); } /**