int XNextEvent(Display *d, XEvent *e) { static int (*real_XNextEvent)(Display *, XEvent *); if (!real_XNextEvent) real_XNextEvent = dlsym(RTLD_NEXT, "XNextEvent"); int r = real_XNextEvent(d, e); if (!e) return r; switch (e->type) { case ButtonPress: button_press(e->xbutton.window, e->xbutton.x, e->xbutton.y); break; case ConfigureNotify: resize_window(e->xconfigure.window, e->xconfigure.width, e->xconfigure.height); break; case CreateNotify: resize_window(e->xcreatewindow.window, e->xcreatewindow.width, e->xcreatewindow.height); break; case ConfigureRequest: resize_window(e->xconfigure.window, e->xconfigure.width, e->xconfigure.height); break; case ResizeRequest: resize_window(e->xresizerequest.window, e->xresizerequest.width, e->xresizerequest.height); break; } return r; }
CARLA_EXPORT int XNextEvent(Display* display, XEvent* event) { const int ret = real_XNextEvent(display, event); if (ret != 0) return ret; if (gCurrentlyMappedWindow == 0) return ret; if (event->type != ClientMessage) return ret; if (event->xclient.window != gCurrentlyMappedWindow) return ret; char* const type = XGetAtomName(display, event->xclient.message_type); CARLA_SAFE_ASSERT_RETURN(type != nullptr, 0); if (std::strcmp(type, "WM_PROTOCOLS") != 0) return ret; if ((Atom)event->xclient.data.l[0] != XInternAtom(display, "WM_DELETE_WINDOW", False)) return ret; gCurrentWindowVisible = false; gCurrentWindowMapped = false; if (gInterposedCallback != nullptr) gInterposedCallback(1, nullptr); event->type = 0; carla_stdout("XNextEvent close event caught, hiding UI instead"); return real_XUnmapWindow(display, gCurrentlyMappedWindow); }