From 5ba33f846129f3e6c0505b19f94634b24505e828 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:16:36 +0100 Subject: config/lua: init lua config manager, use lua if available (#13817) Adds a new lua config manager, which will automatically be used if there is a lua config present. --- src/desktop/view/Window.cpp | 136 +++++++++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 65 deletions(-) (limited to 'src/desktop/view/Window.cpp') diff --git a/src/desktop/view/Window.cpp b/src/desktop/view/Window.cpp index 6da62b34..70ef2aae 100644 --- a/src/desktop/view/Window.cpp +++ b/src/desktop/view/Window.cpp @@ -25,6 +25,7 @@ #include "../../render/decorations/CHyprGroupBarDecoration.hpp" #include "../../render/decorations/CHyprBorderDecoration.hpp" #include "../../config/ConfigValue.hpp" +#include "../../config/shared/actions/ConfigActions.hpp" #include "../../config/ConfigManager.hpp" #include "../../config/shared/animation/AnimationTree.hpp" #include "../../config/shared/workspace/WorkspaceRuleManager.hpp" @@ -470,7 +471,7 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) { if (m_workspace == pWorkspace) return; - static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); + static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); if (!m_initialWorkspaceToken.empty()) { const auto TOKEN = g_pTokenManager->getToken(m_initialWorkspaceToken); @@ -488,7 +489,7 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) { } } - static auto PCLOSEONLASTSPECIAL = CConfigValue("misc:close_special_on_empty"); + static auto PCLOSEONLASTSPECIAL = CConfigValue("misc:close_special_on_empty"); const auto OLDWORKSPACE = m_workspace; @@ -553,8 +554,8 @@ PHLWINDOW CWindow::x11TransientFor() { } void CWindow::onUnmap() { - static auto PCLOSEONLASTSPECIAL = CConfigValue("misc:close_special_on_empty"); - static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); + static auto PCLOSEONLASTSPECIAL = CConfigValue("misc:close_special_on_empty"); + static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); if (!m_initialWorkspaceToken.empty()) { const auto TOKEN = g_pTokenManager->getToken(m_initialWorkspaceToken); @@ -785,8 +786,8 @@ bool CWindow::opaque() { } float CWindow::rounding() { - static auto PROUNDING = CConfigValue("decoration:rounding"); - static auto PROUNDINGPOWER = CConfigValue("decoration:rounding_power"); + static auto PROUNDING = CConfigValue("decoration:rounding"); + static auto PROUNDINGPOWER = CConfigValue("decoration:rounding_power"); float roundingPower = m_ruleApplicator->roundingPower().valueOr(*PROUNDINGPOWER); float rounding = m_ruleApplicator->rounding().valueOr(*PROUNDING) * (roundingPower / 2.0); /* Make perceived roundness consistent. */ @@ -795,7 +796,7 @@ float CWindow::rounding() { } float CWindow::roundingPower() { - static auto PROUNDINGPOWER = CConfigValue("decoration:rounding_power"); + static auto PROUNDINGPOWER = CConfigValue("decoration:rounding_power"); return m_ruleApplicator->roundingPower().valueOr(std::clamp(*PROUNDINGPOWER, 1.F, 10.F)); } @@ -808,13 +809,13 @@ void CWindow::updateWindowData() { void CWindow::updateWindowData(const Config::CWorkspaceRule& workspaceRule) { if (workspaceRule.m_noBorder.value_or(false)) - m_ruleApplicator->borderSize().matchOptional(std::optional(0), Desktop::Types::PRIORITY_WORKSPACE_RULE); + m_ruleApplicator->borderSize().matchOptional(std::optional(0), Desktop::Types::PRIORITY_WORKSPACE_RULE); else if (workspaceRule.m_borderSize) m_ruleApplicator->borderSize().matchOptional(workspaceRule.m_borderSize, Desktop::Types::PRIORITY_WORKSPACE_RULE); else m_ruleApplicator->borderSize().matchOptional(std::nullopt, Desktop::Types::PRIORITY_WORKSPACE_RULE); m_ruleApplicator->decorate().matchOptional(workspaceRule.m_decorate, Desktop::Types::PRIORITY_WORKSPACE_RULE); - m_ruleApplicator->rounding().matchOptional(workspaceRule.m_noRounding.value_or(false) ? std::optional(0) : std::nullopt, + m_ruleApplicator->rounding().matchOptional(workspaceRule.m_noRounding.value_or(false) ? std::optional(0) : std::nullopt, Desktop::Types::PRIORITY_WORKSPACE_RULE); m_ruleApplicator->noShadow().matchOptional(workspaceRule.m_noShadow, Desktop::Types::PRIORITY_WORKSPACE_RULE); @@ -831,7 +832,7 @@ int CWindow::getRealBorderSize() const { return 0; } - static auto PBORDERSIZE = CConfigValue("general:border_size"); + static auto PBORDERSIZE = CConfigValue("general:border_size"); m_cachedBorderSize = m_ruleApplicator->borderSize().valueOr(*PBORDERSIZE); m_borderSizeCacheDirty = false; @@ -839,12 +840,12 @@ int CWindow::getRealBorderSize() const { } float CWindow::getScrollMouse() { - static auto PINPUTSCROLLFACTOR = CConfigValue("input:scroll_factor"); + static auto PINPUTSCROLLFACTOR = CConfigValue("input:scroll_factor"); return m_ruleApplicator->scrollMouse().valueOr(*PINPUTSCROLLFACTOR); } float CWindow::getScrollTouchpad() { - static auto PTOUCHPADSCROLLFACTOR = CConfigValue("input:touchpad:scroll_factor"); + static auto PTOUCHPADSCROLLFACTOR = CConfigValue("input:touchpad:scroll_factor"); return m_ruleApplicator->scrollTouchpad().valueOr(*PTOUCHPADSCROLLFACTOR); } @@ -857,7 +858,7 @@ bool CWindow::isScrollTouchpadOverridden() { } bool CWindow::canBeTorn() { - static auto PTEARING = CConfigValue("general:allow_tearing"); + static auto PTEARING = CConfigValue("general:allow_tearing"); return m_ruleApplicator->tearing().valueOr(m_tearingHint) && *PTEARING; } @@ -1009,7 +1010,7 @@ std::unordered_map CWindow::getEnv() { needle += 512; } #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) - int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ENV, static_cast(PID)}; + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ENV, sc(PID)}; size_t len = 0; if (sysctl(mib, 4, nullptr, &len, nullptr, 0) < 0 || len == 0) @@ -1045,7 +1046,7 @@ void CWindow::activate(bool force) { if (Desktop::focusState()->window() == m_self) return; - static auto PFOCUSONACTIVATE = CConfigValue("misc:focus_on_activate"); + static auto PFOCUSONACTIVATE = CConfigValue("misc:focus_on_activate"); m_isUrgent = true; @@ -1270,7 +1271,7 @@ void CWindow::onX11ConfigureRequest(CBox box) { } void CWindow::warpCursor(bool force) { - static auto PERSISTENTWARPS = CConfigValue("cursor:persistent_warps"); + static auto PERSISTENTWARPS = CConfigValue("cursor:persistent_warps"); const auto coords = m_relativeCursorCoordsOnLastWarp; m_relativeCursorCoordsOnLastWarp.x = -1; // reset m_vRelativeCursorCoordsOnLastWarp @@ -1283,7 +1284,7 @@ void CWindow::warpCursor(bool force) { PHLWINDOW CWindow::getSwallower() { static auto PSWALLOWREGEX = CConfigValue("misc:swallow_regex"); static auto PSWALLOWEXREGEX = CConfigValue("misc:swallow_exception_regex"); - static auto PSWALLOW = CConfigValue("misc:enable_swallow"); + static auto PSWALLOW = CConfigValue("misc:enable_swallow"); if (!*PSWALLOW || std::string{*PSWALLOWREGEX} == STRVAL_EMPTY || (*PSWALLOWREGEX).empty()) return nullptr; @@ -1347,7 +1348,7 @@ Vector2D CWindow::realToReportSize() { if (!m_isX11) return m_realSize->goal().clamp(Vector2D{0, 0}, Math::VECTOR2D_MAX); - static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); const auto REPORTSIZE = m_realSize->goal().clamp(Vector2D{1, 1}, Math::VECTOR2D_MAX); const auto PMONITOR = m_monitor.lock(); @@ -1367,7 +1368,7 @@ Vector2D CWindow::realToReportPosition() { } Vector2D CWindow::xwaylandSizeToReal(Vector2D size) { - static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); const auto PMONITOR = m_monitor.lock(); const auto SIZE = size.clamp(Vector2D{1, 1}, Math::VECTOR2D_MAX); @@ -1381,7 +1382,7 @@ Vector2D CWindow::xwaylandPositionToReal(Vector2D pos) { } void CWindow::updateX11SurfaceScale() { - static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); m_X11SurfaceScaledBy = 1.0f; if (m_isX11 && *PXWLFORCESCALEZERO) { @@ -1530,34 +1531,34 @@ Vector2D CWindow::getReportedSize() { void CWindow::updateDecorationValues() { m_borderSizeCacheDirty = true; - static auto PACTIVECOL = CConfigValue("general:col.active_border"); - static auto PINACTIVECOL = CConfigValue("general:col.inactive_border"); - static auto PNOGROUPACTIVECOL = CConfigValue("general:col.nogroup_border_active"); - static auto PNOGROUPINACTIVECOL = CConfigValue("general:col.nogroup_border"); - static auto PGROUPACTIVECOL = CConfigValue("group:col.border_active"); - static auto PGROUPINACTIVECOL = CConfigValue("group:col.border_inactive"); - static auto PGROUPACTIVELOCKEDCOL = CConfigValue("group:col.border_locked_active"); - static auto PGROUPINACTIVELOCKEDCOL = CConfigValue("group:col.border_locked_inactive"); - static auto PINACTIVEALPHA = CConfigValue("decoration:inactive_opacity"); - static auto PACTIVEALPHA = CConfigValue("decoration:active_opacity"); - static auto PFULLSCREENALPHA = CConfigValue("decoration:fullscreen_opacity"); - static auto PSHADOWCOL = CConfigValue("decoration:shadow:color"); - static auto PSHADOWCOLINACTIVE = CConfigValue("decoration:shadow:color_inactive"); - static auto PGLOW = CConfigValue("decoration:glow:enabled"); - static auto PGLOWCOL = CConfigValue("decoration:glow:color"); - static auto PGLOWCOLINACTIVE = CConfigValue("decoration:glow:color_inactive"); - static auto PDIMSTRENGTH = CConfigValue("decoration:dim_strength"); - static auto PDIMENABLED = CConfigValue("decoration:dim_inactive"); - static auto PDIMMODAL = CConfigValue("decoration:dim_modal"); - - auto* const ACTIVECOL = sc((PACTIVECOL.ptr())->getData()); - auto* const INACTIVECOL = sc((PINACTIVECOL.ptr())->getData()); - auto* const NOGROUPACTIVECOL = sc((PNOGROUPACTIVECOL.ptr())->getData()); - auto* const NOGROUPINACTIVECOL = sc((PNOGROUPINACTIVECOL.ptr())->getData()); - auto* const GROUPACTIVECOL = sc((PGROUPACTIVECOL.ptr())->getData()); - auto* const GROUPINACTIVECOL = sc((PGROUPINACTIVECOL.ptr())->getData()); - auto* const GROUPACTIVELOCKEDCOL = sc((PGROUPACTIVELOCKEDCOL.ptr())->getData()); - auto* const GROUPINACTIVELOCKEDCOL = sc((PGROUPINACTIVELOCKEDCOL.ptr())->getData()); + static auto PACTIVECOL = CConfigValue("general:col.active_border"); + static auto PINACTIVECOL = CConfigValue("general:col.inactive_border"); + static auto PNOGROUPACTIVECOL = CConfigValue("general:col.nogroup_border_active"); + static auto PNOGROUPINACTIVECOL = CConfigValue("general:col.nogroup_border"); + static auto PGROUPACTIVECOL = CConfigValue("group:col.border_active"); + static auto PGROUPINACTIVECOL = CConfigValue("group:col.border_inactive"); + static auto PGROUPACTIVELOCKEDCOL = CConfigValue("group:col.border_locked_active"); + static auto PGROUPINACTIVELOCKEDCOL = CConfigValue("group:col.border_locked_inactive"); + static auto PINACTIVEALPHA = CConfigValue("decoration:inactive_opacity"); + static auto PACTIVEALPHA = CConfigValue("decoration:active_opacity"); + static auto PFULLSCREENALPHA = CConfigValue("decoration:fullscreen_opacity"); + static auto PSHADOWCOL = CConfigValue("decoration:shadow:color"); + static auto PSHADOWCOLINACTIVE = CConfigValue("decoration:shadow:color_inactive"); + static auto PGLOW = CConfigValue("decoration:glow:enabled"); + static auto PGLOWCOL = CConfigValue("decoration:glow:color"); + static auto PGLOWCOLINACTIVE = CConfigValue("decoration:glow:color_inactive"); + static auto PDIMSTRENGTH = CConfigValue("decoration:dim_strength"); + static auto PDIMENABLED = CConfigValue("decoration:dim_inactive"); + static auto PDIMMODAL = CConfigValue("decoration:dim_modal"); + + auto* const ACTIVECOL = sc((PACTIVECOL.ptr())); + auto* const INACTIVECOL = sc((PINACTIVECOL.ptr())); + auto* const NOGROUPACTIVECOL = sc((PNOGROUPACTIVECOL.ptr())); + auto* const NOGROUPINACTIVECOL = sc((PNOGROUPINACTIVECOL.ptr())); + auto* const GROUPACTIVECOL = sc((PGROUPACTIVECOL.ptr())); + auto* const GROUPINACTIVECOL = sc((PGROUPINACTIVECOL.ptr())); + auto* const GROUPACTIVELOCKEDCOL = sc((PGROUPACTIVELOCKEDCOL.ptr())); + auto* const GROUPINACTIVELOCKEDCOL = sc((PGROUPINACTIVELOCKEDCOL.ptr())); auto setBorderColor = [&](Config::CGradientValueData grad) -> void { if (grad == m_realBorderColor) @@ -1666,12 +1667,12 @@ static void setVector2DAnimToMove(WP pav) { } void CWindow::mapWindow() { - static auto PINACTIVEALPHA = CConfigValue("decoration:inactive_opacity"); - static auto PACTIVEALPHA = CConfigValue("decoration:active_opacity"); - static auto PDIMSTRENGTH = CConfigValue("decoration:dim_strength"); - static auto PNEWTAKESOVERFS = CConfigValue("misc:on_focus_under_fullscreen"); - static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); - static auto PAUTOGROUP = CConfigValue("group:auto_group"); + static auto PINACTIVEALPHA = CConfigValue("decoration:inactive_opacity"); + static auto PACTIVEALPHA = CConfigValue("decoration:active_opacity"); + static auto PDIMSTRENGTH = CConfigValue("decoration:dim_strength"); + static auto PNEWTAKESOVERFS = CConfigValue("misc:on_focus_under_fullscreen"); + static auto PINITIALWSTRACKING = CConfigValue("misc:initial_workspace_tracking"); + static auto PAUTOGROUP = CConfigValue("group:auto_group"); const auto LAST_FOCUS_WINDOW = Desktop::focusState()->window(); const bool IS_LAST_IN_FS = LAST_FOCUS_WINDOW ? LAST_FOCUS_WINDOW->m_fullscreenState.internal != FSMODE_NONE : false; @@ -1764,8 +1765,8 @@ void CWindow::mapWindow() { const auto PMONITORFROMID = m_monitor.lock(); - if (m_monitor != PMONITOR) { - g_pKeybindManager->m_dispatchers["focusmonitor"](std::to_string(monitorID())); + if (m_monitor != PMONITOR) { // NOLINTNEXTLINE + Config::Actions::focusMonitor(PMONITORFROMID); PMONITOR = PMONITORFROMID; } m_workspace = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace; @@ -1930,8 +1931,8 @@ void CWindow::mapWindow() { if (!workspaceSilent) { if (pWorkspace->m_isSpecialWorkspace) pWorkspace->m_monitor->setSpecialWorkspace(pWorkspace); - else if (PMONITOR->activeWorkspaceID() != requestedWorkspaceID && !m_noInitialFocus) - g_pKeybindManager->m_dispatchers["workspace"](requestedWorkspaceName); + else if (PMONITOR->activeWorkspaceID() != requestedWorkspaceID && !m_noInitialFocus) // NOLINTNEXTLINE + Config::Actions::changeWorkspace(requestedWorkspaceName); PMONITOR = Desktop::focusState()->monitor(); } @@ -1949,8 +1950,8 @@ void CWindow::mapWindow() { const auto PMONITORFROMID = m_monitor.lock(); - if (m_monitor != PMONITOR) { - g_pKeybindManager->m_dispatchers["focusmonitor"](std::to_string(monitorID())); + if (m_monitor != PMONITOR) { // NOLINTNEXTLINE + Config::Actions::focusMonitor(PMONITORFROMID); PMONITOR = PMONITORFROMID; } m_workspace = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace; @@ -2145,7 +2146,7 @@ void CWindow::mapWindow() { m_workspace->updateWindows(); if (PMONITOR && isX11OverrideRedirect()) { - static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); if (*PXWLFORCESCALEZERO) m_X11SurfaceScaledBy = PMONITOR->m_scale; } @@ -2154,7 +2155,7 @@ void CWindow::mapWindow() { void CWindow::unmapWindow() { Log::logger->log(Log::DEBUG, "{:c} unmapped", m_self.lock()); - static auto PEXITRETAINSFS = CConfigValue("misc:exit_window_retains_fullscreen"); + static auto PEXITRETAINSFS = CConfigValue("misc:exit_window_retains_fullscreen"); const auto CURRENTWINDOWFSSTATE = isFullscreen(); const auto CURRENTFSMODE = m_fullscreenState.internal; @@ -2252,7 +2253,7 @@ void CWindow::unmapWindow() { // refocus on a new window if needed if (wasLastWindow) { - static auto FOCUSONCLOSE = CConfigValue("input:focus_on_close"); + static auto FOCUSONCLOSE = CConfigValue("input:focus_on_close"); PHLWINDOW candidate = nextInGroup; if (!candidate) { @@ -2445,7 +2446,7 @@ void CWindow::unmanagedSetGeometry() { return; } - static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); const auto PMONITOR = m_monitor.lock(); const auto LOGICALPOS = g_pXWaylandManager->xwaylandToWaylandCoords(m_xwaylandSurface->m_geometry.pos(), PMONITOR); @@ -2526,7 +2527,7 @@ bool CWindow::canBeGroupedInto(SP group) { if (isX11OverrideRedirect()) return false; - static auto ALLOWGROUPMERGE = CConfigValue("group:merge_groups_on_drag"); + static auto ALLOWGROUPMERGE = CConfigValue("group:merge_groups_on_drag"); bool isGroup = m_group; bool disallowDragIntoGroup = g_layoutManager->dragController()->wasDraggingWindow() && isGroup && !sc(*ALLOWGROUPMERGE); return !g_pKeybindManager->m_groupsLocked // global group lock disengaged @@ -2537,3 +2538,8 @@ bool CWindow::canBeGroupedInto(SP group) { && !(m_groupRules & GROUP_BARRED && m_firstMap) // group rule doesn't prevent adding window && !disallowDragIntoGroup; // config allows groups to be merged } + +void CWindow::sendClose() { + if (m_isMapped) + g_pXWaylandManager->sendCloseWindow(m_self.lock()); +} -- cgit v1.2.3