<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">#lang racket<br>(require racket/gui/base)<br><br>#|Hello all,<br> Patrick here-<br>First, my apologies for posting a non-working example-I hope I didn&#39;t waste anyone&#39;s time. Secondly, thanks to Matthias and Robby for the corrections-I will certainly refer to these when I use eventspaces again. <br>

<br>I found the issue I had seen, and it had nothing to do with eventspaces-it occurred even without the call-with-eventspace machinery.  Rather, the message% used truncated all text whose length exceeded that of the original init field [Label]. I think there is either a docs bug or a bug in the Windows implementation. |#<br>

<br>#|Problem: I have a message% control called x-pos parented by a frame% called parent1. I have a canvas% subclass called canvas parented under frame% parent2. I would like x-pos to always show the current x coordinate of the mouse position over canvas, and for this to be kept up to date as the mouse moves.|#<br>

<br>#|Setting up the first frame and parent.|#<div class="im"><br>(define parent1 (new frame% <br>                              [label &quot;Parent1&quot;]<br>                              [width 200]<br>                              [height 200]<br>

                              [enabled #t]))<br><br></div>#|Upon further investigation, I found that the label was indeed showing the first digit of the number, and truncating the remaining. This was of course dependent on the length of the label set on message% init. message% does not resize automatically, and I needed to set the auto-resize field to #t. It also didn&#39;t show in my original test-sort of a heisenbug because I used a really long initial label in my test scenario.<br>

 <br><br>From<br><a href="http://docs.racket-lang.org/gui/message_.html" target="_blank">http://docs.racket-lang.org/gui/message_.html</a><br>&quot;If auto-resize is not #f, then automatic resizing is initially enanbled (see auto-resize), and the message% object’s graphical minimum size is as small as possible.&quot; -&gt; this doesn&#39;t appear to be the case here. Windows XP, Racket 5.1<br>

<br>I don&#39;t have a linux box to test atm, but I wonder if the default for the auto-size field is #t there. If so, either the docs are incorrect, or the windows implementation. If not, docs need to be updated. I&#39;d be glad to help in any way possible.|#<div class="im">
<br>
(define x-pos (new message% <br>                   [parent parent1]<br></div>                   [label &quot;0&quot;]))<br><br>#|This variant of x-pos works, resizing with new set-label requests and thus avoiding the truncation. |#<br>

#;(define x-pos (new message% <br>                   [parent parent1]<br>                   [label &quot;0&quot;]#|Setting the label to say, &quot;Long label!&quot; avoids the behavior.|#<br>                   [auto-resize #t]))<br>

<br>(send parent1 show #t)<br><br>#|The second frame*pos combo-|#<div class="im"><br>(define parent2 (new frame% <br>                              [label &quot;Parent2&quot;]<br>                              [width 200]<br>
                              [height 200]<br>
                              [enabled #t]))<br><br>#|Here comes the canvas subclass-I&#39;m looking to override on-event method to grab the x-component of the mouse pos, and I want to have that constantly updating the x-pos message%. I really want reactive behavior, but I ran into some issues with the frtime-namely, differences in bindings due to the mzscheme bindings. the require spec (prefix-in ..) doesn&#39;t appear to be in the language. I&#39;m probably doing something wrong. |#<br>
</div>
(define my-canvas% (class canvas%<br>    <br>    (inherit get-dc)<br>                     <br>    (define/override (on-event mouse-event)<br>      (define x (send mouse-event get-x))<br>      (send  x-pos set-label (number-&gt;string x)))<br>

    (super-new)))<br><br>(define canvas (new my-canvas% [parent parent2]<br>                    [label &quot;Nothing yet.&quot;]))                               <br><br>(send parent2 show #t)<br><br>  <br>#|There you have it kids-message% objects don&#39;t auto-resize, and will truncate the text that is longer than the [label] that they are init-ed with. Sorry for the noise. |#<div class="HOEnZb">
<div class="h5"><br>
  <br><br><div class="gmail_quote">On 20 April 2012 10:34, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Here is a solution in the DrRacket beginner language:<br>
<br>
(require 2htdp/universe)<br>
(require 2htdp/image)<br>
<br>
(define (bundle x) (make-bundle x &#39;() &#39;()))<br>
<br>
(launch-many-worlds<br>
 (universe &#39;n/a (on-new (λ (u nw) (bundle u))) (on-msg (λ (u w m) (bundle m))) (state #t))<br>
 (big-bang &#39;n/a (to-draw (λ (w) (empty-scene 200 200)))<br>
           (register LOCALHOST)<br>
           (on-mouse (λ (w x y ke) (make-package w x)))))<br>
<br>
Here is a solution in Racket derived from yours:<br>
<br>
#lang racket<br>
<br>
(require racket/gui/base)<br>
<br>
(define show-x<br>
  (new frame%<br>
       [label &quot;frame for displaying the current x coordinate&quot;]<br>
<div>       [width 200]<br>
       [height 200]<br>
       [enabled #t]))<br>
<br>
(define x-pos<br>
  (new message%<br>
</div>       [parent show-x]<br>
<div>       [label &quot;No x-pos yet.&quot;]))<br>
<br>
</div>(define discover-x<br>
  (new frame%<br>
       [label &quot;frame for noticing mouse evets and their current x coordinates&quot;]<br>
<div>       [width 200]<br>
       [height 200]<br>
       [enabled #t]))<br>
<br>
</div>(define y-pos<br>
  (new (class canvas%<br>
         (inherit get-dc)<br>
         (super-new)<br>
         (define/override (on-event mouse-event)<br>
<div>           (define x-pos (send mouse-event get-x))<br>
           (define y-pos (send mouse-event get-y))<br>
</div>           (set! *x x-pos)<br>
           (refresh)))<br>
       [parent discover-x]))<br>
<br>
;; for communicating between the two frams<br>
(define *x &#39;n/a)<br>
<br>
(define (refresh)<br>
  (send x-pos set-label (format &quot;~a&quot; *x)))<br>
<br>
;; run program run<br>
(send show-x show #t)<br>
(send discover-x show #t)<br>
<br>
;; you were creating way too many event spaces. No need for that.<br>
<div><div><br>
<br>
<br>
<br>
On Apr 19, 2012, at 2:32 PM, Patrick Mahoney wrote:<br>
<br>
&gt; #lang racket<br>
&gt; #|Hello all, I&#39;m  PMah. |#<br>
&gt; (require racket/gui/base)<br>
&gt;<br>
&gt; #|Problem: I have a message% control called x-pos parented by a frame% called parent1. I have a canvas% called canvas parented under frame% parent2. I would like x-pos to always show the current x coordinate of the mouse position over canvas, and for this to be kept up to date as the mouse moves. Ultimately I&#39;d love to move to a reactive semantics. |#<br>


&gt;<br>
&gt;<br>
&gt; #|Setting up the first frame and parent. I&#39;m also going to grab the eventspace for this frame while I&#39;m at it.|#<br>
&gt; (define parent1 (new frame%<br>
&gt;                               [label &quot;Parent1&quot;]<br>
&gt;                               [width 200]<br>
&gt;                               [height 200]<br>
&gt;                               [enabled #t]))<br>
&gt;<br>
&gt; (define x-pos (new message%<br>
&gt;                    [parent parent1]<br>
&gt;                    [label &quot;No x-pos yet.&quot;]))<br>
&gt;<br>
&gt; (send parent1 show #t)<br>
&gt;<br>
&gt; (define eventspace1 (send parent1 get-eventspace))<br>
&gt;<br>
&gt;<br>
&gt; #|The second eventspace*frame*pos combo-|#<br>
&gt; (define parent2 (new frame%<br>
&gt;                               [label &quot;Parent2&quot;]<br>
&gt;                               [width 200]<br>
&gt;                               [height 200]<br>
&gt;                               [enabled #t]))<br>
&gt;<br>
&gt;<br>
&gt; #|Here comes the canvas subclass-I&#39;m looking to override on-event method to grab the x-component of the mouse pos, and I want to have that constantly updating the x-pos message%. I really want reactive behavior, but I ran into some issues with the frtime-namely, differences in bindings due to the mzscheme bindings. the require spec (prefix-in ..) doesn&#39;t appear to be in the language. I&#39;m probably doing something wrong. |#<br>


&gt; (define y-pos (class canvas%<br>
&gt;<br>
&gt;     (inherit get-dc)<br>
&gt; #|My notion of scope in objects is not precise. With those defines within the scope of the on-event bindings, do the defines recalculate each time on-event receives a message? lo, I wish I had some sort of channel protocol to pass messages between threads, along with control.<br>


&gt; The mushrooms kick in now.<br>
&gt; PFFFT MIND<br>
&gt; |#<br>
&gt;     (define/override (on-event mouse-event)<br>
&gt;       (define min-x (dc:min-x (get-dc)))<br>
&gt;       (define max-x (dc:max-x (get-dc)))<br>
&gt;       (define min-y (dc:min-y (get-dc)))<br>
&gt;       (define max-y (dc:max-y (get-dc)))<br>
&gt;       (define x-pos (send mouse-event get-x))<br>
&gt;       (define y-pos (send mouse-event get-y))<br>
&gt;       (call-in-other-eventspace (make-eventspace) (draw-diagnostics max-x max-y x-pos y-pos)))<br>
&gt;<br>
&gt;     (super-new)))<br>
&gt;<br>
&gt; (define<br>
&gt; (send parent2 show #t)<br>
&gt;<br>
&gt;<br>
&gt; #|I have tried some of the examples on <a href="http://groups.google.com/group/plt-scheme/browse_thread/thread/28af25a01200bc3c/7937bb0314cc231e?lnk=raot" target="_blank">http://groups.google.com/group/plt-scheme/browse_thread/thread/28af25a01200bc3c/7937bb0314cc231e?lnk=raot</a><br>


&gt; Basically, one using a channel, probably incorrectly and the second without. Now what I believe I&#39;ve done is to add the thunk to the queue in the frame% parent1&#39;s eventspace, but I haven&#39;t transferred control. The other eventspace&#39;s thread still has control. Kind of?<br>


&gt; |#<br>
&gt; (define (call-in-other-eventspace e thunk)<br>
&gt;    (let ([ch (make-channel)])<br>
&gt;      (parameterize ([current-eventspace e])<br>
&gt;        (queue-callback (lambda ()<br>
&gt;                          (channel-put ch (thunk)))))<br>
&gt;      (channel-get ch)))<br>
&gt;   #|This blocks both frames updating in some way-im not able to transfer control smoothly to the thread in the message% message1 workspace, and so the x-pos label updates only sporadically when the other eventspace thread yields? |#<br>


&gt; (define (call-in-other-eventspace e thunk)<br>
&gt;    (parameterize ([current-eventspace e])<br>
&gt;        (queue-callback thunk)))<br>
&gt;<br>
&gt;<br>
&gt; #|How can I get x-pos to update automatically on each on-event send here? (draw-diagnostics max-x max-y x-pos y-pos) appears to terminate here in all cases. Part 2: how can I apply frtime to make the update relationship I want between canvas mouse position and message text  (or other racket reactive work if it exists.). I really would like to understand this idiom and get it in my toolchest for gui programming. Thanks all! Racket is an impressive contribution to computer science. |#<br>


&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div><div>&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>
</div></div></blockquote></div><br>
</div></div></blockquote></div><br>