CLIM mail archive

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

changing layouts



    Date: Fri, 5 Jun 1992 08:19 PDT
    From: Chris Elsaesser <chris@starbase.mitre.org>

    Dear CLIM,

    In Genera 8.1 CLIM 1.0, every time I do a 
       (clim::set-frame-layout <frame> <layout>) 

    from a command (e.g, com-foo), everything that follows the call
    to clim::set-frame-layout is ignored.  What am I doing wrong?


    chris



This came up before and Scott McKay gave a workaround (his message 
is included below).  I've used his first workaround with success.  
I have not tried his second.

David Bushnell
bushnell@eos.arc.nasa.gov




>From:  Scott McKay <SWM@sapsucker.scrc.symbolics.com>
>Newsgroups: ri.clim
>Message-ID:  <19346@ptolemy-arclan.ptolemy-ri.arc.nasa.gov>

In article <19346@ptolemy-arclan.ptolemy-ri.arc.nasa.gov> Scott McKay <SWM@sapsucker.scrc.symbolics.com> writes:
> 
>     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.


References:

Main Index | Thread Index