diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2021-11-09 06:56:27 +0000 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2021-11-09 06:56:27 +0000 |
commit | 56404b7006d97db7407ef05a06a2127ee995d5d0 (patch) | |
tree | 662890a8396fcdf9c373243d41f5d62a6b496034 | |
parent | 08d48201e998a06c07c5148b37bc374bbdcb9353 (diff) | |
parent | 1c6608f4267e4d2289664ed8453f1923820f6146 (diff) | |
download | gtk+-56404b7006d97db7407ef05a06a2127ee995d5d0.tar.gz |
Merge branch 'gdksurface-wayland' into 'master'
Move some members of `GtkWaylandSurface` to `GtkWaylandToplevel`
See merge request GNOME/gtk!3918
-rw-r--r-- | gdk/wayland/gdksurface-wayland.c | 168 |
1 files changed, 97 insertions, 71 deletions
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c index dc0b18779d..c2d4ea464c 100644 --- a/gdk/wayland/gdksurface-wayland.c +++ b/gdk/wayland/gdksurface-wayland.c @@ -104,8 +104,6 @@ struct _GdkWaylandSurface struct gtk_surface1 *gtk_surface; struct wl_egl_window *egl_window; - struct zxdg_exported_v1 *xdg_exported; - struct org_kde_kwin_server_decoration *server_decoration; } display_server; struct wl_event_queue *event_queue; @@ -224,17 +222,8 @@ struct _GdkWaylandSurface int state_freeze_count; - struct { - GdkWaylandToplevelExported callback; - gpointer user_data; - GDestroyNotify destroy_func; - } exported; - struct zxdg_imported_v1 *imported_transient_for; GHashTable *shortcuts_inhibitors; - - struct zwp_idle_inhibitor_v1 *idle_inhibitor; - size_t idle_inhibitor_refcount; }; typedef struct _GdkWaylandSurfaceClass GdkWaylandSurfaceClass; @@ -250,6 +239,18 @@ struct _GdkWaylandToplevel GdkWaylandSurface parent_instance; GdkWaylandToplevel *transient_for; + + struct org_kde_kwin_server_decoration *server_decoration; + struct zxdg_exported_v1 *xdg_exported; + + struct { + GdkWaylandToplevelExported callback; + gpointer user_data; + GDestroyNotify destroy_func; + } exported; + + struct zwp_idle_inhibitor_v1 *idle_inhibitor; + size_t idle_inhibitor_refcount; }; typedef struct @@ -329,7 +330,7 @@ static void update_popup_layout_state (GdkSurface *surface, int height, GdkPopupLayout *layout); -static gboolean gdk_wayland_surface_is_exported (GdkWaylandSurface *impl); +static gboolean gdk_wayland_toplevel_is_exported (GdkWaylandToplevel *wayland_toplevel); static void configure_toplevel_geometry (GdkSurface *surface); @@ -988,9 +989,6 @@ gdk_wayland_surface_finalize (GObject *object) impl = GDK_WAYLAND_SURFACE (object); - if (gdk_wayland_surface_is_exported (impl)) - gdk_wayland_toplevel_unexport_handle (GDK_TOPLEVEL (impl)); - g_free (impl->title); g_free (impl->application.application_id); @@ -1028,8 +1026,7 @@ is_realized_popup (GdkWaylandSurface *impl) impl->display_server.zxdg_popup_v6); } -static void gdk_wayland_surface_show (GdkSurface *surface, - gboolean already_mapped); +static void gdk_wayland_surface_show (GdkSurface *surface); static void gdk_wayland_surface_hide (GdkSurface *surface); static void @@ -1062,7 +1059,7 @@ gdk_wayland_surface_maybe_resize (GdkSurface *surface, gdk_wayland_surface_update_size (surface, width, height, scale); if (is_xdg_popup && is_visible && !impl->initial_configure_received) - gdk_wayland_surface_show (surface, FALSE); + gdk_wayland_surface_show (surface); } static void @@ -2238,57 +2235,62 @@ void gdk_wayland_toplevel_announce_csd (GdkToplevel *toplevel) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (GDK_SURFACE (toplevel))); - GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel); + GdkWaylandToplevel *toplevel_wayland; g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel)); + toplevel_wayland = GDK_WAYLAND_TOPLEVEL (toplevel); if (!display_wayland->server_decoration_manager) return; - impl->display_server.server_decoration = - org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager, - impl->display_server.wl_surface); - if (impl->display_server.server_decoration) - org_kde_kwin_server_decoration_request_mode (impl->display_server.server_decoration, - ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_CLIENT); + toplevel_wayland->server_decoration = + org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager, + gdk_wayland_surface_get_wl_surface (GDK_SURFACE (toplevel_wayland))); + if (toplevel_wayland->server_decoration) + org_kde_kwin_server_decoration_request_mode (toplevel_wayland->server_decoration, + ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_CLIENT); } void gdk_wayland_toplevel_announce_ssd (GdkToplevel *toplevel) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (GDK_SURFACE (toplevel))); - GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel); + GdkWaylandToplevel *toplevel_wayland; g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel)); + toplevel_wayland = GDK_WAYLAND_TOPLEVEL (toplevel); if (!display_wayland->server_decoration_manager) return; - impl->display_server.server_decoration = - org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager, - impl->display_server.wl_surface); - if (impl->display_server.server_decoration) - org_kde_kwin_server_decoration_request_mode (impl->display_server.server_decoration, - ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER); + toplevel_wayland->server_decoration = + org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager, + gdk_wayland_surface_get_wl_surface (GDK_SURFACE (toplevel_wayland))); + if (toplevel_wayland->server_decoration) + org_kde_kwin_server_decoration_request_mode (toplevel_wayland->server_decoration, + ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER); } gboolean gdk_wayland_toplevel_inhibit_idle (GdkToplevel *toplevel) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (GDK_SURFACE (toplevel))); - GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel); + GdkWaylandToplevel *wayland_toplevel; g_return_val_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel), FALSE); + wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); if (!display_wayland->idle_inhibit_manager) return FALSE; - if (!impl->idle_inhibitor) + if (!wayland_toplevel->idle_inhibitor) { - g_assert (impl->idle_inhibitor_refcount == 0); - impl->idle_inhibitor = - zwp_idle_inhibit_manager_v1_create_inhibitor (display_wayland->idle_inhibit_manager, - impl->display_server.wl_surface); + g_assert (wayland_toplevel->idle_inhibitor && + wayland_toplevel->idle_inhibitor_refcount > 0); + + wayland_toplevel->idle_inhibitor = + zwp_idle_inhibit_manager_v1_create_inhibitor (display_wayland->idle_inhibit_manager, + gdk_wayland_surface_get_wl_surface (GDK_SURFACE (wayland_toplevel))); } - ++impl->idle_inhibitor_refcount; + ++wayland_toplevel->idle_inhibitor_refcount; return TRUE; } @@ -2296,14 +2298,19 @@ gdk_wayland_toplevel_inhibit_idle (GdkToplevel *toplevel) void gdk_wayland_toplevel_uninhibit_idle (GdkToplevel *toplevel) { - GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel); + GdkWaylandToplevel *wayland_toplevel; g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel)); + wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); - g_assert (impl->idle_inhibitor && impl->idle_inhibitor_refcount > 0); + g_assert (wayland_toplevel->idle_inhibitor && + wayland_toplevel->idle_inhibitor_refcount > 0); - if (--impl->idle_inhibitor_refcount == 0) - g_clear_pointer (&impl->idle_inhibitor, zwp_idle_inhibitor_v1_destroy); + if (--wayland_toplevel->idle_inhibitor_refcount == 0) + { + g_clear_pointer (&wayland_toplevel->idle_inhibitor, + zwp_idle_inhibitor_v1_destroy); + } } static void @@ -2850,8 +2857,7 @@ gdk_wayland_surface_map_toplevel (GdkSurface *surface) } static void -gdk_wayland_surface_show (GdkSurface *surface, - gboolean already_mapped) +gdk_wayland_surface_show (GdkSurface *surface) { GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface); @@ -4420,13 +4426,13 @@ xdg_exported_handle (void *data, const char *handle) { GdkToplevel *toplevel = data; - GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel); + GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); - impl->exported.callback (toplevel, handle, impl->exported.user_data); - if (impl->exported.destroy_func) + wayland_toplevel->exported.callback (toplevel, handle, wayland_toplevel->exported.user_data); + if (wayland_toplevel->exported.destroy_func) { - g_clear_pointer (&impl->exported.user_data, - impl->exported.destroy_func); + g_clear_pointer (&wayland_toplevel->exported.user_data, + wayland_toplevel->exported.destroy_func); } } @@ -4450,9 +4456,9 @@ static const struct zxdg_exported_v1_listener xdg_exported_listener = { */ static gboolean -gdk_wayland_surface_is_exported (GdkWaylandSurface *impl) +gdk_wayland_toplevel_is_exported (GdkWaylandToplevel *wayland_toplevel) { - return !!impl->display_server.xdg_exported; + return !!wayland_toplevel->xdg_exported; } /** @@ -4489,7 +4495,8 @@ gdk_wayland_toplevel_export_handle (GdkToplevel *toplevel, gpointer user_data, GDestroyNotify destroy_func) { - GdkWaylandSurface *impl; + GdkWaylandToplevel *wayland_toplevel; + GdkSurface *surface; GdkWaylandDisplay *display_wayland; GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (toplevel)); struct zxdg_exported_v1 *xdg_exported; @@ -4497,10 +4504,11 @@ gdk_wayland_toplevel_export_handle (GdkToplevel *toplevel, g_return_val_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel), FALSE); g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE); - impl = GDK_WAYLAND_SURFACE (toplevel); + wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); + surface = GDK_SURFACE (toplevel); display_wayland = GDK_WAYLAND_DISPLAY (display); - g_return_val_if_fail (!impl->display_server.xdg_exported, FALSE); + g_return_val_if_fail (!wayland_toplevel->xdg_exported, FALSE); if (!display_wayland->xdg_exporter) { @@ -4508,14 +4516,16 @@ gdk_wayland_toplevel_export_handle (GdkToplevel *toplevel, return FALSE; } - xdg_exported = zxdg_exporter_v1_export (display_wayland->xdg_exporter, - impl->display_server.wl_surface); - zxdg_exported_v1_add_listener (xdg_exported, &xdg_exported_listener, impl); + xdg_exported = + zxdg_exporter_v1_export (display_wayland->xdg_exporter, + gdk_wayland_surface_get_wl_surface (surface)); + zxdg_exported_v1_add_listener (xdg_exported, &xdg_exported_listener, + wayland_toplevel); - impl->display_server.xdg_exported = xdg_exported; - impl->exported.callback = callback; - impl->exported.user_data = user_data; - impl->exported.destroy_func = destroy_func; + wayland_toplevel->xdg_exported = xdg_exported; + wayland_toplevel->exported.callback = callback; + wayland_toplevel->exported.user_data = user_data; + wayland_toplevel->exported.destroy_func = destroy_func; return TRUE; } @@ -4536,20 +4546,20 @@ gdk_wayland_toplevel_export_handle (GdkToplevel *toplevel, void gdk_wayland_toplevel_unexport_handle (GdkToplevel *toplevel) { - GdkWaylandSurface *impl; + GdkWaylandToplevel *wayland_toplevel; g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel)); - impl = GDK_WAYLAND_SURFACE (toplevel); + wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); - g_return_if_fail (impl->display_server.xdg_exported); + g_return_if_fail (wayland_toplevel->xdg_exported); - g_clear_pointer (&impl->display_server.xdg_exported, + g_clear_pointer (&wayland_toplevel->xdg_exported, zxdg_exported_v1_destroy); - if (impl->exported.destroy_func) + if (wayland_toplevel->exported.destroy_func) { - g_clear_pointer (&impl->exported.user_data, - impl->exported.destroy_func); + g_clear_pointer (&wayland_toplevel->exported.user_data, + wayland_toplevel->exported.destroy_func); } } @@ -4926,12 +4936,28 @@ gdk_wayland_toplevel_get_property (GObject *object, } static void +gdk_wayland_toplevel_finalize (GObject *object) +{ + GdkWaylandToplevel *wayland_toplevel; + + g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (object)); + + wayland_toplevel = GDK_WAYLAND_TOPLEVEL (object); + + if (gdk_wayland_toplevel_is_exported (wayland_toplevel)) + gdk_wayland_toplevel_unexport_handle (GDK_TOPLEVEL (wayland_toplevel)); + + G_OBJECT_CLASS (gdk_wayland_toplevel_parent_class)->finalize (object); +} + +static void gdk_wayland_toplevel_class_init (GdkWaylandToplevelClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->get_property = gdk_wayland_toplevel_get_property; object_class->set_property = gdk_wayland_toplevel_set_property; + object_class->finalize = gdk_wayland_toplevel_finalize; gdk_toplevel_install_properties (object_class, 1); } @@ -4977,7 +5003,7 @@ gdk_wayland_toplevel_present (GdkToplevel *toplevel, g_clear_pointer (&impl->toplevel.layout, gdk_toplevel_layout_unref); impl->toplevel.layout = gdk_toplevel_layout_copy (layout); - gdk_wayland_surface_show (surface, FALSE); + gdk_wayland_surface_show (surface); if (!pending_configure) { @@ -5125,7 +5151,7 @@ gdk_wayland_drag_surface_present (GdkDragSurface *drag_surface, GdkSurface *surface = GDK_SURFACE (drag_surface); GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface); - gdk_wayland_surface_show (surface, FALSE); + gdk_wayland_surface_show (surface); impl->next_layout.configured_width = width; impl->next_layout.configured_height = height; |