summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2020-06-04 23:36:04 -0500
committerDevin J. Pohly <djpohly@gmail.com>2020-06-04 23:37:31 -0500
commit2598100d53e6897bd0f7fed2df2230a91d4813e7 (patch)
treea851ecc71030a9d9e2c3dd09f55369441e3a00c0
parent5991cec0ff8593c3dd21d65015cca8a62cb0fc9e (diff)
Implement xdg-decoration protocol
Applications like alacritty which use this newer protocol will no longer attempt to draw their own decoration.
-rw-r--r--dwl.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/dwl.c b/dwl.c
index f9892b3..a29f792 100644
--- a/dwl.c
+++ b/dwl.c
@@ -27,6 +27,7 @@
#include <wlr/types/wlr_screencopy_v1.h>
#include <wlr/types/wlr_seat.h>
#include <wlr/types/wlr_xcursor_manager.h>
+#include <wlr/types/wlr_xdg_decoration_v1.h>
#include <wlr/types/wlr_xdg_output_v1.h>
#include <wlr/types/wlr_xdg_shell.h>
#include <wlr/util/log.h>
@@ -75,6 +76,11 @@ typedef struct {
} Client;
typedef struct {
+ struct wl_listener request_mode;
+ struct wl_listener destroy;
+} Decoration;
+
+typedef struct {
uint32_t mod;
xkb_keysym_t keysym;
void (*func)(const Arg *);
@@ -144,12 +150,15 @@ static void createkeyboard(struct wlr_input_device *device);
static void createmon(struct wl_listener *listener, void *data);
static void createnotify(struct wl_listener *listener, void *data);
static void createpointer(struct wlr_input_device *device);
+static void createxdeco(struct wl_listener *listener, void *data);
static void cursorframe(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
+static void destroyxdeco(struct wl_listener *listener, void *data);
static Monitor *dirtomon(int dir);
static void focusclient(Client *c, struct wlr_surface *surface, int lift);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
+static void getxdecomode(struct wl_listener *listener, void *data);
static void incnmaster(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
static int keybinding(uint32_t mods, xkb_keysym_t sym);
@@ -201,6 +210,7 @@ static struct wlr_xdg_shell *xdg_shell;
static struct wl_list clients; /* tiling order */
static struct wl_list fstack; /* focus order */
static struct wl_list stack; /* stacking z-order */
+static struct wlr_xdg_decoration_manager_v1 *xdeco_mgr;
static struct wlr_cursor *cursor;
static struct wlr_xcursor_manager *cursor_mgr;
@@ -224,6 +234,7 @@ static struct wl_listener cursor_motion = {.notify = motionrelative};
static struct wl_listener cursor_motion_absolute = {.notify = motionabsolute};
static struct wl_listener new_input = {.notify = inputdevice};
static struct wl_listener new_output = {.notify = createmon};
+static struct wl_listener new_xdeco = {.notify = createxdeco};
static struct wl_listener new_xdg_surface = {.notify = createnotify};
static struct wl_listener request_cursor = {.notify = setcursor};
static struct wl_listener request_set_psel = {.notify = setpsel};
@@ -486,6 +497,20 @@ createpointer(struct wlr_input_device *device)
}
void
+createxdeco(struct wl_listener *listener, void *data)
+{
+ struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
+ Decoration *d;
+
+ d = wlr_deco->data = calloc(1, sizeof(*d));
+ wl_signal_add(&wlr_deco->events.request_mode, &d->request_mode);
+ d->request_mode.notify = getxdecomode;
+ wl_signal_add(&wlr_deco->events.destroy, &d->destroy);
+ d->destroy.notify = destroyxdeco;
+}
+
+
+void
cursorframe(struct wl_listener *listener, void *data)
{
/* This event is forwarded by the cursor when a pointer emits an frame
@@ -507,6 +532,17 @@ destroynotify(struct wl_listener *listener, void *data)
free(c);
}
+void
+destroyxdeco(struct wl_listener *listener, void *data)
+{
+ struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
+ Decoration *d = wlr_deco->data;
+
+ wl_list_remove(&d->destroy.link);
+ wl_list_remove(&d->request_mode.link);
+ free(d);
+}
+
Monitor *
dirtomon(int dir)
{
@@ -615,6 +651,14 @@ focusstack(const Arg *arg)
}
void
+getxdecomode(struct wl_listener *listener, void *data)
+{
+ struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
+ wlr_xdg_toplevel_decoration_v1_set_mode(wlr_deco,
+ WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
+}
+
+void
incnmaster(const Arg *arg)
{
selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
@@ -1254,6 +1298,10 @@ setup(void)
xdg_shell = wlr_xdg_shell_create(dpy);
wl_signal_add(&xdg_shell->events.new_surface, &new_xdg_surface);
+ /* Use xdg_decoration protocol to negotiate server-side decorations */
+ xdeco_mgr = wlr_xdg_decoration_manager_v1_create(dpy);
+ wl_signal_add(&xdeco_mgr->events.new_toplevel_decoration, &new_xdeco);
+
/*
* Creates a cursor, which is a wlroots utility for tracking the cursor
* image shown on screen.