#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); }