]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Disable CSD
authorJohan Malm <jgm323@gmail.com>
Wed, 13 May 2020 19:51:13 +0000 (20:51 +0100)
committerJohan Malm <jgm323@gmail.com>
Wed, 13 May 2020 19:51:13 +0000 (20:51 +0100)
labwc.h
main.c
xdg.c

diff --git a/labwc.h b/labwc.h
index c493ff76ae937c8fd970407c3d0c1d95f21a7570..e9ab34d631e2cbb4f65e148cd2cad16de67fc256 100644 (file)
--- a/labwc.h
+++ b/labwc.h
@@ -23,6 +23,8 @@
 #include <wlr/types/wlr_seat.h>
 #include <wlr/types/wlr_xcursor_manager.h>
 #include <wlr/types/wlr_xdg_shell.h>
+#include <wlr/types/wlr_server_decoration.h>
+#include <wlr/types/wlr_xdg_decoration_v1.h>
 #include <wlr/util/log.h>
 #include <wlr/xwayland.h>
 #include <xkbcommon/xkbcommon.h>
@@ -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 f005d8511800d75150a5a58433f834ea6dffafcf..250e8957ade68b689c33246ad8e957044bb3ef43 100644 (file)
--- 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 17ba78dde02e4661cb0f0ed9af62d21f058e34b7..bea0fae0f4bb4fab3bb2edef4bdd3edb629b7792 100644 (file)
--- 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. */