hyprland: workspace/rules module init
still some work too be done, the regex types are cursed.
This commit is contained in:
parent
0b8a730519
commit
0873f56c28
5 changed files with 447 additions and 22 deletions
140
modules/home/workstation/hyprland/settings/options/default.nix
Normal file
140
modules/home/workstation/hyprland/settings/options/default.nix
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
{
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
inherit
|
||||
(lib)
|
||||
flatten
|
||||
attrValues
|
||||
concatStringsSep
|
||||
filterAttrs
|
||||
mapAttrsToList
|
||||
boolToString
|
||||
mkOption
|
||||
isBool
|
||||
;
|
||||
inherit
|
||||
(lib.types)
|
||||
listOf
|
||||
attrsOf
|
||||
submodule
|
||||
nullOr
|
||||
str
|
||||
int
|
||||
bool
|
||||
oneOf
|
||||
;
|
||||
|
||||
# our cursed regex types
|
||||
hyprland = import ./rules.nix {inherit lib;};
|
||||
|
||||
_toString = type: val:
|
||||
if isBool val
|
||||
then
|
||||
if type == "windowrule"
|
||||
then
|
||||
if val
|
||||
then "1"
|
||||
else "0"
|
||||
else boolToString val # for workspace rules
|
||||
else toString val;
|
||||
|
||||
# format rules for hyprland
|
||||
formatRules = type: rule:
|
||||
concatStringsSep "," (
|
||||
mapAttrsToList (name: value: "${name}:${_toString type value}")
|
||||
(filterAttrs (_: v: v != null) rule)
|
||||
);
|
||||
|
||||
# workspace handling
|
||||
mkWorkspaces = mapAttrsToList (
|
||||
selector: rules: "${selector},${formatRules "workspacerule" rules}"
|
||||
);
|
||||
|
||||
# rule options
|
||||
mkRuleOption = type: description:
|
||||
mkOption {
|
||||
type = nullOr type;
|
||||
default = null;
|
||||
inherit description;
|
||||
};
|
||||
|
||||
# window rule matchers
|
||||
windowRuleMatchers = submodule {
|
||||
options = {
|
||||
class = mkRuleOption str "Window class matcher";
|
||||
title = mkRuleOption str "Window title matcher";
|
||||
initialClass = mkRuleOption str "Initial window class matcher";
|
||||
initialTitle = mkRuleOption str "Initial window title matcher";
|
||||
xwayland = mkRuleOption bool "Match XWayland windows";
|
||||
floating = mkRuleOption bool "Match floating windows";
|
||||
fullscreen = mkRuleOption bool "Match fullscreen windows";
|
||||
workspace = mkRuleOption str "Match windows on specific workspace";
|
||||
};
|
||||
};
|
||||
|
||||
# Workspace rules submodule
|
||||
workspaceRules = submodule {
|
||||
options = {
|
||||
name = mkRuleOption str "Default name of workspace";
|
||||
monitor = mkRuleOption str "Binds workspace to monitor";
|
||||
default = mkRuleOption bool "Set as default workspace for monitor";
|
||||
gapsin = mkRuleOption int "Gaps between windows";
|
||||
gapsout = mkRuleOption int "Gaps between windows and monitor edges";
|
||||
bordersize = mkRuleOption int "Border size around windows";
|
||||
border = mkRuleOption bool "Draw borders";
|
||||
shadow = mkRuleOption bool "Draw shadows";
|
||||
rounding = mkRuleOption bool "Draw rounded corners";
|
||||
decorate = mkRuleOption bool "Draw window decorations";
|
||||
persistent = mkRuleOption bool "Keep workspace alive when empty";
|
||||
on-created-empty = mkRuleOption str "Command to run when workspace created empty";
|
||||
};
|
||||
};
|
||||
|
||||
# Window rules type using our validated types from rules.nix
|
||||
windowRuleType = listOf (oneOf (attrValues hyprland.types));
|
||||
|
||||
cfg = config.wayland.windowManager.hyprland;
|
||||
in {
|
||||
options.wayland.windowManager.hyprland = {
|
||||
# Workspace configuration
|
||||
workspaces = mkOption {
|
||||
type = attrsOf workspaceRules;
|
||||
default = {};
|
||||
description = "Workspace-specific configurations";
|
||||
};
|
||||
|
||||
# Window rules configuration
|
||||
windowRules = mkOption {
|
||||
type = listOf (submodule {
|
||||
options = {
|
||||
matches = mkOption {
|
||||
type = windowRuleMatchers;
|
||||
description = "Window matching criteria";
|
||||
};
|
||||
rules = mkOption {
|
||||
type = windowRuleType;
|
||||
description = "Rules to apply to matching windows";
|
||||
};
|
||||
};
|
||||
});
|
||||
default = [];
|
||||
description = "Window-specific rules";
|
||||
};
|
||||
};
|
||||
|
||||
config.wayland.windowManager.hyprland.settings = {
|
||||
workspace = mkWorkspaces cfg.workspaces;
|
||||
windowrulev2 = let
|
||||
# Convert rules to Hyprland format
|
||||
formatWindowRule = rule: let
|
||||
matches = formatRules "windowrule" rule.matches;
|
||||
rules = map (r: "${r},${matches}") rule.rules;
|
||||
in
|
||||
rules;
|
||||
in
|
||||
flatten (map formatWindowRule cfg.windowRules);
|
||||
};
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue