aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorziga-lunarg <ziga@lunarg.com>2025-09-20 16:17:33 +0300
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2025-09-20 12:53:35 -0600
commitf5f5add52941db500e84c01d40ebd4cda986e43f (patch)
tree3d6a6cc0b31be60fd585a1b6dbcea2c4024ad9d9
parent95cfb8b1ba7fbcbe1383302ff286808c34e1fb9e (diff)
downloadusermoji-f5f5add52941db500e84c01d40ebd4cda986e43f.tar.xz
cube: Fix xlib window close
XSetVMProtocols is needed to register WM_DELETE_WINDOW. Without this the window close event was never received. The window was still destroyed and vkAcquireNextImageKHR returned VK_ERROR_SURFACE_LOST_KHR
-rw-r--r--cube/cube.c1
-rw-r--r--cube/cube.cpp1
-rw-r--r--cube/xlib_loader.h4
3 files changed, 6 insertions, 0 deletions
diff --git a/cube/cube.c b/cube/cube.c
index b4db7500..63fc07b2 100644
--- a/cube/cube.c
+++ b/cube/cube.c
@@ -2854,6 +2854,7 @@ static void demo_create_xlib_window(struct demo *demo) {
XMapWindow(demo->xlib_display, demo->xlib_window);
XFlush(demo->xlib_display);
demo->xlib_wm_delete_window = XInternAtom(demo->xlib_display, "WM_DELETE_WINDOW", False);
+ XSetWMProtocols(demo->xlib_display, demo->xlib_window, &demo->xlib_wm_delete_window, 1);
}
static void demo_handle_xlib_event(struct demo *demo, const XEvent *event) {
switch (event->type) {
diff --git a/cube/cube.cpp b/cube/cube.cpp
index bad2cccb..7f4b45d2 100644
--- a/cube/cube.cpp
+++ b/cube/cube.cpp
@@ -3224,6 +3224,7 @@ void Demo::create_window<WsiPlatform::xlib>() {
XMapWindow(xlib_display, xlib_window);
XFlush(xlib_display);
xlib_wm_delete_window = XInternAtom(xlib_display, "WM_DELETE_WINDOW", False);
+ XSetWMProtocols(xlib_display, xlib_window, &xlib_wm_delete_window, 1);
}
void Demo::handle_xlib_event(const XEvent *event) {
diff --git a/cube/xlib_loader.h b/cube/xlib_loader.h
index 881789f1..5553558d 100644
--- a/cube/xlib_loader.h
+++ b/cube/xlib_loader.h
@@ -41,6 +41,7 @@ typedef int (*PFN_XCloseDisplay)(Display* /* display */
typedef Status (*PFN_XInitThreads)(void);
typedef int (*PFN_XFlush)(Display* /* display */
);
+typedef Status (*PFN_XSetWMProtocols)(Display*, Window, Atom*, int);
static PFN_XDestroyWindow cube_XDestroyWindow = NULL;
static PFN_XOpenDisplay cube_XOpenDisplay = NULL;
@@ -55,6 +56,7 @@ static PFN_XGetVisualInfo cube_XGetVisualInfo = NULL;
static PFN_XCloseDisplay cube_XCloseDisplay = NULL;
static PFN_XInitThreads cube_XInitThreads = NULL;
static PFN_XFlush cube_XFlush = NULL;
+static PFN_XSetWMProtocols cube_XSetWMProtocols = NULL;
#define XDestroyWindow cube_XDestroyWindow
#define XOpenDisplay cube_XOpenDisplay
@@ -69,6 +71,7 @@ static PFN_XFlush cube_XFlush = NULL;
#define XCloseDisplay cube_XCloseDisplay
#define XInitThreads cube_XInitThreads
#define XFlush cube_XFlush
+#define XSetWMProtocols cube_XSetWMProtocols
void* initialize_xlib() {
void* xlib_library = NULL;
@@ -101,6 +104,7 @@ void* initialize_xlib() {
cube_XCloseDisplay = TYPE_CONVERSION(PFN_XCloseDisplay)(dlsym(xlib_library, "XCloseDisplay"));
cube_XInitThreads = TYPE_CONVERSION(PFN_XInitThreads)(dlsym(xlib_library, "XInitThreads"));
cube_XFlush = TYPE_CONVERSION(PFN_XFlush)(dlsym(xlib_library, "XFlush"));
+ cube_XSetWMProtocols = TYPE_CONVERSION(PFN_XSetWMProtocols)(dlsym(xlib_library, "XSetWMProtocols"));
return xlib_library;
}