mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-23 08:05:59 +01:00
added a swapactiveworkspaces dispatcher
This commit is contained in:
parent
de477a6ff5
commit
e327b0a835
4 changed files with 103 additions and 37 deletions
|
@ -1299,6 +1299,88 @@ int CCompositor::getNextAvailableMonitorID() {
|
||||||
return topID + 1;
|
return topID + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCompositor::swapActiveWorkspaces(CMonitor* pMonitorA, CMonitor* pMonitorB) {
|
||||||
|
|
||||||
|
const auto PWORKSPACEA = g_pCompositor->getWorkspaceByID(pMonitorA->activeWorkspace);
|
||||||
|
const auto PWORKSPACEB = g_pCompositor->getWorkspaceByID(pMonitorB->activeWorkspace);
|
||||||
|
|
||||||
|
PWORKSPACEA->m_iMonitorID = pMonitorB->ID;
|
||||||
|
PWORKSPACEA->moveToMonitor(pMonitorB->ID);
|
||||||
|
|
||||||
|
for (auto& w : m_vWindows) {
|
||||||
|
if (w->m_iWorkspaceID == PWORKSPACEA->m_iID) {
|
||||||
|
w->m_iMonitorID = pMonitorB->ID;
|
||||||
|
|
||||||
|
// additionally, move floating windows manually
|
||||||
|
if (w->m_bIsFloating && w->m_bIsMapped && !w->m_bHidden) {
|
||||||
|
w->m_vRealPosition = w->m_vRealPosition.vec() - pMonitorA->vecPosition + pMonitorB->vecPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
w->updateToplevel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PWORKSPACEB->m_iMonitorID = pMonitorA->ID;
|
||||||
|
PWORKSPACEB->moveToMonitor(pMonitorA->ID);
|
||||||
|
|
||||||
|
for (auto& w : m_vWindows) {
|
||||||
|
if (w->m_iWorkspaceID == PWORKSPACEB->m_iID) {
|
||||||
|
w->m_iMonitorID = pMonitorA->ID;
|
||||||
|
|
||||||
|
// additionally, move floating windows manually
|
||||||
|
if (w->m_bIsFloating && w->m_bIsMapped && !w->m_bHidden) {
|
||||||
|
w->m_vRealPosition = w->m_vRealPosition.vec() - pMonitorB->vecPosition + pMonitorA->vecPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
w->updateToplevel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pMonitorA->activeWorkspace = PWORKSPACEB->m_iID;
|
||||||
|
pMonitorB->activeWorkspace = PWORKSPACEA->m_iID;
|
||||||
|
|
||||||
|
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(pMonitorA->ID);
|
||||||
|
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(pMonitorB->ID);
|
||||||
|
|
||||||
|
g_pInputManager->refocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
CMonitor* CCompositor::getMonitorFromString(const std::string& name) {
|
||||||
|
if (isNumber(name)) {
|
||||||
|
// change by ID
|
||||||
|
int monID = -1;
|
||||||
|
try {
|
||||||
|
monID = std::stoi(name);
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
// shouldn't happen but jic
|
||||||
|
Debug::log(ERR, "Error in getMonitorFromString: invalid num");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monID > -1 && monID < (int)g_pCompositor->m_vMonitors.size()) {
|
||||||
|
return g_pCompositor->getMonitorFromID(monID);
|
||||||
|
} else {
|
||||||
|
Debug::log(ERR, "Error in getMonitorFromString: invalid arg 1");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isDirection(name)) {
|
||||||
|
const auto PMONITOR = g_pCompositor->getMonitorInDirection(name[0]);
|
||||||
|
return PMONITOR;
|
||||||
|
} else {
|
||||||
|
for (auto& m : g_pCompositor->m_vMonitors) {
|
||||||
|
if (m->szName == name) {
|
||||||
|
return m.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug::log(ERR, "Error in getMonitorFromString: no such monitor");
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void CCompositor::moveWorkspaceToMonitor(CWorkspace* pWorkspace, CMonitor* pMonitor) {
|
void CCompositor::moveWorkspaceToMonitor(CWorkspace* pWorkspace, CMonitor* pMonitor) {
|
||||||
|
|
||||||
// We trust the workspace and monitor to be correct.
|
// We trust the workspace and monitor to be correct.
|
||||||
|
|
|
@ -145,6 +145,8 @@ public:
|
||||||
void updateWindowAnimatedDecorationValues(CWindow*);
|
void updateWindowAnimatedDecorationValues(CWindow*);
|
||||||
int getNextAvailableMonitorID();
|
int getNextAvailableMonitorID();
|
||||||
void moveWorkspaceToMonitor(CWorkspace*, CMonitor*);
|
void moveWorkspaceToMonitor(CWorkspace*, CMonitor*);
|
||||||
|
void swapActiveWorkspaces(CMonitor*, CMonitor*);
|
||||||
|
CMonitor* getMonitorFromString(const std::string&);
|
||||||
bool workspaceIDOutOfBounds(const int&);
|
bool workspaceIDOutOfBounds(const int&);
|
||||||
void setWindowFullscreen(CWindow*, bool, eFullscreenMode);
|
void setWindowFullscreen(CWindow*, bool, eFullscreenMode);
|
||||||
void moveUnmanagedX11ToWindows(CWindow*);
|
void moveUnmanagedX11ToWindows(CWindow*);
|
||||||
|
|
|
@ -40,6 +40,7 @@ CKeybindManager::CKeybindManager() {
|
||||||
m_mDispatchers["movewindowpixel"] = moveWindow;
|
m_mDispatchers["movewindowpixel"] = moveWindow;
|
||||||
m_mDispatchers["resizewindowpixel"] = resizeWindow;
|
m_mDispatchers["resizewindowpixel"] = resizeWindow;
|
||||||
m_mDispatchers["swapnext"] = swapnext;
|
m_mDispatchers["swapnext"] = swapnext;
|
||||||
|
m_mDispatchers["swapactiveworkspaces"] = swapActiveWorkspaces;
|
||||||
|
|
||||||
m_tScrollTimer.reset();
|
m_tScrollTimer.reset();
|
||||||
}
|
}
|
||||||
|
@ -981,45 +982,12 @@ void CKeybindManager::alterSplitRatio(std::string args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CKeybindManager::focusMonitor(std::string arg) {
|
void CKeybindManager::focusMonitor(std::string arg) {
|
||||||
if (isNumber(arg)) {
|
const auto PMONITOR = g_pCompositor->getMonitorFromString(arg);
|
||||||
// change by ID
|
|
||||||
int monID = -1;
|
|
||||||
try {
|
|
||||||
monID = std::stoi(arg);
|
|
||||||
} catch (std::exception& e) {
|
|
||||||
// shouldn't happen but jic
|
|
||||||
Debug::log(ERR, "Error in focusMonitor: invalid num");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (monID > -1 && monID < (int)g_pCompositor->m_vMonitors.size()) {
|
if (!PMONITOR)
|
||||||
changeworkspace("[internal]" + std::to_string(g_pCompositor->getMonitorFromID(monID)->activeWorkspace));
|
|
||||||
} else {
|
|
||||||
Debug::log(ERR, "Error in focusMonitor: invalid arg 1");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (isDirection(arg)) {
|
|
||||||
const auto PMONITOR = g_pCompositor->getMonitorInDirection(arg[0]);
|
|
||||||
if (PMONITOR) {
|
|
||||||
if (PMONITOR->activeWorkspace < 0) {
|
|
||||||
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);
|
|
||||||
changeworkspace("name:" + PWORKSPACE->m_szName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
changeworkspace(std::to_string(PMONITOR->activeWorkspace));
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (auto& m : g_pCompositor->m_vMonitors) {
|
|
||||||
if (m->szName == arg) {
|
|
||||||
changeworkspace("[internal]" + std::to_string(m->activeWorkspace));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug::log(ERR, "Error in focusMonitor: no such monitor");
|
changeworkspace("[internal]" + std::to_string(PMONITOR->activeWorkspace));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CKeybindManager::moveCursorToCorner(std::string arg) {
|
void CKeybindManager::moveCursorToCorner(std::string arg) {
|
||||||
|
@ -1469,3 +1437,16 @@ void CKeybindManager::swapnext(std::string arg) {
|
||||||
|
|
||||||
g_pCompositor->focusWindow(PLASTWINDOW);
|
g_pCompositor->focusWindow(PLASTWINDOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CKeybindManager::swapActiveWorkspaces(std::string args) {
|
||||||
|
const auto MON1 = args.substr(0, args.find_first_of(' '));
|
||||||
|
const auto MON2 = args.substr(args.find_first_of(' ') + 1);
|
||||||
|
|
||||||
|
const auto PMON1 = g_pCompositor->getMonitorFromString(MON1);
|
||||||
|
const auto PMON2 = g_pCompositor->getMonitorFromString(MON2);
|
||||||
|
|
||||||
|
if (!PMON1 || !PMON2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_pCompositor->swapActiveWorkspaces(PMON1, PMON2);
|
||||||
|
}
|
||||||
|
|
|
@ -108,6 +108,7 @@ private:
|
||||||
static void toggleOpaque(std::string);
|
static void toggleOpaque(std::string);
|
||||||
static void dpms(std::string);
|
static void dpms(std::string);
|
||||||
static void swapnext(std::string);
|
static void swapnext(std::string);
|
||||||
|
static void swapActiveWorkspaces(std::string);
|
||||||
|
|
||||||
friend class CCompositor;
|
friend class CCompositor;
|
||||||
friend class CInputManager;
|
friend class CInputManager;
|
||||||
|
|
Loading…
Reference in a new issue