[racket] Plot: plot-new-window never happens?

From: Deren Dohoda (deren.dohoda at gmail.com)
Date: Tue Apr 17 17:27:32 EDT 2012

It was convenient to have something that bypassed the whole gui issue.
Since it really is a gui issue, I am not too offended that my own laziness
got in my way.

That said, it seemed to me that the use of the new window was a convenience
added for just this kind of use, otherwise I would be using a snip, not
just slamming a plot up. When plot-new-window? is #t, the call to plot
evaluates to void. So it seems that my use case was the point. Without a
reference to the new window, "the opposite problem"---if I understood
correctly---can't happen. Can it?
On Apr 17, 2012 3:12 PM, "Robby Findler" <robby at eecs.northwestern.edu>
wrote:

> FWIW, I think we'd want somehow, in the library, to show plot windows
> in a way that doesn't do any special threading/eventspace stuff, or
> else the opposite confusion can happen.
>
> How about, for this situation, having a function called 'show-plot!'
> that takes a plot and puts it into a window in a separate eventspace,
> collecting all of the plots?
>
> Robby
>
> On Tue, Apr 17, 2012 at 1:16 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> > You could give each frame in its own eventspace.
> >
> > At Tue, 17 Apr 2012 11:45:20 -0600, Neil Toronto wrote:
> >> Would it be possible to change plot so that its windows always behave
> >> like this? Could I make it not require cooperation from the program that
> >> calls `plot-frame'?
> >>
> >> This is going to come up every time someone wants to pop up plot windows
> >> in a non-GUI, interactive loop.
> >>
> >> Neil ⊥
> >>
> >> On 04/17/2012 10:48 AM, Matthew Flatt wrote:
> >> > All GUI activity like window drawing happens only in the main thread
> of
> >> > an eventspace. Your program also starts out in the main thread. So,
> >> > yes, drawing has to wait until your loop completes.
> >> >
> >> > One solution is to put your loop in a separate thread. The example
> >> > below creates a thread and passes it to `yield' to wait until the
> >> > thread is done. The `yield' function is special in that it lets other
> >> > GUI activity happen while it waits:
> >> >
> >> >   #lang at-exp racket
> >> >   (require plot
> >> >            racket/gui/base)
> >> >   (plot-new-window? #t)
> >> >   (yield
> >> >    (thread
> >> >     (lambda ()
> >> >       (let loop ()
> >> >         (let ((dummy (read)))
> >> >           (if (and (number? dummy) (zero? dummy))
> >> >               (void)
> >> >               (begin
> >> >                 (plot (function (λ(x) (* x x)) -2 2))
> >> >                 (loop))))))))
> >> >
> >> > Although the above should work, it's not really a good idea to perform
> >> > GUI actions outside of the main thread. So, here's an improved version
> >> > that uses `queue-callback' to send the `plot' call back to the main
> >> > thread:
> >> >
> >> >   #lang at-exp racket
> >> >   (require plot
> >> >            racket/gui/base)
> >> >   (plot-new-window? #t)
> >> >   (yield
> >> >    (thread
> >> >     (lambda ()
> >> >       (let loop ()
> >> >         (let ((dummy (read)))
> >> >           (if (and (number? dummy) (zero? dummy))
> >> >               (void)
> >> >               (begin
> >> >                 ;; queue a callback instead of `plot' directly:
> >> >                 (queue-callback
> >> >                  (lambda ()
> >> >                    (plot (function (λ(x) (* x x)) -2 2))))
> >> >                 (loop))))))))
> >> >
> >> > For more information, see
> >> >
> >> >
> >>
> http://docs.racket-lang.org/gui/windowing-overview.html#(part._eventspaceinfo)
> >> >
> >> >
> >> > At Tue, 17 Apr 2012 10:40:55 -0400, Deren Dohoda wrote:
> >> >> I was messing around with a spline utility last night and was using
> >> >> the plot-new-window? setting to get a plot. The goal was to share an
> >> >> exe with a coworker who doesn't have Racket. Just a command-line app
> >> >> but to get the plot to display I needed a window and this seemed
> >> >> awesome. The problem is I couldn't get the plot to display when the
> >> >> thread was in a procedure. The window would appear but it was like
> the
> >> >> plot backend wasn't free to draw to it. Here's a way to reproduce it
> >> >> on v5.2:
> >> >>
> >> >> #lang at-exp racket
> >> >> (require plot)
> >> >> (plot-new-window? #t)
> >> >> (let loop ()
> >> >>    (let ((dummy (read)))
> >> >>      (if (and (number? dummy) (zero? dummy))
> >> >>          (void)
> >> >>          (begin
> >> >>            (plot (function (λ(x) (* x x)) -2 2))
> >> >>            (loop)))))
> >> >>
> >> >> So long as you are looping, new windows will appear without plot
> >> >> contents. When you finally quit (here by entering the number zero)
> all
> >> >> the plots are drawn in those windows. Any help? Did I do something
> >> >> horribly dumb?
> >> >>
> >> >> Thanks,
> >> >> Deren
> >> >>
> >> >> ____________________
> >> >>    Racket Users list:
> >> >>    http://lists.racket-lang.org/users
> >> >
> >> > ____________________
> >> >    Racket Users list:
> >> >    http://lists.racket-lang.org/users
> >>
> >> ____________________
> >>   Racket Users list:
> >>   http://lists.racket-lang.org/users
> >
> > ____________________
> >  Racket Users list:
> >  http://lists.racket-lang.org/users
>
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120417/8c4a9fbd/attachment-0001.html>

Posted on the users mailing list.