{ config, lib, pkgs, ... }: with lib; let cfg = config.services.shikane; tomlFormat = pkgs.formats.toml { }; in { meta.maintainers = [ maintainers.therealr5 ]; options.services.shikane = { enable = mkEnableOption "shikane, A dynamic output configuration tool that automatically detects and configures connected outputs based on a set of profiles."; package = mkPackageOption pkgs "shikane" { }; settings = mkOption { type = tomlFormat.type; default = { }; example = literalExpression '' { profile = [ { name = "external-monitor-default"; output = [ { match = "eDP-1"; enable = true; } { match = "HDMI-A-1"; enable = true; position = { x = 1920; y = 0; }; } ]; } { name = "builtin-monitor-only"; output = [ { match = "eDP-1"; enable = true; } ]; } ]; } ''; description = '' Configuration written to $XDG_CONFIG_HOME/shikane/config.toml. See for more information. ''; }; }; config = mkIf cfg.enable { systemd.user.services.shikane = { Unit = { Description = "Dynamic output configuration tool"; Documentation = "man:shikane(1)"; After = [ "graphical-session-pre.target" ]; PartOf = [ "graphical-session.target" ]; }; Service = { ExecStart = "${cfg.package}/bin/shikane -c ${tomlFormat.generate "shikane-config.toml" cfg.settings}"; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; }; }