[climacs-cvs] CVS update: climacs/gui.lisp

Robert Strandh rstrandh at common-lisp.net
Sun Jul 17 05:07:44 UTC 2005


Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv32166

Modified Files:
	gui.lisp 
Log Message:
A small step in towards factoring out common GUI components into a
Climacs-independent module so that they can be reused in similar
applications such as Gsharp. 

Specifically, I am trying to factor out:

   * the info pane (done)
   * the minibuffer pane (done)
   * the pane constellation containing an application pane (possibly
     within a scroller pane) and an info pane inside a vbox pane
   * the command loop
   * command processing     
   * if possible, common commands such as C-x 0, C-x 1, C-x 2, C-x 3


Date: Sun Jul 17 07:07:42 2005
Author: rstrandh

Index: climacs/gui.lisp
diff -u climacs/gui.lisp:1.150 climacs/gui.lisp:1.151
--- climacs/gui.lisp:1.150	Mon Jul 11 10:47:50 2005
+++ climacs/gui.lisp	Sun Jul 17 07:07:41 2005
@@ -39,15 +39,43 @@
    (dabbrev-expansion-mark :initform nil)
    (overwrite-mode :initform nil)))
 
+;;; a pane that displays some information about another pane
 (defclass info-pane (application-pane)
-  ((climacs-pane :initarg :climacs-pane)))
+  ((master-pane :initarg :master-pane))
+  (:default-initargs
+      :background +gray85+
+      :scroll-bars nil
+      :borders nil))
+
+(defclass minibuffer-pane (application-pane)
+  ((message :initform nil :accessor message))
+  (:default-initargs
+      :scroll-bars nil
+      :display-function 'display-minibuffer))
 
-(defclass minibuffer-pane (application-pane) ())
+(defun display-minibuffer (frame pane)
+  (declare (ignore frame))
+  (with-slots (message) pane
+    (unless (null message)
+    (princ message pane)
+    (setf message nil))))
 
 (defmethod stream-accept :before ((pane minibuffer-pane) type &rest args)
   (declare (ignore type args))
   (window-clear pane))
 
+(defclass climacs-info-pane (info-pane)
+  ()
+  (:default-initargs
+      :height 20 :max-height 20 :min-height 20
+      :display-function 'display-info
+      :incremental-redisplay t))
+
+(defclass climacs-minibuffer-pane (minibuffer-pane)
+  ()
+  (:default-initargs
+      :height 20 :max-height 20 :min-height 20))
+
 (define-application-frame climacs ()
   ((windows :accessor windows)
    (buffers :initform '() :accessor buffers)
@@ -64,22 +92,14 @@
 			   :incremental-redisplay t
 			   :display-function 'display-win))
 	       (info-pane
-		(make-pane 'info-pane
-			   :climacs-pane extended-pane
-			   :width 900 :height 20 :max-height 20 :min-height 20
-			   ::background +gray85+
-			   :scroll-bars nil
-			   :borders nil
-			   :incremental-redisplay t
-			   :display-function 'display-info)))
+		(make-pane 'climacs-info-pane
+			   :master-pane extended-pane
+			   :width 900)))
 	  (vertically ()
 	    (scrolling ()
 	      extended-pane)
 	    info-pane)))
-   (int (make-pane 'minibuffer-pane
-		   :width 900 :height 20 :max-height 20 :min-height 20
-		   :display-function 'display-minibuffer
-		   :scroll-bars nil)))
+   (int (make-pane 'climacs-minibuffer-pane :width 900)))
   (:layouts
    (default
        (vertically (:scroll-bars nil)
@@ -87,18 +107,10 @@
 	 int)))
   (:top-level (climacs-top-level)))
 
-(defparameter *message* nil)
-
 (defun display-message (format-string &rest format-args)
-  (setf *message* 
+  (setf (message *standard-input*)
 	(apply #'format nil format-string format-args)))
 
-(defun display-minibuffer (frame pane)
-  (declare (ignore frame))
-  (unless (null *message*)
-    (princ *message* pane)
-    (setf *message* nil)))
-
 (defmacro current-window () ; shouldn't this be an inlined function? --amb
   `(car (windows *application-frame*)))
 
@@ -116,26 +128,26 @@
     (loop for buffer in buffers
 	  do (clear-modify buffer))))
 
-(defun climacs ()
+(defun climacs (&key (width 900) (height 400))
   "Starts up a climacs session"
-  (let ((frame (make-application-frame 'climacs)))
+  (let ((frame (make-application-frame 'climacs :width width :height height)))
     (run-frame-top-level frame)))
 
 (defun display-info (frame pane)
   (declare (ignore frame))
-  (with-slots (climacs-pane) pane
-     (let* ((buf (buffer climacs-pane))
+  (with-slots (master-pane) pane
+     (let* ((buf (buffer master-pane))
 	    (name-info (format nil "   ~a   ~a   Syntax: ~a~a~a~a    ~a"
 			       (if (needs-saving buf) "**" "--")
 			       (name buf)
 			       (name (syntax buf))
-			       (if (slot-value climacs-pane 'overwrite-mode)
+			       (if (slot-value master-pane 'overwrite-mode)
 				   " Ovwrt"
 				   "")
-                               (if (auto-fill-mode climacs-pane)
+                               (if (auto-fill-mode master-pane)
                                    " Fill"
                                    "")
-                               (if (isearch-mode climacs-pane)
+                               (if (isearch-mode master-pane)
                                    " Isearch"
                                    "")
 			       (if (recordingp *application-frame*)
@@ -979,15 +991,9 @@
 	 (vbox
 	  (vertically ()
 	    (scrolling () extended-pane)
-	    (make-pane 'info-pane
-		       :climacs-pane extended-pane
-		       :width 900 :height 20
-		       :max-height 20 :min-height 20
-		       ::background +gray85+
-		       :scroll-bars nil
-		       :borders nil
-		       :incremental-redisplay t
-		       :display-function 'display-info))))
+	    (make-pane 'climacs-info-pane
+		       :master-pane extended-pane
+		       :width 900))))
     (values vbox extended-pane)))
 
 (define-named-command com-split-window-vertically ()




More information about the Climacs-cvs mailing list