From 1031d5590b01466e8e910707ec80f7130f742201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miskolczi=20Rich=C3=A1rd?= Date: Tue, 6 Jan 2026 16:16:14 +0100 Subject: [PATCH] Feature: query current windowing mode --- README.md | 11 ++++++++++- include/HyprlandService.h | 1 + src/HyprlandService.cpp | 14 ++++++++++++++ src/main.cpp | 40 ++++++++++++++++++++++++++------------- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9aa4f49..c6450f7 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Check out [the demo](https://typofelho.ddns.net/TypoMustakes/hyprland-toggle-til Let's say you switched to tiling mode. From that point on, new windows will open in tiling mode as well. Switch to floating mode again and newly opened windows will be in floating mode. - Floating/tiling window rules are isolated between workspaces. You can set one workspace to be floating, and all the rest to tiling for example. +- Returns applied rule for the current workspace. Useful for scripting. - Useful for workflows that require both tiling and floating window management. - Lightweight and easy to integrate with your Hyprland setup. @@ -75,7 +76,15 @@ or go nuts and... # Usage ```shell -./htt +./htt (-q) +``` +- `-q`: Print the rule applied on the current workspace to STDOUT, but don't change anything. If there isn't an active rule for the current workspace, it returns a tiling rule. The returned string is a valid Hyprland window rule configuration line, like so: + +```shell +# (On workspace 2...) +$ ./htt ~/.cache/htt/rules -q + +windowrule = tile on, match:workspace 2 ``` - If the specified configuration file does not exist, it will be created. - If the configuration contains existing rules, this should still work, but your existing configuration will probably get a bit messy, syntax-wise. I advise against it. diff --git a/include/HyprlandService.h b/include/HyprlandService.h index 4c62e75..773bdc0 100644 --- a/include/HyprlandService.h +++ b/include/HyprlandService.h @@ -23,5 +23,6 @@ class HyprlandService { static void setClientTiled(Client&); static void toggleClientFloating(Client&); static bool isFloatingRulePresent(); + static WindowRule getActiveWorkspaceRule(); }; #endif diff --git a/src/HyprlandService.cpp b/src/HyprlandService.cpp index 91c5377..21907f0 100644 --- a/src/HyprlandService.cpp +++ b/src/HyprlandService.cpp @@ -134,4 +134,18 @@ bool HyprlandService::isFloatingRulePresent() { } return false; +}; + +WindowRule HyprlandService::getActiveWorkspaceRule() { + std::list rules = getWindowRules(); + int id = getCurrentWorkspace().id; + + for (auto& rule : rules) { + if (rule.workspaceID == id) { + return rule; + } + } + + //If no rule is found, return a default rule (tiled) + return WindowRule {.tile = true, .workspaceID = id}; }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0cb0d2a..80b32dc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,23 +1,37 @@ #include #include "../include/HyprlandService.h" -int main(int argc, char** argv){ - if (argc < 2) { - std::cerr << "Usage: " << argv[0] << " \n"; +void help(char* execPath) { + std::cerr << "Usage: " << execPath << " (-q)\n\n"; + std::cerr << "-q:\tQuery current windowing mode, don't change anything.\n\tReturns Hyprland window rule active on current workspace.\n\tIf no rule is active, returns a default tiled rule.\n"; exit(1); +} + +int main(int argc, char** argv) { + if (argc < 2) { + help(argv[0]); } HyprlandService::setConfigFilePath(argv[1]); - if (HyprlandService::isFloatingRulePresent()) { - for (auto& c : HyprlandService::getClientsOnActiveWorkspace()) { - HyprlandService::setClientTiled(c); - } - HyprlandService::setFloatingRule(false); - } else { - for (auto& c : HyprlandService::getClientsOnActiveWorkspace()) { - HyprlandService::setClientFloating(c); - } - HyprlandService::setFloatingRule(true); + if (argc == 3 && argv[2] == std::string("-q")) { + WindowRule rule = HyprlandService::getActiveWorkspaceRule(); + std::cout << rule.toString() << std::endl; } + else if (argc == 2) { + if (HyprlandService::isFloatingRulePresent()) { + for (auto& c : HyprlandService::getClientsOnActiveWorkspace()) { + HyprlandService::setClientTiled(c); + } + HyprlandService::setFloatingRule(false); + } else { + for (auto& c : HyprlandService::getClientsOnActiveWorkspace()) { + HyprlandService::setClientFloating(c); + } + HyprlandService::setFloatingRule(true); + } + } + else (help(argv[0])); + + exit(0); } \ No newline at end of file