From ba24547d3d784531f86aecfd145d590889302d5a Mon Sep 17 00:00:00 2001 From: Nj0be <77834064+Nj0be@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:07:55 +0200 Subject: [PATCH] dispatchers: add set, unset and toggle to fullscreen (#11893) Add set, unset and toggle to fullscreen --- hyprtester/src/tests/main/misc.cpp | 63 ++++++++++++++++++++++++++++++ src/managers/KeybindManager.cpp | 39 ++++++++++++------ 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/hyprtester/src/tests/main/misc.cpp b/hyprtester/src/tests/main/misc.cpp index a90214ce..7b42af13 100644 --- a/hyprtester/src/tests/main/misc.cpp +++ b/hyprtester/src/tests/main/misc.cpp @@ -131,6 +131,69 @@ static bool test() { EXPECT_CONTAINS(str, "fullscreen: 2"); } + Tests::killAllWindows(); + + NLog::log("{}Testing fullscreen and fullscreenstate dispatcher", Colors::YELLOW); + + Tests::spawnKitty("kitty_A"); + Tests::spawnKitty("kitty_B"); + + OK(getFromSocket("/dispatch fullscreen 0 set")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 2"); + } + + OK(getFromSocket("/dispatch fullscreen 0 unset")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 0"); + } + + OK(getFromSocket("/dispatch fullscreen 1 toggle")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 1"); + } + + OK(getFromSocket("/dispatch fullscreen 1 toggle")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 0"); + } + + OK(getFromSocket("/dispatch fullscreenstate 2 2 set")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 2"); + } + + OK(getFromSocket("/dispatch fullscreenstate 2 2 set")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 2"); + } + + OK(getFromSocket("/dispatch fullscreenstate 2 2 toggle")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 0"); + } + + OK(getFromSocket("/dispatch fullscreenstate 2 2 toggle")); + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "fullscreen: 2"); + } + // kill all NLog::log("{}Killing all windows", Colors::YELLOW); Tests::killAllWindows(); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 58d451b3..81c88d63 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -28,6 +28,7 @@ #include #include +#include #include using namespace Hyprutils::String; using namespace Hyprutils::OS; @@ -1310,23 +1311,31 @@ SDispatchResult CKeybindManager::changeworkspace(std::string args) { SDispatchResult CKeybindManager::fullscreenActive(std::string args) { const auto PWINDOW = g_pCompositor->m_lastWindow.lock(); + const auto ARGS = CConstVarList(args, 2, ' '); if (!PWINDOW) return {.success = false, .error = "Window not found"}; - const eFullscreenMode MODE = args == "1" ? FSMODE_MAXIMIZED : FSMODE_FULLSCREEN; + const eFullscreenMode MODE = ARGS.size() > 0 && ARGS[0] == "1" ? FSMODE_MAXIMIZED : FSMODE_FULLSCREEN; - if (PWINDOW->isEffectiveInternalFSMode(MODE)) - g_pCompositor->setWindowFullscreenInternal(PWINDOW, FSMODE_NONE); - else - g_pCompositor->setWindowFullscreenInternal(PWINDOW, MODE); + if (ARGS.size() <= 1 || ARGS[1] == "toggle") { + if (PWINDOW->isEffectiveInternalFSMode(MODE)) + g_pCompositor->setWindowFullscreenInternal(PWINDOW, FSMODE_NONE); + else + g_pCompositor->setWindowFullscreenInternal(PWINDOW, MODE); + } else { + if (ARGS[1] == "set") + g_pCompositor->setWindowFullscreenInternal(PWINDOW, MODE); + else if (ARGS[1] == "unset") + g_pCompositor->setWindowFullscreenInternal(PWINDOW, FSMODE_NONE); + } return {}; } SDispatchResult CKeybindManager::fullscreenStateActive(std::string args) { const auto PWINDOW = g_pCompositor->m_lastWindow.lock(); - const auto ARGS = CVarList(args, 2, ' '); + const auto ARGS = CVarList(args, 3, ' '); if (!PWINDOW) return {.success = false, .error = "Window not found"}; @@ -1344,14 +1353,18 @@ SDispatchResult CKeybindManager::fullscreenStateActive(std::string args) { const SFullscreenState STATE = SFullscreenState{.internal = (internalMode != -1 ? sc(internalMode) : PWINDOW->m_fullscreenState.internal), .client = (clientMode != -1 ? sc(clientMode) : PWINDOW->m_fullscreenState.client)}; - if (internalMode != -1 && clientMode != -1 && PWINDOW->m_fullscreenState.internal == STATE.internal && PWINDOW->m_fullscreenState.client == STATE.client) - g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = FSMODE_NONE, .client = FSMODE_NONE}); - else if (internalMode != -1 && clientMode == -1 && PWINDOW->m_fullscreenState.internal == STATE.internal) - g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = FSMODE_NONE, .client = PWINDOW->m_fullscreenState.client}); - else if (internalMode == -1 && clientMode != -1 && PWINDOW->m_fullscreenState.client == STATE.client) - g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = PWINDOW->m_fullscreenState.internal, .client = FSMODE_NONE}); - else + if (ARGS.size() <= 2 || ARGS[2] == "toggle") { + if (internalMode != -1 && clientMode != -1 && PWINDOW->m_fullscreenState.internal == STATE.internal && PWINDOW->m_fullscreenState.client == STATE.client) + g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = FSMODE_NONE, .client = FSMODE_NONE}); + else if (internalMode != -1 && clientMode == -1 && PWINDOW->m_fullscreenState.internal == STATE.internal) + g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = FSMODE_NONE, .client = PWINDOW->m_fullscreenState.client}); + else if (internalMode == -1 && clientMode != -1 && PWINDOW->m_fullscreenState.client == STATE.client) + g_pCompositor->setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = PWINDOW->m_fullscreenState.internal, .client = FSMODE_NONE}); + else + g_pCompositor->setWindowFullscreenState(PWINDOW, STATE); + } else if (ARGS[2] == "set") { g_pCompositor->setWindowFullscreenState(PWINDOW, STATE); + } PWINDOW->m_windowData.syncFullscreen = CWindowOverridableVar(PWINDOW->m_fullscreenState.internal == PWINDOW->m_fullscreenState.client, PRIORITY_SET_PROP);