diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 005ce392..02438d43 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1048,14 +1048,20 @@ SWorkspaceIDName getWorkspaceToChangeFromArgs(std::string args, PHLWORKSPACE PCU return {WORKSPACE_NOT_CHANGED, ""}; } - const auto ID = PCURRENTWORKSPACE->m_iID; - if (const auto PWORKSPACETOCHANGETO = g_pCompositor->getWorkspaceByID(PPREVWS.id); PWORKSPACETOCHANGETO) { - if (PER_MON && PCURRENTWORKSPACE->m_iMonitorID != PWORKSPACETOCHANGETO->m_iMonitorID) - return {WORKSPACE_NOT_CHANGED, ""}; - return {ID, PWORKSPACETOCHANGETO->m_szName}; - } + const auto ID = PCURRENTWORKSPACE->m_iID; + const auto PWORKSPACETOCHANGETO = g_pCompositor->getWorkspaceByID(PPREVWS.id); + if (!PWORKSPACETOCHANGETO) + return {ID, PPREVWS.name.empty() ? std::to_string(PPREVWS.id) : PPREVWS.name}; - return {ID, PPREVWS.name.empty() ? std::to_string(PPREVWS.id) : PPREVWS.name}; + if (!PER_MON || PCURRENTWORKSPACE->m_iMonitorID == PWORKSPACETOCHANGETO->m_iMonitorID) + return {ID, PWORKSPACETOCHANGETO->m_szName}; + + // PER_MON and cur ws is not on same monitor with prev per monitor + const auto POTHERWSTOCHANGETO = g_pCompositor->getWorkspaceByID(PCURRENTWORKSPACE->getPrevWorkspaceIDName(false).id); + if (POTHERWSTOCHANGETO && POTHERWSTOCHANGETO->m_iMonitorID == PCURRENTWORKSPACE->m_iMonitorID) + return {ID, POTHERWSTOCHANGETO->m_szName}; + + return {WORKSPACE_NOT_CHANGED, ""}; } void CKeybindManager::changeworkspace(std::string args) { diff --git a/src/protocols/core/Seat.cpp b/src/protocols/core/Seat.cpp index f578292a..507a9c4a 100644 --- a/src/protocols/core/Seat.cpp +++ b/src/protocols/core/Seat.cpp @@ -2,6 +2,7 @@ #include "Compositor.hpp" #include "DataDevice.hpp" #include "../../devices/IKeyboard.hpp" +#include "../../devices/IHID.hpp" #include "../../managers/SeatManager.hpp" #include "../../config/ConfigValue.hpp" #include @@ -451,12 +452,20 @@ void CWLSeatProtocol::updateCapabilities(uint32_t caps) { } void CWLSeatProtocol::updateKeymap() { + if (!(currentCaps & eHIDCapabilityType::HID_INPUT_CAPABILITY_KEYBOARD)) { + return; + } + for (auto& k : m_vKeyboards) { k->sendKeymap(g_pSeatManager->keyboard.lock()); } } void CWLSeatProtocol::updateRepeatInfo(uint32_t rate, uint32_t delayMs) { + if (!(currentCaps & eHIDCapabilityType::HID_INPUT_CAPABILITY_KEYBOARD)) { + return; + } + for (auto& k : m_vKeyboards) { k->repeatInfo(rate, delayMs); }