commit 94783f656eaf549437a61d52e2df97f28791e880 from: Onana Onana Xavier Manuel date: Fri Sep 12 15:07:42 2025 UTC Corrected event handler misbeahviour - Event queue was not FIFO which caused some unintended behaviours in `demo/event`. This has been corrected along with the demo. commit - 870fe49e4274af2aa8cdc5315feb6956330d2af7 commit + 94783f656eaf549437a61d52e2df97f28791e880 blob - 2fde96a624cd67966672ed3bfcb09cb4d96e552c blob + aec9a0c7220e03ce9f502e4ec0c4777ea53660cc --- TODO +++ TODO @@ -1,47 +1,20 @@ -Event targets +- Create debugging macros that make programs more verbose when compiling + with the `MUI_DEBUG` flag -Debug macro +- Complete man page 7 for a brief description of the library ins and outs -Complete man `mui.1` for demos +- Complete man page 1 for library demos that will be run using the mui + command with the demo name -Complete man `mui.3` +- Implement nested groups -Nested groups +- Implement groups styles (ex. VStack groups, HStack groups, Grid groups, + etc.) with a set of flags (ex. Scrollable and clipping?) -Groups styles (Scroll, VStack, HStack, Grid) +- Add font options (ex. color, size, etc) with flags (ex. multiline, text + wrapping) -Group clipping +- Add a minimum size option for layouts -Font faces (color, size, style) - -Minimum layout dimensions - -Multiline support text rendering - -Man page - -Fix image rendering and text rendering on FreeBSD and NetBSD (DONE) - -Fix issue when text render with noise when having a small len (DONE?) - -Cleanup functions aka delete functions (DONE) - -Fix alignment to update when added to group (DONE) - -New flag 'MUI_SCALE_X' and 'MUI_SCALE_Y' which will be actual scale of -the layout while 'MUI_EXPAND_X' and 'MUI_EXPAND_Y' will be the actual -width and height. (DONE) - -Proper scale matrix for xcb_render (DONE) - -Layout anchoring (DONE) - -Change shape color after adding to group (DONE) - -Events (KeyPress and KeyRelease) (DONE) - -Fix issue when shape changes color but isn't visible until update (DONE) - -Image rendering (DONE) - -Text rendering (the hardest) (DONE) +- Fix issues happening in text rendering (noises that adds odd colors to + text and sometimes text from a dead program invading the new one) blob - 043be9b90254b76b7bcdf9f49dc09e9758c7f0b4 blob + 2a2c2f029682e93ee55c38e5cf3c7cd27737c954 --- demo/event/main.c +++ demo/event/main.c @@ -5,6 +5,8 @@ */ /********************************************************/ +#include + #include "mui.h" #define PRESS 0 @@ -104,43 +106,54 @@ main(void) event = mui_pop_event(window.handler); switch (event.type) { - case MUI_EVENT_MOUSE_MOTION: - if (event_recorder[MOTION].ptr && event.target.ptr != event_recorder[MOTION].ptr) { - if (event_recorder[MOTION].ptr != event_recorder[PRESS].ptr) - mui_set_shape_color(event_recorder[MOTION].ptr, 1.0, 1.0, 1.0, 1.0); - event_recorder[MOTION].ptr = NULL; - } - - if (event.target.ptr && event_recorder[MOTION].ptr != event.target.ptr) { - mui_set_shape_color(event.target.ptr, 0.75, 0.75, 0.75, 1.0); - event_recorder[MOTION].ptr = event.target.ptr; - } - break; - case MUI_EVENT_MOUSE_PRESS: - if (event.target.ptr && event_recorder[PRESS].ptr != event.target.ptr) { - mui_set_shape_color(event.target.ptr, 0.5, 0.5, 0.5, 1.0); - } event_recorder[PRESS].ptr = event.target.ptr; + + if (event.target.ptr) + mui_set_shape_color(event.target.ptr, 0.5, 0.5, 0.5, 1.0); break; + case MUI_EVENT_MOUSE_MOTION: + if (event.target.ptr == event_recorder[MOTION].ptr) + break; + if (event_recorder[MOTION].ptr) + if (event_recorder[MOTION].ptr != event_recorder[PRESS].ptr) + mui_set_shape_color(event_recorder[MOTION].ptr, 1.0, 1.0, 1.0, 1.0); + + if (event.target.ptr && event.target.ptr != event_recorder[PRESS].ptr) + mui_set_shape_color(event.target.ptr, 0.75, 0.75, 0.75, 1.0); + event_recorder[MOTION].ptr = event.target.ptr; + + break; case MUI_EVENT_MOUSE_RELEASE: - if (event_recorder[PRESS].ptr) { - mui_set_shape_color(event_recorder[PRESS].ptr, 1.0, 1.0, 1.0, 1.0); - event_recorder[PRESS].ptr = NULL; - } - if (event.target.ptr) { - if (event_recorder[MOTION].ptr) - mui_set_shape_color(event_recorder[MOTION].ptr, 1.0, 1.0, 1.0, 1.0); - - mui_set_shape_color(event.target.ptr, 0.75, 0.75, 0.75, 1.0); event_recorder[MOTION].ptr = event.target.ptr; + if (event_recorder[MOTION].ptr == event_recorder[PRESS].ptr) + mui_set_shape_color(event.target.ptr, 0.75, 0.75, 0.75, 1.0); + else { + if (event_recorder[PRESS].ptr) + mui_set_shape_color(event_recorder[PRESS].ptr, 1.0, 1.0, 1.0, 1.0); + } + } else { + if (event_recorder[PRESS].ptr) + mui_set_shape_color(event_recorder[PRESS].ptr, 1.0, 1.0, 1.0, 1.0); } + + event_recorder[PRESS].ptr = NULL; + + break; + default: + break; } + + usleep(10000); mui_update(); } + for (int i = 0; i < 5; i++) + mui_delete_shape(buttons[i].shape); + mui_delete_window(window.mw); + return 0; } blob - d555489a457852e1d81213e465561c078d6ecc12 blob + 7550594e8ce6f36f6d267ec6b8d9396befa14332 --- event.c +++ event.c @@ -28,7 +28,7 @@ mui_push_event(struct mui_event_handler *handler, stru if (handler->count == MUI_EVENT_MAX) { struct mui_event *tail; - tail = TAILQ_LAST(&handler->head, ev_list); + tail = TAILQ_FIRST(&handler->head); TAILQ_REMOVE(&handler->head, tail, entries); handler->count--; free(tail); @@ -56,7 +56,7 @@ mui_pop_event(struct mui_event_handler *handler) if (handler->count == 0) return event; - head = TAILQ_FIRST(&handler->head); + head = TAILQ_LAST(&handler->head, ev_list); memcpy(&event, head, sizeof(event)); TAILQ_REMOVE(&handler->head, head, entries); blob - 30a8ba0bd7cb98e97ed8cec4a94b029b0316d11e blob + ce6f83d61a7141b265272ee276b83e3d79851a72 --- mui.h +++ mui.h @@ -55,7 +55,7 @@ struct mui_window; struct mui_ctx; -#define MUI_EVENT_MAX 32 +#define MUI_EVENT_MAX 3 enum { MUI_EVENT_NONE, @@ -290,6 +290,10 @@ int mui_ctx_get_font_h #define MUI_LABEL 2 #define MUI_IMAGE 3 #define MUI_GROUP 4 + #define MUI_VSTACK 1 + #define MUI_HSTACK 2 + #define MUI_ZSTACK 3 + #define MUI_GRID 4 /* LABEL FLAGS */