home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / swat / scheme / uitk.scm < prev    next >
Text File  |  1995-08-02  |  20KB  |  566 lines

  1. ;;;;; -*- scheme -*-
  2. ;;;;;
  3. ;;;;; derived from uitk.sc,v 1.2 1993/02/25 14:13:22 jmiller exp $
  4. ;;;;; $id: uitk.scm,v 1.11 1993/02/26 15:10:23 jmiller exp jmiller $
  5.  
  6. (define debugging-port #f)
  7.  
  8. (define (debug-print . args)
  9.   (let ((port (or debugging-port (current-output-port)))
  10.     (string (with-output-to-string
  11.           (lambda ()
  12.             (display (cons 'debugging (cons (current-thread) args)))))))
  13.     (without-interrupts
  14.      (lambda () (display string port) (newline port)))))
  15.  
  16. ;;;; notes
  17.  
  18. ;;;; message flows define relationships.  normally, an operation that
  19. ;;;; changes state on an object will use one of these relationships to
  20. ;;;; alert other objects of the change.  this permits an external
  21. ;;;; constraint satisfaction system to propagate changes through the
  22. ;;;; system.  here are the flows currently
  23. ;;;; assumed:
  24. ;;;;     (1) geometry.  all object can report a desired size which
  25. ;;;;         includes stretch, shrink, and minimum size.  this is a
  26. ;;;;         pure query and does not establish a relationship.  the
  27. ;;;;         relationship commences with a call to either
  28. ;;;;         assign-screen-area! or assign-geometry!.  these
  29. ;;;;         specify an area to be used and alert any object
  30. ;;;;         monitoring for geometry changes.
  31. ;;;;     (2) events.  an object may have children to whom it reports
  32. ;;;;         events.  event directors take an event and a list of
  33. ;;;;         children and propagate the event to the correct child
  34. ;;;;         or take a default action.  this is a one-way interaction
  35. ;;;;         (i.e. children don't know about parents).
  36. ;;;;     (3) contexts.
  37.  
  38. ;;;; i'd like to use tiny clos as a means for handling the private
  39. ;;;; slot in UIObj.  this allows the common operations to be as fast
  40. ;;;; as possible (i.e. not using generic dispatch) while still
  41. ;;;; permitting extensibility.  for the moment, however, i'm using
  42. ;;;; simple structures and type-specific operations.
  43.  
  44. ;;;; when assign-screen-area! is called with #f instead of a screen
  45. ;;;; area it means that it has had its area retracted.  this happens
  46. ;;;; when the geometric parent is told to remove it as a child.  if it
  47. ;;;; has been using the parent's window, it better clean up -- this
  48. ;;;; may mean reparenting its own window to the root, i guess.
  49.  
  50. (define (sub-vectors point-1 point-2)
  51.   (make-point
  52.    (- (point.x point-1) (point.x point-2))
  53.    (- (point.y point-1) (point.y point-2))))
  54.  
  55. (define (add-vectors point-1 point-2)
  56.   (make-point
  57.    (+ (point.x point-1) (point.x point-2))
  58.    (+ (point.y point-1) (point.y point-2))))
  59.  
  60. (define (point= point1 point2)
  61.   (or (eq? point1 point2)
  62.       (and
  63.        (= (point.x point1) (point.x point2))
  64.        (= (point.y point1) (point.y point2)))))
  65.  
  66. (define (size= size1 size2)
  67.   (or (eq? size1 size2)
  68.       (and
  69.        (= (size.width size1) (size.width size2))
  70.        (= (size.height size1) (size.height size2)))))
  71.  
  72. (define (copy-rectangle rect)
  73.   (vector-copy rect))
  74.  
  75. (define (UITKRectangle.Width rect)
  76.   (size.width (UITKRectangle.Size rect)))
  77.  
  78. (define (UITKRectangle.Height rect)
  79.   (size.height (UITKRectangle.Size rect)))
  80.  
  81. (define (rectangle= rect1 rect2)
  82.   (or (eq? rect1 rect2)
  83.       (and (point= (UITKRectangle.offset rect1) (UITKRectangle.offset rect2))
  84.        (size= (UITKRectangle.Size rect1) (UITKRectangle.Size rect2)))))
  85.  
  86. (define (screen-area= sa1 sa2)
  87.   (or (and sa1 sa2 (rectangle= sa1 sa2))
  88.       (and (not sa1) (not sa2))))
  89.  
  90. (define (translate-rectangle rect point)
  91.   (and rect
  92.        (make-UITKRectangle point (UITKRectangle.Size rect))))
  93.  
  94.  
  95. ;;;; event objects
  96.  
  97. (define (make-point-event type os-event window offset)
  98.   (make-event 'point type os-event window offset 'invalid 'invalid))
  99.  
  100. (define (make-rectangle-event type os-event window offset width height)
  101.   (make-event 'rectangle type os-event window offset width height))
  102.  
  103. (define (make-unknown-event type os-event window)
  104.   (make-event 'unknown type os-event window 'invalid 'invalid 'invalid))
  105.  
  106. (define (point-event? obj)
  107.   (and (event? obj)
  108.        (eq? (event.point-or-rectangle? obj) 'point)))
  109.  
  110. (define (rectangle-event? obj)
  111.   (and (event? obj)
  112.        (eq? (event.point-or-rectangle? obj) 'rectangle)))
  113.  
  114.  
  115. ;;;; General support procedures
  116.  
  117. (define (make-lookup key-fn)
  118.   (lambda (object list)
  119.     (let loop ((list list))
  120.       (cond ((null? list) #F)
  121.         ((eq? object (key-fn (car list))) (car list))
  122.         (else (loop (cdr list)))))))
  123.  
  124. (define (make-del-op! test?)
  125.   (lambda (op)
  126.     (lambda (key op-list)
  127.       (define (loop previous current)
  128.     (cond ((null? current) op-list)
  129.           ((test? (op (car current)) key)
  130.            (set-cdr! previous (cdr current))
  131.            op-list)
  132.           (else (loop current (cdr current)))))
  133.       (cond ((null? op-list) '())
  134.         ((test? (op (car op-list)) key)
  135.          (cdr op-list))
  136.         (else (loop op-list (cdr op-list)))))))
  137.  
  138. (define del-op! (make-del-op! eq?))
  139.  
  140. (define del-assq! (del-op! car))
  141. (define del-assv! ((make-del-op! eqv?) car))
  142.  
  143. (define (make-weak-lookup key-fn)
  144.   (lambda (object list)
  145.     (let loop ((list list))
  146.       (cond ((null? list) #F)
  147.         ((eq? object (key-fn (weak-car list))) (weak-car list))
  148.         (else (loop (weak-cdr list)))))))
  149.  
  150. (define (make-weak-del-op! test?)
  151.   (lambda (op)
  152.     (lambda (key op-list)
  153.       (define (loop previous current)
  154.     (cond ((null? current) op-list)
  155.           ((test? (op (weak-car current)) key)
  156.            (weak-set-cdr! previous (weak-cdr current))
  157.            op-list)
  158.           (else (loop current (weak-cdr current)))))
  159.       (cond ((null? op-list) '())
  160.         ((test? (op (weak-car op-list)) key)
  161.          (weak-cdr op-list))
  162.         (else (loop op-list (weak-cdr op-list)))))))
  163.  
  164. ;;;; UI Objects
  165.  
  166. (define (one-parent-only! child object)
  167.   (let ((child-guts (uiobjinternals child)))
  168.     (if (UIObjInternals.already-have-a-parent? child-guts)
  169.     (error
  170.      "ADD-CHILD!: Hal says 'success has many parents, but a UIObj has only one'"
  171.      object child)
  172.     (set-UIObjInternals.already-have-a-parent?! child-guts #T))))
  173.  
  174. (define (get-UITKWindow obj)
  175.   (let ((surface (drawing-surface obj)))
  176.     (and (DrawingSurface? surface)
  177.      (DrawingSurface.UITKWindow surface))))
  178.  
  179. (define (DrawingSurface.Application ds)
  180.   (ToolKitWindow.Application (DrawingSurface.ToolKitWindow ds)))
  181.  
  182.  
  183. ;;; The alerts are stored as alists with the key being, typically, the
  184. ;;; reason the alert was added.  This allows the alert to be removed
  185. ;;; if/when the reason is retracted.  The alert function is called
  186. ;;; with the reason as its argument.
  187.  
  188. (define make-add-alert!
  189.   (let ((find-alert (make-lookup alert.reason)))
  190.     (lambda (accessor mutator!)
  191.       (lambda (object key alert-fn)
  192.     (let* ((previous (accessor object))
  193.            (old-value (find-alert key previous)))
  194.       (if old-value
  195.           (begin
  196.         ;;(set-alert.function! old-value alert)
  197.         ;; (bkpt "gottcha in make-add-alert!")
  198.         (debug-print 'gottcha!))
  199.           (mutator! object `(,(make-alert key alert-fn) ,@previous)))
  200.       'added)))))
  201.  
  202. (define make-remove-alert!
  203.   (let ((del-alert! (del-op! alert.reason)))
  204.     (lambda (accessor mutator!)
  205.       (lambda (object key)
  206.     (mutator! object (del-alert! key (accessor object)))
  207.     'removed))))
  208.  
  209. (define (make-alert! arity accessor)
  210.   ;; Arity is the arity expected of the alert function.  Some alerts
  211.   ;; pass additional information -- geometry, for example, passes both
  212.   ;; the previous screen-area and the new screen-area.  The alert
  213.   ;; function can generally be assumed to have lexical access to both
  214.   ;; the reason for the alert (specified when the alert is created)
  215.   ;; and the object that generated the alert.
  216.   (case arity
  217.     ((0) (lambda (object)
  218.        (for-each (lambda (alert) ((alert.function alert)))
  219.              (accessor object))))
  220.     ((1) (lambda (object arg)
  221.        (for-each (lambda (alert) ((alert.function alert) arg))
  222.              (accessor object))))
  223.     ((2) (lambda (object arg1 arg2)
  224.        (for-each (lambda (alert) ((alert.function alert) arg1 arg2))
  225.              (accessor object))))
  226.     (else (lambda (object . args)
  227.          (for-each (lambda (alert) (apply (alert.function alert) args))
  228.                (accessor object))))))
  229.  
  230. ;;; Geometry alerts:
  231. ;;;  Initiated when ASSIGN-SCREEN-AREA! is acted on by an object, by
  232. ;;;  calling
  233. ;;;    (GEOMETRY-CHANGE! object
  234. ;;;                      old-used-screen-area new-used-screen-area)
  235. ;;;  An alert is added by calling
  236. ;;;    (ON-GEOMETRY-CHANGE! object reason 
  237. ;;;       (lambda (old new) ...))
  238. ;;;  The new-used-screen-area may be #T indicating that an object is
  239. ;;;  requesting a new area, or it may be #F or an actual area
  240. ;;;  indicating that it has been given (via ASSIGN-SCREEN-AREA!) a
  241. ;;;  specific area to use.
  242. (define on-geometry-change!
  243.   (make-add-alert! %geometry-alerts set-%geometry-alerts!))
  244. (define forget-geometry-change!
  245.   (make-remove-alert! %geometry-alerts set-%geometry-alerts!))
  246. (define geometry-change! (make-alert! 2 %geometry-alerts))
  247.  
  248. ;;; Event alerts:
  249. ;;;  Initiated when HANDLE-EVENT is acted on by an object, by calling
  250. ;;;    (EVENT! object event)
  251. ;;;  An alert is added by calling
  252. ;;;    (ON-EVENT! object reason 
  253. ;;;      (lambda (event) ...))
  254. (define on-event!
  255.   (make-add-alert! %event-alerts set-%event-alerts!))
  256. (define forget-event!
  257.   (make-remove-alert! %event-alerts set-%event-alerts!))
  258. (define event! (make-alert! 1 %event-alerts))
  259.  
  260. ;;; Context alerts:
  261. ;;;  Initiated when SET-CONTEXT! is acted on by an object, by calling
  262. ;;;    (CONTEXT-CHANGE! object new-context)
  263. ;;;  An alert is added by calling
  264. ;;;    (ON-CONTEXT-CHANGE! object reason 
  265. ;;;       (lambda (new-context) ...))
  266. ;;; NOTE: This protocol is not well worked out.
  267. (define on-context-change!
  268.   (make-add-alert! %context-alerts set-%context-alerts!))
  269. (define forget-context-change!
  270.   (make-remove-alert! %context-alerts set-%context-alerts!))
  271. (define context-change! (make-alert! 1 %context-alerts))
  272.  
  273. ;;; Death alerts:
  274. ;;;  Initiated when an object has decided it is dead by calling
  275. ;;;    (DEATH! object)
  276. ;;;  An alert is added by calling
  277. ;;;    (ON-DEATH! object reason (lambda () ...))
  278. (define on-death!
  279.   (make-add-alert! %death-alerts set-%death-alerts!))
  280. (define forget-death-notification!
  281.   (make-remove-alert! %death-alerts set-%death-alerts!))
  282. (define death! (make-alert! 0 %death-alerts))
  283.  
  284. (define (forget! reporter reason)
  285.   (forget-geometry-change! reporter reason)
  286.   (forget-event! reporter reason)
  287.   (forget-death-notification! reporter reason)
  288.   (forget-context-change! reporter reason))
  289.  
  290. ;;;; Queues for communication between interrupt level and user level
  291.  
  292. (define (empty-queue? queue)
  293.   (without-interrupts
  294.    (lambda ()
  295.      (not (queue.%head queue)))))
  296.  
  297. (define (enqueue! queue value)
  298.   (let ((element (list value)))
  299.     (without-interrupts
  300.      (lambda ()
  301.        (if (queue.%head queue)
  302.        (set-cdr! (queue.%tail queue) element)
  303.        (set-queue.%head! queue element))
  304.        (set-queue.%tail! queue element)))))
  305.  
  306. (define (dequeue! queue)
  307.   ;; Not safe to use if the queue is empty!
  308.   (without-interrupts
  309.    (lambda ()
  310.      (let* ((head (queue.%head queue))
  311.         (next (cdr head)))
  312.        (if (null? next)
  313.        (begin
  314.          (set-queue.%head! queue #F)
  315.          (set-queue.%tail! queue #F))
  316.        (set-queue.%head! queue next))
  317.        (car head)))))
  318.  
  319. (define (read-and-empty-queue! queue)
  320.   ;; Returns a list of items, and leaves the queue empty
  321.   (let ((quick-result
  322.      (without-interrupts
  323.       (lambda ()
  324.         (let ((result (queue.%head queue)))
  325.           (set-queue.%head! queue #F)
  326.           (set-queue.%tail! queue #F)
  327.           result)))))
  328.     (or quick-result '())))
  329.  
  330.  
  331. (define (update-locked-list! locked-list receiver)
  332.   ;; Receiver gets the contents and returns a replacement
  333.   (our-with-thread-mutex-locked
  334.    'update-locked-list!
  335.    (locked-list.%mutex locked-list)
  336.     (lambda ()
  337.       (set-locked-list.%data!
  338.        locked-list
  339.        (receiver (locked-list.%data locked-list)))
  340.       ))
  341.   'DONE)
  342.  
  343. (define (with-locked-list locked-list receiver)
  344.   ;; Receiver gets the contents
  345.   (our-with-thread-mutex-locked
  346.    'with-locked-list
  347.    (locked-list.%mutex locked-list)
  348.     (lambda ()
  349.       (receiver (locked-list.%data locked-list))
  350.       )))
  351.  
  352. (define (our-with-thread-mutex-locked reason mutex thunk)
  353.   reason
  354.   (with-thread-mutex-locked mutex thunk))
  355.  
  356.  
  357. ;;; The default for these is just to do information propagation
  358. ;;; through the alert mechanism.
  359.  
  360. (define (UIObj-set-context! UIObj Context)
  361.   (if (vector? Context)
  362.       (context-change! UIObj Context)
  363.       (error "UIOBJ-SET-CONTEXT!: Bad context" Context)))
  364.  
  365. (define (UIObj-assign-screen-area! UIObj Screen-Area)
  366.   (if (or (UITKRectangle? Screen-Area)
  367.       (eq? #F Screen-Area))
  368.       (begin
  369.     (set-assigned-screen-area! UIObj Screen-Area)
  370.     (let ((old (used-screen-area UIObj)))
  371.       (set-used-screen-area! UIObj screen-area)
  372.       (geometry-change! UIObj old screen-area))
  373.     screen-area)
  374.       (error "UIOBJ-ASSIGN-SCREEN-AREA!: Bad screen area" Screen-Area)))
  375.  
  376. (define (assign-location! object point)
  377.   ;; There may be a better way to do this by making it part of the
  378.   ;; geometry protocol.
  379.   (assign-screen-area! object
  380.     (translate-rectangle (used-screen-area object) point)))
  381.  
  382. (define (UIObj-assign-drawing-surface! UIObj Surface)
  383.   (check-drawing-surface! UIObj Surface)
  384.   (geometry-change! UIObj #F #F)
  385.   'OK)
  386.  
  387. (define (check-drawing-surface! UIObj Surface)
  388.   ;; Surface should be one of 'UNASSIGNED, 'RETRACTED, or a
  389.   ;; DrawingSurface
  390.   ;; This is used by internal routines that want to do the default
  391.   ;; operation (UIObj-assign-drawing-surface!) but don't want to
  392.   ;; announce the geometry change yet.
  393.   (let ((old (Drawing-Surface UIObj)))
  394.     (cond ((eq? old Surface) 'UNCHANGED)
  395.       ((or (eq? Surface 'RETRACTED)
  396.            (eq? old 'UNASSIGNED))
  397.        (set-drawing-surface! UIObj  Surface)
  398.        'CHANGED)
  399.       (else
  400.        (error "UIOBJ-ASSIGN-DRAWING-SURFACE!: Can't change surface"
  401.           UIObj old surface)))))
  402.  
  403. (define (assign-geometry! UIObj Surface Rectangle)
  404.   (assign-drawing-surface! UIObj surface)
  405.   (assign-screen-area! UIObj rectangle))
  406.  
  407. (define (point-in-rectangle? point rect-offset width height)
  408.   (let ((rect-x (Point.X rect-offset))
  409.     (rect-y (Point.Y rect-offset))
  410.     (x (Point.X point))
  411.     (y (Point.Y point)))
  412.     (and (<= rect-x X)
  413.      (< X (+ rect-x Width))
  414.      (<= rect-Y Y)
  415.      (< Y (+ rect-Y Height)))))
  416.  
  417. (define (rectangle-overlaps-rectangle? p w h p2 w2 h2)
  418.   (define (rectangles-overlap? LowEdge LowDelta HighEdge)
  419.     (<= HighEdge (+ LowEdge LowDelta)))
  420.   (let ((x (Point.X p))
  421.     (y (Point.Y p))
  422.     (x2 (Point.X p2))
  423.     (y2 (Point.Y p2)))
  424.     (and (if (< X X2)
  425.          (rectangles-overlap? X W X2)
  426.          (rectangles-overlap? X2 W2 X))
  427.      (if (< Y Y2)
  428.          (rectangles-overlap? Y H Y2)
  429.          (Rectangles-Overlap? Y2 H2 Y)))))
  430.  
  431. (define (uiobj-point-within? UIObj Point)
  432.   (if (vector? Point)
  433.       (let ((screen-area (Used-Screen-Area UIObj)))
  434.     (and screen-area
  435.          (let ((Offset (UITKRectangle.Offset screen-area))
  436.            (Height (UITKRectangle.Height screen-area))
  437.            (Width (UITKRectangle.Width screen-area)))
  438.            (point-in-rectangle? Point Offset Width Height))))
  439.       (error "UIOBJ-POINT-WITHIN?: Bad point" point)))
  440.  
  441. (define (UIObj-rectangle-overlaps? UIObj P1 W1 H1)
  442.   (if (not (vector? P1))
  443.       (error "UIOBJ-RECTANGLE-OVERLAPS?: Bad point" P1))
  444.   (if (not (number? W1))
  445.       (error "UIOBJ-RECTANGLE-OVERLAPS?: Bad width" W1))
  446.   (if (not (number? H1))
  447.       (error "UIOBJ-RECTANGLE-OVERLAPS?: Bad height" H1))
  448.   (let ((screen-area (Used-Screen-Area UIObj)))
  449.     (and
  450.      screen-area
  451.      (let ((P2 (UITKRectangle.Offset screen-area))
  452.        (H2 (UITKRectangle.Height screen-area))
  453.        (W2 (UITKRectangle.Width screen-area)))
  454.        (rectangle-overlaps-rectangle? p1 w1 h1 p2 w2 h2)))))
  455.  
  456.  
  457. (define (event-within? UIObj Event)
  458.   (cond ((point-event? event)
  459.      (point-event-within? UIObj event))
  460.     ((rectangle-event? event)
  461.      (rectangle-event-within? UIObj event))
  462.     (else (error "EVENT-WITHIN?: Bad event" event))))
  463.  
  464. (define (point-event-within? UIObj Event)
  465.   (let ((window (Get-UITKWindow UIObj)))
  466.     (and window
  467.      (= (->XWindow (UITKWindow.xwindow window))
  468.         (Event.Window Event))
  469.      (point-within? UIObj (event.Offset event)))))
  470.  
  471. (define (rectangle-event-within? UIObj Event)
  472.   (let ((window (Get-UITKWindow UIObj)))
  473.     (and window
  474.      (= (->XWindow (UITKWindow.xwindow window))
  475.         (Event.Window Event))
  476.      (Rectangle-Overlaps? UIObj
  477.                   (event.Offset event)
  478.                   (event.Width event)
  479.                   (event.Height event)))))
  480.  
  481. (define (UIObj-handle-event UIObj Event)
  482.   (if (event? event)
  483.       (if (event-within? UIObj event)
  484.       (event! UIObj event))
  485.       (error "UIOBJ-HANDLE-EVENT: Bad event" event)))
  486.  
  487. (define (UIObj-get-desired-size object)
  488.   (define (->size datum)
  489.     (or datum (make-size 0 0)))
  490.   (->size (%desired-size object)))
  491.  
  492.  
  493. ;;; Default assigned-screen-area and used-screen-area (accessors and
  494. ;;; mutators) simply look in or modify the appropriate slots in the
  495. ;;; structure.  
  496. (define (UIObj-assigned-screen-area UIObj)
  497.   (UIObjInternals.assigned-screen-area (UIObjInternals UIObj)))
  498.  
  499. (define (UIObj-set-assigned-screen-area! UIObj Screen-area)
  500.   (set-UIObjInternals.assigned-screen-area! (UIObjInternals UIObj)
  501.                         Screen-Area))
  502.  
  503. (define (UIObj-used-screen-area UIObj)
  504.   (UIObjInternals.used-screen-area (UIObjInternals UIObj)))
  505.  
  506. (define (UIObj-set-used-screen-area! UIObj Screen-Area)
  507.   (set-UIObjInternals.used-screen-area! (UIObjInternals UIObj)
  508.                     Screen-Area))
  509.  
  510. (define (UIObj-protect-from-gc! UIObj stuff)
  511.   (let ((crud (crud-that-I-dont-want-to-gc-away UIObj)))
  512.     (set-car! crud (cons stuff (car crud))))
  513.   'done)
  514.  
  515. (define (UIObj-unprotect-from-gc! UIObj stuff)
  516.   (let ((crud (crud-that-I-dont-want-to-gc-away UIObj)))  
  517.     (set-car! crud (delq! stuff (car crud))))
  518.   'done)
  519.  
  520.  
  521.  
  522. ;;;; Context procedures
  523.  
  524. (define (create-default-context name display)
  525.   ;; Looks in appropriate customization locations to create a default
  526.   ;; context for the application specified by NAME
  527.   (define (convert converter predicate)
  528.     (lambda (default)
  529.       (define (get-default)
  530.     (cond ((procedure? default) (default))
  531.           ((string? default) (converter default))
  532.           (else default)))
  533.       (lambda (string)
  534.     (if (and (string? string) (not (zero? (string-length string))))
  535.         (let ((result (converter string)))
  536.           (if (predicate result)
  537.           result
  538.           (get-default)))
  539.         (get-default)))))
  540.   ;;;**** this doesn't make sense to me.  What are the predicates testing, really?
  541.   ;;; changed XLoadFont to return a wrapped object,so string->font will also
  542.  
  543.   (let ((->symbol (convert string->symbol symbol?))
  544.     (->number (convert string->number number?))
  545.     (->color  (convert (string->color display) color?))
  546.     ;; (->font   (convert (string->font display) font?))
  547.     ;; (->cursor (convert string->cursor cursor?))
  548.     )
  549.     (apply make-context
  550.        (map (lambda (entry)
  551.           (let ((converter (car entry))
  552.             (string (cadr entry)))
  553.             ;;;;********beware: getdefaultvalue is returning an unwrapped object!!
  554.             ;;;; fix this to add the wrappers
  555.             (converter (GetDefaultValue display name string))))
  556.         `((,(->color "White") "ActiveBackground")
  557.           (,(->color "Black") "ActiveForeground")
  558.           (,(->symbol 'nw) "Anchor")
  559.           (,(->color "Black") "Background")
  560.           (,(->color "White") "Border")
  561.           (,(->number 0) "BorderWidth")
  562.           ;; (,(->cursor "Block") "Cursor")
  563.           ;; (,(->font #F) "Font")
  564.           (,(->color "White") "Foreground")
  565.           (,(->symbol 'raised) "Relief"))))))
  566.