diff --git a/src/compositor-x11.c b/src/compositor-x11.c index b81dac07c..6e507f916 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -916,6 +916,34 @@ x11_compositor_find_output(struct x11_compositor *c, xcb_window_t window) assert(0); } +static void +x11_compositor_delete_window(struct x11_compositor *c, xcb_window_t window) +{ + struct x11_output *deleted_output, *output, *next; + int x_offset = 0; + + deleted_output = x11_compositor_find_output(c, window); + + wl_list_for_each_safe(output, next, &c->base.output_list, base.link) { + if (x_offset != 0) { + weston_output_move(&output->base, + output->base.x - x_offset, + output->base.y); + weston_output_damage(&output->base); + } + + if (output == deleted_output) { + x_offset += output->base.width; + x11_output_destroy(&output->base); + } + } + + xcb_flush(c->conn); + + if (wl_list_empty(&c->base.output_list)) + wl_display_terminate(c->base.wl_display); +} + #ifdef HAVE_XCB_XKB static void update_xkb_state(struct x11_compositor *c, xcb_xkb_state_notify_event_t *state) @@ -1115,6 +1143,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) xcb_focus_in_event_t *focus_in; xcb_expose_event_t *expose; xcb_atom_t atom; + xcb_window_t window; uint32_t *k; uint32_t i, set; uint8_t response_type; @@ -1243,8 +1272,9 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) case XCB_CLIENT_MESSAGE: client_message = (xcb_client_message_event_t *) event; atom = client_message->data.data32[0]; + window = client_message->window; if (atom == c->atom.wm_delete_window) - wl_display_terminate(c->base.wl_display); + x11_compositor_delete_window(c, window); break; case XCB_FOCUS_IN: