summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-23 16:51:48 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-23 16:51:48 +0100
commitf108ec78e261940d271e18caa509dbb93de90165 (patch)
treed2f356df24dc507faa3859ac50f4d6ad58659dd2 /src/managers/KeybindManager.cpp
parentf82fdb012e20c7c24c1f72fc140a9ebe7e58e25c (diff)
Added movetoworkspace
Diffstat (limited to 'src/managers/KeybindManager.cpp')
-rw-r--r--src/managers/KeybindManager.cpp50
1 files changed, 47 insertions, 3 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 49afd31d..29273f14 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -35,10 +35,9 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t
// oMg such performance hit!!11!
// this little maneouver is gonna cost us 4µs
const auto KBKEY = xkb_keysym_from_name(k.key.c_str(), XKB_KEYSYM_CASE_INSENSITIVE);
- // TODO: fix this with shift, shift makes all the keys uppercase
- // if (shift) KBKEY -= someindex
+ const auto KBKEYUPPER = xkb_keysym_to_upper(KBKEY);
- if (key != KBKEY)
+ if (key != KBKEY && key != KBKEYUPPER)
continue;
// yes.
@@ -47,6 +46,7 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t
else if (k.handler == "togglefloating") { toggleActiveFloating(k.arg); }
else if (k.handler == "workspace") { changeworkspace(k.arg); }
else if (k.handler == "fullscreen") { fullscreenActive(k.arg); }
+ else if (k.handler == "movetoworkspace") { moveActiveToWorkspace(k.arg); }
found = true;
}
@@ -155,4 +155,48 @@ void CKeybindManager::fullscreenActive(std::string args) {
return;
g_pLayoutManager->getCurrentLayout()->fullscreenRequestForWindow(PWINDOW);
+}
+
+void CKeybindManager::moveActiveToWorkspace(std::string args) {
+ const auto PWINDOW = g_pCompositor->getWindowFromSurface(g_pCompositor->m_pLastFocus);
+
+ if (!g_pCompositor->windowValidMapped(PWINDOW))
+ return;
+
+ int workspaceID;
+ try {
+ workspaceID = stoi(args);
+ } catch( ... ) {
+ Debug::log(ERR, "Invalid movetoworkspace: %s", args.c_str());
+ return;
+ }
+
+ g_pLayoutManager->getCurrentLayout()->onWindowRemoved(PWINDOW);
+
+ const auto OLDWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
+
+ // hack
+ g_pKeybindManager->changeworkspace(std::to_string(workspaceID));
+
+ const auto NEWWORKSPACE = g_pCompositor->getWorkspaceByID(workspaceID);
+
+ OLDWORKSPACE->hasFullscreenWindow = false;
+
+ PWINDOW->m_iWorkspaceID = workspaceID;
+ PWINDOW->m_iMonitorID = NEWWORKSPACE->monitorID;
+ PWINDOW->m_bIsFullscreen = false;
+
+ if (NEWWORKSPACE->hasFullscreenWindow) {
+ g_pCompositor->getFullscreenWindowOnWorkspace(workspaceID)->m_bIsFullscreen = false;
+ NEWWORKSPACE->hasFullscreenWindow = false;
+ }
+
+ // Hack: So that the layout doesnt find our window at the cursor
+ PWINDOW->m_vPosition = Vector2D(-42069, -42069);
+ g_pLayoutManager->getCurrentLayout()->onWindowCreated(PWINDOW);
+
+ if (PWINDOW->m_bIsFloating) {
+ PWINDOW->m_vRealPosition = PWINDOW->m_vRealPosition - g_pCompositor->getMonitorFromID(OLDWORKSPACE->monitorID)->vecPosition;
+ PWINDOW->m_vRealPosition = PWINDOW->m_vRealPosition + g_pCompositor->getMonitorFromID(NEWWORKSPACE->monitorID)->vecPosition;
+ }
} \ No newline at end of file