anchor.diff:     (y-off :accessor gui-widget-y-off :initform 0 :initarg :y-off)
      ;; children layout (:vertical, :horizontal or :absolute)
      (layout :accessor gui-widget-layout :initform :absolute :initarg :layout)
  -   ;; are we allowed to resize the widget?
  -   (autosize :accessor gui-widget-autosize :initform nil :initarg :autosize)
  -   (stick :accessor gui-widget-stick :initform nil :initarg :stick)
      ;; visual appearance
      (color :accessor gui-widget-color
             :initform (create-color 0.35 0.35 0.35 0.5)
             :initarg :color)
      (texture :accessor gui-widget-texture :initform nil :initarg :texture)
      (visible :accessor visible :initform t)
  +   (font :accessor gui-widget-font :initform nil :initarg :font) ;; XXX: move this?
      (focused :accessor focused :initform t)
      (parent :accessor parent-widget :initform nil)
      (children :accessor children :initform '()))
  
positive.code: ;;     (when (action it)
  ;;       (funcall (action it) it)))
  
  (defmethod gui-widget-mouse-down ((it gui-button))
    (setf (gui-button-pressed it) t)
    (when (gui-button-pressed-texture it)
      (let ((tex (gui-widget-texture it)))
        (setf (gui-widget-texture it) (gui-button-pressed-texture it))
        (setf (gui-button-pressed-texture it) tex))))
  
  (defmethod gui-widget-mouse-up ((it gui-button))
    (when (and (gui-button-pressed it) (action it))
      (funcall (action it) it))
    (setf (gui-button-pressed it) nil)
  
negative.code: ;; Default input methods for static widgets
  ;; simply forward to parent widget
  ;; Dynamic widgets should override these to provided specific behavior
  (defmethod gui-widget-mouse-down ((it gui-widget) btn)
    (when (parent-widget it)
      (gui-widget-mouse-down (parent-widget it) btn)))
  
  (defmethod gui-widget-mouse-up ((it gui-widget) btn)
    (when (parent-widget it)
      (gui-widget-mouse-up (parent-widget it) btn)))
  
  (defmethod gui-widget-mouse-move ((it gui-widget) dx dy)
    (when (parent-widget it)
  