# Read `man 5 sway` for a complete reference.

### Variables
#
# Logo key. Use Mod1 for Alt.
set $mod Mod4
# Home row direction keys, like vim
set $left h
set $down j
set $up k
set $right l
# Your preferred terminal emulator
set $term foot
# Your preferred application launcher
# Note: pass the final command to swaymsg so that the resulting window can be opened
# on the original workspace that the command was run on.
#set $menu dmenu_path | wmenu | xargs swaymsg exec --
set $menu rofi -show drun | xargs swaymsg exec --
set $menuDrun rofi -show run | xargs swaymsg exec --
set $menuSsh rofi -show ssh | xargs swaymsg exec --
set $menuWindows rofi -show window | xargs swaymsg exec --
set $menuPower rofi -show power-menu -modi power-menu:rofi-power-menu | xargs swaymsg exec --
set $menuClipboard rofi -show clipboard -modi clipboard:~/bin/cliphist-rofi-img -show-icons | xargs swaymsg exec --

# See https://github.com/flameshot-org/flameshot/blob/14a136777cd82ab70f42c13b4bc9418c756d91d2/docs/Sway%20and%20wlroots%20support.md
set $flameshotCmd SDL_VIDEODRIVER=wayland _JAVA_AWT_WM_NONREPARENTING=1 QT_QPA_PLATFORM=wayland XDG_CURRENT_DESKTOP=sway XDG_SESSION_DESKTOP=sway flameshot
set $flameshotGuiCmd $flameshotCmd gui

{{ if eq .chezmoi.hostname "pixelbook" -}}
set $internalScreen "Sharp Corporation LQ123P1JX32 Unknown"

set $internalKeyboard "4012:2782:keyd_virtual_keyboard"
{{- end }}
{{ if eq .env "work" -}}
set $internalScreen "Chimei Innolux Corporation 0x143F Unknown"
set $P12GRAN304Screen "Dell Inc. DELL P2214H 29C293AA1DRL"

set $internalKeyboard "1:1:AT_Translated_Set_2_keyboard"
{{- end }}

set $auxScreen "LG Electronics LG Ultra HD 0x0000D4DC"
set $portableScreen "GWD ARZOPA 000000000000"

set $internalKeyboard "4012:2782:keyd_virtual_keyboard"
set $macKeyboard "1452:598:Apple_Wireless_Keyboard"

### Output configuration
#
# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/)
output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_2048x1536.png fill
#
# Example configuration:
#
#   output HDMI-A-1 resolution 1920x1080 position 1920,0
#
# You can get the names of your outputs by running: swaymsg -t get_outputs

{{ if eq .chezmoi.hostname "pixelbook" -}}
output $internalScreen {
  mode 2400x1600@59.982Hz
  pos 0 165
  scale 1.75
}

output $auxScreen {
  mode 1920x1080@60.000Hz
  pos 1372 0
}

output $portableScreen {
  mode 1920x1080@60.000Hz
  pos -1920 0
}

workspace 1 output $internalScreen
workspace 10 output $auxScreen $internalScreen
{{- end }}

{{ if eq .env "work" -}}
output $internalScreen {
  mode 1920x1200@60.003Hz
  pos 1920 0
}

output $auxScreen {
  mode 1920x1080@60.000Hz
  pos 3840 0
}

output $P12GRAN304Screen {
  mode 1920x1080@60.000Hz
  pos 0 0
}
{{- end }}

### Idle configuration
#
# Example configuration:
#
# exec swayidle -w \
#          timeout 300 'swaylock -f -c 000000' \
#          timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
#          before-sleep 'swaylock -f -c 000000'
#
# This will lock your screen after 300 seconds of inactivity, then turn off
# your displays after another 300 seconds, and turn your screens back on when
# resumed. It will also lock your screen before your computer goes to sleep.

### Input configuration
#
# Example configuration:
#
#   input "2:14:SynPS/2_Synaptics_TouchPad" {
#       dwt enabled
#       tap enabled
#       natural_scroll enabled
#       middle_emulation enabled
#   }
#
# You can get the names of your inputs by running: swaymsg -t get_inputs
# Read `man 5 sway-input` for more information about this section.

### Key bindings
#
# Basics:
#
    # Start a terminal
    bindsym $mod+Return exec $term

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

    # Start the launcher launcher
    bindsym $mod+d exec $menu

    # Other menus
    bindsym $mod+Shift+d exec $menuDrun
    bindsym $mod+g exec $menuSsh
    bindsym $mod+Shift+g exec $menuWindows
    bindsym $mod+c exec $menuClipboard
    bindsym $mod+Shift+s exec $menuPower

    # 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 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
#
# 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 workspaces around outputs
    bindsym $mod+Control+Shift+$right move workspace to output right
    bindsym $mod+Control+Shift+$left move workspace to output left
    bindsym $mod+Control+Shift+$down move workspace to output down
    bindsym $mod+Control+Shift+$up move workspace to output up
    bindsym $mod+Control+Shift+Right move workspace to output right
    bindsym $mod+Control+Shift+Left move workspace to output left
    bindsym $mod+Control+Shift+Down move workspace to output down
    bindsym $mod+Control+Shift+Up move workspace to output up
    # Note: workspaces can have any name you want, not just numbers.
    # We just use 1-10 as the default.
#
# 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+space floating toggle

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

    # Move focus to the parent container
    bindsym $mod+a focus parent
#
# Scratchpad:
#
    # Sway has a "scratchpad", which is a bag of holding for windows.
    # You can send windows there and get them back later.

    # 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

#
# Custom keybindings:
#
    bindsym Control+Shift+Comma exec flatpak run it.mijorus.smile

# Sound
    bindsym XF86AudioRaiseVolume exec wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+
    bindsym XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
    bindsym XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
    bindsym XF86AudioPlay exec playerctl play-pause
    bindsym XF86AudioPause exec playerctl play-pause
    bindsym XF86AudioNext exec playerctl next
    bindsym XF86AudioPrev exec playerctl previous

# Brightness
    bindsym XF86MonBrightnessDown exec brightnessctl set 5%-
    bindsym XF86MonBrightnessUp exec brightnessctl set 5%+
    bindsym Alt+XF86MonBrightnessDown exec brightnessctl --device='chromeos::kbd_backlight' set 5%-
    bindsym Alt+XF86MonBrightnessUp exec brightnessctl --device='chromeos::kbd_backlight' set 5%+

# Menu
    bindsym XF86Tools exec $menu
    bindsym XF86LaunchB exec $menu

# Notifications
    bindsym $mod+X exec makoctl dismiss
    bindsym $mod+Shift+X exec makoctl restore
    bindsym $mod+Z exec makoctl dismiss -a

# Print screen
    bindsym Print exec $flameshotGuiCmd
    bindsym XF86LaunchA exec $flameshotGuiCmd
    bindsym $mod+P exec $flameshotGuiCmd

#
# 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:
#
# Read `man 5 sway-bar` for more information about this section.
bar {
    position top

    status_command SCRIPT_DIR=~/.config/i3blocks i3blocks

    colors {
        statusline #ffffff
        background #323232
        inactive_workspace #32323200 #32323200 #5c5c5c
    }
}

include /etc/sway/config.d/*

input type:touchpad {
  tap enabled
  natural_scroll enabled
}

input type:pointer {
  natural_scroll enabled
}

input type:keyboard {
  xkb_layout es,us
  xkb_options grp:alt_space_toggle
}

{{ if eq .chezmoi.hostname "pixelbook" -}}
input $internalKeyboard {
  xkb_layout us,es
  xkb_options grp:rctrl_toggle
}

input type:tablet_tool {
  map_to_output $internalScreen
}

input type:touch {
  map_to_output $internalScreen
}
{{- end }}
{{ if eq .env "work" -}}
input $internalKeyboard {
  xkb_layout es,us
  xkb_options grp:alt_space_toggle
}
{{- end }}

input $macKeyboard {
  xkb_layout es,us
  xkb_options grp:rwin_toggle
}

font pango:monospace 10

# @source: https://www.reddit.com/r/swaywm/comments/16nutle/comment/k1ig9b6/
# @source: https://gitlab.com/that1communist/dotfiles/-/blob/master/.config/sway/modules/win-rules
# NOTE: You can get app_id's with `swaymsg -t get_tree`
for_window {
  [window_role="pop-up"] floating enable
  [window_role="About"] floating enable
  [window_role="bubble"] floating enable
  [window_role="dialog"] floating enable
  [window_type="dialog"] floating enable

  [title="(?:Open|Save) (?:File|Folder|As)"] floating enable, resize set width 1030 height 710

  [app_id="org.gnome.Calculator"] floating enable
  [app_id="it.mijorus.smile"] floating enable
  # See https://wiki.archlinux.org/index.php?title=Flameshot&oldid=813985#Flameshot_does_not_work_on_all_monitors_of_a_multi-monitor_setup_in_Sway
{{ if eq .chezmoi.hostname "pixelbook" -}}
  [app_id="flameshot"] border pixel 0, floating enable, fullscreen disable, move absolute position 0 0
{{- else -}}
  [app_id="flameshot"] border pixel 0, floating enable, fullscreen disable, move absolute position 0 0
{{- end }}

  [title=".* is sharing your screen"] move window to scratchpad
  [app_id="chrome-pjibgclleladliembfgfagdaldikeohf-.*"] move window to workspace 10; workspace 10
  [app_id="chrome-aoocenepihlidnmnheodnngihilbadfo-.*"] move window to workspace 10; workspace 10
}

exec mako

# See https://github.com/emersion/xdg-desktop-portal-wlr/blob/d9ada849aeca6137915de2df69beaef4e272cc1d/README.md#running
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway

exec $flameshotCmd

exec wl-paste --watch cliphist store -max-items 10

exec safeeyes

# See https://wiki.archlinux.org/title/Sway#Idle
exec swayidle -w \
  timeout 235 'swaymsg "output * power off"' \
  resume 'swaymsg "output * power on"' \
  timeout 240 'swaylock -f' \
  timeout 300 'systemctl sleep' \
  before-sleep 'playerctl pause; swaylock -f'
