all: chase hyprland

This commit is contained in:
Vaxry 2025-10-23 20:54:45 +01:00
parent f1b4524442
commit 81f6d14265
No known key found for this signature in database
GPG Key ID: 665806380871D640
9 changed files with 86 additions and 72 deletions

View File

@ -26,9 +26,10 @@ void onNewWindow(void* self, std::any data) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[borders-plus-plus] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[borders-plus-plus] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[bpp] Version mismatch"); throw std::runtime_error("[bpp] Version mismatch");

View File

@ -106,9 +106,10 @@ CRegion hkWLSurfaceDamage(CWLSurface* thisptr) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[csgo-vulkan-fix] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[csgo-vulkan-fix] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[vkfix] Version mismatch"); throw std::runtime_error("[vkfix] Version mismatch");
@ -129,29 +130,32 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
g_appConfigs.emplace_back(SAppConfig{.szClass = *PCLASS, .res = Vector2D{(int)**RESX, (int)**RESY}}); g_appConfigs.emplace_back(SAppConfig{.szClass = *PCLASS, .res = Vector2D{(int)**RESX, (int)**RESY}});
}); });
HyprlandAPI::addConfigKeyword(PHANDLE, "vkfix-app", [](const char* l, const char* r) -> Hyprlang::CParseResult { HyprlandAPI::addConfigKeyword(
const std::string str = r; PHANDLE, "vkfix-app",
CConstVarList data(str, 0, ',', true); [](const char* l, const char* r) -> Hyprlang::CParseResult {
const std::string str = r;
CConstVarList data(str, 0, ',', true);
Hyprlang::CParseResult result; Hyprlang::CParseResult result;
if (data.size() != 3) {
result.setError("vkfix-app requires 3 params");
return result;
}
try {
SAppConfig config;
config.szClass = data[0];
config.res = Vector2D{std::stoi(std::string{data[1]}), std::stoi(std::string{data[2]})};
g_appConfigs.emplace_back(std::move(config));
} catch (std::exception& e) {
result.setError("failed to parse line");
return result;
}
if (data.size() != 3) {
result.setError("vkfix-app requires 3 params");
return result; return result;
} },
Hyprlang::SHandlerOptions{});
try {
SAppConfig config;
config.szClass = data[0];
config.res = Vector2D{std::stoi(std::string{data[1]}), std::stoi(std::string{data[2]})};
g_appConfigs.emplace_back(std::move(config));
} catch (std::exception& e) {
result.setError("failed to parse line");
return result;
}
return result;
}, Hyprlang::SHandlerOptions{});
auto FNS = HyprlandAPI::findFunctionsByName(PHANDLE, "sendPointerMotion"); auto FNS = HyprlandAPI::findFunctionsByName(PHANDLE, "sendPointerMotion");
for (auto& fn : FNS) { for (auto& fn : FNS) {

View File

@ -112,9 +112,10 @@ Hyprlang::CParseResult onNewButton(const char* K, const char* V) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[hyprbars] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[hyprbars] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[hb] Version mismatch"); throw std::runtime_error("[hb] Version mismatch");

View File

@ -107,7 +107,7 @@ static void failNotif(const std::string& reason) {
} }
static Hyprlang::CParseResult expoGestureKeyword(const char* LHS, const char* RHS) { static Hyprlang::CParseResult expoGestureKeyword(const char* LHS, const char* RHS) {
Hyprlang::CParseResult result; Hyprlang::CParseResult result;
if (g_unloading) if (g_unloading)
return result; return result;
@ -182,9 +182,10 @@ static Hyprlang::CParseResult expoGestureKeyword(const char* LHS, const char* RH
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
failNotif("Version mismatch (headers ver is not equal to running hyprland ver)"); failNotif("Version mismatch (headers ver is not equal to running hyprland ver)");
throw std::runtime_error("[he] Version mismatch"); throw std::runtime_error("[he] Version mismatch");
} }

View File

@ -110,9 +110,10 @@ static void onFocusChange(PHLWINDOW window) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[hww] Version mismatch"); throw std::runtime_error("[hww] Version mismatch");

View File

@ -31,9 +31,10 @@ UP<CScrollingLayout> g_pScrollingLayout;
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[hs] Version mismatch"); throw std::runtime_error("[hs] Version mismatch");
@ -50,7 +51,8 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprscrolling:explicit_column_widths", Hyprlang::STRING{"0.333, 0.5, 0.667, 1.0"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprscrolling:explicit_column_widths", Hyprlang::STRING{"0.333, 0.5, 0.667, 1.0"});
HyprlandAPI::addLayout(PHANDLE, "scrolling", g_pScrollingLayout.get()); HyprlandAPI::addLayout(PHANDLE, "scrolling", g_pScrollingLayout.get());
if (success) HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Initialized successfully!", CHyprColor{0.2, 1.0, 0.2, 1.0}, 5000); if (success)
HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Initialized successfully!", CHyprColor{0.2, 1.0, 0.2, 1.0}, 5000);
else { else {
HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Failure in initialization: failed to register dispatchers", CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); HyprlandAPI::addNotification(PHANDLE, "[hyprscrolling] Failure in initialization: failed to register dispatchers", CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[hs] Dispatchers failed"); throw std::runtime_error("[hs] Dispatchers failed");

View File

@ -100,9 +100,10 @@ void initGlobal() {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[ht] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", CHyprColor{1.0, 0.2, 0.2, 1.0}, HyprlandAPI::addNotification(PHANDLE, "[ht] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", CHyprColor{1.0, 0.2, 0.2, 1.0},
5000); 5000);
throw std::runtime_error("[ht] Version mismatch"); throw std::runtime_error("[ht] Version mismatch");

View File

@ -32,20 +32,20 @@ typedef void (*origCommit)(void* owner, void* data);
std::vector<PHLWINDOWREF> bgWindows; std::vector<PHLWINDOWREF> bgWindows;
void onNewWindow(PHLWINDOW pWindow) { void onNewWindow(PHLWINDOW pWindow) {
static auto* const PCLASS = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:class")->getDataStaticPtr(); static auto* const PCLASS = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:class")->getDataStaticPtr();
static auto* const PTITLE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:title")->getDataStaticPtr(); static auto* const PTITLE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:title")->getDataStaticPtr();
static auto* const PSIZEX = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:size_x")->getDataStaticPtr(); static auto* const PSIZEX = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:size_x")->getDataStaticPtr();
static auto* const PSIZEY = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:size_y")->getDataStaticPtr(); static auto* const PSIZEY = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:size_y")->getDataStaticPtr();
static auto* const PPOSX = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_x")->getDataStaticPtr(); static auto* const PPOSX = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_x")->getDataStaticPtr();
static auto* const PPOSY = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_y")->getDataStaticPtr(); static auto* const PPOSY = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_y")->getDataStaticPtr();
const std::string classRule(*PCLASS); const std::string classRule(*PCLASS);
const std::string titleRule(*PTITLE); const std::string titleRule(*PTITLE);
const bool classMatches = !classRule.empty() && pWindow->m_initialClass == classRule; const bool classMatches = !classRule.empty() && pWindow->m_initialClass == classRule;
const bool titleMatches = !titleRule.empty() && pWindow->m_title == titleRule; const bool titleMatches = !titleRule.empty() && pWindow->m_title == titleRule;
if (!classMatches && !titleMatches) if (!classMatches && !titleMatches)
return; return;
@ -59,10 +59,18 @@ void onNewWindow(PHLWINDOW pWindow) {
float sx = 100.f, sy = 100.f, px = 0.f, py = 0.f; float sx = 100.f, sy = 100.f, px = 0.f, py = 0.f;
try { sx = std::stof(*PSIZEX); } catch (...) {} try {
try { sy = std::stof(*PSIZEY); } catch (...) {} sx = std::stof(*PSIZEX);
try { px = std::stof(*PPOSX); } catch (...) {} } catch (...) {}
try { py = std::stof(*PPOSY); } catch (...) {} try {
sy = std::stof(*PSIZEY);
} catch (...) {}
try {
px = std::stof(*PPOSX);
} catch (...) {}
try {
py = std::stof(*PPOSY);
} catch (...) {}
sx = std::clamp(sx, 1.f, 100.f); sx = std::clamp(sx, 1.f, 100.f);
sy = std::clamp(sy, 1.f, 100.f); sy = std::clamp(sy, 1.f, 100.f);
@ -81,21 +89,15 @@ void onNewWindow(PHLWINDOW pWindow) {
const Vector2D monitorSize = PMONITOR->m_size; const Vector2D monitorSize = PMONITOR->m_size;
const Vector2D monitorPos = PMONITOR->m_position; const Vector2D monitorPos = PMONITOR->m_position;
const Vector2D newSize = { const Vector2D newSize = {static_cast<int>(monitorSize.x * (sx / 100.f)), static_cast<int>(monitorSize.y * (sy / 100.f))};
static_cast<int>(monitorSize.x * (sx / 100.f)),
static_cast<int>(monitorSize.y * (sy / 100.f))
};
const Vector2D newPos = { const Vector2D newPos = {static_cast<int>(monitorPos.x + (monitorSize.x * (px / 100.f))), static_cast<int>(monitorPos.y + (monitorSize.y * (py / 100.f)))};
static_cast<int>(monitorPos.x + (monitorSize.x * (px / 100.f))),
static_cast<int>(monitorPos.y + (monitorSize.y * (py / 100.f)))
};
pWindow->m_realSize->setValueAndWarp(newSize); pWindow->m_realSize->setValueAndWarp(newSize);
pWindow->m_realPosition->setValueAndWarp(newPos); pWindow->m_realPosition->setValueAndWarp(newPos);
pWindow->m_size = newSize; pWindow->m_size = newSize;
pWindow->m_position = newPos; pWindow->m_position = newPos;
pWindow->m_pinned = true; pWindow->m_pinned = true;
pWindow->sendWindowSize(true); pWindow->sendWindowSize(true);
bgWindows.push_back(pWindow); bgWindows.push_back(pWindow);
@ -168,14 +170,14 @@ void onCommit(void* owner, void* data) {
void onConfigReloaded() { void onConfigReloaded() {
static auto* const PCLASS = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:class")->getDataStaticPtr(); static auto* const PCLASS = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:class")->getDataStaticPtr();
const std::string classRule(*PCLASS); const std::string classRule(*PCLASS);
if (!classRule.empty()) { if (!classRule.empty()) {
g_pConfigManager->parseKeyword("windowrulev2", std::string{"float, class:^("} + classRule + ")$"); g_pConfigManager->parseKeyword("windowrulev2", std::string{"float, class:^("} + classRule + ")$");
g_pConfigManager->parseKeyword("windowrulev2", std::string{"size 100\% 100\%, class:^("} + classRule + ")$"); g_pConfigManager->parseKeyword("windowrulev2", std::string{"size 100\% 100\%, class:^("} + classRule + ")$");
} }
static auto* const PTITLE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:title")->getDataStaticPtr(); static auto* const PTITLE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprwinwrap:title")->getDataStaticPtr();
const std::string titleRule(*PTITLE); const std::string titleRule(*PTITLE);
if (!titleRule.empty()) { if (!titleRule.empty()) {
g_pConfigManager->parseKeyword("windowrulev2", std::string{"float, title:^("} + titleRule + ")$"); g_pConfigManager->parseKeyword("windowrulev2", std::string{"float, title:^("} + titleRule + ")$");
g_pConfigManager->parseKeyword("windowrulev2", std::string{"size 100\% 100\%, title:^("} + titleRule + ")$"); g_pConfigManager->parseKeyword("windowrulev2", std::string{"size 100\% 100\%, title:^("} + titleRule + ")$");
@ -185,9 +187,10 @@ void onConfigReloaded() {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[hww] Version mismatch"); throw std::runtime_error("[hww] Version mismatch");
@ -225,9 +228,9 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:size_x", Hyprlang::STRING{"100"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:size_x", Hyprlang::STRING{"100"});
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:size_y", Hyprlang::STRING{"100"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:size_y", Hyprlang::STRING{"100"});
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_x", Hyprlang::STRING{"0"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_x", Hyprlang::STRING{"0"});
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_y", Hyprlang::STRING{"0"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:pos_y", Hyprlang::STRING{"0"});
HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Initialized successfully!", CHyprColor{0.2, 1.0, 0.2, 1.0}, 5000); HyprlandAPI::addNotification(PHANDLE, "[hyprwinwrap] Initialized successfully!", CHyprColor{0.2, 1.0, 0.2, 1.0}, 5000);
return {"hyprwinwrap", "A clone of xwinwrap for Hyprland", "Vaxry", "1.0"}; return {"hyprwinwrap", "A clone of xwinwrap for Hyprland", "Vaxry", "1.0"};
@ -236,4 +239,3 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
APICALL EXPORT void PLUGIN_EXIT() { APICALL EXPORT void PLUGIN_EXIT() {
; ;
} }

View File

@ -116,9 +116,10 @@ static SDispatchResult closeUnfocused(std::string in) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle; PHANDLE = handle;
const std::string HASH = __hyprland_api_get_hash(); const std::string HASH = __hyprland_api_get_hash();
const std::string CLIENT_HASH = __hyprland_api_get_client_hash();
if (HASH != GIT_COMMIT_HASH) { if (HASH != CLIENT_HASH) {
HyprlandAPI::addNotification(PHANDLE, "[xtra-dispatchers] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", HyprlandAPI::addNotification(PHANDLE, "[xtra-dispatchers] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000); CHyprColor{1.0, 0.2, 0.2, 1.0}, 5000);
throw std::runtime_error("[xtd] Version mismatch"); throw std::runtime_error("[xtd] Version mismatch");