mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-08 05:25:59 +01:00
keybinds: add movegroupwindow
This commit is contained in:
parent
d3a644d81c
commit
9f7382bca4
4 changed files with 54 additions and 1 deletions
|
@ -693,6 +693,45 @@ void CWindow::insertWindowToGroup(CWindow* pWindow) {
|
|||
pWindow->m_sGroupData.pNextWindow = PHEAD;
|
||||
}
|
||||
|
||||
CWindow* CWindow::getGroupPrevious() {
|
||||
CWindow* curr = m_sGroupData.pNextWindow;
|
||||
|
||||
while (curr != this && curr->m_sGroupData.pNextWindow != this)
|
||||
curr = curr->m_sGroupData.pNextWindow;
|
||||
|
||||
return curr;
|
||||
}
|
||||
|
||||
void CWindow::switchWithWindowInGroup(CWindow* pWindow) {
|
||||
if (!m_sGroupData.pNextWindow || !pWindow->m_sGroupData.pNextWindow)
|
||||
return;
|
||||
|
||||
// TODO: probably can be done more easily but I let C++ do the algorithm stuff for us
|
||||
|
||||
std::vector<CWindow*> group;
|
||||
group.push_back(this);
|
||||
CWindow* curr = this->m_sGroupData.pNextWindow;
|
||||
while (curr != this) {
|
||||
group.push_back(curr);
|
||||
curr = curr->m_sGroupData.pNextWindow;
|
||||
}
|
||||
|
||||
auto it1 = std::find(group.begin(), group.end(), this);
|
||||
auto it2 = std::find(group.begin(), group.end(), pWindow);
|
||||
|
||||
std::iter_swap(it1, it2);
|
||||
|
||||
for (auto it = group.begin(); it != group.end(); ++it) {
|
||||
if (std::next(it) == group.end()) {
|
||||
(*it)->m_sGroupData.pNextWindow = *group.begin();
|
||||
} else {
|
||||
(*it)->m_sGroupData.pNextWindow = *std::next(it);
|
||||
}
|
||||
}
|
||||
|
||||
std::swap(m_sGroupData.head, pWindow->m_sGroupData.head);
|
||||
}
|
||||
|
||||
void CWindow::updateGroupOutputs() {
|
||||
if (!m_sGroupData.pNextWindow)
|
||||
return;
|
||||
|
|
|
@ -333,9 +333,11 @@ class CWindow {
|
|||
CWindow* getGroupHead();
|
||||
CWindow* getGroupTail();
|
||||
CWindow* getGroupCurrent();
|
||||
CWindow* getGroupPrevious();
|
||||
void setGroupCurrent(CWindow* pWindow);
|
||||
void insertWindowToGroup(CWindow* pWindow);
|
||||
void updateGroupOutputs();
|
||||
void switchWithWindowInGroup(CWindow* pWindow);
|
||||
|
||||
private:
|
||||
// For hidden windows and stuff
|
||||
|
|
|
@ -32,6 +32,7 @@ CKeybindManager::CKeybindManager() {
|
|||
m_mDispatchers["centerwindow"] = centerWindow;
|
||||
m_mDispatchers["togglegroup"] = toggleGroup;
|
||||
m_mDispatchers["changegroupactive"] = changeGroupActive;
|
||||
m_mDispatchers["movegroupwindow"] = moveGroupWindow;
|
||||
m_mDispatchers["togglesplit"] = toggleSplit;
|
||||
m_mDispatchers["splitratio"] = alterSplitRatio;
|
||||
m_mDispatchers["focusmonitor"] = focusMonitor;
|
||||
|
@ -2076,3 +2077,12 @@ void CKeybindManager::global(std::string args) {
|
|||
|
||||
g_pProtocolManager->m_pGlobalShortcutsProtocolManager->sendGlobalShortcutEvent(APPID, NAME, g_pKeybindManager->m_iPassPressed);
|
||||
}
|
||||
|
||||
void CKeybindManager::moveGroupWindow(std::string args) {
|
||||
const auto BACK = args == "b" || args == "prev";
|
||||
|
||||
if (!g_pCompositor->m_pLastWindow || !g_pCompositor->m_pLastWindow->m_sGroupData.pNextWindow)
|
||||
return;
|
||||
|
||||
g_pCompositor->m_pLastWindow->switchWithWindowInGroup(BACK ? g_pCompositor->m_pLastWindow->getGroupPrevious() : g_pCompositor->m_pLastWindow->m_sGroupData.pNextWindow);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,8 @@ struct SKeybind {
|
|||
bool shadowed = false;
|
||||
};
|
||||
|
||||
enum eFocusWindowMode {
|
||||
enum eFocusWindowMode
|
||||
{
|
||||
MODE_CLASS_REGEX = 0,
|
||||
MODE_TITLE_REGEX,
|
||||
MODE_ADDRESS,
|
||||
|
@ -144,6 +145,7 @@ class CKeybindManager {
|
|||
static void lockActiveGroup(std::string);
|
||||
static void moveIntoGroup(std::string);
|
||||
static void moveOutOfGroup(std::string);
|
||||
static void moveGroupWindow(std::string);
|
||||
static void global(std::string);
|
||||
|
||||
friend class CCompositor;
|
||||
|
|
Loading…
Reference in a new issue