updating-output issues

Paul Werkowski pw at snoopy.qozzy.com
Tue Feb 1 14:33:33 UTC 2022


For the recursion problem:

I add the following to the example code (complete example attached)

(defmethod resize-sheet :after ((sheet example-pane) w h)
(declare (ignore w h))
;;(clear-window)
(redisplay-frame-pane (pane-frame sheet) sheet))

I use this when I want to display to expand/shrink via pointer motion.

Here, just running (testme) results in blowing stack. LispWorks CLIM 
works fine.

Paul

-------------- next part --------------
(defpackage utest (:use :clim :clim-lisp))
(in-package :utest)

(defclass unit ()())
(define-presentation-type unit ())

(defclass test-unit (unit)
  ((x-value :initarg :x :accessor x-of)
   (y-value :initarg :y :accessor y-of)
   (color   :initarg :color
            :accessor color-of)
   (size :initform 10))
  (:default-initargs
   :x 10 :y 10 :color +green+))

(defmethod print-object ((obj test-unit) stream)
  (print-unreadable-object (obj stream :type t)
    (format stream "<~d ~d>"
            (x-of obj)(y-of obj))))

(defclass example-pane (application-pane)
  ((units :initform nil
          :initarg :units
          :accessor units-of)
   (dx :initform 10)
   (dy :initform 10))
  (:default-initargs
   :width  300
   :height 300
   :incremental-redisplay t
   :display-function 'example-pane-displayer))

(defmethod draw-unit ((pane example-pane)(unit test-unit))
  (with-slots ((x x-value) (y y-value) size color) unit
    (format *trace-output* "~&draw-unit ~a~%" unit)
    (updating-output (pane :unique-id unit
                           :cache-value (list* x y size color)
                           :cache-test #'equalp)
      (with-output-as-presentation (pane unit 'unit)
        (format *trace-output* "~&--draw-circle~%")
        (draw-circle* pane x y size :ink (color-of unit))))))

#+notyet
(define-presentation-method highlight-presentation
  ((type unit) record stream state)
  (with-bounding-rectangle* (x0 y0 xz yz) record
    (declare (ignorable xz yz))
    (let ((ink (if (eql state :highlight) +flipping-ink+ +background-ink+)))
      (draw-rectangle* stream (1- x0)(1- y0) xz yz
                       :ink ink :filled nil))))

(defmethod example-pane-displayer (frame (pane example-pane))
  (declare (ignore frame))
  (with-bounding-rectangle* (x1 y1 x2 y2) pane
    (updating-output (pane :cache-value (list* x1 y1 x2 y2)
                           :cache-test #'equalp)
      (draw-rectangle* pane x1 y1 (1- x2)(1- y2) :ink +blue+ :filled nil))
    (with-first-quadrant-coordinates (pane x1 y2)
      (dolist (unit (units-of pane))
        (draw-unit pane unit))
      )))

(define-application-frame utest ()
  ((x-dim :initform 'x :initarg :x-dim)
   (y-dim :initform 'y :initarg :y-dim))
  (:menu-bar t)
  #-mcclim(:command-table t)
  #+mcclim(:command-table (utest))
  (:panes
   (p1
    (make-pane 'example-pane
               :units (list (make-instance
                             'test-unit :x 150 :y 150
                             :color +green+)
                            (make-instance
                             'test-unit :x 250 :y 50
                             :color +blue+))
               :width 300 :height 300
               :max-width +fill+
               :max-height +fill+
               )))
  (:layouts 
   (default  p1)))

(define-utest-command (com-move-unit)((which '(member :x :y))
                                      (unit 'test-unit)
                                      (pane 'example-pane)
                                      (direction '(member :up :down
                                                          :left :rignt)))
  (declare (ignorable pane))
  (with-slots (x-value y-value) unit
    (let ((incr 5.0))
      (case which
        (:x (incf x-value (case direction (:left (- incr))(:right incr))))
        (:y (incf y-value (case direction (:up incr)(:down (- incr))))))
      )))

(define-presentation-to-command-translator xlate-move-unit-l
    (blank-area com-move-unit utest
                  :pointer-documentation "Move Left"
                  :gesture :select)
    ;; object is blank-area
    (object window x y)
  (declare (ignore object x y)) (terpri *trace-output*)
  (let* ((units (units-of window))
         (unit (first units)))
    `(:x ,unit ,window :left)))

(define-presentation-to-command-translator xlate-move-unit-r
    (blank-area com-move-unit utest
                  :pointer-documentation "Move Right"
                  :gesture :menu)
    ;; object is blank-area
    (object window x y)
  (declare (ignore object x y))
  (let* ((units (units-of window))
         (unit (first units)))
    `(:x ,unit ,window :right)))

(defmethod resize-sheet :after ((sheet example-pane) w h)
  (declare (ignore w h))
  ;(window-clear sheet)
  (redisplay-frame-pane (pane-frame sheet) sheet))

(defun testme ()
  (run-frame-top-level
   (make-application-frame 'utest
     :left 950 :top 40)))


More information about the mcclim-devel mailing list