mirror of
https://github.com/hyprwm/Hyprland
synced 2025-12-20 04:10:04 +01:00
desktop/layer: store aboveFs property and use that
This commit is contained in:
parent
59438908de
commit
7098558420
7 changed files with 53 additions and 45 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue