{ config, lib, ... }: let inherit (lib) mkIf; cfg = config.apps.kanshi; laptopMonitors = lib.lists.filter (mon: mon.laptop) config.monitors; dockedMonitors = lib.lists.filter (mon: !mon.laptop) config.monitors; mkOutput = mon: status: lib.mkMerge [ { criteria = if mon.desc == "" then mon.port else mon.desc; scale = mon.scale; inherit status; } (lib.mkIf (mon.position.x != 0 || mon.position.y != 0) { position = "${toString mon.position.x},${toString mon.position.y}"; }) (lib.mkIf (mon.size.x != 0 && mon.size.y != 0) { mode = "${toString mon.size.x}x${toString mon.size.y}"; }) ]; mkEnabledOutput = mon: (mkOutput mon "enable"); mkDisabledOutput = mon: (mkOutput mon "disable"); in { config = mkIf cfg.enable { services.kanshi = { enable = true; settings = [ { profile = { name = "laptop"; outputs = map mkEnabledOutput laptopMonitors; }; } { profile = { name = "docked"; outputs = (map mkEnabledOutput dockedMonitors) ++ (map mkDisabledOutput laptopMonitors); }; } ]; }; }; }