diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 3e3b303..a7eab18 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -1017,11 +1017,11 @@ void Hy3Layout::onEnable() { this->onWindowCreatedTiling(window.get()); } - setup_selection_hook(); + selection_hook::enable(); } void Hy3Layout::onDisable() { - disable_selection_hook(); + selection_hook::disable(); this->nodes.clear(); } diff --git a/src/SelectionHook.cpp b/src/SelectionHook.cpp index 83ca2ba..2441fe4 100644 --- a/src/SelectionHook.cpp +++ b/src/SelectionHook.cpp @@ -2,29 +2,30 @@ #include #include -inline CFunctionHook* g_LastSelectionHook = nullptr; +namespace selection_hook { + inline CFunctionHook* g_LastSelectionHook = nullptr; -void hook_update_decos(void* thisptr, CWindow* window) { - bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window); - Debug::log(LOG, "update decos for %p - selected: %d", window, explicitly_selected); + void hook_updateDecos(void* thisptr, CWindow* window) { + bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window); + Debug::log(LOG, "update decos for %p - selected: %d", window, explicitly_selected); - auto* lastWindow = g_pCompositor->m_pLastWindow; - if (explicitly_selected) { - g_pCompositor->m_pLastWindow = window; + auto* lastWindow = g_pCompositor->m_pLastWindow; + if (explicitly_selected) { + g_pCompositor->m_pLastWindow = window; + } + + ((void (*)(void*, CWindow*)) g_LastSelectionHook->m_pOriginal)(thisptr, window); + + if (explicitly_selected) { + g_pCompositor->m_pLastWindow = lastWindow; + } } - ((void (*)(void*, CWindow*)) g_LastSelectionHook->m_pOriginal)(thisptr, window); - - if (explicitly_selected) { - g_pCompositor->m_pLastWindow = lastWindow; - } -} - -void setup_selection_hook() { - if (g_LastSelectionHook == nullptr) { + void init() { static const auto decoUpdateCandidates = HyprlandAPI::findFunctionsByName(PHANDLE, "updateWindowAnimatedDecorationValues"); if (decoUpdateCandidates.size() != 1) { + g_LastSelectionHook = nullptr; Debug::log(ERR, "Expected one matching function to hook for \"updateWindowAnimatedDecorationValues\", found %d", decoUpdateCandidates.size()); HyprlandAPI::addNotificationV2(PHANDLE, { {"text", "Failed to load function hooks: \"updateWindowAnimatedDecorationValues\""}, @@ -35,14 +36,18 @@ void setup_selection_hook() { return; } - g_LastSelectionHook = HyprlandAPI::createFunctionHook(PHANDLE, decoUpdateCandidates[0].address, (void*)&hook_update_decos); + g_LastSelectionHook = HyprlandAPI::createFunctionHook(PHANDLE, decoUpdateCandidates[0].address, (void*)&hook_updateDecos); } - g_LastSelectionHook->hook(); -} + void enable() { + if (g_LastSelectionHook != nullptr) { + g_LastSelectionHook->hook(); + } + } -void disable_selection_hook() { - if (g_LastSelectionHook != nullptr) { - g_LastSelectionHook->unhook(); + void disable() { + if (g_LastSelectionHook != nullptr) { + g_LastSelectionHook->unhook(); + } } } diff --git a/src/SelectionHook.hpp b/src/SelectionHook.hpp index f15fd23..3f38e53 100644 --- a/src/SelectionHook.hpp +++ b/src/SelectionHook.hpp @@ -1,4 +1,7 @@ #pragma once -void setup_selection_hook(); -void disable_selection_hook(); +namespace selection_hook { + void init(); + void enable(); + void disable(); +} diff --git a/src/main.cpp b/src/main.cpp index 18cfb2b..1f2677e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,7 @@ #include #include "globals.hpp" - +#include "SelectionHook.hpp" APICALL EXPORT std::string PLUGIN_API_VERSION() { return HYPRLAND_API_VERSION; @@ -98,6 +98,8 @@ void dispatch_debug(std::string arg) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { PHANDLE = handle; + selection_hook::init(); + HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:no_gaps_when_only", SConfigValue{.intValue = 0}); g_Hy3Layout = std::make_unique();