;; -*- mode: lisp; -*-
(require 'swank)

(in-package :stumpwm)

;; Naquadah
(defun colour (key)
  (let ((colours (list :aluminium-1 #xeeeeec
                       :aluminium-2 #xd3d7cf
                       :aluminium-3 #xbabdb6
                       :aluminium-4 #x888a85
                       :aluminium-5 #x555753
                       :aluminium-6 #x2e3436
                       :butter-1 #xfce94f
                       :butter-2 #xedd400
                       :butter-3 #xc4a000
                       :orange-1 #xfcaf3e
                       :orange-2 #xf57900
                       :orange-3 #xce5c00
                       :chocolate-1 #xe9b96e
                       :chocolate-2 #xc17d11
                       :chocolate-3 #x9f5902
                       :chameleon-1 #x8ae234
                       :chameleon-2 #x73d216
                       :chameleon-3 #x4e9a06
                       :sky-blue-1 #x729fcf
                       :sky-blue-2 #x3465a4
                       :sky-blue-3 #x204a87
                       :plum-1 #xad7fa8
                       :plum-2 #x75507b
                       :plum-3 #x5c3566
                       :scarlet-red-1 #xef2929
                       :scarlet-red-2 #xcc0000
                       :scarlet-red-3 #xa40000
                       :background #x252a2b
                       :black #x0c191c
                       :cyan "cyan3")))
    (getf colours key)))

(defvar *conkeror-program* "conkeror"
  "The executable to run to start Conkeror.")
(defvar *emacs-program* "emacsclient -c -a emacs"
  "The executable to run to start Emacs.")
(defvar *firefox-program* "firefox"
  "The executable to run to start Firefox.")
(defvar *i3lock-program* "i3lock -c 000000"
  "The executable to run to start i3lock.")
(defvar *urxvt-program* "urxvt"
  "The executable to run to start URxvt.")

(defun get-mail-count (mailbox &optional (inbox "inbox"))
  "Check how many new messages there are in MAILBOX."
  (length
   (directory
    (format nil "/home/slash/documents/mail/~A/~A/new/*.*"
            mailbox inbox))))

(defcommand run-emacs () ()
  "Open Emacs"
  (run-shell-command *emacs-program*))

(defcommand raise-emacs () ()
  "Open or show Emacs"
  (run-or-raise *emacs-program* '(:class "Emacs")))

(defcommand run-firefox () ()
  "Open Firefox"
  (run-shell-command *firefox-program*))

(defcommand raise-firefox () ()
  "Open or show Firefox"
  (run-or-raise *firefox-program* '(:class "Firefox")))

(defcommand run-conkeror () ()
  "Open Conkeror"
  (run-shell-command *conkeror-program*))

(defcommand raise-conkeror () ()
  "Open or show Conkeror"
  (run-or-raise *conkeror-program* '(:class "Conkeror")))

(defcommand run-urxvt () ()
  "Open URxvt"
  (run-shell-command *urxvt-program*))

(defcommand raise-urxvt () ()
  "Open URxvt"
  (run-or-raise *urxvt-program* '(:class "URxvt")))

(defcommand run-i3lock () ()
  "Lock screen"
  (run-shell-command *i3lock-program*))

(set-bg-color (colour :background))
(set-border-color (colour :aluminium-6))
(set-fg-color (colour :aluminium-1))
(set-float-focus-color (colour :black))
(set-float-unfocus-color (colour :aluminium-6))
(set-focus-color (colour :black))
(set-font "-*-dejavu sans mono-medium-r-*-*-15-*-*-*-*-*-iso10646-*")
(set-unfocus-color (colour :aluminium-6))
(set-win-bg-color (colour :background))

(setf *colors* (mapcar #'colour '(:black :scarlet-red-1 :chameleon-1
                                  :butter-1 :sky-blue-1 :plum-1 :cyan
                                  :aluminium-1)))
(setf *input-window-gravity* :bottom-left)
(setf *maxsize-border-width* 1)
(setf *message-window-gravity* :top-right)
(setf *mode-line-background-color* (colour :background))
(setf *mode-line-border-color* (colour :aluminium-6))
(setf *mode-line-foreground-color* (colour :aluminium-1))
(setf *normal-border-width* 1)
(setf *shell-program* (getenv "SHELL"))
(setf *transient-border-width* 1)
(setf *window-border-style* :tight)
(setf *window-format* "%m%50t")
(setf *screen-mode-line-format*
      (list "[%n]"
            '(:eval
              (format nil " | ryu: ~D | gmail: ~D | aethon: ~D | 9f: ~D | "
               (get-mail-count "ryuslash.org")
               (get-mail-count "gmail")
               (get-mail-count "aethon")
               (get-mail-count "ninthfloor")))
            '(:eval
              (format-expand *window-formatters* *window-format*
                                   (current-window)))))

(set-prefix-key (kbd "C-i"))

(define-key *top-map* (kbd "C-M-l") "run-i3lock")
(define-key *top-map* (kbd "KP_Begin") "vsplit")
(define-key *top-map* (kbd "KP_Divide") "remove")
(define-key *top-map* (kbd "KP_Left") "only")
(define-key *top-map* (kbd "KP_Multiply") "fnext")
(define-key *top-map* (kbd "KP_Right") "hsplit")
(define-key *top-map* (kbd "KP_End") "pull-hidden-next")

(define-key *root-map* (kbd "c") "raise-urxvt")
(define-key *root-map* (kbd "C") "run-urxvt")
(define-key *root-map* (kbd "e") "raise-emacs")
(define-key *root-map* (kbd "E") "run-emacs")
(define-key *root-map* (kbd "w") "raise-conkeror")
(define-key *root-map* (kbd "W") "run-conkeror")

(define-key *root-map* (kbd "C-b") "windowlist")
(define-key *root-map* (kbd "M-b") "move-window left")
(define-key *root-map* (kbd "M-f") "move-window right")
(define-key *root-map* (kbd "M-n") "move-window down")
(define-key *root-map* (kbd "M-p") "move-window up")
(define-key *root-map* (kbd "b") "move-focus left")
(define-key *root-map* (kbd "f") "move-focus right")
(define-key *root-map* (kbd "n") "move-focus down")
(define-key *root-map* (kbd "p") "move-focus up")

(undefine-key *root-map* (kbd "C-a"))
(undefine-key *root-map* (kbd "C-c"))
(undefine-key *root-map* (kbd "C-e"))
(undefine-key *root-map* (kbd "C-m"))

(define-frame-preference "Default"
    (0 t nil :class "Emacs")
  (1 t nil :class "Firefox")
  (1 t nil :class "URxvt")
  (1 t nil :class "Conkeror"))

(if (not (head-mode-line (current-head)))
    (toggle-mode-line (current-screen) (current-head)))

(swank:create-server)
