#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>
#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,
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;
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);
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);
#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. */