{ config, lib, pkgs, ... }: let cfg = config.home-manager.users.mainUser.xsession.windowManager.i3; colorTheme = let theme = (import ../../../library/colorThemes.nix).solarized.light.hex; in theme // { foreground = theme.base3; background = theme.base03; }; # switch to named workspaces # todo : add version assert i3-wk-switch = pkgs.i3-wk-switch.overrideAttrs (old: { src = pkgs.fetchFromGitHub { owner = "tmfink"; repo = "i3-wk-switch"; rev = "5f43bb8cbe7938eff476fc534b61c8fb6a700c8f"; sha256 = "sha256-DOBPI/wO+S8a6EzWJeVGODXeSixFl7SHTtHAq5DG8GU="; }; }); backgroundCommand = pkgs.writers.writeDash "background" '' ${pkgs.xorg.xrandr}/bin/xrandr | grep " connected" | \ ${pkgs.gnused}/bin/sed -E "s/primary //" | \ ${pkgs.coreutils-full}/bin/cut -d' ' -f 3 | \ ${pkgs.gnused}/bin/sed -E 's/\+.*$//g' | \ ${pkgs.coreutils-full}/bin/sort -r | \ ${pkgs.coreutils-full}/bin/head -n 1 | \ ${pkgs.gawk}/bin/awk -F 'x' '{print "--width="$1" --height="$2}' | \ ${pkgs.findutils}/bin/xargs \ ${pkgs.polygon-art.polygon-art}/bin/rings \ /dev/shm/background.png && \ ${pkgs.feh}/bin/feh --bg-scale /dev/shm/background.png ''; in { config = lib.mkIf config.components.gui.enable { home-manager.users.mainUser = { programs.i3status-rust = { enable = true; bars = { my = { icons = "awesome5"; theme = "solarized-light"; # https://github.com/greshake/i3status-rust/blob/v0.22.0/doc/blocks.md blocks = [ { block = "cpu"; interval = 1; } { block = "memory"; display_type = "memory"; format_mem = "{mem_used_percents}"; format_swap = "{swap_used_percents}"; } { block = "load"; interval = 1; format = "{1m}"; } { block = "battery"; interval = 10; format = "{percentage} {time}"; } { block = "uptime"; } { block = "time"; interval = 60; format = "%Y-%m-%d %R"; } ]; }; }; }; programs.kitty = { enable = true; # kitty +kitten themes theme = "Gruvbox Light Hard"; settings = { font_family = "JetBrains Mono"; bold_font = "auto"; italic_font = "auto"; bold_italic_font = "auto"; font_size = 11; }; }; programs.alacritty = { enable = true; settings = { import = let themes = pkgs.fetchFromGitHub { owner = "alacritty"; repo = "alacritty-theme"; rev = "024c5c0dfb65197d5796e29e307b321af9a5e198"; sha256 = "sha256-zXyGXZSmmTup5o7Dx6he+57vSFpygR+GSD+3PTxDbVk="; }; in [ "${themes}/themes/gruvbox_light.yaml" ]; font = { normal = { family = "JetBrains Mono"; style = "Regular"; }; bold = { family = "JetBrains Mono"; style = "Bold"; }; italic = { family = "JetBrains Mono"; style = "Italic"; }; size = 6.0; }; }; }; xsession.windowManager.i3 = { enable = true; extraConfig = '' default_border pixel ''; config = { modifier = "Mod4"; terminal = "alacritty"; startup = let height = config.configuration.desktop.height; width = config.configuration.desktop.width; in [ { command = "${pkgs.albert}/bin/albert"; always = true; } { command = toString backgroundCommand; always = true; } #{ command = "${pkgs.flameshot}/bin/flameshot"; always = true; } # { command = "systemctl --user restart polybar"; always = true; notification = false; } ]; fonts = { names = [ "JetBrains Mono" ]; size = 11.0; }; bars = with colorTheme; let selected = blue; in [{ #mode = "hide"; hiddenState = "hide"; position = "top"; workspaceButtons = true; workspaceNumbers = true; statusCommand = "${pkgs.i3status-rust}/bin/i3status-rs ${config.users.users.mainUser.home}/.config/i3status-rust/config-my.toml"; fonts = { names = [ "JetBrains Mono" ]; size = 11.0; }; trayOutput = "primary"; colors = { background = background; statusline = background; separator = background; focusedWorkspace = { border = selected; background = base02; text = foreground; }; activeWorkspace = { border = background; background = base02; text = foreground; }; inactiveWorkspace = { border = background; background = base02; text = foreground; }; urgentWorkspace = { border = red; background = base02; text = foreground; }; bindingMode = { border = red; background = red; text = background; }; }; }]; colors = with colorTheme; { background = background; focused = { background = blue; border = blue; childBorder = blue; indicator = blue; text = foreground; }; focusedInactive = { background = base01; border = base01; childBorder = base02; indicator = base02; text = foreground; }; unfocused = { background = base02; border = base02; childBorder = base02; indicator = base02; text = foreground; }; urgent = { background = orange; border = orange; childBorder = background; indicator = background; text = foreground; }; }; keybindings = { "Print" = "exec ${pkgs.flameshot}/bin/flameshot gui -c -p /share/"; "${cfg.config.modifier}+Return" = "exec ${cfg.config.terminal}"; "${cfg.config.modifier}+Shift+q" = "exit"; "${cfg.config.modifier}+q" = "kill"; "${cfg.config.modifier}+Left" = "focus left"; "${cfg.config.modifier}+Down" = "focus down"; "${cfg.config.modifier}+Up" = "focus up"; "${cfg.config.modifier}+Right" = "focus right"; "${cfg.config.modifier}+j" = "focus next"; "${cfg.config.modifier}+k" = "focus prev"; "${cfg.config.modifier}+Shift+Left" = "move left"; "${cfg.config.modifier}+Shift+Down" = "move down"; "${cfg.config.modifier}+Shift+Up" = "move up"; "${cfg.config.modifier}+Shift+Right" = "move right"; "${cfg.config.modifier}+h" = "split h"; "${cfg.config.modifier}+v" = "split v"; "${cfg.config.modifier}+f" = "fullscreen toggle"; "${cfg.config.modifier}+s" = "layout stacking"; "${cfg.config.modifier}+w" = "layout tabbed"; "${cfg.config.modifier}+e" = "layout toggle split"; "${cfg.config.modifier}+t" = "floating toggle"; #"${cfg.config.modifier}+space" = "focus mode_toggle"; "${cfg.config.modifier}+b" = "exec ${backgroundCommand}"; "${cfg.config.modifier}+p" = "focus parent"; "${cfg.config.modifier}+Shift+minus" = "move scratchpad"; "${cfg.config.modifier}+minus" = "scratchpad show"; "${cfg.config.modifier}+1" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 1"; "${cfg.config.modifier}+2" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 2"; "${cfg.config.modifier}+3" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 3"; "${cfg.config.modifier}+4" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 4"; "${cfg.config.modifier}+5" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 5"; "${cfg.config.modifier}+6" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 6"; "${cfg.config.modifier}+7" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 7"; "${cfg.config.modifier}+8" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 8"; "${cfg.config.modifier}+9" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 9"; "${cfg.config.modifier}+0" = "exec --no-startup-id ${i3-wk-switch}/bin/i3-wk-switch 10"; "${cfg.config.modifier}+Shift+1" = "move container to workspace number 1"; "${cfg.config.modifier}+Shift+2" = "move container to workspace number 2"; "${cfg.config.modifier}+Shift+3" = "move container to workspace number 3"; "${cfg.config.modifier}+Shift+4" = "move container to workspace number 4"; "${cfg.config.modifier}+Shift+5" = "move container to workspace number 5"; "${cfg.config.modifier}+Shift+6" = "move container to workspace number 6"; "${cfg.config.modifier}+Shift+7" = "move container to workspace number 7"; "${cfg.config.modifier}+Shift+8" = "move container to workspace number 8"; "${cfg.config.modifier}+Shift+9" = "move container to workspace number 9"; "${cfg.config.modifier}+Shift+0" = "move container to workspace number 10"; "${cfg.config.modifier}+Escape" = "workspace back_and_forth"; # rename workspace "${cfg.config.modifier}+n" = '' exec i3-input -F 'rename workspace to "%s"' -P 'New name for this workspace: ' ''; "${cfg.config.modifier}+grave" = let script = pkgs.writers.writeBash "select-workspace" '' set -e set -o pipefail ${pkgs.i3}/bin/i3-msg -t get_workspaces | \ ${pkgs.jq}/bin/jq --raw-output '.[] | .name' | \ ${pkgs.rofi}/bin/rofi -dmenu -p 'Select Workspace' | \ while read line do ${i3-wk-switch}/bin/i3-wk-switch "$line" done ''; in "exec ${script}"; "${cfg.config.modifier}+Shift+c" = "reload"; "${cfg.config.modifier}+Shift+r" = "restart"; "${cfg.config.modifier}+Shift+e" = "exec i3-nagbar -t warning -m 'Do you want to exit i3?' -b 'Yes' 'i3-msg exit'"; "${cfg.config.modifier}+r" = "mode resize"; # multiple monitors # autorandr --save docked # to save setup # autorandr --save undocked # to save setup # autorandr --change # automatically detects the setup "${cfg.config.modifier}+BackSpace" = let xmodmapConfig = pkgs.writeText "xmodmap" '' ! ! Swap Caps_Lock and Control_L ! ! replace capslock keys with Escape Keys ! remove Lock = Caps_Lock clear Lock add Lock = Scroll_Lock keysym Caps_Lock = Escape ! Set Right function Key to Windows-key keycode 135 = Super_R NoSymbol Super_R NoSymbol Super_R ! Map umlauts to RIGHT ALT + keycode 108 = Mode_switch keysym e = e E EuroSign keysym c = c C cent keysym a = a A adiaeresis Adiaeresis keysym o = o O odiaeresis Odiaeresis keysym u = u U udiaeresis Udiaeresis keysym s = s S ssharp ''; script = pkgs.writers.writeBash "autorandr" '' ${pkgs.autorandr}/bin/autorandr --change ${pkgs.xorg.xmodmap}/bin/xmodmap ${xmodmapConfig} ${backgroundCommand} ''; in "exec ${toString script}"; # like vimperator "${cfg.config.modifier}+a" = "exec ${pkgs.i3-easyfocus}/bin/i3-easyfocus"; }; }; }; }; }; }