aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/wm/xdg.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-09-28 14:34:34 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-09-28 14:34:34 -0700
commitb9a07a67b85e9192faa0e285b4419bd5ef242a03 (patch)
tree6b3426363e22da403967c6d4cbb0b98f39be4b38 /sys/cmd/wm/xdg.c
parentb58f62d4ef7f6e2442bdf8170f8652ba1e08bd12 (diff)
feat: reorganized code to be more modular
Diffstat (limited to 'sys/cmd/wm/xdg.c')
-rw-r--r--sys/cmd/wm/xdg.c76
1 files changed, 76 insertions, 0 deletions
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);
+}