diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 49e5b7ae5..7037f537d 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1474,6 +1474,13 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_CHOICE, .data = SConfigOptionDescription::SChoiceData{0, "Disabled,Enabled,Force"}, }, + SConfigOptionDescription{ + .value = "cursor:warp_on_toggle_special", + .description = "Move the cursor to the last focused window when toggling a special workspace. Options: 0 (Disabled), 1 (Enabled), " + "2 (Force - ignores cursor:no_warps option)", + .type = CONFIG_OPTION_CHOICE, + .data = SConfigOptionDescription::SChoiceData{0, "Disabled,Enabled,Force"}, + }, SConfigOptionDescription{ .value = "cursor:default_monitor", .description = "the name of a default monitor for the cursor to be set to on startup (see hyprctl monitors for names)", diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 12e3cb5f6..56ff3f300 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -682,6 +682,7 @@ CConfigManager::CConfigManager() { registerConfigVar("cursor:no_warps", Hyprlang::INT{0}); registerConfigVar("cursor:persistent_warps", Hyprlang::INT{0}); registerConfigVar("cursor:warp_on_change_workspace", Hyprlang::INT{0}); + registerConfigVar("cursor:warp_on_toggle_special", Hyprlang::INT{0}); registerConfigVar("cursor:default_monitor", {STRVAL_EMPTY}); registerConfigVar("cursor:zoom_factor", {1.f}); registerConfigVar("cursor:zoom_rigid", Hyprlang::INT{0}); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 9a22a13ac..948ef11e7 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -2097,10 +2097,16 @@ SDispatchResult CKeybindManager::toggleSpecialWorkspace(std::string args) { } } + updateRelativeCursorCoords(); + + PHLWORKSPACEREF focusedWorkspace; + if (requestedWorkspaceIsAlreadyOpen && specialOpenOnMonitor == workspaceID) { // already open on this monitor Debug::log(LOG, "Toggling special workspace {} to closed", workspaceID); PMONITOR->setSpecialWorkspace(nullptr); + + focusedWorkspace = PMONITOR->activeWorkspace; } else { Debug::log(LOG, "Toggling special workspace {} to open", workspaceID); auto PSPECIALWORKSPACE = g_pCompositor->getWorkspaceByID(workspaceID); @@ -2109,6 +2115,18 @@ SDispatchResult CKeybindManager::toggleSpecialWorkspace(std::string args) { PSPECIALWORKSPACE = g_pCompositor->createNewWorkspace(workspaceID, PMONITOR->ID, workspaceName); PMONITOR->setSpecialWorkspace(PSPECIALWORKSPACE); + + focusedWorkspace = PSPECIALWORKSPACE; + } + + const static auto PWARPONTOGGLESPECIAL = CConfigValue("cursor:warp_on_toggle_special"); + + if (*PWARPONTOGGLESPECIAL > 0) { + auto PLAST = focusedWorkspace->getLastFocusedWindow(); + auto HLSurface = CWLSurface::fromResource(g_pSeatManager->state.pointerFocus.lock()); + + if (PLAST && (!HLSurface || HLSurface->getWindow())) + PLAST->warpCursor(*PWARPONTOGGLESPECIAL == 2); } return {};