# vim: filetype=i3config

# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!

# Key Shortcuts {{{1
set $mod Mod4
set $alt Mod1

# Colours {{{1
set $base00 #101218
set $base01 #1f222d
set $base02 #252936
set $base03 #7780a1
set $base04 #C0C5CE
set $base05 #d1d4e0
set $base06 #C9CCDB
set $base07 #ffffff
set $base08 #ee829f
set $base09 #f99170
set $base0A #ffefcc
set $base0B #a5ffe1
set $base0C #97e0ff
set $base0D #97bbf7
set $base0E #c0b7f9
set $base0F #fcc09e

# Widow Colours
#                         border  background text    indicator
  client.focused          $base01 $base01    $base07 $base0F
  client.focused_inactive $base02 $base02    $base03 $base0F
  client.unfocused        $base02 $base02    $base03 $base0F
  client.urgent           $base02 $base08    $base00 $base0F

# Fonts {{{1
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 8

# 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 8

#restart i3 {{{1
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart

# Window Controll {{{1

# Floating Mod {{{2
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# Killing Windows {{{2
# kill focused window
bindsym $mod+q kill

# Focus {{{2
# Make i3 use proper vim keys
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right

# alternatively, you can use the cursor keys although I can't imagine why
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window with vim keys
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right

# alternatively, you can use the cursor 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

# Layouts / Floats {{{2
# toggle the split direction
bindsym $mod+v split toggle

# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle

# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
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

# Workspaces {{{2
#set workspace names
set $workspace1 "1: Browser "
set $workspace2 "2: Terminal "
set $workspace3 "3"
set $workspace4 "4"
set $workspace5 "5"
set $workspace6 "6"
set $workspace7 "7"
set $workspace8 "8"
set $workspace9 "9"
set $workspace10 "10 Chat "

# switch to workspace
bindsym $mod+1 workspace $workspace1
bindsym $mod+2 workspace $workspace2
bindsym $mod+3 workspace $workspace3
bindsym $mod+4 workspace $workspace4
bindsym $mod+5 workspace $workspace5
bindsym $mod+6 workspace $workspace6
bindsym $mod+7 workspace $workspace7
bindsym $mod+8 workspace $workspace8
bindsym $mod+9 workspace $workspace9
bindsym $mod+0 workspace $workspace10

# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $workspace1,  workspace $workspace1
bindsym $mod+Shift+2 move container to workspace $workspace2,  workspace $workspace2
bindsym $mod+Shift+3 move container to workspace $workspace3,  workspace $workspace3
bindsym $mod+Shift+4 move container to workspace $workspace4,  workspace $workspace4
bindsym $mod+Shift+5 move container to workspace $workspace5,  workspace $workspace5
bindsym $mod+Shift+6 move container to workspace $workspace6,  workspace $workspace6
bindsym $mod+Shift+7 move container to workspace $workspace7,  workspace $workspace7
bindsym $mod+Shift+8 move container to workspace $workspace8,  workspace $workspace8
bindsym $mod+Shift+9 move container to workspace $workspace9,  workspace $workspace9
bindsym $mod+Shift+0 move container to workspace $workspace10, workspace $workspace10

# move workspace to left/right
bindsym $mod+control+Left move workspace to output left
bindsym $mod+control+Right move workspace to output right
bindsym $mod+control+h move workspace to output left
bindsym $mod+control+l move workspace to output right

# Resizing {{{2
# resize window (you can also use the mouse for that)
mode "resize" {
	# These bindings trigger as soon as you enter the resize mode

	# Pressing left will shrink the window’s width.
	# Pressing right will grow the window’s width.
	# Pressing up will shrink the window’s height.
	# Pressing down will grow the window’s height.
	bindsym h resize shrink width 10 px or 10 ppt
	bindsym j resize grow height 10 px or 10 ppt
	bindsym k resize shrink height 10 px or 10 ppt
	bindsym l resize grow width 10 px or 10 ppt
	bindsym $mod+h resize shrink width 2 px or 2 ppt
	bindsym $mod+j resize grow height 2 px or 2 ppt
	bindsym $mod+k resize shrink height 2 px or 2 ppt
	bindsym $mod+l resize grow width 2 px or 2 ppt

	# same bindings, but for the arrow keys
	bindsym Left resize shrink width 10 px or 10 ppt
	bindsym Down resize grow height 10 px or 10 ppt
	bindsym Up resize shrink height 10 px or 10 ppt
	bindsym Right resize grow width 10 px or 10 ppt

	# back to normal: Enter or Escape
	bindsym Return mode "default"
	bindsym Escape mode "default"
}

bindsym $mod+r mode "resize"



# Application Shortcuts {{{1

# Special Keyboard buttons {{{2
bindsym XF86Search exec rofi -show drun
bindsym XF86Mail exec thunderbird

# Pulse Audio controls {{{3
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 0 +5%  && pkill -SIGRTMIN+10 i3blocks #increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 0 -5%  && pkill -SIGRTMIN+10 i3blocks #decrease sound volume
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle  && pkill -SIGRTMIN+10 i3blocks # mute sound

# Volume using alt+scroll {{{4
bindsym --whole-window $alt+button4 exec --no-startup-id pactl set-sink-volume 0 -5% && pkill -SIGRTMIN+10 i3blocks #decrease sound volume
bindsym --whole-window $alt+button5 exec --no-startup-id pactl set-sink-volume 0 +5% && pkill -SIGRTMIN+10 i3blocks #increase sound volume


# Media player controls {{{3
bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioPause exec playerctl pause
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous

# Screen Brightness {{{3
bindsym XF86MonBrightnessUp exec xbacklight -inc 20 # increase screen brightness
bindsym XF86MonBrightnessDown exec xbacklight -dec 20 # decrease screen brightness

#calculator button
bindsym XF86Calculator exec galculator

# Print Screen {{{2
# printscreen
bindsym Print exec xfce4-screenshooter -f
bindsym ctrl+Print exec xfce4-screenshooter -w
bindsym Shift+Print exec xfce4-screenshooter -r

# Return {{{2
# start a terminal in current working dir
bindsym $mod+Return exec ~/.dotfiles/bin/folder-shell
# start Ranger in current working dir
bindsym $mod+Shift+Return exec ~/.dotfiles/bin/folder-shell "ranger"

# Insert {{{2
bindsym $mod+Shift+Insert exec --no-startup-id rofi -modi "clipboard:greenclip print" -show clipboard -run-command '{cmd}'

# A {{{2
# Opens R in Terminal in Scratchpad
bindsym $mod+a exec --no-startup-id ddspawn dropdowncalc -f mono:pixelsize=24
# Opens Vim in Terminal in Scratchpad
bindsym $mod+shift+a exec --no-startup-id ddspawn dropdownnotepad

# B {{{2
# Opens DBeaver
bindsym $mod+b exec dbeaver
# Opens sitee
bindsym $mod+Shift+b exec siteEnv

# C {{{2
# Opens Chromium
bindsym $mod+c exec chromium-snapshot-bin
# Opens Chromium in "Big Mode"
bindsym $mod+Shift+c exec google-chrome-stable --force-device-scale-factor=2

# D {{{2
# Start Rofi as program launcher
bindsym $mod+d exec rofi -show drun
# Start Rofi as ssh launcher
bindsym $mod+Shift+d exec rofi -show ssh


# E {{{2
# Generates reverse shells
bindsym $mod+Shift+e exec ~/.dotfiles/rofi/scripts/rofi-reverse-shells

# F {{{2
bindsym control+mod1+f exec thunar

# L {{{2
# Opens Logout / Lock / Shutdown etc. prompt
bindsym ctrl+shift+l exec --no-startup-id ~/.config/rofi/scripts/rofi-shutdown
# M {{{2
# Man page lookup - Opens man page as PDF - Uses Rofi to chose
bindsym $mod+m exec man -k . | awk '{ print $1 " " $2 }' | rofi -dmenu -p man -matching regex | awk '{ print $2 " " $1 }' | tr -d '()' | xargs -r man -t | ps2pdf - - | zathura -
# Same idea as above but uses TLDR pages
bindsym $mod+Shift+m exec "/usr/bin/tldr --list-all | sed 's/, /\\n/g' | rofi -dmenu -p 'TL;DR' -matching regex | xargs -r tldr -m | pandoc -f markdown -t ms | groff -ms - -T pdf | zathura -"

# Q {{{2
# Starts Qute Browser
bindsym $mod+Shift+q exec qutebrowser

# S {{{2
# Looks up http status codes
bindsym $mod+Shift+s exec cat ~/.dotfiles/rofi/scripts/http-status-codes | rofi -i -dmenu -p 'HTTP Status Code' | awk '{ print "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/"$1 }' | xargs -r qutebrowser

# U {{{2
#Start Rofi as emoji finder
bindsym $mod+u exec ~/.dotfiles/rofi/scripts/rofi-emoji

# W {{{2
# WP Lookup
bindsym $mod+Shift+w exec wpLookup

# Y {{{2
# Opens Zeal
bindsym $mod+y exec open-youtube

# Z {{{2
# Opens Zeal
bindsym $mod+z exec zeal

# Blocks {{{1

# Send signals to i3 blocks and zsh to tell them that capslock has been pushed
# The message to zsh is technically a "window change" which causes zsh to re-draw the prompt
# https://unix.stackexchange.com/questions/440184/update-zsh-ps1-propt-on-keypress
bindsym --release Caps_Lock exec pkill -SIGRTMIN+11 i3blocks && pkill -SIGWINCH zsh

#Send a message to i3blocks to say that numlock has been pushed
bindsym --release Num_Lock  exec pkill -SIGRTMIN+11 i3blocks

# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
	status_command i3blocks -c ~/.dotfiles/i3/i3blocks.conf
	output eDP1
	output primary
	output DP-1
	tray_output primary
	tray_output DP-1

	position top
	colors {
		separator $base03
		background $base01
		statusline $base05
		#                  border  background text
		focused_workspace  $base01 $base01    $base07
		active_workspace   $base01 $base02    $base03
		inactive_workspace $base01 $base01    $base03
		urgent_workspace   $base01 $base01    $base08
	}
}

bar {
	status_command i3blocks -c ~/.dotfiles/i3/i3blocks-secondary.conf
	output HDMI-1
	tray_output none
	position top
    colors {
		separator $base03
		background $base01
		statusline $base05
		#                  border  background text
		focused_workspace  $base01 $base01    $base07
		active_workspace   $base01 $base02    $base03
		inactive_workspace $base01 $base01    $base03
		urgent_workspace   $base01 $base01    $base08
	}
}

# Gaps {{{1

# Removes the boader on everything
for_window [class="^.*"] border pixel 0

# Sets up some tiny gaps
gaps outer -2
gaps inner 5
smart_gaps on

set $mode_gaps Gaps: (o) outer, (i) inner, (d) default
set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)

bindsym $mod+Shift+g mode "$mode_gaps"
mode "$mode_gaps" {
	bindsym o			mode "$mode_gaps_outer"
	bindsym i			mode "$mode_gaps_inner"
	bindsym d			gaps inner current set 10; gaps outer current set 0
	bindsym Shift+d		gaps inner all set 10; gaps outer all set 0
	bindsym Return mode "default"
	bindsym Escape mode "default"
}

mode "$mode_gaps_inner" {
	bindsym plus  gaps inner current plus 5
	bindsym minus gaps inner current minus 5
	bindsym 0     gaps inner current set 0
	bindsym d			gaps inner current set 10

	bindsym Shift+plus  gaps inner all plus 5
	bindsym Shift+minus gaps inner all minus 5
	bindsym Shift+0     gaps inner all set 0
	bindsym Shift+d		gaps inner all set 10

	bindsym Return mode "default"
	bindsym Escape mode "default"
}
mode "$mode_gaps_outer" {
	bindsym plus  gaps outer current plus 5
	bindsym minus gaps outer current minus 5
	bindsym 0     gaps outer current set 0
	bindsym d			gaps outer current set 0

	bindsym Shift+plus  gaps outer all plus 5
	bindsym Shift+minus gaps outer all minus 5
	bindsym Shift+0     gaps outer all set 0
	bindsym Shift+d		gaps outer all set 0

	bindsym Return mode "default"
	bindsym Escape mode "default"
}

# Scratchpad {{{1
# General dropdown window traits. The order can matter.
for_window [instance="dropdown_*"] floating enable
for_window [instance="dropdown_*"] move scratchpad
for_window [instance="dropdown_*"] sticky enable
for_window [instance="dropdown_*"] scratchpad show
for_window [instance="dropdown_*"] resize set 1200 600
for_window [instance="dropdown_*"] border pixel 20
for_window [instance="dropdown_*"] move position center

#Startup {{{1

# Compositor {{{2
exec --no-startup-id compton -f -i 0.95

# Notifications {{{2
exec_always --no-startup-id /usr/bin/dunst

# KDE Connect {{{2
exec_always --no-startup-id /usr/lib/kdeconnectd
exec_always --no-startup-id indicator-kdeconnect

# Monitor Setup {{{2 
# Work {{{3
exec --no-startup-id xrandr --output DP-1 --primary --mode 2560x1440 --pos 1920x0 --rotate normal --output HDMI-1 --mode 1920x1080 --pos 0x0 --rotate normal --output HDMI-2 --off
# Laptop {{{3
exec --no-startup-id xrandr --output HDMI2 --off --output HDMI1 --off --output DP1 --off --output eDP1 --primary --mode 1920x1080 --pos 0x0 --rotate normal --output VIRTUAL1 --off

# Clipboard manager {{{2
exec --no-startup-id greenclip daemon

# Restore Background {{{2
exec --no-startup-id nitrogen --restore

# Blue light filter {{{2
exec --no-startup-id redshift

# Layout Manager
exec --no-startup-id i3autolayout
