[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/pgtk 78801c6 2/3: Make display-mm-width/height consider multi-mo
From: |
Yuuki Harano |
Subject: |
feature/pgtk 78801c6 2/3: Make display-mm-width/height consider multi-monitor. |
Date: |
Sun, 3 Jan 2021 02:29:40 -0500 (EST) |
branch: feature/pgtk
commit 78801c6e211b966d4730759e56ae65f94ef8bc8a
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Yuuki Harano <masm+github@masm11.me>
Make display-mm-width/height consider multi-monitor.
* src/pgtkfns.c (Fx_display_mm_height):
(Fx_display_mm_width): Calculate width/height mm assuming monitor
other than origin does not overlap.
---
src/pgtkfns.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 52 insertions(+), 6 deletions(-)
diff --git a/src/pgtkfns.c b/src/pgtkfns.c
index f52dab6..3e55b83 100644
--- a/src/pgtkfns.c
+++ b/src/pgtkfns.c
@@ -2047,9 +2047,32 @@ for each physical monitor, use
`display-monitor-attributes-list'. */)
(Lisp_Object terminal)
{
struct pgtk_display_info *dpyinfo = check_pgtk_display_info (terminal);
- GdkDisplay *gdpy = dpyinfo->gdpy;
- GdkMonitor *gmon = gdk_display_get_monitor_at_point (gdpy, 0, 0);
- return make_fixnum (gdk_monitor_get_height_mm (gmon));
+ GdkDisplay *gdpy;
+ gint n_monitors, i;
+ int height_mm_at_0 = 0, height_mm_at_other = 0;
+
+ block_input ();
+ gdpy = dpyinfo->gdpy;
+ n_monitors = gdk_display_get_n_monitors (gdpy);
+
+ for (i = 0; i < n_monitors; ++i)
+ {
+ GdkRectangle rec;
+
+ GdkMonitor *monitor = gdk_display_get_monitor (gdpy, i);
+ gdk_monitor_get_geometry (monitor, &rec);
+
+ int mm = gdk_monitor_get_height_mm (monitor);
+
+ if (rec.y == 0)
+ height_mm_at_0 = max(height_mm_at_0, mm);
+ else
+ height_mm_at_other += mm;
+ }
+
+ unblock_input ();
+
+ return make_fixnum (height_mm_at_0 + height_mm_at_other);
}
@@ -2065,9 +2088,32 @@ for each physical monitor, use
`display-monitor-attributes-list'. */)
(Lisp_Object terminal)
{
struct pgtk_display_info *dpyinfo = check_pgtk_display_info (terminal);
- GdkDisplay *gdpy = dpyinfo->gdpy;
- GdkMonitor *gmon = gdk_display_get_monitor_at_point (gdpy, 0, 0);
- return make_fixnum (gdk_monitor_get_width_mm (gmon));
+ GdkDisplay *gdpy;
+ gint n_monitors, i;
+ int width_mm_at_0 = 0, width_mm_at_other = 0;
+
+ block_input ();
+ gdpy = dpyinfo->gdpy;
+ n_monitors = gdk_display_get_n_monitors (gdpy);
+
+ for (i = 0; i < n_monitors; ++i)
+ {
+ GdkRectangle rec;
+
+ GdkMonitor *monitor = gdk_display_get_monitor (gdpy, i);
+ gdk_monitor_get_geometry (monitor, &rec);
+
+ int mm = gdk_monitor_get_width_mm (monitor);
+
+ if (rec.x == 0)
+ width_mm_at_0 = max(width_mm_at_0, mm);
+ else
+ width_mm_at_other += mm;
+ }
+
+ unblock_input ();
+
+ return make_fixnum (width_mm_at_0 + width_mm_at_other);
}