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.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 0a6ab07f..1e5613b4 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -1,10 +1,15 @@
#include "cru/platform/gui/xcb/UiApplication.h"
+#include "cru/base/Base.h"
+#include "cru/base/Guard.h"
#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
+#include "cru/platform/gui/Window.h"
+#include "cru/platform/gui/xcb/Cursor.h"
#include "cru/platform/gui/xcb/Window.h"
#include <poll.h>
#include <xcb/xcb.h>
+#include <algorithm>
namespace cru::platform::gui::xcb {
XcbUiApplication::XcbUiApplication(
@@ -20,6 +25,7 @@ XcbUiApplication::XcbUiApplication(
int screen_num;
xcb_connection_t *connection = xcb_connect(NULL, &screen_num);
+ xcb_connection_ = connection;
this->CheckXcbConnectionError();
event_loop_.SetPoll(xcb_get_file_descriptor(connection), POLLIN,
@@ -28,15 +34,23 @@ XcbUiApplication::XcbUiApplication(
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
this->screen_ = iter.data;
+
+ cursor_manager_ = new XcbCursorManager(this);
}
XcbUiApplication::~XcbUiApplication() {
+ delete cursor_manager_;
+
xcb_disconnect(this->xcb_connection_);
if (release_cairo_factory_) {
delete cairo_factory_;
}
}
+graphics::cairo::CairoGraphicsFactory *XcbUiApplication::GetCairoFactory() {
+ return cairo_factory_;
+}
+
void XcbUiApplication::CheckXcbConnectionError() {
if (xcb_connection_has_error(this->xcb_connection_)) {
throw XcbException("xcb_connection_has_error returned non-zero.");
@@ -47,6 +61,8 @@ xcb_connection_t *XcbUiApplication::GetXcbConnection() {
return xcb_connection_;
}
+void XcbUiApplication::XcbFlush() { xcb_flush(xcb_connection_); }
+
xcb_screen_t *XcbUiApplication::GetFirstXcbScreen() { return screen_; }
xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) {
@@ -57,7 +73,8 @@ xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) {
auto cookie =
xcb_intern_atom(xcb_connection_, false, name.size(), name.data());
- auto reply = xcb_intern_atom_reply(xcb_connection_, cookie, nullptr);
+ auto reply =
+ FreeLater(xcb_intern_atom_reply(xcb_connection_, cookie, nullptr));
auto atom = reply->atom;
xcb_atom_.emplace(std::move(name), atom);
return atom;
@@ -122,6 +139,25 @@ void XcbUiApplication::HandleXEvents() {
}
}
+std::vector<INativeWindow *> XcbUiApplication::GetAllWindow() {
+ std::vector<INativeWindow *> windows(windows_.size());
+ std::ranges::copy(windows_, windows.begin());
+ return windows;
+}
+
+INativeWindow *XcbUiApplication::CreateWindow() { return new XcbWindow(this); }
+
+cru::platform::graphics::IGraphicsFactory *
+XcbUiApplication::GetGraphicsFactory() {
+ return cairo_factory_;
+}
+
+ICursorManager *XcbUiApplication::GetCursorManager() { return cursor_manager_; }
+
+IClipboard *XcbUiApplication::GetClipboard() { NotImplemented(); }
+
+IMenu *XcbUiApplication::GetApplicationMenu() { return nullptr; }
+
void XcbUiApplication::RegisterWindow(XcbWindow *window) {
windows_.push_back(window);
}