2023-04-27 11:14:11 -07:00
|
|
|
#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"
|
|
|
|
|
2023-04-30 00:47:01 -07:00
|
|
|
namespace selection_hook {
|
2023-06-07 03:22:17 -07:00
|
|
|
inline CFunctionHook* g_LastSelectionHook = nullptr;
|
2023-04-26 00:57:24 -07:00
|
|
|
|
2024-04-29 16:45:23 -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
|
|
|
|
2024-04-29 16:45:23 -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
|
|
|
|
2024-04-29 16:45:23 -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;
|
2023-09-07 02:42:16 -07:00
|
|
|
|
|
|
|
hy3_log(
|
2023-06-07 03:22:17 -07:00
|
|
|
ERR,
|
2023-09-07 02:42:16 -07:00
|
|
|
"expected one matching function to hook for"
|
|
|
|
"\"updateWindowAnimatedDecorationValues\", found {}",
|
2023-06-07 03:22:17 -07:00
|
|
|
decoUpdateCandidates.size()
|
|
|
|
);
|
2023-09-07 02:42:16 -07:00
|
|
|
|
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-04-30 00:47:01 -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 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
|