hyprbars: don't remove bar on unmap, keep it around

fixes #307
This commit is contained in:
vaxerski 2025-03-24 11:26:31 +00:00
parent 7429a0ea78
commit 4e36349249
2 changed files with 14 additions and 9 deletions

View file

@ -44,7 +44,6 @@ CHyprBar::CHyprBar(PHLWINDOW pWindow) : IHyprWindowDecoration(pWindow) {
} }
CHyprBar::~CHyprBar() { CHyprBar::~CHyprBar() {
damageEntire();
HyprlandAPI::unregisterCallback(PHANDLE, m_pMouseButtonCallback); HyprlandAPI::unregisterCallback(PHANDLE, m_pMouseButtonCallback);
HyprlandAPI::unregisterCallback(PHANDLE, m_pTouchDownCallback); HyprlandAPI::unregisterCallback(PHANDLE, m_pTouchDownCallback);
HyprlandAPI::unregisterCallback(PHANDLE, m_pTouchUpCallback); HyprlandAPI::unregisterCallback(PHANDLE, m_pTouchUpCallback);
@ -114,7 +113,7 @@ void CHyprBar::onTouchDown(SCallbackInfo& info, ITouch::SDownEvent e) {
} }
void CHyprBar::onMouseMove(Vector2D coords) { void CHyprBar::onMouseMove(Vector2D coords) {
if (!m_bDragPending || m_bTouchEv) if (!m_bDragPending || m_bTouchEv || !validMapped(m_pWindow))
return; return;
m_bDragPending = false; m_bDragPending = false;
@ -122,7 +121,7 @@ void CHyprBar::onMouseMove(Vector2D coords) {
} }
void CHyprBar::onTouchMove(SCallbackInfo& info, ITouch::SMotionEvent e) { void CHyprBar::onTouchMove(SCallbackInfo& info, ITouch::SMotionEvent e) {
if (!m_bDragPending || !m_bTouchEv) if (!m_bDragPending || !m_bTouchEv || !validMapped(m_pWindow))
return; return;
g_pInputManager->mouseMoveUnified(e.timeMs); g_pInputManager->mouseMoveUnified(e.timeMs);
@ -630,13 +629,14 @@ uint64_t CHyprBar::getDecorationFlags() {
} }
CBox CHyprBar::assignedBoxGlobal() { CBox CHyprBar::assignedBoxGlobal() {
const auto PWINDOW = m_pWindow.lock(); if (!validMapped(m_pWindow))
return {};
CBox box = m_bAssignedBox; CBox box = m_bAssignedBox;
box.translate(g_pDecorationPositioner->getEdgeDefinedPoint(DECORATION_EDGE_TOP, PWINDOW)); box.translate(g_pDecorationPositioner->getEdgeDefinedPoint(DECORATION_EDGE_TOP, m_pWindow.lock()));
const auto PWORKSPACE = PWINDOW->m_pWorkspace; const auto PWORKSPACE = m_pWindow->m_pWorkspace;
const auto WORKSPACEOFFSET = PWORKSPACE && !PWINDOW->m_bPinned ? PWORKSPACE->m_vRenderOffset->value() : Vector2D(); const auto WORKSPACEOFFSET = PWORKSPACE && !m_pWindow->m_bPinned ? PWORKSPACE->m_vRenderOffset->value() : Vector2D();
return box.translate(WORKSPACEOFFSET); return box.translate(WORKSPACEOFFSET);
} }

View file

@ -8,6 +8,8 @@
#include <hyprland/src/config/ConfigManager.hpp> #include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/render/Renderer.hpp> #include <hyprland/src/render/Renderer.hpp>
#include <algorithm>
#include "barDeco.hpp" #include "barDeco.hpp"
#include "globals.hpp" #include "globals.hpp"
@ -21,6 +23,9 @@ static void onNewWindow(void* self, std::any data) {
const auto PWINDOW = std::any_cast<PHLWINDOW>(data); const auto PWINDOW = std::any_cast<PHLWINDOW>(data);
if (!PWINDOW->m_bX11DoesntWantBorders) { if (!PWINDOW->m_bX11DoesntWantBorders) {
if (std::ranges::any_of(PWINDOW->m_dWindowDecorations, [](const auto& d) { return d->getDisplayName() == "Hyprbar"; }))
return;
auto bar = makeUnique<CHyprBar>(PWINDOW); auto bar = makeUnique<CHyprBar>(PWINDOW);
g_pGlobalState->bars.emplace_back(bar); g_pGlobalState->bars.emplace_back(bar);
bar->m_self = bar; bar->m_self = bar;
@ -118,7 +123,7 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
g_pGlobalState = makeUnique<SGlobalState>(); g_pGlobalState = makeUnique<SGlobalState>();
static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); }); static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); });
static auto P2 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { onCloseWindow(self, data); }); // static auto P2 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { onCloseWindow(self, data); });
static auto P3 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "windowUpdateRules", static auto P3 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "windowUpdateRules",
[&](void* self, SCallbackInfo& info, std::any data) { onUpdateWindowRules(std::any_cast<PHLWINDOW>(data)); }); [&](void* self, SCallbackInfo& info, std::any data) { onUpdateWindowRules(std::any_cast<PHLWINDOW>(data)); });