diff options
| author | Leonardo Hernández Hernández <leohdz172@proton.me> | 2023-12-08 13:44:28 -0600 | 
|---|---|---|
| committer | Leonardo Hernández Hernández <leohdz172@proton.me> | 2023-12-18 12:59:47 -0600 | 
| commit | e39d931430fdca12bf9cad28dfea3f2c938dd3fa (patch) | |
| tree | 48301bd5d8ecca62aa2e09deba42564887020dc9 /dwl.c | |
| parent | 396840cdf215b4affea28ac39f10f0011da94ed9 (diff) | |
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
Diffstat (limited to 'dwl.c')
| -rw-r--r-- | dwl.c | 59 | 
1 files changed, 28 insertions, 31 deletions
@@ -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;  | 
