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