diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2018-07-03 10:14:57 +0000 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2018-07-03 10:14:57 +0000 |
commit | 927004178f17ffabac42c75009c5ea0d8c601527 (patch) | |
tree | 2347734ce384de31902b25b95e591e2567d42163 | |
parent | 1b8de2d5fa27cd4c8d249c5e176ac0bff154f252 (diff) | |
parent | d49335c59a7a5aa397a9740c74e5ee2068394890 (diff) | |
download | gtk+-927004178f17ffabac42c75009c5ea0d8c601527.tar.gz |
Merge branch 'fix_wayland_csd_announce' into 'gtk-3-24'
Fix gdk_wayland_window_announce_csd
See merge request GNOME/gtk!221
-rw-r--r-- | gdk/wayland/gdkwaylandwindow.h | 3 | ||||
-rw-r--r-- | gdk/wayland/gdkwindow-wayland.c | 76 | ||||
-rw-r--r-- | gtk/gtkwindow.c | 9 |
3 files changed, 79 insertions, 9 deletions
diff --git a/gdk/wayland/gdkwaylandwindow.h b/gdk/wayland/gdkwaylandwindow.h index 93b7802b6e..59fbd5727d 100644 --- a/gdk/wayland/gdkwaylandwindow.h +++ b/gdk/wayland/gdkwaylandwindow.h @@ -80,6 +80,9 @@ gboolean gdk_wayland_window_set_transient_for_exported (GdkWindo GDK_AVAILABLE_IN_3_22 void gdk_wayland_window_announce_csd (GdkWindow *window); +GDK_AVAILABLE_IN_3_24 +void gdk_wayland_window_announce_ssd (GdkWindow *window); + G_END_DECLS #endif /* __GDK_WAYLAND_WINDOW_H__ */ diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 5a2fdf0223..3da3ac5b68 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -145,6 +145,7 @@ struct _GdkWindowImplWayland unsigned int pending_buffer_attached : 1; unsigned int pending_commit : 1; unsigned int awaiting_frame : 1; + unsigned int using_csd : 1; GdkWindowTypeHint hint; GdkWindow *transient_for; GdkWindow *popup_parent; @@ -258,6 +259,7 @@ static void calculate_moved_to_rect_result (GdkWindow *window, static gboolean gdk_wayland_window_is_exported (GdkWindow *window); static void gdk_wayland_window_unexport (GdkWindow *window); +static void gdk_wayland_window_announce_decoration_mode (GdkWindow *window); GType _gdk_window_impl_wayland_get_type (void); @@ -388,6 +390,8 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS impl->scale = gdk_screen_get_monitor_scale_factor (screen, 0); G_GNUC_END_IGNORE_DEPRECATIONS + impl->using_csd = TRUE; + /* logical 1x1 fake buffer */ impl->staging_cairo_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, impl->scale, @@ -691,6 +695,7 @@ _gdk_wayland_display_create_window_impl (GdkDisplay *display, window->impl = GDK_WINDOW_IMPL (impl); impl->wrapper = GDK_WINDOW (window); impl->shortcuts_inhibitors = g_hash_table_new (NULL, NULL); + impl->using_csd = TRUE; if (window->width > 65535) { @@ -2064,19 +2069,68 @@ window_anchor_to_gravity_legacy (GdkGravity rect_anchor) } } -void -gdk_wayland_window_announce_csd (GdkWindow *window) +static void +kwin_server_decoration_mode_set (void *data, struct org_kde_kwin_server_decoration *org_kde_kwin_server_decoration, uint32_t mode) +{ + GdkWindow *window = GDK_WINDOW (data); + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + + if ((mode == ORG_KDE_KWIN_SERVER_DECORATION_MODE_SERVER && impl->using_csd) || + (mode == ORG_KDE_KWIN_SERVER_DECORATION_MODE_CLIENT && !impl->using_csd)) + gdk_wayland_window_announce_decoration_mode (window); +} + +static const struct org_kde_kwin_server_decoration_listener kwin_server_decoration_listener = { + kwin_server_decoration_mode_set +}; + +static void +gdk_wayland_window_announce_decoration_mode (GdkWindow *window) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window)); GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + 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) + { + impl->display_server.server_decoration = + org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager, + impl->display_server.wl_surface); + org_kde_kwin_server_decoration_add_listener (impl->display_server.server_decoration, + &kwin_server_decoration_listener, + window); + } + 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); + { + if (impl->using_csd) + org_kde_kwin_server_decoration_request_mode (impl->display_server.server_decoration, + ORG_KDE_KWIN_SERVER_DECORATION_MODE_CLIENT); + else + org_kde_kwin_server_decoration_request_mode (impl->display_server.server_decoration, + ORG_KDE_KWIN_SERVER_DECORATION_MODE_SERVER); + } +} + +void +gdk_wayland_window_announce_csd (GdkWindow *window) +{ + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + + impl->using_csd = TRUE; + if (impl->mapped) + gdk_wayland_window_announce_decoration_mode (window); +} + +void +gdk_wayland_window_announce_ssd (GdkWindow *window) +{ + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + + impl->using_csd = FALSE; + if (impl->mapped) + gdk_wayland_window_announce_decoration_mode (window); } static GdkWindow * @@ -2906,11 +2960,13 @@ gdk_wayland_window_map (GdkWindow *window) else { gdk_wayland_window_create_xdg_toplevel (window); + gdk_wayland_window_announce_decoration_mode (window); } } else { gdk_wayland_window_create_xdg_toplevel (window); + gdk_wayland_window_announce_decoration_mode (window); } impl->mapped = TRUE; @@ -3074,6 +3130,12 @@ gdk_wayland_window_hide_surface (GdkWindow *window) impl->application.was_set = FALSE; } + if (impl->display_server.server_decoration) + { + org_kde_kwin_server_decoration_release (impl->display_server.server_decoration); + impl->display_server.server_decoration = NULL; + } + wl_surface_destroy (impl->display_server.wl_surface); impl->display_server.wl_surface = NULL; diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index b5f4b5af3d..9a4c8989a5 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -7489,8 +7489,13 @@ gtk_window_realize (GtkWidget *widget) gdk_window_set_decorations (gdk_window, 0); #ifdef GDK_WINDOWING_WAYLAND - if (priv->client_decorated && GDK_IS_WAYLAND_WINDOW (gdk_window)) - gdk_wayland_window_announce_csd (gdk_window); + if (GDK_IS_WAYLAND_WINDOW (gdk_window)) + { + if (priv->client_decorated) + gdk_wayland_window_announce_csd (gdk_window); + else + gdk_wayland_window_announce_ssd (gdk_window); + } #endif if (!priv->deletable) |