diff options
| author | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2014-11-07 15:17:03 -0700 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2014-11-26 10:03:11 -0700 |
| commit | c988d5f5f8bdac78ca9608e0a5b6de6286d05e03 (patch) | |
| tree | 9618e3c9ed5776778c17d5f0baa6f60a705bb797 | |
| parent | 98cb2cb01c798da7f1eb6509e85cff7e1562cfa4 (diff) | |
| download | usermoji-c988d5f5f8bdac78ca9608e0a5b6de6286d05e03.tar.xz | |
demo: tri: Add window destroy processing
| -rw-r--r-- | demos/tri.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/demos/tri.c b/demos/tri.c index 8b1f8577..b6b6bdc3 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -76,6 +76,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; @@ -723,6 +724,12 @@ static void demo_handle_event(struct demo *demo, 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 = @@ -732,6 +739,9 @@ static void demo_handle_event(struct demo *demo, demo->quit = true; } break; + case XCB_DESTROY_NOTIFY: + demo->quit = true; + break; default: break; } @@ -761,7 +771,8 @@ static void demo_create_window(struct demo *demo) value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; value_list[0] = demo->screen->black_pixel; value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | - XCB_EVENT_MASK_EXPOSURE; + XCB_EVENT_MASK_EXPOSURE | + XCB_EVENT_MASK_STRUCTURE_NOTIFY; xcb_create_window(demo->connection, XCB_COPY_FROM_PARENT, @@ -771,6 +782,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); } |
