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]