From: Johan Malm Date: Wed, 13 May 2020 19:51:13 +0000 (+0100) Subject: Disable CSD X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=fdc7b4f1f3d21dd97397e66ee46377bf803fcbc1;p=proto%2Flabwc.git Disable CSD --- diff --git a/labwc.h b/labwc.h index c493ff76..e9ab34d6 100644 --- a/labwc.h +++ b/labwc.h @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -32,6 +34,7 @@ #define XCURSOR_MOVE "grabbing" #define XWL_TITLEBAR_HEIGHT (10) #define XWL_WINDOW_BORDER (3) +#define LAB_DISABLE_CSD (1) enum cursor_mode { TINYWL_CURSOR_PASSTHROUGH, @@ -47,6 +50,7 @@ struct server { struct wlr_xdg_shell *xdg_shell; struct wl_listener new_xdg_surface; + struct wl_listener xdg_toplevel_decoration; struct wlr_xwayland *xwayland; struct wl_listener new_xwayland_surface; struct wl_list views; @@ -119,6 +123,7 @@ struct keyboard { struct wl_listener key; }; +void xdg_toplevel_decoration(struct wl_listener *listener, void *data); void xdg_surface_map(struct wl_listener *listener, void *data); void xdg_surface_unmap(struct wl_listener *listener, void *data); void xdg_surface_destroy(struct wl_listener *listener, void *data); diff --git a/main.c b/main.c index f005d851..250e8957 100644 --- a/main.c +++ b/main.c @@ -170,7 +170,27 @@ int main(int argc, char *argv[]) wl_signal_add(&server.xdg_shell->events.new_surface, &server.new_xdg_surface); - /* TODO: wlr_xdg_decoration_manager_v1_create() */ + /* Disable CSD */ + struct wlr_xdg_decoration_manager_v1 *xdg_deco_mgr = NULL; + xdg_deco_mgr = wlr_xdg_decoration_manager_v1_create(server.wl_display); + if (!xdg_deco_mgr) { + wlr_log(WLR_ERROR, "unable to create the XDG deco manager"); + return 1; + } + wl_signal_add(&xdg_deco_mgr->events.new_toplevel_decoration, + &server.xdg_toplevel_decoration); + server.xdg_toplevel_decoration.notify = xdg_toplevel_decoration; + + struct wlr_server_decoration_manager *deco_mgr = NULL; + deco_mgr = wlr_server_decoration_manager_create(server.wl_display); + if (!deco_mgr) { + wlr_log(WLR_ERROR, "unable to create the server deco manager"); + return 1; + } + wlr_server_decoration_manager_set_default_mode( + deco_mgr, LAB_DISABLE_CSD ? + WLR_SERVER_DECORATION_MANAGER_MODE_SERVER : + WLR_SERVER_DECORATION_MANAGER_MODE_CLIENT); /* FIXME: Check return values */ wlr_export_dmabuf_manager_v1_create(server.wl_display); diff --git a/xdg.c b/xdg.c index 17ba78dd..bea0fae0 100644 --- a/xdg.c +++ b/xdg.c @@ -1,5 +1,52 @@ #include "labwc.h" +struct xdg_deco { + struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration; + struct server *server; + struct wl_listener destroy; + struct wl_listener request_mode; +}; + +static void xdg_deco_destroy(struct wl_listener *listener, void *data) +{ + struct xdg_deco *xdg_deco = + wl_container_of(listener, xdg_deco, destroy); + + wl_list_remove(&xdg_deco->destroy.link); + wl_list_remove(&xdg_deco->request_mode.link); + free(xdg_deco); +} + +static void xdg_deco_request_mode(struct wl_listener *listener, void *data) +{ + struct xdg_deco *xdg_deco; + xdg_deco = wl_container_of(listener, xdg_deco, request_mode); + enum wlr_xdg_toplevel_decoration_v1_mode mode; + if (LAB_DISABLE_CSD) + mode = WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE; + else + mode = WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE; + wlr_xdg_toplevel_decoration_v1_set_mode(xdg_deco->wlr_decoration, mode); +} + +void xdg_toplevel_decoration(struct wl_listener *listener, void *data) +{ + struct server *server = + wl_container_of(listener, server, xdg_toplevel_decoration); + struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration = data; + struct xdg_deco *xdg_deco = calloc(1, sizeof(struct xdg_deco)); + if (!xdg_deco) + return; + xdg_deco->wlr_decoration = wlr_decoration; + xdg_deco->server = server; + xdg_deco->destroy.notify = xdg_deco_destroy; + wl_signal_add(&wlr_decoration->events.destroy, &xdg_deco->destroy); + xdg_deco->request_mode.notify = xdg_deco_request_mode; + wl_signal_add(&wlr_decoration->events.request_mode, + &xdg_deco->request_mode); + xdg_deco_request_mode(&xdg_deco->request_mode, wlr_decoration); +} + void xdg_surface_map(struct wl_listener *listener, void *data) { /* Called when the surface is mapped, or ready to display on-screen. */