diff --git a/src/keybinds.h b/src/keybinds.h index 45b2c9ec..45633cf2 100644 --- a/src/keybinds.h +++ b/src/keybinds.h @@ -22,10 +22,11 @@ static inline bool keys_are_pressed(const std::vector& keys) { char keys_return[32]; size_t pressed = 0; - g_x11->XQueryKeymap(get_xdisplay(), keys_return); + auto libx11 = get_libx11(); + libx11->XQueryKeymap(get_xdisplay(), keys_return); for (KeySym ks : keys) { - KeyCode kc2 = g_x11->XKeysymToKeycode(get_xdisplay(), ks); + KeyCode kc2 = libx11->XKeysymToKeycode(get_xdisplay(), ks); bool isPressed = !!(keys_return[kc2 >> 3] & (1 << (kc2 & 7))); diff --git a/src/loaders/loader_x11.cpp b/src/loaders/loader_x11.cpp index 4db6f78e..549424fc 100644 --- a/src/loaders/loader_x11.cpp +++ b/src/loaders/loader_x11.cpp @@ -89,4 +89,10 @@ void libx11_loader::CleanUp(bool unload) { } -std::shared_ptr g_x11(new libx11_loader("libX11.so.6")); +static std::shared_ptr loader; +std::shared_ptr get_libx11() +{ + if (!loader) + loader = std::make_shared("libX11.so.6"); + return loader; +} diff --git a/src/loaders/loader_x11.h b/src/loaders/loader_x11.h index 4b502428..fedac4ce 100644 --- a/src/loaders/loader_x11.h +++ b/src/loaders/loader_x11.h @@ -33,4 +33,4 @@ class libx11_loader { void operator=(const libx11_loader&); }; -extern std::shared_ptr g_x11; +std::shared_ptr get_libx11(); diff --git a/src/nvctrl.cpp b/src/nvctrl.cpp index a3ca11e5..7389b4f7 100644 --- a/src/nvctrl.cpp +++ b/src/nvctrl.cpp @@ -20,16 +20,17 @@ bool nvctrlSuccess = false; static bool find_nv_x11(libnvctrl_loader& nvctrl, Display*& dpy) { char buf[8] {}; + auto libx11 = get_libx11(); for (int i = 0; i < 16; i++) { snprintf(buf, sizeof(buf), ":%d", i); - Display *d = g_x11->XOpenDisplay(buf); + Display *d = libx11->XOpenDisplay(buf); if (d) { if (nvctrl.XNVCTRLIsNvScreen(d, i)) { dpy = d; SPDLOG_DEBUG("XNVCtrl is using display {}", buf); return true; } - g_x11->XCloseDisplay(d); + libx11->XCloseDisplay(d); } } return false; @@ -37,7 +38,7 @@ static bool find_nv_x11(libnvctrl_loader& nvctrl, Display*& dpy) bool checkXNVCtrl() { - if (!g_x11->IsLoaded()) + if (!get_libx11()->IsLoaded()) return false; auto& nvctrl = get_libnvctrl_loader(); @@ -54,7 +55,7 @@ bool checkXNVCtrl() return false; } - auto local_x11 = g_x11; + auto local_x11 = get_libx11(); display = { dpy, [local_x11](Display *dpy) { local_x11->XCloseDisplay(dpy); diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index 58b5fded..a0998f5a 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -129,12 +129,12 @@ static std::vector parse_string_to_keysym_vec(const char *str) { std::vector keys; - if(g_x11->IsLoaded()) + if(get_libx11()->IsLoaded()) { auto keyStrings = str_tokenize(str); for (auto& ks : keyStrings) { trim(ks); - KeySym xk = g_x11->XStringToKeysym(ks.c_str()); + KeySym xk = get_libx11()->XStringToKeysym(ks.c_str()); if (xk) keys.push_back(xk); else diff --git a/src/shared_x11.cpp b/src/shared_x11.cpp index ec2b25c5..56b9a7cb 100644 --- a/src/shared_x11.cpp +++ b/src/shared_x11.cpp @@ -16,7 +16,9 @@ bool init_x11() { if (display) return true; - if (!g_x11->IsLoaded()) { + auto libx11 = get_libx11(); + + if (!libx11->IsLoaded()) { SPDLOG_ERROR("X11 loader failed to load"); failed = true; return false; @@ -24,11 +26,10 @@ bool init_x11() { const char *displayid = getenv("DISPLAY"); if (displayid) { - auto local_x11 = g_x11; - display = { g_x11->XOpenDisplay(displayid), - [local_x11](Display* dpy) { + display = { libx11->XOpenDisplay(displayid), + [libx11](Display* dpy) { if (dpy) - local_x11->XCloseDisplay(dpy); + libx11->XCloseDisplay(dpy); } }; }