HASH 716e7283051b
DATE 2026-03-09
SUBJECT hyprland: update to new rules schema
FILES 3 CHANGED
HASH 716e7283051b
DATE 2026-03-09
SUBJECT hyprland: update to new rules schema
FILES 3 CHANGED
┌─ modules/home/nixos/hyprland/settings/options/default.nix ─────────────────┐
│ diff --git a/modules/home/nixos/hyprland/settings/options/default.nix b/modules/ho │
│ me/nixos/hyprland/settings/options/default.nix │
│ index d59c620..c59064c 100644 │
│ --- a/modules/home/nixos/hyprland/settings/options/default.nix │
│ +++ b/modules/home/nixos/hyprland/settings/options/default.nix │
│ @@ -26,7 +26,6 @@ │
│ oneOf │
│ ; │
│ │
│ - # our cursed regex types │
│ hyprland = import ./rules.nix {inherit lib;}; │
│ │
│ _toString = type: val: │
│ @@ -37,22 +36,27 @@ │
│ if val │
│ then "1" │
│ else "0" │
│ - else boolToString val # for workspace rules │
│ + else boolToString val │
│ else toString val; │
│ │
│ - # format rules for hyprland │
│ - formatRules = type: rule: │
│ + # format match props for window rules: match:name value │
│ + formatWindowMatches = rule: │
│ + concatStringsSep ", " ( │
│ + mapAttrsToList (name: value: "match:${name} ${_toString "windowrule" value} │
│ ") │
│ + (filterAttrs (_: v: v != null) rule) │
│ + ); │
│ + │
│ + # format props for workspace rules: name:value │
│ + formatWorkspaceRules = rule: │
│ concatStringsSep "," ( │
│ - mapAttrsToList (name: value: "${name}:${_toString type value}") │
│ + mapAttrsToList (name: value: "${name}:${_toString "workspacerule" value}") │
│ (filterAttrs (_: v: v != null) rule) │
│ ); │
│ │
│ - # workspace handling │
│ mkWorkspaces = mapAttrsToList ( │
│ - selector: rules: "${selector},${formatRules "workspacerule" rules}" │
│ + selector: rules: "${selector},${formatWorkspaceRules rules}" │
│ ); │
│ │
│ - # rule options │
│ mkRuleOption = type: description: │
│ mkOption { │
│ type = nullOr type; │
│ @@ -60,22 +64,28 @@ │
│ 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"; │
│ + initial_class = mkRuleOption str "Initial window class matcher"; │
│ + initial_title = mkRuleOption str "Initial window title matcher"; │
│ tag = mkRuleOption str "Window tag matcher"; │
│ xwayland = mkRuleOption bool "Match XWayland windows"; │
│ - floating = mkRuleOption bool "Match floating windows"; │
│ + float = mkRuleOption bool "Match floating windows"; │
│ fullscreen = mkRuleOption bool "Match fullscreen windows"; │
│ workspace = mkRuleOption str "Match windows on specific workspace"; │
│ + pin = mkRuleOption bool "Match pinned windows"; │
│ + focus = mkRuleOption bool "Match focused windows"; │
│ + group = mkRuleOption bool "Match grouped windows"; │
│ + modal = mkRuleOption bool "Match modal windows"; │
│ + fullscreen_state_client = mkRuleOption int "Match fullscreen state client"; │
│ + fullscreen_state_internal = mkRuleOption int "Match fullscreen state intern │
│ al"; │
│ + content = mkRuleOption str "Match content type"; │
│ + xdg_tag = mkRuleOption str "Match XDG tag"; │
│ }; │
│ }; │
│ │
│ - # Workspace rules submodule │
│ workspaceRules = submodule { │
│ options = { │
│ name = mkRuleOption str "Default name of workspace"; │
│ @@ -93,20 +103,17 @@ │
│ }; │
│ }; │
│ │
│ - # 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 = { │
│ @@ -127,11 +134,10 @@ in { │
│ │
│ config.wayland.windowManager.hyprland.settings = { │
│ workspace = mkWorkspaces cfg.workspaces; │
│ - windowrulev2 = let │
│ - # Convert rules to Hyprland format │
│ + windowrule = let │
│ formatWindowRule = rule: let │
│ - matches = formatRules "windowrule" rule.matches; │
│ - rules = map (r: "${r},${matches}") rule.rules; │
│ + matches = formatWindowMatches rule.matches; │
│ + rules = map (r: "${r}, ${matches}") rule.rules; │
│ in │
│ rules; │
│ in │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ .../settings/options/default.nix ───┐
│ diff --git a/modules/home/nixos/hyprland/set │
│ tings/options/default.nix b/modules/home/nix │
│ os/hyprland/settings/options/default.nix │
│ index d59c620..c59064c 100644 │
│ --- a/modules/home/nixos/hyprland/settings/o │
│ ptions/default.nix │
│ +++ b/modules/home/nixos/hyprland/settings/o │
│ ptions/default.nix │
│ @@ -26,7 +26,6 @@ │
│ oneOf │
│ ; │
│ │
│ - # our cursed regex types │
│ hyprland = import ./rules.nix {inherit li │
│ b;}; │
│ │
│ _toString = type: val: │
│ @@ -37,22 +36,27 @@ │
│ if val │
│ then "1" │
│ else "0" │
│ - else boolToString val # for workspace │
│ rules │
│ + else boolToString val │
│ else toString val; │
│ │
│ - # format rules for hyprland │
│ - formatRules = type: rule: │
│ + # format match props for window rules: ma │
│ tch:name value │
│ + formatWindowMatches = rule: │
│ + concatStringsSep ", " ( │
│ + mapAttrsToList (name: value: "match:$ │
│ {name} ${_toString "windowrule" value}") │
│ + (filterAttrs (_: v: v != null) rule) │
│ + ); │
│ + │
│ + # format props for workspace rules: name: │
│ value │
│ + formatWorkspaceRules = rule: │
│ concatStringsSep "," ( │
│ - mapAttrsToList (name: value: "${name} │
│ :${_toString type value}") │
│ + mapAttrsToList (name: value: "${name} │
│ :${_toString "workspacerule" value}") │
│ (filterAttrs (_: v: v != null) rule) │
│ ); │
│ │
│ - # workspace handling │
│ mkWorkspaces = mapAttrsToList ( │
│ - selector: rules: "${selector},${formatR │
│ ules "workspacerule" rules}" │
│ + selector: rules: "${selector},${formatW │
│ orkspaceRules rules}" │
│ ); │
│ │
│ - # rule options │
│ mkRuleOption = type: description: │
│ mkOption { │
│ type = nullOr type; │
│ @@ -60,22 +64,28 @@ │
│ inherit description; │
│ }; │
│ │
│ - # window rule matchers │
│ windowRuleMatchers = submodule { │
│ options = { │
│ class = mkRuleOption str "Window clas │
│ s matcher"; │
│ title = mkRuleOption str "Window titl │
│ e matcher"; │
│ - initialClass = mkRuleOption str "Init │
│ ial window class matcher"; │
│ - initialTitle = mkRuleOption str "Init │
│ ial window title matcher"; │
│ + initial_class = mkRuleOption str "Ini │
│ tial window class matcher"; │
│ + initial_title = mkRuleOption str "Ini │
│ tial window title matcher"; │
│ tag = mkRuleOption str "Window tag ma │
│ tcher"; │
│ xwayland = mkRuleOption bool "Match X │
│ Wayland windows"; │
│ - floating = mkRuleOption bool "Match f │
│ loating windows"; │
│ + float = mkRuleOption bool "Match floa │
│ ting windows"; │
│ fullscreen = mkRuleOption bool "Match │
│ fullscreen windows"; │
│ workspace = mkRuleOption str "Match w │
│ indows on specific workspace"; │
│ + pin = mkRuleOption bool "Match pinned │
│ windows"; │
│ + focus = mkRuleOption bool "Match focu │
│ sed windows"; │
│ + group = mkRuleOption bool "Match grou │
│ ped windows"; │
│ + modal = mkRuleOption bool "Match moda │
│ l windows"; │
│ + fullscreen_state_client = mkRuleOptio │
│ n int "Match fullscreen state client"; │
│ + fullscreen_state_internal = mkRuleOpt │
│ ion int "Match fullscreen state internal"; │
│ + content = mkRuleOption str "Match con │
│ tent type"; │
│ + xdg_tag = mkRuleOption str "Match XDG │
│ tag"; │
│ }; │
│ }; │
│ │
│ - # Workspace rules submodule │
│ workspaceRules = submodule { │
│ options = { │
│ name = mkRuleOption str "Default name │
│ of workspace"; │
│ @@ -93,20 +103,17 @@ │
│ }; │
│ }; │
│ │
│ - # Window rules type using our validated t │
│ ypes from rules.nix │
│ windowRuleType = listOf (oneOf (attrValue │
│ s hyprland.types)); │
│ │
│ cfg = config.wayland.windowManager.hyprla │
│ nd; │
│ in { │
│ options.wayland.windowManager.hyprland = │
│ { │
│ - # Workspace configuration │
│ workspaces = mkOption { │
│ type = attrsOf workspaceRules; │
│ default = {}; │
│ description = "Workspace-specific con │
│ figurations"; │
│ }; │
│ │
│ - # Window rules configuration │
│ windowRules = mkOption { │
│ type = listOf (submodule { │
│ options = { │
│ @@ -127,11 +134,10 @@ in { │
│ │
│ config.wayland.windowManager.hyprland.set │
│ tings = { │
│ workspace = mkWorkspaces cfg.workspaces │
│ ; │
│ - windowrulev2 = let │
│ - # Convert rules to Hyprland format │
│ + windowrule = let │
│ formatWindowRule = rule: let │
│ - matches = formatRules "windowrule" │
│ rule.matches; │
│ - rules = map (r: "${r},${matches}") │
│ rule.rules; │
│ + matches = formatWindowMatches rule. │
│ matches; │
│ + rules = map (r: "${r}, ${matches}") │
│ rule.rules; │
│ in │
│ rules; │
│ in │
└──────────────────────────────────────────────┘
┌─ modules/home/nixos/hyprland/settings/options/rules.nix ───────────────────┐
│ diff --git a/modules/home/nixos/hyprland/settings/options/rules.nix b/modules/home │
│ /nixos/hyprland/settings/options/rules.nix │
│ index 99b5356..555d957 100644 │
│ --- a/modules/home/nixos/hyprland/settings/options/rules.nix │
│ +++ b/modules/home/nixos/hyprland/settings/options/rules.nix │
│ @@ -1,6 +1,6 @@ │
│ {lib, ...}: let │
│ inherit (lib) concatStringsSep attrValues; │
│ - inherit (lib.types) enum strMatching; │
│ + inherit (lib.types) strMatching; │
│ │
│ # helper function for constructing regex patterns for hyprland rules │
│ mkRegexTarget = { │
│ @@ -17,69 +17,53 @@ │
│ in │
│ strMatching "${name}${parameterPart}${extraRegex}"; │
│ │
│ - # basic windowrules that can be validated with simple enum │
│ - │
│ - basicWindowRules = enum [ │
│ + toggleableRules = [ │
│ "float" │
│ "tile" │
│ "fullscreen" │
│ "maximize" │
│ "pseudo" │
│ - "noinitialfocus" │
│ + "no_initial_focus" │
│ "pin" │
│ - "unset" │
│ - "nomaxsize" │
│ - "stayfocused" │
│ - ]; │
│ - │
│ - # toggleable options │
│ - toggleableRules = [ │
│ - # window decoration │
│ - "decorate" # window decorations │
│ - "noborder" # borders │
│ - "noshadow" # shadows │
│ - "norounding" # corner rounding │
│ - │
│ - # Visual effects │
│ - "noblur" # blur │
│ - "noanim" # animations │
│ - "nodim" # dimming │
│ - "opaque" # opacity enforcement │
│ - "forcergbx" # RGB handling │
│ - "xray" # blur xray mode │
│ - "immediate" # tearing mode │
│ - │
│ - # Behavior │
│ - "dimaround" # dim around window │
│ - "focusonactivate" # focus on activation request │
│ - "nofocus" # disable focus │
│ - "stayfocused" # keep focus │
│ - "keepaspectratio" # maintain aspect ratio │
│ - "nearestneighbor" # nearest neighbor filtering │
│ - "nomaxsize" # disable max size │
│ - "noshortcutsinhibit" # shortcut inhibiting │
│ - "allowsinput" # XWayland input forcing │
│ - "renderunfocused" # unfocused rendering │
│ - "syncfullscreen" # fullscreen sync │
│ + "decorate" │
│ + "no_blur" │
│ + "no_anim" │
│ + "no_dim" │
│ + "opaque" │
│ + "force_rgbx" │
│ + "xray" │
│ + "immediate" │
│ + "dim_around" │
│ + "focus_on_activate" │
│ + "no_focus" │
│ + "stay_focused" │
│ + "keep_aspect_ratio" │
│ + "nearest_neighbor" │
│ + "no_max_size" │
│ + "no_shortcuts_inhibit" │
│ + "allows_input" │
│ + "render_unfocused" │
│ + "sync_fullscreen" │
│ + "no_shadow" │
│ + "center" │
│ + "persistent_size" │
│ + "no_follow_mouse" │
│ + "no_screen_share" │
│ + "no_vrr" │
│ ]; │
│ │
│ - # reusable regex pattens to be used in constructing our types │
│ patterns = { │
│ - # toggles │
│ - onOpt = "1|true|on|yes|0|salse|off|no|toggle|unset"; │
│ + onOpt = "1|true|on|yes|0|false|off|no|toggle|unset"; │
│ │
│ - # numbers │
│ float = "[+-]?([0-9]*[.])?[0-9]+"; │
│ int = "[0-9]+"; │
│ alpha = ''(0|0?\.[[:digit:]]+|1|1\.0)''; │
│ percentage = "[0-9]+(%)?"; │
│ │
│ - # position │
│ anchor = "100%-w?-[0-9]+"; │
│ coordinate = "${patterns.percentage}|${patterns.anchor}"; │
│ deg = "(0-360)"; │
│ │
│ - # identification │
│ numericId = "[1-9][0-9]*"; │
│ sign = "[+-]"; │
│ relative = "${patterns.sign}${patterns.numericId}"; │
│ @@ -94,7 +78,6 @@ │
│ previous = "previous(_per_monitor)?"; │
│ openWorkspace = "e(${patterns.sign}${patterns.numericId}|~${patterns.numericI │
│ d})"; │
│ │
│ - # colors │
│ rgbValue = ''([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])''; │
│ rgbaHex = ''rgba\([[:xdigit:]]{8}\)''; │
│ rgbaDecimal = ''rgba\(${patterns.rgbValue}, *${patterns.rgbValue}, *${pattern │
│ s.rgbValue}, *${patterns.alpha}\)''; │
│ @@ -123,11 +106,8 @@ │
│ }) │
│ toggleableRules); │
│ │
│ - # regex patterns to pass to the workspace rule │
│ - │
│ types = │
│ { │
│ - inherit basicWindowRules; │
│ workspace = mkRegexTarget { │
│ name = "workspace"; │
│ regex = attrValues { │
│ @@ -164,13 +144,13 @@ │
│ ]; │
│ }; │
│ │
│ - bordercolor = mkRegexTarget { │
│ - name = "bordercolor"; │
│ + border_color = mkRegexTarget { │
│ + name = "border_color"; │
│ regex = [patterns.color]; │
│ }; │
│ │
│ - idleinhibit = mkRegexTarget { │
│ - name = "idleinhibit"; │
│ + idle_inhibit = mkRegexTarget { │
│ + name = "idle_inhibit"; │
│ regex = [patterns.mode]; │
│ }; │
│ │
│ @@ -185,19 +165,13 @@ │
│ ]; │
│ }; │
│ │
│ - center = mkRegexTarget { │
│ - name = "center"; │
│ - regex = ["[0-1]"]; │
│ - optional = true; │
│ - }; │
│ - │
│ - roundingpower = mkRegexTarget { │
│ - name = "roundingpower"; │
│ + rounding_power = mkRegexTarget { │
│ + name = "rounding_power"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ - bordersize = mkRegexTarget { │
│ - name = "bordersize"; │
│ + border_size = mkRegexTarget { │
│ + name = "border_size"; │
│ regex = [patterns.int]; │
│ }; │
│ │
│ @@ -206,13 +180,13 @@ │
│ regex = [patterns.int]; │
│ }; │
│ │
│ - scrollmouse = mkRegexTarget { │
│ - name = "scrollmouse"; │
│ + scroll_mouse = mkRegexTarget { │
│ + name = "scroll_mouse"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ - scrolltouchpad = mkRegexTarget { │
│ - name = "scrolltouchpad"; │
│ + scroll_touchpad = mkRegexTarget { │
│ + name = "scroll_touchpad"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ @@ -221,19 +195,40 @@ │
│ regex = [''[+-]?[[:alnum:]_]+\*?'']; │
│ }; │
│ │
│ - maxsize = mkRegexTarget { │
│ - name = "maxsize"; │
│ + max_size = mkRegexTarget { │
│ + name = "max_size"; │
│ regex = ["${patterns.int} ${patterns.int}"]; │
│ }; │
│ │
│ - minsize = mkRegexTarget { │
│ - name = "minsize"; │
│ + min_size = mkRegexTarget { │
│ + name = "min_size"; │
│ regex = ["${patterns.int} ${patterns.int}"]; │
│ }; │
│ + │
│ animation = mkRegexTarget { │
│ name = "animation"; │
│ regex = ["(slide)( (left|right|up|down|top|bottom))?|(popin)( ([0-9]+%))? │
│ "]; │
│ }; │
│ + │
│ + fullscreen_state = mkRegexTarget { │
│ + name = "fullscreen_state"; │
│ + regex = ["[0-3] [0-3]"]; │
│ + }; │
│ + │
│ + suppress_event = mkRegexTarget { │
│ + name = "suppress_event"; │
│ + regex = ["[a-z_]+( [a-z_]+)*"]; │
│ + }; │
│ + │
│ + content = mkRegexTarget { │
│ + name = "content"; │
│ + regex = ["none|photo|video|game"]; │
│ + }; │
│ + │
│ + no_close_for = mkRegexTarget { │
│ + name = "no_close_for"; │
│ + regex = [patterns.int]; │
│ + }; │
│ } │
│ // toggleTargets; │
│ in { │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ ...nd/settings/options/rules.nix ───┐
│ diff --git a/modules/home/nixos/hyprland/set │
│ tings/options/rules.nix b/modules/home/nixos │
│ /hyprland/settings/options/rules.nix │
│ index 99b5356..555d957 100644 │
│ --- a/modules/home/nixos/hyprland/settings/o │
│ ptions/rules.nix │
│ +++ b/modules/home/nixos/hyprland/settings/o │
│ ptions/rules.nix │
│ @@ -1,6 +1,6 @@ │
│ {lib, ...}: let │
│ inherit (lib) concatStringsSep attrValues │
│ ; │
│ - inherit (lib.types) enum strMatching; │
│ + inherit (lib.types) strMatching; │
│ │
│ # helper function for constructing regex │
│ patterns for hyprland rules │
│ mkRegexTarget = { │
│ @@ -17,69 +17,53 @@ │
│ in │
│ strMatching "${name}${parameterPart}${e │
│ xtraRegex}"; │
│ │
│ - # basic windowrules that can be validated │
│ with simple enum │
│ - │
│ - basicWindowRules = enum [ │
│ + toggleableRules = [ │
│ "float" │
│ "tile" │
│ "fullscreen" │
│ "maximize" │
│ "pseudo" │
│ - "noinitialfocus" │
│ + "no_initial_focus" │
│ "pin" │
│ - "unset" │
│ - "nomaxsize" │
│ - "stayfocused" │
│ - ]; │
│ - │
│ - # toggleable options │
│ - toggleableRules = [ │
│ - # window decoration │
│ - "decorate" # window decorations │
│ - "noborder" # borders │
│ - "noshadow" # shadows │
│ - "norounding" # corner rounding │
│ - │
│ - # Visual effects │
│ - "noblur" # blur │
│ - "noanim" # animations │
│ - "nodim" # dimming │
│ - "opaque" # opacity enforcement │
│ - "forcergbx" # RGB handling │
│ - "xray" # blur xray mode │
│ - "immediate" # tearing mode │
│ - │
│ - # Behavior │
│ - "dimaround" # dim around window │
│ - "focusonactivate" # focus on activation │
│ request │
│ - "nofocus" # disable focus │
│ - "stayfocused" # keep focus │
│ - "keepaspectratio" # maintain aspect rat │
│ io │
│ - "nearestneighbor" # nearest neighbor fi │
│ ltering │
│ - "nomaxsize" # disable max size │
│ - "noshortcutsinhibit" # shortcut inhibit │
│ ing │
│ - "allowsinput" # XWayland input forcing │
│ - "renderunfocused" # unfocused rendering │
│ - "syncfullscreen" # fullscreen sync │
│ + "decorate" │
│ + "no_blur" │
│ + "no_anim" │
│ + "no_dim" │
│ + "opaque" │
│ + "force_rgbx" │
│ + "xray" │
│ + "immediate" │
│ + "dim_around" │
│ + "focus_on_activate" │
│ + "no_focus" │
│ + "stay_focused" │
│ + "keep_aspect_ratio" │
│ + "nearest_neighbor" │
│ + "no_max_size" │
│ + "no_shortcuts_inhibit" │
│ + "allows_input" │
│ + "render_unfocused" │
│ + "sync_fullscreen" │
│ + "no_shadow" │
│ + "center" │
│ + "persistent_size" │
│ + "no_follow_mouse" │
│ + "no_screen_share" │
│ + "no_vrr" │
│ ]; │
│ │
│ - # reusable regex pattens to be used in co │
│ nstructing our types │
│ patterns = { │
│ - # toggles │
│ - onOpt = "1|true|on|yes|0|salse|off|no|t │
│ oggle|unset"; │
│ + onOpt = "1|true|on|yes|0|false|off|no|t │
│ oggle|unset"; │
│ │
│ - # numbers │
│ float = "[+-]?([0-9]*[.])?[0-9]+"; │
│ int = "[0-9]+"; │
│ alpha = ''(0|0?\.[[:digit:]]+|1|1\.0)'' │
│ ; │
│ percentage = "[0-9]+(%)?"; │
│ │
│ - # position │
│ anchor = "100%-w?-[0-9]+"; │
│ coordinate = "${patterns.percentage}|${ │
│ patterns.anchor}"; │
│ deg = "(0-360)"; │
│ │
│ - # identification │
│ numericId = "[1-9][0-9]*"; │
│ sign = "[+-]"; │
│ relative = "${patterns.sign}${patterns. │
│ numericId}"; │
│ @@ -94,7 +78,6 @@ │
│ previous = "previous(_per_monitor)?"; │
│ openWorkspace = "e(${patterns.sign}${pa │
│ tterns.numericId}|~${patterns.numericId})"; │
│ │
│ - # colors │
│ rgbValue = ''([1-9]?[0-9]|1[0-9]{2}|2[0 │
│ -4][0-9]|25[0-5])''; │
│ rgbaHex = ''rgba\([[:xdigit:]]{8}\)''; │
│ rgbaDecimal = ''rgba\(${patterns.rgbVal │
│ ue}, *${patterns.rgbValue}, *${patterns.rgbV │
│ alue}, *${patterns.alpha}\)''; │
│ @@ -123,11 +106,8 @@ │
│ }) │
│ toggleableRules); │
│ │
│ - # regex patterns to pass to the workspace │
│ rule │
│ - │
│ types = │
│ { │
│ - inherit basicWindowRules; │
│ workspace = mkRegexTarget { │
│ name = "workspace"; │
│ regex = attrValues { │
│ @@ -164,13 +144,13 @@ │
│ ]; │
│ }; │
│ │
│ - bordercolor = mkRegexTarget { │
│ - name = "bordercolor"; │
│ + border_color = mkRegexTarget { │
│ + name = "border_color"; │
│ regex = [patterns.color]; │
│ }; │
│ │
│ - idleinhibit = mkRegexTarget { │
│ - name = "idleinhibit"; │
│ + idle_inhibit = mkRegexTarget { │
│ + name = "idle_inhibit"; │
│ regex = [patterns.mode]; │
│ }; │
│ │
│ @@ -185,19 +165,13 @@ │
│ ]; │
│ }; │
│ │
│ - center = mkRegexTarget { │
│ - name = "center"; │
│ - regex = ["[0-1]"]; │
│ - optional = true; │
│ - }; │
│ - │
│ - roundingpower = mkRegexTarget { │
│ - name = "roundingpower"; │
│ + rounding_power = mkRegexTarget { │
│ + name = "rounding_power"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ - bordersize = mkRegexTarget { │
│ - name = "bordersize"; │
│ + border_size = mkRegexTarget { │
│ + name = "border_size"; │
│ regex = [patterns.int]; │
│ }; │
│ │
│ @@ -206,13 +180,13 @@ │
│ regex = [patterns.int]; │
│ }; │
│ │
│ - scrollmouse = mkRegexTarget { │
│ - name = "scrollmouse"; │
│ + scroll_mouse = mkRegexTarget { │
│ + name = "scroll_mouse"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ - scrolltouchpad = mkRegexTarget { │
│ - name = "scrolltouchpad"; │
│ + scroll_touchpad = mkRegexTarget { │
│ + name = "scroll_touchpad"; │
│ regex = [patterns.float]; │
│ }; │
│ │
│ @@ -221,19 +195,40 @@ │
│ regex = [''[+-]?[[:alnum:]_]+\*?''] │
│ ; │
│ }; │
│ │
│ - maxsize = mkRegexTarget { │
│ - name = "maxsize"; │
│ + max_size = mkRegexTarget { │
│ + name = "max_size"; │
│ regex = ["${patterns.int} ${pattern │
│ s.int}"]; │
│ }; │
│ │
│ - minsize = mkRegexTarget { │
│ - name = "minsize"; │
│ + min_size = mkRegexTarget { │
│ + name = "min_size"; │
│ regex = ["${patterns.int} ${pattern │
│ s.int}"]; │
│ }; │
│ + │
│ animation = mkRegexTarget { │
│ name = "animation"; │
│ regex = ["(slide)( (left|right|up|d │
│ own|top|bottom))?|(popin)( ([0-9]+%))?"]; │
│ }; │
│ + │
│ + fullscreen_state = mkRegexTarget { │
│ + name = "fullscreen_state"; │
│ + regex = ["[0-3] [0-3]"]; │
│ + }; │
│ + │
│ + suppress_event = mkRegexTarget { │
│ + name = "suppress_event"; │
│ + regex = ["[a-z_]+( [a-z_]+)*"]; │
│ + }; │
│ + │
│ + content = mkRegexTarget { │
│ + name = "content"; │
│ + regex = ["none|photo|video|game"]; │
│ + }; │
│ + │
│ + no_close_for = mkRegexTarget { │
│ + name = "no_close_for"; │
│ + regex = [patterns.int]; │
│ + }; │
│ } │
│ // toggleTargets; │
│ in { │
└──────────────────────────────────────────────┘
┌─ modules/home/nixos/hyprland/settings/rules.nix ───────────────────────────┐
│ diff --git a/modules/home/nixos/hyprland/settings/rules.nix b/modules/home/nixos/h │
│ yprland/settings/rules.nix │
│ index 020fd2d..d649668 100644 │
│ --- a/modules/home/nixos/hyprland/settings/rules.nix │
│ +++ b/modules/home/nixos/hyprland/settings/rules.nix │
│ @@ -6,8 +6,8 @@ in { │
│ wayland.windowManager.hyprland.windowRules = [ │
│ # TODO tag games for immediate │
│ { │
│ - matches = {initialTitle = "Syncthing Tray";}; │
│ - rules = ["float" "center 1" "size 50%"]; │
│ + matches = {initial_title = "Syncthing Tray";}; │
│ + rules = ["float 1" "center 1" "size 50%"]; │
│ } │
│ { │
│ matches = {class = "factorio";}; │
│ @@ -18,12 +18,12 @@ in { │
│ rules = ["tag +games"]; │
│ } │
│ { │
│ - matches = {initialTitle = "Dolphin";}; │
│ - rules = ["tag +games" "idleinhibit focus"]; │
│ + matches = {initial_title = "Dolphin";}; │
│ + rules = ["tag +games" "idle_inhibit focus"]; │
│ } │
│ { │
│ matches = {tag = "games";}; │
│ - rules = ["workspace 6" "immediate"]; │
│ + rules = ["workspace 6" "immediate 1"]; │
│ } │
│ { │
│ matches = {title = "Steam";}; │
│ @@ -31,19 +31,19 @@ in { │
│ } │
│ { │
│ matches = {title = "Steam Settings";}; │
│ - rules = ["float" "size 50%" "center 1"]; │
│ + rules = ["float 1" "size 50%" "center 1"]; │
│ } │
│ { │
│ matches = {class = "firefox";}; │
│ - rules = ["idleinhibit fullscreen"]; │
│ + rules = ["idle_inhibit fullscreen"]; │
│ } │
│ { │
│ matches = {class = "1Password";}; │
│ - rules = ["center 1" "float" "size 50%"]; │
│ + rules = ["center 1" "float 1" "size 50%"]; │
│ } │
│ { │
│ matches = {title = "BTOP";}; │
│ - rules = ["float" "size 85%" "pin" "center 1" "stayfocused" "dimaround"]; │
│ + rules = ["float 1" "size 85%" "pin 1" "center 1" "stay_focused 1" "dim_arou │
│ nd 1"]; │
│ } │
│ { │
│ matches = {class = "vesktop";}; │
│ @@ -51,18 +51,18 @@ in { │
│ } │
│ { │
│ matches = {title = "^(Picture-in-Picture)$";}; │
│ - rules = ["float" "pin"]; │
│ + rules = ["float 1" "pin 1"]; │
│ } │
│ { │
│ matches = {title = "^(Open Files)$";}; │
│ - rules = ["center 1" "float" "size 50%"]; │
│ + rules = ["center 1" "float 1" "size 50%"]; │
│ } │
│ { │
│ - matches = {initialTitle = "dropdown";}; │
│ + matches = {initial_title = "dropdown";}; │
│ rules = [ │
│ "monitor 0" │
│ "animation slide down" │
│ - "float" │
│ + "float 1" │
│ "move 12 46" │
│ "size ${widthMinusGaps} 30%" │
│ ]; │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ ...s/hyprland/settings/rules.nix ───┐
│ diff --git a/modules/home/nixos/hyprland/set │
│ tings/rules.nix b/modules/home/nixos/hyprlan │
│ d/settings/rules.nix │
│ index 020fd2d..d649668 100644 │
│ --- a/modules/home/nixos/hyprland/settings/r │
│ ules.nix │
│ +++ b/modules/home/nixos/hyprland/settings/r │
│ ules.nix │
│ @@ -6,8 +6,8 @@ in { │
│ wayland.windowManager.hyprland.windowRule │
│ s = [ │
│ # TODO tag games for immediate │
│ { │
│ - matches = {initialTitle = "Syncthing │
│ Tray";}; │
│ - rules = ["float" "center 1" "size 50% │
│ "]; │
│ + matches = {initial_title = "Syncthing │
│ Tray";}; │
│ + rules = ["float 1" "center 1" "size 5 │
│ 0%"]; │
│ } │
│ { │
│ matches = {class = "factorio";}; │
│ @@ -18,12 +18,12 @@ in { │
│ rules = ["tag +games"]; │
│ } │
│ { │
│ - matches = {initialTitle = "Dolphin";} │
│ ; │
│ - rules = ["tag +games" "idleinhibit fo │
│ cus"]; │
│ + matches = {initial_title = "Dolphin"; │
│ }; │
│ + rules = ["tag +games" "idle_inhibit f │
│ ocus"]; │
│ } │
│ { │
│ matches = {tag = "games";}; │
│ - rules = ["workspace 6" "immediate"]; │
│ + rules = ["workspace 6" "immediate 1"] │
│ ; │
│ } │
│ { │
│ matches = {title = "Steam";}; │
│ @@ -31,19 +31,19 @@ in { │
│ } │
│ { │
│ matches = {title = "Steam Settings";} │
│ ; │
│ - rules = ["float" "size 50%" "center 1 │
│ "]; │
│ + rules = ["float 1" "size 50%" "center │
│ 1"]; │
│ } │
│ { │
│ matches = {class = "firefox";}; │
│ - rules = ["idleinhibit fullscreen"]; │
│ + rules = ["idle_inhibit fullscreen"]; │
│ } │
│ { │
│ matches = {class = "1Password";}; │
│ - rules = ["center 1" "float" "size 50% │
│ "]; │
│ + rules = ["center 1" "float 1" "size 5 │
│ 0%"]; │
│ } │
│ { │
│ matches = {title = "BTOP";}; │
│ - rules = ["float" "size 85%" "pin" "ce │
│ nter 1" "stayfocused" "dimaround"]; │
│ + rules = ["float 1" "size 85%" "pin 1" │
│ "center 1" "stay_focused 1" "dim_around 1"] │
│ ; │
│ } │
│ { │
│ matches = {class = "vesktop";}; │
│ @@ -51,18 +51,18 @@ in { │
│ } │
│ { │
│ matches = {title = "^(Picture-in-Pict │
│ ure)$";}; │
│ - rules = ["float" "pin"]; │
│ + rules = ["float 1" "pin 1"]; │
│ } │
│ { │
│ matches = {title = "^(Open Files)$";} │
│ ; │
│ - rules = ["center 1" "float" "size 50% │
│ "]; │
│ + rules = ["center 1" "float 1" "size 5 │
│ 0%"]; │
│ } │
│ { │
│ - matches = {initialTitle = "dropdown"; │
│ }; │
│ + matches = {initial_title = "dropdown" │
│ ;}; │
│ rules = [ │
│ "monitor 0" │
│ "animation slide down" │
│ - "float" │
│ + "float 1" │
│ "move 12 46" │
│ "size ${widthMinusGaps} 30%" │
│ ]; │
└──────────────────────────────────────────────┘
[ BACK TO LOG ]
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET