diff options
| author | Roberto Esteves <contact@robertoesteves.dev> | 2025-11-22 16:35:06 +0000 |
|---|---|---|
| committer | Roberto Esteves <contact@robertoesteves.dev> | 2025-11-22 16:35:06 +0000 |
| commit | e7c2ec9719349f7a20dd1d4854869c10d8836a11 (patch) | |
| tree | af5b34d8d21cabd4ec6d4206ce5a6fd4651de56c | |
| parent | d84537c52f537920369618028f84b48296811fd0 (diff) | |
| -rw-r--r-- | README.md | 13 | ||||
| -rw-r--r-- | core/event.c | 2 | ||||
| -rw-r--r-- | core/meson.build | 16 | ||||
| -rw-r--r-- | core/renderer/gles3.c (renamed from gui/renderer_gles.c) | 4 | ||||
| -rw-r--r-- | core/surface/egl.c (renamed from gui/surface_egl.c) | 5 | ||||
| -rw-r--r-- | core/window.c (renamed from gui/window.c) | 16 | ||||
| -rw-r--r-- | core/window/xcb.c (renamed from gui/window_xcb.c) | 29 | ||||
| -rw-r--r-- | docs/examples/window.ruim (renamed from examples/window.ruim) | 0 | ||||
| -rw-r--r-- | gui/meson.build | 16 | ||||
| -rw-r--r-- | immediate/immediate.c | 17 | ||||
| -rw-r--r-- | immediate/meson.build | 9 | ||||
| -rw-r--r-- | include/core/component.h | 15 | ||||
| -rw-r--r-- | include/core/event.h | 48 | ||||
| -rw-r--r-- | include/core/renderer.h (renamed from include/gui/renderer.h) | 2 | ||||
| -rw-r--r-- | include/core/types.h | 42 | ||||
| -rw-r--r-- | include/core/window.h (renamed from include/gui/window.h) | 38 | ||||
| -rw-r--r-- | include/gui/types.h | 35 | ||||
| -rw-r--r-- | include/immediate/immediate.h | 21 | ||||
| -rw-r--r-- | include/internal/utils.h | 3 | ||||
| -rw-r--r-- | internal/utils.c | 2 | ||||
| -rw-r--r-- | meson.build | 3 | ||||
| -rw-r--r-- | test/example_core.c (renamed from test/main.c) | 18 | ||||
| -rw-r--r-- | test/meson.build | 5 |
23 files changed, 235 insertions, 124 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c49160 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Roberto's User Interface Module + +This repository has two main projects: a GUI library and a programming language +for the GUI library. + +It's currently WIP. + +## Brainstorm / TODO + +- Core library for sharing between immediate and retained mode; +- Component tree representation; +- Style system (support for themes is optional); +- Software renderer first for compatibility, then GPU renderer for performance; diff --git a/core/event.c b/core/event.c new file mode 100644 index 0000000..e559e8d --- /dev/null +++ b/core/event.c @@ -0,0 +1,2 @@ +#include "core/event.h" +#include "core/window.h" diff --git a/core/meson.build b/core/meson.build new file mode 100644 index 0000000..b58e1ef --- /dev/null +++ b/core/meson.build @@ -0,0 +1,16 @@ +core_sources = files('window.c', 'event.c') +core_deps = [] + +if os == 'linux' + core_sources += ['window/xcb.c', 'surface/egl.c', 'renderer/gles3.c'] + core_deps += [ dependency('egl'), dependency('glesv2'), dependency('xcb') ] +endif + +core_library = library( + 'RuimCore', + core_sources, + include_directories: ruim_include, + dependencies: core_deps, + link_with: internal_lib, + install: true, +) diff --git a/gui/renderer_gles.c b/core/renderer/gles3.c index d6e217a..5dd1538 100644 --- a/gui/renderer_gles.c +++ b/core/renderer/gles3.c @@ -1,5 +1,5 @@ -#include "gui/renderer.h" -#include "gui/window.h" +#include "core/renderer.h" +#include "core/window.h" #include "internal/utils.h" #include <GLES2/gl2.h> diff --git a/gui/surface_egl.c b/core/surface/egl.c index eea2ee5..f0370ce 100644 --- a/gui/surface_egl.c +++ b/core/surface/egl.c @@ -1,5 +1,6 @@ -#include "gui/renderer.h" -#include "gui/window.h" +#include "core/event.h" +#include "core/renderer.h" +#include "core/window.h" #include "internal/utils.h" #include <stddef.h> diff --git a/gui/window.c b/core/window.c index 66e8edb..6db3f5b 100644 --- a/gui/window.c +++ b/core/window.c @@ -1,7 +1,11 @@ -#include "gui/window.h" -#include "gui/renderer.h" +#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"); @@ -85,11 +89,11 @@ int RuimToplevelDisplay(RuimToplevel *toplevel) { return 0; } -int RuimToplevelPoll(RuimToplevel *toplevel, RuimToplevelEvent *event) { - switch (toplevel->backend->type) { +int RuimToplevelBackendPoll(RuimToplevelBackend *backend, RuimEvent *event) { + switch (backend->type) { #ifdef RUIM_PLATFORM_LINUX case RUIM_TOPLEVEL_X11: { - if (_poll_event_xcb(toplevel, event) != 0) { + if (_poll_event_xcb(backend, event) != 0) { crash_error("xcb connection error"); } } break; @@ -98,7 +102,7 @@ int RuimToplevelPoll(RuimToplevel *toplevel, RuimToplevelEvent *event) { crash_error("unknown backend type"); } - if (event->type == RUIM_TOPLEVEL_EVENT_NOTHING) { + if (event->type == RUIM_EVENT_NOTHING) { return 0; } else { return 1; diff --git a/gui/window_xcb.c b/core/window/xcb.c index 61682ed..94196ec 100644 --- a/gui/window_xcb.c +++ b/core/window/xcb.c @@ -1,7 +1,9 @@ -#include "gui/types.h" -#include "gui/window.h" +#include "core/types.h" +#include "core/window.h" #include "internal/utils.h" +#include "core/event.h" + #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -129,9 +131,8 @@ int _display_toplevel_xcb(RuimToplevel *toplevel) { return xcb_flush(x11_backend->connection) > 0; } -int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { - struct backend_x11 *x11_backend = - (struct backend_x11 *)toplevel->backend->data; +int _poll_event_xcb(RuimToplevelBackend *backend, RuimEvent *event) { + struct backend_x11 *x11_backend = (struct backend_x11 *)backend->data; xcb_generic_event_t *x11_event; int error = 0; /* FIXME(roberto): make it actually poll */ @@ -141,11 +142,11 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { if (x11_event != NULL) { switch (x11_event->response_type & ~0x80) { case XCB_EXPOSE: { - RuimToplevelEventRedraw redraw; + RuimEventRedraw redraw; xcb_configure_notify_event_t *cfg = (xcb_configure_notify_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_REDRAW; + event->type = RUIM_EVENT_REDRAW; redraw.width = cfg->width; redraw.height = cfg->height; redraw.x = cfg->x; @@ -157,13 +158,13 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { xcb_client_message_event_t *cm = (xcb_client_message_event_t *)x11_event; if (cm->data.data32[0] == x11_backend->wm_delete_window) { - event->type = RUIM_TOPLEVEL_EVENT_QUIT; + event->type = RUIM_EVENT_QUIT; } } break; case XCB_KEY_PRESS: { xcb_key_press_event_t *key = (xcb_key_press_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_KEYDOWN; + event->type = RUIM_EVENT_KEYDOWN; event->data.mouse.keycode = key->state; event->data.mouse.x = key->event_x; event->data.mouse.y = key->event_y; @@ -171,7 +172,7 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { case XCB_KEY_RELEASE: { xcb_key_release_event_t *key = (xcb_key_press_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_KEYUP; + event->type = RUIM_EVENT_KEYUP; event->data.mouse.keycode = key->state; event->data.mouse.x = key->event_x; event->data.mouse.y = key->event_y; @@ -179,7 +180,7 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { case XCB_BUTTON_PRESS: { xcb_button_press_event_t *button = (xcb_button_press_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_MOUSEDOWN; + event->type = RUIM_EVENT_MOUSEDOWN; event->data.mouse.keycode = button->state; event->data.mouse.x = button->event_x; event->data.mouse.y = button->event_y; @@ -188,7 +189,7 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { xcb_button_release_event_t *button = (xcb_button_press_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_MOUSEUP; + event->type = RUIM_EVENT_MOUSEUP; event->data.mouse.keycode = button->state; event->data.mouse.x = button->event_x; event->data.mouse.y = button->event_y; @@ -197,7 +198,7 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { xcb_configure_notify_event_t *cfg = (xcb_configure_notify_event_t *)x11_event; - event->type = RUIM_TOPLEVEL_EVENT_WINDOW; + event->type = RUIM_EVENT_WINDOW; event->data.window.width = cfg->width; event->data.window.height = cfg->height; event->data.window.x = cfg->x; @@ -210,7 +211,7 @@ int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event) { _xcb_handle_error(error); return error; } else { - event->type = RUIM_TOPLEVEL_EVENT_NOTHING; + event->type = RUIM_EVENT_NOTHING; } free(x11_event); diff --git a/examples/window.ruim b/docs/examples/window.ruim index 58b2b45..58b2b45 100644 --- a/examples/window.ruim +++ b/docs/examples/window.ruim diff --git a/gui/meson.build b/gui/meson.build deleted file mode 100644 index b3486e7..0000000 --- a/gui/meson.build +++ /dev/null @@ -1,16 +0,0 @@ -gui_sources = files('window.c') -gui_deps = [] - -if os == 'linux' - gui_sources += ['window_xcb.c', 'surface_egl.c', 'renderer_gles.c'] - gui_deps += [ dependency('egl'), dependency('glesv2'), dependency('xcb') ] -endif - -gui_library = library( - 'RuimUI', - gui_sources, - include_directories: ruim_include, - dependencies: gui_deps, - link_with: internal_lib, - install: true, -) diff --git a/immediate/immediate.c b/immediate/immediate.c new file mode 100644 index 0000000..814c83f --- /dev/null +++ b/immediate/immediate.c @@ -0,0 +1,17 @@ +#include "immediate/immediate.h" + +static RuimToplevelBackend backend; + +int RuimInit(void) { + RuimToplevelBackendInit(&backend); + + return 0; +} + +void RuimBegin(void) {} +void RuimEnd(void) {} + +int RuimWaitForEvent(void) { return 1; } + +void RuimBeginWindow(const char *title, RuimCoordinates *coordinates) {} +void RuimEndWindow(void) {} diff --git a/immediate/meson.build b/immediate/meson.build new file mode 100644 index 0000000..5294147 --- /dev/null +++ b/immediate/meson.build @@ -0,0 +1,9 @@ +immediate_sources = files('immediate.c') + +immediate_library = library( + 'RuimImmediate', + immediate_sources, + include_directories: ruim_include, + link_with: [internal_lib, core_library], + install: true, +) diff --git a/include/core/component.h b/include/core/component.h new file mode 100644 index 0000000..639330b --- /dev/null +++ b/include/core/component.h @@ -0,0 +1,15 @@ +#ifndef RUIM_CORE_COMPONENT +#define RUIM_CORE_COMPONENT + +#include "internal/utils.h" + +struct ruim_component { + u64 id, type; + void *data; +}; + +struct ruim_componentTree { + u64 root; +}; + +#endif diff --git a/include/core/event.h b/include/core/event.h new file mode 100644 index 0000000..4798775 --- /dev/null +++ b/include/core/event.h @@ -0,0 +1,48 @@ +#ifndef RUIM_GUI_EVENT +#define RUIM_GUI_EVENT + +#include "core/types.h" +#include "internal/utils.h" + +struct ruim_eventComponent { + u64 sourceID; + u64 eventID; + void *eventData; +}; + +struct ruim_eventKey { + uint32_t keycode; +}; + +struct ruim_eventMouse { + uint32_t keycode; + uint16_t x; + uint16_t y; +}; + +struct ruim_coordinates { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; +}; + +struct ruim_toplevel { + RuimToplevelType type; + RuimToplevelBackend *backend; + + void *data; +}; + +struct ruim_event { + RuimEventType type; + union { + RuimEventWindow window; + RuimEventRedraw redraw; + RuimEventKey key; + RuimEventMouse mouse; + RuimEventComponent component; + } data; +}; + +#endif diff --git a/include/gui/renderer.h b/include/core/renderer.h index 3141a7a..05e4a07 100644 --- a/include/gui/renderer.h +++ b/include/core/renderer.h @@ -1,7 +1,7 @@ #ifndef RUIM_GUI_RENDERER #define RUIM_GUI_RENDERER -#include "gui/types.h" +#include "core/types.h" #ifdef RUIM_PLATFORM_LINUX diff --git a/include/core/types.h b/include/core/types.h new file mode 100644 index 0000000..4e6ae5d --- /dev/null +++ b/include/core/types.h @@ -0,0 +1,42 @@ +#ifndef RUIM_GUI_TYPES +#define RUIM_GUI_TYPES + +typedef struct ruim_surfaceEGL RuimSurfaceEGL; + +typedef struct ruim_toplevel RuimToplevel; +typedef struct ruim_toplevelBackend RuimToplevelBackend; + +typedef struct ruim_coordinates RuimCoordinates; + +typedef unsigned char RuimToplevelBackendType; +#define RUIM_TOPLEVEL_X11 ((RuimToplevelBackendType)1) +#define RUIM_TOPLEVEL_WAYLAND ((RuimToplevelBackendType)2) +#define RUIM_TOPLEVEL_QUARTZ ((RuimToplevelBackendType)3) +#define RUIM_TOPLEVEL_WIN32 ((RuimToplevelBackendType)4) + +typedef unsigned char RuimToplevelType; +#define RUIM_TOPLEVEL_WINDOW ((RuimToplevelType)1) + +typedef unsigned char RuimEventType; +#define RUIM_EVENT_NOTHING ((RuimEventType)0) +#define RUIM_EVENT_KEYUP ((RuimEventType)1) +#define RUIM_EVENT_KEYDOWN ((RuimEventType)2) +#define RUIM_EVENT_MOUSEUP ((RuimEventType)3) +#define RUIM_EVENT_MOUSEDOWN ((RuimEventType)4) +#define RUIM_EVENT_WINDOW ((RuimEventType)5) +#define RUIM_EVENT_REDRAW ((RuimEventType)6) +#define RUIM_EVENT_QUIT ((RuimEventType)7) +#define RUIM_EVENT_COMPONENT ((RuimEventType)8) + +typedef struct ruim_event RuimEvent; +typedef struct ruim_context RuimContext; + +typedef struct ruim_eventKey RuimEventKey; +typedef struct ruim_eventMouse RuimEventMouse; +typedef struct ruim_coordinates RuimEventWindow; +typedef struct ruim_coordinates RuimEventRedraw; +typedef struct ruim_eventComponent RuimEventComponent; + +typedef struct ruim_component RuimComponent; + +#endif diff --git a/include/gui/window.h b/include/core/window.h index 27020c7..2825156 100644 --- a/include/gui/window.h +++ b/include/core/window.h @@ -11,47 +11,13 @@ struct ruim_toplevelBackend { int RuimToplevelBackendInit(RuimToplevelBackend *backend); int RuimToplevelBackendDeinit(RuimToplevelBackend *backend); -struct ruim_toplevelEventKey { - uint32_t keycode; -}; - -struct ruim_toplevelEventMouse { - uint32_t keycode; - uint16_t x; - uint16_t y; -}; - -struct ruim_coordinates { - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; -}; - -struct ruim_toplevelEvent { - RuimToplevelEventType type; - union { - RuimToplevelEventWindow window; - RuimToplevelEventRedraw redraw; - RuimToplevelEventKey key; - RuimToplevelEventMouse mouse; - } data; -}; - -struct ruim_toplevel { - RuimToplevelType type; - RuimToplevelBackend *backend; - - void *data; -}; - int RuimToplevelCreate(RuimToplevel *toplevel, RuimToplevelType type); int RuimToplevelDestroy(RuimToplevel *toplevel); int RuimToplevelDisplay(RuimToplevel *toplevel); int RuimToplevelWaitForEvent(RuimToplevel *toplevel); -int RuimToplevelPoll(RuimToplevel *toplevel, RuimToplevelEvent *event); +int RuimToplevelBackendPoll(RuimToplevelBackend *backend, RuimEvent *event); #ifdef RUIM_PLATFORM_LINUX @@ -89,7 +55,7 @@ struct toplevel_x11 { int _create_toplevel_xcb(RuimToplevel *toplevel); int _display_toplevel_xcb(RuimToplevel *toplevel); -int _poll_event_xcb(RuimToplevel *toplevel, RuimToplevelEvent *event); +int _poll_event_xcb(RuimToplevelBackend *backend, RuimEvent *event); int _wait_event_xcb(RuimToplevel *toplevel); int _destroy_toplevel_xcb(RuimToplevel *toplevel); diff --git a/include/gui/types.h b/include/gui/types.h deleted file mode 100644 index 8ca93d2..0000000 --- a/include/gui/types.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef RUIM_GUI_TYPES -#define RUIM_GUI_TYPES - -typedef struct ruim_surfaceEGL RuimSurfaceEGL; - -typedef struct ruim_toplevel RuimToplevel; -typedef struct ruim_toplevelEvent RuimToplevelEvent; -typedef struct ruim_toplevelBackend RuimToplevelBackend; -typedef struct ruim_toplevelEventKey RuimToplevelEventKey; -typedef struct ruim_toplevelEventMouse RuimToplevelEventMouse; - -typedef struct ruim_coordinates RuimCoordinates; -typedef struct ruim_coordinates RuimToplevelEventWindow; -typedef struct ruim_coordinates RuimToplevelEventRedraw; - -typedef unsigned char RuimToplevelBackendType; -#define RUIM_TOPLEVEL_X11 ((RuimToplevelBackendType)1) -#define RUIM_TOPLEVEL_WAYLAND ((RuimToplevelBackendType)2) -#define RUIM_TOPLEVEL_QUARTZ ((RuimToplevelBackendType)3) -#define RUIM_TOPLEVEL_WIN32 ((RuimToplevelBackendType)4) - -typedef unsigned char RuimToplevelType; -#define RUIM_TOPLEVEL_WINDOW ((RuimToplevelType)1) - -typedef unsigned char RuimToplevelEventType; -#define RUIM_TOPLEVEL_EVENT_NOTHING ((RuimToplevelEventType)0) -#define RUIM_TOPLEVEL_EVENT_KEYUP ((RuimToplevelEventType)1) -#define RUIM_TOPLEVEL_EVENT_KEYDOWN ((RuimToplevelEventType)2) -#define RUIM_TOPLEVEL_EVENT_MOUSEUP ((RuimToplevelEventType)3) -#define RUIM_TOPLEVEL_EVENT_MOUSEDOWN ((RuimToplevelEventType)4) -#define RUIM_TOPLEVEL_EVENT_WINDOW ((RuimToplevelEventType)5) -#define RUIM_TOPLEVEL_EVENT_REDRAW ((RuimToplevelEventType)6) -#define RUIM_TOPLEVEL_EVENT_QUIT ((RuimToplevelEventType)7) - -#endif diff --git a/include/immediate/immediate.h b/include/immediate/immediate.h new file mode 100644 index 0000000..d9725c8 --- /dev/null +++ b/include/immediate/immediate.h @@ -0,0 +1,21 @@ +#ifndef RUIM_CORE +#define RUIM_CORE + +#include "core/event.h" +#include "core/renderer.h" +#include "core/types.h" +#include "core/window.h" + +int RuimInit(void); + +void RuimBegin(void); +void RuimEnd(void); + +int RuimWaitForEvent(void); + +const char *RuimGetError(void); + +void RuimBeginWindow(const char *title, RuimCoordinates *coordinates); +void RuimEndWindow(void); + +#endif /* RUIM_CORE */ diff --git a/include/internal/utils.h b/include/internal/utils.h index 8952369..a28ae89 100644 --- a/include/internal/utils.h +++ b/include/internal/utils.h @@ -25,6 +25,9 @@ typedef unsigned int u32; typedef signed long int i64; typedef unsigned long int u64; +typedef float f32; +typedef double f64; + typedef struct { u64 size; const char *buf; diff --git a/internal/utils.c b/internal/utils.c index 5caf1e8..3be005b 100644 --- a/internal/utils.c +++ b/internal/utils.c @@ -62,8 +62,8 @@ void *arena_alloc(Arena *arena, u64 size, u8 align) { } void arena_zero(Arena *arena) { - arena->size = 0; memset(arena->buffer, 0, arena->size); + arena->size = 0; } void arena_free(Arena *arena) { diff --git a/meson.build b/meson.build index 4d1c39c..02aa1fa 100644 --- a/meson.build +++ b/meson.build @@ -23,7 +23,8 @@ ruim_include = include_directories('include') subdir('internal') +subdir('core') +subdir('immediate') subdir('compiler') -subdir('gui') subdir('test') diff --git a/test/main.c b/test/example_core.c index 6a00aba..e9c78c8 100644 --- a/test/main.c +++ b/test/example_core.c @@ -1,5 +1,7 @@ -#include "gui/renderer.h" -#include "gui/window.h" +#include "core/renderer.h" +#include "core/window.h" + +#include "core/event.h" #include <stdio.h> #include <string.h> @@ -30,7 +32,7 @@ int main(int argc, char **argv) { int width, height, needsRender, shouldClose = 0; RuimToplevelBackend backend; RuimToplevel toplevel; - RuimToplevelEvent event; + RuimEvent event; int err; memset(&backend, 0, sizeof(backend)); @@ -55,19 +57,19 @@ int main(int argc, char **argv) { while (!shouldClose) { int has_events = 0; - while (RuimToplevelPoll(&toplevel, &event)) { + while (RuimToplevelBackendPoll(&backend, &event)) { has_events = 1; switch (event.type) { - case RUIM_TOPLEVEL_EVENT_REDRAW: { + case RUIM_EVENT_REDRAW: { needsRender = 1; } break; - case RUIM_TOPLEVEL_EVENT_WINDOW: { + case RUIM_EVENT_WINDOW: { width = event.data.window.width; height = event.data.window.height; } break; - case RUIM_TOPLEVEL_EVENT_MOUSEDOWN: { + case RUIM_EVENT_MOUSEDOWN: { } break; - case RUIM_TOPLEVEL_EVENT_QUIT: { + case RUIM_EVENT_QUIT: { shouldClose = 1; } break; } diff --git a/test/meson.build b/test/meson.build index 554fe90..d275a09 100644 --- a/test/meson.build +++ b/test/meson.build @@ -1,3 +1,4 @@ -guiExample = executable('ruim', 'main.c', +coreExample = executable('example_core', 'example_core.c', include_directories: ruim_include, - link_with: [gui_library, internal_lib]) + link_with: [core_library, internal_lib] +) |