;;; -*- Mode:LISP; Package:USER; Readtable:CL -*-

;;; Ensure we have more processing.
(setq tv::more-processing-global-enable t)

(send tv:initial-lisp-listener :set-more-p nil)

;;; I prefer a black screen.
(send tv::who-line-documentation-window :set-reverse-video-p nil)
;(push '(send tv::who-line-documentation-window :set-reverse-video-p t) logout-list)

(tv:white-on-black)
;(push '(tv:black-on-white) logout-list)

;;; Get rid of GATEWAY
(tv:remove-system-key #\g)

;;; Scheduler takes too much time.
(write-meter 'sys:%tv-clock-rate 60.)

;;; Improve paging performance (maybe)
(write-meter 'sys:%aging-depth 3.)

;;; Volatility scan on swapout.  Turned on August 18
;;; after fixing paging and hashing bugs.
(setf (ldb (byte 1 4) sys:%disk-switches) 1)

;;; Fix the world.
(load-patches :noselective)

;;; I want to use the new interpreter.
(make-system 'new-interpreter :noconfirm)
(load "dj:jrm;interpreter-setup.lisp")

;;; Use OBJECT-HASH to print random frobs.

si:
(defun print-random-object-suffix-with-object-hash (object stream &optional no-pointer)
  (unless no-pointer
    (send stream :tyo (pttbl-space *readtable*))
    (print-raw-fixnum (gc:object-hash object) si:base stream))
  (send stream :string-out (cdr (pttbl-random *readtable*))))

(fset 'si::print-random-object-suffix 'si::print-random-object-suffix-with-object-hash)

;;; Add some SCHEME primitives (predicates with question marks).
(load "dj:jrm;custom.qfasl" :package 'user)

;;; Fancy mouse blinkers for zwei
(load "dj:jrm;bobhack.qfasl")

(logo-blinker) ;cons cell

;;; Mac style windows.
;;; Actually, I guess I don't like them.
;(setq tv:*saved-bit-arrays-wipe?* nil)

;;; Fix dumb speling mistakes!
(setq si::*enable-spelling-dwim?* t)

;;; Random
(load "dj:pace;disable-page-out-words")

(defun jrm-query-terminal ()
  (case (fquery 
	 (list
	   ':choices '(((p "Portrait")       #\P)
		       ((l "Landscape")      #\L)
		       ((f "Fancy Landscape")#\F)
		       ((n "Leave it alone") #\END))
	   ':fresh-line 't
	   ':default-value 'f
	   ':timeout (* 30. 60.)) ;30 seconds.
	"Screen type? ")
    (p (tv::portrait))
    (l (tv::landscape))
    (f (ignore-errors
	 (make-system 'fancy-landscape :noconfirm)
	 (tv::fancy-landscape)))
    (n nil)))

(defun reversible-gc-on ()
  (declare (special sys:%sys-com-memory-size))
;  (let ((old-gc-state-vector #(0 0 0 0)))
;    (copy-array-contents gc:*level-control* old-gc-state-vector)
;    (push `(copy-array-contents ,old-gc-state-vector gc:*level-control*)
;	  logout-list)
    (gc:gc-on :degree 3)
    (let ((physical-memory (aref #'sys:system-communication-area sys:%sys-com-memory-size)))
      (setq physical-memory (min physical-memory (^ 2 21.)))
      (let* (
	     ;(level-1-size (truncate physical-memory 2))
	     ;(level-2-size (truncate level-1-size    3))
	     ;(level-3-size (truncate level-2-size    3))
	     (level-1-size 5000000)
	     (level-2-size 500000)
	     (level-3-size 50000)
	     )
	(setf (aref gc:*level-control* 3) level-3-size)
	(setf (aref gc:*level-control* 2) level-2-size)
	(setf (aref gc:*level-control* 1) level-1-size)
	(setf (aref gc:*level-control* 0) nil)))
    ;)
    )

(proclaim '(special si:%%region-volatility))

(defun adjust-volatility (area new-volatility)
  (setf (ldb si:%%region-volatility (aref #'si:area-region-bits area)) new-volatility))

;;; This var should be special.
(defvar zwei:zwei-line-area)

;;; Make ZWEI swap out things in groups.
(si:set-swap-recommendations-of-area zwei:zwei-line-area 12.)

;;; Change the default volatilities of these areas.
(defvar *new-region-volatilities*
   (list (list zwei:zwei-line-area 3)
	 (list fs:pathname-area    0)
	 (list tv:sheet-area       0)))

(mapcar #'(lambda (new-region-volatility)
	    (apply #'adjust-volatility new-region-volatility))
	*new-region-volatilities*)

(reversible-gc-on)

(defun mail-watch ()
  (tagbody
      wait-for-mail
	 (multiple-value-bind (mail? ignore)
	     (ignore-errors
	       (probef "ANGEL:/usr/spool/mail/jrm"))
	   (cond (mail? (tv:notify nil "You have new mail.") (go wait-for-no-mail))
		 (t (sleep (* 60. 5.)) ;;Check every 5 minutes.
		    (go wait-for-mail))))
      wait-for-no-mail
	 (multiple-value-bind (mail? ignore)
	     (ignore-errors
	       (probef "ANGEL:/usr/spool/mail/jrm"))
	   (cond (mail? (sleep (* 60. 5.)) (go wait-for-no-mail))
		 (t (go wait-for-mail))))))

(process-run-function "Mail Watcher" #'mail-watch)

(jrm-query-terminal)

;;; Turn on the Dvorak keyboard.
(setq tv:*default-character-translator* 'si:kbd-convert-to-software-char-dvorak-lmi)

(defun change-keyboard-mode ()
  (if (eq tv::*default-character-translator* 'si::kbd-convert-to-software-char)
      (setq tv::*default-character-translator* 'si::kbd-convert-to-software-char-dvorak-lmi)
      (setq tv::*default-character-translator* 'si::kbd-convert-to-software-char)))

(tv:add-to-system-menu-programs-column
  "QWERTY/DVORAK mode"
  '(change-keyboard-mode)
  "Toggle between qwerty and Dvorak keybord.")

(login-forms

  ;; Customized indentation for zwei.
  (push '(IF 2 3) ;; Indent three after predicate.
	zwei:*lisp-indent-offset-alist*)
  
  )

;;; Make the package system be mean!!
(setq si::*read-single-colon-allow-internal-symbol* nil)

(defun change-package-bitch-mode ()
  (if (eq si::*read-single-colon-allow-internal-symbol* nil)
      (setq si::*read-single-colon-allow-internal-symbol* t)
      (setq si::*read-single-colon-allow-internal-symbol* nil))
  (tv::who-line-clobbered))

(tv:add-to-system-menu-programs-column
  "Toggle Package Bitching"
  '(change-package-bitch-mode)
  "Toggle the single-colon/double-colon mode for package prefixes.")

(send tv:initial-lisp-listener :set-more-p t)

