aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 17111e0c..d64fc9da 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -1,13 +1,20 @@
#include <cru/platform/gui/xcb/UiApplication.h>
+#include <poll.h>
#include <xcb/xcb.h>
+#include "cru/base/Base.h"
namespace cru::platform::gui::xcb {
-XcbUiApplication::XcbUiApplication() : exit_code_(0) {
+XcbUiApplication::XcbUiApplication() {
+ is_quit_on_all_window_closed_ = false;
+
int screen_num;
xcb_connection_t *connection = xcb_connect(NULL, &screen_num);
this->CheckXcbConnectionError();
+ event_loop_.SetPoll(xcb_get_file_descriptor(connection), POLLIN,
+ [this](auto) { HandleXEvents(); });
+
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
this->screen_ = iter.data;
@@ -22,20 +29,32 @@ void XcbUiApplication::CheckXcbConnectionError() {
}
int XcbUiApplication::Run() {
-
- // TODO: A Big Implement.
+ auto exit_code = event_loop_.Run();
for (const auto &handler : this->quit_handlers_) {
handler();
}
- return exit_code_;
+ return exit_code;
+}
+
+void XcbUiApplication::RequestQuit(int quit_code) {
+ event_loop_.RequestQuit(quit_code);
}
void XcbUiApplication::AddOnQuitHandler(std::function<void()> handler) {
this->quit_handlers_.push_back(std::move(handler));
}
+bool XcbUiApplication::IsQuitOnAllWindowClosed() {
+ return is_quit_on_all_window_closed_;
+}
+
+void XcbUiApplication::SetQuitOnAllWindowClosed(
+ bool quit_on_all_window_closed) {
+ is_quit_on_all_window_closed_ = quit_on_all_window_closed;
+}
+
long long XcbUiApplication::SetImmediate(std::function<void()> action) {
return event_loop_.SetImmediate(std::move(action));
}
@@ -53,4 +72,11 @@ long long XcbUiApplication::SetInterval(std::chrono::milliseconds milliseconds,
void XcbUiApplication::CancelTimer(long long id) {
return event_loop_.CancelTimer(static_cast<int>(id));
}
+
+void XcbUiApplication::HandleXEvents() {
+ xcb_generic_event_t *event;
+ while ((event = xcb_poll_for_event(xcb_))) {
+ NotImplemented();
+ }
+}
} // namespace cru::platform::gui::xcb