g_list_free (list);
}
-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)
} 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,
GdkVisual *visual;
/* Xinerama/RandR 1.2 */
- gint n_monitors;
- GdkWaylandMonitor *monitors;
- gint primary_monitor;
+ GPtrArray *monitors;
+ gint primary_monitor;
};
struct _GdkWaylandScreenClass
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
{
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;
}
{
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
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
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
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 *
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
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 *
_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)
+{
+}