#include "loader_x11.h" #include #include libx11_loader::libx11_loader() : loaded_(false) { } libx11_loader::~libx11_loader() { CleanUp(loaded_); } bool libx11_loader::Load(const std::string& library_name) { if (loaded_) { return false; } library_ = dlopen(library_name.c_str(), RTLD_LAZY); if (!library_) { spdlog::error("Failed to open " MANGOHUD_ARCH " {}: {}", library_name, dlerror()); return false; } XOpenDisplay = reinterpret_castXOpenDisplay)>( dlsym(library_, "XOpenDisplay")); if (!XOpenDisplay) { CleanUp(true); return false; } XCloseDisplay = reinterpret_castXCloseDisplay)>( dlsym(library_, "XCloseDisplay")); if (!XCloseDisplay) { CleanUp(true); return false; } XQueryKeymap = reinterpret_castXQueryKeymap)>( dlsym(library_, "XQueryKeymap")); if (!XQueryKeymap) { CleanUp(true); return false; } XKeysymToKeycode = reinterpret_castXKeysymToKeycode)>( dlsym(library_, "XKeysymToKeycode")); if (!XKeysymToKeycode) { CleanUp(true); return false; } XStringToKeysym = reinterpret_castXStringToKeysym)>( dlsym(library_, "XStringToKeysym")); if (!XStringToKeysym) { CleanUp(true); return false; } XGetGeometry = reinterpret_castXGetGeometry)>( dlsym(library_, "XGetGeometry")); if (!XGetGeometry) { CleanUp(true); return false; } loaded_ = true; return true; } void libx11_loader::CleanUp(bool unload) { if (unload) { dlclose(library_); library_ = NULL; } loaded_ = false; XOpenDisplay = NULL; XCloseDisplay = NULL; XQueryKeymap = NULL; XKeysymToKeycode = NULL; XStringToKeysym = NULL; XGetGeometry = NULL; } std::shared_ptr g_x11(new libx11_loader("libX11.so.6"));