From 0f37375c457c596a00cb76dfcf5a0ba99a0280e4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 3 Apr 2016 19:59:12 -0400 Subject: [PATCH] Implement workarea with a vfunc --- gdk/gdkmonitor.c | 32 ++++++++++++++++++++++++++++++++ gdk/gdkmonitor.h | 3 +++ gdk/gdkmonitorprivate.h | 7 +++++++ 3 files changed, 42 insertions(+) diff --git a/gdk/gdkmonitor.c b/gdk/gdkmonitor.c index 1701a79d3c..10e4be56ef 100644 --- a/gdk/gdkmonitor.c +++ b/gdk/gdkmonitor.c @@ -31,6 +31,10 @@ * - monitor type (laptop, projector, ...) * - consider vfuncs instead of baseclass storage * - provide a persistent id (if the backend allows) + * - x11: refresh rate + * - x11: hidpi scaling + * - convert win32 + * - convert quartz */ enum { PROP_0, @@ -39,6 +43,7 @@ enum { PROP_MODEL, PROP_SCALE_FACTOR, PROP_GEOMETRY, + PROP_WORKAREA, PROP_WIDTH_MM, PROP_HEIGHT_MM, PROP_REFRESH_RATE, @@ -86,6 +91,14 @@ gdk_monitor_get_property (GObject *object, g_value_set_boxed (value, &monitor->geometry); break; + case PROP_WORKAREA: + { + GdkRectangle workarea; + gdk_monitor_get_workarea (monitor, &workarea); + g_value_set_boxed (value, &workarea); + } + break; + case PROP_WIDTH_MM: g_value_set_int (value, monitor->width_mm); break; @@ -177,6 +190,12 @@ gdk_monitor_class_init (GdkMonitorClass *class) "The geometry of the monitor", GDK_TYPE_RECTANGLE, G_PARAM_READABLE); + props[PROP_WORKAREA] = + g_param_spec_boxed ("workarea", + "Workarea", + "The workarea of the monitor", + GDK_TYPE_RECTANGLE, + G_PARAM_READABLE); props[PROP_WIDTH_MM] = g_param_spec_int ("width-mm", "Physical width", @@ -227,6 +246,19 @@ gdk_monitor_get_geometry (GdkMonitor *monitor, *geometry = monitor->geometry; } +void +gdk_monitor_get_workarea (GdkMonitor *monitor, + GdkRectangle *workarea) +{ + g_return_if_fail (GDK_IS_MONITOR (monitor)); + g_return_if_fail (workarea != NULL); + + if (GDK_MONITOR_GET_CLASS (monitor)->get_workarea) + GDK_MONITOR_GET_CLASS (monitor)->get_workarea (monitor, workarea); + else + *workarea = monitor->geometry; +} + int gdk_monitor_get_width_mm (GdkMonitor *monitor) { diff --git a/gdk/gdkmonitor.h b/gdk/gdkmonitor.h index 1407b7ff88..37f7d19935 100644 --- a/gdk/gdkmonitor.h +++ b/gdk/gdkmonitor.h @@ -57,6 +57,9 @@ GDK_AVAILABLE_IN_3_22 void gdk_monitor_get_geometry (GdkMonitor *monitor, GdkRectangle *geometry); GDK_AVAILABLE_IN_3_22 +void gdk_monitor_get_workarea (GdkMonitor *monitor, + GdkRectangle *geometry); +GDK_AVAILABLE_IN_3_22 int gdk_monitor_get_width_mm (GdkMonitor *monitor); GDK_AVAILABLE_IN_3_22 int gdk_monitor_get_height_mm (GdkMonitor *monitor); diff --git a/gdk/gdkmonitorprivate.h b/gdk/gdkmonitorprivate.h index d0f7e40f03..0d6311370e 100644 --- a/gdk/gdkmonitorprivate.h +++ b/gdk/gdkmonitorprivate.h @@ -26,6 +26,10 @@ G_BEGIN_DECLS +#define GDK_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_MONITOR, GdkMonitorClass)) +#define GDK_IS_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_MONITOR)) +#define GDK_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_MONITOR, GdkMonitorClass)) + struct _GdkMonitor { GObject parent; @@ -42,6 +46,9 @@ struct _GdkMonitor { struct _GdkMonitorClass { GObjectClass parent_class; + + void (* get_workarea) (GdkMonitor *monitor, + GdkRectangle *geometry); }; GdkMonitor * gdk_monitor_new (GdkDisplay *display);