desktop/layer: store aboveFs property and use that

This commit is contained in:
Vaxry 2025-12-16 16:32:31 +00:00
parent 59438908de
commit 7098558420
Signed by: vaxry
GPG key ID: 665806380871D640
7 changed files with 53 additions and 45 deletions

View file

@ -2164,11 +2164,15 @@ void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, Desktop::Vie
PWINDOW->updateDecorationValues(); PWINDOW->updateDecorationValues();
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID()); g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID());
// make all windows on the same workspace under the fullscreen window // make all windows and layers on the same workspace under the fullscreen window
for (auto const& w : m_windows) { for (auto const& w : m_windows) {
if (w->m_workspace == PWORKSPACE && !w->isFullscreen() && !w->m_fadingOut && !w->m_pinned) if (w->m_workspace == PWORKSPACE && !w->isFullscreen() && !w->m_fadingOut && !w->m_pinned)
w->m_createdOverFullscreen = false; w->m_createdOverFullscreen = false;
} }
for (auto const& ls : m_layers) {
if (ls->m_monitor == PMONITOR)
ls->m_aboveFullscreen = false;
}
g_pDesktopAnimationManager->setFullscreenFadeAnimation( g_pDesktopAnimationManager->setFullscreenFadeAnimation(
PWORKSPACE, PWORKSPACE->m_hasFullscreenWindow ? CDesktopAnimationManager::ANIMATION_TYPE_IN : CDesktopAnimationManager::ANIMATION_TYPE_OUT); PWORKSPACE, PWORKSPACE->m_hasFullscreenWindow ? CDesktopAnimationManager::ANIMATION_TYPE_IN : CDesktopAnimationManager::ANIMATION_TYPE_OUT);

View file

@ -164,8 +164,9 @@ void CLayerSurface::onDestroy() {
void CLayerSurface::onMap() { void CLayerSurface::onMap() {
Debug::log(LOG, "LayerSurface {:x} mapped", rc<uintptr_t>(m_layerSurface.get())); Debug::log(LOG, "LayerSurface {:x} mapped", rc<uintptr_t>(m_layerSurface.get()));
m_mapped = true; m_mapped = true;
m_interactivity = m_layerSurface->m_current.interactivity; m_interactivity = m_layerSurface->m_current.interactivity;
m_aboveFullscreen = true;
m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_ALL); m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_ALL);
@ -330,23 +331,10 @@ void CLayerSurface::onCommit() {
} }
} }
// update alpha when window is in fullscreen m_layer = m_layerSurface->m_current.layer;
auto PWORKSPACE = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace; m_aboveFullscreen = true;
if (PWORKSPACE && PWORKSPACE->m_fullscreenMode == FSMODE_FULLSCREEN) {
// warp if switching render layer so we don't see glitches and have clean fade
if ((m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND || m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) &&
(m_layerSurface->m_current.layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP || m_layerSurface->m_current.layer == ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY))
m_alpha->setValueAndWarp(0.f);
// from overlay to top g_pDesktopAnimationManager->setFullscreenFadeAnimation(PMONITOR->m_activeWorkspace, CDesktopAnimationManager::ANIMATION_TYPE_IN);
if (m_layer == ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY && m_layerSurface->m_current.layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP)
*m_alpha = 0.f;
// to overlay
if (m_layerSurface->m_current.layer == ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY)
*m_alpha = 1.f;
}
m_layer = m_layerSurface->m_current.layer;
if (m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND || m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) if (m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND || m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM)
g_pHyprOpenGL->markBlurDirtyForMonitor(PMONITOR); // so that blur is recalc'd g_pHyprOpenGL->markBlurDirtyForMonitor(PMONITOR); // so that blur is recalc'd

View file

@ -45,9 +45,10 @@ namespace Desktop::View {
PHLMONITORREF m_monitor; PHLMONITORREF m_monitor;
bool m_fadingOut = false; bool m_fadingOut = false;
bool m_readyToDelete = false; bool m_readyToDelete = false;
bool m_noProcess = false; bool m_noProcess = false;
bool m_aboveFullscreen = true;
UP<Desktop::Rule::CLayerRuleApplicator> m_ruleApplicator; UP<Desktop::Rule::CLayerRuleApplicator> m_ruleApplicator;

View file

@ -338,14 +338,14 @@ void CPopup::reposition() {
m_resource->applyPositioning(box, COORDS); m_resource->applyPositioning(box, COORDS);
} }
SP<Desktop::View::CWLSurface> CPopup::getT1Owner() const { SP<Desktop::View::CWLSurface> CPopup::getT1Owner() const {
if (m_windowOwner) if (m_windowOwner)
return m_windowOwner->wlSurface(); return m_windowOwner->wlSurface();
else else
return m_layerOwner->wlSurface(); return m_layerOwner->wlSurface();
} }
Vector2D CPopup::coordsRelativeToParent() const { Vector2D CPopup::coordsRelativeToParent() const {
Vector2D offset; Vector2D offset;
if (!m_resource) if (!m_resource)
@ -365,11 +365,11 @@ Vector2D CPopup::coordsRelativeToParent() const {
return offset; return offset;
} }
Vector2D CPopup::coordsGlobal() const { Vector2D CPopup::coordsGlobal() const {
return localToGlobal(coordsRelativeToParent()); return localToGlobal(coordsRelativeToParent());
} }
Vector2D CPopup::localToGlobal(const Vector2D& rel) const { Vector2D CPopup::localToGlobal(const Vector2D& rel) const {
return t1ParentCoords() + rel; return t1ParentCoords() + rel;
} }
@ -483,7 +483,7 @@ bool CPopup::inert() const {
return m_inert; return m_inert;
} }
PHLMONITOR CPopup::getMonitor() const { PHLMONITOR CPopup::getMonitor() const {
if (!m_windowOwner.expired()) if (!m_windowOwner.expired())
return m_windowOwner->m_monitor.lock(); return m_windowOwner->m_monitor.lock();
if (!m_layerOwner.expired()) if (!m_layerOwner.expired())

View file

@ -1318,6 +1318,12 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo
EMIT_HOOK_EVENT("workspace", pWorkspace); EMIT_HOOK_EVENT("workspace", pWorkspace);
} }
// set all LSes as not above fullscreen on workspace changes
for (auto const& ls : g_pCompositor->m_layers) {
if (ls->m_monitor == m_self)
ls->m_aboveFullscreen = false;
}
pWorkspace->m_events.activeChanged.emit(); pWorkspace->m_events.activeChanged.emit();
g_pHyprRenderer->damageMonitor(m_self.lock()); g_pHyprRenderer->damageMonitor(m_self.lock());

View file

@ -482,7 +482,7 @@ void CDesktopAnimationManager::setFullscreenFadeAnimation(PHLWORKSPACE ws, eAnim
if (ws->m_id == PMONITOR->activeWorkspaceID() || ws->m_id == PMONITOR->activeSpecialWorkspaceID()) { if (ws->m_id == PMONITOR->activeWorkspaceID() || ws->m_id == PMONITOR->activeSpecialWorkspaceID()) {
for (auto const& ls : PMONITOR->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { for (auto const& ls : PMONITOR->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) {
if (!ls->m_fadingOut) if (!ls->m_fadingOut && !ls->m_aboveFullscreen)
*ls->m_alpha = FULLSCREEN && ws->m_fullscreenMode == FSMODE_FULLSCREEN ? 0.f : 1.f; *ls->m_alpha = FULLSCREEN && ws->m_fullscreenMode == FSMODE_FULLSCREEN ? 0.f : 1.f;
} }
} }

View file

@ -402,26 +402,35 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse, st
// then, we check if the workspace doesn't have a fullscreen window // then, we check if the workspace doesn't have a fullscreen window
const auto PWORKSPACE = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace; const auto PWORKSPACE = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace;
const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowUnified(mouseCoords, Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS | Desktop::View::ALLOW_FLOATING); const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowUnified(mouseCoords, Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS | Desktop::View::ALLOW_FLOATING);
if (PWORKSPACE->m_hasFullscreenWindow && !foundSurface && PWORKSPACE->m_fullscreenMode == FSMODE_FULLSCREEN) { if (PWORKSPACE->m_hasFullscreenWindow && PWORKSPACE->m_fullscreenMode == FSMODE_FULLSCREEN) {
pFoundWindow = PWORKSPACE->getFullscreenWindow(); const auto IS_LS_UNFOCUSABLE = pFoundLayerSurface &&
(pFoundLayerSurface->m_layer < ZWLR_LAYER_SHELL_V1_LAYER_TOP ||
(pFoundLayerSurface->m_layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP && !pFoundLayerSurface->m_aboveFullscreen));
if (!pFoundWindow) { if (IS_LS_UNFOCUSABLE) {
// what the fuck, somehow happens occasionally?? foundSurface = nullptr;
PWORKSPACE->m_hasFullscreenWindow = false; pFoundLayerSurface = nullptr;
return;
}
if (PWINDOWIDEAL && pFoundWindow = PWORKSPACE->getFullscreenWindow();
((PWINDOWIDEAL->m_isFloating && (PWINDOWIDEAL->m_createdOverFullscreen || PWINDOWIDEAL->m_pinned)) /* floating over fullscreen or pinned */
|| (PMONITOR->m_activeSpecialWorkspace == PWINDOWIDEAL->m_workspace) /* on an open special workspace */))
pFoundWindow = PWINDOWIDEAL;
if (!pFoundWindow->m_isX11) { if (!pFoundWindow) {
foundSurface = g_pCompositor->vectorWindowToSurface(mouseCoords, pFoundWindow, surfaceCoords); // what the fuck, somehow happens occasionally??
surfacePos = Vector2D(-1337, -1337); PWORKSPACE->m_hasFullscreenWindow = false;
} else { return;
foundSurface = pFoundWindow->wlSurface()->resource(); }
surfacePos = pFoundWindow->m_realPosition->value();
if (PWINDOWIDEAL &&
((PWINDOWIDEAL->m_isFloating && (PWINDOWIDEAL->m_createdOverFullscreen || PWINDOWIDEAL->m_pinned)) /* floating over fullscreen or pinned */
|| (PMONITOR->m_activeSpecialWorkspace == PWINDOWIDEAL->m_workspace) /* on an open special workspace */))
pFoundWindow = PWINDOWIDEAL;
if (!pFoundWindow->m_isX11) {
foundSurface = g_pCompositor->vectorWindowToSurface(mouseCoords, pFoundWindow, surfaceCoords);
surfacePos = Vector2D(-1337, -1337);
} else {
foundSurface = pFoundWindow->wlSurface()->resource();
surfacePos = pFoundWindow->m_realPosition->value();
}
} }
} }