From 504beaddb1c1836a9582e66facc95e7d0f6b6f5e Mon Sep 17 00:00:00 2001 From: Michael Koloberdin Date: Tue, 15 Nov 2016 01:00:10 +0200 Subject: [PATCH] gdk: Fix screen geometry detection for non-randr setups https://bugzilla.gnome.org/show_bug.cgi?id=773601 --- gdk/x11/gdkscreen-x11.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 28a43a69be..96c9eee9b8 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -755,10 +755,12 @@ init_randr13 (GdkScreen *screen, gboolean *changed) static void init_no_multihead (GdkScreen *screen, gboolean *changed) { + GdkDisplay *display = gdk_screen_get_display (screen); + GdkX11Display *x11_display = GDK_X11_DISPLAY (display); GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - GdkX11Display *x11_display = GDK_X11_DISPLAY (x11_screen->display); GdkX11Monitor *monitor; GdkRectangle geometry; + GdkRectangle newgeo; int i; for (i = 0; i < x11_display->monitors->len; i++) @@ -782,18 +784,25 @@ init_no_multihead (GdkScreen *screen, gboolean *changed) } gdk_monitor_get_geometry (GDK_MONITOR (monitor), &geometry); - if (0 != geometry.x || - 0 != geometry.y || - gdk_x11_screen_get_width (screen) != geometry.width || - gdk_x11_screen_get_height (screen) != geometry.height || + + newgeo.x = 0; + newgeo.y = 0; + newgeo.width = DisplayWidth (x11_display->xdisplay, x11_screen->screen_num) / + x11_screen->window_scale; + newgeo.height = DisplayHeight (x11_display->xdisplay, x11_screen->screen_num) / + x11_screen->window_scale; + + if (newgeo.x != geometry.x || + newgeo.y != geometry.y || + newgeo.width != geometry.width || + newgeo.height != geometry.height || gdk_x11_screen_get_width_mm (screen) != gdk_monitor_get_width_mm (GDK_MONITOR (monitor)) || gdk_x11_screen_get_height_mm (screen) != gdk_monitor_get_height_mm (GDK_MONITOR (monitor))) *changed = TRUE; - gdk_monitor_set_position (GDK_MONITOR (monitor), 0, 0); - gdk_monitor_set_size (GDK_MONITOR (monitor), - gdk_x11_screen_get_width (screen), - gdk_x11_screen_get_height (screen)); + gdk_monitor_set_position (GDK_MONITOR (monitor), newgeo.x, newgeo.y); + gdk_monitor_set_size (GDK_MONITOR (monitor), newgeo.width, newgeo.height); + g_object_notify (G_OBJECT (monitor), "workarea"); gdk_monitor_set_physical_size (GDK_MONITOR (monitor), gdk_x11_screen_get_width_mm (screen),