diff --git a/hyprwinwrap/README.md b/hyprwinwrap/README.md index 87ec752..1963d5d 100644 --- a/hyprwinwrap/README.md +++ b/hyprwinwrap/README.md @@ -10,6 +10,12 @@ plugin { class = kitty-bg # you can also use title title = kitty-bg + # you can add the position of the window in a percentage + pos_x = 25 + pos_y = 30 + # you can add the size of the window in a percentage + size_x = 40 + size_y = 70 } } diff --git a/hyprwinwrap/main.cpp b/hyprwinwrap/main.cpp index a6c1ba6..3f79b2c 100644 --- a/hyprwinwrap/main.cpp +++ b/hyprwinwrap/main.cpp @@ -19,7 +19,7 @@ #include "globals.hpp" -// Do NOT change this function. +// Do NOT change this function APICALL EXPORT std::string PLUGIN_API_VERSION() { return HYPRLAND_API_VERSION; } @@ -32,10 +32,14 @@ typedef void (*origCommit)(void* owner, void* data); std::vector bgWindows; -// void onNewWindow(PHLWINDOW pWindow) { - 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 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 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 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(); const std::string classRule(*PCLASS); const std::string titleRule(*PTITLE); @@ -47,26 +51,57 @@ void onNewWindow(PHLWINDOW pWindow) { return; const auto PMONITOR = pWindow->m_monitor.lock(); - if (!PMONITOR) return; if (!pWindow->m_isFloating) g_pLayoutManager->getCurrentLayout()->changeWindowFloatingMode(pWindow); - pWindow->m_realSize->setValueAndWarp(PMONITOR->m_size); - pWindow->m_realPosition->setValueAndWarp(PMONITOR->m_position); - pWindow->m_size = PMONITOR->m_size; - pWindow->m_position = PMONITOR->m_position; + float sx = 100.f, sy = 100.f, px = 0.f, py = 0.f; + + try { sx = std::stof(*PSIZEX); } 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); + sy = std::clamp(sy, 1.f, 100.f); + px = std::clamp(px, 0.f, 100.f); + py = std::clamp(py, 0.f, 100.f); + + if (px + sx > 100.f) { + Debug::log(WARN, "[hyprwinwrap] size_x (%d) + pos_x (%d) > 100, adjusting size_x to %d", sx, px, 100.f - px); + sx = 100.f - px; + } + if (py + sy > 100.f) { + Debug::log(WARN, "[hyprwinwrap] size_y (%d) + pos_y (%d) > 100, adjusting size_y to %d", sy, py, 100.f - py); + sy = 100.f - py; + } + + const Vector2D monitorSize = PMONITOR->m_size; + const Vector2D monitorPos = PMONITOR->m_position; + + const Vector2D newSize = { + static_cast(monitorSize.x * (sx / 100.f)), + static_cast(monitorSize.y * (sy / 100.f)) + }; + + const Vector2D newPos = { + static_cast(monitorPos.x + (monitorSize.x * (px / 100.f))), + static_cast(monitorPos.y + (monitorSize.y * (py / 100.f))) + }; + + pWindow->m_realSize->setValueAndWarp(newSize); + pWindow->m_realPosition->setValueAndWarp(newPos); + pWindow->m_size = newSize; + pWindow->m_position = newPos; pWindow->m_pinned = true; pWindow->sendWindowSize(true); bgWindows.push_back(pWindow); - - pWindow->m_hidden = true; // no renderino hyprland pls + pWindow->m_hidden = true; g_pInputManager->refocus(); - Debug::log(LOG, "[hyprwinwrap] new window moved to bg {}", pWindow); } @@ -187,6 +222,11 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:class", Hyprlang::STRING{"kitty-bg"}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprwinwrap:title", Hyprlang::STRING{""}); + + 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:pos_x", 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);