{ config, pkgs, lib, theme, ... }: { imports = [../common.nix ./kitty.nix ./polybar.nix]; home.packages = with pkgs; [bemenu transmission xwinwrap xclip]; xsession.windowManager.i3 = { enable = true; # Workaround for hiding the titlebar # Ref: https://github.com/i3/i3/issues/5149 extraConfig = '' for_window [all] default_border pixel 2 for_window [all] border pixel 2 ''; config = { terminal = "alacritty"; defaultWorkspace = "workspace number 1"; modifier = "Mod4"; startup = [ # Hack around the fact that I'm not using a DM # TODO: Have systemd manage those {command = "dunst";} {command = "flameshot";} {command = "picom --config ${config.xdg.configFile."picom/picom.conf".source}";} {command = "xwinwrap -b -s -fs -st -sp -nf -ov -d 'desktop' -- mpv --scale=nearest --loop-file=inf -wid WID --panscan=1 --no-audio --no-osc --no-osd-bar ${../wall.gif}";} {command = "polybar main";} {command = "polybar second";} ]; # TODO: Switch to rofi eventually menu = lib.concatStringsSep " " [ "bemenu-run" "--ignorecase" "--wrap" # "--fn 'Cozette 11'" "--fn 'Iosevka 11'" "--center" "--list 10" "--width-factor 0.4" "--line-height 22" "--nb '${theme.dark.black}'" # Normal background "--nf '${theme.bright.black}'" # Normal foreground "--hb '${theme.dark.black}'" # Highlight background "--hf '${theme.bright.white}'" # Highlight foreground "--tb '${theme.dark.black}'" # Title background "--tf '${theme.bright.blue}'" # Title foreground "--fb '${theme.dark.black}'" # Filter background "--ff '${theme.bright.white}'" # Filter foreground "--prompt 'Run:'" ]; gaps = { smartGaps = true; smartBorders = "no_gaps"; inner = 10; }; workspaceAutoBackAndForth = true; workspaceOutputAssign = builtins.genList (idx: { workspace = toString (idx + 1); output = "DP-0"; }) 5 ++ builtins.genList (idx: { workspace = toString ( if idx == 4 then 0 else idx + 6 ); output = "eDP-1-1"; }) 5; bars = []; colors = { focused = rec { border = theme.bright.white; background = theme.dark.black; text = theme.bright.white; indicator = theme.bright.white; childBorder = border; }; focusedInactive = rec { border = theme.bright.black; background = theme.dark.black; text = theme.bright.white; indicator = theme.bright.white; childBorder = border; }; unfocused = rec { border = theme.dark.black; background = theme.dark.black; text = theme.bright.white; indicator = theme.bright.white; childBorder = border; }; urgent = rec { border = theme.bright.red; background = theme.dark.black; text = theme.bright.white; indicator = theme.bright.white; childBorder = border; }; }; keybindings = let cfg = config.xsession.windowManager.i3.config; mod = cfg.modifier; bindings = with builtins; let bindStr = bind: modifier: "${mod}${lib.optionalString (modifier != "") ("+" + modifier)}+${bind}"; bindToActions = actions: bind: let bs = bindStr bind; in if isString actions then [ { name = bs ""; value = actions; } ] else builtins.map (modifier: { name = bs modifier; value = builtins.getAttr modifier actions; }) (builtins.attrNames actions); binds = { "Return" = "exec ${cfg.terminal}"; "d" = { "" = "exec ${cfg.menu}"; "Shift" = "kill"; }; "Shift+s" = "exec flameshot gui"; "Shift+0" = "exec i3-nagbar -t warning -m 'Do you want to exit i3?' -b 'Yes' 'i3-msg exit'"; "v" = "split v"; "b" = "split h"; # Movement "h,Left" = { "" = "focus left"; "Shift" = "move left"; }; "l,Right" = { "" = "focus right"; "Shift" = "move right"; }; "j,Down" = { "" = "focus down"; "Shift" = "move down"; }; "k,Up" = { "" = "focus up"; "Shift" = "move up"; }; "space" = { "" = "focus mode_toggle"; "Shift" = "floating toggle"; }; "f" = "fullscreen toggle"; # Workspaces "1" = { "" = "workspace number 1"; "Shift" = "move container to workspace number 1"; }; "2" = { "" = "workspace number 2"; "Shift" = "move container to workspace number 2"; }; "3" = { "" = "workspace number 3"; "Shift" = "move container to workspace number 3"; }; "4" = { "" = "workspace number 4"; "Shift" = "move container to workspace number 4"; }; "5" = { "" = "workspace number 5"; "Shift" = "move container to workspace number 5"; }; "q" = { "" = "workspace number 6"; "Shift" = "move container to workspace number 6"; }; "w" = { "" = "workspace number 7"; "Shift" = "move container to workspace number 7"; }; "e" = { "" = "workspace number 8"; "Shift" = "move container to workspace number 8"; }; "r" = { "" = "workspace number 9"; "Shift" = "move container to workspace number 9"; }; "t" = { "" = "workspace number 0"; "Shift" = "move container to workspace number 0"; }; }; in listToAttrs (concatMap (bind: concatMap (bindToActions (getAttr bind binds)) (lib.splitString "," bind)) (attrNames binds)); in lib.mkForce bindings; }; }; services.picom.enable = true; # TODO: use autorandr instead of hardcoded `xrandr` home.file.".xinitrc".text = '' xrandr --setprovideroutputsource modesetting NVIDIA-0 # xrandr --auto --output DP-0 --primary --output eDP-1-1 --mode 1920x1080 --pos 3440x237 xrandr --auto --output DP-0 --primary --output eDP-1-1 --mode 1920x1080 --left-of DP-0 exec i3 ''; programs.helix.settings.keys.normal = { space.c = ":pipe /home/niko/code/color-show/target/debug/cs"; }; }