[mcclim-cvs] CVS mcclim/Drei

thenriksen thenriksen at common-lisp.net
Sun Jan 27 09:36:07 UTC 2008


Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv29065/Drei

Modified Files:
	drei-clim.lisp drei-redisplay.lisp drei.lisp input-editor.lisp 
Log Message:
Changed a bit in how cursors work, they are now always part of the
output history, and aren't arbitrarily added and removed as their state changes.

Also restores the blue inactive-cursors in Climacs.


--- /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2008/01/17 23:11:06	1.32
+++ /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2008/01/27 09:36:07	1.33
@@ -55,6 +55,12 @@
 ;;; CLIM cursors, though perhaps this facility should be built on top
 ;;; of what CLIM already provides. That seemed a bit (=a lot) hairy,
 ;;; though.
+
+;;; Cursors are output records. When a cursor is created, it adds
+;;; itself to its output stream. The owner of the cursor (a Drei
+;;; instance) is responsible for removing the cursor once it is done
+;;; with it. Cursors can be active/inactive and enabled/disabled and
+;;; have the same activity-status as their associated view.
 (defclass drei-cursor (standard-sequence-output-record)
   ((%view :reader view
           :initarg :view
@@ -90,6 +96,10 @@
 Drei buffer. The most important role for instances of subclasses
 of this class is to visually represent the position of point."))
 
+(defmethod initialize-instance :after ((object drei-cursor) &rest initargs)
+  (declare (ignore initargs))
+  (stream-add-output-record (output-stream object) object))
+
 (defmethod active ((cursor drei-cursor))
   "Whether the cursor is active or
 not. An active cursor is drawn using the active ink, and an
@@ -106,9 +116,6 @@
       (active-ink cursor)
       (inactive-ink cursor)))
 
-(defmethod (setf enabled) ((new-value null) (cursor drei-cursor))
-  (erase-output-record cursor (output-stream cursor) nil))
-
 (defclass point-cursor (drei-cursor)
   ()
   (:default-initargs
@@ -136,7 +143,7 @@
 (defmethod enabled ((cursor mark-cursor))
   *show-mark*)
 
-(defgeneric visible (cursor view)
+(defgeneric visible-1 (cursor view)
   (:documentation "Is `cursor', associated with `view', visible?
 If this function returns true, it is assumed that it is safe to
 display `cursor' to the editor stream. If just one of the
@@ -146,6 +153,12 @@
   (:method and (cursor view)
     (enabled cursor)))
 
+(defun visible-p (cursor)
+  "Return true if `cursor' is visible. This is a trampoline
+function that calls `visible-1' with `cursor' and the view of
+`cursor'."
+  (visible-1 cursor (view cursor)))
+
 ;;; Drei instances.
 
 (defclass drei-pane (drei application-pane)
@@ -174,7 +187,7 @@
   ;; display surface.
   drei)
 
-(defmethod visible and (cursor (view drei-view))
+(defmethod visible-1 and (cursor (view drei-buffer-view))
   ;; We should only redisplay when the cursor is on display, or
   ;; `offset-to-screen-position' will return a non-number.
   (<= (offset (top view))
--- /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp	2008/01/22 22:35:38	1.49
+++ /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp	2008/01/27 09:36:07	1.50
@@ -83,7 +83,7 @@
 is *guaranteed* to not return NIL or T.")
   (:method :around ((stream extended-output-stream) (view drei-view)
                     (cursor drei-cursor))
-           (when (visible cursor view)
+           (when (visible-p cursor)
              (letf (((stream-default-view stream) view))
                (call-next-method)))))
 
@@ -1003,7 +1003,7 @@
   (dolist (cursor (cursors drei))
     (apply #'erase-output-record cursor stream
            (when errorp-supplied
-             errorp))))
+             (list errorp)))))
 
 ;; XXX: Full redraw for every replay, should probably use the `region'
 ;; parameter to only invalidate some strokes.
@@ -1021,7 +1021,7 @@
   (declare (ignore x-offset y-offset region))
   (clear-output-record cursor)
   (with-output-recording-options (stream :record t :draw t)
-    (when (active cursor)
+    (when (visible-p cursor)
       (display-drei-view-cursor stream (view cursor) cursor))))
 
 (defun display-drei-area (drei)
--- /project/mcclim/cvsroot/mcclim/Drei/drei.lisp	2008/01/21 17:08:28	1.30
+++ /project/mcclim/cvsroot/mcclim/Drei/drei.lisp	2008/01/27 09:36:07	1.31
@@ -281,6 +281,11 @@
 considered the primary user-oriented cursor, most probably the
 cursor for the editor point. Note that this cursor is also in the
 cursors-list.")
+   (%cursors-visible :accessor cursors-visible
+                     :initform t
+                     :initarg :cursors-visible
+                     :documentation "If true, the cursors of this
+Drei instance will be visible. If false, they will not.")
    (%isearch-mode :initform nil :accessor isearch-mode)
    (%isearch-states :initform '() :accessor isearch-states)
    (%isearch-previous-string :initform nil :accessor isearch-previous-string)
@@ -301,6 +306,10 @@
 (defmethod (setf active) (new-val (drei drei))
   (setf (active (view drei)) new-val))
 
+(defmethod (setf cursors-visible) :after (new-val (drei drei))
+  (dolist (cursor (cursors drei))
+    (setf (enabled cursor) new-val)))
+
 (defmethod available-modes append ((modual drei))
   (available-modes (view modual)))
 
@@ -325,7 +334,7 @@
 the Drei instance."
   (setf (cursors drei) (nreverse (create-view-cursors (editor-pane drei) (view drei))))
   (dolist (cursor (cursors drei))
-    (stream-add-output-record (editor-pane drei) cursor))
+    (setf (enabled cursor) (cursors-visible drei)))
   ;; We define the point cursor to be the first point-cursor object
   ;; in the list of cursors.
   (setf (point-cursor drei)
@@ -346,7 +355,10 @@
     (add-view-cursors drei)))
 
 (defmethod (setf view) :after (new-val (drei drei))
-  ;; We have some new cursors.
+  ;; Delete the old cursors, then add the new ones, provided the
+  ;; setting of the view is successful.
+  (dolist (cursor (cursors drei))
+    (delete-output-record cursor (output-record-parent cursor) nil))
   (add-view-cursors drei))
 
 (defmethod esa-current-buffer ((drei drei))
--- /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp	2008/01/23 10:16:25	1.24
+++ /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp	2008/01/27 09:36:07	1.25
@@ -97,7 +97,8 @@
 
 (defmethod (setf cursor-visibility)
     (visibility (stream drei-input-editing-mixin))
-  (setf (active (drei-instance stream)) visibility))
+  (setf (active (drei-instance stream)) visibility
+        (cursors-visible (drei-instance stream)) visibility))
 
 (defclass drei-unselectable-presentation (presentation)
   ()




More information about the Mcclim-cvs mailing list