[mcclim-cvs] CVS update: mcclim/frames.lisp mcclim/panes.lisp

Robert Strandh rstrandh at common-lisp.net
Thu Oct 27 01:21:36 UTC 2005


Update of /project/mcclim/cvsroot/mcclim
In directory common-lisp.net:/tmp/cvs-serv6115

Modified Files:
	frames.lisp panes.lisp 
Log Message:
Implemented double buffering for CLIM stream panes that want it.
Use the `:double-buffering t' initarg to obtain it.  


Date: Thu Oct 27 03:21:34 2005
Author: rstrandh

Index: mcclim/frames.lisp
diff -u mcclim/frames.lisp:1.108 mcclim/frames.lisp:1.109
--- mcclim/frames.lisp:1.108	Thu Aug 18 05:17:21 2005
+++ mcclim/frames.lisp	Thu Oct 27 03:21:33 2005
@@ -427,6 +427,23 @@
   (declare (ignore pane force-p))
   nil)
 
+(defgeneric medium-invoke-with-possible-double-buffering (frame pane medium continuation))
+
+(defmethod medium-invoke-with-possible-double-buffering (frame pane medium continuation)
+  (funcall continuation))
+
+(defgeneric invoke-with-possible-double-buffering (frame pane continuation))
+
+(defmethod invoke-with-possible-double-buffering (frame pane continuation)
+  (declare (ignore frame pane))
+  (funcall continuation))
+
+(defmethod invoke-with-possible-double-buffering (frame (pane sheet-with-medium-mixin) continuation)
+  (medium-invoke-with-possible-double-buffering frame pane (sheet-medium pane) continuation))
+
+(defmacro with-possible-double-buffering ((frame pane) &body body)
+  `(invoke-with-possible-double-buffering ,frame ,pane (lambda () , at body)))
+
 (defmethod redisplay-frame-pane :around ((frame application-frame) pane
 					 &key force-p)
   (multiple-value-bind (redisplayp clearp)
@@ -439,9 +456,10 @@
 	(when hilited
 	  (highlight-presentation-1 (car hilited) (cdr hilited) :unhighlight)
 	  (setf (frame-hilited-presentation frame) nil)))
-      (when clearp
-	(window-clear pane))
-      (call-next-method)
+      (with-possible-double-buffering (frame pane)
+	(when clearp
+	  (window-clear pane))
+	(call-next-method))
       (unless (or (eq redisplayp :command-loop) (eq redisplayp :no-clear))
 	(setf (pane-needs-redisplay pane) nil)))))
 


Index: mcclim/panes.lisp
diff -u mcclim/panes.lisp:1.155 mcclim/panes.lisp:1.156
--- mcclim/panes.lisp:1.155	Tue Aug 30 00:39:31 2005
+++ mcclim/panes.lisp	Thu Oct 27 03:21:33 2005
@@ -27,7 +27,7 @@
 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;;; Boston, MA  02111-1307  USA.
 
-;;; $Id: panes.lisp,v 1.155 2005/08/29 22:39:31 mretzlaff Exp $
+;;; $Id: panes.lisp,v 1.156 2005/10/27 01:21:33 rstrandh Exp $
 
 (in-package :clim-internals)
 
@@ -2219,6 +2219,12 @@
   (declare (ignore force-p))
   (invoke-display-function frame pane))
 
+(defgeneric pane-double-buffering (pane))
+
+(defmethod pane-double-buffering (pane)
+  (declare (ignore pane))
+  nil)
+
 (defclass clim-stream-pane (updating-output-stream-mixin
 			    pane-display-mixin
 			    permanent-medium-sheet-output-mixin
@@ -2252,6 +2258,9 @@
    (end-of-page-action :initform :scroll
 		       :initarg :end-of-line-action
 		       :reader pane-end-of-page-action)
+   (double-buffering :initform nil
+		     :initarg :double-buffering
+		     :reader pane-double-buffering)
    ;; Slots of space-requirement-options-mixin defined with accessors for our
    ;; convenience
    (user-width :accessor pane-user-width)




More information about the Mcclim-cvs mailing list