Skip to content

Commit

Permalink
wayland: Improve seat / input handling
Browse files Browse the repository at this point in the history
  • Loading branch information
markbolhuis committed Dec 4, 2024
1 parent 975815c commit 5598ea7
Show file tree
Hide file tree
Showing 5 changed files with 304 additions and 102 deletions.
21 changes: 19 additions & 2 deletions src/gl/inject_egl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,17 +135,34 @@ EXPORT_C_(void*) eglGetDisplay( void* native_display )
return pfn_eglGetDisplay(native_display);
}

EXPORT_C_(void*) eglTerminate( void* native_display );
EXPORT_C_(void*) eglTerminate( void* native_display )
{
static void* (*pfn_eglTerminate)(void*) = nullptr;
if (!pfn_eglTerminate)
pfn_eglTerminate= reinterpret_cast<decltype(pfn_eglTerminate)>(get_egl_proc_address("eglTerminate"));

#ifdef HAVE_WAYLAND
if (wl_display_ptr) {
fini_wayland_data();
}
#endif

return pfn_eglTerminate(native_display);
}

struct func_ptr {
const char *name;
void *ptr;
};

static std::array<const func_ptr, 4> name_to_funcptr_map = {{
static std::array<const func_ptr, 5> name_to_funcptr_map = {{
#define ADD_HOOK(fn) { #fn, (void *) fn }
ADD_HOOK(eglGetProcAddress),
ADD_HOOK(eglSwapBuffers),
ADD_HOOK(eglGetPlatformDisplay),
ADD_HOOK(eglGetDisplay)
ADD_HOOK(eglGetDisplay),
ADD_HOOK(eglTerminate)
#undef ADD_HOOK
}};

Expand Down
5 changes: 1 addition & 4 deletions src/keybinds.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,8 @@ static inline bool keys_are_pressed(const std::vector<KeySym>& keys)
if(wl_display_ptr && wl_handle)
{
update_wl_queue();

if(wl_pressed_keys == keys)
{
if (any_seat_syms_are_pressed_wl(keys))
return true;
}
}
#endif

Expand Down
7 changes: 6 additions & 1 deletion src/vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2031,6 +2031,10 @@ static void overlay_DestroyInstance(
stop_notifier(instance_data->notifier);
#endif
destroy_instance_data(instance_data);
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
if (wl_display_ptr)
fini_wayland_data();
#endif
}

#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Expand All @@ -2044,7 +2048,8 @@ static VkResult overlay_CreateWaylandSurfaceKHR(
struct instance_data *instance_data = FIND(struct instance_data, instance);
if (!wl_handle)
wl_handle = real_dlopen("libwayland-client.so", RTLD_LAZY);
wl_display_ptr = pCreateInfo->display;
if (!wl_display_ptr)
wl_display_ptr = pCreateInfo->display;
HUDElements.display_server = HUDElements.display_servers::WAYLAND;
init_wayland_data();
return instance_data->vtable.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Expand Down
12 changes: 10 additions & 2 deletions src/wayland_hook.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
#include <wayland-client.h>
#pragma once
#ifndef MANGOHUD_WAYLAND_HOOK_H
#define MANGOHUD_WAYLAND_HOOK_H

#include <vector>

struct wl_display;

#ifndef KeySym
typedef unsigned long KeySym;
#endif

extern void* wl_handle;
extern struct wl_display* wl_display_ptr;
extern std::vector<KeySym> wl_pressed_keys;

void init_wayland_data();
void fini_wayland_data();
void update_wl_queue();
bool any_seat_syms_are_pressed_wl(const std::vector<KeySym> &syms);

#endif
Loading

0 comments on commit 5598ea7

Please sign in to comment.