summaryrefslogtreecommitdiff
path: root/core/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/window.c')
-rw-r--r--core/window.c141
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;
+}