diff options
Diffstat (limited to 'src/window_wayland.c')
| -rw-r--r-- | src/window_wayland.c | 21 |
1 files changed, 16 insertions, 5 deletions
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) |