;; -*-lisp-*-
;;
;; StumpWM config

(in-package :stumpwm)

(defparameter *key-layout* "us -variant altgr-intl" "Stores the current key layout")

;; creating groups
(gnewbg "2")
(gnewbg "3")
(gnewbg "4")
(gnewbg "5")
(gnewbg "6")
(gnewbg "7")
(gnewbg "8")
(gnewbg "9")

;; border width
(setf *maxsize-border-width* 5)
(setf *transient-border-width* 5)
(setf *normal-border-width* 5)

;; border style
(setf *window-border-style* :tight)
(set-focus-color "#b00045")
(set-win-bg-color "black")
(set-unfocus-color "black")
(set-float-focus-color "#b00045")
(set-float-unfocus-color "black")

;; window gravity
(set-normal-gravity :center)
(set-maxsize-gravity :center)
(set-transient-gravity :center)
(gravity :center)

;; root keybindings

;;; browser
(define-key *root-map* (kbd "C-c") "exec /opt/firefox/firefox")

;;; terminal
(define-key *root-map* (kbd "c") "exec urxvt")

;;; es as emacs
(define-key *root-map* (kbd "e") "exec es")

;;; groups to rpws keys
(define-key *root-map* (kbd "C-1") "change-workspace 1")
(define-key *root-map* (kbd "C-2") "change-workspace 2")
(define-key *root-map* (kbd "C-3") "change-workspace 3")
(define-key *root-map* (kbd "C-4") "change-workspace 4")
(define-key *root-map* (kbd "C-5") "change-workspace 5")
(define-key *root-map* (kbd "C-6") "change-workspace 6")
(define-key *root-map* (kbd "C-7") "change-workspace 7")
(define-key *root-map* (kbd "C-8") "change-workspace 8")
(define-key *root-map* (kbd "C-9") "change-workspace 9")

;; xserver
(run-shell-command "xmodmap ~/.Xmodmap")
(run-shell-command "xrdb -merge ~/.Xresources")
;;; HiDPI stuff.
;;; TODO: Only run if required
;; (run-shell-command "xrdb -merge ~/.Xresources-hidpi")

;; dunst notify server
(run-shell-command "dunst")

;; nitrogen (wallpaper)
(run-shell-command "nitrogen --restore")

;; keepassxc
(run-shell-command "keepassxc ~/ownCloud/2016-10.kdbx")

;; message window font
(set-font "11Hermit")

;; set the mouse focus
(setf *mouse-focus-policy* :click)

;; set DESKTOP_SESSION variable
(setf (getenv "DESKTOP_SESSION") "stumpwm")

;; define volume control keys
(define-key *top-map* (kbd "XF86AudioLowerVolume") "exec amixer set Master 5%-")
(define-key *top-map* (kbd "XF86AudioRaiseVolume") "exec amixer set Master 5%+")
(define-key *top-map* (kbd "XF86AudioMute") "exec amixer set Master toggle")
(define-key *top-map* (kbd "XF86AudioMicMute") "exec amixer set Capture toggle")
(define-key *top-map* (kbd "XF86Launch1") "exec blurlock")

;; battery status
(define-key *root-map* (kbd "b") "exec ~/scripts/rat/bat.sh")

;; set backlight
(defcommand set-backlight (value)
  ((:string "Backlight in %: "))
  "Setting a new value for the backlight"
  (run-shell-command (concatenate 'string "xbacklight -set " value))
  (echo (concatenate 'string "Backlight set to " value)))

(define-key *root-map* (kbd "B") "set-backlight")

;; tweet
(defcommand tweet (tweet)
  ((:string "Tweet: "))
  "Tweet"
  (run-shell-command (concatenate 'string "cd ~/programs/dart/learning/twitter && dart main.dart -t \"" tweet "\""))
  (echo (concatenate 'string "Tweeted: " tweet)))

(define-key *root-map* (kbd "T") "tweet")

;; switch key layout
(defun switch-layout-to (new-lang)
  "Switch the key layout to the given one"
  (setq *key-layout* new-lang)
  (run-shell-command (concatenate 'string "setxkbmap -layout " new-lang " && xmodmap ~/.Xmodmap"))
  (echo (concatenate 'string "Set keyboard layout to " new-lang)))

;; switch key leyout to german
(defcommand layout-de ()
  ()
  "Set the keyboard layout to de (german)"
  (switch-layout-to "de"))

;; switch key leyout to american english
(defcommand layout-en ()
  ()
  "Set the keyboard layout to US International AltGr"
  (switch-layout-to "us -variant altgr-intl"))

;; switch key layout automatically
(defcommand switch-layout ()
  ()
  "Switch the layout"
  (if (string= "us -variant altgr-intl" *key-layout*)
      (switch-layout-to "de")
      (switch-layout-to "us -variant altgr-intl")))

(define-key *top-map* (kbd "s-SPC" ) "switch-layout")

;; switch workspace with a message
(defcommand change-workspace (n)
  ((:string n))
  "Switch workspace"
  (run-commands (concatenate 'string "gselect " n))
  (echo (concatenate 'string "Switched to " n)))


;; working with emacsclient
(defvar *es-win* nil
  "to hold the window called emacsclient")
(defun save-es-called-win ()
  (setf *es-win* (current-window)))

(defun return-es-called-window (win)
  (let* ((group (window-group win))
	 (frame (window-frame win))
	 (old-frame (tile-group-current-frame group)))
    (frame-raise-window group frame win)
    (focus-all win)
    (unless (eq frame old-frame)
      (show-frame-indicator group))))