aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb/UiApplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/gui/xcb/UiApplication.cpp')
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 139a5422..619e71ef 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -1,8 +1,9 @@
-#include <cru/platform/gui/xcb/UiApplication.h>
+#include "cru/platform/gui/xcb/UiApplication.h"
+
+#include "cru/platform/gui/xcb/Window.h"
#include <poll.h>
#include <xcb/xcb.h>
-#include "cru/base/Base.h"
namespace cru::platform::gui::xcb {
XcbUiApplication::XcbUiApplication() {
@@ -20,14 +21,20 @@ XcbUiApplication::XcbUiApplication() {
this->screen_ = iter.data;
}
-XcbUiApplication::~XcbUiApplication() { xcb_disconnect(this->xcb_); }
+XcbUiApplication::~XcbUiApplication() { xcb_disconnect(this->xcb_connection_); }
void XcbUiApplication::CheckXcbConnectionError() {
- if (xcb_connection_has_error(this->xcb_)) {
+ if (xcb_connection_has_error(this->xcb_connection_)) {
throw XcbException("xcb_connection_has_error returned non-zero.");
}
}
+xcb_connection_t *XcbUiApplication::GetXcbConnection() {
+ return xcb_connection_;
+}
+
+xcb_screen_t *XcbUiApplication::GetFirstXcbScreen() { return screen_; }
+
int XcbUiApplication::Run() {
auto exit_code = event_loop_.Run();
@@ -75,8 +82,15 @@ void XcbUiApplication::CancelTimer(long long id) {
void XcbUiApplication::HandleXEvents() {
xcb_generic_event_t *event;
- while ((event = xcb_poll_for_event(xcb_))) {
- NotImplemented();
+ while ((event = xcb_poll_for_event(xcb_connection_))) {
+ auto event_xcb_window = XcbWindow::GetEventWindow(event);
+ for (auto window : windows_) {
+ if (window->GetXcbWindow() == event_xcb_window) {
+ window->HandleEvent(event);
+ break;
+ }
+ }
+ ::free(event);
}
}