From f48520c10ba822e13ef119f626b85fc081f96124 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Tue, 25 Aug 2026 19:48:15 -0400 Subject: Raw input + drag and drop on Windows, cleanup Signed-off-by: Andrew Opalach --- src/window.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'src/window.c') diff --git a/src/window.c b/src/window.c index f85f4fc..ad5ca4d 100644 --- a/src/window.c +++ b/src/window.c @@ -4,9 +4,10 @@ #include "window.h" #include "keys.h" -static bool nop_pointer_pos_callback(void *userdata, f64 x, f64 y) +static bool nop_pointer_callback(void *userdata, u8 type, f64 x, f64 y) { (void)userdata; + (void)type; (void)x; (void)y; return false; @@ -53,6 +54,14 @@ static bool nop_key_immediate_callback(void *userdata, u8 state, u16 button) return false; } +#ifdef STELA_DRAG_AND_DROP +static void nop_drag_and_drop_callback(void *userdata, str *path) +{ + (void)userdata; + (void)path; +} +#endif + static void window_default_close(struct stl_window *window) { window->closed = true; @@ -60,12 +69,15 @@ static void window_default_close(struct stl_window *window) void stl_window_init(struct stl_window *window) { - window->pointer_pos_callback = nop_pointer_pos_callback; + window->pointer_callback = nop_pointer_callback; window->touch_callback = nop_touch_callback; window->scroll_callback = nop_scroll_callback; window->mouse_button_callback = nop_mouse_button_callback; window->key_callback = nop_key_callback; window->key_immediate_callback = nop_key_immediate_callback; +#ifdef STELA_DRAG_AND_DROP + window->drag_and_drop_callback = nop_drag_and_drop_callback; +#endif window->close = window_default_close; #ifdef STELA_EVENT_BUFFER al_ring_buffer_init(&window->events, window->data, STELA_EVENTS_SIZE); @@ -121,18 +133,19 @@ void stl_window_send_resize_event(struct stl_window *window, u32 width, u32 heig #endif } -void stl_window_send_pointer_pos_event(struct stl_window *window, f64 x, f64 y) +void stl_window_send_pointer_event(struct stl_window *window, u8 type, f64 x, f64 y) { #ifdef STELA_EVENT_BUFFER GET_EVENT_CHUNK(STELA_EVENT_POINTER_POS); - ((f64 *)(&ptr[1]))[0] = x; - ((f64 *)(&ptr[9]))[0] = y; + ptr[1] = type; + ((f64 *)(&ptr[2]))[0] = x; + ((f64 *)(&ptr[10]))[0] = y; APPEND_EVENT_CHUNK(); #else #ifdef STELA_PAUSE window->pending_refresh |= #endif - window->pointer_pos_callback(window->userdata, x, y); + window->pointer_callback(window->userdata, type, x, y); #endif } @@ -234,6 +247,13 @@ bool stl_window_send_key_immediate_event(struct stl_window *window, u8 state, u1 return window->key_immediate_callback(window->userdata, state, button * (stl_key_to_mod(button) == STELA_MOD_NONE)); } +#ifdef STELA_DRAG_AND_DROP +void stl_window_send_drag_and_drop_event(struct stl_window *window, str *path) +{ + window->drag_and_drop_callback(window->userdata, path); +} +#endif + void stl_window_drop_modifiers(struct stl_window *window) { u32 *mods = stl_all_modifiers; @@ -282,12 +302,13 @@ bool stl_window_read_events(struct stl_window *window) op = *bc; switch (op) { case STELA_EVENT_POINTER_POS: { - f64 x = ((f64 *)(&bc[1]))[0]; - f64 y = ((f64 *)(&bc[9]))[0]; + u8 type = bc[1]; + f64 x = ((f64 *)(&bc[2]))[0]; + f64 y = ((f64 *)(&bc[10]))[0]; #ifdef STELA_PAUSE window->pending_refresh |= #endif - window->pointer_pos_callback(window->userdata, x, y); + window->pointer_callback(window->userdata, type, x, y); break; } case STELA_EVENT_TOUCH: { -- cgit v1.2.3-101-g0448