[gtk+] mir: implement display monitor vfuncs
- From: William Hua <williamhua src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] mir: implement display monitor vfuncs
- Date: Mon, 5 Dec 2016 14:20:29 +0000 (UTC)
commit e27e8e6e1cc9e86cc03692ec63f2268c899cafe5
Author: William Hua <william hua canonical com>
Date: Tue Nov 29 12:38:47 2016 -0500
mir: implement display monitor vfuncs
gdk/mir/gdkmirdisplay.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+), 0 deletions(-)
---
diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c
index d5c4cd5..5951e71 100644
--- a/gdk/mir/gdkmirdisplay.c
+++ b/gdk/mir/gdkmirdisplay.c
@@ -18,6 +18,7 @@
#include "config.h"
#include "gdkdisplayprivate.h"
+#include "gdkmonitorprivate.h"
#include "gdkinternals.h"
#include "gdkmir.h"
@@ -36,6 +37,9 @@ typedef struct GdkMirDisplay
/* Connection to Mir server */
MirConnection *connection;
+ const MirDisplayConfig *config;
+ GList *monitors;
+
/* Event source */
GdkMirEventSource *event_source;
@@ -100,6 +104,54 @@ static void get_pixel_formats (MirConnection *, MirPixelFormat *sw, MirPixelForm
G_DEFINE_TYPE (GdkMirDisplay, gdk_mir_display, GDK_TYPE_DISPLAY)
+static void
+config_changed_cb (MirConnection *connection,
+ void *context)
+{
+ GdkMirDisplay *display = context;
+ GdkMonitor *monitor;
+ const MirOutput *output;
+ const MirOutputMode *mode;
+ gint i;
+
+ g_list_free_full (display->monitors, g_object_unref);
+ g_clear_pointer (&display->config, mir_display_config_release);
+
+ display->config = mir_connection_create_display_configuration (display->connection);
+ display->monitors = NULL;
+
+ for (i = mir_display_config_get_num_outputs (display->config) - 1; i >= 0; i--)
+ {
+ output = mir_display_config_get_output (display->config, i);
+
+ if (!mir_output_is_enabled (output))
+ continue;
+
+ mode = mir_output_get_current_mode (output);
+ monitor = gdk_monitor_new (GDK_DISPLAY (display));
+
+ gdk_monitor_set_position (monitor,
+ mir_output_get_position_x (output),
+ mir_output_get_position_y (output));
+
+ gdk_monitor_set_size (monitor,
+ mir_output_mode_get_width (mode),
+ mir_output_mode_get_height (mode));
+
+ gdk_monitor_set_physical_size (monitor,
+ mir_output_get_physical_width_mm (output),
+ mir_output_get_physical_height_mm (output));
+
+ gdk_monitor_set_scale_factor (monitor,
+ (gint) mir_output_get_scale_factor (output));
+
+ gdk_monitor_set_refresh_rate (monitor,
+ (gint) mir_output_mode_get_refresh_rate (mode));
+
+ display->monitors = g_list_prepend (display->monitors, monitor);
+ }
+}
+
GdkDisplay *
_gdk_mir_display_open (const gchar *display_name)
{
@@ -133,6 +185,9 @@ _gdk_mir_display_open (const gchar *display_name)
display = g_object_new (GDK_TYPE_MIR_DISPLAY, NULL);
display->connection = connection;
+ config_changed_cb (display->connection, display);
+ mir_connection_set_display_config_change_callback (display->connection, config_changed_cb, display);
+
GDK_DISPLAY (display)->device_manager = _gdk_mir_device_manager_new (GDK_DISPLAY (display));
display->screen = _gdk_mir_screen_new (GDK_DISPLAY (display));
display->sw_pixel_format = sw_pixel_format;
@@ -177,6 +232,9 @@ gdk_mir_display_dispose (GObject *object)
g_clear_object (&display->keymap);
g_clear_pointer (&display->event_source, g_source_unref);
+ g_list_free_full (display->monitors, g_object_unref);
+ display->monitors = NULL;
+
G_OBJECT_CLASS (gdk_mir_display_parent_class)->dispose (object);
}
@@ -185,6 +243,8 @@ gdk_mir_display_finalize (GObject *object)
{
GdkMirDisplay *display = GDK_MIR_DISPLAY (object);
+ g_clear_pointer (&display->config, mir_display_config_release);
+
mir_connection_release (display->connection);
G_OBJECT_CLASS (gdk_mir_display_parent_class)->finalize (object);
@@ -683,6 +743,20 @@ gboolean _gdk_mir_display_have_egl_surfaceless_context (GdkDisplay *display)
return GDK_MIR_DISPLAY (display)->have_egl_surfaceless_context;
}
+static int
+gdk_mir_display_get_n_monitors (GdkDisplay *display)
+{
+ return g_list_length (GDK_MIR_DISPLAY (display)->monitors);
+}
+
+static GdkMonitor *
+gdk_mir_display_get_monitor (GdkDisplay *display,
+ int index)
+{
+ g_return_val_if_fail (0 <= index && index < gdk_display_get_n_monitors (display), NULL);
+
+ return g_list_nth_data (GDK_MIR_DISPLAY (display)->monitors, index);
+}
static void
gdk_mir_display_init (GdkMirDisplay *display)
@@ -739,4 +813,6 @@ gdk_mir_display_class_init (GdkMirDisplayClass *klass)
display_class->text_property_to_utf8_list = gdk_mir_display_text_property_to_utf8_list;
display_class->utf8_to_string_target = gdk_mir_display_utf8_to_string_target;
display_class->make_gl_context_current = gdk_mir_display_make_gl_context_current;
+ display_class->get_n_monitors = gdk_mir_display_get_n_monitors;
+ display_class->get_monitor = gdk_mir_display_get_monitor;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]