summaryrefslogtreecommitdiff
path: root/modules/window/c++/xcb.h
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-01-18 12:05:13 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-01-18 12:05:13 +0100
commitfec96c85a4d71f20d3de9791163a9a1f932c8e48 (patch)
tree4ed269f4e0079e3f21f83ea3f8cd8aebbf60ebe0 /modules/window/c++/xcb.h
parent9022768d0d9a869d90767c079ce7d76a07e2f5ff (diff)
window: Moving around directories
Diffstat (limited to 'modules/window/c++/xcb.h')
-rw-r--r--modules/window/c++/xcb.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/modules/window/c++/xcb.h b/modules/window/c++/xcb.h
new file mode 100644
index 0000000..a2a9b0b
--- /dev/null
+++ b/modules/window/c++/xcb.h
@@ -0,0 +1,105 @@
+#pragma once
+
+#ifndef SAW_UNIX_XCB
+#error "XCB is not supported"
+#endif
+
+#include "backends.h"
+#include "device.h"
+#include "window.h"
+
+#include <map>
+
+#include <X11/Xlib-xcb.h>
+#include <X11/Xlib.h>
+
+namespace saw {
+namespace gfx {
+template<typename T>
+class window;
+
+template<typename T>
+class device;
+
+template<>
+class device<backend::linux_xcb> final {
+private:
+ ::Display *display_;
+ int screen_;
+
+ xcb_connection_t *xcb_connection_;
+ xcb_screen_t *xcb_screen_;
+
+ own<input_stream> async_notifier_;
+ conveyor_sink async_conveyor_;
+
+ std::map<xcb_window_t, window<backend::linux_xcb> *> windows_;
+
+ std::vector<xcb_generic_event_t *> pending_events_;
+
+ friend class window<backend::linux_xcb>;
+public:
+ own<window<backend::linux_xcb>> create_xcb_window(const video_mode& vid_mod, std::string_view title_view, int visual_id);
+ void xcb_window_was_destroyed(xcb_window_t window_id);
+public:
+ device(::Display *display, int screen, xcb_connection_t *xcb_connection,
+ xcb_screen_t *xcb_screen, own<input_stream> && an);
+
+ ~device();
+
+ void handle_events();
+
+ own<window<backend::linux_xcb>> create_window(const video_mode& vid_mod, std::string_view title_view);
+
+ void flush();
+
+ // XCB specific info for other classes
+ ::Display* get_xcb_display() {
+ return display_;
+ }
+
+ int get_xcb_screen() const {
+ return screen_;
+ }
+};
+
+error_or<own<device<backend::linux_xcb>>> create_xcb_device(io_provider& provider);
+
+template<>
+class window<backend::linux_xcb> final {
+private:
+ device<backend::linux_xcb> *device_;
+
+ xcb_window_t xcb_window_;
+ xcb_colormap_t xcb_colormap_;
+
+ video_mode video_mode_;
+ std::string window_title_;
+
+ own<conveyor_feeder<data<schema::WindowEvents>>> event_feeder = nullptr;
+public:
+ window(device<backend::linux_xcb>& dev_, xcb_window_t xcb_win, xcb_colormap_t xcb_colormap_, const video_mode& vid_mode_, const std::string_view& title_view_);
+
+ ~window();
+
+ void show();
+ void hide();
+
+ const video_mode& get_video_mode() const;
+
+ const std::string_view get_title() const;
+
+ void resize(uint64_t width, uint64_t height);
+
+ conveyor<data<schema::WindowEvents>> on_event();
+
+ void resize_event(uint64_t x, uint64_t y, uint64_t width, uint64_t height);
+ void mouse_event(int16_t x, int16_t y, uint16_t state, bool pressed);
+ void mouse_move_event(int16_t x, int16_t y);
+ void keyboard_event(int16_t x, int16_t y, uint32_t keycode, bool pressed, bool repeat);
+
+ // XCB specific things
+ xcb_window_t get_xcb_window_handle() const;
+};
+}
+}