Hi Vincent,

Thanks for looking into this.  I changed the code so that make-plot-snip is 
now typed and the problem goes away.  I will now have to find a way to put 
this fix into my code, as the solution is not particularly elegant and 
relies on undocumented features (type-environment and parse-syntax). 

I inserted my fixed version below, in case you have any suggestions on how 
to improve it.

However, I'm not sure I understand your explanation. I was expecting most 
of the interactions for drawing the window to be between the frame, the 
plot-canvas and the plot-snip.  The first two objects are created in an 
untyped environment and the plot-snip, while typed, is inserted into the 
snip-canvas in an untyped environment as well.  Adding a type declaration 
to make-plot-snip should not have helped much as the interaction between 
the snip-canvas and the plot-snip is an untyped-typed boundary.  So 
basically, adding type declaration to make-plot-snip fixes the problem, but 
I have no idea why.

Best Regards,
Alex,

#lang typed/racket/gui
(require plot) ; Racket 6.3

;; make-snip-frame is similar to the one in
;; C:\Program Files\Racket\share\pkgs\plot-gui-lib\plot\private\gui\gui.rkt

(module glue typed-racket/base-env/extra-env-lang

  (provide make-snip-frame)
  
  (module types typed/racket/base
    (require (only-in typed/racket/gui Snip% Frame%))
    (provide (all-defined-out))
    (define-type Make-Snip-Frame
      (-> (Instance Snip%)
          Positive-Real
          Positive-Real
          String
          (Instance Frame%))))

  (module untyped-functions racket/gui
    (require mrlib/snip-canvas)
    (provide make-snip-frame)
    
    (define (make-snip-frame snip width height label)
      (define frame
        (new frame% [label label] [width (+ 20 width)] [height (+ 20 
height)]))
      (new snip-canvas%
           [parent frame]
           [make-snip (lambda (w h) snip)]
           [horiz-margin 5] [vert-margin 5]
           [horizontal-inset 5] [vertical-inset 5])
      frame))

  (require 'types
           (for-syntax (submod 'types #%type-decl))
           'untyped-functions)

  (type-environment
   [make-snip-frame (parse-type #'Make-Snip-Frame)]))

(require 'glue)

;; This works as expected when resizing the window and zooming the graph
(define (plot-working)
  (parameterize ([plot-width    150]
                 [plot-height   150]
                 [plot-x-label  #f]
                 [plot-y-label  #f])
    (send (plot-frame (function sqr -2 2)) show #t)))

;; This does not work in version 6.2 or newer but works fine in version 
6.1.1.
;; Try resizing the frame and zooming the plot to see the problem.  Compare 
it
;; with the frame produced by `plot-working`
(define (plot-not-working)
  (parameterize ([plot-width    150]
                 [plot-height   150]
                 [plot-x-label  #f]
                 [plot-y-label  #f])
    ;; this is essentially what plot-frame does sans error checking
    (send (make-snip-frame (plot-snip (function sqr -2 2)) 150 150 "hello") 
show #t)))


On Tuesday, December 8, 2015 at 3:09:43 AM UTC+8, Vincent St-Amour wrote:
>
> Alex, 
>
> I've looked into this a little bit more, and it looks like the 
> `not-working` function (which is, as you say, doing essentially the same 
> thing as `plot-frame`) is actually kind of working, but is actually 
> stuttering very badly. 
>
> An important detail here is that `plot` is written in Typed Racket, 
> whereas your code uses regular, untyped Racket. Interfacing Typed Racket 
> and Racket code may involve a lot of dynamic checks, which can have 
> significant overhead, and cause that kind of stuttering. 
>
> *Where* that boundary lies, though, matters a lot. 
>
> If you use `plot-frame`, its (typed) implementation uses the (typed) 
> version of `make-snip-frame` from inside the `plot` library. The 
> boundary then lies between your driver code and `plot-frame`. That's not 
> a very heavily trafficked boundary, so the overhead is minimal. 
>
> If you use your hand-rolled equivalent of `plot-frame`, you're using 
> your own, untyped version of `make-snip-frame`, so the boundary lies 
> between the typed `plot-snip` and your untyped `make-snip-frame`. That 
> seems to be a more trafficked boundary, hence the stuttering. 
>
> (To complicate matters, Neil uses some tricks to add types to 
> `make-snip-frame` after the fact, without boundary overhead, which is 
> why the version you copied looked (and kind of was) untyped.) 
>
> Just to confirm, I've converted your file to Typed Racket, and used the 
> typed version of `make-snip-frame`, and the problem goes away. 
>
>
> So the bottom line is, using `pict-snip` from untyped code may be too 
> slow to be usable. You may want to write the portion of your program 
> that uses it in Typed Racket. 
>
> Vincent 
>
>
>
>
> On Sun, 06 Dec 2015 05:30:23 -0600, 
> Alex Harsanyi wrote: 
> > 
> > Hi Vincent, 
> > 
> > This is still a problem in Racket 6.3. I tried to debug the problem but 
> > I was unsuccessful. Tried to use a pasteboard% instead, but the 
> > plot-snip% did not work correctly with that either. Do you have any 
> > advice on where to start looking? 
> > 
> > What I'm trying to do is embed plot-snip% objects inside a GUI. Is there 
> > a way to do that? I could only find plot-frame which always creates a 
> > new frame. 
> > 
> > For reference, this is that application that is affected: 
> > https://github.com/alex-hhh/ActivityLog2. The last Racket version that 
> > works with this is 6.1.1 
> > 
> > Best Regards, 
> > Alex. 
> > 
> > On Tuesday, October 6, 2015 at 4:26:54 AM UTC+8, Vincent St-Amour wrote: 
> > 
> >     Hi Alex, 
> >     
> >     Sorry for the late response. 
> >     
> >     I can confirm the behavior you observed. I don't see anything wrong 
> >     with 
> >     your code at first glance, so I'm not sure what the problem is. 
> >     
> >     Neil: Any ideas? 
> >     
> >     Vincent 
> >     
> >     
> >     
> >     On Sun, 04 Oct 2015 20:36:35 -0500, 
> >     Alex Harsanyi wrote: 
> >     > 
> >     > Hi, 
> >     > 
> >     > I posted this question a while ago but I didn't receive any 
> >     response. I 
> >     > just retested the code with the current snapshot (6.2.900.17) and 
> >     it has 
> >     > the same behavior (bug?). 
> >     > 
> >     > Could someone please test this code on their machine and at least 
> >     > confirm whether it works correctly or not for them? 
> >     > 
> >     > If there's a bug in the code below, could you point out what it 
> >     is? As I 
> >     > mentioned, the code works fine in 6.1.1 and I cannot find anything 
> >     that 
> >     > has changed in this area in version 6.2. 
> >     > 
> >     > Note that in recent Racket snapshots snip-canvas% has moved, so, 
> >     in the 
> >     > code below, the "(require unstable/gui/snip)" should be replaced 
> >     with " 
> >     > (require mrlib/snip-canvas)". 
> >     > 
> >     > Thanks, 
> >     > Alex. 
> >     > 
> >     > On Friday, July 24, 2015 at 3:57:13 PM UTC+8, Alex Harsanyi wrote: 
> >     > 
> >     > 
> >     > Hi, 
> >     > 
> >     > I'm using the plot-snip function to have interactive plots inside 
> >     > other GUI elements in my application. This worked fine under 
> >     Racket 
> >     > 6.1.1 but fails under Racket 6.2 (bot versions are 64 bit on 
> >     > Windows). The program below illustrates the problem: the function 
> >     > `working` creates a plot window using plot-frame. The plot is 
> >     > resized correctly and the interactive zoom works as expected. The 
> >     > function `not-working` tries to do the same, but creates the plot 
> >     > using plot-snip than adds it to a snip canvas. It does essentially 
> >     > what plot-frame does, without the error checking (I copied out the 
> >     > functions from he plot package). With this version, the plot is 
> >     not 
> >     > resized correctly inside the window and zoom in and out does not 
> >     > work correctly. Both functions work as expected under Racket 
> >     version 
> >     > 6.1.1. 
> >     > 
> >     > The program makes use of snip-canvas% which is in unstable/gui, 
> >     but 
> >     > as far as I can tell, it has not changed between the two versions. 
> >     > 
> >     > Does anyone know what needs to be done to get this to work, or is 
> >     > this a bug in the plot package? 
> >     > 
> >     > Thanks, 
> >     > Alex. 
> >     > 
> >     > #lang racket/gui 
> >     > (require plot) 
> >     > (require unstable/gui/snip) 
> >     > 
> >     > ;; snip-frame% and make-snip-frame are copied from 
> >     > ;; C:\Program 
> >     > Files\Racket\share\pkgs\plot-gui-lib\plot\private\gui\gui.rkt 
> >     > 
> >     > (define snip-frame% 
> >     > (class frame% 
> >     > (define/override (on-traverse-char event) 
> >     > (define key-code (send event get-key-code)) 
> >     > (case key-code 
> >     > [(escape) (send this show #f)] 
> >     > [else (super on-traverse-char event)])) 
> >     > 
> >     > (super-new))) 
> >     > 
> >     > (define (make-snip-frame snip width height label) 
> >     > (define (make-snip w h) snip) 
> >     > 
> >     > (define frame 
> >     > (new snip-frame% [label label] [width (+ 20 width)] [height (+ 20 
> >     > height)])) 
> >     > 
> >     > (new snip-canvas% 
> >     > [parent frame] 
> >     > [make-snip make-snip] 
> >     > [horiz-margin 5] [vert-margin 5] 
> >     > [horizontal-inset 5] [vertical-inset 5]) 
> >     > 
> >     > frame) 
> >     > 
> >     > ;; This works as expected when resizing the window and zooming the 
> >     > graph 
> >     > (define (working) 
> >     > (parameterize ([plot-width 150] 
> >     > [plot-height 150] 
> >     > [plot-x-label #f] 
> >     > [plot-y-label #f]) 
> >     > (send (plot-frame (function sqr -2 2)) show #t))) 
> >     > 
> >     > ;; This does not 
> >     > (define (not-working) 
> >     > (parameterize ([plot-width 150] 
> >     > [plot-height 150] 
> >     > [plot-x-label #f] 
> >     > [plot-y-label #f]) 
> >     > ;; this is essentially what plot-frame does sans error checking 
> >     > (send (make-snip-frame (plot-snip (function sqr -2 2)) 200 200 
> >     > "hello") show #t))) 
> >     > 
> >     > 
> >     > -- 
> >     > You received this message because you are subscribed to the Google 
> >     > Groups "Racket Developers" group. 
> >     > To unsubscribe from this group and stop receiving emails from it, 
> >     send 
> >     > an email to [email protected]. 
> >     > To post to this group, send email to [email protected]. 
> >     > To view this discussion on the web visit 
> >     > 
> >     
> https://groups.google.com/d/msgid/racket-dev/c2517296-2a7a-4e49-b617-21cfac413710%
>  
> >    40googlegroups.com. 
> >     > For more options, visit https://groups.google.com/d/optout. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-dev/9969d282-294c-4549-a472-cf2ee94dd653%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to