aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/gui/Window.h1
-rw-r--r--include/cru/platform/gui/xcb/Window.h1
-rw-r--r--src/base/platform/unix/EventLoop.cpp6
-rw-r--r--src/platform/gui/CMakeLists.txt1
-rw-r--r--src/platform/gui/Window.cpp6
-rw-r--r--src/platform/gui/xcb/Window.cpp11
6 files changed, 23 insertions, 3 deletions
diff --git a/include/cru/platform/gui/Window.h b/include/cru/platform/gui/Window.h
index f877545e..885c1250 100644
--- a/include/cru/platform/gui/Window.h
+++ b/include/cru/platform/gui/Window.h
@@ -44,6 +44,7 @@ struct NativeKeyEventArgs {
// Represents a native window, which exposes some low-level events and
// operations.
struct INativeWindow : virtual IPlatformResource {
+ virtual bool IsCreated();
virtual void Close() = 0;
virtual INativeWindow* GetParent() = 0;
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h
index 560eab50..aa1b4fab 100644
--- a/include/cru/platform/gui/xcb/Window.h
+++ b/include/cru/platform/gui/xcb/Window.h
@@ -19,6 +19,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
explicit XcbWindow(XcbUiApplication* application);
~XcbWindow() override;
+ bool IsCreated() override;
void Close() override;
INativeWindow* GetParent() override;
diff --git a/src/base/platform/unix/EventLoop.cpp b/src/base/platform/unix/EventLoop.cpp
index 7c475697..6e8dc16e 100644
--- a/src/base/platform/unix/EventLoop.cpp
+++ b/src/base/platform/unix/EventLoop.cpp
@@ -34,15 +34,15 @@ int UnixEventLoop::Run() {
while (!exit_code_) {
int poll_timeout = -1;
- while (CheckPoll()) {
+ if (CheckPoll()) {
continue;
}
- while (CheckTimer()) {
+ if (CheckTimer()) {
continue;
}
- while (CheckActionPipe()) {
+ if (CheckActionPipe()) {
continue;
}
diff --git a/src/platform/gui/CMakeLists.txt b/src/platform/gui/CMakeLists.txt
index 808caf9c..b541428e 100644
--- a/src/platform/gui/CMakeLists.txt
+++ b/src/platform/gui/CMakeLists.txt
@@ -2,6 +2,7 @@ add_library(CruPlatformGui
Keyboard.cpp
Menu.cpp
UiApplication.cpp
+ Window.cpp
)
target_link_libraries(CruPlatformGui PUBLIC CruPlatformGraphics)
target_compile_definitions(CruPlatformGui PRIVATE CRU_PLATFORM_GUI_EXPORT_API)
diff --git a/src/platform/gui/Window.cpp b/src/platform/gui/Window.cpp
new file mode 100644
index 00000000..fdcfbae4
--- /dev/null
+++ b/src/platform/gui/Window.cpp
@@ -0,0 +1,6 @@
+#include "cru/platform/gui/Window.h"
+#include "cru/base/Base.h"
+
+namespace cru::platform::gui {
+bool INativeWindow::IsCreated() { NotImplemented(); }
+} // namespace cru::platform::gui
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index a27663a9..863738f1 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -15,6 +15,7 @@
#include <cairo.h>
#include <xcb/xcb.h>
#include <xcb/xproto.h>
+#include <algorithm>
#include <cassert>
#include <cinttypes>
#include <cstdint>
@@ -69,6 +70,8 @@ XcbWindow::XcbWindow(XcbUiApplication *application)
XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); }
+bool XcbWindow::IsCreated() { return xcb_window_.has_value(); }
+
void XcbWindow::Close() {
if (xcb_window_) {
xcb_destroy_window(application_->GetXcbConnection(), *xcb_window_);
@@ -410,6 +413,14 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) {
cairo_surface_destroy(cairo_surface_);
cairo_surface_ = nullptr;
xcb_window_ = std::nullopt;
+
+ if (application_->IsQuitOnAllWindowClosed() &&
+ std::ranges::none_of(
+ application_->GetAllWindow(),
+ [](INativeWindow *window) { return window->IsCreated(); })) {
+ application_->RequestQuit(0);
+ }
+
break;
}
case XCB_CONFIGURE_NOTIFY: {