add movefocusgroup command which moves focus through groups before continuing to the next window

This commit is contained in:
Sven Speckmaier 2023-09-25 00:39:21 +02:00
parent 3b657257ec
commit f64e34eb78
4 changed files with 96 additions and 18 deletions

View file

@ -1,4 +1,5 @@
#include "KeybindManager.hpp"
#include "./directions/GroupActiveDirection.hpp"
#include "../render/decorations/CHyprGroupBarDecoration.hpp"
#include <regex>
@ -28,6 +29,7 @@ CKeybindManager::CKeybindManager() {
m_mDispatchers["movetoworkspace"] = moveActiveToWorkspace;
m_mDispatchers["movetoworkspacesilent"] = moveActiveToWorkspaceSilent;
m_mDispatchers["pseudo"] = toggleActivePseudo;
m_mDispatchers["movegroupfocus"] = moveGroupFocusTo;
m_mDispatchers["movefocus"] = moveFocusTo;
m_mDispatchers["movewindow"] = moveActiveTo;
m_mDispatchers["swapwindow"] = swapActive;
@ -257,6 +259,37 @@ void CKeybindManager::switchToWindow(CWindow* PWINDOWTOCHANGETO) {
}
};
CWindow *CKeybindManager::groupActiveInDirection(std::string args) {
const auto PWINDOW = g_pCompositor->m_pLastWindow;
if (!PWINDOW)
return nullptr;
if (!PWINDOW->m_sGroupData.pNextWindow)
return nullptr;
if (PWINDOW->m_sGroupData.pNextWindow == PWINDOW)
return nullptr;
if (isNumber(args, false)) {
// index starts from '1'; '0' means last window
const int INDEX = std::stoi(args);
if (INDEX > PWINDOW->getGroupSize())
return nullptr;
if (INDEX == 0)
return PWINDOW->getGroupTail();
return PWINDOW->getGroupWindowByIndex(INDEX - 1);
}
GroupActiveDirection direction(std::move(args));
if (direction.isBackwards()) {
return PWINDOW->getGroupPrevious();
}
return PWINDOW->m_sGroupData.pNextWindow;
}
bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard) {
if (!g_pCompositor->m_bSessionActive || g_pCompositor->m_bUnsafeState) {
m_dPressedKeycodes.clear();
@ -995,6 +1028,25 @@ void CKeybindManager::moveActiveToWorkspaceSilent(std::string args) {
g_pInputManager->refocus();
}
void CKeybindManager::moveGroupFocusTo(std::string args) {
const auto PWINDOW = g_pCompositor->m_pLastWindow;
GroupActiveDirection direction = GroupActiveDirection::fromFocusDirection(args);
CWindow *pNextWindow = groupActiveInDirection(direction.asString());
if(
pNextWindow == nullptr
|| pNextWindow == PWINDOW
|| (direction.isForward() && pNextWindow == PWINDOW->getGroupHead())
|| (direction.isBackwards() && pNextWindow == PWINDOW->getGroupTail())
) {
moveFocusTo(args);
return;
}
PWINDOW->setGroupCurrent(pNextWindow);
}
void CKeybindManager::moveFocusTo(std::string args) {
char arg = args[0];
@ -1163,7 +1215,8 @@ void CKeybindManager::toggleGroup(std::string args) {
void CKeybindManager::changeGroupActive(std::string args) {
const auto PWINDOW = g_pCompositor->m_pLastWindow;
if (!PWINDOW)
CWindow *pNextWindow = groupActiveInDirection(std::move(args));
if(!pNextWindow)
return;
if (!PWINDOW->m_sGroupData.pNextWindow)
@ -1172,23 +1225,7 @@ void CKeybindManager::changeGroupActive(std::string args) {
if (PWINDOW->m_sGroupData.pNextWindow == PWINDOW)
return;
if (isNumber(args, false)) {
// index starts from '1'; '0' means last window
const int INDEX = std::stoi(args);
if (INDEX > PWINDOW->getGroupSize())
return;
if (INDEX == 0)
PWINDOW->setGroupCurrent(PWINDOW->getGroupTail());
else
PWINDOW->setGroupCurrent(PWINDOW->getGroupWindowByIndex(INDEX - 1));
return;
}
if (args != "b" && args != "prev") {
PWINDOW->setGroupCurrent(PWINDOW->m_sGroupData.pNextWindow);
} else {
PWINDOW->setGroupCurrent(PWINDOW->getGroupPrevious());
}
PWINDOW->setGroupCurrent(pNextWindow);
}
void CKeybindManager::toggleSplit(std::string args) {

View file

@ -94,6 +94,7 @@ class CKeybindManager {
static void moveWindowOutOfGroup(CWindow* pWindow, const std::string& dir = "");
static void moveWindowIntoGroup(CWindow* pWindow, CWindow* pWindowInDirection);
static void switchToWindow(CWindow* PWINDOWTOCHANGETO);
static CWindow* groupActiveInDirection(std::string args);
// -------------- Dispatchers -------------- //
static void killActive(std::string);
@ -107,6 +108,7 @@ class CKeybindManager {
static void fakeFullscreenActive(std::string);
static void moveActiveToWorkspace(std::string);
static void moveActiveToWorkspaceSilent(std::string);
static void moveGroupFocusTo(std::string);
static void moveFocusTo(std::string);
static void focusUrgentOrLast(std::string);
static void focusCurrentOrLast(std::string);

View file

@ -0,0 +1,21 @@
#include "GroupActiveDirection.hpp"
GroupActiveDirection::GroupActiveDirection(std::string direction) : direction(direction) {}
GroupActiveDirection GroupActiveDirection::fromFocusDirection(std::string direction) {
if(direction == "l") {
return GroupActiveDirection("b");
}
return GroupActiveDirection("f");
}
bool GroupActiveDirection::isForward() {
return !isBackwards();
}
bool GroupActiveDirection::isBackwards() {
return direction == "b" || direction == "prev";
}
std::string GroupActiveDirection::asString() {
return direction;
}

View file

@ -0,0 +1,18 @@
#ifndef HYPRLAND_GROUPACTIVEDIRECTION_HPP
#define HYPRLAND_GROUPACTIVEDIRECTION_HPP
#include <string>
class GroupActiveDirection {
std::string direction;
public:
explicit GroupActiveDirection(std::string);
static GroupActiveDirection fromFocusDirection(std::string);
bool isForward();
bool isBackwards();
std::string asString();
};
#endif //HYPRLAND_GROUPACTIVEDIRECTION_HPP