<p>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. </p>
<p>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, &quot;the opposite problem&quot;---if I understood correctly---can&#39;t happen. Can it? </p>

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