diff options
-rw-r--r-- | include/cru/platform/gui/Window.h | 1 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Window.h | 1 | ||||
-rw-r--r-- | src/base/platform/unix/EventLoop.cpp | 6 | ||||
-rw-r--r-- | src/platform/gui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform/gui/Window.cpp | 6 | ||||
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 11 |
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: { |