{ pkgs, lib, ... }: let theme = import ../theme; mod = "Mod4"; in with theme.colors; { # Dependencies home.packages = with pkgs; [ playerctl # pactl comes with PulseAudio wmctrl # For rofi power menu xborders # Active window borders maim xdotool unclutter # Active window screenshots #xsel # Disable middle mouse paste ]; # Screenshots services.flameshot = { enable = true; settings = { General = { disabledTrayIcon = true; showStartupLaunchMessage = false; showHelp = false; showSidePanelButton = false; uiColor = "${bg1}"; contrastUiColor = "${bg0}"; drawColor = "#ffffff"; }; }; }; xsession.windowManager.i3 = { enable = true; config = { defaultWorkspace = "workspace number 1"; # defaults to 10 for some reason modifier = mod; # Causes alt usage to break in programs i.e. Blender #floating.modifier = "Mod1"; gaps = { inner = 12; smartGaps = true; }; colors = { focused = { border = "${bg1}"; background = "${bg1}"; text = "${fg0}"; indicator = "${undefined}"; childBorder = "${undefined}"; }; focusedInactive = { border = "${bg1}"; background = "${bg1}"; text = "${fg0}"; indicator = "${undefined}"; childBorder = "${undefined}"; }; unfocused = { border = "${bg0}"; background = "${bg0}"; text = "${fg0}"; indicator = "${undefined}"; childBorder = "${undefined}"; }; }; startup = [ { command = "systemctl --user restart polybar &"; always = true; notification = false; } { command = "nm-applet &"; always = true; notification = false; } { command = "nextcloud &"; always = true; notification = false; } { command = "protonmail-bridge --noninteractive &"; always = true; notification = false; } { command = "(xborders --border-rgb ${builtins.substring 1 6 primary}ff --border-radius 12 --border-width 2 --smart-hide-border --disable-version-warning) &"; always = true; notification = false; } /* { # Disable middle mouse paste # https://unix.stackexchange.com/a/501445 # Other solutions such as the xbindkeys approach # will break other functionality, such as panning # https://unix.stackexchange.com/a/277488 command = "(while true; do xsel -fin < /dev/null; done) &"; always = true; notification = false; } */ ]; keybindings = lib.mkOptionDefault { "${mod}+Return" = "exec kitty"; "${mod}+Shift+e" = "exec i3-msg exit"; # bypass default session exit confirmation menu "${mod}+space" = "exec i3-msg open"; # Open blank space "Mod1+Q" = let rofi-power = pkgs.substituteAll { src = ./power.sh; isExecutable = true; }; in "exec ${rofi-power}"; "${mod}+a" = "exec com.github.alainm23.task-planner.quick-add"; # Audio controls "XF86AudioRaiseVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10%"; "XF86AudioLowerVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10%"; "XF86AudioMute" = "exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle"; "XF86AudioMicMute" = "exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle"; # Media player controls "XF86AudioPlay" = "exec playerctl play-pause"; "XF86AudioNext" = "exec playerctl next"; "XF86AudioPrev" = "exec playerctl previous"; # Window resizing "${mod}+Ctrl+Left" = "resize shrink width 16px or 1ppt"; "${mod}+Ctrl+Right" = "resize grow width 16px or 1ppt"; "${mod}+Ctrl+Up" = "resize grow height 16px or 1ppt"; "${mod}+Ctrl+Down" = "resize shrink height 16px or 1ppt"; # Screenshots "Print" = "exec flameshot gui"; # For some reason -u/--hidecursor tag makes image blank # So, we hide then unhide the cursor "${mod}+Print" = "exec (unclutter -idle 0 &) && maim -i \"$(xdotool getactivewindow)\" | xclip -selection clipboard -t image/png && killall unclutter"; # Remove dmenu "${mod}+d" = null; }; keycodebindings = { "133" = "--release exec rofi -show drun -theme"; }; window.commands = [ { command = "border pixel 0"; criteria = { class = "^.*"; }; } { command = "floating enable"; criteria = { class = "Nextcloud"; }; } { command = "floating enable"; criteria = { class = "PureRef"; }; } { command = "floating enable"; criteria = { title = "Drawing Panel"; }; } { command = "floating enable"; criteria = { title = "Task Planner - Quick Add"; }; } { command = "floating enable"; criteria = { instance = "Godot_Engine"; title="*(DEBUG)"; }; } ]; bars = []; }; }; }