136c910c5ac4610108dc8bdd45c3df9a8c2db89c

Author
outfoxxed <outfoxxed@outfoxxed.me>
Committer
outfoxxed <outfoxxed@outfoxxed.me>
Date

Message

Fix selection hook segfaulting on reload

Diff

  1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
  2index 3e3b303870cdb5a5a61869d75ae2b985c85e16b2..a7eab18a26a7700a02ff963c1a02b1724e1cf036 100644
  3--- a/src/Hy3Layout.cpp
  4+++ b/src/Hy3Layout.cpp
  5@@ -1017,11 +1017,11 @@ void Hy3Layout::onEnable() {
  6 		this->onWindowCreatedTiling(window.get());
  7 	}
  8 
  9-	setup_selection_hook();
 10+	selection_hook::enable();
 11 }
 12 
 13 void Hy3Layout::onDisable() {
 14-	disable_selection_hook();
 15+	selection_hook::disable();
 16 	this->nodes.clear();
 17 }
 18 
 19diff --git a/src/SelectionHook.cpp b/src/SelectionHook.cpp
 20index 83ca2baa2aab392fededc4c23d983320d11fd41b..2441fe4e4e8dda983764d5f30d66619b534bcacc 100644
 21--- a/src/SelectionHook.cpp
 22+++ b/src/SelectionHook.cpp
 23@@ -2,29 +2,30 @@
 24 #include <hyprland/src/plugins/PluginAPI.hpp>
 25 #include <hyprland/src/Compositor.hpp>
 26 
 27-inline CFunctionHook* g_LastSelectionHook = nullptr;
 28+namespace selection_hook {
 29+	inline CFunctionHook* g_LastSelectionHook = nullptr;
 30 
 31-void hook_update_decos(void* thisptr, CWindow* window) {
 32-	bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window);
 33-	Debug::log(LOG, "update decos for %p - selected: %d", window, explicitly_selected);
 34+	void hook_updateDecos(void* thisptr, CWindow* window) {
 35+		bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window);
 36+		Debug::log(LOG, "update decos for %p - selected: %d", window, explicitly_selected);
 37 
 38-	auto* lastWindow = g_pCompositor->m_pLastWindow;
 39-	if (explicitly_selected) {
 40-		g_pCompositor->m_pLastWindow = window;
 41-	}
 42+		auto* lastWindow = g_pCompositor->m_pLastWindow;
 43+		if (explicitly_selected) {
 44+			g_pCompositor->m_pLastWindow = window;
 45+		}
 46 
 47-	((void (*)(void*, CWindow*)) g_LastSelectionHook->m_pOriginal)(thisptr, window);
 48+		((void (*)(void*, CWindow*)) g_LastSelectionHook->m_pOriginal)(thisptr, window);
 49 
 50-	if (explicitly_selected) {
 51-		g_pCompositor->m_pLastWindow = lastWindow;
 52+		if (explicitly_selected) {
 53+			g_pCompositor->m_pLastWindow = lastWindow;
 54+		}
 55 	}
 56-}
 57 
 58-void setup_selection_hook() {
 59-	if (g_LastSelectionHook == nullptr) {
 60+	void init() {
 61 		static const auto decoUpdateCandidates = HyprlandAPI::findFunctionsByName(PHANDLE, "updateWindowAnimatedDecorationValues");
 62 
 63 		if (decoUpdateCandidates.size() != 1) {
 64+			g_LastSelectionHook = nullptr;
 65 			Debug::log(ERR, "Expected one matching function to hook for \"updateWindowAnimatedDecorationValues\", found %d", decoUpdateCandidates.size());
 66 			HyprlandAPI::addNotificationV2(PHANDLE, {
 67 				{"text", "Failed to load function hooks: \"updateWindowAnimatedDecorationValues\""},
 68@@ -35,14 +36,18 @@ void setup_selection_hook() {
 69 			return;
 70 		}
 71 
 72-		g_LastSelectionHook = HyprlandAPI::createFunctionHook(PHANDLE, decoUpdateCandidates[0].address, (void*)&hook_update_decos);
 73+		g_LastSelectionHook = HyprlandAPI::createFunctionHook(PHANDLE, decoUpdateCandidates[0].address, (void*)&hook_updateDecos);
 74 	}
 75 
 76-	g_LastSelectionHook->hook();
 77-}
 78+	void enable() {
 79+		if (g_LastSelectionHook != nullptr) {
 80+			g_LastSelectionHook->hook();
 81+		}
 82+	}
 83 
 84-void disable_selection_hook() {
 85-	if (g_LastSelectionHook != nullptr) {
 86-		g_LastSelectionHook->unhook();
 87+	void disable() {
 88+		if (g_LastSelectionHook != nullptr) {
 89+			g_LastSelectionHook->unhook();
 90+		}
 91 	}
 92 }
 93diff --git a/src/SelectionHook.hpp b/src/SelectionHook.hpp
 94index f15fd2399f5f2f72e99195f5a68e0a3e447c1286..3f38e53871b1b11cd891d888966ac40ae35f3e18 100644
 95--- a/src/SelectionHook.hpp
 96+++ b/src/SelectionHook.hpp
 97@@ -1,4 +1,7 @@
 98 #pragma once
 99 
100-void setup_selection_hook();
101-void disable_selection_hook();
102+namespace selection_hook {
103+	void init();
104+	void enable();
105+	void disable();
106+}
107diff --git a/src/main.cpp b/src/main.cpp
108index 18cfb2b6e486c7534c9c454b4330cd5c44289fb2..1f2677e5b22aa9f16c6f9f0e7c1bf7a5613f6159 100644
109--- a/src/main.cpp
110+++ b/src/main.cpp
111@@ -2,7 +2,7 @@
112 #include <hyprland/src/Compositor.hpp>
113 
114 #include "globals.hpp"
115-
116+#include "SelectionHook.hpp"
117 
118 APICALL EXPORT std::string PLUGIN_API_VERSION() {
119 	return HYPRLAND_API_VERSION;
120@@ -98,6 +98,8 @@ void dispatch_debug(std::string arg) {
121 APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
122 	PHANDLE = handle;
123 
124+	selection_hook::init();
125+
126 	HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:no_gaps_when_only", SConfigValue{.intValue = 0});
127 
128 	g_Hy3Layout = std::make_unique<Hy3Layout>();