summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-12-24 15:08:48 +0100
committervaxerski <vaxry@vaxry.net>2023-12-24 15:08:48 +0100
commit5aab4a96e3c01cce181b42d51140f7ed4e555d8b (patch)
treef1ceccea228f493c0afd0e07239b277fb1e54206 /src
parentff75f991a50d9e82bb4ee4cacace551225ef2038 (diff)
dispatchers: add tiled/floating to cyclenext
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp16
-rw-r--r--src/Compositor.hpp4
-rw-r--r--src/helpers/VarList.hpp9
-rw-r--r--src/managers/KeybindManager.cpp14
4 files changed, 36 insertions, 7 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 4ea83e89..a2b11727 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -1624,7 +1624,7 @@ CWindow* CCompositor::getWindowInDirection(CWindow* pWindow, char dir) {
return nullptr;
}
-CWindow* CCompositor::getNextWindowOnWorkspace(CWindow* pWindow, bool focusableOnly) {
+CWindow* CCompositor::getNextWindowOnWorkspace(CWindow* pWindow, bool focusableOnly, std::optional<bool> floating) {
bool gotToWindow = false;
for (auto& w : m_vWindows) {
if (w.get() != pWindow && !gotToWindow)
@@ -1635,11 +1635,17 @@ CWindow* CCompositor::getNextWindowOnWorkspace(CWindow* pWindow, bool focusableO
continue;
}
+ if (floating.has_value() && w->m_bIsFloating != floating.value())
+ continue;
+
if (w->m_iWorkspaceID == pWindow->m_iWorkspaceID && w->m_bIsMapped && !w->isHidden() && (!focusableOnly || !w->m_bNoFocus))
return w.get();
}
for (auto& w : m_vWindows) {
+ if (floating.has_value() && w->m_bIsFloating != floating.value())
+ continue;
+
if (w.get() != pWindow && w->m_iWorkspaceID == pWindow->m_iWorkspaceID && w->m_bIsMapped && !w->isHidden() && (!focusableOnly || !w->m_bNoFocus))
return w.get();
}
@@ -1647,7 +1653,7 @@ CWindow* CCompositor::getNextWindowOnWorkspace(CWindow* pWindow, bool focusableO
return nullptr;
}
-CWindow* CCompositor::getPrevWindowOnWorkspace(CWindow* pWindow, bool focusableOnly) {
+CWindow* CCompositor::getPrevWindowOnWorkspace(CWindow* pWindow, bool focusableOnly, std::optional<bool> floating) {
bool gotToWindow = false;
for (auto& w : m_vWindows | std::views::reverse) {
if (w.get() != pWindow && !gotToWindow)
@@ -1658,11 +1664,17 @@ CWindow* CCompositor::getPrevWindowOnWorkspace(CWindow* pWindow, bool focusableO
continue;
}
+ if (floating.has_value() && w->m_bIsFloating != floating.value())
+ continue;
+
if (w->m_iWorkspaceID == pWindow->m_iWorkspaceID && w->m_bIsMapped && !w->isHidden() && (!focusableOnly || !w->m_bNoFocus))
return w.get();
}
for (auto& w : m_vWindows | std::views::reverse) {
+ if (floating.has_value() && w->m_bIsFloating != floating.value())
+ continue;
+
if (w.get() != pWindow && w->m_iWorkspaceID == pWindow->m_iWorkspaceID && w->m_bIsMapped && !w->isHidden() && (!focusableOnly || !w->m_bNoFocus))
return w.get();
}
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 7bedc806..ae2d4638 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -165,8 +165,8 @@ class CCompositor {
void changeWindowZOrder(CWindow*, bool);
void cleanupFadingOut(const int& monid);
CWindow* getWindowInDirection(CWindow*, char);
- CWindow* getNextWindowOnWorkspace(CWindow*, bool focusableOnly = false);
- CWindow* getPrevWindowOnWorkspace(CWindow*, bool focusableOnly = false);
+ CWindow* getNextWindowOnWorkspace(CWindow*, bool focusableOnly = false, std::optional<bool> floating = {});
+ CWindow* getPrevWindowOnWorkspace(CWindow*, bool focusableOnly = false, std::optional<bool> floating = {});
int getNextAvailableNamedWorkspace();
bool isPointOnAnyMonitor(const Vector2D&);
CWindow* getConstraintWindow(SMouse*);
diff --git a/src/helpers/VarList.hpp b/src/helpers/VarList.hpp
index 8f33f166..d70f2c3f 100644
--- a/src/helpers/VarList.hpp
+++ b/src/helpers/VarList.hpp
@@ -50,6 +50,15 @@ class CVarList {
return m_vArgs.end();
}
+ bool contains(const std::string& el) {
+ for (auto& a : m_vArgs) {
+ if (a == el)
+ return true;
+ }
+
+ return false;
+ }
+
private:
std::vector<std::string> m_vArgs;
}; \ No newline at end of file
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 6aea4e32..d58aa8d8 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -1571,10 +1571,18 @@ void CKeybindManager::circleNext(std::string arg) {
return;
}
- if (arg == "last" || arg == "l" || arg == "prev" || arg == "p")
- switchToWindow(g_pCompositor->getPrevWindowOnWorkspace(g_pCompositor->m_pLastWindow, true));
+ CVarList args{arg, 0, 's', true};
+
+ std::optional<bool> floatStatus = {};
+ if (args.contains("tile") || args.contains("tiled"))
+ floatStatus = false;
+ else if (args.contains("float") || args.contains("floating"))
+ floatStatus = true;
+
+ if (args.contains("prev") || args.contains("p") || args.contains("last") || args.contains("l"))
+ switchToWindow(g_pCompositor->getPrevWindowOnWorkspace(g_pCompositor->m_pLastWindow, true, floatStatus));
else
- switchToWindow(g_pCompositor->getNextWindowOnWorkspace(g_pCompositor->m_pLastWindow, true));
+ switchToWindow(g_pCompositor->getNextWindowOnWorkspace(g_pCompositor->m_pLastWindow, true, floatStatus));
}
void CKeybindManager::focusWindow(std::string regexp) {