home-manager/modules/programs/rofi.nix

363 lines
9.3 KiB
Nix
Raw Normal View History

2017-09-28 14:41:35 +02:00
{ config, lib, pkgs, ... }:
with lib;
with builtins;
let
cfg = config.programs.rofi;
2020-02-02 00:39:17 +01:00
colorOption = description:
mkOption {
type = types.str;
description = description;
};
2017-09-28 14:41:35 +02:00
rowColorSubmodule = types.submodule {
options = {
background = colorOption "Background color";
foreground = colorOption "Foreground color";
backgroundAlt = colorOption "Alternative background color";
highlight = mkOption {
type = types.submodule {
options = {
background = colorOption "Highlight background color";
foreground = colorOption "Highlight foreground color";
};
};
description = "Color settings for highlighted row.";
};
};
};
windowColorSubmodule = types.submodule {
options = {
background = colorOption "Window background color";
border = colorOption "Window border color";
separator = colorOption "Separator color";
};
};
colorsSubmodule = types.submodule {
options = {
window = mkOption {
default = null;
type = windowColorSubmodule;
description = "Window color settings.";
};
rows = mkOption {
default = null;
type = types.submodule {
options = {
normal = mkOption {
default = null;
type = types.nullOr rowColorSubmodule;
description = "Normal row color settings.";
};
active = mkOption {
default = null;
type = types.nullOr rowColorSubmodule;
description = "Active row color settings.";
};
urgent = mkOption {
default = null;
type = types.nullOr rowColorSubmodule;
description = "Urgent row color settings.";
};
};
};
description = "Rows color settings.";
};
};
};
2020-02-02 00:39:17 +01:00
windowColorsToString = window:
concatStringsSep ", " (with window; [ background border separator ]);
2017-09-28 14:41:35 +02:00
2020-02-02 00:39:17 +01:00
rowColorsToString = row:
concatStringsSep ", " (with row; [
background
foreground
backgroundAlt
highlight.background
highlight.foreground
]);
2017-09-28 14:41:35 +02:00
mkColorScheme = colors:
if colors != null then
with colors; {
color-window =
if (window != null) then (windowColorsToString window) else null;
color-normal = if (rows != null && rows.normal != null) then
(rowColorsToString rows.normal)
else
null;
color-active = if (rows != null && rows.active != null) then
(rowColorsToString rows.active)
else
null;
color-urgent = if (rows != null && rows.active != null) then
(rowColorsToString rows.urgent)
else
null;
}
else
{ };
mkValueString = value:
if isBool value then
if value then "true" else "false"
else if isInt value then
toString value
else
''"${toString value}"'';
mkKeyValue = name: value: "${name}: ${mkValueString value};";
toRasi = section: config:
let
# Remove null values so the resulting config does not have empty lines
configStr = generators.toKeyValue { inherit mkKeyValue; }
(attrsets.filterAttrs (m: v: v != null) config);
in ''
${section} {
${configStr}}
2020-02-02 00:39:17 +01:00
'';
2017-09-28 14:41:35 +02:00
locationsMap = {
2020-02-02 00:39:17 +01:00
center = 0;
top-left = 1;
top = 2;
top-right = 3;
right = 4;
bottom-right = 5;
2020-02-02 00:39:17 +01:00
bottom = 6;
bottom-left = 7;
left = 8;
};
2020-02-02 00:39:17 +01:00
themeName = if (cfg.theme == null) then
null
else if (isString cfg.theme) then
2020-02-02 00:39:17 +01:00
cfg.theme
else
removeSuffix ".rasi" (baseNameOf cfg.theme);
themePath = if (isString cfg.theme) then null else cfg.theme;
2020-02-02 00:39:17 +01:00
in {
2017-09-28 14:41:35 +02:00
options.programs.rofi = {
2020-02-02 00:39:17 +01:00
enable = mkEnableOption
"Rofi: A window switcher, application launcher and dmenu replacement";
2017-09-28 14:41:35 +02:00
package = mkOption {
default = pkgs.rofi;
type = types.package;
description = ''
Package providing the <command>rofi</command> binary.
'';
example = literalExample ''
pkgs.rofi.override { plugins = [ pkgs.rofi-emoji ]; };
'';
};
2017-09-28 14:41:35 +02:00
width = mkOption {
default = null;
type = types.nullOr types.int;
description = "Window width";
example = 100;
};
lines = mkOption {
default = null;
type = types.nullOr types.int;
description = "Number of lines";
example = 10;
};
borderWidth = mkOption {
default = null;
type = types.nullOr types.int;
description = "Border width";
example = 1;
};
rowHeight = mkOption {
default = null;
type = types.nullOr types.int;
description = "Row height (in chars)";
example = 1;
};
padding = mkOption {
default = null;
type = types.nullOr types.int;
description = "Padding";
example = 400;
};
font = mkOption {
default = null;
type = types.nullOr types.str;
2017-09-28 14:41:35 +02:00
example = "Droid Sans Mono 14";
2017-09-30 14:14:07 +02:00
description = "Font to use.";
2017-09-28 14:41:35 +02:00
};
scrollbar = mkOption {
default = null;
type = types.nullOr types.bool;
description = "Whether to show a scrollbar.";
};
terminal = mkOption {
default = null;
type = types.nullOr types.str;
2017-09-28 14:41:35 +02:00
description = ''
Path to the terminal which will be used to run console applications
'';
example = "\${pkgs.gnome3.gnome_terminal}/bin/gnome-terminal";
};
separator = mkOption {
default = null;
type = types.nullOr (types.enum [ "none" "dash" "solid" ]);
description = "Separator style";
example = "solid";
};
cycle = mkOption {
default = null;
type = types.nullOr types.bool;
2017-09-30 14:14:07 +02:00
description = "Whether to cycle through the results list.";
};
fullscreen = mkOption {
default = null;
type = types.nullOr types.bool;
description = "Whether to run rofi fullscreen.";
2017-09-28 14:41:35 +02:00
};
location = mkOption {
default = "center";
type = types.enum (attrNames locationsMap);
description = "The location rofi appears on the screen.";
};
xoffset = mkOption {
default = 0;
type = types.int;
description = ''
Offset in the x-axis in pixels relative to the chosen location.
'';
};
yoffset = mkOption {
default = 0;
type = types.int;
description = ''
Offset in the y-axis in pixels relative to the chosen location.
'';
};
2017-09-28 14:41:35 +02:00
colors = mkOption {
default = null;
type = types.nullOr colorsSubmodule;
description = ''
Color scheme settings. Colors can be specified in CSS color
formats. This option may become deprecated in the future and
therefore the <varname>programs.rofi.theme</varname> option
should be used whenever possible.
2017-09-28 14:41:35 +02:00
'';
example = literalExample ''
colors = {
window = {
background = "argb:583a4c54";
border = "argb:582a373e";
separator = "#c3c6c8";
};
rows = {
normal = {
background = "argb:58455a64";
foreground = "#fafbfc";
backgroundAlt = "argb:58455a64";
highlight = {
background = "#00bcd4";
foreground = "#fafbfc";
};
};
};
};
'';
};
theme = mkOption {
default = null;
2019-09-03 02:25:24 +02:00
type = with types; nullOr (either str path);
example = "Arc";
description = ''
Name of theme or path to theme file in rasi format. Available
named themes can be viewed using the
<command>rofi-theme-selector</command> tool.
'';
};
2017-09-28 14:41:35 +02:00
configPath = mkOption {
default = "${config.xdg.configHome}/rofi/config.rasi";
defaultText = "$XDG_CONFIG_HOME/rofi/config.rasi";
type = types.str;
2017-09-28 14:41:35 +02:00
description = "Path where to put generated configuration file.";
};
extraConfig = mkOption {
default = { };
example = literalExample ''
{
modi = "drun,emoji,ssh";
kb-primary-paste = "Control+V,Shift+Insert";
kb-secondary-paste = "Control+v,Insert";
}
'';
type = with types; attrsOf (oneOf [ int str bool ]);
2017-09-28 14:41:35 +02:00
description = "Additional configuration to add.";
};
};
config = mkIf cfg.enable {
2020-02-02 00:39:17 +01:00
assertions = [{
assertion = cfg.theme == null || cfg.colors == null;
message = ''
Cannot use the rofi options 'theme' and 'colors' simultaneously.
'';
}];
home.packages = [ cfg.package ];
2017-09-28 14:41:35 +02:00
home.file."${cfg.configPath}".text = toRasi "configuration" ({
width = cfg.width;
lines = cfg.lines;
font = cfg.font;
bw = cfg.borderWidth;
eh = cfg.rowHeight;
padding = cfg.padding;
separator-style = cfg.separator;
hide-scrollbar =
if (cfg.scrollbar != null) then (!cfg.scrollbar) else null;
terminal = cfg.terminal;
cycle = cfg.cycle;
fullscreen = cfg.fullscreen;
location = (getAttr cfg.location locationsMap);
xoffset = cfg.xoffset;
yoffset = cfg.yoffset;
theme = themeName;
} // (mkColorScheme cfg.colors) // cfg.extraConfig);
xdg.dataFile = mkIf (themePath != null) {
2020-02-02 00:39:17 +01:00
"rofi/themes/${themeName}.rasi".source = themePath;
};
2017-09-28 14:41:35 +02:00
};
meta.maintainers = with maintainers; [ thiagokokada ];
2017-09-28 14:41:35 +02:00
}