[gtk+/gtk-3-16] wayland: calculate screen physical size
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-3-16] wayland: calculate screen physical size
- Date: Fri, 18 Sep 2015 01:11:17 +0000 (UTC)
commit 30a62f19299c1b2432672bbe66395f4a72a05a29
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 122fafa..18d60a6 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -1001,25 +1001,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]