home *** CD-ROM | disk | FTP | other *** search
- (in-package :oou)
- (oou-provide :defproc-u)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; defproc-u.Lisp
- ;;
- ;; Copyright ⌐ 1992 Northwestern University Institute for the Learning Sciences
- ;; All Rights Reserved
- ;;
- ;; author: Michael S. Engber
- ;;
- ;; Utilities for creating defininition procedure within MCL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (oou-dependencies :Records-u
- :Resources-u
- :QuickDraw-u)
-
- (export '(def-MDEF MDEF-menu MDEF-install-defproc))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (eval-when (:compile-toplevel :load-toplevel :execute)
-
- (defvar *defproc-rsrc-file* "oou:work-in-progress;defproc.rsrc")
- (defconstant JMP-instruction #x4EF9)
-
- (defrecord (fake-defproc :pointer)
- (jmpInst :word)
- (defproc-addr :pointer))
-
- (defmacro def-MDEF (MDEF-name (&rest arglist) &body body)
- `(progn
- (defpascal ,MDEF-name ,arglist ,@body)
- (install-defproc "MDEF" (symbol-name ',MDEF-name) ,MDEF-name)))
-
- )
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun install-defproc (defproc-type fake-defproc-id-or-name defproc-addr)
- (with-res-file (*defproc-rsrc-file* :if-not-open :leave-open)
- (let ((defproc_h (get-resource defproc-type fake-defproc-id-or-name :errorp nil)))
- (when (%null-ptr-p defproc_h)
- (setf defproc_h (#_NewHandle (rlength :fake-defproc)))
- (when (%null-ptr-p defproc_h)
- (error "unable to allocate a fake defproc handle."))
- (etypecase fake-defproc-id-or-name
- (string (with-pstrs ((name_p fake-defproc-id-or-name))
- (#_AddResource defproc_h defproc-type (#_UniqueID defproc-type) name_p)))
- (fixnum (with-pstrs ((name_p "fake defproc"))
- (#_AddResource defproc_h defproc-type fake-defproc-id-or-name name_p)))))
- (with-dereferenced-handles ((defproc_p defproc_h))
- (pset defproc_p :fake-defproc.jmpInst JMP-instruction)
- (pset defproc_p :fake-defproc.defproc-addr defproc-addr))
- defproc_h)))
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; currently, the MCL menu class doesn't readily lend itself to using
- ;; custom MDEFs, so MDEF-menu is provided.
-
- (defclass MDEF-menu (menu)
- ((MDEF-defpascal-sym :initarg :MDEF-defpascal-sym
- :accessor MDEF-defpascal-sym))
- )
-
- (defmethod menu-install ((m MDEF-menu))
- (let ((*menubar-frozen* t))
- (call-next-method)
- (MDEF-install-defproc m))
- (draw-menubar-if)
- t)
-
- (defmethod MDEF-install-defproc ((m MDEF-menu))
- (with-macptrs ((defproc-addr (symbol-value (MDEF-defpascal-sym m)))
- (defproc_h (install-defproc "MDEF" (symbol-name (MDEF-defpascal-sym m)) defproc-addr))
- (menu_h (menu-handle m)))
- (hset menu_h :MenuInfo.menuProc defproc_h)
- (when (menu-installed-p m)
- (#_CalcMenuSize menu_h))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- #|
-
-
- (defclass card-stack-menu (MDEF-menu)
- ((card-size :initarg :card-size
- :accessor card-size)
- (max-vis :initarg :max-vis
- :accessor max-vis)
- (dh :initarg :dh
- :accessor dh)
- (dv :initarg :dv
- :accessor dv)
- (l-region :accessor l-region)
- (tc-topLeft :accessor tc-topLeft)
-
- )
- (:default-initargs
- :MDEF-defpascal-sym 'card-stack-MDEF
- :card-size #@(200 100)
- :max-vis nil
- :dh -20
- :dv -20
- )
- )
-
-
- (defmethod menu-install :after ((m MDEF-menu))
- (setf (l-region m) (#_NewRgn))
- (card-stack-init m))
-
- (defmethod menu-deinstall :after ((m MDEF-menu))
- (#_DisposeRgn (l-region m))
- (slot-makunbound m 'l-region))
-
- (defmethod vis-count ((m MDEF-menu))
- (min (or (max-vis m) most-positive-fixnum) (length (menu-items m))))
-
- (defmethod card-stack-init ((m MDEF-menu))
- (card-stack-init-l-region m)
- (card-stack-init-tc-topLeft m))
-
- (defmethod card-stack-init-tc-topLeft ((m MDEF-menu))
- (setf (tc-topLeft m)
- (with-macptrs ((menu_h (menu-handle m)))
- (if (plusp (dv m))
- (if (plusp (dh m))
- #@(0 0)
- (make-point (- (href menu_h :MenuInfo.menuWidth) (point-h (card-size m)))
- 0))
- (if (plusp (dh m))
- (make-point 0
- (- (href menu_h :MenuInfo.menuHeight) (point-v (card-size m))))
- (make-point (- (href menu_h :MenuInfo.menuWidth) (point-h (card-size m)))
- (- (href menu_h :MenuInfo.menuHeight) (point-v (card-size m))))
- )))))
-
- (defmethod card-stack-init-l-region ((m MDEF-menu))
- (rlet ((r :Rect
- :topLeft #@(0 0)
- :botRight (card-size m)))
- (with-macptrs ((rgn-a (l-region m))
- (rgn-b (#_NewRgn)))
- (#_RectRgn rgn-a r)
- (#_OffsetRect r (+ (dh m) (signum (dh m))) (+ (dv m) (signum (dv m))))
- (#_RectRgn rgn-b r)
- (#_DiffRgn rgn-b rgn-a rgn-a)
- (#_DisposeRgn rgn-b))))
-
- (defmethod card-stack-card-offset ((m MDEF-menu) item-num)
- (add-points (tc-topLeft m)
- (make-point (* (1- item-num) (dh m)) (* (1- item-num) (dv m)))))
-
- (defmethod card-stack-invert-item ((m MDEF-menu) menuRect item-num)
- (let ((first-card-num 1))
- (if (= item-num first-card-num)
- (let ((topLeft (add-points (pref menuRect :Rect.topLeft) (tc-topLeft m))))
- (rlet ((r :Rect
- :topLeft topLeft
- :botRight (add-points topLeft (card-size m))))
- (#_InvertRect r)))
- (let ((topLeft (add-points (pref menuRect :Rect.topLeft) (card-stack-card-offset m item-num))))
- (with-macptrs ((l-rgn (l-region m)))
- (move-region-to l-rgn topLeft)
- (#_InvertRgn l-rgn))))))
-
- (defmethod card-stack-find-item ((m MDEF-menu) menuRect pt)
- (let ((first-card-num 1))
- (let ((topLeft (add-points (pref menuRect :Rect.topLeft) (tc-topLeft m))))
- (rlet ((r :Rect
- :topLeft topLeft
- :botRight (add-points topLeft (card-size m))))
- (dotimes (i (vis-count m) 0)
- (when (#_PtInRect pt r) (return (+ first-card-num i)))
- (#_OffsetRect r (dh m) (dv m)))))))
-
- (defmethod card-stack-mSizeMsg ((m card-stack-menu))
- (with-macptrs ((menu_h (menu-handle m)))
- (let ((n (1- (length (menu-items m)))))
- (hset menu_h :MenuInfo.menuWidth (+ (* (abs (dh m)) n) (point-h (card-size m))))
- (hset menu_h :MenuInfo.menuHeight (+ (* (abs (dv m)) n) (point-v (card-size m)))))))
-
- (defmethod card-stack-mChooseMsg ((m card-stack-menu) menuRect hit-point last-item-num)
- (let ((in-item-num (card-stack-find-item m menuRect hit-point)))
-
- (unless (= last-item-num in-item-num)
- (when (plusp last-item-num)
- (card-stack-invert-item m menuRect last-item-num))
- (when (plusp in-item-num)
- (card-stack-invert-item m menuRect in-item-num)))
- in-item-num))
-
-
- (defmethod card-stack-mDrawMsg ((m card-stack-menu) menuRect)
-
- #|
- ;This restores the area under the menu by calling the MBDF with the Restore message
- ;But, it also crashes the system after you release the mouse.
- ;I think because the restore causes the MBDF to release some memory (the stored bits)
- ;and when the the mouse is released, the restore message is sent a second time, but
- ;the memory it uses has already been released - BOOM.
- (with-macptrs ((MDEF_h (get-resource "MBDF" 0)))
- (with-dereferenced-handles ((MDEF_p MDEF_h))
- (ff-call MDEF_p :word 0 :word 8 :word 0 :long 0 :long)))
- |#
-
- (let ((first-card-num 1))
- (let ((topLeft (add-points (pref menuRect :Rect.topLeft) (tc-topLeft m))))
- (rlet ((r :Rect
- :topLeft topLeft
- :botRight (add-points topLeft (card-size m))))
-
- ;draw front card
- (with-clip-rect r
- (with-pstrs ((i-title_p (menu-item-title (elt (menu-items m) (1- first-card-num)))))
- (#_TextBox (%inc-ptr i-title_p) (%get-byte i-title_p) r #$teJustCenter))
- (#_FrameRect r))
-
- ;draw rest
- (#_OffsetRect r (dh m) (dv m))
- (with-macptrs ((l-rgn (l-region m)))
- (move-region-to l-rgn (pref r :Rect.topLeft))
- (let ((item-list (rest (menu-items m))))
- (dotimes (i (1- (vis-count m)))
- (with-clip-rgn l-rgn
- (with-pstrs ((i-title_p (menu-item-title (first item-list))))
- (#_TextBox (%inc-ptr i-title_p) (%get-byte i-title_p) r #$teJustCenter))
- (#_FrameRgn l-rgn))
- (#_OffsetRect r (dh m) (dv m))
- (#_OffsetRgn l-rgn (dh m) (dv m))
- (pop item-list))))))))
-
-
- (def-MDEF card-stack-MDEF (:word message :ptr theMenu :ptr menuRect :long hitPt :ptr whichItem)
- (let ((m (find-menu (pref theMenu :MenuInfo.menuData))))
- (ecase message
- (#.#$mDrawMsg
- (card-stack-mDrawMsg m menuRect))
- (#.#$mChooseMsg
- (%put-word whichItem (card-stack-mChooseMsg m menuRect hitPt (%get-word whichItem))))
- (#.#$mSizeMsg
- (card-stack-mSizeMsg m)))))
-
- ;(MDEF-install-defproc *funky-menu*)
-
- (defparameter *funky-menu*
- (make-instance 'card-stack-menu
- :menu-title "funky menu"
- :MDEF-defpascal-sym 'card-stack-MDEF
- :menu-items (list
- (make-instance 'menu-item
- :menu-item-title "item 1")
- (make-instance 'menu-item
- :menu-item-title "item 2")
- (make-instance 'menu-item
- :menu-item-title "item 3"))))
-
- ;(menu-install *funky-menu*)
- ;(menu-deinstall *funky-menu*)
- ;(menu-deinstall (find-menu "funky menu"))
-
-
-
- ;MBarHook
- ;(%get-ptr (%int-to-ptr #xA2c))
-
- ;SavedHandle
- ;(%get-ptr (%int-to-ptr #xA28))
-
-
-
- |#