[gtk+] wayland: calculate screen physical size



commit 02f3fe0671fe7b4f4068716773db01be7d4482e5
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Aug 14 12:05:37 2015 +0200

    wayland: calculate screen physical size
    
    A simple calculation is done so far (assuming monitor areas never overlap)
    so gdk_screen_get_width/height_mm return meaningful values.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=753621

 gdk/wayland/gdkscreen-wayland.c |   29 ++++++++++++++++++++++++++++-
 1 files changed, 28 insertions(+), 1 deletions(-)
---
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index ee95107..e60e9fc 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -1007,25 +1007,52 @@ _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)
 static void
 update_screen_size (GdkWaylandScreen *screen_wayland)
 {
+  gboolean emit_changed = FALSE;
   gint width, height;
+  gint width_mm, height_mm;
   gint i;
 
   width = height = 0;
+  width_mm = height_mm = 0;
   for (i = 0; i < screen_wayland->monitors->len; i++)
     {
       GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
 
+      /* XXX: Largely assuming here that monitor areas
+       * are contiguous and never overlap.
+       */
+      if (monitor->geometry.x > 0)
+        width_mm += monitor->width_mm;
+      else
+        width_mm = MAX (width_mm, monitor->width_mm);
+
+      if (monitor->geometry.y > 0)
+        height_mm += monitor->height_mm;
+      else
+        height_mm = MAX (height_mm, monitor->height_mm);
+
       width = MAX (width, monitor->geometry.x + monitor->geometry.width);
       height = MAX (height, monitor->geometry.y + monitor->geometry.height);
     }
 
+  if (screen_wayland->width_mm != width_mm ||
+      screen_wayland->height_mm != height_mm)
+    {
+      emit_changed = TRUE;
+      screen_wayland->width_mm = width_mm;
+      screen_wayland->height_mm = height_mm;
+    }
+
   if (screen_wayland->width != width ||
       screen_wayland->height != height)
     {
+      emit_changed = TRUE;
       screen_wayland->width = width;
       screen_wayland->height = height;
-      g_signal_emit_by_name (screen_wayland, "size-changed");
     }
+
+  if (emit_changed)
+    g_signal_emit_by_name (screen_wayland, "size-changed");
 }
 
 static void


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