+ xcb_flush(dpy);
+ xcb_set_input_focus(dpy, XCB_INPUT_FOCUS_POINTER_ROOT, win, XCB_CURRENT_TIME);
+}
+
+void configure_request(xcb_generic_event_t *evt)
+{
+ xcb_configure_request_event_t *e = (xcb_configure_request_event_t *) evt;
+ window_location_t loc;
+ bool is_managed = locate_window(e->window, &loc);
+
+ if (!is_managed || (is_managed && !is_tiled(loc.node->client))) {
+ uint16_t mask = 0;
+ uint32_t values[7];
+ unsigned short i = 0;
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_X) {
+ mask |= XCB_CONFIG_WINDOW_X;
+ values[i++] = e->x;
+ if (is_managed)
+ loc.node->client->rectangle.x = e->x;
+ }
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_Y) {
+ mask |= XCB_CONFIG_WINDOW_Y;
+ values[i++] = e->y;
+ if (is_managed)
+ loc.node->client->rectangle.y = e->y;
+ }
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
+ mask |= XCB_CONFIG_WINDOW_WIDTH;
+ values[i++] = e->width;
+ if (is_managed)
+ loc.node->client->rectangle.width = e->width;
+ }
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+ mask |= XCB_CONFIG_WINDOW_HEIGHT;
+ values[i++] = e->height;
+ if (is_managed)
+ loc.node->client->rectangle.height = e->height;
+ }
+
+ if (!is_managed && e->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) {
+ mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
+ values[i++] = e->border_width;
+ }
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_SIBLING) {
+ mask |= XCB_CONFIG_WINDOW_SIBLING;
+ values[i++] = e->sibling;
+ }
+
+ if (e->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) {
+ mask |= XCB_CONFIG_WINDOW_STACK_MODE;
+ values[i++] = e->stack_mode;
+ }
+
+ xcb_configure_window(dpy, e->window, mask, values);
+ }
+
+ if (is_managed && is_floating(loc.node->client))
+ apply_layout(loc.desktop, loc.node, root_rect);
+}
+
+void destroy_notify(xcb_generic_event_t *evt)
+{
+ xcb_destroy_notify_event_t *e = (xcb_destroy_notify_event_t *) evt;
+ window_location_t loc;
+
+ if (locate_window(e->window, &loc)) {
+ remove_node(loc.desktop, loc.node);
+ apply_layout(loc.desktop, loc.desktop->root, root_rect);
+ }
+}
+
+void unmap_notify(xcb_generic_event_t *evt)
+{
+ xcb_unmap_notify_event_t *e = (xcb_unmap_notify_event_t *) evt;
+ if (e->event != screen->root) {
+ window_location_t loc;
+ if (locate_window(e->window, &loc)) {
+ remove_node(loc.desktop, loc.node);
+ apply_layout(loc.desktop, loc.desktop->root, root_rect);
+ }
+ }