tokens: add more modes to initial_workspace_tracking

1 is single-shot, 2 is persistent

fixes #5732
This commit is contained in:
Vaxry 2024-04-24 16:16:46 +01:00
parent 81bb4eb2f6
commit 608eff600d
4 changed files with 52 additions and 8 deletions

View file

@ -385,9 +385,20 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) {
if (m_pWorkspace == pWorkspace) if (m_pWorkspace == pWorkspace)
return; return;
static auto PINITIALWSTRACKING = CConfigValue<Hyprlang::INT>("misc:initial_workspace_tracking");
if (!m_szInitialWorkspaceToken.empty()) { if (!m_szInitialWorkspaceToken.empty()) {
g_pTokenManager->removeToken(g_pTokenManager->getToken(m_szInitialWorkspaceToken)); const auto TOKEN = g_pTokenManager->getToken(m_szInitialWorkspaceToken);
m_szInitialWorkspaceToken = ""; if (TOKEN) {
if (*PINITIALWSTRACKING == 2) {
// persistent
SInitialWorkspaceToken token = std::any_cast<SInitialWorkspaceToken>(TOKEN->data);
if (token.primaryOwner == this) {
token.workspace = pWorkspace->getConfigName();
TOKEN->data = token;
}
}
}
} }
static auto PCLOSEONLASTSPECIAL = CConfigValue<Hyprlang::INT>("misc:close_special_on_empty"); static auto PCLOSEONLASTSPECIAL = CConfigValue<Hyprlang::INT>("misc:close_special_on_empty");
@ -468,6 +479,20 @@ void CWindow::onUnmap() {
if (g_pInputManager->currentlyDraggedWindow == this) if (g_pInputManager->currentlyDraggedWindow == this)
g_pInputManager->currentlyDraggedWindow = nullptr; g_pInputManager->currentlyDraggedWindow = nullptr;
static auto PINITIALWSTRACKING = CConfigValue<Hyprlang::INT>("misc:initial_workspace_tracking");
if (!m_szInitialWorkspaceToken.empty()) {
const auto TOKEN = g_pTokenManager->getToken(m_szInitialWorkspaceToken);
if (TOKEN) {
if (*PINITIALWSTRACKING == 2) {
// persistent token, but the first window got removed so the token is gone
SInitialWorkspaceToken token = std::any_cast<SInitialWorkspaceToken>(TOKEN->data);
if (token.primaryOwner == this)
g_pTokenManager->removeToken(TOKEN);
}
}
}
m_iLastWorkspace = m_pWorkspace->m_iID; m_iLastWorkspace = m_pWorkspace->m_iID;
m_vRealPosition.setCallbackOnEnd(unregisterVar); m_vRealPosition.setCallbackOnEnd(unregisterVar);

View file

@ -14,6 +14,8 @@
#include "DesktopTypes.hpp" #include "DesktopTypes.hpp"
#include "../helpers/signal/Signal.hpp" #include "../helpers/signal/Signal.hpp"
class CWindow;
enum eIdleInhibitMode { enum eIdleInhibitMode {
IDLEINHIBIT_NONE = 0, IDLEINHIBIT_NONE = 0,
IDLEINHIBIT_ALWAYS, IDLEINHIBIT_ALWAYS,
@ -188,6 +190,11 @@ struct SWindowRule {
std::string szWorkspace = ""; // empty means any std::string szWorkspace = ""; // empty means any
}; };
struct SInitialWorkspaceToken {
CWindow* primaryOwner = nullptr;
std::string workspace;
};
class CWindow { class CWindow {
public: public:
CWindow(); CWindow();

View file

@ -81,14 +81,25 @@ void Events::listener_mapWindow(void* owner, void* data) {
const auto TOKEN = g_pTokenManager->getToken(SZTOKEN); const auto TOKEN = g_pTokenManager->getToken(SZTOKEN);
if (TOKEN) { if (TOKEN) {
// find workspace and use it // find workspace and use it
std::string WS = std::any_cast<std::string>(TOKEN->data); SInitialWorkspaceToken WS = std::any_cast<SInitialWorkspaceToken>(TOKEN->data);
Debug::log(LOG, "HL_INITIAL_WORKSPACE_TOKEN {} -> {}", SZTOKEN, WS); Debug::log(LOG, "HL_INITIAL_WORKSPACE_TOKEN {} -> {}", SZTOKEN, WS.workspace);
if (g_pCompositor->getWorkspaceByString(WS) != PWINDOW->m_pWorkspace) { if (g_pCompositor->getWorkspaceByString(WS.workspace) != PWINDOW->m_pWorkspace) {
requestedWorkspace = WS; requestedWorkspace = WS.workspace;
workspaceSilent = true; workspaceSilent = true;
} }
if (*PINITIALWSTRACKING == 1) // one-shot token
g_pTokenManager->removeToken(TOKEN);
else if (*PINITIALWSTRACKING == 2) { // persistent
if (!WS.primaryOwner) {
WS.primaryOwner = PWINDOW;
TOKEN->data = WS;
}
PWINDOW->m_szInitialWorkspaceToken = SZTOKEN;
}
} }
} }
} }

View file

@ -33,8 +33,9 @@ static std::vector<std::pair<std::string, std::string>> getHyprlandLaunchEnv() {
result.push_back(std::make_pair<>( result.push_back(std::make_pair<>(
"HL_INITIAL_WORKSPACE_TOKEN", "HL_INITIAL_WORKSPACE_TOKEN",
g_pTokenManager->registerNewToken(PMONITOR->activeSpecialWorkspace ? PMONITOR->activeSpecialWorkspace->getConfigName() : PMONITOR->activeWorkspace->getConfigName(), g_pTokenManager->registerNewToken(
std::chrono::minutes(2)))); SInitialWorkspaceToken{nullptr, PMONITOR->activeSpecialWorkspace ? PMONITOR->activeSpecialWorkspace->getConfigName() : PMONITOR->activeWorkspace->getConfigName()},
std::chrono::months(1337))));
return result; return result;
} }