Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package hyprland-plugins for 
openSUSE:Factory checked in at 2026-01-06 17:45:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hyprland-plugins (Old)
 and      /work/SRC/openSUSE:Factory/.hyprland-plugins.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hyprland-plugins"

Tue Jan  6 17:45:13 2026 rev:7 rq:1325488 version:0.53.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/hyprland-plugins/hyprland-plugins.changes        
2025-12-05 16:58:00.127830989 +0100
+++ 
/work/SRC/openSUSE:Factory/.hyprland-plugins.new.1928/hyprland-plugins.changes  
    2026-01-06 17:46:45.935010527 +0100
@@ -1,0 +2,7 @@
+Mon Dec 29 21:35:52 UTC 2025 - Florian "sp1rit" <[email protected]>
+
+- Update to version 0.53.0:
+  + The plugins were updated to use the plugin interface in use by
+    hyprland 0.53.0.
+
+-------------------------------------------------------------------

Old:
----
  hyprland-plugins-0.52.0.tar.gz

New:
----
  hyprland-plugins-0.53.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ hyprland-plugins.spec ++++++
--- /var/tmp/diff_new_pack.UGcwwC/_old  2026-01-06 17:46:46.635039325 +0100
+++ /var/tmp/diff_new_pack.UGcwwC/_new  2026-01-06 17:46:46.643039655 +0100
@@ -15,8 +15,8 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
-%define hypr_tgt 0.52.0
-%define pkg_version 0.52.0
+%define hypr_tgt 0.53.0
+%define pkg_version 0.53.0
 
 Name:           hyprland-plugins
 Version:        %{pkg_version}

++++++ hyprland-plugins-0.52.0.tar.gz -> hyprland-plugins-0.53.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/.gitignore 
new/hyprland-plugins-0.53.0/.gitignore
--- old/hyprland-plugins-0.52.0/.gitignore      2025-11-02 21:31:25.000000000 
+0100
+++ new/hyprland-plugins-0.53.0/.gitignore      2025-12-29 16:03:28.000000000 
+0100
@@ -37,3 +37,6 @@
 # Nix
 result
 result-man
+
+build/
+.cache/
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/CMakeLists.txt 
new/hyprland-plugins-0.53.0/CMakeLists.txt
--- old/hyprland-plugins-0.52.0/CMakeLists.txt  2025-11-02 21:31:25.000000000 
+0100
+++ new/hyprland-plugins-0.53.0/CMakeLists.txt  2025-12-29 16:03:28.000000000 
+0100
@@ -1,6 +1,5 @@
 cmake_minimum_required(VERSION 3.27)
 project(hyprland-plugins
-    VERSION 0.51.0
     DESCRIPTION "Official plugins for Hyprland"
     LANGUAGES CXX
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hyprland-plugins-0.52.0/borders-plus-plus/borderDeco.cpp 
new/hyprland-plugins-0.53.0/borders-plus-plus/borderDeco.cpp
--- old/hyprland-plugins-0.52.0/borders-plus-plus/borderDeco.cpp        
2025-11-02 21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/borders-plus-plus/borderDeco.cpp        
2025-12-29 16:03:28.000000000 +0100
@@ -1,7 +1,7 @@
 #include "borderDeco.hpp"
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprutils/memory/Casts.hpp>
 using namespace Hyprutils::Memory;
@@ -68,7 +68,7 @@
 
     const auto PWINDOW = m_pWindow.lock();
 
-    if (!PWINDOW->m_windowData.decorate.valueOrDefault())
+    if (!PWINDOW->m_ruleApplicator->decorate().valueOrDefault())
         return;
 
     CBorderPPPassElement::SBorderPPData data;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/borders-plus-plus/main.cpp 
new/hyprland-plugins-0.53.0/borders-plus-plus/main.cpp
--- old/hyprland-plugins-0.52.0/borders-plus-plus/main.cpp      2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/borders-plus-plus/main.cpp      2025-12-29 
16:03:28.000000000 +0100
@@ -4,7 +4,7 @@
 
 #include <any>
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/csgo-vulkan-fix/main.cpp 
new/hyprland-plugins-0.53.0/csgo-vulkan-fix/main.cpp
--- old/hyprland-plugins-0.52.0/csgo-vulkan-fix/main.cpp        2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/csgo-vulkan-fix/main.cpp        2025-12-29 
16:03:28.000000000 +0100
@@ -3,7 +3,8 @@
 #include <unistd.h>
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/xwayland/XSurface.hpp>
 #include <hyprland/src/managers/SeatManager.hpp>
@@ -20,7 +21,7 @@
 inline CFunctionHook* g_pWLSurfaceDamageHook = nullptr;
 typedef void (*origMotion)(CSeatManager*, uint32_t, const Vector2D&);
 typedef void (*origSurfaceSize)(CXWaylandSurface*, const CBox&);
-typedef CRegion (*origWLSurfaceDamage)(CWLSurface*);
+typedef CRegion (*origWLSurfaceDamage)(Desktop::View::CWLSurface*);
 
 // Do NOT change this function.
 APICALL EXPORT std::string PLUGIN_API_VERSION() {
@@ -46,14 +47,17 @@
 void hkNotifyMotion(CSeatManager* thisptr, uint32_t time_msec, const Vector2D& 
local) {
     static auto* const PFIX = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:csgo-vulkan-fix:fix_mouse")->getDataStaticPtr();
 
-    Vector2D           newCoords = local;
+    Vector2D newCoords = local;
+    auto focusState = Desktop::focusState();
+    auto window = focusState->window();
+    auto monitor = focusState->monitor();
 
-    const auto         CONFIG = g_pCompositor->m_lastWindow && 
g_pCompositor->m_lastMonitor ? 
getAppConfig(g_pCompositor->m_lastWindow->m_initialClass) : nullptr;
+    const auto CONFIG = window && monitor ? 
getAppConfig(window->m_initialClass) : nullptr;
 
     if (**PFIX && CONFIG) {
         // fix the coords
-        newCoords.x *= (CONFIG->res.x / 
g_pCompositor->m_lastMonitor->m_size.x) / 
g_pCompositor->m_lastWindow->m_X11SurfaceScaledBy;
-        newCoords.y *= (CONFIG->res.y / 
g_pCompositor->m_lastMonitor->m_size.y) / 
g_pCompositor->m_lastWindow->m_X11SurfaceScaledBy;
+        newCoords.x *= (CONFIG->res.x / monitor->m_size.x) / 
window->m_X11SurfaceScaledBy;
+        newCoords.y *= (CONFIG->res.y / monitor->m_size.y) / 
window->m_X11SurfaceScaledBy;
     }
 
     (*(origMotion)g_pMouseMotionHook->m_original)(thisptr, time_msec, 
newCoords);
@@ -79,24 +83,25 @@
         newBox.w = CONFIG->res.x;
         newBox.h = CONFIG->res.y;
 
-        CWLSurface::fromResource(SURF)->m_fillIgnoreSmall = true;
+        Desktop::View::CWLSurface::fromResource(SURF)->m_fillIgnoreSmall = 
true;
     }
 
     (*(origSurfaceSize)g_pSurfaceSizeHook->m_original)(surface, newBox);
 }
 
-CRegion hkWLSurfaceDamage(CWLSurface* thisptr) {
+CRegion hkWLSurfaceDamage(Desktop::View::CWLSurface* thisptr) {
     const auto RG = 
(*(origWLSurfaceDamage)g_pWLSurfaceDamageHook->m_original)(thisptr);
 
-    if (thisptr->exists() && thisptr->getWindow()) {
-        const auto CONFIG = getAppConfig(thisptr->getWindow()->m_initialClass);
+    if (thisptr->exists() && 
Desktop::View::CWindow::fromView(thisptr->view())) {
+        const auto WINDOW = Desktop::View::CWindow::fromView(thisptr->view());
+        const auto CONFIG = getAppConfig(WINDOW->m_initialClass);
 
         if (CONFIG) {
-            const auto PMONITOR = thisptr->getWindow()->m_monitor.lock();
+            const auto PMONITOR = WINDOW->m_monitor.lock();
             if (PMONITOR)
                 g_pHyprRenderer->damageMonitor(PMONITOR);
             else
-                g_pHyprRenderer->damageWindow(thisptr->getWindow());
+                g_pHyprRenderer->damageWindow(WINDOW);
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprbars/README.md 
new/hyprland-plugins-0.53.0/hyprbars/README.md
--- old/hyprland-plugins-0.52.0/hyprbars/README.md      2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprbars/README.md      2025-12-29 
16:03:28.000000000 +0100
@@ -53,13 +53,15 @@
 hyprbars-button = bgcolor, size, icon, on-click, fgcolor
 ```
 
+Please note it _has_ to be inside `plugin { hyprbars { } }`.
+
 ## Window rules
 
 Hyprbars supports the following _dynamic_ [window 
rules](https://wiki.hypr.land/Configuring/Window-Rules/):
 
-`plugin:hyprbars:nobar` -> disables the bar on matching windows.  
-`plugin:hyprbars:bar_color` -> sets the bar background color on matching 
windows.  
-`plugin:hyprbars:title_color` -> sets the bar title color on matching windows. 
 
+`hyprbars:no_bar` -> disables the bar on matching windows.  
+`hyprbars:bar_color` -> sets the bar background color on matching windows.  
+`hyprbars:title_color` -> sets the bar title color on matching windows.  
 
 Example:
 ```bash
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprbars/barDeco.cpp 
new/hyprland-plugins-0.53.0/hyprbars/barDeco.cpp
--- old/hyprland-plugins-0.52.0/hyprbars/barDeco.cpp    2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprbars/barDeco.cpp    2025-12-29 
16:03:28.000000000 +0100
@@ -1,7 +1,8 @@
 #include "barDeco.hpp"
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/helpers/MiscFunctions.hpp>
 #include <hyprland/src/managers/SeatManager.hpp>
 #include <hyprland/src/managers/input/InputManager.hpp>
@@ -85,16 +86,20 @@
         return false;
 
     if (!m_pWindow->m_workspace || !m_pWindow->m_workspace->isVisible() || 
!g_pInputManager->m_exclusiveLSes.empty() ||
-        (g_pSeatManager->m_seatGrab && 
!g_pSeatManager->m_seatGrab->accepts(m_pWindow->m_wlSurface->resource())))
+        (g_pSeatManager->m_seatGrab && 
!g_pSeatManager->m_seatGrab->accepts(m_pWindow->wlSurface()->resource())))
         return false;
 
-    const auto WINDOWATCURSOR = 
g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), 
RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
+    const auto WINDOWATCURSOR = 
g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), 
Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS | 
Desktop::View::ALLOW_FLOATING);
 
-    if (WINDOWATCURSOR != m_pWindow && m_pWindow != 
g_pCompositor->m_lastWindow)
+    auto focusState = Desktop::focusState();
+    auto window = focusState->window();
+    auto monitor = focusState->monitor();
+    
+    if (WINDOWATCURSOR != m_pWindow && m_pWindow != window)
         return false;
 
     // check if input is on top or overlay shell layers
-    auto     PMONITOR     = g_pCompositor->m_lastMonitor.lock();
+    auto     PMONITOR     = monitor;
     PHLLS    foundSurface = nullptr;
     Vector2D surfaceCoords;
 
@@ -158,7 +163,7 @@
         return;
 
     auto PMONITOR     = m_pWindow->m_monitor.lock();
-    PMONITOR          = PMONITOR ? PMONITOR : 
g_pCompositor->m_lastMonitor.lock();
+    PMONITOR          = PMONITOR ? PMONITOR : Desktop::focusState()->monitor();
     const auto COORDS = Vector2D(PMONITOR->m_position.x + e.pos.x * 
PMONITOR->m_size.x, PMONITOR->m_position.y + e.pos.y * PMONITOR->m_size.y);
 
     if (!m_bDraggingThis) {
@@ -183,7 +188,7 @@
     if (m_bTouchEv) {
         ITouch::SDownEvent e        = touchEvent.value();
         auto               PMONITOR = 
g_pCompositor->getMonitorFromName(!e.device->m_boundOutput.empty() ? 
e.device->m_boundOutput : "");
-        PMONITOR                    = PMONITOR ? PMONITOR : 
g_pCompositor->m_lastMonitor.lock();
+        PMONITOR                    = PMONITOR ? PMONITOR : 
Desktop::focusState()->monitor();
         COORDS = Vector2D(PMONITOR->m_position.x + e.pos.x * 
PMONITOR->m_size.x, PMONITOR->m_position.y + e.pos.y * PMONITOR->m_size.y) - 
assignedBoxGlobal().pos();
     }
 
@@ -202,7 +207,7 @@
             if (m_bTouchEv)
                 g_pKeybindManager->m_dispatchers["settiled"]("activewindow");
             g_pKeybindManager->m_dispatchers["mouse"]("0movewindow");
-            Debug::log(LOG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)PWINDOW.get());
+            Log::logger->log(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)PWINDOW.get());
         }
 
         m_bDraggingThis = false;
@@ -211,8 +216,8 @@
         return;
     }
 
-    if (g_pCompositor->m_lastWindow.lock() != PWINDOW)
-        g_pCompositor->focusWindow(PWINDOW);
+    if (Desktop::focusState()->window() != PWINDOW)
+        Desktop::focusState()->fullWindowFocus(PWINDOW);
 
     if (PWINDOW->m_isFloating)
         g_pCompositor->changeWindowZOrder(PWINDOW, true);
@@ -234,7 +239,7 @@
 }
 
 void CHyprBar::handleUpEvent(SCallbackInfo& info) {
-    if (m_pWindow.lock() != g_pCompositor->m_lastWindow.lock())
+    if (m_pWindow.lock() != Desktop::focusState()->window())
         return;
 
     if (m_bCancelledDown)
@@ -248,7 +253,7 @@
         if (m_bTouchEv)
             g_pKeybindManager->m_dispatchers["settiled"]("activewindow");
 
-        Debug::log(LOG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)m_pWindow.lock().get());
+        Log::logger->log(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)m_pWindow.lock().get());
     }
 
     m_bDragPending = false;
@@ -259,7 +264,7 @@
 void CHyprBar::handleMovement() {
     g_pKeybindManager->m_dispatchers["mouse"]("1movewindow");
     m_bDraggingThis = true;
-    Debug::log(LOG, "[hyprbars] Dragging initiated on {:x}", 
(uintptr_t)m_pWindow.lock().get());
+    Log::logger->log(Log::DEBUG, "[hyprbars] Dragging initiated on {:x}", 
(uintptr_t)m_pWindow.lock().get());
     return;
 }
 
@@ -573,7 +578,7 @@
 
     const auto PWINDOW = m_pWindow.lock();
 
-    if (!PWINDOW->m_windowData.decorate.valueOrDefault())
+    if (!PWINDOW->m_ruleApplicator->decorate().valueOrDefault())
         return;
 
     auto data = CBarPassElement::SBarData{this, a};
@@ -593,7 +598,7 @@
     static auto* const PINACTIVECOLOR    = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:hyprbars:inactive_button_color")->getDataStaticPtr();
 
     if (**PINACTIVECOLOR > 0) {
-        bool currentWindowFocus = PWINDOW == 
g_pCompositor->m_lastWindow.lock();
+        bool currentWindowFocus = PWINDOW == Desktop::focusState()->window();
         if (currentWindowFocus != m_bWindowHasFocus) {
             m_bWindowHasFocus = currentWindowFocus;
             m_bButtonsDirty   = true;
@@ -754,7 +759,6 @@
 
 void CHyprBar::updateRules() {
     const auto PWINDOW              = m_pWindow.lock();
-    auto       rules                = PWINDOW->m_matchedRules;
     auto       prevHidden           = m_hidden;
     auto       prevForcedTitleColor = m_bForcedTitleColor;
 
@@ -762,9 +766,12 @@
     m_bForcedTitleColor = std::nullopt;
     m_hidden            = false;
 
-    for (auto& r : rules) {
-        applyRule(r);
-    }
+    if 
(PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->nobarRuleIdx))
+        m_hidden = 
truthy(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->nobarRuleIdx)->effect);
+    if 
(PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->barColorRuleIdx))
+        m_bForcedBarColor = 
CHyprColor(configStringToInt(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->barColorRuleIdx)->effect).value_or(0));
+    if 
(PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->titleColorRuleIdx))
+        m_bForcedTitleColor = 
CHyprColor(configStringToInt(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->titleColorRuleIdx)->effect).value_or(0));
 
     if (prevHidden != m_hidden)
         g_pDecorationPositioner->repositionDeco(this);
@@ -772,17 +779,6 @@
         m_bTitleColorChanged = true;
 }
 
-void CHyprBar::applyRule(const SP<CWindowRule>& r) {
-    auto arg = r->m_rule.substr(r->m_rule.find_first_of(' ') + 1);
-
-    if (r->m_rule == "plugin:hyprbars:nobar")
-        m_hidden = true;
-    else if (r->m_rule.starts_with("plugin:hyprbars:bar_color"))
-        m_bForcedBarColor = CHyprColor(configStringToInt(arg).value_or(0));
-    else if (r->m_rule.starts_with("plugin:hyprbars:title_color"))
-        m_bForcedTitleColor = CHyprColor(configStringToInt(arg).value_or(0));
-}
-
 void CHyprBar::damageOnButtonHover() {
     static auto* const PBARPADDING       = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:hyprbars:bar_padding")->getDataStaticPtr();
     static auto* const PBARBUTTONPADDING = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:hyprbars:bar_button_padding")->getDataStaticPtr();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprbars/barDeco.hpp 
new/hyprland-plugins-0.53.0/hyprbars/barDeco.hpp
--- old/hyprland-plugins-0.52.0/hyprbars/barDeco.hpp    2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprbars/barDeco.hpp    2025-12-29 
16:03:28.000000000 +0100
@@ -6,7 +6,7 @@
 #include <hyprland/src/render/OpenGL.hpp>
 #include <hyprland/src/devices/IPointer.hpp>
 #include <hyprland/src/devices/ITouch.hpp>
-#include <hyprland/src/desktop/WindowRule.hpp>
+#include <hyprland/src/desktop/rule/windowRule/WindowRule.hpp>
 #include <hyprland/src/helpers/AnimatedVariable.hpp>
 #include <hyprland/src/helpers/time/Time.hpp>
 #include "globals.hpp"
@@ -43,7 +43,6 @@
     PHLWINDOW                          getOwner();
 
     void                               updateRules();
-    void                               applyRule(const SP<CWindowRule>&);
 
     WP<CHyprBar>                       m_self;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprbars/globals.hpp 
new/hyprland-plugins-0.53.0/hyprbars/globals.hpp
--- old/hyprland-plugins-0.52.0/hyprbars/globals.hpp    2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprbars/globals.hpp    2025-12-29 
16:03:28.000000000 +0100
@@ -20,6 +20,9 @@
 struct SGlobalState {
     std::vector<SHyprButton>  buttons;
     std::vector<WP<CHyprBar>> bars;
+    uint32_t                  nobarRuleIdx = 0;
+    uint32_t                  barColorRuleIdx = 0;
+    uint32_t                  titleColorRuleIdx = 0;
 };
 
 inline UP<SGlobalState> g_pGlobalState;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprbars/main.cpp 
new/hyprland-plugins-0.53.0/hyprbars/main.cpp
--- old/hyprland-plugins-0.52.0/hyprbars/main.cpp       2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprbars/main.cpp       2025-12-29 
16:03:28.000000000 +0100
@@ -4,9 +4,10 @@
 
 #include <any>
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
+#include <hyprland/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp>
 
 #include <algorithm>
 
@@ -121,7 +122,10 @@
         throw std::runtime_error("[hb] Version mismatch");
     }
 
-    g_pGlobalState = makeUnique<SGlobalState>();
+    g_pGlobalState                    = makeUnique<SGlobalState>();
+    g_pGlobalState->nobarRuleIdx      = 
Desktop::Rule::windowEffects()->registerEffect("hyprbars:no_bar");
+    g_pGlobalState->barColorRuleIdx   = 
Desktop::Rule::windowEffects()->registerEffect("hyprbars:bar_color");
+    g_pGlobalState->titleColorRuleIdx = 
Desktop::Rule::windowEffects()->registerEffect("hyprbars:title_color");
 
     static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, 
"openWindow", [&](void* self, SCallbackInfo& info, std::any data) { 
onNewWindow(self, data); });
     // static auto P2 = HyprlandAPI::registerCallbackDynamic(PHANDLE, 
"closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { 
onCloseWindow(self, data); });
@@ -146,7 +150,7 @@
     HyprlandAPI::addConfigValue(PHANDLE, 
"plugin:hyprbars:inactive_button_color", Hyprlang::INT{0}); // unset
     HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:on_double_click", 
Hyprlang::STRING{""});
 
-    HyprlandAPI::addConfigKeyword(PHANDLE, "hyprbars-button", onNewButton, 
Hyprlang::SHandlerOptions{});
+    HyprlandAPI::addConfigKeyword(PHANDLE, "plugin:hyprbars:hyprbars-button", 
onNewButton, Hyprlang::SHandlerOptions{});
     static auto P4 = HyprlandAPI::registerCallbackDynamic(PHANDLE, 
"preConfigReload", [&](void* self, SCallbackInfo& info, std::any data) { 
onPreConfigReload(); });
 
     // add deco to existing windows
@@ -167,4 +171,8 @@
         m->m_scheduledRecalc = true;
 
     g_pHyprRenderer->m_renderPass.removeAllOfType("CBarPassElement");
+
+    
Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->barColorRuleIdx);
+    
Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->titleColorRuleIdx);
+    
Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->nobarRuleIdx);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprexpo/ExpoGesture.cpp 
new/hyprland-plugins-0.53.0/hyprexpo/ExpoGesture.cpp
--- old/hyprland-plugins-0.52.0/hyprexpo/ExpoGesture.cpp        2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprexpo/ExpoGesture.cpp        2025-12-29 
16:03:28.000000000 +0100
@@ -3,6 +3,7 @@
 #include "overview.hpp"
 
 #include <hyprland/src/Compositor.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
 #include <hyprland/src/helpers/Monitor.hpp>
 
 void CExpoGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) {
@@ -12,7 +13,7 @@
     m_firstUpdate = true;
 
     if (!g_pOverview)
-        g_pOverview = 
std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
+        g_pOverview = 
std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
     else {
         g_pOverview->selectHoveredWorkspace();
         g_pOverview->setClosing(true);
@@ -25,6 +26,9 @@
         return;
     }
 
+    if (!g_pOverview)
+        return;
+
     m_lastDelta += distance(e);
 
     if (m_lastDelta <= 0.01) // plugin will crash if swipe ends at <= 0
@@ -34,7 +38,9 @@
 }
 
 void CExpoGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) {
+    if (!g_pOverview)
+        return;
+
     g_pOverview->setClosing(false);
     g_pOverview->onSwipeEnd();
-    g_pOverview->resetSwipe();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprexpo/main.cpp 
new/hyprland-plugins-0.53.0/hyprexpo/main.cpp
--- old/hyprland-plugins-0.52.0/hyprexpo/main.cpp       2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprexpo/main.cpp       2025-12-29 
16:03:28.000000000 +0100
@@ -3,7 +3,8 @@
 #include <unistd.h>
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/desktop/DesktopTypes.hpp>
 #include <hyprland/src/render/Renderer.hpp>
@@ -81,7 +82,7 @@
             g_pOverview->close();
         else {
             renderingOverview = true;
-            g_pOverview       = 
std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
+            g_pOverview       = 
std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
             renderingOverview = false;
         }
         return {};
@@ -97,7 +98,7 @@
         return {};
 
     renderingOverview = true;
-    g_pOverview       = 
std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
+    g_pOverview       = 
std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
     renderingOverview = false;
     return {};
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprexpo/overview.cpp 
new/hyprland-plugins-0.53.0/hyprexpo/overview.cpp
--- old/hyprland-plugins-0.52.0/hyprexpo/overview.cpp   2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprexpo/overview.cpp   2025-12-29 
16:03:28.000000000 +0100
@@ -3,12 +3,14 @@
 #define private public
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprland/src/Compositor.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
 #include <hyprland/src/config/ConfigValue.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/managers/animation/AnimationManager.hpp>
 #include <hyprland/src/managers/animation/DesktopAnimationManager.hpp>
 #include <hyprland/src/managers/cursor/CursorShapeOverrideController.hpp>
 #include <hyprland/src/managers/input/InputManager.hpp>
+#include <hyprland/src/managers/eventLoop/EventLoopManager.hpp>
 #include <hyprland/src/helpers/time/Time.hpp>
 #undef private
 #include "OverviewPassElement.hpp"
@@ -17,10 +19,6 @@
     g_pOverview->damage();
 }
 
-static void removeOverview(WP<Hyprutils::Animation::CBaseAnimatedVariable> 
thisptr) {
-    g_pOverview.reset();
-}
-
 COverview::~COverview() {
     g_pHyprRenderer->makeEGLCurrent();
     images.clear(); // otherwise we get a vram leak
@@ -29,7 +27,7 @@
 }
 
 COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : 
startedOn(startedOn_), swipe(swipe_) {
-    const auto PMONITOR = g_pCompositor->m_lastMonitor.lock();
+    const auto PMONITOR = Desktop::focusState()->monitor();
     pMonitor            = PMONITOR;
 
     static auto* const* PCOLUMNS = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:hyprexpo:columns")->getDataStaticPtr();
@@ -47,7 +45,7 @@
     int      methodStartID = pMonitor->activeWorkspaceID();
     CVarList method{*PMETHOD, 0, 's', true};
     if (method.size() < 2)
-        Debug::log(ERR, "[he] invalid workspace_method");
+        Log::logger->log(Log::ERR, "[he] invalid workspace_method");
     else {
         methodCenter  = method[0] == "center";
         methodStartID = getWorkspaceIDNameFromString(method[1]).id;
@@ -249,6 +247,9 @@
 }
 
 void COverview::redrawID(int id, bool forcelowres) {
+    if (!pMonitor)
+        return;
+
     if (pMonitor->m_activeWorkspace != startedOn && !closing) {
         // likely user changed.
         onWorkspaceChange();
@@ -320,6 +321,8 @@
 }
 
 void COverview::redrawAll(bool forcelowres) {
+    if (!pMonitor)
+        return;
     for (size_t i = 0; i < (size_t)(SIDE_LENGTH * SIDE_LENGTH); ++i) {
         redrawID(i, forcelowres);
     }
@@ -361,11 +364,12 @@
 
     Vector2D    tileSize = (pMonitor->m_size / SIDE_LENGTH);
 
+    size->warp();
+    pos->warp();
+
     *size = pMonitor->m_size * pMonitor->m_size / tileSize;
     *pos  = (-((pMonitor->m_size / (double)SIDE_LENGTH) * Vector2D{ID % 
SIDE_LENGTH, ID / SIDE_LENGTH}) * pMonitor->m_scale) * (pMonitor->m_size / 
tileSize);
 
-    size->setCallbackOnEnd(removeOverview);
-
     closing = true;
 
     redrawAll();
@@ -392,6 +396,8 @@
 
         startedOn = pMonitor->m_activeWorkspace;
     }
+
+    size->setCallbackOnEnd([](auto) { g_pEventLoopManager->doLater([] { 
g_pOverview.reset(); }); });
 }
 
 void COverview::onPreRender() {
@@ -416,7 +422,8 @@
     }
 
     closeOnID = openedID;
-    close();
+    if (!closing)
+        close();
 }
 
 void COverview::render() {
@@ -468,9 +475,6 @@
 void COverview::onSwipeUpdate(double delta) {
     m_isSwiping = true;
 
-    if (swipeWasCommenced)
-        return;
-
     static auto* const* PDISTANCE = (Hyprlang::INT* 
const*)HyprlandAPI::getConfigValue(PHANDLE, 
"plugin:hyprexpo:gesture_distance")->getDataStaticPtr();
 
     const float         PERC               = closing ? std::clamp(delta / 
(double)**PDISTANCE, 0.0, 1.0) : 1.0 - std::clamp(delta / (double)**PDISTANCE, 
0.0, 1.0);
@@ -490,6 +494,9 @@
 }
 
 void COverview::onSwipeEnd() {
+    if (closing || !m_isSwiping)
+        return;
+
     const auto SIZEMIN = pMonitor->m_size;
     const auto SIZEMAX = pMonitor->m_size * pMonitor->m_size / 
(pMonitor->m_size / SIDE_LENGTH);
     const auto PERC    = (size->value() - SIZEMIN).x / (SIZEMAX - SIZEMIN).x;
@@ -502,6 +509,6 @@
 
     
size->setCallbackOnEnd([this](WP<Hyprutils::Animation::CBaseAnimatedVariable> 
thisptr) { redrawAll(true); });
 
-    swipeWasCommenced = true;
+    swipeWasCommenced = false;
     m_isSwiping       = false;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprfocus/README.md 
new/hyprland-plugins-0.53.0/hyprfocus/README.md
--- old/hyprland-plugins-0.52.0/hyprfocus/README.md     2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprfocus/README.md     2025-12-29 
16:03:28.000000000 +0100
@@ -14,9 +14,10 @@
 
 ### Variables
 
-| name | description | type | default |
-| --- | --- | --- | --- |
-|mode|which mode to use (flash / bounce / slide) | str | flash |
-| fade_opacity | for flash, what opacity to flash to | float | 0.8 |
-| bounce_strength | for bounce, what fraction of the window's size to jump to 
| float | 0.95 |
-| slide_height | for slide, how far up to slide | float | 20 |
+| name                     | description                                       
                   | type    | default |
+|--------------------------|----------------------------------------------------------------------|---------|---------|
+| `mode`                   | which mode to use (flash / bounce / slide)        
                   | str     | flash   |
+| `only_on_monitor_change` | whether to only perform the animation when 
changing between monitors | boolean | false   |
+| `fade_opacity`           | for flash, what opacity to flash to               
                   | float   | 0.8     |
+| `bounce_strength`        | for bounce, what fraction of the window's size to 
jump to            | float   | 0.95    |
+| `slide_height`           | for slide, how far up to slide                    
                   | float   | 20      |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprfocus/main.cpp 
new/hyprland-plugins-0.53.0/hyprfocus/main.cpp
--- old/hyprland-plugins-0.52.0/hyprfocus/main.cpp      2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprfocus/main.cpp      2025-12-29 
16:03:28.000000000 +0100
@@ -38,6 +38,10 @@
     if (lastWindow == window)
         return;
 
+    static const auto PONLY_ON_MONITOR_CHANGE = 
CConfigValue<Hyprlang::INT>("plugin:hyprfocus:only_on_monitor_change");
+    if (*PONLY_ON_MONITOR_CHANGE && lastWindow && lastWindow->m_monitor == 
window->m_monitor)
+        return;
+
     lastWindow = window;
 
     static const auto POPACITY = 
CConfigValue<Hyprlang::FLOAT>("plugin:hyprfocus:fade_opacity");
@@ -48,15 +52,15 @@
     const auto        POUT     = 
g_pConfigManager->getAnimationPropertyConfig("hyprfocusOut");
 
     if (*PMODE == "flash") {
+        const auto ORIGINAL = window->m_activeInactiveAlpha->goal();
         window->m_activeInactiveAlpha->setConfig(PIN);
         *window->m_activeInactiveAlpha = std::clamp(*POPACITY, 0.F, 1.F);
 
-        window->m_activeInactiveAlpha->setCallbackOnEnd([w = 
PHLWINDOWREF{window}, POUT](WP<CBaseAnimatedVariable> pav) {
+        window->m_activeInactiveAlpha->setCallbackOnEnd([w = 
PHLWINDOWREF{window}, POUT, ORIGINAL](WP<CBaseAnimatedVariable> pav) {
             if (!w)
                 return;
             w->m_activeInactiveAlpha->setConfig(POUT);
-            g_pCompositor->updateWindowAnimatedDecorationValues(w.lock());
-            w->updateDynamicRules();
+            *w->m_activeInactiveAlpha = ORIGINAL;
 
             w->m_activeInactiveAlpha->setCallbackOnEnd(nullptr);
         });
@@ -77,7 +81,7 @@
             w->m_realSize->setConfig(POUT);
             w->m_realPosition->setConfig(POUT);
 
-            if (w->m_isFloating) {
+            if (w->m_isFloating || w->isFullscreen()) {
                 *w->m_realPosition = ORIGINAL.pos();
                 *w->m_realSize     = ORIGINAL.size();
             } else
@@ -97,7 +101,7 @@
                 return;
             w->m_realPosition->setConfig(POUT);
 
-            if (w->m_isFloating)
+            if (w->m_isFloating || w->isFullscreen())
                 *w->m_realPosition = ORIGINAL;
             else
                 
g_pLayoutManager->getCurrentLayout()->recalculateWindow(w.lock());
@@ -124,6 +128,7 @@
     // clang-format on
 
     HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprfocus:mode", 
Hyprlang::STRING{"flash"});
+    HyprlandAPI::addConfigValue(PHANDLE, 
"plugin:hyprfocus:only_on_monitor_change", Hyprlang::INT{0});
     HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprfocus:fade_opacity", 
Hyprlang::FLOAT{0.8F});
     HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprfocus:slide_height", 
Hyprlang::FLOAT{20.F});
     HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprfocus:bounce_strength", 
Hyprlang::FLOAT{0.95F});
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprpm.toml 
new/hyprland-plugins-0.53.0/hyprpm.toml
--- old/hyprland-plugins-0.52.0/hyprpm.toml     2025-11-02 21:31:25.000000000 
+0100
+++ new/hyprland-plugins-0.53.0/hyprpm.toml     2025-12-29 16:03:28.000000000 
+0100
@@ -35,7 +35,10 @@
     ["c4a4c341568944bd4fb9cd503558b2de602c0213", 
"bf310cda4a09b79725c2919688881959ebf3229e"], # 0.50.0
     ["4e242d086e20b32951fdc0ebcbfb4d41b5be8dcc", 
"bf310cda4a09b79725c2919688881959ebf3229e"], # 0.50.1
     ["46174f78b374b6cea669c48880877a8bdcf7802f", 
"a5a6f93d72d5fb37e78b98c756cfd8b340e71a19"], # 0.51.0
-    ["71a1216abcc7031776630a6d88f105605c4dc1c9", 
"a5a6f93d72d5fb37e78b98c756cfd8b340e71a19"]  # 0.51.1
+    ["71a1216abcc7031776630a6d88f105605c4dc1c9", 
"a5a6f93d72d5fb37e78b98c756cfd8b340e71a19"], # 0.51.1
+    ["f56ec180d3a03a5aa978391249ff8f40f949fb73", 
"8c1212e96b81aa5f11fe21ca27defa2aad5b3cf3"], # 0.52.0
+    ["967c3c7404d4fa00234e29c70df3e263386d2597", 
"8c1212e96b81aa5f11fe21ca27defa2aad5b3cf3"], # 0.52.1
+    ["386376400119dd46a767c9f8c8791fd22c7b6e61", 
"8c1212e96b81aa5f11fe21ca27defa2aad5b3cf3"]  # 0.52.2
 ]
 
 [borders-plus-plus]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprscrolling/Scrolling.cpp 
new/hyprland-plugins-0.53.0/hyprscrolling/Scrolling.cpp
--- old/hyprland-plugins-0.52.0/hyprscrolling/Scrolling.cpp     2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprscrolling/Scrolling.cpp     2025-12-29 
16:03:28.000000000 +0100
@@ -3,6 +3,7 @@
 #include <algorithm>
 
 #include <hyprland/src/Compositor.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
 #include <hyprland/src/managers/input/InputManager.hpp>
 #include <hyprland/src/managers/eventLoop/EventLoopManager.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
@@ -276,7 +277,7 @@
     static const auto PFSONONE = 
CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:fullscreen_on_one_column");
 
     if (!workspace) {
-        Debug::log(ERR, "[scroller] broken internal state on workspace data");
+        Log::logger->log(Log::ERR, "[scroller] broken internal state on 
workspace data");
         return;
     }
 
@@ -296,7 +297,7 @@
 
         for (const auto& WINDOW : COL->windowDatas) {
             WINDOW->layoutBox =
-                CBox{currentLeft, currentTop, ITEM_WIDTH, WINDOW->windowSize * 
USABLE.h}.translate(PMONITOR->m_position + PMONITOR->m_reservedTopLeft + 
Vector2D{-cameraLeft, 0.0});
+                CBox{currentLeft, currentTop, ITEM_WIDTH, WINDOW->windowSize * 
USABLE.h}.translate(PMONITOR->logicalBoxMinusReserved().pos() + 
Vector2D{-cameraLeft, 0.0});
 
             currentTop += WINDOW->windowSize * USABLE.h;
 
@@ -349,7 +350,7 @@
 
     if (!data || !data->column || !data->column->workspace) {
         if (!data->overrideWorkspace) {
-            Debug::log(ERR, "[scroller] broken internal state on workspace 
(1)");
+            Log::logger->log(Log::ERR, "[scroller] broken internal state on 
workspace (1)");
             return;
         }
 
@@ -361,15 +362,16 @@
     }
 
     if (!PMONITOR || !PWORKSPACE) {
-        Debug::log(ERR, "[scroller] broken internal state on workspace (2)");
+        Log::logger->log(Log::ERR, "[scroller] broken internal state on 
workspace (2)");
         return;
     }
 
     // for gaps outer
+    const auto WORKAREA      = PMONITOR->logicalBoxMinusReserved();
     const bool DISPLAYLEFT   = !hasWindowsLeft;
     const bool DISPLAYRIGHT  = !hasWindowsRight;
-    const bool DISPLAYTOP    = STICKS(data->layoutBox.y, 
PMONITOR->m_position.y + PMONITOR->m_reservedTopLeft.y);
-    const bool DISPLAYBOTTOM = STICKS(data->layoutBox.y + data->layoutBox.h, 
PMONITOR->m_position.y + PMONITOR->m_size.y - 
PMONITOR->m_reservedBottomRight.y);
+    const bool DISPLAYTOP    = STICKS(data->layoutBox.y, WORKAREA.y);
+    const bool DISPLAYBOTTOM = STICKS(data->layoutBox.y + data->layoutBox.h, 
WORKAREA.y + WORKAREA.h);
 
     const auto PWINDOW = data->window.lock();
     // get specific gaps and rules for this workspace,
@@ -377,7 +379,7 @@
     const auto WORKSPACERULE = 
g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE);
 
     if (!validMapped(PWINDOW)) {
-        Debug::log(ERR, "Node {} holding invalid {}!!", (uintptr_t)data.get(), 
PWINDOW);
+        Log::logger->log(Log::ERR, "Node {} holding invalid {}!!", 
(uintptr_t)data.get(), PWINDOW);
         onWindowRemovedTiling(PWINDOW);
         return;
     }
@@ -385,7 +387,7 @@
     if (PWINDOW->isFullscreen() && !data->ignoreFullscreenChecks)
         return;
 
-    PWINDOW->unsetWindowData(PRIORITY_LAYOUT);
+    PWINDOW->m_ruleApplicator->resetProps(Desktop::Rule::RULE_PROP_ALL, 
Desktop::Types::PRIORITY_LAYOUT);
     PWINDOW->updateWindowData();
 
     static auto PGAPSINDATA  = 
CConfigValue<Hyprlang::CUSTOMTYPE>("general:gaps_in");
@@ -394,7 +396,6 @@
     auto* const PGAPSOUT     = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData();
 
     auto        gapsIn  = WORKSPACERULE.gapsIn.value_or(*PGAPSIN);
-    auto        gapsOut = WORKSPACERULE.gapsOut.value_or(*PGAPSOUT);
     CBox        nodeBox = data->layoutBox;
     nodeBox.round();
 
@@ -406,9 +407,9 @@
     auto       calcPos  = PWINDOW->m_position;
     auto       calcSize = PWINDOW->m_size;
 
-    const auto OFFSETTOPLEFT = Vector2D((double)(DISPLAYLEFT ? gapsOut.m_left 
: gapsIn.m_left), (double)(DISPLAYTOP ? gapsOut.m_top : gapsIn.m_top));
+    const auto OFFSETTOPLEFT = Vector2D((double)(DISPLAYLEFT ? 0 : 
gapsIn.m_left), (double)(DISPLAYTOP ? 0 : gapsIn.m_top));
 
-    const auto OFFSETBOTTOMRIGHT = Vector2D((double)(DISPLAYRIGHT ? 
gapsOut.m_right : gapsIn.m_right), (double)(DISPLAYBOTTOM ? gapsOut.m_bottom : 
gapsIn.m_bottom));
+    const auto OFFSETBOTTOMRIGHT = Vector2D((double)(DISPLAYRIGHT ? 0 : 
gapsIn.m_right), (double)(DISPLAYBOTTOM ? 0 : gapsIn.m_bottom));
 
     calcPos  = calcPos + OFFSETTOPLEFT;
     calcSize = calcSize - OFFSETTOPLEFT - OFFSETBOTTOMRIGHT;
@@ -481,7 +482,7 @@
         for (auto& w : widths) {
             try {
                 
m_config.configuredWidths.emplace_back(std::stof(std::string{w}));
-            } catch (...) { Debug::log(ERR, "scrolling: Failed to parse width 
{} as float", w); }
+            } catch (...) { Log::logger->log(Log::ERR, "scrolling: Failed to 
parse width {} as float", w); }
         }
     });
 
@@ -529,20 +530,20 @@
     auto workspaceData = dataFor(window->m_workspace);
 
     if (!workspaceData) {
-        Debug::log(LOG, "[scrolling] No workspace data yet, creating");
+        Log::logger->log(Log::DEBUG, "[scrolling] No workspace data yet, 
creating");
         workspaceData       = 
m_workspaceDatas.emplace_back(makeShared<SWorkspaceData>(window->m_workspace, 
this));
         workspaceData->self = workspaceData;
     }
 
-    auto droppingOn = g_pCompositor->m_lastWindow.lock();
+    auto droppingOn = Desktop::focusState()->window();
 
     if (droppingOn == window)
-        droppingOn = 
g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), 
RESERVED_EXTENTS | INPUT_EXTENTS);
+        droppingOn = 
g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), 
Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS);
 
     SP<SScrollingWindowData> droppingData   = droppingOn ? dataFor(droppingOn) 
: nullptr;
     SP<SColumnData>          droppingColumn = droppingData ? 
droppingData->column.lock() : nullptr;
 
-    Debug::log(LOG, "[scrolling] new window {:x}, droppingColumn: {:x}, 
columns before: {}", (uintptr_t)window.get(), (uintptr_t)droppingColumn.get(),
+    Log::logger->log(Log::DEBUG, "[scrolling] new window {:x}, droppingColumn: 
{:x}, columns before: {}", (uintptr_t)window.get(), 
(uintptr_t)droppingColumn.get(),
                workspaceData->columns.size());
 
     if (!droppingColumn) {
@@ -630,7 +631,7 @@
 }
 
 void CScrollingLayout::resizeActiveWindow(const Vector2D& delta, eRectCorner 
corner, PHLWINDOW pWindow) {
-    const auto PWINDOW  = pWindow ? pWindow : 
g_pCompositor->m_lastWindow.lock();
+    const auto PWINDOW  = pWindow ? pWindow : Desktop::focusState()->window();
     Vector2D   modDelta = delta;
 
     if (!validMapped(PWINDOW))
@@ -639,9 +640,9 @@
     const auto DATA = dataFor(PWINDOW);
 
     if (!DATA) {
-        *PWINDOW->m_realSize =
-            (PWINDOW->m_realSize->goal() + delta)
-                
.clamp(PWINDOW->m_windowData.minSize.valueOr(Vector2D{MIN_WINDOW_SIZE, 
MIN_WINDOW_SIZE}), PWINDOW->m_windowData.maxSize.valueOr(Vector2D{INFINITY, 
INFINITY}));
+        *PWINDOW->m_realSize = (PWINDOW->m_realSize->goal() + delta)
+                                   
.clamp(PWINDOW->m_ruleApplicator->minSize().valueOr(Vector2D{MIN_WINDOW_SIZE, 
MIN_WINDOW_SIZE}),
+                                          
PWINDOW->m_ruleApplicator->maxSize().valueOr(Vector2D{INFINITY, INFINITY}));
         PWINDOW->updateWindowDecos();
         return;
     }
@@ -753,7 +754,7 @@
             *pWindow->m_realPosition = pWindow->m_lastFloatingPosition;
             *pWindow->m_realSize     = pWindow->m_lastFloatingSize;
 
-            pWindow->unsetWindowData(PRIORITY_LAYOUT);
+            
pWindow->m_ruleApplicator->resetProps(Desktop::Rule::RULE_PROP_ALL, 
Desktop::Types::PRIORITY_LAYOUT);
             pWindow->updateWindowData();
         }
     } else {
@@ -768,10 +769,10 @@
 
             SP<SScrollingWindowData> fakeNode = 
makeShared<SScrollingWindowData>(pWindow, nullptr);
             fakeNode->window                  = pWindow;
-            fakeNode->layoutBox = {PMONITOR->m_position + 
PMONITOR->m_reservedTopLeft, PMONITOR->m_size - PMONITOR->m_reservedTopLeft - 
PMONITOR->m_reservedBottomRight};
-            pWindow->m_size     = fakeNode->layoutBox.size();
-            fakeNode->ignoreFullscreenChecks = true;
-            fakeNode->overrideWorkspace      = pWindow->m_workspace;
+            fakeNode->layoutBox               = 
PMONITOR->logicalBoxMinusReserved();
+            pWindow->m_size                   = fakeNode->layoutBox.size();
+            fakeNode->ignoreFullscreenChecks  = true;
+            fakeNode->overrideWorkspace       = pWindow->m_workspace;
 
             applyNodeDataToWindow(fakeNode, false, false, false);
         }
@@ -782,10 +783,10 @@
 
 void CScrollingLayout::focusWindowUpdate(PHLWINDOW pWindow) {
     if (!validMapped(pWindow)) {
-        g_pCompositor->focusWindow(nullptr);
+        Desktop::focusState()->fullWindowFocus(nullptr);
         return;
     }
-    g_pCompositor->focusWindow(pWindow);
+    Desktop::focusState()->fullWindowFocus(pWindow);
     const auto WINDOWDATA = dataFor(pWindow);
     if (WINDOWDATA) {
         if (auto col = WINDOWDATA->column.lock())
@@ -841,7 +842,7 @@
             return {};
 
         if (ARGS[1] == "+col" || ARGS[1] == "col") {
-            const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+            const auto WDATA = dataFor(Desktop::focusState()->window());
             if (!WDATA)
                 return {};
 
@@ -862,9 +863,9 @@
 
             return {};
         } else if (ARGS[1] == "-col") {
-            const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+            const auto WDATA = dataFor(Desktop::focusState()->window());
             if (!WDATA) {
-                if (DATA->leftOffset <= DATA->maxWidth() && 
DATA->columns.size() > 0) {
+                if (DATA->columns.size() > 0) {
                     DATA->centerCol(DATA->columns.back());
                     DATA->recalculate();
                     
focusWindowUpdate((DATA->columns.back()->windowDatas.back())->window.lock());
@@ -899,7 +900,7 @@
 
         focusWindowUpdate(ATCENTER ? 
(*ATCENTER->windowDatas.begin())->window.lock() : nullptr);
     } else if (ARGS[0] == "colresize") {
-        const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto WDATA = dataFor(Desktop::focusState()->window());
 
         if (!WDATA)
             return {};
@@ -927,29 +928,27 @@
         if (ARGS[1][0] == '+' || ARGS[1][0] == '-') {
             if (ARGS[1] == "+conf") {
                 for (size_t i = 0; i < m_config.configuredWidths.size(); ++i) {
-                    if (m_config.configuredWidths[i] < 
WDATA->column->columnWidth)
-                        continue;
+                    if (m_config.configuredWidths[i] > 
WDATA->column->columnWidth) {
+                        WDATA->column->columnWidth = 
m_config.configuredWidths[i];
+                        break;
+                    }
 
                     if (i == m_config.configuredWidths.size() - 1)
                         WDATA->column->columnWidth = 
m_config.configuredWidths[0];
-                    else
-                        WDATA->column->columnWidth = 
m_config.configuredWidths[i + 1];
-
-                    break;
                 }
 
                 return {};
             } else if (ARGS[1] == "-conf") {
-                for (size_t i = m_config.configuredWidths.size() - 1; i >= 0; 
--i) {
-                    if (m_config.configuredWidths[i] > 
WDATA->column->columnWidth)
-                        continue;
-
-                    if (i == 0)
-                        WDATA->column->columnWidth = 
m_config.configuredWidths[m_config.configuredWidths.size() - 1];
-                    else
-                        WDATA->column->columnWidth = 
m_config.configuredWidths[i - 1];
+                for (size_t i = m_config.configuredWidths.size() - 1;; --i) {
+                    if (m_config.configuredWidths[i] < 
WDATA->column->columnWidth) {
+                        WDATA->column->columnWidth = 
m_config.configuredWidths[i];
+                        break;
+                    }
 
-                    break;
+                    if (i == 0) {
+                        WDATA->column->columnWidth = 
m_config.configuredWidths.back();
+                        break;
+                    }
                 }
 
                 return {};
@@ -970,13 +969,13 @@
             WDATA->column->columnWidth = abs;
         }
     } else if (ARGS[0] == "movewindowto") {
-        moveWindowTo(g_pCompositor->m_lastWindow.lock(), ARGS[1], false);
+        moveWindowTo(Desktop::focusState()->window(), ARGS[1], false);
     } else if (ARGS[0] == "fit") {
 
         if (ARGS[1] == "active") {
             // fit the current column to 1.F
-            const auto WDATA    = dataFor(g_pCompositor->m_lastWindow.lock());
-            const auto WORKDATA = 
dataFor(g_pCompositor->m_lastWindow->m_workspace);
+            const auto WDATA    = dataFor(Desktop::focusState()->window());
+            const auto WORKDATA = 
dataFor(Desktop::focusState()->window()->m_workspace);
 
             if (!WDATA || !WORKDATA || WORKDATA->columns.size() == 0)
                 return {};
@@ -987,7 +986,7 @@
 
             WORKDATA->leftOffset = 0;
             for (size_t i = 0; i < WORKDATA->columns.size(); ++i) {
-                if 
(WORKDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
+                if (WORKDATA->columns[i]->has(Desktop::focusState()->window()))
                     break;
 
                 WORKDATA->leftOffset += USABLE.w * 
WORKDATA->columns[i]->columnWidth;
@@ -996,7 +995,7 @@
             WDATA->column->workspace->recalculate();
         } else if (ARGS[1] == "all") {
             // fit all columns on screen
-            const auto WDATA = 
dataFor(g_pCompositor->m_lastWindow->m_workspace);
+            const auto WDATA = 
dataFor(Desktop::focusState()->window()->m_workspace);
 
             if (!WDATA || WDATA->columns.size() == 0)
                 return {};
@@ -1009,7 +1008,7 @@
             WDATA->recalculate();
         } else if (ARGS[1] == "toend") {
             // fit all columns on screen that start from the current and end 
on the last
-            const auto WDATA = 
dataFor(g_pCompositor->m_lastWindow->m_workspace);
+            const auto WDATA = 
dataFor(Desktop::focusState()->window()->m_workspace);
 
             if (!WDATA || WDATA->columns.size() == 0)
                 return {};
@@ -1017,7 +1016,7 @@
             bool   begun   = false;
             size_t foundAt = 0;
             for (size_t i = 0; i < WDATA->columns.size(); ++i) {
-                if (!begun && 
!WDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
+                if (!begun && 
!WDATA->columns[i]->has(Desktop::focusState()->window()))
                     continue;
 
                 if (!begun) {
@@ -1041,7 +1040,7 @@
             WDATA->recalculate();
         } else if (ARGS[1] == "tobeg") {
             // fit all columns on screen that start from the current and end 
on the last
-            const auto WDATA = 
dataFor(g_pCompositor->m_lastWindow->m_workspace);
+            const auto WDATA = 
dataFor(Desktop::focusState()->window()->m_workspace);
 
             if (!WDATA || WDATA->columns.size() == 0)
                 return {};
@@ -1049,7 +1048,7 @@
             bool   begun   = false;
             size_t foundAt = 0;
             for (int64_t i = (int64_t)WDATA->columns.size() - 1; i >= 0; --i) {
-                if (!begun && 
!WDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
+                if (!begun && 
!WDATA->columns[i]->has(Desktop::focusState()->window()))
                     continue;
 
                 if (!begun) {
@@ -1068,7 +1067,7 @@
             WDATA->recalculate();
         } else if (ARGS[1] == "visible") {
             // fit all columns on screen that start from the current and end 
on the last
-            const auto WDATA = 
dataFor(g_pCompositor->m_lastWindow->m_workspace);
+            const auto WDATA = 
dataFor(Desktop::focusState()->window()->m_workspace);
 
             if (!WDATA || WDATA->columns.size() == 0)
                 return {};
@@ -1111,7 +1110,7 @@
             WDATA->recalculate();
         }
     } else if (ARGS[0] == "focus") {
-        const auto        WDATA       = 
dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto        WDATA       = 
dataFor(Desktop::focusState()->window());
         static const auto PNOFALLBACK = 
CConfigValue<Hyprlang::INT>("general:no_focus_fallback");
 
         if (!WDATA || ARGS[1].empty())
@@ -1195,7 +1194,7 @@
             default: return {};
         }
     } else if (ARGS[0] == "promote") {
-        const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto WDATA = dataFor(Desktop::focusState()->window());
 
         if (!WDATA)
             return {};
@@ -1212,7 +1211,7 @@
         if (ARGS.size() < 2)
             return {};
 
-        const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto WDATA = dataFor(Desktop::focusState()->window());
         if (!WDATA)
             return {};
 
@@ -1247,7 +1246,7 @@
         if (ARGS.size() < 2)
             return {};
 
-        const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto WDATA = dataFor(Desktop::focusState()->window());
         if (!WDATA)
             return {};
 
@@ -1259,7 +1258,7 @@
         if (!SOURCE_WS_DATA)
             return {};
 
-        const auto PMONITOR = g_pCompositor->m_lastWindow->m_monitor.lock();
+        const auto PMONITOR = Desktop::focusState()->monitor();
         if (!PMONITOR)
             return {};
 
@@ -1342,7 +1341,7 @@
             g_pCompositor->moveWindowToWorkspaceSafe(win, PWORKSPACE);
         }
 
-        g_pCompositor->focusWindow(windowsToMove.front());
+        Desktop::focusState()->fullWindowFocus(windowsToMove.front());
         g_pCompositor->warpCursorTo(windowsToMove.front()->middle());
     } else if (ARGS[0] == "togglefit") {
         static const auto PFITMETHOD = 
CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:focus_fit_method");
@@ -1351,7 +1350,7 @@
 
         fitMethod = toggled;
 
-        const auto        focusedData = 
dataFor(g_pCompositor->m_lastWindow.lock());
+        const auto        focusedData = 
dataFor(Desktop::focusState()->window());
         static const auto PFSONONE    = 
CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:fullscreen_on_one_column");
 
         for (const auto& ws : m_workspaceDatas) {
@@ -1447,8 +1446,8 @@
             NEWCOL->add(DATA);
             WS->centerOrFitCol(NEWCOL);
         } else {
-            if (COL->windowDatas.size() > 1 || DATA->column)
-                COL->add(DATA, 
COL->idxForHeight(g_pInputManager->getMouseCoordsInternal().y) - 1);
+            if (COL->windowDatas.size() > 0)
+                COL->add(DATA, 
COL->idxForHeight(g_pInputManager->getMouseCoordsInternal().y));
             else
                 COL->add(DATA);
             WS->centerOrFitCol(COL);
@@ -1464,8 +1463,8 @@
             NEWCOL->add(DATA);
             WS->centerOrFitCol(NEWCOL);
         } else {
-            if (COL->windowDatas.size() > 1 || DATA->column)
-                COL->add(DATA, 
COL->idxForHeight(g_pInputManager->getMouseCoordsInternal().y) - 1);
+            if (COL->windowDatas.size() > 0)
+                COL->add(DATA, 
COL->idxForHeight(g_pInputManager->getMouseCoordsInternal().y));
             else
                 COL->add(DATA);
             WS->centerOrFitCol(COL);
@@ -1530,14 +1529,14 @@
 }
 
 SP<SWorkspaceData> CScrollingLayout::currentWorkspaceData() {
-    if (!g_pCompositor->m_lastMonitor || 
!g_pCompositor->m_lastMonitor->m_activeWorkspace)
+    if (!Desktop::focusState()->monitor() || 
!Desktop::focusState()->monitor()->m_activeWorkspace)
         return nullptr;
 
     // FIXME: special
 
-    return dataFor(g_pCompositor->m_lastMonitor->m_activeWorkspace);
+    return dataFor(Desktop::focusState()->monitor()->m_activeWorkspace);
 }
 
 CBox CScrollingLayout::usableAreaFor(PHLMONITOR m) {
-    return CBox{m->m_reservedTopLeft, m->m_size - m->m_reservedTopLeft - 
m->m_reservedBottomRight};
+    return m->logicalBoxMinusReserved().translate(-m->m_position);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprscrolling/Scrolling.hpp 
new/hyprland-plugins-0.53.0/hyprscrolling/Scrolling.hpp
--- old/hyprland-plugins-0.52.0/hyprscrolling/Scrolling.hpp     2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprscrolling/Scrolling.hpp     2025-12-29 
16:03:28.000000000 +0100
@@ -35,6 +35,8 @@
     void                                  remove(PHLWINDOW w);
     bool                                  has(PHLWINDOW w);
     size_t                                idx(PHLWINDOW w);
+
+    // index of lowest window that is above y.
     size_t                                idxForHeight(float y);
 
     void                                  up(SP<SScrollingWindowData> w);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprscrolling/main.cpp 
new/hyprland-plugins-0.53.0/hyprscrolling/main.cpp
--- old/hyprland-plugins-0.52.0/hyprscrolling/main.cpp  2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprscrolling/main.cpp  2025-12-29 
16:03:28.000000000 +0100
@@ -7,7 +7,7 @@
 
 #define private public
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/DesktopTypes.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprland/src/managers/KeybindManager.hpp>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprtrails/main.cpp 
new/hyprland-plugins-0.53.0/hyprtrails/main.cpp
--- old/hyprland-plugins-0.52.0/hyprtrails/main.cpp     2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprtrails/main.cpp     2025-12-29 
16:03:28.000000000 +0100
@@ -4,7 +4,7 @@
 
 #include <any>
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/DesktopTypes.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/shaders/Shaders.hpp>
 #include <hyprland/src/render/Renderer.hpp>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprtrails/trail.cpp 
new/hyprland-plugins-0.53.0/hyprtrails/trail.cpp
--- old/hyprland-plugins-0.52.0/hyprtrails/trail.cpp    2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprtrails/trail.cpp    2025-12-29 
16:03:28.000000000 +0100
@@ -1,7 +1,7 @@
 #include "trail.hpp"
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprutils/memory/Casts.hpp>
 using namespace Hyprutils::Memory;
@@ -87,7 +87,7 @@
 
     const auto PWINDOW = m_pWindow.lock();
 
-    if (!PWINDOW->m_windowData.decorate.valueOrDefault())
+    if (!PWINDOW->m_ruleApplicator->decorate().valueOrDefault())
         return;
 
     auto data = CTrailPassElement::STrailData{this, a};
@@ -129,7 +129,7 @@
 
     CBox   monbox = {0, 0, 
g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x, 
g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y};
 
-    Mat3x3 matrix   = 
g_pHyprOpenGL->m_renderData.monitorProjection.projectBox(monbox, 
wlTransformToHyprutils(invertTransform(WL_OUTPUT_TRANSFORM_NORMAL)), 
monbox.rot);
+    Mat3x3 matrix   = 
g_pHyprOpenGL->m_renderData.monitorProjection.projectBox(monbox, 
Math::wlTransformToHyprutils(Math::invertTransform(WL_OUTPUT_TRANSFORM_NORMAL)),
 monbox.rot);
     Mat3x3 glMatrix = 
g_pHyprOpenGL->m_renderData.projection.copy().multiply(matrix);
 
     g_pHyprOpenGL->blend(true);
@@ -224,13 +224,12 @@
             // vecNormal.y = std::abs(vecNormal.y);
 
             // extend by coeff
-            float ageCoeff = t * (agesForBezier.size() - 1);
-            float ageFloor = std::floor(ageCoeff);
-            float ageCeil  = std::ceil(ageCoeff);
-            float approxAge =
-                agesForBezier[sc<int>(ageFloor)] + 
(agesForBezier[sc<int>(ageCeil)] - agesForBezier[sc<int>(ageFloor)]) * 
(ageCoeff - ageFloor);
-            float    coeff  = originalCoeff * (1.0 - (approxAge / maxAge));
-            Vector2D newVec = {vecNormal.x * coeff / pMonitor->m_size.x, 
vecNormal.y * coeff / pMonitor->m_size.y};
+            float    ageCoeff  = t * (agesForBezier.size() - 1);
+            float    ageFloor  = std::floor(ageCoeff);
+            float    ageCeil   = std::ceil(ageCoeff);
+            float    approxAge = agesForBezier[sc<int>(ageFloor)] + 
(agesForBezier[sc<int>(ageCeil)] - agesForBezier[sc<int>(ageFloor)]) * 
(ageCoeff - ageFloor);
+            float    coeff     = originalCoeff * (1.0 - (approxAge / maxAge));
+            Vector2D newVec    = {vecNormal.x * coeff / pMonitor->m_size.x, 
vecNormal.y * coeff / pMonitor->m_size.y};
 
             if ((newVec.x == 0 && newVec.y == 0) || std::isnan(newVec.x) || 
std::isnan(newVec.y))
                 continue;
@@ -243,16 +242,15 @@
         }
     }
 
-    box thisboxopengl =
-        box{sc<float>((PWINDOW->m_realPosition->value().x - 
pMonitor->m_position.x) / pMonitor->m_size.x),
-            sc<float>((PWINDOW->m_realPosition->value().y - 
pMonitor->m_position.y) / pMonitor->m_size.y),
-            sc<float>((PWINDOW->m_realPosition->value().x + 
PWINDOW->m_realSize->value().x) / pMonitor->m_size.x),
-            sc<float>((PWINDOW->m_realPosition->value().y + 
PWINDOW->m_realSize->value().y) / pMonitor->m_size.y)};
+    box thisboxopengl = box{sc<float>((PWINDOW->m_realPosition->value().x - 
pMonitor->m_position.x) / pMonitor->m_size.x),
+                            sc<float>((PWINDOW->m_realPosition->value().y - 
pMonitor->m_position.y) / pMonitor->m_size.y),
+                            sc<float>((PWINDOW->m_realPosition->value().x + 
PWINDOW->m_realSize->value().x) / pMonitor->m_size.x),
+                            sc<float>((PWINDOW->m_realPosition->value().y + 
PWINDOW->m_realSize->value().y) / pMonitor->m_size.y)};
     glUniform4f(g_pGlobalState->trailShader.uniformLocations[SHADER_GRADIENT], 
thisboxopengl.x, thisboxopengl.y, thisboxopengl.w, thisboxopengl.h);
     glUniform4f(g_pGlobalState->trailShader.uniformLocations[SHADER_COLOR], 
COLOR.r, COLOR.g, COLOR.b, COLOR.a);
 
     CBox transformedBox = monbox;
-    
transformedBox.transform(wlTransformToHyprutils(invertTransform(g_pHyprOpenGL->m_renderData.pMonitor->m_transform)),
 g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x,
+    
transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprOpenGL->m_renderData.pMonitor->m_transform)),
 g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x,
                              
g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y);
 
     
glVertexAttribPointer(g_pGlobalState->trailShader.uniformLocations[SHADER_POS_ATTRIB],
 2, GL_FLOAT, GL_FALSE, 0, (float*)points.data());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/hyprwinwrap/main.cpp 
new/hyprland-plugins-0.53.0/hyprwinwrap/main.cpp
--- old/hyprland-plugins-0.52.0/hyprwinwrap/main.cpp    2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/hyprwinwrap/main.cpp    2025-12-29 
16:03:28.000000000 +0100
@@ -9,7 +9,7 @@
 
 #define private public
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprland/src/managers/LayoutManager.hpp>
@@ -27,7 +27,7 @@
 // hooks
 inline CFunctionHook* subsurfaceHook = nullptr;
 inline CFunctionHook* commitHook     = nullptr;
-typedef void (*origCommitSubsurface)(CSubsurface* thisptr);
+typedef void (*origCommitSubsurface)(Desktop::View::CSubsurface* thisptr);
 typedef void (*origCommit)(void* owner, void* data);
 
 std::vector<PHLWINDOWREF> bgWindows;
@@ -78,11 +78,11 @@
     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);
+        Log::logger->log(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);
+        Log::logger->log(Log::WARN, "[hyprwinwrap] size_y (%d) + pos_y (%d) > 
100, adjusting size_y to %d", sy, py, 100.f - py);
         sy = 100.f - py;
     }
 
@@ -104,13 +104,13 @@
     pWindow->m_hidden = true;
 
     g_pInputManager->refocus();
-    Debug::log(LOG, "[hyprwinwrap] new window moved to bg {}", pWindow);
+    Log::logger->log(Log::DEBUG, "[hyprwinwrap] new window moved to bg {}", 
pWindow);
 }
 
 void onCloseWindow(PHLWINDOW pWindow) {
     std::erase_if(bgWindows, [pWindow](const auto& ref) { return ref.expired() 
|| ref.lock() == pWindow; });
 
-    Debug::log(LOG, "[hyprwinwrap] closed window {}", pWindow);
+    Log::logger->log(Log::DEBUG, "[hyprwinwrap] closed window {}", pWindow);
 }
 
 void onRenderStage(eRenderStage stage) {
@@ -132,8 +132,8 @@
     }
 }
 
-void onCommitSubsurface(CSubsurface* thisptr) {
-    const auto PWINDOW = thisptr->m_wlSurface->getWindow();
+void onCommitSubsurface(Desktop::View::CSubsurface* thisptr) {
+    const auto PWINDOW = 
Desktop::View::CWindow::fromView(thisptr->wlSurface()->view());
 
     if (!PWINDOW || std::find_if(bgWindows.begin(), bgWindows.end(), 
[PWINDOW](const auto& ref) { return ref.lock() == PWINDOW; }) == 
bgWindows.end()) {
         ((origCommitSubsurface)subsurfaceHook->m_original)(thisptr);
@@ -151,7 +151,7 @@
 }
 
 void onCommit(void* owner, void* data) {
-    const auto PWINDOW = ((CWindow*)owner)->m_self.lock();
+    const auto PWINDOW = ((Desktop::View::CWindow*)owner)->m_self.lock();
 
     if (std::find_if(bgWindows.begin(), bgWindows.end(), [PWINDOW](const auto& 
ref) { return ref.lock() == PWINDOW; }) == bgWindows.end()) {
         ((origCommit)commitHook->m_original)(owner, data);
@@ -203,16 +203,12 @@
     static auto P4 = HyprlandAPI::registerCallbackDynamic(PHANDLE, 
"configReloaded", [&](void* self, SCallbackInfo& info, std::any data) { 
onConfigReloaded(); });
     // clang-format on
 
-    auto fns = HyprlandAPI::findFunctionsByName(PHANDLE, "onCommit");
+    auto fns = HyprlandAPI::findFunctionsByName(PHANDLE, 
"_ZN7Desktop4View11CSubsurface8onCommitEv");
     if (fns.size() < 1)
         throw std::runtime_error("hyprwinwrap: onCommit not found");
-    for (auto& fn : fns) {
-        if (!fn.demangled.contains("CSubsurface"))
-            continue;
-        subsurfaceHook = HyprlandAPI::createFunctionHook(PHANDLE, fn.address, 
(void*)&onCommitSubsurface);
-    }
+    subsurfaceHook = HyprlandAPI::createFunctionHook(PHANDLE, fns[0].address, 
(void*)&onCommitSubsurface);
 
-    fns = HyprlandAPI::findFunctionsByName(PHANDLE, "listener_commitWindow");
+    fns = HyprlandAPI::findFunctionsByName(PHANDLE, 
"_ZN7Desktop4View7CWindow12commitWindowEv");
     if (fns.size() < 1)
         throw std::runtime_error("hyprwinwrap: listener_commitWindow not 
found");
     commitHook = HyprlandAPI::createFunctionHook(PHANDLE, fns[0].address, 
(void*)&onCommit);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.52.0/xtra-dispatchers/main.cpp 
new/hyprland-plugins-0.53.0/xtra-dispatchers/main.cpp
--- old/hyprland-plugins-0.52.0/xtra-dispatchers/main.cpp       2025-11-02 
21:31:25.000000000 +0100
+++ new/hyprland-plugins-0.53.0/xtra-dispatchers/main.cpp       2025-12-29 
16:03:28.000000000 +0100
@@ -7,7 +7,8 @@
 
 #define private public
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/Window.hpp>
+#include <hyprland/src/desktop/state/FocusState.hpp>
+#include <hyprland/src/desktop/view/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprland/src/managers/KeybindManager.hpp>
@@ -28,7 +29,10 @@
 static SDispatchResult moveOrExec(std::string in) {
     CVarList vars(in, 0, ',');
 
-    if (!g_pCompositor->m_lastMonitor || 
!g_pCompositor->m_lastMonitor->m_activeWorkspace)
+    auto focusState = Desktop::focusState();
+    auto monitor = focusState->monitor();
+    
+    if (!monitor || !monitor->m_activeWorkspace)
         return SDispatchResult{.success = false, .error = "No active 
workspace"};
 
     const auto PWINDOW = g_pCompositor->getWindowByRegex(vars[0]);
@@ -36,11 +40,11 @@
     if (!PWINDOW)
         g_pKeybindManager->spawn(vars[1]);
     else {
-        if (g_pCompositor->m_lastMonitor->m_activeWorkspace != 
PWINDOW->m_workspace)
-            g_pCompositor->moveWindowToWorkspaceSafe(PWINDOW, 
g_pCompositor->m_lastMonitor->m_activeWorkspace);
+        if (monitor->m_activeWorkspace != PWINDOW->m_workspace)
+            g_pCompositor->moveWindowToWorkspaceSafe(PWINDOW, 
monitor->m_activeWorkspace);
         else
             g_pCompositor->warpCursorTo(PWINDOW->middle());
-        g_pCompositor->focusWindow(PWINDOW);
+        focusState->fullWindowFocus(PWINDOW);
     }
 
     return SDispatchResult{};
@@ -52,15 +56,18 @@
     if (id == WORKSPACE_INVALID)
         return SDispatchResult{.success = false, .error = "Failed to find 
workspace"};
 
-    if (!g_pCompositor->m_lastWindow || 
!g_pCompositor->m_lastWindow->m_workspace)
+    auto focusState = Desktop::focusState();
+    auto window = focusState->window();
+
+    if (!window || !window->m_workspace)
         return SDispatchResult{.success = false, .error = "No valid last 
window"};
 
     auto pWorkspace = g_pCompositor->getWorkspaceByID(id);
     if (!pWorkspace)
-        pWorkspace = g_pCompositor->createNewWorkspace(id, 
g_pCompositor->m_lastWindow->m_workspace->monitorID(), name, false);
+        pWorkspace = g_pCompositor->createNewWorkspace(id, 
window->m_workspace->monitorID(), name, false);
 
     for (const auto& w : g_pCompositor->m_windows) {
-        if (w == g_pCompositor->m_lastWindow || w->m_workspace != 
g_pCompositor->m_lastWindow->m_workspace)
+        if (w == window || w->m_workspace != window->m_workspace)
             continue;
 
         g_pCompositor->moveWindowToWorkspaceSafe(w, pWorkspace);
@@ -75,24 +82,28 @@
     if (id == WORKSPACE_INVALID)
         return SDispatchResult{.success = false, .error = "Failed to find 
workspace"};
 
-    if (!g_pCompositor->m_lastMonitor || 
!g_pCompositor->m_lastMonitor->m_activeWorkspace)
+    auto focusState = Desktop::focusState();
+    auto monitor = focusState->monitor();
+    auto window = focusState->window();
+    
+    if (!monitor || !monitor->m_activeWorkspace)
         return SDispatchResult{.success = false, .error = "No active monitor"};
 
     auto pWorkspace = g_pCompositor->getWorkspaceByID(id);
     if (!pWorkspace)
         return SDispatchResult{.success = false, .error = "Workspace isnt 
open"};
 
-    const auto PLASTWINDOW = g_pCompositor->m_lastWindow.lock();
+    const auto PLASTWINDOW = window;
 
     for (const auto& w : g_pCompositor->m_windows) {
         if (w->m_workspace != pWorkspace)
             continue;
 
-        g_pCompositor->moveWindowToWorkspaceSafe(w, 
g_pCompositor->m_lastMonitor->m_activeWorkspace);
+        g_pCompositor->moveWindowToWorkspaceSafe(w, 
monitor->m_activeWorkspace);
     }
 
     if (PLASTWINDOW) {
-        g_pCompositor->focusWindow(PLASTWINDOW);
+        Desktop::focusState()->fullWindowFocus(PLASTWINDOW);
         g_pCompositor->warpCursorTo(PLASTWINDOW->middle());
     }
 
@@ -100,11 +111,15 @@
 }
 
 static SDispatchResult closeUnfocused(std::string in) {
-    if (!g_pCompositor->m_lastMonitor)
+       auto focusState = Desktop::focusState();
+       auto monitor = focusState->monitor();
+       auto window = focusState->window();
+       
+    if (!window)
         return SDispatchResult{.success = false, .error = "No focused 
monitor"};
 
     for (const auto& w : g_pCompositor->m_windows) {
-        if (w->m_workspace != g_pCompositor->m_lastMonitor->m_activeWorkspace 
|| w->m_monitor != g_pCompositor->m_lastMonitor || !w->m_isMapped || w == 
g_pCompositor->m_lastWindow)
+        if (w->m_workspace != monitor->m_activeWorkspace || w->m_monitor != 
monitor || !w->m_isMapped || w == window)
             continue;
 
         g_pCompositor->closeWindow(w);

Reply via email to