Files
dotfiles/.config/i3/config
Julian Prein d89fd6653c kitty: Make kitty startup fast
Starting a new kitty process is quite slow. With --single-instance "new
invocations will instead create a new top-level window in the existing
kitty instance"[^1] to allow "kitty to share a single sprite cache on
the GPU"[^1], so that startup is almost instant.

For this to work best, launch one hidden "daemon" instance at startup so
that the kitty process is always running, even when no OS windows
exists.

[^1]: kitty(1)

Link: https://github.com/kovidgoyal/kitty/issues/330
2025-05-22 15:49:03 +02:00

289 lines
8.8 KiB
Plaintext

# i3 Settings ##################################################################
set $mod Mod4
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:DejaVu Sans Mono 10
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
default_border pixel 1
hide_edge_borders smart
# Use --single-instance for faster startup. See the "daemon" exec below
set $TERMINAL kitty --single-instance
set $TERM_CLASS kitty
set $TERM_DIR_FLAG -d
set $TERM_TITLE_FLAG -T
set $TERM_TRANSPARENCY_FLAG -o background_opacity=
set $TERM_SCRATCHPAD_TRANS 0.45
set $TERM_CMD_FLAG
# Focus should not follow mouse
# focus_follows_mouse no
# Gaps #########################################################################
# gaps inner 10
# gaps outer 7
# Execs ########################################################################
# Starting a new kitty process is quite slow. With --single-instance (see
# $TERMINAL definition above) "new invocations will instead create a new
# top-level window in the existing kitty instance"[^1] to allow "kitty to share
# a single sprite cache on the GPU"[^1], so that startup is almost instant.
#
# For this to work best, launch one hidden "daemon" instance at startup so that
# the kitty process is always running, even when no OS windows exists.
#
# [^1]: kitty(1)
exec --no-startup-id $TERMINAL --start-as hidden --detach
# Multi monitor support
exec_always --no-startup-id ~/.config/i3/monitor-setup.sh &
# Keybindins ###################################################################
# Terminal
bindsym $mod+Return exec $TERMINAL $TERM_DIR_FLAG "$(xcwd)"
bindsym $mod+Shift+Return exec $TERMINAL
# Program launcher
bindsym $mod+d exec rofi -show drun
bindsym $mod+Shift+d exec dmenu_run
# kill focused window
bindsym $mod+Shift+q kill
# change focus
focus_wrapping no
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# set split orientation
bindsym $mod+v split vertical
bindsym $mod+Shift+v split horizontal
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# Set workspace names
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"
# switch to workspace
bindsym $mod+1 workspace $ws1
bindsym $mod+2 workspace $ws2
bindsym $mod+3 workspace $ws3
bindsym $mod+4 workspace $ws4
bindsym $mod+5 workspace $ws5
bindsym $mod+6 workspace $ws6
bindsym $mod+7 workspace $ws7
bindsym $mod+8 workspace $ws8
bindsym $mod+9 workspace $ws9
bindsym $mod+0 workspace $ws10
# switch back to the previous workspace
workspace_auto_back_and_forth yes
bindsym $mod+Tab exec i3-msg workspace "$( \
i3-msg -t get_workspaces | \
jq -r '.[] | select(.focused).name')"
# Switch visible workspaces (e.g. multi monitor setup)
bindsym $mod+Shift+Tab exec i3-msg workspace "$( \
i3-msg -t get_workspaces | \
jq -r '.[] | select(.visible and (.focused | not)).name' | \
head -1)"
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5
bindsym $mod+Shift+6 move container to workspace $ws6
bindsym $mod+Shift+7 move container to workspace $ws7
bindsym $mod+Shift+8 move container to workspace $ws8
bindsym $mod+Shift+9 move container to workspace $ws9
bindsym $mod+Shift+0 move container to workspace $ws10
# move focused container and switch to workspace
bindsym Mod1+Shift+1 move container to workspace $ws1; workspace $ws1
bindsym Mod1+Shift+2 move container to workspace $ws2; workspace $ws2
bindsym Mod1+Shift+3 move container to workspace $ws3; workspace $ws3
bindsym Mod1+Shift+4 move container to workspace $ws4; workspace $ws4
bindsym Mod1+Shift+5 move container to workspace $ws5; workspace $ws5
bindsym Mod1+Shift+6 move container to workspace $ws6; workspace $ws6
bindsym Mod1+Shift+7 move container to workspace $ws7; workspace $ws7
bindsym Mod1+Shift+8 move container to workspace $ws8; workspace $ws8
bindsym Mod1+Shift+9 move container to workspace $ws9; workspace $ws9
bindsym Mod1+Shift+0 move container to workspace $ws10; workspace $ws10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec \
i3-nagbar \
-t warning \
-m 'Do you really want to exit i3? This will end your X session.' \
-b 'Yes' \
'i3-msg exit'
# resize window (you can also use the mouse for that)
mode "resize" {
bindsym h resize grow left
bindsym j resize grow down
bindsym k resize grow up
bindsym l resize grow right
bindsym Shift+h resize shrink right
bindsym Shift+j resize shrink up
bindsym Shift+k resize shrink down
bindsym Shift+l resize shrink left
# Set window size to predefined values
# firefox anti fingerprinting
bindsym p resize set 1920 1080
# scratchpad-terminal default size
bindsym s resize set 1600 900
# "fullscreen"
bindsym f resize set 3200 1770
# "reader" - terminal with vim without line numbers fitting 80 characters
bindsym r resize set 1170
# Move window to center
bindsym c move position center
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
# Brightness controls (/etc/X11/xorg.conf necessary)
bindsym XF86MonBrightnessDown exec xbacklight -dec 5
bindsym XF86MonBrightnessUp exec xbacklight -inc 5
# Volume controls
# See: https://faq.i3wm.org/question/125/how-to-change-the-systems-volume.1.html
bindsym XF86AudioRaiseVolume exec --no-startup-id \
amixer -q -D pulse sset Master 5%+
bindsym XF86AudioLowerVolume exec --no-startup-id \
amixer -q -D pulse sset Master 5%-
bindsym XF86AudioMute exec --no-startup-id \
amixer -q -D pulse sset Master toggle-mute
# Lock
bindsym $mod+mod1+l exec xset s activate
# Start powermenu
bindsym $mod+p exec ~/.config/rofi/powermenu.sh &
# Notify when toggling airplane mode
bindsym XF86RFKill exec --no-startup-id ~/.config/i3/airplane-mode-notify.sh
bindsym $mod+Shift+m move scratchpad
bindsym $mod+Shift+o scratchpad show
# scratchpad-terminal
for_window [class="^$TERM_CLASS$" title="^scratchpad-terminal$"] \
move scratchpad, \
scratchpad show, \
sticky enable, \
border none, \
resize set 1600 900, \
move position center
# Toggle the scratchpad-terminal or create a new one if none exists.
bindsym $mod+comma exec \
i3-msg '[class="^$TERM_CLASS$" title="^scratchpad-terminal$"] \
scratchpad show' \
|| $TERMINAL $TERM_TRANSPARENCY_FLAG$TERM_SCRATCHPAD_TRANS \
$TERM_DIR_FLAG "$(xcwd)" \
$TERM_TITLE_FLAG scratchpad-terminal
for_window [class="^TelegramDesktop$"] \
move scratchpad, \
scratchpad show
bindsym $mod+Shift+t exec \
i3-msg '[class="^TelegramDesktop$"] scratchpad show' \
|| telegram-desktop
for_window [class="^Signal$"] \
move scratchpad, \
scratchpad show
bindsym $mod+Shift+s exec \
i3-msg '[class="^Signal$"] scratchpad show' \
|| signal-desktop
for_window [class="^Bitwarden$"] \
move scratchpad, \
scratchpad show
bindsym $mod+Shift+b exec \
i3-msg '[class="^Bitwarden$"] scratchpad show' \
|| bitwarden-desktop
for_window [class="^$TERM_CLASS$" title="^polybar-datetime-calendar$"] \
floating enable, \
border pixel 3, \
resize set 378 300, \
move position 1411 32
for_window [class="^$TERM_CLASS$" title="^polybar-wlan$"] \
floating enable, \
border pixel 3, \
resize set 1125 750, \
move position 2075 32
bindsym $mod+c exec ~/.config/polybar/scripts/calendar.sh -t &
# screenshots
bindsym --release Print exec cd ~/media/pics/screens/ && scrot
bindsym --release Shift+Print exec cd ~/media/pics/screens/ && scrot -s -f
# Zoom links in private browser
bindsym $mod+z exec ~/.local/bin/zoom-links
# Monitor selection with fzf
for_window [class="^$TERM_CLASS$" title="^fzf-monitor-setup$"] \
floating enable, \
border pixel 3, \
resize set 378 300, \
move position 1 32
bindsym $mod+m exec \
pkill -f fzf-monitor-setup -O 1 \
|| $TERMINAL $TERM_TITLE_FLAG fzf-monitor-setup $TERM_CMD_FLAG \
sh -c "~/.local/bin/monitor-setup && ~/.config/polybar/launch.sh"