diff options
Diffstat (limited to 'core/window.c')
| -rw-r--r-- | core/window.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/core/window.c b/core/window.c new file mode 100644 index 0000000..6db3f5b --- /dev/null +++ b/core/window.c @@ -0,0 +1,141 @@ +#include "core/window.h" +#include "core/event.h" +#include "core/renderer.h" +#include "core/types.h" +#include "internal/utils.h" + +/* other stuff */ + +int RuimToplevelBackendInit(RuimToplevelBackend *backend) { + if (backend == NULL) { + crash_error("backend must be non-null"); + } + + if (backend->type == 0) { + /* TODO: select default one based on platform */ + backend->type = RUIM_TOPLEVEL_X11; + } + + switch (backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _init_xcb_backend(backend); + } break; +#endif + default: + printf("%d\n", backend->type); + crash_error("unrecognized backend type"); + } + + crash_error("unreachable"); + return -1; +} + +int RuimToplevelBackendDeinit(RuimToplevelBackend *backend) { + if (backend == NULL || backend->type == 0) { + crash_error("some crash"); + } + + switch (backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _deinit_xcb_backend(backend); + } break; +#endif + default: + crash_error("some crash"); + } + + return 0; +} + +int RuimToplevelCreate(RuimToplevel *toplevel, RuimToplevelType type) { + if (type && type != RUIM_TOPLEVEL_WINDOW) { + crash_error("TODO: toplevel must be a window"); + } + + if (toplevel->backend == NULL) { + crash_error("TODO: backend must be set"); + } + + switch (toplevel->backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _create_toplevel_xcb(toplevel); + } break; +#endif + default: + crash_error("unknown backend type"); + } + + return 0; +} + +int RuimToplevelDisplay(RuimToplevel *toplevel) { + if (toplevel == NULL) { + crash_error("toplevel must be non-null"); + } + + switch (toplevel->backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _display_toplevel_xcb(toplevel); + } break; +#endif + default: + crash_error("some crash"); + } + + return 0; +} + +int RuimToplevelBackendPoll(RuimToplevelBackend *backend, RuimEvent *event) { + switch (backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + if (_poll_event_xcb(backend, event) != 0) { + crash_error("xcb connection error"); + } + } break; +#endif + default: + crash_error("unknown backend type"); + } + + if (event->type == RUIM_EVENT_NOTHING) { + return 0; + } else { + return 1; + } +} + +int RuimToplevelWaitForEvent(RuimToplevel *toplevel) { + switch (toplevel->backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _wait_event_xcb(toplevel); + } break; +#endif + default: + crash_error("unknown backend type"); + } + + crash_error("unreachable"); + return -1; +} + +int RuimToplevelDestroy(RuimToplevel *toplevel) { + + switch (toplevel->backend->type) { +#ifdef RUIM_PLATFORM_LINUX + case RUIM_TOPLEVEL_X11: { + return _destroy_toplevel_xcb(toplevel); + } break; +#endif + default: + crash_error("unknown backend type"); + } + + crash_error("unreachable"); + return -1; +} |