[gtk+] wayland: Handle wl_output in GdkWaylandScreen
- From: Rob Bradford <rbradford src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] wayland: Handle wl_output in GdkWaylandScreen
- Date: Wed, 13 Feb 2013 15:57:29 +0000 (UTC)
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]