diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-07-20 17:02:05 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-07-20 17:02:05 +0200 |
commit | fac9e8bec1983fa9dff8f447fef106e427dfec26 (patch) | |
tree | 2221d4216873fa8250dd5ff45f00d0d6b46eab26 /c++/window/xcb.h | |
parent | 398164432abcf599eaa51ebc4088024b7f46b97f (diff) |
c++: Renamed src to c++
Diffstat (limited to 'c++/window/xcb.h')
-rw-r--r-- | c++/window/xcb.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/c++/window/xcb.h b/c++/window/xcb.h new file mode 100644 index 0000000..f4e9b9a --- /dev/null +++ b/c++/window/xcb.h @@ -0,0 +1,91 @@ +#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_; +private: + own<window<backend::linux_xcb>> create_xcb_window(const video_mode& vid_mod, std::string_view title_view, int visual_id); +public: + device(::Display *display, int screen, xcb_connection_t *xcb_connection, + xcb_screen_t *xcb_screen, own<input_stream> && an); + + ~device(); + + void xcb_window_was_destroyed(xcb_window_t window_id); + void handle_events(); + + own<window<backend::linux_xcb>> create_window(const video_mode& vid_mod, std::string_view title_view); + + void flush(); +}; + +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); +}; +} +} |