From 5c422b7c93ffa280376f4aef6b5f0336c4d1296d Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 22 Jan 2019 16:13:08 +0100 Subject: [PATCH] Added KDE server side window decoration interface as fallback. --- uwac/libuwac/CMakeLists.txt | 1 + uwac/libuwac/uwac-display.c | 7 ++ uwac/libuwac/uwac-priv.h | 3 + uwac/libuwac/uwac-window.c | 14 ++++ uwac/protocols/server-decoration.xml | 96 ++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 uwac/protocols/server-decoration.xml diff --git a/uwac/libuwac/CMakeLists.txt b/uwac/libuwac/CMakeLists.txt index 43557d464..82cea7c89 100644 --- a/uwac/libuwac/CMakeLists.txt +++ b/uwac/libuwac/CMakeLists.txt @@ -38,6 +38,7 @@ endmacro() generate_protocol_file(xdg-shell) generate_protocol_file(xdg-decoration-unstable-v1) +generate_protocol_file(server-decoration) generate_protocol_file(ivi-application) generate_protocol_file(fullscreen-shell-unstable-v1) generate_protocol_file(keyboard-shortcuts-inhibit-unstable-v1) diff --git a/uwac/libuwac/uwac-display.c b/uwac/libuwac/uwac-display.c index 2db27b87b..27014e547 100644 --- a/uwac/libuwac/uwac-display.c +++ b/uwac/libuwac/uwac-display.c @@ -224,6 +224,10 @@ static void registry_handle_global(void* data, struct wl_registry* registry, uin { d->deco_manager = wl_registry_bind(registry, id, &zxdg_decoration_manager_v1_interface, 1); } + else if (strcmp(interface, "org_kde_kwin_server_decoration_manager") == 0) + { + d->kde_deco_manager = wl_registry_bind(registry, id, &org_kde_kwin_server_decoration_manager_interface, 1); + } #if BUILD_IVI else if (strcmp(interface, "ivi_application") == 0) { @@ -525,6 +529,9 @@ UwacReturnCode UwacCloseDisplay(UwacDisplay** pdisplay) if (display->deco_manager) zxdg_decoration_manager_v1_destroy(display->deco_manager); + if (display->kde_deco_manager) + org_kde_kwin_server_decoration_manager_destroy(display->kde_deco_manager); + #ifdef BUILD_FULLSCREEN_SHELL if (display->fullscreen_shell) diff --git a/uwac/libuwac/uwac-priv.h b/uwac/libuwac/uwac-priv.h index 5e7cc55b7..8a27b158f 100644 --- a/uwac/libuwac/uwac-priv.h +++ b/uwac/libuwac/uwac-priv.h @@ -30,6 +30,7 @@ #include "xdg-shell-client-protocol.h" #include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h" #include "xdg-decoration-unstable-v1-client-protocol.h" +#include "server-decoration-client-protocol.h" #ifdef BUILD_IVI #include "ivi-application-client-protocol.h" @@ -91,6 +92,7 @@ struct uwac_display { struct xdg_wm_base *xdg_base; struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_inhibit_manager; struct zxdg_decoration_manager_v1 *deco_manager; + struct org_kde_kwin_server_decoration_manager *kde_deco_manager; #ifdef BUILD_IVI struct ivi_application *ivi_application; #endif @@ -219,6 +221,7 @@ struct uwac_window { struct xdg_surface *xdg_surface; struct xdg_toplevel *xdg_toplevel; struct zxdg_toplevel_decoration_v1 *deco; + struct org_kde_kwin_server_decoration *kde_deco; #ifdef BUILD_IVI struct ivi_surface *ivi_surface; #endif diff --git a/uwac/libuwac/uwac-window.c b/uwac/libuwac/uwac-window.c index 2e9198e4d..d4daa3095 100644 --- a/uwac/libuwac/uwac-window.c +++ b/uwac/libuwac/uwac-window.c @@ -453,7 +453,18 @@ UwacWindow* UwacCreateWindowShm(UwacDisplay* display, uint32_t width, uint32_t h if (!w->deco) { uwacErrorHandler(w->display, UWAC_NOT_FOUND, "Current window manager does not allow decorating with SSD"); } + else + zxdg_toplevel_decoration_v1_set_mode(w->deco, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); } + else if (w->display->kde_deco_manager) { + w->kde_deco = org_kde_kwin_server_decoration_manager_create(w->display->kde_deco_manager, w->surface); + if (!w->kde_deco) { + uwacErrorHandler(w->display, UWAC_NOT_FOUND, "Current window manager does not allow decorating with SSD"); + } + else + org_kde_kwin_server_decoration_request_mode(w->kde_deco, ORG_KDE_KWIN_SERVER_DECORATION_MODE_SERVER); + } + assert(w->xdg_surface); xdg_toplevel_add_listener(w->xdg_toplevel, &xdg_toplevel_listener, w); } @@ -506,6 +517,9 @@ UwacReturnCode UwacDestroyWindow(UwacWindow** pwindow) if (w->deco) zxdg_toplevel_decoration_v1_destroy(w->deco); + if (w->kde_deco) + org_kde_kwin_server_decoration_destroy(w->kde_deco); + if (w->xdg_surface) xdg_surface_destroy(w->xdg_surface); diff --git a/uwac/protocols/server-decoration.xml b/uwac/protocols/server-decoration.xml new file mode 100644 index 000000000..7ea135a12 --- /dev/null +++ b/uwac/protocols/server-decoration.xml @@ -0,0 +1,96 @@ + + + . + ]]> + + + This interface allows to coordinate whether the server should create + a server-side window decoration around a wl_surface representing a + shell surface (wl_shell_surface or similar). By announcing support + for this interface the server indicates that it supports server + side decorations. + + Use in conjunction with zxdg_decoration_manager_v1 is undefined. + + + + When a client creates a server-side decoration object it indicates + that it supports the protocol. The client is supposed to tell the + server whether it wants server-side decorations or will provide + client-side decorations. + + If the client does not create a server-side decoration object for + a surface the server interprets this as lack of support for this + protocol and considers it as client-side decorated. Nevertheless a + client-side decorated surface should use this protocol to indicate + to the server that it does not want a server-side deco. + + + + + + + + + + + + + This event is emitted directly after binding the interface. It contains + the default mode for the decoration. When a new server decoration object + is created this new object will be in the default mode until the first + request_mode is requested. + + The server may change the default mode at any time. + + + + + + + + + + + + + + + + + + + + + This event is emitted directly after the decoration is created and + represents the base decoration policy by the server. E.g. a server + which wants all surfaces to be client-side decorated will send Client, + a server which wants server-side decoration will send Server. + + The client can request a different mode through the decoration request. + The server will acknowledge this by another event with the same mode. So + even if a server prefers server-side decoration it's possible to force a + client-side decoration. + + The server may emit this event at any time. In this case the client can + again request a different mode. It's the responsibility of the server to + prevent a feedback loop. + + + + +