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-10-30 18:13:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hyprland-plugins (Old)
 and      /work/SRC/openSUSE:Factory/.hyprland-plugins.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hyprland-plugins"

Fri Oct 30 18:13:12 2026 rev:11 rq:1393772 version:0.57.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/hyprland-plugins/hyprland-plugins.changes        
2026-07-28 17:51:25.526868536 +0200
+++ 
/work/SRC/openSUSE:Factory/.hyprland-plugins.new.1255/hyprland-plugins.changes  
    2026-10-30 18:21:26.759238710 +0100
@@ -1,0 +2,7 @@
+Wed Oct 28 16:49:18 UTC 2026 - Florian "sp1rit" <[email protected]>
+
+- Update to version 0.57.0:
+  + The plugins were updated to use the plugin interface in use by
+    hyprland 0.57.0.
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ hyprland-plugins.spec ++++++
--- /var/tmp/diff_new_pack.V00cwl/_old  2026-10-30 18:21:27.486269145 +0100
+++ /var/tmp/diff_new_pack.V00cwl/_new  2026-10-30 18:21:27.488269229 +0100
@@ -15,8 +15,8 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
-%define hypr_tgt 0.56.0
-%define pkg_version 0.56.0
+%define hypr_tgt 0.57.0
+%define pkg_version 0.57.0
 
 Name:           hyprland-plugins
 Version:        %{pkg_version}

++++++ hyprland-plugins-0.56.0.tar.gz -> hyprland-plugins-0.57.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/.gitignore 
new/hyprland-plugins-0.57.0/.gitignore
--- old/hyprland-plugins-0.56.0/.gitignore      2026-07-15 09:59:07.000000000 
+0200
+++ new/hyprland-plugins-0.57.0/.gitignore      2026-10-20 17:00:53.000000000 
+0200
@@ -39,4 +39,7 @@
 result-man
 
 build/
-.cache/
\ No newline at end of file
+.cache/
+
+.direnv/
+.envrc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hyprland-plugins-0.56.0/borders-plus-plus/BorderppPassElement.cpp 
new/hyprland-plugins-0.57.0/borders-plus-plus/BorderppPassElement.cpp
--- old/hyprland-plugins-0.56.0/borders-plus-plus/BorderppPassElement.cpp       
2026-07-15 09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/borders-plus-plus/BorderppPassElement.cpp       
2026-10-20 17:00:53.000000000 +0200
@@ -7,15 +7,15 @@
     ;
 }
 
-std::vector<UP<IPassElement>> CBorderPPPassElement::draw() {
-    data.deco->drawPass(g_pHyprRenderer->m_renderData.pMonitor.lock(), data.a);
+std::vector<UP<IPassElement>> 
CBorderPPPassElement::draw(Render::CRenderContext& ctx) {
+    data.deco->drawPass(ctx, ctx.m_data.pMonitor.lock(), data.a);
     return {};
 }
 
-bool CBorderPPPassElement::needsLiveBlur() {
+bool CBorderPPPassElement::needsLiveBlur(Render::CRenderContext& ctx) {
     return false;
 }
 
-bool CBorderPPPassElement::needsPrecomputeBlur() {
+bool CBorderPPPassElement::needsPrecomputeBlur(Render::CRenderContext& ctx) {
     return false;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hyprland-plugins-0.56.0/borders-plus-plus/BorderppPassElement.hpp 
new/hyprland-plugins-0.57.0/borders-plus-plus/BorderppPassElement.hpp
--- old/hyprland-plugins-0.56.0/borders-plus-plus/BorderppPassElement.hpp       
2026-07-15 09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/borders-plus-plus/BorderppPassElement.hpp       
2026-10-20 17:00:53.000000000 +0200
@@ -13,9 +13,9 @@
     CBorderPPPassElement(const SBorderPPData& data_);
     virtual ~CBorderPPPassElement() = default;
 
-    virtual std::vector<UP<IPassElement>> draw() override;
-    virtual bool                          needsLiveBlur() override;
-    virtual bool                          needsPrecomputeBlur() override;
+    virtual std::vector<UP<IPassElement>> draw(Render::CRenderContext& ctx) 
override;
+    virtual bool                          
needsLiveBlur(Render::CRenderContext& ctx) override;
+    virtual bool                          
needsPrecomputeBlur(Render::CRenderContext& ctx) override;
 
     virtual const char*                   passName() override {
         return "CBorderPPPassElement";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hyprland-plugins-0.56.0/borders-plus-plus/borderDeco.cpp 
new/hyprland-plugins-0.57.0/borders-plus-plus/borderDeco.cpp
--- old/hyprland-plugins-0.56.0/borders-plus-plus/borderDeco.cpp        
2026-07-15 09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/borders-plus-plus/borderDeco.cpp        
2026-10-20 17:00:53.000000000 +0200
@@ -3,7 +3,8 @@
 #include <algorithm>
 
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/view/Window.hpp>
+#include <hyprland/src/desktop/view/window/Window.hpp>
+#include <hyprland/src/desktop/view/window/WindowPresentation.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprutils/memory/Casts.hpp>
 using namespace Hyprutils::Memory;
@@ -25,6 +26,8 @@
 }
 
 SDecorationPositioningInfo CBordersPlusPlus::getPositioningInfo() {
+    const auto                 PWINDOW = m_pWindow.lock();
+
     SDecorationPositioningInfo info;
     info.policy   = DECORATION_POSITION_STICKY;
     info.reserved = true;
@@ -40,6 +43,8 @@
 
         info.desiredExtents = {{size, size}, {size, size}};
         m_fLastThickness    = size;
+    } else if (!PWINDOW->m_ruleApplicator->decorate().valueOrDefault()) {
+        info.desiredExtents = {{0, 0}, {0, 0}};
     } else
         info.desiredExtents = {{m_fLastThickness, m_fLastThickness}, 
{m_fLastThickness, m_fLastThickness}};
 
@@ -62,7 +67,7 @@
     return "Borders++";
 }
 
-void CBordersPlusPlus::draw(PHLMONITOR pMonitor, const float& a) {
+void CBordersPlusPlus::draw(Render::CRenderContext& ctx, PHLMONITOR pMonitor, 
float const& a, const Render::SWindowRenderPresentation& presentation) {
     if (!validMapped(m_pWindow))
         return;
 
@@ -74,10 +79,10 @@
     CBorderPPPassElement::SBorderPPData data;
     data.deco = this;
 
-    g_pHyprRenderer->m_renderPass.add(makeUnique<CBorderPPPassElement>(data));
+    g_pHyprRenderer->addPassElement(ctx, 
makeUnique<CBorderPPPassElement>(data));
 }
 
-void CBordersPlusPlus::drawPass(PHLMONITOR pMonitor, const float& a) {
+void CBordersPlusPlus::drawPass(Render::CRenderContext& ctx, PHLMONITOR 
pMonitor, const float& a) {
     const auto  PWINDOW = m_pWindow.lock();
 
     static auto PROUNDING   = 
CConfigValue<Config::INTEGER>("decoration:rounding");
@@ -93,16 +98,16 @@
         return;
 
     const auto PWORKSPACE      = PWINDOW->m_workspace;
-    const auto WORKSPACEOFFSET = PWORKSPACE && !PWINDOW->m_pinned ? 
PWORKSPACE->m_renderOffset->value() : Vector2D();
+    const auto WORKSPACEOFFSET = PWORKSPACE && !(PWINDOW->m_state & 
Desktop::View::WINDOW_STATE_PINNED) ? PWORKSPACE->m_renderOffset->value() : 
Vector2D();
 
-    auto       rounding      = PWINDOW->rounding() == 0 ? 0 : 
(PWINDOW->rounding() + *PBORDERSIZE) * pMonitor->m_scale;
-    const auto ROUNDINGPOWER = PWINDOW->roundingPower();
-    const auto ORIGINALROUND = rounding == 0 ? 0 : (PWINDOW->rounding() + 
*PBORDERSIZE) * pMonitor->m_scale;
+    auto       rounding      = PWINDOW->presentation().rounding() == 0 ? 0 : 
(PWINDOW->presentation().rounding() + *PBORDERSIZE) * pMonitor->m_scale;
+    const auto ROUNDINGPOWER = PWINDOW->presentation().roundingPower();
+    const auto ORIGINALROUND = rounding == 0 ? 0 : 
(PWINDOW->presentation().rounding() + *PBORDERSIZE) * pMonitor->m_scale;
 
     CBox       fullBox = m_bAssignedGeometry;
     
fullBox.translate(g_pDecorationPositioner->getEdgeDefinedPoint(DECORATION_EDGE_BOTTOM
 | DECORATION_EDGE_LEFT | DECORATION_EDGE_RIGHT | DECORATION_EDGE_TOP, 
m_pWindow.lock()));
 
-    fullBox.translate(PWINDOW->m_floatingOffset - pMonitor->m_position + 
WORKSPACEOFFSET);
+    fullBox.translate(PWINDOW->presentation().floatingOffset() - 
pMonitor->m_position + WORKSPACEOFFSET);
 
     if (fullBox.width < 1 || fullBox.height < 1)
         return;
@@ -131,14 +136,14 @@
         if (fullBox.width < 1 || fullBox.height < 1)
             break;
 
-        g_pHyprOpenGL->scissor(nullptr);
+        g_pHyprOpenGL->scissor(ctx, nullptr);
 
-        g_pHyprOpenGL->renderBorder(fullBox, 
CHyprColor{static_cast<uint64_t>(vars.borderColors[i]->value())},
-                                    {.round         = NATURALROUND ? 
sc<int>(ORIGINALROUND) : sc<int>(rounding),
-                                     .roundingPower = ROUNDINGPOWER,
-                                     .borderSize    = THISBORDERSIZE,
-                                     .a             = a,
-                                     .outerRound    = NATURALROUND ? 
sc<int>(ORIGINALROUND) : -1});
+        g_pHyprOpenGL->renderBorder(ctx, fullBox, 
Config::CGradientValueData(CHyprColor{static_cast<uint64_t>(vars.borderColors[i]->value())}),
+                                    CHyprOpenGLImpl::SBorderRenderData{.round  
       = NATURALROUND ? sc<int>(ORIGINALROUND) : sc<int>(rounding),
+                                                                       
.roundingPower = ROUNDINGPOWER,
+                                                                       
.borderSize    = THISBORDERSIZE,
+                                                                       .a      
       = a,
+                                                                       
.outerRound    = NATURALROUND ? sc<int>(ORIGINALROUND) : -1});
     }
 
     m_seExtents = {{fullThickness, fullThickness}, {fullThickness, 
fullThickness}};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hyprland-plugins-0.56.0/borders-plus-plus/borderDeco.hpp 
new/hyprland-plugins-0.57.0/borders-plus-plus/borderDeco.hpp
--- old/hyprland-plugins-0.56.0/borders-plus-plus/borderDeco.hpp        
2026-07-15 09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/borders-plus-plus/borderDeco.hpp        
2026-10-20 17:00:53.000000000 +0200
@@ -13,7 +13,7 @@
 
     virtual void                       onPositioningReply(const 
SDecorationPositioningReply& reply);
 
-    virtual void                       draw(PHLMONITOR, float const& a);
+    virtual void                       draw(Render::CRenderContext& ctx, 
PHLMONITOR pMonitor, float const& a, const Render::SWindowRenderPresentation& 
presentation) override;
 
     virtual eDecorationType            getDecorationType();
 
@@ -28,7 +28,7 @@
     virtual std::string                getDisplayName();
 
   private:
-    void         drawPass(PHLMONITOR, float const& a);
+    void         drawPass(Render::CRenderContext& ctx, PHLMONITOR, float 
const& a);
 
     SBoxExtents  m_seExtents;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/borders-plus-plus/main.cpp 
new/hyprland-plugins-0.57.0/borders-plus-plus/main.cpp
--- old/hyprland-plugins-0.56.0/borders-plus-plus/main.cpp      2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/borders-plus-plus/main.cpp      2026-10-20 
17:00:53.000000000 +0200
@@ -5,7 +5,8 @@
 #include <any>
 #include <array>
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/view/Window.hpp>
+#include <hyprland/src/desktop/view/window/Window.hpp>
+#include <hyprland/src/desktop/view/window/WindowPresentation.hpp>
 #include <hyprland/src/desktop/state/WindowState.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
@@ -20,10 +21,10 @@
 }
 
 static void onNewWindow(PHLWINDOW window) {
-    if (std::ranges::any_of(window->m_windowDecorations, [](const auto& d) { 
return d->getDisplayName() == "Borders++"; }))
+    if (std::ranges::any_of(window->presentation().decorations(), [](const 
auto& d) { return d->getDisplayName() == "Borders++"; }))
         return;
 
-    HyprlandAPI::addWindowDecoration(PHANDLE, window, 
makeUnique<CBordersPlusPlus>(window));
+    HyprlandAPI::addWindowDecoration(PHANDLE, window, 
makeShared<CBordersPlusPlus>(window));
 }
 
 APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
@@ -65,10 +66,10 @@
 
     // add deco to existing windows
     for (auto& w : Desktop::windowState()->windows()) {
-        if (w->isHidden() || !w->m_isMapped)
+        if (w->isHidden() || !validMapped(w))
             continue;
 
-        HyprlandAPI::addWindowDecoration(PHANDLE, w, 
makeUnique<CBordersPlusPlus>(w));
+        HyprlandAPI::addWindowDecoration(PHANDLE, w, 
makeShared<CBordersPlusPlus>(w));
     }
 
     HyprlandAPI::addNotification(PHANDLE, "[borders-plus-plus] Initialized 
successfully!", CHyprColor{0.2, 1.0, 0.2, 1.0}, 5000);
@@ -77,5 +78,5 @@
 }
 
 APICALL EXPORT void PLUGIN_EXIT() {
-    g_pHyprRenderer->m_renderPass.removeAllOfType("CBorderPPPassElement");
+    g_pHyprRenderer->context().m_pass.removeAllOfType("CBorderPPPassElement");
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/csgo-vulkan-fix/main.cpp 
new/hyprland-plugins-0.57.0/csgo-vulkan-fix/main.cpp
--- old/hyprland-plugins-0.56.0/csgo-vulkan-fix/main.cpp        2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/csgo-vulkan-fix/main.cpp        2026-10-20 
17:00:53.000000000 +0200
@@ -5,7 +5,7 @@
 #include <hyprland/src/Compositor.hpp>
 #include <hyprland/src/desktop/state/FocusState.hpp>
 #include <hyprland/src/desktop/state/WindowQuery.hpp>
-#include <hyprland/src/desktop/view/Window.hpp>
+#include <hyprland/src/desktop/view/window/Window.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
 #include <hyprland/src/xwayland/XSurface.hpp>
 #include <hyprland/src/managers/SeatManager.hpp>
@@ -21,9 +21,6 @@
 #include <lauxlib.h>
 }
 
-#include <hyprutils/string/ConstVarList.hpp>
-using namespace Hyprutils::String;
-
 // Methods
 inline CFunctionHook* g_pMouseMotionHook     = nullptr;
 inline CFunctionHook* g_pSurfaceSizeHook     = nullptr;
@@ -63,12 +60,12 @@
     auto               window     = focusState->window();
     auto               monitor    = focusState->monitor();
 
-    const auto         CONFIG = window && monitor ? 
getAppConfig(window->m_initialClass) : nullptr;
+    const auto         CONFIG = window && monitor ? 
getAppConfig(window->metadata().initialAppID()) : nullptr;
 
     if (configValues.fixMouse->value() && CONFIG) {
         // fix the coords
-        newCoords.x *= (CONFIG->res.x / monitor->m_size.x) / 
window->m_X11SurfaceScaledBy;
-        newCoords.y *= (CONFIG->res.y / monitor->m_size.y) / 
window->m_X11SurfaceScaledBy;
+        newCoords.x *= (CONFIG->res.x / monitor->m_size.x) / 
window->backend().surfaceScale();
+        newCoords.y *= (CONFIG->res.y / monitor->m_size.y) / 
window->backend().surfaceScale();
     }
 
     (*(origMotion)g_pMouseMotionHook->m_original)(thisptr, time_msec, 
newCoords);
@@ -91,7 +88,7 @@
         return;
     }
 
-    if (const auto CONFIG = getAppConfig(PWINDOW->m_initialClass); CONFIG) {
+    if (const auto CONFIG = getAppConfig(PWINDOW->metadata().initialAppID()); 
CONFIG) {
         newBox.w = CONFIG->res.x;
         newBox.h = CONFIG->res.y;
 
@@ -106,7 +103,7 @@
 
     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);
+        const auto CONFIG = getAppConfig(WINDOW->metadata().initialAppID());
 
         if (CONFIG) {
             const auto PMONITOR = WINDOW->m_monitor.lock();
@@ -130,7 +127,7 @@
         Hyprutils::Utils::CScopeGuard x([L] { lua_pop(L, 1); });
 
         lua_getfield(L, 1, "app");
-        
+
         if (!lua_isstring(L, -1))
             return Config::Lua::Bindings::Internal::configError(L, "vkfix_app: 
app must be a class string");
 
@@ -141,7 +138,7 @@
         Hyprutils::Utils::CScopeGuard x([L] { lua_pop(L, 1); });
 
         lua_getfield(L, 1, "w");
-        
+
         if (!lua_isinteger(L, -1))
             return Config::Lua::Bindings::Internal::configError(L, "vkfix_app: 
w must be an integer");
 
@@ -152,7 +149,7 @@
         Hyprutils::Utils::CScopeGuard x([L] { lua_pop(L, 1); });
 
         lua_getfield(L, 1, "h");
-        
+
         if (!lua_isinteger(L, -1))
             return Config::Lua::Bindings::Internal::configError(L, "vkfix_app: 
h must be an integer");
 
@@ -178,39 +175,7 @@
 
     static auto P = Event::bus()->m_events.config.preReload.listen([&] { 
g_appConfigs.clear(); });
 
-    if (Config::mgr()->type() == Config::CONFIG_LEGACY) {
-        HyprlandAPI::addConfigKeyword(
-            PHANDLE, "vkfix-app",
-            [](const char* l, const char* r) -> Hyprlang::CParseResult {
-                const std::string      str = r;
-                CConstVarList          data(str, 0, ',', true);
-
-                Hyprlang::CParseResult result;
-
-                if (data.size() != 3) {
-                    result.setError("vkfix-app requires 3 params");
-                    return result;
-                }
-
-                try {
-                    SAppConfig config;
-                    config.szClass = data[0];
-                    config.res     = Vector2D{std::stoi(std::string{data[1]}), 
std::stoi(std::string{data[2]})};
-                    g_appConfigs.emplace_back(std::move(config));
-                } catch (std::exception& e) {
-                    result.setError("failed to parse line");
-                    return result;
-                }
-
-                return result;
-            },
-            Hyprlang::SHandlerOptions{});
-    } else if (Config::mgr()->type() == Config::CONFIG_LUA) {
-        HyprlandAPI::addLuaFunction(PHANDLE, "csgo_vulkan_fix", "vkfix_app", 
::vkfixAppLua);
-    } else {
-        HyprlandAPI::addNotification(PHANDLE, "[csgo-vulkan-fix] Failure in 
initialization: Failed to get a valid config manager", CHyprColor{1.0, 0.2, 
0.2, 1.0}, 5000);
-        throw std::runtime_error("[vkfix] Config manager bad");
-    }
+    HyprlandAPI::addLuaFunction(PHANDLE, "csgo_vulkan_fix", "vkfix_app", 
::vkfixAppLua);
 
     configValues.fixMouse =
         
makeShared<Config::Values::CBoolValue>("plugin:csgo_vulkan_fix:fix_mouse", 
"Whether to fix the mouse position. A select few apps might be wonky with 
this.", true);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/flake.lock 
new/hyprland-plugins-0.57.0/flake.lock
--- old/hyprland-plugins-0.56.0/flake.lock      2026-07-15 09:59:07.000000000 
+0200
+++ new/hyprland-plugins-0.57.0/flake.lock      2026-10-20 17:00:53.000000000 
+0200
@@ -20,11 +20,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1777499565,
-        "narHash": "sha256-nU55VWk99Pn1QzQDDjFISocC4SgDZ3Xp+zb6ji3JclM=",
+        "lastModified": 1787400831,
+        "narHash": "sha256-H3MEkFDZf+UH+QrVgW8TdKrssPFltF8fBg/rh0J1zIc=",
         "owner": "hyprwm",
         "repo": "aquamarine",
-        "rev": "813c1e8981893c11e118b19c125d6bc282f51765",
+        "rev": "7ce889cb78b97979b83a4648509fc3ef405c3286",
         "type": "github"
       },
       "original": {
@@ -49,28 +49,6 @@
         "type": "github"
       }
     },
-    "gitignore": {
-      "inputs": {
-        "nixpkgs": [
-          "hyprland",
-          "pre-commit-hooks",
-          "nixpkgs"
-        ]
-      },
-      "locked": {
-        "lastModified": 1709087332,
-        "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
-        "owner": "hercules-ci",
-        "repo": "gitignore.nix",
-        "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
-        "type": "github"
-      },
-      "original": {
-        "owner": "hercules-ci",
-        "repo": "gitignore.nix",
-        "type": "github"
-      }
-    },
     "hyprcursor": {
       "inputs": {
         "hyprlang": [
@@ -87,11 +65,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1776511930,
-        "narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
+        "lastModified": 1786464181,
+        "narHash": "sha256-2alOMkLjXANh7unkZnYnCF2K2rApZaOLMoQ3o+VX2CY=",
         "owner": "hyprwm",
         "repo": "hyprcursor",
-        "rev": "39435900785d0c560c6ae8777d29f28617d031ef",
+        "rev": "e4ed7c08123df5af460a0a70961380cbfb872f76",
         "type": "github"
       },
       "original": {
@@ -116,11 +94,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1776426399,
-        "narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
+        "lastModified": 1786464367,
+        "narHash": "sha256-k58p4wbzIXWyRWrW84pP8tD+iaZSSYiiM+fr0Auk4oU=",
         "owner": "hyprwm",
         "repo": "hyprgraphics",
-        "rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
+        "rev": "7c895c44e3ca6d28ed68ddd80ec02b02b925e7fc",
         "type": "github"
       },
       "original": {
@@ -146,11 +124,11 @@
         "xdph": "xdph"
       },
       "locked": {
-        "lastModified": 1778588655,
-        "narHash": "sha256-7zcsu103YzjuBBx3ToFodHBQl8W3e5GBu8C915I538Y=",
+        "lastModified": 1787584490,
+        "narHash": "sha256-n5pRDrqMLDSoVJ3fc2DR7hL8bxXJwuPm391j+9Vswbk=",
         "owner": "hyprwm",
         "repo": "Hyprland",
-        "rev": "d61c96913cbe3c3f9aacc198b1f1e6489349615d",
+        "rev": "d8504461f0e9f95a5df9a0cdc0723d0ca6332888",
         "type": "github"
       },
       "original": {
@@ -192,11 +170,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1776426575,
-        "narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
+        "lastModified": 1786464504,
+        "narHash": "sha256-7sHwM86KILQyHDHDuE2SDBlQ2jvZ0EW3hY7sW009/cg=",
         "owner": "hyprwm",
         "repo": "hyprland-guiutils",
-        "rev": "a968d211048e3ed538e47b84cb3649299578f19d",
+        "rev": "4c30cf3097ea963c0e250749ee0c59f8b08816d6",
         "type": "github"
       },
       "original": {
@@ -246,11 +224,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1777320127,
-        "narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
+        "lastModified": 1786464129,
+        "narHash": "sha256-339AkTlpMYSIvFuG0rnR+8Yg4/AZKeJalshJavlnKfg=",
         "owner": "hyprwm",
         "repo": "hyprlang",
-        "rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
+        "rev": "9508458be316a0d70d37ebed1ab725ccd10411ff",
         "type": "github"
       },
       "original": {
@@ -298,11 +276,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1772462885,
-        "narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
+        "lastModified": 1785930473,
+        "narHash": "sha256-DitTu625BhEYpZjtjxtGpjrEJwPwW+X/+jJvhSZNSJM=",
         "owner": "hyprwm",
         "repo": "hyprtoolkit",
-        "rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
+        "rev": "af515b69dfbe366dc7873aa1475cb2f4db3ebad7",
         "type": "github"
       },
       "original": {
@@ -323,11 +301,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1778234770,
-        "narHash": "sha256-jAcsogZwWMfXT9MfXxZzkwliAqIuZUV0p71h6Ba9ReE=",
+        "lastModified": 1786903207,
+        "narHash": "sha256-QTwMqLLONRhv9iz6CVeuX6BqQNQCIqI8hL/cPYlR/24=",
         "owner": "hyprwm",
         "repo": "hyprutils",
-        "rev": "a2dbd8a4cc51f7cbe4224732668392bb1aa79df2",
+        "rev": "6cf50415e06dc6bd9f1252f1b745eac6b4a1cc39",
         "type": "github"
       },
       "original": {
@@ -348,11 +326,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1777159683,
-        "narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
+        "lastModified": 1786464033,
+        "narHash": "sha256-QM8Qe4/L8lpdVN4bgwahmi+jyyc4fisseDMe4afcDxA=",
         "owner": "hyprwm",
         "repo": "hyprwayland-scanner",
-        "rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
+        "rev": "62e62c1ca23da17612c6890d4ad2064f575643db",
         "type": "github"
       },
       "original": {
@@ -377,11 +355,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1777388329,
-        "narHash": "sha256-40YxVGF2rA9iH3D7am5fy4EOSBbMgpJtJ9yhl0Cx+qI=",
+        "lastModified": 1786464294,
+        "narHash": "sha256-ZQsZ2WvBdkboCIyh8LStDPdAIARmxzn0XMNxxoOhjPE=",
         "owner": "hyprwm",
         "repo": "hyprwire",
-        "rev": "04be2897e05f9b271d532b5ae56ca088d2eeac02",
+        "rev": "4ce7cd6b6128c1ac41caf23c58a30a26b327f9dd",
         "type": "github"
       },
       "original": {
@@ -392,11 +370,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1777954456,
-        "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
+        "lastModified": 1787360063,
+        "narHash": "sha256-dt4WdcvsA8/RCe+VZZwqU0X+XMM3wBbGCWA0/sFWzGo=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
+        "rev": "2c423e03bbafcff28bfadc6781a4a8257f205cb5",
         "type": "github"
       },
       "original": {
@@ -409,18 +387,17 @@
     "pre-commit-hooks": {
       "inputs": {
         "flake-compat": "flake-compat",
-        "gitignore": "gitignore",
         "nixpkgs": [
           "hyprland",
           "nixpkgs"
         ]
       },
       "locked": {
-        "lastModified": 1776796298,
-        "narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=",
+        "lastModified": 1784288435,
+        "narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=",
         "owner": "cachix",
         "repo": "git-hooks.nix",
-        "rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad",
+        "rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9",
         "type": "github"
       },
       "original": {
@@ -485,11 +462,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1777585783,
-        "narHash": "sha256-JTeWRy42VElroJ0rVdZuVXSoTLsx+NzQfGPKMbtn3SU=",
+        "lastModified": 1786988229,
+        "narHash": "sha256-frEFLVRj8xXvBBDs44IRiqHo6R2PxsRpluygL7abjjI=",
         "owner": "hyprwm",
         "repo": "xdg-desktop-portal-hyprland",
-        "rev": "fa50d6fbaff8f42c61071b87b034a90d82a33558",
+        "rev": "59d429bf45aed4e2209043c0c36565ad8e2859a5",
         "type": "github"
       },
       "original": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/BarPassElement.cpp 
new/hyprland-plugins-0.57.0/hyprbars/BarPassElement.cpp
--- old/hyprland-plugins-0.56.0/hyprbars/BarPassElement.cpp     2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/BarPassElement.cpp     2026-10-20 
17:00:53.000000000 +0200
@@ -9,12 +9,12 @@
     ;
 }
 
-std::vector<UP<IPassElement>> CBarPassElement::draw() {
-    data.deco->renderPass(g_pHyprRenderer->m_renderData.pMonitor.lock(), 
data.a);
+std::vector<UP<IPassElement>> CBarPassElement::draw(Render::CRenderContext& 
ctx) {
+    data.deco->renderPass(ctx, ctx.m_data.pMonitor.lock(), data.a);
     return {};
 }
 
-bool CBarPassElement::needsLiveBlur() {
+bool CBarPassElement::needsLiveBlur(Render::CRenderContext&) {
     static auto PENABLEBLURGLOBAL = 
CConfigValue<Config::BOOL>("decoration:blur:enabled");
 
     CHyprColor  color = 
data.deco->m_bForcedBarColor.value_or(CHyprColor{static_cast<uint64_t>(g_pGlobalState->config.barColor->value())});
@@ -24,11 +24,11 @@
     return SHOULDBLUR;
 }
 
-std::optional<CBox> CBarPassElement::boundingBox() {
+std::optional<CBox> CBarPassElement::boundingBox(Render::CRenderContext& ctx) {
     // Temporary fix: expand the bar bb a bit, otherwise occlusion gets too 
aggressive.
-    return 
data.deco->assignedBoxGlobal().translate(-g_pHyprRenderer->m_renderData.pMonitor->m_position).expand(10);
+    return 
data.deco->assignedBoxGlobal().translate(-ctx.m_data.pMonitor->m_position).expand(10);
 }
 
-bool CBarPassElement::needsPrecomputeBlur() {
+bool CBarPassElement::needsPrecomputeBlur(Render::CRenderContext&) {
     return false;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/BarPassElement.hpp 
new/hyprland-plugins-0.57.0/hyprbars/BarPassElement.hpp
--- old/hyprland-plugins-0.56.0/hyprbars/BarPassElement.hpp     2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/BarPassElement.hpp     2026-10-20 
17:00:53.000000000 +0200
@@ -13,10 +13,10 @@
     CBarPassElement(const SBarData& data_);
     virtual ~CBarPassElement() = default;
 
-    virtual std::vector<UP<IPassElement>> draw() override;
-    virtual bool                          needsLiveBlur() override;
-    virtual bool                          needsPrecomputeBlur() override;
-    virtual std::optional<CBox>           boundingBox() override;
+    virtual std::vector<UP<IPassElement>> draw(Render::CRenderContext& ctx) 
override;
+    virtual bool                          
needsLiveBlur(Render::CRenderContext&) override;
+    virtual bool                          
needsPrecomputeBlur(Render::CRenderContext&) override;
+    virtual std::optional<CBox>           boundingBox(Render::CRenderContext& 
ctx) override;
 
     virtual const char*                   passName() override {
         return "CBarPassElement";
@@ -28,4 +28,4 @@
 
   private:
     SBarData data;
-};
\ No newline at end of file
+};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/README.md 
new/hyprland-plugins-0.57.0/hyprbars/README.md
--- old/hyprland-plugins-0.56.0/hyprbars/README.md      2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/README.md      2026-10-20 
17:00:53.000000000 +0200
@@ -43,6 +43,7 @@
 `bar_padding` | int | left / right edge padding | `7`
 `bar_button_padding` | int | padding between the buttons | `5`
 `icon_on_hover` | bool | whether the icons show on mouse hovering over the 
buttons | `false`
+`buttons_on_hover` | bool | whether the buttons are only drawn while the 
cursor is over the bar | `false`
 `inactive_button_color` | col | buttons bg color when window isn't focused
 `on_double_click` | str | command to run on double click of the bar (not on a 
button)
 
@@ -74,7 +75,7 @@
     fg_color = "rgb(ffffff)",
     size = 10,
     icon = "X",
-    action = "hyprctl dispatch killactive",
+    action = "hyprctl dispatch 'hl.dsp.window.close()'",
 })
 
 hl.plugin.hyprbars.add_button({
@@ -82,10 +83,20 @@
     fg_color = "rgb(000000)",
     size = 10,
     icon = "_",
-    action = "hyprctl dispatch fullscreen 1",
+    action = [[hyprctl dispatch 'hl.dsp.window.fullscreen({ mode = 
"maximized", action = "toggle" })']],
 })
 ```
 
+`hl.plugin.hyprbars.set_title` shows a title of your choosing in a window's bar
+in place of the window's own. It takes a window or a window selector, and the
+title; leaving the title out shows the window's own title again. From a script,
+call it through `hyprctl eval`:
+
+```bash
+hyprctl eval 'hl.plugin.hyprbars.set_title("address:0x55d1a2b3c4d0", "Notes")'
+hyprctl eval 'hl.plugin.hyprbars.set_title("address:0x55d1a2b3c4d0")'
+```
+
 ## Window rules
 
 Hyprbars supports the following _dynamic_ [window 
rules](https://wiki.hypr.land/Configuring/Window-Rules/):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/barDeco.cpp 
new/hyprland-plugins-0.57.0/hyprbars/barDeco.cpp
--- old/hyprland-plugins-0.56.0/hyprbars/barDeco.cpp    2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/barDeco.cpp    2026-10-20 
17:00:53.000000000 +0200
@@ -5,9 +5,11 @@
 #include <hyprland/src/desktop/state/WindowState.hpp>
 #include <hyprland/src/desktop/state/LayerState.hpp>
 #include <hyprland/src/desktop/state/ViewHitTester.hpp>
-#include <hyprland/src/desktop/view/Window.hpp>
+#include <hyprland/src/desktop/view/window/Window.hpp>
+#include <hyprland/src/desktop/view/window/WindowPresentation.hpp>
 #include <hyprland/src/desktop/view/LayerSurface.hpp>
 #include <hyprland/src/helpers/MiscFunctions.hpp>
+#include <hyprland/src/keybinds/Manager.hpp>
 #include <hyprland/src/managers/SeatManager.hpp>
 #include <hyprland/src/managers/input/InputManager.hpp>
 #include <hyprland/src/render/Renderer.hpp>
@@ -31,7 +33,7 @@
 using namespace Render::GL;
 
 static CHyprColor configColor(Config::INTEGER color) {
-    return CHyprColor{static_cast<uint64_t>(color)};
+    return CHyprColor{sc<uint64_t>(color)};
 }
 
 CHyprBar::CHyprBar(PHLWINDOW pWindow) : IHyprWindowDecoration(pWindow) {
@@ -68,7 +70,7 @@
     info.edges          = DECORATION_EDGE_TOP;
     info.priority       = PRECEDENCE ? 10005 : 5000;
     info.reserved       = true;
-    info.desiredExtents = {{0, m_hidden || !ENABLED ? 0 : HEIGHT}, {0, 0}};
+    info.desiredExtents = {{0, sc<int>(m_hidden || !ENABLED ? 0 : HEIGHT)}, 
{0, 0}};
     return info;
 }
 
@@ -84,7 +86,7 @@
 }
 
 bool CHyprBar::inputIsValid() {
-    if (m_hidden)
+    if (!g_pGlobalState->config.enabled->value() || m_hidden)
         return false;
 
     if (g_pSeatManager->m_seatGrab && 
!g_pSeatManager->m_seatGrab->accepts(m_pWindow->wlSurface()->resource()))
@@ -154,6 +156,18 @@
     if (g_pGlobalState->config.iconOnHover->value())
         damageOnButtonHover();
 
+    // buttons_on_hover: the buttons only exist while the cursor is over the 
bar,
+    // so the whole bar has to be redrawn as the cursor crosses its edge.
+    if (g_pGlobalState->config.buttonsOnHover->value()) {
+        const auto BOX     = assignedBoxGlobal();
+        const auto COORDS  = cursorRelativeToBar();
+        const bool HOVERED = VECINRECT(COORDS, 0, 0, BOX.w, BOX.h);
+        if (HOVERED != m_bBarHovered) {
+            m_bBarHovered = HOVERED;
+            damageEntire();
+        }
+    }
+
     if (!m_bDragPending || m_bTouchEv || !validMapped(m_pWindow) || m_touchId 
!= 0)
         return;
 
@@ -165,19 +179,15 @@
     if (!m_bDragPending || !m_bTouchEv || !validMapped(m_pWindow) || e.touchID 
!= m_touchId)
         return;
 
-    auto PMONITOR     = m_pWindow->m_monitor.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) {
         // Initial setup for dragging a window.
-        g_pKeybindManager->m_dispatchers["setfloating"]("activewindow");
-        g_pKeybindManager->m_dispatchers["resizewindowpixel"]("exact 50% 
50%,activewindow");
-        // pin it so you can change workspaces while dragging a window
-        g_pKeybindManager->m_dispatchers["pin"]("activewindow");
+        
(void)Config::Actions::floatWindow(Config::Actions::eTogglableAction::TOGGLE_ACTION_ENABLE,
 m_pWindow.lock());
+        // Pin it so you can change workspaces while dragging a window
+        
(void)Config::Actions::pinWindow(Config::Actions::eTogglableAction::TOGGLE_ACTION_ENABLE,
 m_pWindow.lock());
+
+        g_layoutManager->beginDragTarget(m_pWindow.lock()->layoutTarget(), 
MBIND_MOVE);
+        m_bDraggingThis = true;
     }
-    g_pKeybindManager->m_dispatchers["movewindowpixel"](std::format("exact {} 
{},activewindow", (int)(COORDS.x - (assignedBoxGlobal().w / 2)), 
(int)COORDS.y));
-    m_bDraggingThis = true;
 }
 
 void CHyprBar::handleDownEvent(Event::SCallbackInfo& info, 
std::optional<ITouch::SDownEvent> touchEvent) {
@@ -213,9 +223,9 @@
 
         if (m_bDraggingThis) {
             if (m_bTouchEv)
-                g_pKeybindManager->m_dispatchers["settiled"]("activewindow");
-            g_pKeybindManager->m_dispatchers["mouse"]("0movewindow");
-            Log::logger->log(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)PWINDOW.get());
+                
(void)Config::Actions::floatWindow(Config::Actions::eTogglableAction::TOGGLE_ACTION_DISABLE);
+            g_layoutManager->endDragTarget();
+            LOG(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)PWINDOW.get());
         }
 
         m_bDraggingThis = false;
@@ -224,10 +234,14 @@
         return;
     }
 
+    // don't swallow clicks meant for xdg popups (e.g. context menus) 
overlapping the bar
+    if (PWINDOW->hasPopupAt(COORDS + assignedBoxGlobal().pos()))
+        return;
+
     if (Desktop::focusState()->window() != PWINDOW)
         Desktop::focusState()->fullWindowFocus(PWINDOW, 
Desktop::FOCUS_REASON_CLICK);
 
-    if (PWINDOW->m_isFloating)
+    if (PWINDOW->isFloating())
         Desktop::windowState()->raise(PWINDOW);
 
     info.cancelled   = true;
@@ -256,12 +270,12 @@
     m_bCancelledDown = false;
 
     if (m_bDraggingThis) {
-        g_pKeybindManager->changeMouseBindMode(MBIND_INVALID);
+        g_layoutManager->endDragTarget();
         m_bDraggingThis = false;
         if (m_bTouchEv)
             
(void)Config::Actions::floatWindow(Config::Actions::eTogglableAction::TOGGLE_ACTION_DISABLE);
 
-        Log::logger->log(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)m_pWindow.lock().get());
+        LOG(Log::DEBUG, "[hyprbars] Dragging ended on {:x}", 
(uintptr_t)m_pWindow.lock().get());
     }
 
     m_bDragPending = false;
@@ -270,9 +284,9 @@
 }
 
 void CHyprBar::handleMovement() {
-    g_pKeybindManager->changeMouseBindMode(MBIND_MOVE);
+    g_layoutManager->beginDragTarget(m_pWindow.lock()->layoutTarget(), 
MBIND_MOVE);
     m_bDraggingThis = true;
-    Log::logger->log(Log::DEBUG, "[hyprbars] Dragging initiated on {:x}", 
(uintptr_t)m_pWindow.lock().get());
+    LOG(Log::DEBUG, "[hyprbars] Dragging initiated on {:x}", 
(uintptr_t)m_pWindow.lock().get());
     return;
 }
 
@@ -281,12 +295,12 @@
     float offset = barPadding;
 
     for (auto& b : g_pGlobalState->buttons) {
-        const auto BARBUF     = Vector2D{(int)assignedBoxGlobal().w, 
barHeight};
+        const auto BARBUF     = Vector2D{assignedBoxGlobal().w, 
sc<double>(barHeight)};
         Vector2D   currentPos = Vector2D{(BUTTONSRIGHT ? BARBUF.x - 
barButtonPadding - b.size - offset : offset), (BARBUF.y - b.size) / 
2.0}.floor();
 
         if (VECINRECT(COORDS, currentPos.x, currentPos.y, currentPos.x + 
b.size + barButtonPadding, currentPos.y + b.size)) {
             // hit on close
-            g_pKeybindManager->m_dispatchers["exec"](b.cmd);
+            Config::Supplementary::executor()->spawn(b.cmd);
             return true;
         }
 
@@ -313,7 +327,7 @@
     const auto scaledButtonsSize = buttonSizes * scale;
     const auto scaledBarPadding  = BARPADDING * scale;
     const int  paddingTotal      = scaledBarPadding * 2 + scaledButtonsSize + 
(ALIGN != "left" ? scaledButtonsSize : 0);
-    const int  maxWidth          = std::clamp(static_cast<int>(bufferSize.x - 
paddingTotal), 0, INT_MAX);
+    const int  maxWidth          = std::clamp(sc<int>(bufferSize.x - 
paddingTotal), 0, INT_MAX);
 
     if (m_szLastTitle.empty() || maxWidth < 1) {
         m_pTextTex = nullptr;
@@ -340,7 +354,10 @@
     return count;
 }
 
-void CHyprBar::renderBarButtons(CBox* barBox, const float scale, const float 
a) {
+void CHyprBar::renderBarButtons(Render::CRenderContext& ctx, CBox* barBox, 
const float scale, const float a) {
+    if (g_pGlobalState->config.buttonsOnHover->value() && !m_bBarHovered)
+        return;
+
     const auto BARBUTTONPADDING = 
g_pGlobalState->config.barButtonPadding->value();
     const auto BARPADDING       = g_pGlobalState->config.barPadding->value();
     const auto ALIGNBUTTONS     = 
g_pGlobalState->config.barButtonsAlignment->value();
@@ -370,13 +387,16 @@
                           scaledButtonSize};
         buttonBox.round();
 
-        g_pHyprOpenGL->renderRect(buttonBox, color, {.round = 
static_cast<int>(std::round(scaledButtonSize / 2.0)), .roundingPower = 2.F});
+        g_pHyprOpenGL->renderRect(ctx, buttonBox, color, {.round = 
sc<int>(std::round(scaledButtonSize / 2.0)), .roundingPower = 2.F});
 
         offset += scaledButtonsPad + scaledButtonSize;
     }
 }
 
-void CHyprBar::renderBarButtonsText(CBox* barBox, const float scale, const 
float a) {
+void CHyprBar::renderBarButtonsText(Render::CRenderContext& ctx, CBox* barBox, 
const float scale, const float a) {
+    if (g_pGlobalState->config.buttonsOnHover->value() && !m_bBarHovered)
+        return;
+
     const auto HEIGHT           = g_pGlobalState->config.barHeight->value();
     const auto BARBUTTONPADDING = 
g_pGlobalState->config.barButtonPadding->value();
     const auto BARPADDING       = g_pGlobalState->config.barPadding->value();
@@ -396,16 +416,20 @@
         const auto scaledButtonsPad = BARBUTTONPADDING * scale;
 
         // check if hovering here
-        const auto BARBUF     = Vector2D{(int)assignedBoxGlobal().w, HEIGHT};
+        const auto BARBUF     = Vector2D{assignedBoxGlobal().w, 
sc<double>(HEIGHT)};
         Vector2D   currentPos = Vector2D{(BUTTONSRIGHT ? BARBUF.x - 
BARBUTTONPADDING - button.size - noScaleOffset : noScaleOffset), (BARBUF.y - 
button.size) / 2.0}.floor();
         bool       hovering   = VECINRECT(COORDS, currentPos.x, currentPos.y, 
currentPos.x + button.size + BARBUTTONPADDING, currentPos.y + button.size);
         noScaleOffset += BARBUTTONPADDING + button.size;
 
-        if ((!button.iconTex || button.iconTex->m_texID == 0) && 
!button.icon.empty()) {
+        const bool NEEDICON = !button.icon.empty() &&
+            (!button.iconTex || button.iconTex->m_texID == 0 || 
!button.m_fIconScale.has_value() || std::abs(button.m_fIconScale.value_or(0.F) 
- scale) > 1e-6);
+        if (NEEDICON) {
             // render icon
             auto fgcol = button.userfg ? button.fgcol : (button.bgcol.r + 
button.bgcol.g + button.bgcol.b < 1) ? CHyprColor(0xFFFFFFFF) : 
CHyprColor(0xFF000000);
 
-            button.iconTex = g_pHyprRenderer->renderText(button.icon, fgcol, 
std::round(button.size * 0.62 * scale), false, "sans", scaledButtonSize);
+            button.iconTex =
+                g_pHyprRenderer->renderText(button.icon, fgcol, 
std::round(button.size * 0.62 * scale), false, 
g_pGlobalState->config.barTextFont->value(), scaledButtonSize);
+            button.m_fIconScale = scale;
         }
 
         if (!button.iconTex || button.iconTex->m_texID == 0)
@@ -414,9 +438,10 @@
         const auto iconX = barBox->x + (BUTTONSRIGHT ? barBox->width - offset 
- scaledButtonSize / 2.0 : offset + scaledButtonSize / 2.0) - 
button.iconTex->m_size.x / 2.0;
         const auto iconY = barBox->y + barBox->height / 2.0 - 
button.iconTex->m_size.y / 2.0;
         CBox       pos   = {iconX, iconY, button.iconTex->m_size.x, 
button.iconTex->m_size.y};
+        pos.round(); // snap to whole pixels, otherwise the icon is sampled at 
a half-pixel offset and blurs
 
         if (!ICONONHOVER || (ICONONHOVER && m_iButtonHoverState > 0))
-            g_pHyprOpenGL->renderTexture(button.iconTex, pos, {.a = a});
+            g_pHyprOpenGL->renderTexture(ctx, button.iconTex, pos, {.a = a});
         offset += scaledButtonsPad + scaledButtonSize;
 
         bool currentBit = (m_iButtonHoverState & (1 << i)) != 0;
@@ -428,7 +453,7 @@
     }
 }
 
-void CHyprBar::draw(PHLMONITOR pMonitor, const float& a) {
+void CHyprBar::draw(Render::CRenderContext& ctx, PHLMONITOR monitor, const 
float& a, const Render::SWindowRenderPresentation& presentation) {
     const auto ENABLED = g_pGlobalState->config.enabled->value();
 
     if (m_bLastEnabledState != ENABLED) {
@@ -445,10 +470,10 @@
         return;
 
     auto data = CBarPassElement::SBarData{this, a};
-    g_pHyprRenderer->m_renderPass.add(makeUnique<CBarPassElement>(data));
+    Render::IHyprRenderer::addPassElement(ctx, 
makeUnique<CBarPassElement>(data));
 }
 
-void CHyprBar::renderPass(PHLMONITOR pMonitor, const float& a) {
+void CHyprBar::renderPass(Render::CRenderContext& ctx, PHLMONITOR pMonitor, 
const float& a) {
     const auto  PWINDOW = m_pWindow.lock();
 
     static auto PENABLEBLURGLOBAL = 
CConfigValue<Config::BOOL>("decoration:blur:enabled");
@@ -484,13 +509,13 @@
     }
 
     const auto PWORKSPACE      = PWINDOW->m_workspace;
-    const auto WORKSPACEOFFSET = PWORKSPACE && !PWINDOW->m_pinned ? 
PWORKSPACE->m_renderOffset->value() : Vector2D();
+    const auto WORKSPACEOFFSET = PWORKSPACE && !(PWINDOW->m_state & 
Desktop::View::WINDOW_STATE_PINNED) ? PWORKSPACE->m_renderOffset->value() : 
Vector2D();
 
-    const auto ROUNDING = PWINDOW->rounding() + (PRECEDENCE ? 0 : 
PWINDOW->getRealBorderSize());
+    const auto ROUNDING = PWINDOW->presentation().rounding() + (PRECEDENCE ? 0 
: PWINDOW->presentation().borderSize());
 
     const auto scaledRounding = ROUNDING > 0 ? ROUNDING * pMonitor->m_scale - 
2 /* idk why but otherwise it looks bad due to the gaps */ : 0;
 
-    m_seExtents = {{0, HEIGHT}, {}};
+    m_seExtents = {{0, sc<int>(HEIGHT)}, {}};
 
     const auto DECOBOX = assignedBoxGlobal();
 
@@ -499,17 +524,17 @@
     CBox       titleBarBox = {DECOBOX.x - pMonitor->m_position.x, DECOBOX.y - 
pMonitor->m_position.y, DECOBOX.w,
                               DECOBOX.h + ROUNDING * 3 /* to fill the bottom 
cuz we can't disable rounding there */};
 
-    
titleBarBox.translate(PWINDOW->m_floatingOffset).scale(pMonitor->m_scale).round();
+    
titleBarBox.translate(PWINDOW->presentation().floatingOffset()).scale(pMonitor->m_scale).round();
 
     if (titleBarBox.w < 1 || titleBarBox.h < 1)
         return;
 
-    g_pHyprOpenGL->scissor(titleBarBox);
+    g_pHyprOpenGL->scissor(ctx, titleBarBox);
 
     if (ROUNDING) {
         // the +1 is a shit garbage temp fix until renderRect supports an 
alpha matte
-        CBox windowBox = 
{PWINDOW->position(Desktop::View::IGeometric::GEOMETRIC_CURRENT).x + 
PWINDOW->m_floatingOffset.x - pMonitor->m_position.x + 1,
-                          
PWINDOW->position(Desktop::View::IGeometric::GEOMETRIC_CURRENT).y + 
PWINDOW->m_floatingOffset.y - pMonitor->m_position.y + 1,
+        CBox windowBox = 
{PWINDOW->position(Desktop::View::IGeometric::GEOMETRIC_CURRENT).x + 
PWINDOW->presentation().floatingOffset().x - pMonitor->m_position.x + 1,
+                          
PWINDOW->position(Desktop::View::IGeometric::GEOMETRIC_CURRENT).y + 
PWINDOW->presentation().floatingOffset().y - pMonitor->m_position.y + 1,
                           
PWINDOW->size(Desktop::View::IGeometric::GEOMETRIC_CURRENT).x - 2, 
PWINDOW->size(Desktop::View::IGeometric::GEOMETRIC_CURRENT).y - 2};
 
         if (windowBox.w < 1 || windowBox.h < 1)
@@ -526,7 +551,8 @@
         glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
 
         windowBox.translate(WORKSPACEOFFSET).scale(pMonitor->m_scale).round();
-        g_pHyprOpenGL->renderRect(windowBox, CHyprColor(0, 0, 0, 0), {.round = 
scaledRounding, .roundingPower = m_pWindow->roundingPower()});
+        g_pHyprOpenGL->renderRect(ctx, windowBox, CHyprColor(0, 0, 0, 0),
+                                  CHyprOpenGLImpl::SRectRenderData{.round = 
sc<int>(scaledRounding), .roundingPower = 
m_pWindow->presentation().roundingPower()});
         glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
         glStencilFunc(GL_NOTEQUAL, 1, -1);
@@ -534,14 +560,21 @@
     }
 
     if (SHOULDBLUR)
-        g_pHyprOpenGL->renderRect(titleBarBox, color, {.round = 
scaledRounding, .roundingPower = m_pWindow->roundingPower(), .blur = true, 
.blurA = a});
+        g_pHyprOpenGL->renderRect(
+            ctx, titleBarBox, color,
+            CHyprOpenGLImpl::SRectRenderData{.round = sc<int>(scaledRounding), 
.roundingPower = m_pWindow->presentation().roundingPower(), .blur = true, 
.blurA = a});
     else
-        g_pHyprOpenGL->renderRect(titleBarBox, color, {.round = 
scaledRounding, .roundingPower = m_pWindow->roundingPower()});
+        g_pHyprOpenGL->renderRect(ctx, titleBarBox, color,
+                                  CHyprOpenGLImpl::SRectRenderData{.round = 
sc<int>(scaledRounding), .roundingPower = 
m_pWindow->presentation().roundingPower()});
 
     // render title
-    if (ENABLETITLE && (m_szLastTitle != PWINDOW->m_title || 
m_bWindowSizeChanged || !m_pTextTex || m_pTextTex->m_texID == 0 || 
m_bTitleColorChanged)) {
-        m_szLastTitle = PWINDOW->m_title;
+    const int  SCALEDTEXTSIZE = 
std::round(g_pGlobalState->config.barTextSize->value() * pMonitor->m_scale);
+    const auto TITLE          = 
m_forcedTitle.value_or(PWINDOW->metadata().title());
+    if (ENABLETITLE &&
+        (m_szLastTitle != TITLE || m_bWindowSizeChanged || !m_pTextTex || 
m_pTextTex->m_texID == 0 || m_bTitleColorChanged || m_iLastScaledTextSize != 
SCALEDTEXTSIZE)) {
+        m_szLastTitle = TITLE;
         renderBarTitle(BARBUF, pMonitor->m_scale);
+        m_iLastScaledTextSize = SCALEDTEXTSIZE;
     }
 
     if (ROUNDING) {
@@ -553,7 +586,7 @@
         glStencilFunc(GL_ALWAYS, 1, 0xFF);
     }
 
-    CBox textBox = {titleBarBox.x, titleBarBox.y, (int)BARBUF.x, 
(int)BARBUF.y};
+    CBox textBox = {titleBarBox.x, titleBarBox.y, BARBUF.x, BARBUF.y};
     if (ENABLETITLE && m_pTextTex) {
         const auto BARPADDING       = 
g_pGlobalState->config.barPadding->value();
         const auto BARBUTTONPADDING = 
g_pGlobalState->config.barButtonPadding->value();
@@ -564,7 +597,7 @@
             buttonSizes += b.size + BARBUTTONPADDING;
         }
 
-        const auto scaledBorderSize  = PWINDOW->getRealBorderSize() * 
pMonitor->m_scale;
+        const auto scaledBorderSize  = PWINDOW->presentation().borderSize() * 
pMonitor->m_scale;
         const auto scaledButtonsSize = buttonSizes * pMonitor->m_scale;
         const auto scaledBarPadding  = BARPADDING * pMonitor->m_scale;
         const auto xOffset           = ALIGN == "left" ? 
std::round(scaledBarPadding + (BUTTONSRIGHT ? 0 : scaledButtonsSize)) :
@@ -572,15 +605,15 @@
         const auto yOffset           = std::round((BARBUF.y - 
m_pTextTex->m_size.y) / 2.0);
         CBox       titleBox          = {textBox.x + xOffset, textBox.y + 
yOffset, m_pTextTex->m_size.x, m_pTextTex->m_size.y};
 
-        g_pHyprOpenGL->renderTexture(m_pTextTex, titleBox, {.a = a});
+        g_pHyprOpenGL->renderTexture(ctx, m_pTextTex, titleBox, {.a = a});
     }
 
-    renderBarButtons(&textBox, pMonitor->m_scale, a);
+    renderBarButtons(ctx, &textBox, pMonitor->m_scale, a);
     m_bButtonsDirty = false;
 
-    g_pHyprOpenGL->scissor(nullptr);
+    g_pHyprOpenGL->scissor(ctx, nullptr);
 
-    renderBarButtonsText(&textBox, pMonitor->m_scale, a);
+    renderBarButtonsText(ctx, &textBox, pMonitor->m_scale, a);
 
     m_bWindowSizeChanged = false;
     m_bTitleColorChanged = false;
@@ -633,7 +666,7 @@
     
box.translate(g_pDecorationPositioner->getEdgeDefinedPoint(DECORATION_EDGE_TOP, 
m_pWindow.lock()));
 
     const auto PWORKSPACE      = m_pWindow->m_workspace;
-    const auto WORKSPACEOFFSET = PWORKSPACE && !m_pWindow->m_pinned ? 
PWORKSPACE->m_renderOffset->value() : Vector2D();
+    const auto WORKSPACEOFFSET = PWORKSPACE && !(m_pWindow->m_state & 
Desktop::View::WINDOW_STATE_PINNED) ? PWORKSPACE->m_renderOffset->value() : 
Vector2D();
 
     return box.translate(WORKSPACEOFFSET);
 }
@@ -642,6 +675,11 @@
     return m_pWindow.lock();
 }
 
+void CHyprBar::setTitle(std::optional<std::string> title) {
+    m_forcedTitle = std::move(title);
+    damageEntire();
+}
+
 void CHyprBar::updateRules() {
     const auto PWINDOW              = m_pWindow.lock();
     auto       prevHidden           = m_hidden;
@@ -676,7 +714,7 @@
     const auto COORDS = cursorRelativeToBar();
 
     for (auto& b : g_pGlobalState->buttons) {
-        const auto BARBUF     = Vector2D{(int)assignedBoxGlobal().w, HEIGHT};
+        const auto BARBUF     = Vector2D{assignedBoxGlobal().w, 
sc<double>(HEIGHT)};
         Vector2D   currentPos = Vector2D{(BUTTONSRIGHT ? BARBUF.x - 
BARBUTTONPADDING - b.size - offset : offset), (BARBUF.y - b.size) / 
2.0}.floor();
 
         bool       hover = VECINRECT(COORDS, currentPos.x, currentPos.y, 
currentPos.x + b.size + BARBUTTONPADDING, currentPos.y + b.size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/barDeco.hpp 
new/hyprland-plugins-0.57.0/hyprbars/barDeco.hpp
--- old/hyprland-plugins-0.56.0/hyprbars/barDeco.hpp    2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/barDeco.hpp    2026-10-20 
17:00:53.000000000 +0200
@@ -30,7 +30,7 @@
 
     virtual void                       onPositioningReply(const 
SDecorationPositioningReply& reply);
 
-    virtual void                       draw(PHLMONITOR, float const& a);
+    virtual void                       draw(Render::CRenderContext& ctx, 
PHLMONITOR monitor, const float& a, const Render::SWindowRenderPresentation& 
presentation);
 
     virtual eDecorationType            getDecorationType();
 
@@ -49,6 +49,7 @@
     PHLWINDOW                          getOwner();
 
     void                               updateRules();
+    void                               setTitle(std::optional<std::string> 
title);
     void                               onConfigReloaded();
 
     WP<CHyprBar>                       m_self;
@@ -66,10 +67,12 @@
     bool                       m_hidden             = false;
     bool                       m_bTitleColorChanged = false;
     bool                       m_bButtonHovered     = false;
+    bool                       m_bBarHovered        = false;
     bool                       m_bLastEnabledState  = false;
     bool                       m_bWindowHasFocus    = false;
     std::optional<CHyprColor>  m_bForcedBarColor;
     std::optional<CHyprColor>  m_bForcedTitleColor;
+    std::optional<std::string> m_forcedTitle;
 
     Time::steady_tp            m_lastMouseDown = Time::steadyNow();
 
@@ -77,10 +80,10 @@
 
     Vector2D                   cursorRelativeToBar();
 
-    void                       renderPass(PHLMONITOR, float const& a);
+    void                       renderPass(Render::CRenderContext& ctx, 
PHLMONITOR, float const& a);
     void                       renderBarTitle(const Vector2D& bufferSize, 
const float scale);
-    void renderBarButtons(CBox* barBox, const float scale, const float a);
-    void renderBarButtonsText(CBox* barBox, const float scale, const float a);
+    void renderBarButtons(Render::CRenderContext& ctx, CBox* barBox, const 
float scale, const float a);
+    void renderBarButtonsText(Render::CRenderContext& ctx, CBox* barBox, const 
float scale, const float a);
     void damageOnButtonHover();
 
     bool inputIsValid();
@@ -105,6 +108,7 @@
     CHyprSignalListener m_pMouseMoveCallback;
 
     std::string         m_szLastTitle;
+    int                 m_iLastScaledTextSize = 0;
 
     bool                m_bDraggingThis  = false;
     bool                m_bTouchEv       = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/globals.hpp 
new/hyprland-plugins-0.57.0/hyprbars/globals.hpp
--- old/hyprland-plugins-0.56.0/hyprbars/globals.hpp    2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/globals.hpp    2026-10-20 
17:00:53.000000000 +0200
@@ -8,6 +8,8 @@
 #include <hyprland/src/config/values/types/ColorValue.hpp>
 #include <hyprland/src/config/values/types/FontWeightValue.hpp>
 
+#include <optional>
+
 inline HANDLE PHANDLE = nullptr;
 
 struct SHyprButton {
@@ -18,6 +20,7 @@
     float                size    = 10;
     std::string          icon    = "";
     SP<Render::ITexture> iconTex;
+    std::optional<float> m_fIconScale;
 };
 
 class CHyprBar;
@@ -36,7 +39,7 @@
         SP<Config::Values::CFontWeightValue> barTextWeight;
         SP<Config::Values::CIntValue>        barPadding;
         SP<Config::Values::CIntValue>        barButtonPadding;
-        SP<Config::Values::CBoolValue>       barBlur, barTitleEnabled, 
barPartOfWindow, barPrecedenceOverBorder, enabled, iconOnHover;
+        SP<Config::Values::CBoolValue>       barBlur, barTitleEnabled, 
barPartOfWindow, barPrecedenceOverBorder, enabled, iconOnHover, buttonsOnHover;
         SP<Config::Values::CStringValue>     barTextFont, barTextAlign, 
barButtonsAlignment, onDoubleClick;
     } config;
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprbars/main.cpp 
new/hyprland-plugins-0.57.0/hyprbars/main.cpp
--- old/hyprland-plugins-0.56.0/hyprbars/main.cpp       2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprbars/main.cpp       2026-10-20 
17:00:53.000000000 +0200
@@ -4,10 +4,10 @@
 
 #include <any>
 #include <hyprland/src/Compositor.hpp>
-#include <hyprland/src/desktop/view/Window.hpp>
+#include <hyprland/src/desktop/view/window/Window.hpp>
+#include <hyprland/src/desktop/view/window/WindowPresentation.hpp>
 #include <hyprland/src/desktop/state/WindowState.hpp>
 #include <hyprland/src/config/ConfigManager.hpp>
-#include <hyprland/src/config/shared/parserUtils/ParserUtils.hpp>
 #include <hyprland/src/render/Renderer.hpp>
 #include <hyprland/src/event/EventBus.hpp>
 #include <hyprland/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp>
@@ -15,8 +15,6 @@
 #include <hyprland/src/config/lua/types/LuaConfigColor.hpp>
 #include <hyprland/src/state/MonitorState.hpp>
 
-#include <hyprutils/string/VarList.hpp>
-
 #include <algorithm>
 
 #include "barDeco.hpp"
@@ -33,11 +31,11 @@
 }
 
 static void onNewWindow(PHLWINDOW window) {
-    if (!window->m_X11DoesntWantBorders) {
-        if (std::ranges::any_of(window->m_windowDecorations, [](const auto& d) 
{ return d->getDisplayName() == "Hyprbar"; }))
+    if (true) {
+        if (std::ranges::any_of(window->presentation().decorations(), [](const 
auto& d) { return d->getDisplayName() == "Hyprbar"; }))
             return;
 
-        auto bar = makeUnique<CHyprBar>(window);
+        auto bar = Hyprutils::Memory::makeShared<CHyprBar>(window);
         g_pGlobalState->bars.emplace_back(bar);
         bar->m_self = bar;
         HyprlandAPI::addWindowDecoration(PHANDLE, window, std::move(bar));
@@ -64,56 +62,7 @@
         return;
 
     (*BARIT)->updateRules();
-    window->updateWindowDecos();
-}
-
-Hyprlang::CParseResult onNewButton(const char* K, const char* V) {
-    std::string                 v = V;
-    Hyprutils::String::CVarList vars(v);
-
-    Hyprlang::CParseResult      result;
-
-    // hyprbars-button = bgcolor, size, icon, action, fgcolor
-
-    if (vars[0].empty() || vars[1].empty()) {
-        result.setError("bgcolor and size cannot be empty");
-        return result;
-    }
-
-    float size = 10;
-    try {
-        size = std::stof(vars[1]);
-    } catch (std::exception& e) {
-        result.setError("failed to parse size");
-        return result;
-    }
-
-    bool userfg  = false;
-    auto fgcolor = Config::ParserUtils::parseColor("rgb(ffffff)");
-    auto bgcolor = Config::ParserUtils::parseColor(vars[0]);
-
-    if (!bgcolor) {
-        result.setError("invalid bgcolor");
-        return result;
-    }
-
-    if (vars.size() == 5) {
-        userfg  = true;
-        fgcolor = Config::ParserUtils::parseColor(vars[4]);
-    }
-
-    if (!fgcolor) {
-        result.setError("invalid fgcolor");
-        return result;
-    }
-
-    g_pGlobalState->buttons.push_back(SHyprButton{vars[3], userfg, *fgcolor, 
*bgcolor, size, vars[2]});
-
-    for (auto& b : g_pGlobalState->bars) {
-        b->m_bButtonsDirty = true;
-    }
-
-    return result;
+    window->updateWindowData();
 }
 
 int newLuaButton(lua_State* L) {
@@ -191,6 +140,19 @@
     return 0;
 }
 
+int setLuaTitle(lua_State* L) {
+    const auto WINDOW = 
Config::Lua::Bindings::Internal::windowFromLuaSelectorOrObject(L, 1, 
"hl.plugin.hyprbars.set_title");
+    if (!WINDOW)
+        return Config::Lua::Bindings::Internal::configError(L, 
"hl.plugin.hyprbars.set_title: expected a window");
+
+    const auto BARIT = std::ranges::find_if(g_pGlobalState->bars, 
[&WINDOW](const auto& bar) { return bar && bar->getOwner() == WINDOW; });
+    if (BARIT == g_pGlobalState->bars.end())
+        return Config::Lua::Bindings::Internal::configError(L, 
"hl.plugin.hyprbars.set_title: the window has no bar");
+
+    (*BARIT)->setTitle(lua_isnoneornil(L, 2) ? std::nullopt : 
std::optional<std::string>{luaL_checkstring(L, 2)});
+    return 0;
+}
+
 APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
     PHANDLE = handle;
 
@@ -231,6 +193,8 @@
     g_pGlobalState->config.barButtonPadding    = 
makeShared<Config::Values::CIntValue>("plugin:hyprbars:bar_button_padding", 
"Padding of the bar buttons", 5);
     g_pGlobalState->config.enabled             = 
makeShared<Config::Values::CBoolValue>("plugin:hyprbars:enabled", "Whether bars 
are enabled", true);
     g_pGlobalState->config.iconOnHover         = 
makeShared<Config::Values::CBoolValue>("plugin:hyprbars:icon_on_hover", 
"Whether to use an icon on hover of the buttons", false);
+    g_pGlobalState->config.buttonsOnHover      = 
makeShared<Config::Values::CBoolValue>(
+        "plugin:hyprbars:buttons_on_hover", "Whether the buttons are only 
drawn while the cursor is over the bar", false);
     g_pGlobalState->config.onDoubleClick       = 
makeShared<Config::Values::CStringValue>("plugin:hyprbars:on_double_click", 
"Action to execute on double click of the bar", "");
 
     HyprlandAPI::addConfigValueV2(PHANDLE, g_pGlobalState->config.barColor);
@@ -250,18 +214,18 @@
     HyprlandAPI::addConfigValueV2(PHANDLE, 
g_pGlobalState->config.barButtonPadding);
     HyprlandAPI::addConfigValueV2(PHANDLE, g_pGlobalState->config.enabled);
     HyprlandAPI::addConfigValueV2(PHANDLE, g_pGlobalState->config.iconOnHover);
+    HyprlandAPI::addConfigValueV2(PHANDLE, 
g_pGlobalState->config.buttonsOnHover);
     HyprlandAPI::addConfigValueV2(PHANDLE, 
g_pGlobalState->config.onDoubleClick);
 
-    if (Config::mgr()->type() == Config::CONFIG_LEGACY)
-        HyprlandAPI::addConfigKeyword(PHANDLE, 
"plugin:hyprbars:hyprbars-button", onNewButton, Hyprlang::SHandlerOptions{});
-    else
-        HyprlandAPI::addLuaFunction(PHANDLE, "hyprbars", "add_button", 
::newLuaButton);
+    HyprlandAPI::addLuaFunction(PHANDLE, "hyprbars", "add_button", 
::newLuaButton);
+    HyprlandAPI::addLuaFunction(PHANDLE, "hyprbars", "set_title", 
::setLuaTitle);
+
     static auto P4 = Event::bus()->m_events.config.preReload.listen([&] { 
onPreConfigReload(); });
     static auto P5 = Event::bus()->m_events.config.reloaded.listen([&] { 
onConfigReloaded(); });
 
     // add deco to existing windows
     for (auto& w : Desktop::windowState()->windows()) {
-        if (w->isHidden() || !w->m_isMapped)
+        if (w->isHidden() || !validMapped(w))
             continue;
 
         onNewWindow(w);
@@ -276,7 +240,7 @@
     for (auto& m : State::monitorState()->monitors())
         m->m_scheduledRecalc = true;
 
-    g_pHyprRenderer->m_renderPass.removeAllOfType("CBarPassElement");
+    g_pHyprRenderer->context().m_pass.removeAllOfType("CBarPassElement");
 
     
Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->barColorRuleIdx);
     
Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->titleColorRuleIdx);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprfocus/README.md 
new/hyprland-plugins-0.57.0/hyprfocus/README.md
--- old/hyprland-plugins-0.56.0/hyprfocus/README.md     2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprfocus/README.md     2026-10-20 
17:00:53.000000000 +0200
@@ -21,6 +21,7 @@
 | `only_on_monitor_change`   | whether to only perform the animation when 
changing between monitors | bool  | false   |
 | `keyboard_focus_animation` | animation for keyboard-driven focus changes 
(`flash` / `shrink` / `slide` / `none`) | str | flash |
 | `mouse_focus_animation`    | animation for mouse-driven focus changes 
(`flash` / `shrink` / `slide` / `none`)    | str | none  |
+| `group_focus_animation`    | animation for group active-window changes, e.g. 
`changegroupactive` (`flash` / `shrink` / `slide` / `none`) | str | none |
 | `fade_opacity`             | for flash, opacity at the peak of the animation 
                     | float | 0.8     |
 | `shrink_percentage`        | for shrink, fraction of the window size to 
scale to at the peak      | float | 0.95    |
 | `slide_height`             | for slide, how many pixels to slide upward      
                     | float | 20      |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprfocus/main.cpp 
new/hyprland-plugins-0.57.0/hyprfocus/main.cpp
--- old/hyprland-plugins-0.56.0/hyprfocus/main.cpp      2026-07-15 
09:59:07.000000000 +0200
+++ new/hyprland-plugins-0.57.0/hyprfocus/main.cpp      2026-10-20 
17:00:53.000000000 +0200
@@ -38,6 +38,7 @@
     SP<Config::Values::CBoolValue>   onlyOnMonitorChange;
     SP<Config::Values::CStringValue> keyboardFocusAnimation;
     SP<Config::Values::CStringValue> mouseFocusAnimation;
+    SP<Config::Values::CStringValue> groupFocusAnimation;
     SP<Config::Values::CFloatValue>  fadeOpacity;
     SP<Config::Values::CFloatValue>  shrinkPercentage;
     SP<Config::Values::CFloatValue>  slideHeight;
@@ -52,6 +53,10 @@
     return r == Desktop::FOCUS_REASON_CLICK || r == Desktop::FOCUS_REASON_FFM;
 }
 
+static bool isGroupReason(Desktop::eFocusReason r) {
+    return r == Desktop::FOCUS_REASON_GROUP_CURRENT_WINDOW_CHANGE;
+}
+
 static void onFocusChange(PHLWINDOW window, Desktop::eFocusReason reason) {
     if (!window)
         return;
@@ -59,7 +64,7 @@
     if (!configValues.enable->value())
         return;
 
-    if (!configValues.animateFloating->value() && window->m_isFloating)
+    if (!configValues.animateFloating->value() && window->isFloating())
         return;
 
     static PHLWINDOWREF lastWindow;
@@ -72,9 +77,9 @@
 
     lastWindow = window;
 
-    const auto mode = isMouseReason(reason)
-        ? configValues.mouseFocusAnimation->value()
-        : configValues.keyboardFocusAnimation->value();
+    const auto mode = isGroupReason(reason) ? 
configValues.groupFocusAnimation->value()
+        : isMouseReason(reason)             ? 
configValues.mouseFocusAnimation->value()
+                                             : 
configValues.keyboardFocusAnimation->value();
 
     if (mode == "none")
         return;
@@ -83,61 +88,71 @@
     const auto POUT = 
Config::animationTree()->getAnimationPropertyConfig("hyprfocusOut");
 
     if (mode == "flash") {
-        const auto ORIGINAL = 
window->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->goal();
-        window->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->setConfig(PIN);
-        *window->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE) = 
configValues.fadeOpacity->value();
+        const auto ORIGINAL = 
window->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->goal();
+        window->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->setConfig(PIN);
+        *window->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE] = 
configValues.fadeOpacity->value();
 
-        window->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->setCallbackOnEnd([w 
= PHLWINDOWREF{window}, POUT, ORIGINAL](WP<CBaseAnimatedVariable> pav) {
+        
window->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->setCallbackOnEnd([w = 
PHLWINDOWREF{window}, POUT, ORIGINAL](WP<CBaseAnimatedVariable> pav) {
             if (!w)
                 return;
-            w->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->setConfig(POUT);
-            *w->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE) = ORIGINAL;
+            w->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->setConfig(POUT);
+            *w->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE] = ORIGINAL;
 
-            
w->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->setCallbackOnEnd(nullptr);
+            
w->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->setCallbackOnEnd(nullptr);
         });
     } else if (mode == "shrink") {
-        const auto ORIGINAL = CBox{window->positionAnimation()->goal(), 
window->sizeAnimation()->goal()};
-
-        window->positionAnimation()->setConfig(PIN);
-        window->sizeAnimation()->setConfig(PIN);
+        g_pEventLoopManager->doLater([w = PHLWINDOWREF{window}, PIN, POUT, 
PERCENT = configValues.shrinkPercentage->value()] {
+            if (!w)
+                return;
 
-        auto box = 
ORIGINAL.copy().scaleFromCenter(configValues.shrinkPercentage->value());
+            const auto ORIGINAL = CBox{w->positionAnimation()->goal(), 
w->sizeAnimation()->goal()};
 
-        *window->positionAnimation() = box.pos();
-        *window->sizeAnimation()     = box.size();
+            w->positionAnimation()->setConfig(PIN);
+            w->sizeAnimation()->setConfig(PIN);
 
-        window->sizeAnimation()->setCallbackOnEnd([w = PHLWINDOWREF{window}, 
POUT, ORIGINAL](WP<CBaseAnimatedVariable> pav) {
-            if (!w)
-                return;
-            w->sizeAnimation()->setConfig(POUT);
-            w->positionAnimation()->setConfig(POUT);
+            auto box = ORIGINAL.copy().scaleFromCenter(PERCENT);
 
-            if (w->m_isFloating || 
Fullscreen::controller()->isFullscreen(w.lock())) {
-                *w->positionAnimation() = ORIGINAL.pos();
-                *w->sizeAnimation()     = ORIGINAL.size();
-            } else
-                w->layoutTarget()->recalc();
+            *w->positionAnimation() = box.pos();
+            *w->sizeAnimation()     = box.size();
+
+            w->sizeAnimation()->setCallbackOnEnd([w, POUT, 
ORIGINAL](WP<CBaseAnimatedVariable> pav) {
+                if (!w)
+                    return;
+                w->sizeAnimation()->setConfig(POUT);
+                w->positionAnimation()->setConfig(POUT);
+
+                if (w->isFloating() || 
Fullscreen::controller()->isFullscreen(w.lock())) {
+                    *w->positionAnimation() = ORIGINAL.pos();
+                    *w->sizeAnimation()     = ORIGINAL.size();
+                } else
+                    w->layoutTarget()->recalc();
 
-            w->sizeAnimation()->setCallbackOnEnd(nullptr);
+                w->sizeAnimation()->setCallbackOnEnd(nullptr);
+            });
         });
     } else if (mode == "slide") {
-        const auto ORIGINAL = window->positionAnimation()->goal();
+        g_pEventLoopManager->doLater([w = PHLWINDOWREF{window}, PIN, POUT, 
HEIGHT = configValues.slideHeight->value()] {
+            if (!w)
+                return;
 
-        window->positionAnimation()->setConfig(PIN);
+            const auto ORIGINAL = w->positionAnimation()->goal();
 
-        *window->positionAnimation() = ORIGINAL - Vector2D{0.F, 
configValues.slideHeight->value()};
+            w->positionAnimation()->setConfig(PIN);
 
-        window->positionAnimation()->setCallbackOnEnd([w = 
PHLWINDOWREF{window}, POUT, ORIGINAL](WP<CBaseAnimatedVariable> pav) {
-            if (!w)
-                return;
-            w->positionAnimation()->setConfig(POUT);
+            *w->positionAnimation() = ORIGINAL - Vector2D{0.F, HEIGHT};
+
+            w->positionAnimation()->setCallbackOnEnd([w, POUT, 
ORIGINAL](WP<CBaseAnimatedVariable> pav) {
+                if (!w)
+                    return;
+                w->positionAnimation()->setConfig(POUT);
 
-            if (w->m_isFloating || 
Fullscreen::controller()->isFullscreen(w.lock()))
-                *w->positionAnimation() = ORIGINAL;
-            else
-                w->layoutTarget()->recalc();
+                if (w->isFloating() || 
Fullscreen::controller()->isFullscreen(w.lock()))
+                    *w->positionAnimation() = ORIGINAL;
+                else
+                    w->layoutTarget()->recalc();
 
-            w->positionAnimation()->setCallbackOnEnd(nullptr);
+                w->positionAnimation()->setCallbackOnEnd(nullptr);
+            });
         });
     }
 }
@@ -161,6 +176,7 @@
     configValues.onlyOnMonitorChange = 
makeShared<Config::Values::CBoolValue>("plugin:hyprfocus:only_on_monitor_change",
 "whether to fire the animation only on monitor change", false);
     configValues.keyboardFocusAnimation = 
makeShared<Config::Values::CStringValue>("plugin:hyprfocus:keyboard_focus_animation",
 "animation for keyboard focus changes", "flash");
     configValues.mouseFocusAnimation = 
makeShared<Config::Values::CStringValue>("plugin:hyprfocus:mouse_focus_animation",
 "animation for mouse focus changes", "none");
+    configValues.groupFocusAnimation = 
makeShared<Config::Values::CStringValue>("plugin:hyprfocus:group_focus_animation",
 "animation for group active-window changes", "none");
     configValues.fadeOpacity = 
makeShared<Config::Values::CFloatValue>("plugin:hyprfocus:fade_opacity", "fade 
opacity", 0.8F, Config::Values::SFloatValueOptions{.min = 0.F, .max = 1.F});
     configValues.shrinkPercentage = 
makeShared<Config::Values::CFloatValue>("plugin:hyprfocus:shrink_percentage", 
"shrink percentage", 0.95F, Config::Values::SFloatValueOptions{.min = 0.F, .max 
= 1.F});
     configValues.slideHeight = 
makeShared<Config::Values::CFloatValue>("plugin:hyprfocus:slide_height", "slide 
height", 20.F, Config::Values::SFloatValueOptions{.min = 0.F, .max = 150.F});
@@ -170,6 +186,7 @@
     HyprlandAPI::addConfigValueV2(PHANDLE, configValues.onlyOnMonitorChange);
     HyprlandAPI::addConfigValueV2(PHANDLE, 
configValues.keyboardFocusAnimation);
     HyprlandAPI::addConfigValueV2(PHANDLE, configValues.mouseFocusAnimation);
+    HyprlandAPI::addConfigValueV2(PHANDLE, configValues.groupFocusAnimation);
     HyprlandAPI::addConfigValueV2(PHANDLE, configValues.fadeOpacity);
     HyprlandAPI::addConfigValueV2(PHANDLE, configValues.shrinkPercentage);
     HyprlandAPI::addConfigValueV2(PHANDLE, configValues.slideHeight);
@@ -190,6 +207,6 @@
 
         w->sizeAnimation()->setCallbackOnEnd(nullptr);
         w->positionAnimation()->setCallbackOnEnd(nullptr);
-        
w->alpha(Desktop::View::WINDOW_ALPHA_ACTIVE)->setCallbackOnEnd(nullptr);
+        
w->alpha()[Desktop::View::WINDOW_ALPHA_ACTIVE]->setCallbackOnEnd(nullptr);
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprland-plugins-0.56.0/hyprpm.toml 
new/hyprland-plugins-0.57.0/hyprpm.toml
--- old/hyprland-plugins-0.56.0/hyprpm.toml     2026-07-15 09:59:07.000000000 
+0200
+++ new/hyprland-plugins-0.57.0/hyprpm.toml     2026-10-20 17:00:53.000000000 
+0200
@@ -51,7 +51,10 @@
     ["a47147bc095e5b3be3eb8bd04f0ac242b968cd4d", 
"3aa21f2e0ca72412f1b434c3126f8f1fec3c716c"], # 0.55.1
     ["39d7e209c79d451efab1b21151d5938289da838d", 
"3aa21f2e0ca72412f1b434c3126f8f1fec3c716c"], # 0.55.2
     ["fe5fe79a29ac3adaf3e75560b2f4b7a6d58b31c9", 
"3aa21f2e0ca72412f1b434c3126f8f1fec3c716c"], # 0.55.3
-    ["a0136d8c04687bb36eb8a28eb9d1ff92aea99704", 
"3aa21f2e0ca72412f1b434c3126f8f1fec3c716c"]  # 0.55.4
+    ["a0136d8c04687bb36eb8a28eb9d1ff92aea99704", 
"3aa21f2e0ca72412f1b434c3126f8f1fec3c716c"], # 0.55.4
+    ["36b2e0cfe0c6094dbc47bd42a437431315bb3087", 
"7644cecdb947060682891a0db2a0cdc5c0b9e704"], # 0.56.0
+    ["5c9377c15f85c50648f35ca5a213754f95b93ca0", 
"7644cecdb947060682891a0db2a0cdc5c0b9e704"], # 0.56.1
+    ["efb50993780079460b0cbed1363e2166a2de1d9f", 
"7644cecdb947060682891a0db2a0cdc5c0b9e704"]  # 0.56.2
 ]
 
 [borders-plus-plus]

Reply via email to