aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/wm/xdg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/wm/xdg.c')
-rw-r--r--src/cmd/wm/xdg.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/cmd/wm/xdg.c b/src/cmd/wm/xdg.c
new file mode 100644
index 0000000..6a0c2c8
--- /dev/null
+++ b/src/cmd/wm/xdg.c
@@ -0,0 +1,118 @@
+#include "wm.h"
+
+static
+void
+map(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.map);
+
+ wl_list_insert(&server.client.list, &client->link);
+ wl_list_insert(&server.client.stack, &client->stack);
+ wl_list_insert(&server.client.focus, &client->focus);
+
+ wlr_xdg_surface_get_geometry(client->xdg, &client->geometry);
+ client->geometry.width += 2 * client->border;
+ client->geometry.height += 2 * client->border;
+
+ wlr_xdg_toplevel_set_tiled(client->xdg,
+ WLR_EDGE_TOP|WLR_EDGE_BOTTOM|WLR_EDGE_LEFT|WLR_EDGE_RIGHT
+ );
+
+ rules(client);
+}
+
+static
+void
+unmap(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.unmap);
+
+ wl_list_remove(&client->link);
+ attach(client, nil, 0);
+
+ wl_list_remove(&client->stack);
+ wl_list_remove(&client->focus);
+}
+
+static
+void
+commit(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.commit);
+ if(client->resize && client->resize <= client->xdg->configure_serial)
+ client->resize = 0;
+}
+
+static
+void
+destroy(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.destroy);
+ free(client);
+}
+
+static
+void
+request_move(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.request_move);
+}
+
+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);
+}
+
+
+static
+void
+request_title(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.request_title);
+}
+
+static
+void
+request_fullscreen(struct wl_listener *l, void *data)
+{
+ Client *client = wl_container_of(l, client, event.request_fullscreen);
+ client->isfullscreen = 1;
+}
+
+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 = xdg->surface->data = calloc(1, sizeof(*client));
+ client->xdg = xdg;
+ client->border = cfg·borderpixel;
+
+ 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);
+
+ client->event.commit.notify = commit;
+ wl_signal_add(&xdg->surface->events.commit, &client->event.commit);
+
+ toplevel = xdg->toplevel;
+ client->event.request_move.notify = request_move;
+ wl_signal_add(&toplevel->events.request_move, &client->event.request_move);
+ client->event.request_title.notify = request_title;
+ wl_signal_add(&toplevel->events.set_title, &client->event.request_title);
+ client->event.request_resize.notify = request_resize;
+ wl_signal_add(&toplevel->events.request_resize, &client->event.request_resize);
+ client->event.request_fullscreen.notify = request_fullscreen;
+ wl_signal_add(&toplevel->events.request_fullscreen, &client->event.request_fullscreen);
+}