diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-24 00:57:17 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-24 00:57:17 +0800 |
commit | 4927e536aac37607cd8aeaf6475b8e5bc91ddd1d (patch) | |
tree | 0c0e7f114bf71f37871b0d6931c2fd7346c85aaa /src/platform/gui/xcb/Window.cpp | |
parent | ce7fc4073a457794416cd341a181b59d227585a8 (diff) | |
download | cru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.tar.gz cru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.tar.bz2 cru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.zip |
Fix sigterm.
Diffstat (limited to 'src/platform/gui/xcb/Window.cpp')
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 667edadc..4aa2d912 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -353,6 +353,13 @@ xcb_window_t XcbWindow::DoCreateWindow() { xcb_window_ = window; + std::vector<xcb_atom_t> wm_protocols{ + application_->GetXcbAtomWM_DELETE_WINDOW()}; + xcb_change_property(application_->GetXcbConnection(), XCB_PROP_MODE_REPLACE, + window, application_->GetXcbAtomWM_PROTOCOLS(), + XCB_ATOM_ATOM, 32, wm_protocols.size(), + wm_protocols.data()); + DoSetStyleFlags(window); DoSetParent(window); @@ -488,6 +495,16 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) { key_up_event_.Raise(std::move(args)); break; } + case XCB_CLIENT_MESSAGE: { + xcb_client_message_event_t *cm = (xcb_client_message_event_t *)event; + if (cm->data.data32[0] == application_->GetXcbAtomWM_DELETE_WINDOW() && + xcb_window_.has_value()) { + xcb_destroy_window(application_->GetXcbConnection(), + xcb_window_.value()); + xcb_flush(application_->GetXcbConnection()); + } + break; + } default: /* Unknown event type, ignore it */ printf("Unknown event: %" PRIu8 "\n", event->response_type); @@ -555,6 +572,10 @@ std::optional<xcb_window_t> XcbWindow::GetEventWindow( xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event; return kr->event; } + case XCB_CLIENT_MESSAGE: { + xcb_client_message_event_t *cm = (xcb_client_message_event_t *)event; + return cm->window; + } default: return std::nullopt; } |