##########
# Basics #
##########

# Logo key. Use Mod1 for Alt.
set $mod Mod4

# Home row direction keys, like vim
set $left j
set $down k
set $up l
set $right semicolon

# Your preferred terminal emulator
set $term foot

# Your preferred application launcher
set $menu "rofi -terminal $term -modi combi -combi-modi sway:yaws,drun -show combi"

# Font
font pango:JetBrains Mono 11

# Background
output * bg /usr/share/backgrounds/default.jxl fill

##############
# Autostarts #
##############

# Screen lock and DPMS 
exec swayidle -w \
     timeout 300 'swaylock -f' \
     timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
     before-sleep 'swaylock -f'

# Start a clipboard manager
exec wl-paste -t text --watch clipman store --no-persist

# Notification daemon
exec mako

# sway-systemd
exec /usr/libexec/sway-systemd/session.sh

#######################
# Input configuration #
#######################

input type:touchpad {
      dwt enabled
      natural_scroll enabled
      click_method clickfinger
}

input type:keyboard {
      #xkb_layout "de"
      #xkb_variant "nodeadkeys"
      xkb_options "caps:escape"
}

######################
# Basics keybindings #
######################

# Start a terminal
bindsym $mod+Return exec $term

# Kill focused window
bindsym $mod+Shift+q kill

# Start your launcher
bindsym $mod+space exec $menu

# Drag floating windows by holding down $mod and left mouse button.
# Resize them with right mouse button + $mod.
# Despite the name, also works for non-floating windows.
# Change normal to inverse to use left mouse button for resizing and right
# mouse button for dragging.
floating_modifier $mod normal

# Reload the configuration file
bindsym $mod+Shift+c reload

# Exit sway (logs you out of your Wayland session)
bindsym $mod+Shift+e exec swaynag -t warning -m 'Session menu.' \
            -b 'Exit' 'swaymsg exit' \
            -b 'Suspend' 'systemctl suspend' \
            -b 'Reboot' 'systemctl reboot' \
            -b 'Shutdown' 'systemctl poweroff'

#################
# Moving around #
#################

# Move your focus around
bindsym $mod+$left focus left
bindsym $mod+$down focus down
bindsym $mod+$up focus up
bindsym $mod+$right focus right
# Or use $mod+[up|down|left|right]
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# Move the focused window with the same, but add Shift
bindsym $mod+Shift+$left move left
bindsym $mod+Shift+$down move down
bindsym $mod+Shift+$up move up
bindsym $mod+Shift+$right move right
# Ditto, with arrow keys
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

##############
# Workspaces #
##############

# Switch to workspace
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

# Move focused container to workspace
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

# Move workspace to output
bindsym $mod+Shift+comma move workspace to output left
bindsym $mod+Shift+period move workspace to output right

# Auto back and forth
workspace_auto_back_and_forth yes 

################
# Layout stuff #
################

# You can "split" the current object of your focus with
# $mod+b or $mod+v, for horizontal and vertical splits
# respectively.
bindsym $mod+b splith
bindsym $mod+v splitv

# Switch the current container between different layout styles
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split

# Make the current focus fullscreen
bindsym $mod+f fullscreen

# Toggle the current focus between tiling and floating mode
bindsym $mod+Shift+m floating toggle

# Swap focus between the tiling area and the floating area
bindsym $mod+m focus mode_toggle

# Move focus to the parent container
bindsym $mod+a focus parent

##############
# Scratchpad #
##############

# Move the currently focused window to the scratchpad
bindsym $mod+Shift+minus move scratchpad

# Show the next scratchpad window or hide the focused scratchpad window.
# If there are multiple scratchpad windows, this command cycles through them.
bindsym $mod+minus scratchpad show

#######################
# Resizing containers #
#######################

mode "resize" {
    # left will shrink the containers width
    # right will grow the containers width
    # up will shrink the containers height
    # down will grow the containers height
    bindsym $left resize shrink width 10px
    bindsym $down resize grow height 10px
    bindsym $up resize shrink height 10px
    bindsym $right resize grow width 10px

    # Ditto, with arrow keys
    bindsym Left resize shrink width 10px
    bindsym Down resize grow height 10px
    bindsym Up resize shrink height 10px
    bindsym Right resize grow width 10px

    # Return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"

##############
# Status bar #
##############

bar {
    position top
    font pango:JetBrains Mono 11
    status_command i3status
    colors {
        background #333333
    }
}

######################
# Custom keybindings #
######################

# Force-update i3status
set $refresh_i3status kill -USR1 i3status

# Use pactl to adjust volume in PulseAudio.
bindsym XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 10%+ && $refresh_i3status
bindsym XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 10%- && $refresh_i3status
bindsym XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle && $refresh_i3status

# Use light to adjust screen brightness.
set $light_store brightnessctl -m | awk -F',' '{print $4}' | tee /tmp/light.save
bindsym XF86MonBrightnessUp exec brightnessctl set +10% && $light_store
bindsym XF86MonBrightnessDown exec brightnessctl set 10%- && $light_store

# Store the screen brightness once on startup, so /tmp/light.save contains the correct value
exec $light_store

# Screenshots
bindsym $mod+Print exec grim

# swaycaffeine
bindsym $mod+i exec swaycaffeine -t -i visible
bindsym $mod+Shift+i exec swaycaffeine --clear-all

###########################################################
#                    Window rules                         #
# Note: use 'app_id' for wayland and 'class' for xwayland #
###########################################################

for_window [app_id="pavucontrol"] floating enable
for_window [app_id="nm-connection-editor"] floating enable
assign [app_id="firefox"] workspace number 1
