summaryrefslogtreecommitdiff
path: root/include/core/window.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/core/window.h')
-rw-r--r--include/core/window.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/include/core/window.h b/include/core/window.h
new file mode 100644
index 0000000..2825156
--- /dev/null
+++ b/include/core/window.h
@@ -0,0 +1,64 @@
+#ifndef RUIM_GUI_WINDOW
+#define RUIM_GUI_WINDOW
+
+#include "renderer.h"
+
+struct ruim_toplevelBackend {
+ RuimToplevelBackendType type;
+ void *data;
+};
+
+int RuimToplevelBackendInit(RuimToplevelBackend *backend);
+int RuimToplevelBackendDeinit(RuimToplevelBackend *backend);
+
+int RuimToplevelCreate(RuimToplevel *toplevel, RuimToplevelType type);
+int RuimToplevelDestroy(RuimToplevel *toplevel);
+
+int RuimToplevelDisplay(RuimToplevel *toplevel);
+int RuimToplevelWaitForEvent(RuimToplevel *toplevel);
+
+int RuimToplevelBackendPoll(RuimToplevelBackend *backend, RuimEvent *event);
+
+#ifdef RUIM_PLATFORM_LINUX
+
+#include <poll.h>
+#include <xcb/xcb.h>
+
+/*
+ * Internal code
+ * TODO(roberto): expose it to public later
+ * TODO(roberto): improve error handling for X11
+ * (https://xcb.freedesktop.org/PublicApi/#xcb_connection_has_error)
+ */
+
+struct backend_x11 {
+ const xcb_setup_t *setup;
+ xcb_screen_t *screen;
+ xcb_connection_t *connection;
+ RuimSurfaceEGL surface;
+ int screen_num;
+ struct pollfd poll;
+
+ /* protocols */
+ xcb_atom_t wm_protocols;
+ xcb_atom_t wm_delete_window;
+};
+
+int _init_xcb_backend(RuimToplevelBackend *backend);
+int _deinit_xcb_backend(RuimToplevelBackend *backend);
+
+struct toplevel_x11 {
+ uint32_t event_mask;
+ uint32_t *event_values;
+ xcb_window_t window;
+};
+
+int _create_toplevel_xcb(RuimToplevel *toplevel);
+int _display_toplevel_xcb(RuimToplevel *toplevel);
+int _poll_event_xcb(RuimToplevelBackend *backend, RuimEvent *event);
+int _wait_event_xcb(RuimToplevel *toplevel);
+int _destroy_toplevel_xcb(RuimToplevel *toplevel);
+
+#endif /* RUIM_PLATFORM_LINUX */
+
+#endif /* RUIM_GUI_WINDOW */