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_wayland.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/window_wayland.c') diff --git a/src/window_wayland.c b/src/window_wayland.c index 2517003..e019002 100644 --- a/src/window_wayland.c +++ b/src/window_wayland.c @@ -118,6 +118,7 @@ static void global_add(void *data, struct wl_registry *registry, u32 name, (void)data; if (al_strscmp(interface, "wl_output") == 0) { struct stl_monitor_wayland *monitor = al_alloc_object(struct stl_monitor_wayland); + monitor->wln = name; al_array_push(global.monitors, (struct stl_monitor *)monitor); monitor->output = (struct wl_output *)wl_registry_bind(registry, name, &wl_output_interface, ASSERT_MIN(4u, version)); wl_output_add_listener(monitor->output, &output_listener, monitor); @@ -128,7 +129,16 @@ static void global_remove(void *data, struct wl_registry *registry, u32 name) { (void)data; (void)registry; - (void)name; + // @TODO: Untested. + for (u32 i = 0; i < global.monitors.count; i++) { + struct stl_monitor_wayland *monitor = (struct stl_monitor_wayland *)al_array_at(global.monitors, i); + if (monitor->wln == name) { + if (monitor->output) wl_output_destroy(monitor->output); + al_free(monitor); + al_array_remove_at_iter(global.monitors, i); + break; + } + } } static const struct wl_registry_listener registry_listener = { @@ -302,7 +312,7 @@ bool stl_global_init(bool skip_graphics) if (!skip_graphics) { #if defined STELA_API_VULKAN - global.vk_extensions = (const char **)al_calloc(2, sizeof(const char *const *)); + global.vk_extensions = (const char **)al_calloc(2, sizeof(const char *)); global.vk_extensions[0] = "VK_KHR_surface"; global.vk_extensions[1] = "VK_KHR_wayland_surface"; #elif defined STELA_API_OPENGL @@ -499,7 +509,7 @@ static void pointer_frame(void *data, struct wl_pointer *pointer) struct stl_window_wayland *wl = (struct stl_window_wayland *)data; (void)pointer; if (wl->frame.pointer_x != FRAME_NO_VALUE && wl->frame.pointer_y != FRAME_NO_VALUE) { - stl_window_send_pointer_pos_event(&wl->w, wl->frame.pointer_x, wl->frame.pointer_y); + stl_window_send_pointer_event(&wl->w, STELA_POINTER_POS, wl->frame.pointer_x, wl->frame.pointer_y); wl->frame.pointer_x = FRAME_NO_VALUE; wl->frame.pointer_y = FRAME_NO_VALUE; } @@ -708,6 +718,7 @@ static void context_global_add(void *data, struct wl_registry *registry, u32 nam static void context_global_remove(void *data, struct wl_registry *registry, u32 name) { + // @TODO: Probably need to handle seat here. (void)data; (void)registry; (void)name; @@ -1299,10 +1310,10 @@ static VkResult window_wayland_vk_destroy_surface(VkInstance inst, VkSurfaceKHR return stl_vk_destroy_surface(inst, surface); } -static const char *const *window_wayland_vk_get_extensions(u32 *num) +static const char * const *window_wayland_vk_get_extensions(u32 *num) { *num = 2; - return global.vk_extensions; + return (const char * const *)global.vk_extensions; } #elif defined STELA_API_OPENGL static bool window_wayland_gl_loader_load(void *window) -- cgit v1.2.3-101-g0448