aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2019-05-06 19:06:31 +0300
committerDrew DeVault <sir@cmpwn.com>2019-05-06 10:34:41 -0600
commit292d20e4c180970f0d2af9a7c44587cfba073fad (patch)
tree75d86e8038da370e183787245159ab95607d9171
parent6ae6b5dbb6c4f33f3c8ba12cd889100376d1edd8 (diff)
backend/wayland: use xdg-decoration-unstable-v1
This allows the toplevel to have proper decorations on compositors that support xdg-decoration-unstable-v1.
-rw-r--r--backend/wayland/backend.c7
-rw-r--r--backend/wayland/output.c16
-rw-r--r--include/backend/wayland.h2
3 files changed, 25 insertions, 0 deletions
diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c
index 7c8bb4e0..701ba79b 100644
--- a/backend/wayland/backend.c
+++ b/backend/wayland/backend.c
@@ -16,6 +16,7 @@
#include "backend/wayland.h"
#include "util/signal.h"
+#include "xdg-decoration-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h"
struct wlr_wl_backend *get_wl_backend_from_backend(struct wlr_backend *backend) {
@@ -76,6 +77,9 @@ static void registry_global(void *data, struct wl_registry *registry,
wl->xdg_wm_base = wl_registry_bind(registry, name,
&xdg_wm_base_interface, 1);
xdg_wm_base_add_listener(wl->xdg_wm_base, &xdg_wm_base_listener, NULL);
+ } else if (strcmp(iface, zxdg_decoration_manager_v1_interface.name) == 0) {
+ wl->zxdg_decoration_manager_v1 = wl_registry_bind(registry, name,
+ &zxdg_decoration_manager_v1_interface, 1);
}
}
@@ -148,6 +152,9 @@ static void backend_destroy(struct wlr_backend *backend) {
if (wl->shm) {
wl_shm_destroy(wl->shm);
}
+ if (wl->zxdg_decoration_manager_v1) {
+ zxdg_decoration_manager_v1_destroy(wl->zxdg_decoration_manager_v1);
+ }
xdg_wm_base_destroy(wl->xdg_wm_base);
wl_compositor_destroy(wl->compositor);
wl_registry_destroy(wl->registry);
diff --git a/backend/wayland/output.c b/backend/wayland/output.c
index 2eaaaf9c..d28e8c01 100644
--- a/backend/wayland/output.c
+++ b/backend/wayland/output.c
@@ -16,6 +16,7 @@
#include "backend/wayland.h"
#include "util/signal.h"
+#include "xdg-decoration-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h"
static struct wlr_wl_output *get_wl_output_from_output(
@@ -187,6 +188,9 @@ static void output_destroy(struct wlr_output *wlr_output) {
wlr_egl_destroy_surface(&output->backend->egl, output->egl_surface);
wl_egl_window_destroy(output->egl_window);
+ if (output->zxdg_toplevel_decoration_v1) {
+ zxdg_toplevel_decoration_v1_destroy(output->zxdg_toplevel_decoration_v1);
+ }
xdg_toplevel_destroy(output->xdg_toplevel);
xdg_surface_destroy(output->xdg_surface);
wl_surface_destroy(output->surface);
@@ -318,6 +322,18 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *wlr_backend) {
goto error;
}
+ if (backend->zxdg_decoration_manager_v1) {
+ output->zxdg_toplevel_decoration_v1 =
+ zxdg_decoration_manager_v1_get_toplevel_decoration(
+ backend->zxdg_decoration_manager_v1, output->xdg_toplevel);
+ if (!output->xdg_toplevel) {
+ wlr_log_errno(WLR_ERROR, "Could not get xdg toplevel decoration");
+ goto error;
+ }
+ zxdg_toplevel_decoration_v1_set_mode(output->zxdg_toplevel_decoration_v1,
+ ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
+ }
+
wlr_wl_output_set_title(wlr_output, NULL);
xdg_toplevel_set_app_id(output->xdg_toplevel, "wlroots");
diff --git a/include/backend/wayland.h b/include/backend/wayland.h
index c0bb6e74..e6574250 100644
--- a/include/backend/wayland.h
+++ b/include/backend/wayland.h
@@ -32,6 +32,7 @@ struct wlr_wl_backend {
struct wl_registry *registry;
struct wl_compositor *compositor;
struct xdg_wm_base *xdg_wm_base;
+ struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1;
struct wl_shm *shm;
struct wl_seat *seat;
struct wl_pointer *pointer;
@@ -50,6 +51,7 @@ struct wlr_wl_output {
struct wl_callback *frame_callback;
struct xdg_surface *xdg_surface;
struct xdg_toplevel *xdg_toplevel;
+ struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1;
struct wl_egl_window *egl_window;
EGLSurface egl_surface;