# 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 $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'
