[gtk+] wayland: Handle wl_output in GdkWaylandScreen



commit ff2a387154f3b17d195bb9755b83e75cce82bdff
Author: Jan Arne Petersen <jpetersen openismus com>
Date:   Sat Feb 2 14:42:29 2013 +0100

    wayland: Handle wl_output in GdkWaylandScreen
    
    Expose information about outputs in GdkScreen (gdk_screen_get_n_monitors
    and gdk_screen_get_monitor_*).

 gdk/wayland/gdkdisplay-wayland.c |   30 +---------
 gdk/wayland/gdkprivate-wayland.h |    4 +
 gdk/wayland/gdkscreen-wayland.c  |  122 +++++++++++++++++++++++++-------------
 3 files changed, 85 insertions(+), 71 deletions(-)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 4fb9188..640e3e9 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -89,33 +89,6 @@ gdk_input_init (GdkDisplay *display)
 }
 
 static void
-output_handle_geometry(void *data,
-		       struct wl_output *wl_output,
-		       int x, int y, int physical_width, int physical_height,
-		       int subpixel, const char *make, const char *model,
-		       int32_t transform)
-{
-  /*
-    g_signal_emit_by_name (screen, "monitors-changed");
-    g_signal_emit_by_name (screen, "size-changed");
-  */
-}
-static void
-display_handle_mode(void *data,
-                   struct wl_output *wl_output,
-                   uint32_t flags,
-                   int width,
-                   int height,
-                   int refresh)
-{
-}
-
-static const struct wl_output_listener output_listener = {
-	output_handle_geometry,
-	display_handle_mode
-};
-
-static void
 gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id,
 					const char *interface, uint32_t version)
 {
@@ -138,8 +111,7 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id
   } else if (strcmp(interface, "wl_output") == 0) {
     display_wayland->output =
       wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
-    wl_output_add_listener(display_wayland->output,
-			   &output_listener, display_wayland);
+    _gdk_wayland_screen_add_output(display_wayland->screen, display_wayland->output);
   } else if (strcmp(interface, "wl_seat") == 0) {
     seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 1);
     _gdk_wayland_device_manager_add_device (gdk_display->device_manager,
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 0bee702..21684d8 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -144,6 +144,10 @@ GdkWindow *_gdk_wayland_screen_create_root_window (GdkScreen *screen,
 						   int height);
 
 GdkScreen *_gdk_wayland_screen_new (GdkDisplay *display);
+void _gdk_wayland_screen_add_output (GdkScreen *scren,
+                                     struct wl_output *output);
+void _gdk_wayland_screen_remove_output (GdkScreen *screen,
+                                        struct wl_output *output);
 
 void _gdk_wayland_display_manager_add_display (GdkDisplayManager *manager,
 					       GdkDisplay        *display);
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index 77a4238..cf4bd2d 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -54,9 +54,8 @@ struct _GdkWaylandScreen
   GdkVisual *visual;
 
   /* Xinerama/RandR 1.2 */
-  gint		     n_monitors;
-  GdkWaylandMonitor *monitors;
-  gint               primary_monitor;
+  GPtrArray *monitors;
+  gint       primary_monitor;
 };
 
 struct _GdkWaylandScreenClass
@@ -77,37 +76,18 @@ struct _GdkWaylandMonitor
 
 G_DEFINE_TYPE (GdkWaylandScreen, _gdk_wayland_screen, GDK_TYPE_SCREEN)
 
-#define MM_PER_INCH 25
-#define DEFAULT_DPI 96
-
 static void
-init_monitor_geometry (GdkWaylandMonitor *monitor,
-		       int x, int y, int width, int height)
+free_monitor (gpointer data)
 {
-  monitor->geometry.x = x;
-  monitor->geometry.y = y;
-  monitor->geometry.width = width;
-  monitor->geometry.height = height;
+  GdkWaylandMonitor *monitor = data;
 
-  monitor->width_mm = width/DEFAULT_DPI*MM_PER_INCH;
-  monitor->height_mm = height/DEFAULT_DPI*MM_PER_INCH;
-  monitor->output_name = NULL;
-  monitor->manufacturer = NULL;
-}
+  if (monitor == NULL)
+    return;
 
-static void
-free_monitors (GdkWaylandMonitor *monitors,
-               gint           n_monitors)
-{
-  int i;
-
-  for (i = 0; i < n_monitors; ++i)
-    {
-      g_free (monitors[i].output_name);
-      g_free (monitors[i].manufacturer);
-    }
+  g_free (monitor->output_name);
+  g_free (monitor->manufacturer);
 
-  g_free (monitors);
+  g_free (monitor);
 }
 
 static void
@@ -115,9 +95,8 @@ deinit_multihead (GdkScreen *screen)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
 
-  free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
+  g_ptr_array_free (screen_wayland->monitors, TRUE);
 
-  screen_wayland->n_monitors = 0;
   screen_wayland->monitors = NULL;
 }
 
@@ -126,13 +105,8 @@ init_multihead (GdkScreen *screen)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
 
-  /* No multihead support of any kind for this screen */
-  screen_wayland->n_monitors = 1;
-  screen_wayland->monitors = g_new0 (GdkWaylandMonitor, 1);
+  screen_wayland->monitors = g_ptr_array_new_with_free_func (free_monitor);
   screen_wayland->primary_monitor = 0;
-
-  init_monitor_geometry (screen_wayland->monitors, 0, 0,
-			 screen_wayland->width, screen_wayland->height);
 }
 
 static void
@@ -206,7 +180,7 @@ gdk_wayland_screen_get_root_window (GdkScreen *screen)
 static gint
 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
 {
-  return GDK_WAYLAND_SCREEN (screen)->n_monitors;
+  return GDK_WAYLAND_SCREEN (screen)->monitors->len;
 }
 
 static gint
@@ -220,8 +194,9 @@ gdk_wayland_screen_get_monitor_width_mm	(GdkScreen *screen,
 					 gint       monitor_num)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
 
-  return screen_wayland->monitors[monitor_num].width_mm;
+  return monitor->width_mm;
 }
 
 static gint
@@ -229,8 +204,9 @@ gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
 					  gint       monitor_num)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
 
-  return screen_wayland->monitors[monitor_num].height_mm;
+  return monitor->height_mm;
 }
 
 static gchar *
@@ -238,8 +214,9 @@ gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
 					  gint       monitor_num)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
 
-  return g_strdup (screen_wayland->monitors[monitor_num].output_name);
+  return g_strdup (monitor->output_name);
 }
 
 static void
@@ -248,9 +225,10 @@ gdk_wayland_screen_get_monitor_geometry (GdkScreen    *screen,
 					 GdkRectangle *dest)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
 
   if (dest)
-    *dest = screen_wayland->monitors[monitor_num].geometry;
+    *dest = monitor->geometry;
 }
 
 static GdkVisual *
@@ -561,3 +539,63 @@ static void
 _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)
 {
 }
+
+static void
+output_handle_geometry(void *data,
+		       struct wl_output *wl_output,
+		       int x, int y, int physical_width, int physical_height,
+		       int subpixel, const char *make, const char *model,
+		       int32_t transform)
+{
+  GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
+
+  monitor->geometry.x = x;
+  monitor->geometry.y = y;
+
+  monitor->width_mm = physical_width;
+  monitor->height_mm = physical_height;
+
+  monitor->manufacturer = g_strdup (make);
+  monitor->output_name = g_strdup (model);
+}
+
+static void
+output_handle_mode(void *data,
+                   struct wl_output *wl_output,
+                   uint32_t flags,
+                   int width,
+                   int height,
+                   int refresh)
+{
+  GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
+
+  if ((flags & WL_OUTPUT_MODE_CURRENT) == 0)
+    return;
+
+  monitor->geometry.width = width;
+  monitor->geometry.height = height;
+}
+
+static const struct wl_output_listener output_listener =
+{
+  output_handle_geometry,
+  output_handle_mode
+};
+
+void
+_gdk_wayland_screen_add_output (GdkScreen *screen,
+                                struct wl_output *output)
+{
+  GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
+
+  g_ptr_array_add(screen_wayland->monitors, monitor);
+
+  wl_output_add_listener(output, &output_listener, monitor);
+}
+
+void
+_gdk_wayland_screen_remove_output (GdkScreen *screen,
+                                   struct wl_output *output)
+{
+}


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