summaryrefslogtreecommitdiff
path: root/dwl.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c59
1 files changed, 28 insertions, 31 deletions
diff --git a/dwl.c b/dwl.c
index bb83168..d52c908 100644
--- a/dwl.c
+++ b/dwl.c
@@ -111,6 +111,7 @@ typedef struct {
struct wlr_xdg_surface *xdg;
struct wlr_xwayland_surface *xwayland;
} surface;
+ struct wlr_xdg_toplevel_decoration_v1 *decoration;
struct wl_listener commit;
struct wl_listener map;
struct wl_listener maximize;
@@ -118,6 +119,8 @@ typedef struct {
struct wl_listener destroy;
struct wl_listener set_title;
struct wl_listener fullscreen;
+ struct wl_listener set_decoration_mode;
+ struct wl_listener destroy_decoration;
struct wlr_box prev; /* layout-relative, includes border */
struct wlr_box bounds;
#ifdef XWAYLAND
@@ -134,11 +137,6 @@ 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 *);
@@ -256,6 +254,7 @@ static void createmon(struct wl_listener *listener, void *data);
static void createnotify(struct wl_listener *listener, void *data);
static void createpointer(struct wlr_pointer *pointer);
static void cursorframe(struct wl_listener *listener, void *data);
+static void destroydecoration(struct wl_listener *listener, void *data);
static void destroydragicon(struct wl_listener *listener, void *data);
static void destroyidleinhibitor(struct wl_listener *listener, void *data);
static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
@@ -264,14 +263,12 @@ static void destroylocksurface(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
static void destroysessionlock(struct wl_listener *listener, void *data);
static void destroysessionmgr(struct wl_listener *listener, void *data);
-static void destroyxdeco(struct wl_listener *listener, void *data);
static Monitor *dirtomon(enum wlr_direction dir);
static void focusclient(Client *c, int lift);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
static Client *focustop(Monitor *m);
static void fullscreennotify(struct wl_listener *listener, void *data);
-static void getxdecomode(struct wl_listener *listener, void *data);
static void handlesig(int signo);
static void incnmaster(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
@@ -297,6 +294,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface,
static void printstatus(void);
static void quit(const Arg *arg);
static void rendermon(struct wl_listener *listener, void *data);
+static void requestdecorationmode(struct wl_listener *listener, void *data);
static void requeststartdrag(struct wl_listener *listener, void *data);
static void requestmonstate(struct wl_listener *listener, void *data);
static void resize(Client *c, struct wlr_box geo, int interact);
@@ -743,13 +741,14 @@ commitnotify(struct wl_listener *listener, void *data)
void
createdecoration(struct wl_listener *listener, void *data)
{
- struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
- Decoration *d = wlr_deco->data = calloc(1, sizeof(*d));
+ struct wlr_xdg_toplevel_decoration_v1 *deco = data;
+ Client *c = deco->toplevel->base->data;
+ c->decoration = deco;
- LISTEN(&wlr_deco->events.request_mode, &d->request_mode, getxdecomode);
- LISTEN(&wlr_deco->events.destroy, &d->destroy, destroyxdeco);
+ LISTEN(&deco->events.request_mode, &c->set_decoration_mode, requestdecorationmode);
+ LISTEN(&deco->events.destroy, &c->destroy_decoration, destroydecoration);
- getxdecomode(&d->request_mode, wlr_deco);
+ requestdecorationmode(&c->set_decoration_mode, deco);
}
void
@@ -1018,6 +1017,15 @@ cursorframe(struct wl_listener *listener, void *data)
}
void
+destroydecoration(struct wl_listener *listener, void *data)
+{
+ Client *c = wl_container_of(listener, c, destroy_decoration);
+
+ wl_list_remove(&c->destroy_decoration.link);
+ wl_list_remove(&c->set_decoration_mode.link);
+}
+
+void
destroydragicon(struct wl_listener *listener, void *data)
{
/* Focus enter isn't sent during drag, so refocus the focused node. */
@@ -1131,17 +1139,6 @@ destroysessionmgr(struct wl_listener *listener, void *data)
wl_list_remove(&listener->link);
}
-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(enum wlr_direction dir)
{
@@ -1293,14 +1290,6 @@ fullscreennotify(struct wl_listener *listener, void *data)
}
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
handlesig(int signo)
{
if (signo == SIGCHLD) {
@@ -1904,6 +1893,14 @@ skip:
}
void
+requestdecorationmode(struct wl_listener *listener, void *data)
+{
+ Client *c = wl_container_of(listener, c, set_decoration_mode);
+ wlr_xdg_toplevel_decoration_v1_set_mode(c->decoration,
+ WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
+}
+
+void
requeststartdrag(struct wl_listener *listener, void *data)
{
struct wlr_seat_request_start_drag_event *event = data;