mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-02 18:45:59 +01:00
tokens: add more modes to initial_workspace_tracking
1 is single-shot, 2 is persistent fixes #5732
This commit is contained in:
parent
81bb4eb2f6
commit
608eff600d
4 changed files with 52 additions and 8 deletions
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue