diff --git a/src/loaders/loader_x11.cpp b/src/loaders/loader_x11.cpp new file mode 100644 index 0000000..082a7b5 --- /dev/null +++ b/src/loaders/loader_x11.cpp @@ -0,0 +1,87 @@ +#include "loader_x11.h" + +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_) + 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; + XGetGeometry = NULL; + +} + +std::shared_ptr g_x11(new libx11_loader("libX11.so.6")); diff --git a/src/loaders/loader_x11.h b/src/loaders/loader_x11.h new file mode 100644 index 0000000..05a36a9 --- /dev/null +++ b/src/loaders/loader_x11.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include + +#include +#include + +class libx11_loader { + public: + libx11_loader(); + libx11_loader(const std::string& library_name) { Load(library_name); } + ~libx11_loader(); + + bool Load(const std::string& library_name); + bool IsLoaded() { return loaded_; } + + decltype(&::XOpenDisplay) XOpenDisplay; + decltype(&::XCloseDisplay) XCloseDisplay; + decltype(&::XQueryKeymap) XQueryKeymap; + decltype(&::XKeysymToKeycode) XKeysymToKeycode; + decltype(&::XStringToKeysym) XStringToKeysym; + decltype(&::XGetGeometry) XGetGeometry; + + + private: + void CleanUp(bool unload); + + void* library_; + bool loaded_; + + // Disallow copy constructor and assignment operator. + libx11_loader(const libx11_loader&); + void operator=(const libx11_loader&); +}; + +extern std::shared_ptr g_x11;