GdkModifierType *mask)
{
GdkWaylandPointerData *pointer;
+ GList *children;
if (window == NULL)
- window = GDK_WAYLAND_DISPLAY (gdk_device_get_display (device))->root_window;
+ children = gdk_wayland_display_get_toplevel_windows (gdk_device_get_display (device));
+ else
+ children = window->children;
pointer = GDK_WAYLAND_DEVICE (device)->pointer;
if (child_window)
/* Set child only if actually a child of the given window, as XIQueryPointer() does */
- *child_window = g_list_find (window->children, pointer->focus) ? pointer->focus : NULL;
+ *child_window = g_list_find (children, pointer->focus) ? pointer->focus : NULL;
if (mask)
*mask = device_get_modifiers (device);
display_wayland = GDK_WAYLAND_DISPLAY (display);
display_wayland->wl_display = wl_display;
- display_wayland->root_window = _gdk_wayland_display_create_root_window (display, 0, 0);
display_wayland->event_source = _gdk_wayland_display_event_source_new (display);
init_settings (display);
return display;
}
+static void
+destroy_toplevel (gpointer data)
+{
+ _gdk_window_destroy (GDK_WINDOW (data), FALSE);
+}
+
static void
gdk_wayland_display_dispose (GObject *object)
{
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (object);
- if (display_wayland->root_window)
- _gdk_window_destroy (display_wayland->root_window, FALSE);
+ g_list_free_full (display_wayland->toplevels, destroy_toplevel);
if (display_wayland->event_source)
{
_gdk_wayland_display_finalize_cursors (display_wayland);
- if (display_wayland->root_window)
- g_object_unref (display_wayland->root_window);
-
g_free (display_wayland->startup_notification_id);
g_free (display_wayland->cursor_theme_name);
xkb_context_unref (display_wayland->xkb_context);
display->monitors = g_ptr_array_new_with_free_func (g_object_unref);
}
+GList *
+gdk_wayland_display_get_toplevel_windows (GdkDisplay *display)
+{
+ return GDK_WAYLAND_DISPLAY (display)->toplevels;
+}
+
void
gdk_wayland_display_set_cursor_theme (GdkDisplay *display,
const gchar *name,
#endif
+static void
+update_scale (GdkDisplay *display)
+{
+ g_list_foreach (gdk_wayland_display_get_toplevel_windows (display),
+ (GFunc)gdk_wayland_window_update_scale,
+ NULL);
+}
+
static void
output_handle_geometry (void *data,
struct wl_output *wl_output,
gdk_monitor_set_model (GDK_MONITOR (monitor), model);
if (GDK_MONITOR (monitor)->geometry.width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE)
- {
- GdkDisplay *display = GDK_MONITOR (monitor)->display;
- window_update_scale (GDK_WAYLAND_DISPLAY (display)->root_window);
- }
+ update_scale (GDK_MONITOR (monitor)->display);
}
static void
gdk_display_monitor_added (display, GDK_MONITOR (monitor));
}
- window_update_scale (GDK_WAYLAND_DISPLAY (display)->root_window);
+ update_scale (display);
}
static void
gdk_monitor_set_size (GDK_MONITOR (monitor), width / scale, height / scale);
if (GDK_MONITOR (monitor)->geometry.width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE)
- window_update_scale (GDK_WAYLAND_DISPLAY (GDK_MONITOR (monitor)->display)->root_window);
+ update_scale (GDK_MONITOR (monitor)->display);
}
static void
gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh);
if (width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE)
- window_update_scale (GDK_WAYLAND_DISPLAY (GDK_MONITOR (monitor)->display)->root_window);
+ update_scale (GDK_MONITOR (monitor)->display);
}
static const struct wl_output_listener output_listener =
g_object_ref (monitor);
g_ptr_array_remove (display_wayland->monitors, monitor);
gdk_display_monitor_removed (GDK_DISPLAY (display_wayland), GDK_MONITOR (monitor));
- window_update_scale (display_wayland->root_window);
+ update_scale (GDK_DISPLAY (display_wayland));
g_object_unref (monitor);
}
}
}
void
-window_update_scale (GdkWindow *window)
+gdk_wayland_window_update_scale (GdkWindow *window)
{
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
for (c = children; c; c = c->next)
{
GdkWindow *child = c->data;
- window_update_scale (child);
+ gdk_wayland_window_update_scale (child);
}
g_list_free (children);
}
break;
}
+ if (real_parent == NULL)
+ display_wayland->toplevels = g_list_prepend (display_wayland->toplevels, window);
+
gdk_wayland_window_create_surface (window);
frame_clock = gdk_window_get_frame_clock (window);
impl->display_server.outputs = g_slist_prepend (impl->display_server.outputs, output);
- window_update_scale (window);
+ gdk_wayland_window_update_scale (window);
}
static void
impl->display_server.outputs = g_slist_remove (impl->display_server.outputs, output);
if (impl->display_server.outputs)
- window_update_scale (window);
+ gdk_wayland_window_update_scale (window);
}
static const struct wl_surface_listener surface_listener = {
gdk_wayland_window_hide_surface (window);
drop_cairo_surfaces (window);
+
+ if (window->parent == NULL)
+ {
+ GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
+ display->toplevels = g_list_remove (display->toplevels, window);
+ }
}
static void