diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index 99707524b3..bf220146e1 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -113,7 +113,7 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id } else if (strcmp(interface, "wl_output") == 0) { output = wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1); - _gdk_wayland_screen_add_output(display_wayland->screen, output); + _gdk_wayland_screen_add_output(display_wayland->screen, id, output); /* We need to roundtrip until we've received the modes and * geometry events for the output, which gives us the physical * properties and available modes on the output. */ @@ -142,6 +142,8 @@ gdk_registry_handle_global_remove(void *data, /* We don't know what this item is - try as an output */ _gdk_wayland_screen_remove_output_by_id (display_wayland->screen, id); + + /* FIXME: the object needs to be destroyed here, we're leaking */ } static const struct wl_registry_listener registry_listener = { diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index 9c958e4470..0bdba52c61 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -151,7 +151,8 @@ 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, +void _gdk_wayland_screen_add_output (GdkScreen *screen, + guint32 id, struct wl_output *output); void _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen, guint32 id); diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index 845ae141a0..c357121a73 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -80,6 +80,7 @@ struct _GdkWaylandScreenClass struct _GdkWaylandMonitor { GdkWaylandScreen *screen; + guint32 id; struct wl_output *output; GdkRectangle geometry; int width_mm; @@ -935,12 +936,14 @@ static const struct wl_output_listener output_listener = }; void -_gdk_wayland_screen_add_output (GdkScreen *screen, +_gdk_wayland_screen_add_output (GdkScreen *screen, + guint32 id, struct wl_output *output) { GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen); GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1); + monitor->id = id; monitor->output = output; monitor->screen = screen_wayland; g_ptr_array_add(screen_wayland->monitors, monitor); @@ -959,7 +962,7 @@ _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen, { GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i]; - if (wl_proxy_get_id ((struct wl_proxy *)monitor->output) == id) + if (monitor->id == id) { g_ptr_array_remove (screen_wayland->monitors, monitor);