{ config, lib, ... }: let cfg = config.hyprland.monitors; in { imports = [ ../waybar ]; options.hyprland.monitors = with lib; mkOption { description = "Hyprland Monitor Configuration"; type = types.attrsOf ( types.submodule { options = { resolution = mkOption { description = "Monitor Resolution"; type = types.strMatching "[:digit:]+x[:digit:]+|preferred"; default = "preferred"; }; position = mkOption { description = "Monitor Position"; type = types.strMatching "-?[:digit:]+x-?[:digit:]+|auto"; default = "auto"; }; scale = mkOption { description = "Monitor Scale"; type = types.numbers.positive; default = 1; }; mirror = mkOption { description = "Mirror Monitor"; type = types.submodule { options = { enable = mkOption { description = "Enable Mirroring"; type = types.bool; default = false; }; monitor = mkOption { description = "Mirror Monitor Name"; type = types.str; default = ""; }; }; }; default = { enable = false; }; }; transform = mkOption { description = "Hyprland Monitor Transform"; type = types.submodule { options = { flipped = mkOption { description = "Hyprland Flip Monitor"; type = types.bool; default = false; }; rotation = mkOption { description = "Hyprland Monitor Rotation"; type = types.enum [ 0 90 180 270 ]; default = 0; }; }; }; default = { flipped = false; rotation = 0; }; }; bar = mkOption { description = "Waybar Settings"; type = types.submodule { options = { enable = mkOption { description = "Enable Waybar for this Monitor"; type = types.bool; default = false; }; }; }; default = { enable = false; }; }; }; } ); default = { default = { }; }; }; config = { home-manager.users.n8.wayland.windowManager.hyprland.settings.monitor = lib.attrsets.mapAttrsToList ( name: value: "${if name == "default" then "" else name},${value.resolution}," + "${value.position}," + "${toString value.scale}," + "transform," + "${toString ((value.transform.rotation / 90) + (if value.transform.flipped then 4 else 0))}" + (if value.mirror.enable then ",mirror," + value.mirror.monitor else "") ) cfg; bar = builtins.map (m: m.name) ( builtins.filter (m: m.enable) ( lib.attrsets.mapAttrsToList (name: value: { name = name; enable = value.bar.enable; }) cfg ) ); }; }