From 911eda3e37013d33b69bbe7aa187ec05a36cebf2 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 31 Oct 2017 20:40:46 -0400 Subject: [PATCH] Catch window close event --- src/gui/Window.cc | 4 +--- src/gui/jtk/Jtk_event.cc | 22 ++++++++++++++++++++++ src/gui/jtk/Jtk_event.h | 2 +- src/gui/jtk/Jtk_window.cc | 4 ++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/gui/Window.cc b/src/gui/Window.cc index b115607..0f7cfd7 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -167,11 +167,9 @@ void Window::handle_event(Jtk_Event & event) { switch (event.type) { -#if 0 - case SDL_QUIT: + case JTK_EVENT_WINDOW_CLOSE: m_exit_requested = true; break; -#endif case JTK_EVENT_KEY_PRESS: #if 0 diff --git a/src/gui/jtk/Jtk_event.cc b/src/gui/jtk/Jtk_event.cc index 4cb2276..7f0a912 100644 --- a/src/gui/jtk/Jtk_event.cc +++ b/src/gui/jtk/Jtk_event.cc @@ -329,6 +329,25 @@ static bool ProcessConfigureEvent(XEvent * x_event, Jtk_Event * event) return true; } +/** + * Process an X ClientMessage event. + * + * @param x_event + * Pointer to the X event. + * @param event + * Pointer to the Jtk event. + */ +static bool ProcessXClientMessageEvent(XEvent * x_event, Jtk_Event * event) +{ + Atom wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", False); + if (x_event->xclient.data.l[0] == (long)wm_delete_window_atom) + { + event->type = JTK_EVENT_WINDOW_CLOSE; + return true; + } + return false; +} + /** * Process an X event. * @@ -373,6 +392,9 @@ static bool ProcessXEvent(XEvent * x_event, Jtk_Event * event) case ConfigureNotify: return ProcessConfigureEvent(x_event, event); + case ClientMessage: + return ProcessXClientMessageEvent(x_event, event); + case MappingNotify: XRefreshKeyboardMapping(&x_event->xmapping); return false; diff --git a/src/gui/jtk/Jtk_event.h b/src/gui/jtk/Jtk_event.h index c8e910d..f9295c1 100644 --- a/src/gui/jtk/Jtk_event.h +++ b/src/gui/jtk/Jtk_event.h @@ -4,7 +4,7 @@ #include #include -#define JTK_EVENT_CLOSE_WINDOW 1u +#define JTK_EVENT_WINDOW_CLOSE 1u #define JTK_EVENT_WINDOW_EXPOSE 2u #define JTK_EVENT_KEY_PRESS 3u #define JTK_EVENT_KEY_RELEASE 4u diff --git a/src/gui/jtk/Jtk_window.cc b/src/gui/jtk/Jtk_window.cc index cf01a0a..e538789 100644 --- a/src/gui/jtk/Jtk_window.cc +++ b/src/gui/jtk/Jtk_window.cc @@ -29,6 +29,10 @@ void * Jtk_CreateWindow() return nullptr; } + /* Disable the window close button. */ + Atom wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", False); + XSetWMProtocols(g_display, window, &wm_delete_window_atom, 1); + return (void *)window; }