diff options
author | normaltaro <[email protected]> | 2024-12-14 01:58:57 +0530 |
---|---|---|
committer | GitHub <[email protected]> | 2024-12-13 21:28:57 +0100 |
commit | 452a7e6905de61f076065ef4c294dc62f86327ae (patch) | |
tree | c326c34f0cd9f0d61a99615556556640e029a787 | |
parent | 61a51bb4ef5ff38a8482933da1756bf31d4475be (diff) | |
download | Hyprland-452a7e6905de61f076065ef4c294dc62f86327ae.tar.gz Hyprland-452a7e6905de61f076065ef4c294dc62f86327ae.zip |
dispatchers: Add an option to prioritize focus change within groups with movefocus (#8601)
* modified movefocus dispatcher to prioritize focus change within groups
* pass clang-format check
* `movefocus` cycling groups set optional to config bool `movefocus_cycles_groupfirst`
* Update ConfigDescriptions.hpp
-rw-r--r-- | src/config/ConfigDescriptions.hpp | 6 | ||||
-rw-r--r-- | src/config/ConfigManager.cpp | 1 | ||||
-rw-r--r-- | src/managers/KeybindManager.cpp | 16 |
3 files changed, 23 insertions, 0 deletions
diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index a9ac223a..6792a763 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1201,6 +1201,12 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = { .data = SConfigOptionDescription::SBoolData{true}, }, SConfigOptionDescription{ + .value = "binds:movefocus_cycles_groupfirst", + .description = "If enabled, when in a grouped window, movefocus will cycle windows in the groups first, then at each ends of tabs, it'll move on to other windows/groups", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{false}, + }, + SConfigOptionDescription{ .value = "binds:disable_keybind_grabbing", .description = "If enabled, apps that request keybinds to be disabled (e.g. VMs) will not be able to do so.", .type = CONFIG_OPTION_BOOL, diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index b53ed4d9..b80fd427 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -544,6 +544,7 @@ CConfigManager::CConfigManager() { m_pConfig->addConfigValue("binds:focus_preferred_method", Hyprlang::INT{0}); m_pConfig->addConfigValue("binds:ignore_group_lock", Hyprlang::INT{0}); m_pConfig->addConfigValue("binds:movefocus_cycles_fullscreen", Hyprlang::INT{1}); + m_pConfig->addConfigValue("binds:movefocus_cycles_groupfirst", Hyprlang::INT{0}); m_pConfig->addConfigValue("binds:disable_keybind_grabbing", Hyprlang::INT{0}); m_pConfig->addConfigValue("binds:window_direction_monitor_fallback", Hyprlang::INT{1}); m_pConfig->addConfigValue("binds:allow_pin_fullscreen", Hyprlang::INT{0}); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 67c2c5d0..8afa330b 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1374,6 +1374,7 @@ SDispatchResult CKeybindManager::moveActiveToWorkspaceSilent(std::string args) { SDispatchResult CKeybindManager::moveFocusTo(std::string args) { static auto PFULLCYCLE = CConfigValue<Hyprlang::INT>("binds:movefocus_cycles_fullscreen"); static auto PMONITORFALLBACK = CConfigValue<Hyprlang::INT>("binds:window_direction_monitor_fallback"); + static auto PGROUPCYCLE = CConfigValue<Hyprlang::INT>("binds:movefocus_cycles_groupfirst"); char arg = args[0]; if (!isDirection(args)) { @@ -1393,6 +1394,21 @@ SDispatchResult CKeybindManager::moveFocusTo(std::string args) { (arg == 'd' || arg == 'b' || arg == 'r' ? g_pCompositor->getNextWindowOnWorkspace(PLASTWINDOW, true) : g_pCompositor->getPrevWindowOnWorkspace(PLASTWINDOW, true)) : g_pCompositor->getWindowInDirection(PLASTWINDOW, arg); + // Prioritize focus change within groups if the window is a part of it. + if (*PGROUPCYCLE) { + if (!PLASTWINDOW->m_sGroupData.pNextWindow.expired()) { + if (arg == 'l' && PLASTWINDOW != PLASTWINDOW->getGroupHead()) { + PLASTWINDOW->setGroupCurrent(PLASTWINDOW->getGroupPrevious()); + return {}; + } + + else if (arg == 'r' && PLASTWINDOW != PLASTWINDOW->getGroupTail()) { + PLASTWINDOW->setGroupCurrent(PLASTWINDOW->m_sGroupData.pNextWindow.lock()); + return {}; + } + } + } + // Found window in direction, switch to it if (PWINDOWTOCHANGETO) { switchToWindow(PWINDOWTOCHANGETO); |