diff options
Diffstat (limited to 'include/core/window.h')
| -rw-r--r-- | include/core/window.h | 64 |
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 */ |