tie xdg_toplevel_decorations to Client

a xdg_toplevel can only have one xdg_toplevel_decoration so there is no need to
have a new struct for decorations
This commit is contained in:
Leonardo Hernández Hernández 2023-12-08 13:44:28 -06:00
parent 04b7acd49e
commit 5b277cb266
No known key found for this signature in database
GPG Key ID: E538897EE11B9624

57
dwl.c
View File

@ -110,6 +110,7 @@ typedef struct {
struct wlr_xdg_surface *xdg;
struct wlr_xwayland_surface *xwayland;
} surface;
struct wlr_xdg_toplevel_decoration_v1 *wlr_deco;
struct wl_listener commit;
struct wl_listener map;
struct wl_listener maximize;
@ -117,6 +118,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
@ -132,11 +135,6 @@ typedef struct {
uint32_t resize; /* configure serial of a pending resize */
} Client;
typedef struct {
struct wl_listener request_mode;
struct wl_listener destroy;
} Decoration;
typedef struct {
uint32_t mod;
xkb_keysym_t keysym;
@ -257,6 +255,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);
@ -265,14 +264,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);
@ -298,6 +295,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);
@ -749,12 +747,13 @@ 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));
Client *c = wlr_deco->toplevel->base->data;
c->wlr_deco = wlr_deco;
LISTEN(&wlr_deco->events.request_mode, &d->request_mode, getxdecomode);
LISTEN(&wlr_deco->events.destroy, &d->destroy, destroyxdeco);
LISTEN(&wlr_deco->events.request_mode, &c->set_decoration_mode, requestdecorationmode);
LISTEN(&wlr_deco->events.destroy, &c->destroy_decoration, destroydecoration);
getxdecomode(&d->request_mode, wlr_deco);
requestdecorationmode(&c->set_decoration_mode, wlr_deco);
}
void
@ -1044,6 +1043,15 @@ cursorframe(struct wl_listener *listener, void *data)
wlr_seat_pointer_notify_frame(seat);
}
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)
{
@ -1158,17 +1166,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)
{
@ -1317,14 +1314,6 @@ fullscreennotify(struct wl_listener *listener, void *data)
setfullscreen(c, client_wants_fullscreen(c));
}
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)
{
@ -1936,6 +1925,14 @@ skip:
wlr_output_state_finish(&pending);
}
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->wlr_deco,
WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
}
void
requeststartdrag(struct wl_listener *listener, void *data)
{