#include #include #include #include #include "real_dlsym.h" #include "wayland_hook.h" EXPORT_C_(struct wl_display*) wl_display_connect(const char *name); EXPORT_C_(struct wl_display*) wl_display_connect_to_fd(int fd); typedef struct wl_display* (*pwl_display_connect)(const char *name); typedef struct wl_display* (*pwl_display_connect_to_fd)(int fd); pwl_display_connect wl_display_connect_ptr = nullptr; pwl_display_connect_to_fd wl_display_connect_to_fd_ptr = nullptr; void* wl_handle = nullptr; struct wl_display* wl_display_ptr = nullptr; EXPORT_C_(struct wl_display*) wl_display_connect(const char *name) { struct wl_display *ret = nullptr; if (!wl_handle) { wl_handle = real_dlopen("libwayland-client.so", RTLD_LAZY); } if (wl_handle) { wl_display_connect_ptr = (pwl_display_connect)real_dlsym(wl_handle, "wl_display_connect"); wl_display_connect_to_fd_ptr = (pwl_display_connect_to_fd)real_dlsym(wl_handle, "wl_display_connect_to_fd"); ret = wl_display_connect_ptr(name); if (!wl_display_ptr) { wl_display_ptr = ret; init_wayland_data(); } } return ret; } EXPORT_C_(struct wl_display*) wl_display_connect_to_fd(int fd) { struct wl_display *ret = nullptr; if (!wl_handle) { wl_handle = real_dlopen("libwayland-client.so", RTLD_LAZY); } if (wl_handle) { wl_display_connect_to_fd_ptr = (pwl_display_connect_to_fd)real_dlsym(wl_handle, "wl_display_connect_to_fd"); wl_display_connect_ptr = (pwl_display_connect)real_dlsym(wl_handle, "wl_display_connect"); ret = wl_display_connect_to_fd_ptr(fd); if (!wl_display_ptr) { wl_display_ptr = ret; init_wayland_data(); } } return ret; }