[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

pen-pattern for CWindowRecord



I have a macro called with-pen-pattern which temporarily sets a new
pattern.  It works fine for WindowRecords but not for CWindowRecords.
That's because the function pen-pattern assumes a WindowRecord.  I
tried to modify the definition to work with CWindowRecords, without
much luck. It looks to me like the pattern for CWindowRecords of type
0 (old-style patterns) should be stored in the :pixpat.pat1data field.
However, the contents of this field appear to be random. What's wrong?

(defmacro with-pen-pattern (view pattern &body body)
  `(let* ((port (wptr ,view))
          (old-pattern (pen-pattern ,view)))
     (with-port port
       (#_PenPat ,pattern)
       (unwind-protect (progn ,@body)
     	 (#_PenPat old-pattern)
         ))))

(defmethod pen-pattern ((view simple-view) &optional
                        (save-pat (make-record (:pattern :storage :pointer))))     
  (let ((wptr (wptr view)))
    (copy-record
     (if (window-color-p (view-window view))
       ;; why doesnt this work correctly for color windows?
       (let ((pixpat (rref wptr cwindowrecord.port.pnpixpat)))
         (if (zerop (href pixpat :pixpat.pattype))
           (pref pixpat :pixpat.pat1data)
           (error "Can't get pen pattern for this window")))
       (pref wptr windowRecord.pnPat))
     (:pattern :storage :pointer)
     save-pat
     )))