# ── Variables ───────────────────────────────────────────────────────────────── set $mod Mod4 set $term ghostty set $menu fuzzel # ── Appearance ──────────────────────────────────────────────────────────────── font mono 8 default_border pixel 1 default_floating_border pixel 1 gaps inner 0 gaps outer 0 # Gruvbox dark colors # class border bg text indicator child_border client.focused #fabd2f #282828 #ebdbb2 #fabd2f #fabd2f client.focused_inactive #3c3836 #282828 #928374 #3c3836 #3c3836 client.unfocused #3c3836 #282828 #928374 #3c3836 #3c3836 client.urgent #fb4934 #282828 #ebdbb2 #fb4934 #fb4934 # ── Input ───────────────────────────────────────────────────────────────────── input type:keyboard { xkb_layout us xkb_variant altgr-intl xkb_options caps:escape,compose:rctrl repeat_delay 300 repeat_rate 50 } input type:touchpad { tap enabled natural_scroll enabled dwt enabled } # ── Behavior ────────────────────────────────────────────────────────────────── focus_follows_mouse yes mouse_warping container seat * hide_cursor 3000 seat * xcursor_theme Adwaita 24 # ── Output ──────────────────────────────────────────────────────────────────── output * bg #282828 solid_color # ── Window rules ────────────────────────────────────────────────────────────── for_window [class="feh"] floating enable for_window [app_id="imv"] floating enable for_window [app_id="floating"] floating enable for_window [class="Tor Browser"] floating enable for_window [app_id="org.mozilla.Thunderbird" title=".*Mozilla Thunderbird$"] mark --add tb-main for_window [shell=".*"] inhibit_idle fullscreen # ── Standard keybinds (sway defaults) ───────────────────────────────────────── bindsym $mod+Return exec $term bindsym $mod+Shift+q kill bindsym $mod+d exec $menu # Navigation bindsym $mod+h focus left bindsym $mod+j focus down bindsym $mod+k focus up bindsym $mod+l focus right # Move windows bindsym $mod+Shift+h move left bindsym $mod+Shift+j move down bindsym $mod+Shift+k move up bindsym $mod+Shift+l move right # Workspaces bindsym $mod+1 workspace number 1 bindsym $mod+2 workspace number 2 bindsym $mod+3 workspace number 3 bindsym $mod+4 workspace number 4 bindsym $mod+5 workspace number 5 bindsym $mod+6 workspace number 6 bindsym $mod+7 workspace number 7 bindsym $mod+8 workspace number 8 bindsym $mod+9 workspace number 9 bindsym $mod+0 workspace number 10 bindsym $mod+Shift+1 move container to workspace number 1 bindsym $mod+Shift+2 move container to workspace number 2 bindsym $mod+Shift+3 move container to workspace number 3 bindsym $mod+Shift+4 move container to workspace number 4 bindsym $mod+Shift+5 move container to workspace number 5 bindsym $mod+Shift+6 move container to workspace number 6 bindsym $mod+Shift+7 move container to workspace number 7 bindsym $mod+Shift+8 move container to workspace number 8 bindsym $mod+Shift+9 move container to workspace number 9 bindsym $mod+Shift+0 move container to workspace number 10 # Layout bindsym $mod+b splith bindsym $mod+v splitv bindsym $mod+s layout stacking bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split bindsym $mod+f fullscreen bindsym $mod+Shift+space floating toggle bindsym $mod+space focus mode_toggle bindsym $mod+a focus parent # Cycle windows within tabbed/stacked container (monocle-style) bindsym $mod+bracketright focus next bindsym $mod+bracketleft focus prev # Scratchpad bindsym $mod+Shift+minus move scratchpad bindsym $mod+minus scratchpad show # Resize mode mode "resize" { bindsym h resize shrink width 10px bindsym j resize grow height 10px bindsym k resize shrink height 10px bindsym l resize grow width 10px bindsym Escape mode "default" bindsym Return mode "default" } bindsym $mod+r mode "resize" # Reload / session bindsym $mod+Shift+c reload bindsym $mod+Shift+e exec swaynag -t warning -m 'Session' \ -B 'Lock' 'playerctl -a pause; swaylock -f -e -c 282828' \ -B 'Logout' 'swaymsg exit' \ -B 'Reboot' 'doas /usr/bin/reboot' \ -B 'Poweroff' 'doas /usr/bin/poweroff' # ── Personal keybinds ───────────────────────────────────────────────────────── # Workspace cycling bindsym $mod+Tab workspace next_on_output bindsym $mod+Shift+Tab workspace prev_on_output # Volume bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle bindsym $mod+Shift+m exec pactl set-sink-mute @DEFAULT_SINK@ toggle bindsym $mod+m exec pactl set-source-mute @DEFAULT_SOURCE@ toggle # Media bindsym XF86AudioPlay exec playerctl play-pause bindsym XF86AudioNext exec playerctl next bindsym XF86AudioPrev exec playerctl previous # Brightness bindsym XF86MonBrightnessUp exec brightnessctl set +5% bindsym XF86MonBrightnessDown exec brightnessctl set 5%- # ThinkPad multimedia keys bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle bindsym XF86Bluetooth exec ~/.config/sway/bt-toggle.sh bindsym XF86ScreenSaver exec "playerctl -a pause; swaylock -f -e -c 282828" bindsym XF86Sleep exec systemctl suspend bindsym XF86WLAN exec ~/.config/waybar/wifi-toggle.sh bindsym XF86RFKill exec rfkill toggle all # Screenshots bindsym Print exec sh -c 'grim -g "$(slurp)" - | tee ~/pics/screenshots/$(date +%Y-%m-%d-%H-%M-%S).png | wl-copy' bindsym Shift+Print exec sh -c 'grim - | tee ~/pics/screenshots/$(date +%Y-%m-%d-%H-%M-%S).png | wl-copy' # Dictation (push-to-talk toggle, whisper.cpp) bindsym $mod+i exec ~/.local/bin/dictate # OCR — crop a region, copy text to clipboard (tesseract) bindsym $mod+Shift+o exec ~/.local/bin/ocr # Lock & pause bindsym $mod+Shift+s exec "playerctl -a pause; swaylock -f -e -c 282828" # Notifications bindsym $mod+n exec ~/.config/waybar/dismiss-visible.sh top bindsym $mod+Shift+n exec ~/.config/waybar/dismiss-visible.sh all bindsym $mod+Ctrl+n exec ~/.config/waybar/restore-pending.sh # Clipboard history bindsym $mod+p exec sh -c 'cliphist list | fuzzel --dmenu | cliphist decode | wl-copy' bindsym $mod+Shift+p exec sh -c 'cliphist list | fuzzel --dmenu | cliphist delete' # Display mode switching bindsym --no-repeat XF86Display exec ~/.config/sway/display-toggle.sh # Multimedia hardware keys (uncommon) bindsym XF86Tools exec $term --class=floating -e pulsemixer bindsym XF86Keyboard exec $term --class=floating -e glow -p ~/dotfiles/KEYBINDS.md bindsym XF86Favorites exec ~/.config/waybar/mako-history.py # QR codes (Super+z then r=read or w=write) mode "qr" { bindsym r exec ~/.local/bin/rqr, mode "default" bindsym w exec ~/.local/bin/wqr, mode "default" bindsym Escape mode "default" bindsym Return mode "default" } bindsym $mod+z mode "qr" # Thunderbird toggle: main window stashed in the scratchpad; this pulls it to # the current workspace (tiled) or sends it back. Child windows (compose, # viewer, calendar, prefs) tile normally wherever Thunderbird spawns them. bindsym $mod+t exec ~/.config/sway/tb-toggle.sh # ── Bar ─────────────────────────────────────────────────────────────────────── # Managed by waybar.service (pulled in via sway-session.target). # ── Autostart ───────────────────────────────────────────────────────────────── exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_SESSION_DESKTOP PASSWORD_STORE_DIR exec dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_SESSION_DESKTOP PASSWORD_STORE_DIR exec "sleep 2 && ~/.config/sway/display-toggle.sh init" exec systemctl --user start sway-session.target exec ~/.config/sway/tb-autostart.sh # GTK4 reads dark mode from gsettings (settings.ini's prefer-dark is GTK3 only). exec gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'