mirror of
				https://github.com/nmasur/dotfiles
				synced 2025-11-04 01:13:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			209 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  config,
 | 
						|
  pkgs,
 | 
						|
  lib,
 | 
						|
  ...
 | 
						|
}:
 | 
						|
 | 
						|
let
 | 
						|
  cfg = config.nmasur.presets.programs.rofi;
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  imports = [
 | 
						|
    ./power.nix
 | 
						|
    ./brightness.nix
 | 
						|
  ];
 | 
						|
 | 
						|
  options.nmasur.presets.programs.rofi = {
 | 
						|
    enable = lib.mkEnableOption "Rofi quick launcher";
 | 
						|
    terminal = lib.mkOption {
 | 
						|
      type = lib.types.package;
 | 
						|
      description = "Terminal application for rofi";
 | 
						|
      default = config.nmasur.presets.services.i3.terminal;
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = lib.mkIf cfg.enable {
 | 
						|
 | 
						|
    home.packages = with pkgs; [
 | 
						|
      jq # Required for rofi-systemd
 | 
						|
    ];
 | 
						|
 | 
						|
    nmasur.presets.services.i3.commands =
 | 
						|
      let
 | 
						|
        rofi = config.programs.rofi.finalPackage;
 | 
						|
      in
 | 
						|
      {
 | 
						|
        launcher = ''${lib.getExe rofi} -modes drun -show drun -theme-str '@import "launcher.rasi"' '';
 | 
						|
        systemdSearch = lib.getExe pkgs.rofi-systemd;
 | 
						|
        applicationSwitch = "${lib.getExe rofi} -show window -modi window";
 | 
						|
        calculator = "${lib.getExe rofi} -modes calc -show calc";
 | 
						|
        audioSwitch = lib.getExe (
 | 
						|
          pkgs.writeShellApplication {
 | 
						|
            name = "switch-audio";
 | 
						|
            runtimeInputs = [
 | 
						|
              pkgs.ponymix
 | 
						|
              rofi
 | 
						|
            ];
 | 
						|
            text = builtins.readFile ./pulse-sink.sh;
 | 
						|
          }
 | 
						|
        );
 | 
						|
      };
 | 
						|
 | 
						|
    programs.rofi = {
 | 
						|
      enable = true;
 | 
						|
      cycle = true;
 | 
						|
      location = "center";
 | 
						|
      pass = { };
 | 
						|
      terminal = lib.getExe cfg.terminal;
 | 
						|
      plugins = [
 | 
						|
        pkgs.rofi-calc
 | 
						|
        pkgs.rofi-emoji
 | 
						|
        pkgs.rofi-systemd
 | 
						|
      ];
 | 
						|
      theme =
 | 
						|
        let
 | 
						|
          inherit (config.lib.formats.rasi) mkLiteral;
 | 
						|
        in
 | 
						|
        {
 | 
						|
 | 
						|
          # Inspired by https://github.com/sherubthakur/dotfiles/blob/master/users/modules/desktop-environment/rofi/launcher.rasi
 | 
						|
 | 
						|
          "*" = {
 | 
						|
            background-color = mkLiteral config.theme.colors.base00;
 | 
						|
            foreground-color = mkLiteral config.theme.colors.base07;
 | 
						|
            text-color = mkLiteral config.theme.colors.base07;
 | 
						|
            border-color = mkLiteral config.theme.colors.base04;
 | 
						|
          };
 | 
						|
 | 
						|
          # Holds the entire window
 | 
						|
          "#window" = {
 | 
						|
            transparency = "real";
 | 
						|
            background-color = mkLiteral config.theme.colors.base00;
 | 
						|
            text-color = mkLiteral config.theme.colors.base07;
 | 
						|
            border = mkLiteral "4px";
 | 
						|
            border-color = mkLiteral config.theme.colors.base04;
 | 
						|
            border-radius = mkLiteral "4px";
 | 
						|
            width = mkLiteral "850px";
 | 
						|
            padding = mkLiteral "15px";
 | 
						|
          };
 | 
						|
 | 
						|
          # Wrapper around bar and results
 | 
						|
          "#mainbox" = {
 | 
						|
            background-color = mkLiteral config.theme.colors.base00;
 | 
						|
            border = mkLiteral "0px";
 | 
						|
            border-radius = mkLiteral "0px";
 | 
						|
            border-color = mkLiteral config.theme.colors.base04;
 | 
						|
            children = map mkLiteral [
 | 
						|
              "inputbar"
 | 
						|
              "message"
 | 
						|
              "listview"
 | 
						|
            ];
 | 
						|
            spacing = mkLiteral "10px";
 | 
						|
            padding = mkLiteral "10px";
 | 
						|
          };
 | 
						|
 | 
						|
          # Unknown
 | 
						|
          "#textbox-prompt-colon" = {
 | 
						|
            expand = false;
 | 
						|
            str = ":";
 | 
						|
            margin = mkLiteral "0px 0.3em 0em 0em";
 | 
						|
            text-color = mkLiteral config.theme.colors.base07;
 | 
						|
          };
 | 
						|
 | 
						|
          # Command prompt left of the input
 | 
						|
          "#prompt" = {
 | 
						|
            enabled = false;
 | 
						|
          };
 | 
						|
 | 
						|
          # Actual text box
 | 
						|
          "#entry" = {
 | 
						|
            placeholder-color = mkLiteral config.theme.colors.base03;
 | 
						|
            expand = true;
 | 
						|
            horizontal-align = "0";
 | 
						|
            placeholder = "";
 | 
						|
            padding = mkLiteral "0px 0px 0px 5px";
 | 
						|
            blink = true;
 | 
						|
          };
 | 
						|
 | 
						|
          # Top bar
 | 
						|
          "#inputbar" = {
 | 
						|
            children = map mkLiteral [
 | 
						|
              "prompt"
 | 
						|
              "entry"
 | 
						|
            ];
 | 
						|
            border = mkLiteral "1px";
 | 
						|
            border-radius = mkLiteral "4px";
 | 
						|
            padding = mkLiteral "6px";
 | 
						|
          };
 | 
						|
 | 
						|
          # Results
 | 
						|
          "#listview" = {
 | 
						|
            background-color = mkLiteral config.theme.colors.base00;
 | 
						|
            padding = mkLiteral "0px";
 | 
						|
            columns = 1;
 | 
						|
            lines = 12;
 | 
						|
            spacing = "5px";
 | 
						|
            cycle = true;
 | 
						|
            dynamic = true;
 | 
						|
            layout = "vertical";
 | 
						|
          };
 | 
						|
 | 
						|
          # Each result
 | 
						|
          "#element" = {
 | 
						|
            orientation = "vertical";
 | 
						|
            border-radius = mkLiteral "0px";
 | 
						|
            padding = mkLiteral "5px 0px 5px 5px";
 | 
						|
          };
 | 
						|
          "#element.selected" = {
 | 
						|
            border = mkLiteral "1px";
 | 
						|
            border-radius = mkLiteral "4px";
 | 
						|
            border-color = mkLiteral config.theme.colors.base07;
 | 
						|
            background-color = mkLiteral config.theme.colors.base04;
 | 
						|
            text-color = mkLiteral config.theme.colors.base00;
 | 
						|
          };
 | 
						|
 | 
						|
          "#element-text" = {
 | 
						|
            expand = true;
 | 
						|
            # horizontal-align = mkLiteral "0.5";
 | 
						|
            vertical-align = mkLiteral "0.5";
 | 
						|
            margin = mkLiteral "0px 2.5px 0px 2.5px";
 | 
						|
          };
 | 
						|
          "#element-text.selected" = {
 | 
						|
            background-color = mkLiteral config.theme.colors.base04;
 | 
						|
            text-color = mkLiteral config.theme.colors.base00;
 | 
						|
          };
 | 
						|
 | 
						|
          # Not sure how to get icons
 | 
						|
          "#element-icon" = {
 | 
						|
            size = mkLiteral "18px";
 | 
						|
            border = mkLiteral "0px";
 | 
						|
            padding = mkLiteral "2px 5px 2px 2px";
 | 
						|
            background-color = mkLiteral config.theme.colors.base00;
 | 
						|
          };
 | 
						|
          "#element-icon.selected" = {
 | 
						|
            background-color = mkLiteral config.theme.colors.base04;
 | 
						|
            text-color = mkLiteral config.theme.colors.base00;
 | 
						|
          };
 | 
						|
        };
 | 
						|
      xoffset = 0;
 | 
						|
      yoffset = -20;
 | 
						|
      extraConfig = {
 | 
						|
        show-icons = true;
 | 
						|
        kb-cancel = "Escape,Super+space";
 | 
						|
        modi = "window,run,ssh,emoji,calc,systemd";
 | 
						|
        sort = true;
 | 
						|
        # levenshtein-sort = true;
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    home.file.".local/share/rofi/themes" = {
 | 
						|
      recursive = true;
 | 
						|
      source = ./themes;
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
}
 |