Added support for layoutmsg params and added the param 'newfocus' for 'swapwithmaster' and 'focusmaster' (#1522)

* Added support for layoutmsg params and added the param 'newfocus' for 'swapwithmaster' and 'focusmaster', which lets the user decide what the new focused window should be
This commit is contained in:
Philipp Mildenberger 2023-02-10 20:13:38 +01:00 committed by GitHub
parent d1a7f1dd36
commit 42f4664022
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -745,7 +745,16 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
g_pCompositor->warpCursorTo(PWINDOWTOCHANGETO->m_vRealPosition.goalv() + PWINDOWTOCHANGETO->m_vRealSize.goalv() / 2.f); g_pCompositor->warpCursorTo(PWINDOWTOCHANGETO->m_vRealPosition.goalv() + PWINDOWTOCHANGETO->m_vRealSize.goalv() / 2.f);
}; };
if (message == "swapwithmaster") { CVarList vars(message, 0, ' ');
if (vars.size() < 1 || vars[0].empty()) {
Debug::log(ERR, "layoutmsg called without params");
return 0;
}
auto command = vars[0];
if (command == "swapwithmaster") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -759,21 +768,34 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
if (!PMASTER) if (!PMASTER)
return 0; return 0;
// first message argument can have the following values:
// * master - keep the focus at the new master
// * child - keep the focus at the new child
// * auto (default) - swap the focus (keep the focus of the previously selected window)
if (PMASTER->pWindow != PWINDOW) { if (PMASTER->pWindow != PWINDOW) {
const auto NEWCHILD = PMASTER->pWindow;
switchWindows(PWINDOW, PMASTER->pWindow); switchWindows(PWINDOW, PMASTER->pWindow);
switchToWindow(PWINDOW); if (vars.size() >= 2 && vars[1] == "child")
switchToWindow(NEWCHILD);
else // default switch to new master
switchToWindow(PMASTER->pWindow);
} else { } else {
for (auto& n : m_lMasterNodesData) { for (auto& n : m_lMasterNodesData) {
if (n.workspaceID == PMASTER->workspaceID && !n.isMaster) { if (n.workspaceID == PMASTER->workspaceID && !n.isMaster) {
switchWindows(n.pWindow, PMASTER->pWindow); switchWindows(n.pWindow, PMASTER->pWindow);
switchToWindow(n.pWindow); // if master is focused keep master focused (don't do anything)
if (vars.size() >= 2 && vars[1] == "master") {
switchToWindow(PMASTER->pWindow);
} else { // default switch to child
switchToWindow(n.pWindow);
}
break; break;
} }
} }
} }
return 0; return 0;
} else if (message == "focusmaster") { } else if (command == "focusmaster") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -786,10 +808,16 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
if (!PMASTER) if (!PMASTER)
return 0; return 0;
// first message argument can have the following values:
// * master - keep the focus at the new master, even if it was focused before
// * auto (default) - swap the focus with the first child, if the current focus was master, otherwise focus master
if (PMASTER->pWindow != PWINDOW) { if (PMASTER->pWindow != PWINDOW) {
switchToWindow(PMASTER->pWindow); switchToWindow(PMASTER->pWindow);
prepareNewFocus(PMASTER->pWindow, inheritFullscreen); prepareNewFocus(PMASTER->pWindow, inheritFullscreen);
} else if (vars.size() >= 2 && vars[1] == "master") {
return 0;
} else { } else {
// if master is focused keep master focused (don't do anything)
for (auto& n : m_lMasterNodesData) { for (auto& n : m_lMasterNodesData) {
if (n.workspaceID == PMASTER->workspaceID && !n.isMaster) { if (n.workspaceID == PMASTER->workspaceID && !n.isMaster) {
switchToWindow(n.pWindow); switchToWindow(n.pWindow);
@ -800,7 +828,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
} }
return 0; return 0;
} else if (message == "cyclenext") { } else if (command == "cyclenext") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -811,7 +839,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
const auto PNEXTWINDOW = getNextWindow(PWINDOW, true); const auto PNEXTWINDOW = getNextWindow(PWINDOW, true);
switchToWindow(PNEXTWINDOW); switchToWindow(PNEXTWINDOW);
prepareNewFocus(PNEXTWINDOW, inheritFullscreen); prepareNewFocus(PNEXTWINDOW, inheritFullscreen);
} else if (message == "cycleprev") { } else if (command == "cycleprev") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -822,7 +850,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
const auto PPREVWINDOW = getNextWindow(PWINDOW, false); const auto PPREVWINDOW = getNextWindow(PWINDOW, false);
switchToWindow(PPREVWINDOW); switchToWindow(PPREVWINDOW);
prepareNewFocus(PPREVWINDOW, inheritFullscreen); prepareNewFocus(PPREVWINDOW, inheritFullscreen);
} else if (message == "swapnext") { } else if (command == "swapnext") {
if (!g_pCompositor->windowValidMapped(header.pWindow)) if (!g_pCompositor->windowValidMapped(header.pWindow))
return 0; return 0;
@ -838,7 +866,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
switchWindows(header.pWindow, PWINDOWTOSWAPWITH); switchWindows(header.pWindow, PWINDOWTOSWAPWITH);
g_pCompositor->focusWindow(header.pWindow); g_pCompositor->focusWindow(header.pWindow);
} }
} else if (message == "swapprev") { } else if (command == "swapprev") {
if (!g_pCompositor->windowValidMapped(header.pWindow)) if (!g_pCompositor->windowValidMapped(header.pWindow))
return 0; return 0;
@ -854,7 +882,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
switchWindows(header.pWindow, PWINDOWTOSWAPWITH); switchWindows(header.pWindow, PWINDOWTOSWAPWITH);
g_pCompositor->focusWindow(header.pWindow); g_pCompositor->focusWindow(header.pWindow);
} }
} else if (message == "addmaster") { } else if (command == "addmaster") {
if (!g_pCompositor->windowValidMapped(header.pWindow)) if (!g_pCompositor->windowValidMapped(header.pWindow))
return 0; return 0;
@ -885,7 +913,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
recalculateMonitor(header.pWindow->m_iMonitorID); recalculateMonitor(header.pWindow->m_iMonitorID);
} else if (message == "removemaster") { } else if (command == "removemaster") {
if (!g_pCompositor->windowValidMapped(header.pWindow)) if (!g_pCompositor->windowValidMapped(header.pWindow))
return 0; return 0;
@ -916,7 +944,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
} }
recalculateMonitor(header.pWindow->m_iMonitorID); recalculateMonitor(header.pWindow->m_iMonitorID);
} else if (message == "orientationleft" || message == "orientationright" || message == "orientationtop" || message == "orientationbottom") { } else if (command == "orientationleft" || command == "orientationright" || command == "orientationtop" || command == "orientationbottom") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -926,18 +954,18 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
const auto PWORKSPACEDATA = getMasterWorkspaceData(PWINDOW->m_iWorkspaceID); const auto PWORKSPACEDATA = getMasterWorkspaceData(PWINDOW->m_iWorkspaceID);
if (message == "orientationleft") if (command == "orientationleft")
PWORKSPACEDATA->orientation = ORIENTATION_LEFT; PWORKSPACEDATA->orientation = ORIENTATION_LEFT;
else if (message == "orientationright") else if (command == "orientationright")
PWORKSPACEDATA->orientation = ORIENTATION_RIGHT; PWORKSPACEDATA->orientation = ORIENTATION_RIGHT;
else if (message == "orientationtop") else if (command == "orientationtop")
PWORKSPACEDATA->orientation = ORIENTATION_TOP; PWORKSPACEDATA->orientation = ORIENTATION_TOP;
else if (message == "orientationbottom") else if (command == "orientationbottom")
PWORKSPACEDATA->orientation = ORIENTATION_BOTTOM; PWORKSPACEDATA->orientation = ORIENTATION_BOTTOM;
recalculateMonitor(header.pWindow->m_iMonitorID); recalculateMonitor(header.pWindow->m_iMonitorID);
} else if (message == "orientationnext") { } else if (command == "orientationnext") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)
@ -954,7 +982,7 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
} }
recalculateMonitor(header.pWindow->m_iMonitorID); recalculateMonitor(header.pWindow->m_iMonitorID);
} else if (message == "orientationprev") { } else if (command == "orientationprev") {
const auto PWINDOW = header.pWindow; const auto PWINDOW = header.pWindow;
if (!PWINDOW) if (!PWINDOW)