<div dir="ltr"><div><div>As a side note, I remember having stumbled on the same issue some while back, and the way I dealt with it was to refresh based on a random outcome.<br></div>Not clean, but it works pretty well as long as the refresh calls are still close enough.<br>

<br></div>Laurent<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 17, 2014 at 12:11 AM, David Vanderson <span dir="ltr"><<a href="mailto:david.vanderson@gmail.com" target="_blank">david.vanderson@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks for the great (and quick!) response.  It's good to know that the ordering is intentional, and to have some nice ways to work around it if needed.<br>


<br>
The reason I thought that refreshes were lower priority was because of the scrollbar behavior in the program below.  On Unix/X, dragging the scrollbar back and forth does lots of paints, but I only actually see a few of them.<br>


<br>
Does that sound like a bug to you?<br>
<br>
<br>
#lang racket/gui<br>
<br>
(define num-on-paint 0)<br>
<br>
(define frame<br>
  (new frame%<br>
       (label "Refresh")<br>
       (width 500)<br>
       (height 500)))<br>
<br>
(define (draw-screen canvas dc)<br>
  (set! num-on-paint (add1 num-on-paint))<br>
  (sleep 0.1) ; simulate a longer painting effort<br>
  (send dc draw-text (~a num-on-paint " paints") 400 70))<br>
<br>
(define canvas<br>
  (new canvas%<br>
       (parent frame)<br>
       (paint-callback draw-screen)<br>
       (style '(no-autoclear hscroll))))<br>
<br>
(send frame show #t)<br>
<br>
(send canvas init-auto-scrollbars 700 #f 0.0 0.0)<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
On 04/16/2014 01:56 PM, Matthew Flatt wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
You're right that it's about event ordering and not refresh coalescing.<br>
Since mouse events are handled after refreshes, you won't get the next<br>
refresh request until an earlier one is handled, after which the next<br>
mouse event can trigger another refresh request. I think the difference<br>
between Unix/X and Windows may be that Windows sends fewer mouse<br>
events.<br>
<br>
There are trade-offs here, but my experience is that ordering input<br>
events before refresh does not work well in general. To trigger<br>
refreshes at a lower priority in this case, you could use Neil's<br>
suggestion or change<br>
<br>
  (send this refresh)<br>
<br>
to<br>
<br>
  (set! needed? #t)<br>
  (queue-callback (lambda () (when needed?<br>
                               (set! needed? #f)<br>
                               (send this refresh)))<br>
                  #f) ; => low priority<br>
<br>
where `needed?` is a field that's initially #f.<br>
<br>
At Wed, 16 Apr 2014 13:33:02 -0400, David Vanderson wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
(moved to dev)<br>
<br>
On Linux, the attached program shows terrible responsiveness when<br>
dragging points around on the graph.  Can anyone else on Linux reproduce<br>
this behavior?<br>
<br>
<br>
The patch below dramatically improves the responsiveness by forcing the<br>
eventspace to process medium-level events (mouse movement) before<br>
refresh events.  Without the patch, each mouse drag causes a paint.<br>
With it, multiple mouse drags are processed before a paint.<br>
<br>
<br>
I'm unsure about this fix.  Windows doesn't show the problem (I don't<br>
have a mac to test), so I think it's just a GTK issue.<br>
<br>
My guess is that the gui layer is relying on the native libraries to<br>
coalesce multiple refresh requests (but this is not working with GTK).<br>
Can anyone confirm this?<br>
<br>
Thanks,<br>
Dave<br>
<br>
<br>
<br>
diff -ru<br>
racket-6.0_clean/share/pkgs/<u></u>gui-lib/mred/private/wx/<u></u>common/queue.rkt<br>
racket-6.0/share/pkgs/gui-lib/<u></u>mred/private/wx/common/queue.<u></u>rkt<br>
--- racket-6.0_clean/share/pkgs/<u></u>gui-lib/mred/private/wx/<u></u>common/queue.rkt<br>
2014-02-18 12:27:43.000000000 -0500<br>
+++ racket-6.0/share/pkgs/gui-lib/<u></u>mred/private/wx/common/queue.<u></u>rkt<br>
2014-04-16 09:41:16.810993955 -0400<br>
@@ -300,8 +300,8 @@<br>
(lambda (_) #f))<br>
                                              (or (first hi peek?)<br>
(timer-first-ready timer peek?)<br>
-                                               (first refresh peek?)<br>
                                                  (first med peek?)<br>
+                                               (first refresh peek?)<br>
                                                  (and (not peek?)<br>
                                                       sync?<br>
                                                       ;; before going<br>
with low-priority events,<br>
<br>
<br>
------------------------------<u></u>------------------------------<u></u>------------------<br>
[text/plain "graph_ui.rkt"] [~/Desktop & open] [~/Temp & open]<br>
_________________________<br>
   Racket Developers list:<br>
   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/<u></u>dev</a><br>
</blockquote></blockquote>
<br>
_________________________<br>
 Racket Developers list:<br>
 <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/<u></u>dev</a><br>
</div></div></blockquote></div><br></div>