aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-24 00:57:17 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-24 00:57:17 +0800
commit4927e536aac37607cd8aeaf6475b8e5bc91ddd1d (patch)
tree0c0e7f114bf71f37871b0d6931c2fd7346c85aaa
parentce7fc4073a457794416cd341a181b59d227585a8 (diff)
downloadcru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.tar.gz
cru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.tar.bz2
cru-4927e536aac37607cd8aeaf6475b8e5bc91ddd1d.zip
Fix sigterm.
-rw-r--r--demos/platform/gui/EmptyWindow.cpp12
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h2
-rw-r--r--src/platform/gui/xcb/Window.cpp21
3 files changed, 32 insertions, 3 deletions
diff --git a/demos/platform/gui/EmptyWindow.cpp b/demos/platform/gui/EmptyWindow.cpp
index 83e352af..299ddd17 100644
--- a/demos/platform/gui/EmptyWindow.cpp
+++ b/demos/platform/gui/EmptyWindow.cpp
@@ -3,6 +3,7 @@
#include "cru/platform/gui/UiApplication.h"
#include "cru/platform/gui/Window.h"
+using cru::platform::gui::INativeWindow;
using cru::platform::gui::IUiApplication;
using cru::platform::gui::WindowVisibilityType;
@@ -11,9 +12,14 @@ int main() {
cru::platform::bootstrap::CreateUiApplication());
application->SetQuitOnAllWindowClosed(true);
- auto window = application->CreateWindow();
- window->SetVisibility(WindowVisibilityType::Show);
- window->SetToForeground();
+
+ std::unique_ptr<INativeWindow> window1(application->CreateWindow());
+ window1->SetVisibility(WindowVisibilityType::Show);
+ window1->SetToForeground();
+
+ std::unique_ptr<INativeWindow> window2(application->CreateWindow());
+ window2->SetVisibility(WindowVisibilityType::Show);
+ window2->SetToForeground();
return application->Run();
}
diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h
index 1797a303..86bb2349 100644
--- a/include/cru/platform/gui/xcb/UiApplication.h
+++ b/include/cru/platform/gui/xcb/UiApplication.h
@@ -43,6 +43,8 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication {
CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM(_NET_WM_WINDOW_TYPE_NORMAL)
CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM(_NET_WM_WINDOW_TYPE_UTILITY)
CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM(_NET_FRAME_EXTENTS)
+ CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM(WM_PROTOCOLS)
+ CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM(WM_DELETE_WINDOW)
#undef CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM
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;
}