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();
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) {
if (w->m_workspace == PWORKSPACE && !w->isFullscreen() && !w->m_fadingOut && !w->m_pinned)
w->m_createdOverFullscreen = false;
}
for (auto const& ls : m_layers) {
if (ls->m_monitor == PMONITOR)
ls->m_aboveFullscreen = false;
}
g_pDesktopAnimationManager->setFullscreenFadeAnimation(
PWORKSPACE, PWORKSPACE->m_hasFullscreenWindow ? CDesktopAnimationManager::ANIMATION_TYPE_IN : CDesktopAnimationManager::ANIMATION_TYPE_OUT);

View file

@ -164,8 +164,9 @@ void CLayerSurface::onDestroy() {
void CLayerSurface::onMap() {
Debug::log(LOG, "LayerSurface {:x} mapped", rc<uintptr_t>(m_layerSurface.get()));
m_mapped = true;
m_interactivity = m_layerSurface->m_current.interactivity;
m_mapped = true;
m_interactivity = m_layerSurface->m_current.interactivity;
m_aboveFullscreen = true;
m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_ALL);
@ -330,23 +331,10 @@ void CLayerSurface::onCommit() {
}
}
// update alpha when window is in fullscreen
auto PWORKSPACE = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace;
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);
m_layer = m_layerSurface->m_current.layer;
m_aboveFullscreen = true;
// from overlay to top
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;
g_pDesktopAnimationManager->setFullscreenFadeAnimation(PMONITOR->m_activeWorkspace, CDesktopAnimationManager::ANIMATION_TYPE_IN);
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

View file

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

View file

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

View file

@ -1318,6 +1318,12 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo
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();
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()) {
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;
}
}

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
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);
if (PWORKSPACE->m_hasFullscreenWindow && !foundSurface && PWORKSPACE->m_fullscreenMode == FSMODE_FULLSCREEN) {
pFoundWindow = PWORKSPACE->getFullscreenWindow();
if (PWORKSPACE->m_hasFullscreenWindow && PWORKSPACE->m_fullscreenMode == FSMODE_FULLSCREEN) {
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) {
// what the fuck, somehow happens occasionally??
PWORKSPACE->m_hasFullscreenWindow = false;
return;
}
if (IS_LS_UNFOCUSABLE) {
foundSurface = nullptr;
pFoundLayerSurface = nullptr;
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;
pFoundWindow = PWORKSPACE->getFullscreenWindow();
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();
if (!pFoundWindow) {
// what the fuck, somehow happens occasionally??
PWORKSPACE->m_hasFullscreenWindow = false;
return;
}
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();
}
}
}