summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-30 20:16:23 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-30 20:16:23 +0200
commitf794c91293ca4249fe0883bad4371a4e9e8d4344 (patch)
treedcf11d4415b95ecd5a896e967115e50e63a5e32a /src
parente49657f0f927abbe9ef9b5f9b5714ca1adeec99d (diff)
windows on top of fullscreen, lastmonitor fixes
Diffstat (limited to 'src')
-rw-r--r--src/Window.hpp3
-rw-r--r--src/events/Windows.cpp10
-rw-r--r--src/layout/DwindleLayout.cpp2
-rw-r--r--src/managers/InputManager.cpp17
-rw-r--r--src/managers/KeybindManager.cpp6
-rw-r--r--src/render/Renderer.cpp12
6 files changed, 45 insertions, 5 deletions
diff --git a/src/Window.hpp b/src/Window.hpp
index 1e964860..3b4b3cd7 100644
--- a/src/Window.hpp
+++ b/src/Window.hpp
@@ -45,6 +45,9 @@ public:
bool m_bIsMapped = false;
+ // This is for fullscreen apps
+ bool m_bCreatedOverFullscreen = false;
+
// XWayland stuff
bool m_bIsX11 = false;
bool m_bMappedX11 = false;
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index 92b26cf8..667a5ea3 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -24,7 +24,8 @@ void addViewCoords(void* pWindow, int* x, int* y) {
void Events::listener_mapWindow(void* owner, void* data) {
CWindow* PWINDOW = (CWindow*)owner;
- const auto PMONITOR = g_pCompositor->m_pLastMonitor;
+ const auto PMONITOR = g_pCompositor->getMonitorFromCursor();
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);
PWINDOW->m_iMonitorID = PMONITOR->ID;
PWINDOW->m_bMappedX11 = true;
PWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace;
@@ -43,6 +44,12 @@ void Events::listener_mapWindow(void* owner, void* data) {
if (g_pXWaylandManager->shouldBeFloated(PWINDOW))
PWINDOW->m_bIsFloating = true;
+ if (PWORKSPACE->hasFullscreenWindow && !PWINDOW->m_bIsFloating) {
+ const auto PFULLWINDOW = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->ID);
+ g_pLayoutManager->getCurrentLayout()->fullscreenRequestForWindow(PFULLWINDOW);
+ g_pXWaylandManager->setWindowFullscreen(PFULLWINDOW, PFULLWINDOW->m_bIsFullscreen);
+ }
+
// window rules
const auto WINDOWRULES = g_pConfigManager->getMatchingRules(PWINDOW);
@@ -71,6 +78,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
if (PWINDOW->m_bIsFloating) {
g_pLayoutManager->getCurrentLayout()->onWindowCreatedFloating(PWINDOW);
+ PWINDOW->m_bCreatedOverFullscreen = true;
// size and move rules
for (auto& r : WINDOWRULES) {
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp
index acff1fb2..58eca936 100644
--- a/src/layout/DwindleLayout.cpp
+++ b/src/layout/DwindleLayout.cpp
@@ -359,7 +359,7 @@ void CHyprDwindleLayout::onWindowCreatedFloating(CWindow* pWindow) {
Vector2D middlePoint = Vector2D(desiredGeometry.x, desiredGeometry.y) + Vector2D(desiredGeometry.width, desiredGeometry.height) / 2.f;
// TODO: detect a popup in a more consistent way.
- if (g_pCompositor->getMonitorFromVector(middlePoint)->ID != pWindow->m_iMonitorID || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) {
+ if ((g_pCompositor->getMonitorFromVector(middlePoint) && g_pCompositor->getMonitorFromVector(middlePoint)->ID != pWindow->m_iMonitorID) || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) {
// if it's not, fall back to the center placement
pWindow->m_vEffectivePosition = PMONITOR->vecPosition + Vector2D((PMONITOR->vecSize.x - desiredGeometry.width) / 2.f, (PMONITOR->vecSize.y - desiredGeometry.height) / 2.f);
} else {
diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp
index 7b09c8e5..0718bfcc 100644
--- a/src/managers/InputManager.cpp
+++ b/src/managers/InputManager.cpp
@@ -23,8 +23,10 @@ void CInputManager::mouseMoveUnified(uint32_t time) {
wlr_surface* foundSurface = nullptr;
Vector2D mouseCoords = getMouseCoordsInternal();
const auto PMONITOR = g_pCompositor->getMonitorFromCursor();
+ if (PMONITOR)
+ g_pCompositor->m_pLastMonitor = PMONITOR;
Vector2D surfaceCoords;
- Vector2D surfacePos;
+ Vector2D surfacePos = Vector2D(-1337, -1337);
// first, we check if the workspace doesnt have a fullscreen window
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);
@@ -36,6 +38,16 @@ void CInputManager::mouseMoveUnified(uint32_t time) {
foundSurface = g_pXWaylandManager->getWindowSurface(PFULLSCREENWINDOW);
if (foundSurface)
surfacePos = PFULLSCREENWINDOW->m_vRealPosition;
+
+ for (auto& w : g_pCompositor->m_lWindows) {
+ wlr_box box = {w.m_vRealPosition.x, w.m_vRealPosition.y, w.m_vRealSize.x, w.m_vRealSize.y};
+ if (w.m_iWorkspaceID == PFULLSCREENWINDOW->m_iWorkspaceID && w.m_bIsMapped && w.m_bCreatedOverFullscreen && wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y)) {
+ foundSurface = g_pXWaylandManager->getWindowSurface(&w);
+ if (foundSurface)
+ surfacePos = w.m_vRealPosition;
+ break;
+ }
+ }
}
}
@@ -73,14 +85,13 @@ void CInputManager::mouseMoveUnified(uint32_t time) {
if (time)
wlr_idle_notify_activity(g_pCompositor->m_sWLRIdle, g_pCompositor->m_sSeat.seat);
- Vector2D surfaceLocal = surfacePos == Vector2D() ? surfaceCoords : Vector2D(g_pCompositor->m_sWLRCursor->x, g_pCompositor->m_sWLRCursor->y) - surfacePos;
+ Vector2D surfaceLocal = surfacePos == Vector2D(-1337, -1337) ? surfaceCoords : Vector2D(g_pCompositor->m_sWLRCursor->x, g_pCompositor->m_sWLRCursor->y) - surfacePos;
wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, foundSurface, surfaceLocal.x, surfaceLocal.y);
wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, time, surfaceLocal.x, surfaceLocal.y);
g_pCompositor->focusSurface(foundSurface);
- g_pCompositor->m_pLastMonitor = PMONITOR;
g_pLayoutManager->getCurrentLayout()->onMouseMove(getMouseCoordsInternal());
}
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index a421e6eb..22c880b4 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -178,6 +178,12 @@ void CKeybindManager::fullscreenActive(std::string args) {
g_pLayoutManager->getCurrentLayout()->fullscreenRequestForWindow(PWINDOW);
g_pXWaylandManager->setWindowFullscreen(PWINDOW, PWINDOW->m_bIsFullscreen);
+
+ // make all windows on the same workspace under the fullscreen window
+ for (auto& w : g_pCompositor->m_lWindows) {
+ if (w.m_iWorkspaceID == PWINDOW->m_iWorkspaceID)
+ w.m_bCreatedOverFullscreen = false;
+ }
}
void CKeybindManager::moveActiveToWorkspace(std::string args) {
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index c9dada6d..7eda6296 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -59,12 +59,24 @@ bool shouldRenderWindow(CWindow* pWindow, SMonitor* pMonitor) {
}
void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWorkspace* pWorkspace, timespec* time) {
+ CWindow* pWorkspaceWindow = nullptr;
+
for (auto& w : g_pCompositor->m_lWindows) {
if (w.m_iWorkspaceID != pWorkspace->ID || !w.m_bIsFullscreen)
continue;
// found it!
renderWindow(&w, pMonitor, time, false);
+
+ pWorkspaceWindow = &w;
+ }
+
+ // then render windows over fullscreen
+ for (auto& w : g_pCompositor->m_lWindows) {
+ if (w.m_iWorkspaceID != pWorkspaceWindow->m_iWorkspaceID || !w.m_bCreatedOverFullscreen || !w.m_bIsMapped)
+ continue;
+
+ renderWindow(&w, pMonitor, time, true);
}
}