Files
arch-i3/dotfiles/config/i3/config
T
2026-09-14 15:31:20 -05:00

334 lines
13 KiB
Plaintext

# ===========================================================================
# i3 window manager — Catppuccin Macchiato
# Font: Inconsolata Nerd Font
# Docs: https://i3wm.org/docs/userguide.html
# ===========================================================================
set $mod Mod4
set $alt Mod1
# --- Catppuccin Macchiato palette -----------------------------------------
set $rosewater #f4dbd6
set $flamingo #f0c6c6
set $pink #f5bde6
set $mauve #c6a0f6
set $red #ed8796
set $maroon #ee99a0
set $peach #f5a97f
set $yellow #eed49f
set $green #a6da95
set $teal #8bd5ca
set $sky #91d7e3
set $sapphire #7dc4e4
set $blue #8aadf4
set $lavender #b7bdf8
set $text #cad3f5
set $subtext1 #b8c0e0
set $subtext0 #a5adcb
set $overlay2 #939ab7
set $overlay1 #8087a2
set $overlay0 #6e738d
set $surface2 #5b6078
set $surface1 #494d64
set $surface0 #363a4f
set $base #24273a
set $mantle #1e2030
set $crust #181926
# --- fonts -----------------------------------------------------------------
font pango:Inconsolata Nerd Font 11
# --- applications ----------------------------------------------------------
set $term kitty
set $filemanager thunar
set $menu rofi -show drun
set $window_menu rofi -show window
set $runner rofi -show run
set $powermenu ~/.config/rofi/scripts/powermenu.sh
set $lock betterlockscreen --lock dimblur
# ---------------------------------------------------------------------------
# Appearance
# ---------------------------------------------------------------------------
# class border backgr. text indicator child_border
client.focused $mauve $mauve $crust $lavender $mauve
client.focused_inactive $surface0 $surface0 $text $surface0 $surface0
client.unfocused $surface0 $base $subtext0 $surface0 $surface0
client.urgent $red $red $crust $red $red
client.placeholder $base $base $text $base $base
client.background $base
# Gaps + borders (i3 >= 4.22 has gaps built in)
default_border pixel 2
default_floating_border pixel 2
hide_edge_borders smart
gaps inner 8
gaps outer 4
smart_gaps on
smart_borders on
# Focus behaviour
focus_follows_mouse no
mouse_warping none
focus_on_window_activation smart
popup_during_fullscreen smart
workspace_auto_back_and_forth yes
# ---------------------------------------------------------------------------
# Autostart
# ---------------------------------------------------------------------------
# exec_always => re-run on config reload; exec => only on i3 start.
# Wallpaper (feh restores whatever set-wallpaper.sh last applied)
exec_always --no-startup-id ~/.local/bin/set-wallpaper
# Compositor
exec_always --no-startup-id ~/.local/bin/restart-daemon picom
# Status bar
exec_always --no-startup-id ~/.config/polybar/launch.sh
# Notification daemon
exec_always --no-startup-id ~/.local/bin/restart-daemon dunst
# XDG autostart entries (nm-applet etc. that ship .desktop files)
exec --no-startup-id dex --autostart --environment i3
# PolicyKit authentication agent (GUI password prompts for gparted, etc.)
exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# Tray applets
exec --no-startup-id nm-applet
exec --no-startup-id blueman-applet
exec --no-startup-id udiskie --tray --no-automount --notify
# Auto-lock: lock on suspend and after 10 min of idle time
exec --no-startup-id xss-lock --transfer-sleep-lock -- $lock --nofork
exec --no-startup-id xset s 600 600
exec --no-startup-id numlockx on
# Cursor theme for the root window
exec_always --no-startup-id xsetroot -cursor_name left_ptr
# ---------------------------------------------------------------------------
# Key bindings — launching
# ---------------------------------------------------------------------------
bindsym $mod+Return exec --no-startup-id $term
bindsym $mod+Shift+Return exec --no-startup-id $term --class kitty-float
bindsym $mod+e exec --no-startup-id $filemanager
bindsym $mod+d exec --no-startup-id $menu
bindsym $mod+Shift+d exec --no-startup-id $runner
bindsym $mod+Tab exec --no-startup-id $window_menu
bindsym $mod+Shift+e exec --no-startup-id $powermenu
bindsym $mod+q kill
bindsym $mod+Shift+q exec --no-startup-id xkill
# Lock / session
bindsym $mod+Shift+x exec --no-startup-id $lock
bindsym $mod+Shift+c reload
bindsym $mod+Shift+r restart
# ---------------------------------------------------------------------------
# Key bindings — focus & movement
# ---------------------------------------------------------------------------
# vim keys …
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# … and arrows
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# ---------------------------------------------------------------------------
# Key bindings — layout
# ---------------------------------------------------------------------------
bindsym $mod+b split h
bindsym $mod+v split v
bindsym $mod+f fullscreen toggle
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+g layout toggle split
bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle
bindsym $mod+a focus parent
bindsym $mod+Shift+a focus child
bindsym $mod+minus scratchpad show
bindsym $mod+Shift+minus move scratchpad
# Gap tweaks on the fly
bindsym $mod+plus gaps inner current plus 4
bindsym $mod+Shift+plus gaps inner current minus 4
bindsym $mod+Shift+g gaps inner current set 8; gaps outer current set 4
# Drag floating windows with the modifier held
floating_modifier $mod
tiling_drag modifier titlebar
# ---------------------------------------------------------------------------
# Workspaces
# ---------------------------------------------------------------------------
set $ws1 "1: "
set $ws2 "2: "
set $ws3 "3: "
set $ws4 "4: "
set $ws5 "5: "
set $ws6 "6: "
set $ws7 "7: "
set $ws8 "8: "
set $ws9 "9: "
set $ws10 "10: "
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# Cycle workspaces
bindsym $mod+Ctrl+Right workspace next
bindsym $mod+Ctrl+Left workspace prev
bindsym $alt+Tab workspace back_and_forth
# Move workspace between monitors
bindsym $mod+Ctrl+Shift+Right move workspace to output right
bindsym $mod+Ctrl+Shift+Left move workspace to output left
# ---------------------------------------------------------------------------
# Media / hardware keys
# ---------------------------------------------------------------------------
bindsym XF86AudioRaiseVolume exec --no-startup-id ~/.local/bin/volume up
bindsym XF86AudioLowerVolume exec --no-startup-id ~/.local/bin/volume down
bindsym XF86AudioMute exec --no-startup-id ~/.local/bin/volume mute
bindsym XF86AudioMicMute exec --no-startup-id ~/.local/bin/volume micmute
bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause
bindsym XF86AudioNext exec --no-startup-id playerctl next
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
bindsym XF86MonBrightnessUp exec --no-startup-id ~/.local/bin/brightness up
bindsym XF86MonBrightnessDown exec --no-startup-id ~/.local/bin/brightness down
# Screenshots (maim)
bindsym Print exec --no-startup-id ~/.local/bin/screenshot full
bindsym Shift+Print exec --no-startup-id ~/.local/bin/screenshot area
bindsym $mod+Print exec --no-startup-id ~/.local/bin/screenshot window
# Notification control
bindsym $mod+n exec --no-startup-id dunstctl history-pop
bindsym $mod+Shift+n exec --no-startup-id dunstctl close-all
bindsym $mod+Ctrl+n exec --no-startup-id dunstctl set-paused toggle
# Wallpaper shuffle
bindsym $mod+Shift+w exec --no-startup-id ~/.local/bin/set-wallpaper --random
# ---------------------------------------------------------------------------
# Modes
# ---------------------------------------------------------------------------
mode "resize" {
bindsym h resize shrink width 4 px or 4 ppt
bindsym j resize grow height 4 px or 4 ppt
bindsym k resize shrink height 4 px or 4 ppt
bindsym l resize grow width 4 px or 4 ppt
bindsym Left resize shrink width 4 px or 4 ppt
bindsym Down resize grow height 4 px or 4 ppt
bindsym Up resize shrink height 4 px or 4 ppt
bindsym Right resize grow width 4 px or 4 ppt
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
set $mode_display Display: [a]uto [d]uplicate [e]xtend-right [l]aptop-only
mode "$mode_display" {
bindsym a exec --no-startup-id "~/.local/bin/display auto", mode "default"
bindsym d exec --no-startup-id "~/.local/bin/display duplicate", mode "default"
bindsym e exec --no-startup-id "~/.local/bin/display extend", mode "default"
bindsym l exec --no-startup-id "~/.local/bin/display internal", mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+p mode "$mode_display"
# ---------------------------------------------------------------------------
# Window rules
# ---------------------------------------------------------------------------
for_window [class="^.*"] title_format "<span foreground='#cad3f5'>%title</span>"
# Float dialogs and small utilities
for_window [window_role="pop-up"] floating enable
for_window [window_role="bubble"] floating enable
for_window [window_role="dialog"] floating enable
for_window [window_type="dialog"] floating enable
for_window [window_type="menu"] floating enable
for_window [window_type="utility"] floating enable
for_window [window_type="toolbar"] floating enable
for_window [window_type="splash"] floating enable
for_window [class="Pavucontrol"] floating enable, resize set 900 600, move position center
for_window [class="Blueman-manager"] floating enable, resize set 800 560, move position center
for_window [class="Nm-connection-editor"] floating enable, resize set 800 560, move position center
for_window [class="Lxappearance"] floating enable, move position center
for_window [class="Thunar" instance="^dialog$"] floating enable
for_window [class="File-roller"] floating enable, move position center
for_window [class="Xarchiver"] floating enable, move position center
for_window [class="kitty-float"] floating enable, resize set 1000 620, move position center
for_window [title="^Picture-in-Picture$"] floating enable, sticky enable, resize set 640 360, move position 1250 700
# Assign apps to workspaces
assign [class="(?i)firefox|chromium|Brave-browser"] $ws2
assign [class="Thunar"] $ws4
# No focus stealing from these
no_focus [class="Steam"]
# ---------------------------------------------------------------------------
# i3bar — disabled; polybar handles the status bar.
# Kept as a commented fallback in case polybar ever fails to start.
# ---------------------------------------------------------------------------
# bar {
# status_command i3status
# colors {
# background $base
# statusline $text
# focused_workspace $mauve $mauve $crust
# active_workspace $surface0 $surface0 $text
# inactive_workspace $base $base $subtext0
# urgent_workspace $red $red $crust
# }
# }
# ---------------------------------------------------------------------------
# Local overrides — anything in this directory wins, and it is never
# overwritten by the bootstrap script.
# ---------------------------------------------------------------------------
include ~/.config/i3/config.d/*.conf