aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/cube.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/demos/cube.c b/demos/cube.c
index e3f3c45d..923b8a8d 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -260,6 +260,7 @@ struct demo {
XGL_CMD_BUFFER cmd;
xcb_window_t window;
+ xcb_intern_atom_reply_t *atom_wm_delete_window;
bool quit;
XGL_UINT current_buffer;
@@ -1136,10 +1137,17 @@ static void demo_prepare(struct demo *demo)
static void demo_handle_event(struct demo *demo,
const xcb_generic_event_t *event)
{
- switch (event->response_type & 0x7f) {
+ u_int8_t event_code = event->response_type & 0x7f;
+ switch (event_code) {
case XCB_EXPOSE:
demo_draw(demo);
break;
+ case XCB_CLIENT_MESSAGE:
+ if((*(xcb_client_message_event_t*)event).data.data32[0] ==
+ (*demo->atom_wm_delete_window).atom) {
+ demo->quit = true;
+ }
+ break;
case XCB_KEY_RELEASE:
{
const xcb_key_release_event_t *key =
@@ -1209,6 +1217,19 @@ static void demo_create_window(struct demo *demo)
demo->screen->root_visual,
value_mask, value_list);
+ /* Magic code that will send notification when window is destroyed */
+ xcb_intern_atom_cookie_t cookie = xcb_intern_atom(demo->connection, 1, 12,
+ "WM_PROTOCOLS");
+ xcb_intern_atom_reply_t* reply = xcb_intern_atom_reply(demo->connection, cookie, 0);
+
+ xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(demo->connection, 0, 16, "WM_DELETE_WINDOW");
+ demo->atom_wm_delete_window = xcb_intern_atom_reply(demo->connection, cookie2, 0);
+
+ xcb_change_property(demo->connection, XCB_PROP_MODE_REPLACE,
+ demo->window, (*reply).atom, 4, 32, 1,
+ &(*demo->atom_wm_delete_window).atom);
+ free(reply);
+
xcb_map_window(demo->connection, demo->window);
}