hy3/src/SelectionHook.cpp

71 lines
1.6 KiB
C++
Raw Normal View History

#include <hyprland/src/Compositor.hpp>
2023-06-07 03:22:17 -07:00
#include <hyprland/src/plugins/PluginAPI.hpp>
2023-04-26 00:57:24 -07:00
2023-06-28 21:36:08 -07:00
#include "globals.hpp"
namespace selection_hook {
2023-06-07 03:22:17 -07:00
inline CFunctionHook* g_LastSelectionHook = nullptr;
2023-04-26 00:57:24 -07:00
void hook_updateDecos(void* thisptr, PHLWINDOW window) {
2023-06-07 03:22:17 -07:00
bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window);
2023-04-26 00:57:24 -07:00
auto lastWindow = g_pCompositor->m_pLastWindow;
2023-06-07 03:22:17 -07:00
if (explicitly_selected) {
g_pCompositor->m_pLastWindow = window;
}
2023-04-26 00:57:24 -07:00
((void (*)(void*, PHLWINDOW)) g_LastSelectionHook->m_pOriginal)(thisptr, window);
2023-04-26 00:57:24 -07:00
2023-06-07 03:22:17 -07:00
if (explicitly_selected) {
g_pCompositor->m_pLastWindow = lastWindow;
2023-04-26 00:57:24 -07:00
}
2023-06-07 03:22:17 -07:00
}
2023-04-26 00:57:24 -07:00
2023-06-07 03:22:17 -07:00
void init() {
2023-10-27 04:08:07 -07:00
static const auto decoUpdateCandidates =
HyprlandAPI::findFunctionsByName(PHANDLE, "updateWindowAnimatedDecorationValues");
2023-06-07 03:22:17 -07:00
if (decoUpdateCandidates.size() != 1) {
g_LastSelectionHook = nullptr;
hy3_log(
2023-06-07 03:22:17 -07:00
ERR,
"expected one matching function to hook for"
"\"updateWindowAnimatedDecorationValues\", found {}",
2023-06-07 03:22:17 -07:00
decoUpdateCandidates.size()
);
2023-06-07 03:22:17 -07:00
HyprlandAPI::addNotificationV2(
PHANDLE,
{
{"text",
"Failed to load function hooks: "
"\"updateWindowAnimatedDecorationValues\""},
{"time", (uint64_t) 10000},
{"color", CColor(1.0, 0.0, 0.0, 1.0)},
{"icon", ICON_ERROR},
}
);
return;
2023-04-26 00:57:24 -07:00
}
2023-06-07 03:22:17 -07:00
g_LastSelectionHook = HyprlandAPI::createFunctionHook(
PHANDLE,
decoUpdateCandidates[0].address,
(void*) &hook_updateDecos
);
}
void enable() {
if (g_LastSelectionHook != nullptr) {
g_LastSelectionHook->hook();
}
2023-06-07 03:22:17 -07:00
}
2023-04-26 00:57:24 -07:00
2023-06-07 03:22:17 -07:00
void disable() {
if (g_LastSelectionHook != nullptr) {
g_LastSelectionHook->unhook();
2023-04-26 00:57:24 -07:00
}
}
2023-06-07 03:22:17 -07:00
} // namespace selection_hook