;; -*- emacs-lisp -*-
;;; mst-blue-colours.el --- A blue colour scheme

;; Author: Mark Triggs <mst@dishevelled.net>
;; $Id: mst-blue-colours.el,v 1.10 2007/03/04 11:06:41 mst Exp $

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; Emacs Appearance ;;

(require 'font-lock)

(defun set-frame-alist (sym-property value)
  (let ((prop (assoc sym-property default-frame-alist)))
    (setq default-frame-alist
          (cons (cons sym-property value)
                (if prop
                    (remove prop default-frame-alist)
                  default-frame-alist))))
  (let ((prop (assoc sym-property initial-frame-alist)))
    (setq initial-frame-alist
          (cons (cons sym-property value)
                (if prop
                    (remove prop initial-frame-alist)
                  initial-frame-alist)))))

(defmacro ensure-eval-all (&rest forms)
  "Wrap each individual form in an IGNORE-ERRORS"
  `(progn ,@(mapcar #'(lambda (f)
                        `(condition-case err ,f
                           (error () (when (fboundp 'warn)
                                       (warn (format "Error with: %s" err))))))
                    forms)))


;; Emacs Appearance ;;
(set-frame-alist 'cursor-color "white")
(set-face-background 'cursor "white")
(setq-default cursor-type 'bar)



(defun mst-blue-theme ()
  (ensure-eval-all
   (set-face-background 'modeline "#567" (selected-frame))
   (set-face-foreground 'modeline "#def" (selected-frame))
   (set-face-attribute 'modeline (selected-frame) :box '(:line-width -1 :color "#89A"))
   (set-face-attribute 'modeline (selected-frame) :weight 'normal)
   (set-face-foreground 'widget-button "#bcd" (selected-frame))

   (set-face-attribute 'header-line (selected-frame) :box nil)

   (set-face-background 'header-line "#456" (selected-frame))
   (set-face-foreground 'header-line "#def" (selected-frame))
   (set-face-attribute 'header-line (selected-frame)
                       :box '(:line-width 1 :color "black"))

   (set-face-foreground 'mode-line-inactive "#567" (selected-frame))
   (set-face-background 'mode-line-inactive "#012" (selected-frame))
   (set-face-attribute 'mode-line-inactive (selected-frame) :weight 'normal)
   (set-face-attribute 'mode-line-inactive (selected-frame) :box nil)

   (set-face-background 'default "#112233" (selected-frame))
   (set-face-foreground 'default "#def" (selected-frame))
   (set-frame-alist 'foreground-color "#abc")
   (set-frame-alist 'background-color "#112233")

   (set-face-background 'fringe "#001020" (selected-frame))

   (set-face-foreground 'font-lock-string-face "#def" (selected-frame))
   (set-face-foreground 'font-lock-comment-face "#def" (selected-frame))

   (set-face-foreground 'font-lock-keyword-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-keyword-face (selected-frame) :weight 'bold)

   (set-face-foreground 'font-lock-function-name-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-function-name-face (selected-frame)
                       :weight 'semi-bold)

   (set-face-foreground 'font-lock-variable-name-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-variable-name-face (selected-frame) :weight 'normal)

   (set-face-foreground 'font-lock-constant-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-constant-face (selected-frame) :weight 'normal)

   (set-face-foreground 'font-lock-builtin-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-builtin-face (selected-frame) :weight 'bold)

   (set-face-foreground 'font-lock-warning-face "red" (selected-frame))
   (set-face-attribute 'font-lock-warning-face (selected-frame) :weight 'bold)



   (set-face-font 'minibuffer-prompt (face-font 'default))
   (set-face-attribute 'minibuffer-prompt (selected-frame) :weight 'bold)
   (set-face-foreground 'minibuffer-prompt "#def" (selected-frame))

   (set-face-foreground 'font-lock-type-face "#def" (selected-frame))
   (set-face-attribute 'font-lock-type-face (selected-frame) :weight 'bold)

   (set-face-foreground 'font-lock-doc-face "#def" (selected-frame))

   (set-face-foreground 'region "#def" (selected-frame))
   (set-face-background 'region "#506070" (selected-frame))
   (set-face-foreground 'italic "def" (selected-frame))

   ;;  (set-face-foreground 'hi-red-b "red" (selected-frame))
   ;;  (set-face-attribute 'hi-red-b (selected-frame) :weight 'bold)

   (require 'paren)
   (set-face-background 'show-paren-match-face (face-background
                                                'default) (selected-frame))
   (set-face-foreground 'show-paren-match-face "#def" (selected-frame))
   (set-face-attribute 'show-paren-match-face (selected-frame) :weight 'extra-bold)

   (set-face-background 'isearch "#506070" (selected-frame))
   (set-face-foreground 'isearch "#def" (selected-frame))

   (eval-after-load "highline"
     '(progn (set-face-attribute 'highline-face (selected-frame) :weight 'bold)
             (set-face-foreground 'highline-face "#def" (selected-frame))
             (set-face-background 'highline-face
                                  (face-background 'default) (selected-frame))))


   (set-face-foreground 'highlight "#def" (selected-frame))
   (set-face-background 'highlight (face-background 'default) (selected-frame))
   (set-face-attribute 'highlight (selected-frame) :box 1)

   (eval-after-load "flyspell"
     '(progn
        (set-face-foreground 'flyspell-incorrect-face "Gray60" (selected-frame))
        (set-face-attribute 'flyspell-incorrect-face (selected-frame) :box
                            '(:line-width 2 :color "#def"))
        (set-face-attribute 'flyspell-incorrect-face (selected-frame) :underline nil)))

   ;; cperl horribleness
   (eval-after-load "cperl-mode"
     '(progn (set-face-foreground 'cperl-nonoverridable-face "#def" (selected-frame))
             (set-face-attribute 'cperl-nonoverridable-face (selected-frame)
                                 :weight 'bold)
             (copy-face 'font-lock-variable-name-face 'cperl-hash-face)
             (copy-face 'font-lock-variable-name-face 'cperl-array-face)
             (set-face-background 'cperl-array-face
                                  (face-background 'default) (selected-frame))
             (set-face-background 'cperl-hash-face
                                  (face-background 'default) (selected-frame))))

   ;; emacs-wiki
   (eval-after-load "emacs-wiki"
     '(progn
        (set-face-foreground 'emacs-wiki-link-face "#def" (selected-frame))
        (set-face-attribute 'emacs-wiki-link-face (selected-frame) :underline t)))

   ;; Info
   (eval-after-load "info"
     '(progn (set-face-foreground 'info-xref "#def" (selected-frame))
             (set-face-foreground 'info-xref-visited "#abc" (selected-frame))
             (set-face-attribute 'info-xref (selected-frame) :weight 'bold)
             (set-face-attribute 'info-xref-visited (selected-frame) :weight 'normal)))

   ;; Message sending
   (eval-after-load "message"
     '(progn
        (set-face-foreground 'message-cited-text-face "#def" (selected-frame))
        (set-face-foreground 'message-header-name-face "Gray50" (selected-frame))
        (set-face-attribute 'message-header-name-face (selected-frame) :weight 'bold)))

   ;; shell mode
   (eval-after-load "sh-script"
     '(set-face-foreground 'sh-heredoc-face "Black" (selected-frame)))

   ;; LaTeX
   (eval-after-load "font-latex"
     '(progn
        (set-face-foreground 'font-latex-italic-face "gray50" (selected-frame))
        (set-face-foreground 'font-latex-bold-face "gray40" (selected-frame))
        (set-face-foreground 'font-latex-math-face "gray50" (selected-frame))
        (set-face-foreground 'font-latex-warning-face "red" (selected-frame))
        (dotimes (i 4)
          (set-face-foreground
           (intern (format "font-latex-sectioning-%d-face" (1+ i)))
           "#fff" (selected-frame)))))
   ;; MMM-mode

   ;; SLIME
   (eval-after-load "slime"
     '(progn
        (set-face-foreground 'slime-repl-inputed-output-face
                             (face-foreground 'default) (selected-frame))))

   (eval-after-load "mmm-mode"
     '(set-face-background 'mmm-default-submode-face (face-background
                                                      'default) (selected-frame)))

   (eval-after-load "compile"
     '(progn (set-face-foreground 'compilation-info "#abc" (selected-frame))
             (set-face-foreground 'match "#def" (selected-frame))
             (set-face-attribute 'match (selected-frame) :box 1)
             (set-face-background 'match (face-background 'default) (selected-frame))))

   (eval-after-load "tiny-xmms"
     '(progn (set-face-background 'tiny-xmms-highline "#112233" (selected-frame))
             (set-face-foreground 'tiny-xmms-highline "#def"
     (selected-frame))))))


(add-hook 'after-make-frame-functions
          (lambda (frame)
            (select-frame frame)
            (mst-blue-theme)))

(mst-blue-theme)

(provide 'mst-blue-colours)
;;; mst-colours.el ends here
