From b9a07a67b85e9192faa0e285b4419bd5ef242a03 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 28 Sep 2021 14:34:34 -0700 Subject: feat: reorganized code to be more modular --- sys/cmd/wm/xdg.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 sys/cmd/wm/xdg.c (limited to 'sys/cmd/wm/xdg.c') diff --git a/sys/cmd/wm/xdg.c b/sys/cmd/wm/xdg.c new file mode 100644 index 0000000..3978cbf --- /dev/null +++ b/sys/cmd/wm/xdg.c @@ -0,0 +1,76 @@ +#include "wm.h" + +static +void +map(struct wl_listener *l, void *data) +{ + Client *client = wl_container_of(l, client, event.map); + client->mapped = true; + + focus(client, client->xdg->surface); +} + +static +void +unmap(struct wl_listener *l, void *data) +{ + Client *client = wl_container_of(l, client, event.unmap); + client->mapped = false; +} + +static +void +destroy(struct wl_listener *l, void *data) +{ + Client *client = wl_container_of(l, client, event.destroy); + wl_list_remove(&client->link); + free(client); +} + +static +void +request_move(struct wl_listener *l, void *data) +{ + Client *client = wl_container_of(l, client, event.request_move); + setinteractive(client, CursorMove, 0); +} + +static +void +request_resize(struct wl_listener *l, void *data) +{ + struct wlr_xdg_toplevel_resize_event *event = data; + Client *client = wl_container_of(l, client, event.request_resize); + setinteractive(client, CursorResize, event->edges); +} + +void +make_xdg_surface(struct wl_listener *l, void *data) +{ + Client *client; + struct wlr_xdg_toplevel *toplevel; + struct wlr_xdg_surface *xdg = data; + + if(xdg->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) + return; + + client = calloc(1, sizeof(*client)); + client->xdg = xdg; + + client->event.map.notify = map; + wl_signal_add(&xdg->events.map, &client->event.map); + client->event.unmap.notify = unmap; + wl_signal_add(&xdg->events.unmap, &client->event.unmap); + client->event.destroy.notify = destroy; + wl_signal_add(&xdg->events.destroy, &client->event.destroy); + + /* cotd */ + toplevel = xdg->toplevel; + client->event.request_move.notify = request_move; + wl_signal_add(&toplevel->events.request_move, &client->event.request_move); + client->event.request_resize.notify = request_resize; + wl_signal_add(&toplevel->events.request_resize, &client->event.request_resize); + + /* Add it to the list of client. */ + wl_list_insert(&server.clients, &client->link); +} -- cgit v1.2.1