CLIM mail archive


:panes option to define-application-frame

Please send bug reports for CLIM 0.9 to Bug-CLIM@ILA.COM in the future.

    Date: Fri, 1 Feb 91 12:40 PST
    From: will taylor <>

    In Franz Allegro 3.1.13, CLIM 0.9, I donot seem to be able
    to construct a frame of multiple layouts: I get #:frame
    declared special when I compile it, and unbound symbol
    #:frame when I try to create it.  Code follows:

The :PANES option to DEFINE-APPLICATION-FRAME is, unfortunately,
difficult to use without an example.  I don't think we publish any
examples of its use.  I believe this section of the documentation will
be substantially rewritten for the next release.

Also, I believe there is a bug in the implementation of
SELECT-FRAME-LAYOUT which was shipped with 0.9.  There is a patch
numbered 37 which is supposed to fix this, but it has a bug in it.  I
will ask one of the ILA folks in Cambridge to fix this for real, but I
will include the source of the fixed fix below.

If you had patch 37 loaded, you would at least have been warned that
your :PANES option had a syntax error in it, by the way.  Here is
approximately what it says now:

   Warning: A layout name must be a symbol, not

The documentation says of the :PANES option:
  Its format is a list of two-element lists.  The first element of each
  sublist is a symbol naming the layout; the second element is a form
  what evaluates to a pane.

So, your frame should say:

(define-application-frame AC-BUG
			  ()		; No super classes
  ;; state variables
  ((banner-pane :initform nil :accessor banner-pane)
   (command-pane :initform nil :accessor command-pane)

  ;; frame layouts
;;; Note no extra set of parentheses, and no :INITFORM keyword
      (let ((frame-mgr (find-frame-manager :server-path *default-server-path*)))
	(with-frame (frame)
	  (with-style (frame-mgr frame)
	    (with-frame-slots (banner-pane command-pane)
		(make-clim-pane (banner-pane :type  'clim-stream-pane
					     :hs 600 :vs 40 :scroll-bars nil
					     :label "NASA Ames Research Center - FIA")
				:default-text-style '(:fix :bold :very-large))
		(make-clim-pane (command-pane :type 'command-pane-class
					      :hs 600 :vs 30 :scroll-bars nil)
				:default-text-style '(:sans-serif :bold :large))))))))

;;; Selecting one of the following configurations would cause an error,
;;; of course, since the second element of the list does not evaluate to
;;; a pane.
      (:command-definer t)
      (:top-level (clim-top-level))

By the way, here is a cliche you may want to use with the :PANES option.
Remember that if you want to reuse already-created panes in different
configurations, you need to write them down someplace:

(define-application-frame two-configurations ()
  ((pane-a :initform nil)
   (pane-b :initform nil))
      (with-frame-slots (pane-a pane-b)
	  (or pane-a (make-clim-pane (pane-a ...) ...))
	  (or pane-b (make-clim-pane (pane-b ...) ...)))))
      (with-frame-slots (pane-a pane-b)
	  (or pane-a (make-clim-pane (pane-a ...) ...))
	  (or pane-b (make-clim-pane (pane-b ...) ...)))))))

Here is the fixed version of SELECT-FRAME-LAYOUT:
(in-package :windshield)

(defmethod select-frame-layout ((frame frame) layout &optional how)
  (let ((manager (frame-manager frame))
	(*old-layout* (frame-pane frame))
    (declare (special *new-layout* *old-layout*))

    (assert manager ()
	    "A frame must be adopted before a layout can be changed")
    ;; slot-unbound takes care of building the layout if necessary.
    (setq *new-layout* (slot-value frame layout))

    ;; Need to be able to do (pane-frame <something-in-new-layout>) soon.
    (register-pane-frame *new-layout* frame)

    (selecting-frame-layout manager frame *new-layout* how)
    (setf (frame-pane frame) *new-layout*)
    ;; Don't need to do (pame-frame <something-in-old-layout>) any more.
    (unregister-pane-frame *old-layout*)))


Main Index | Thread Index