CLIM mail archive

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

changing application frame layouts



    Date: Mon, 25 Nov 1991 10:51 EST
    From: curt@eraserhead.Jpl.Nasa.Gov (Curt Eggemeyer)

    I am on a SPARC in Allegro w/ CLIM 1.0.  I have an application frame
    with two layouts (Normal, and Editor).  I have been doing some
    experimentation with swapping layouts in an application via an
    application command.  The first problem I have notice is that if you
    have a command like.

The implementation for changing frame layouts in CLIM 1.0 is badly
designed.  The issue is that, after the layout of a frame is changed,
CLIM needs to recompute the values for the standard stream bindings
(*STANDARD-INPUT*, *QUERY-IO*, etc.)  When you call SET-FRAME-LAYOUT,
CLIM throws to the tag CLIM::RESYNCHRONIZE in order to recompute these
values.  There are two workarounds:
(1) If you know that none of the standard stream bindings will change
    or don't care, you can do this:
    (CATCH 'CLIM::RESYNCHRONIZE
      (SET-FRAME-LAYOUT <frame> <layout>))
(2) Alternatively, you can try installing the following kludge fix to
    SET-FRAME-LAYOUT, until I figure out a better fix:

(in-package :clim)
(defmethod set-frame-layout ((frame application-frame) new-layout)
  (setq *frame-layout-changing-p* t)
  (with-slots (current-panes initialized-panes) frame
    (setf (frame-current-layout frame) new-layout)
    (layout-frame-panes frame (frame-top-level-window frame))
    ;; Forcibly display any panes that have not been displayed yet
    (dolist (pane current-panes)
      (unless (member pane initialized-panes)
	;; Display the pane and mark it initialized
	(redisplay-frame-pane frame pane :force-p t))))
  (unless (eq *application-frame* *default-application*)
    (setq *standard-output* (or (frame-standard-output frame) *standard-output*)
	  *query-io* (or (frame-query-io frame) *query-io*)
	  *standard-input* (or interactor *standard-output*)
	  *error-output* (or (frame-error-output frame) *error-output*))))

    (define-my-application-command (swap-them-back-and-forth :name t) ()
       (set-frame-layout 'Different-Layout)
       (sleep 10)           ;plenty of time to swap them panes around!
       (set-frame-layout 'Original-Layout))

    The command will only do the first set-frame-layout.  My interactor pane
    that is included with both layouts is still active though.  So if I use
    a different command that just does (set-frame-layout 'Original-Layout),
    I can get back to my original layout.  Why can't I swap more than one
    layout within the same command??????

    The second problem I am having is that within the same application
    command, when I swap layouts I cannot do output to the newly exposed
    pane of my new layout (even with force-output).  However, If I put the
    same code in a different command and then invoke it after invoking the
    command that swaps the layouts , the output will appear on the newly
    exposed frame.  Why can't I output within the same command when I swap
    layouts?

    In my case I am trying to setup up a single command in which the person
    invokes a multi-page editor on a presentation object that is in a
    timeline like display.  I would like to do this in a single step.  But
    right now the only way to get it to work is invoking three commands
    (when I should be able to do it with only one)!  Is there something
    trivial that I am missing?

Yes, but the trivial thing is not documented.

0,,

References:

Main Index | Thread Index