Code Monkey home page Code Monkey logo

Comments (9)

benknoble avatar benknoble commented on June 18, 2024 1

I need to wrap my head around this a little better: I think you are saying (you suspect) the renderer creates the widget in one eventspace, but the callback is happening in another?

Yes, that would be the only explanation I can think of for why the Cocoa-level callback is ending up being called before the object is fully instantiated.

Hopefully I have time to take a look next week and let you know. Maybe I'm "holding it wrong" :)

Also, what do you mean by "when I minimize it, it stops happening"?

I meant that when I make (what ought to be) a minimal example, it stops happening.

Ah, I thought you meant "minimize the window" or some such; the overlap with GUI terms there was unfortunate.

from racket-gui-easy.

Bogdanp avatar Bogdanp commented on June 18, 2024

I can reproduce the issue, but when I minimize it, it stops happening. I haven't checked, but is this one of the places where you use multiple eventspaces? If so, that might be the culprit. What's happening is the paint callback is being triggered before the object finishes instantiating, and the only way I could see that happening is if the callback is being triggered on a separate eventspace.

from racket-gui-easy.

benknoble avatar benknoble commented on June 18, 2024

I will double-check, but yes I think the AoE window is in a separate eventspace. Maybe it doesn't need to be…

I need to wrap my head around this a little better: I think you are saying (you suspect) the renderer creates the widget in one eventspace, but the callback is happening in another?

Also, what do you mean by "when I minimize it, it stops happening"?

from racket-gui-easy.

Bogdanp avatar Bogdanp commented on June 18, 2024

I need to wrap my head around this a little better: I think you are saying (you suspect) the renderer creates the widget in one eventspace, but the callback is happening in another?

Yes, that would be the only explanation I can think of for why the Cocoa-level callback is ending up being called before the object is fully instantiated.

Also, what do you mean by "when I minimize it, it stops happening"?

I meant that when I make (what ought to be) a minimal example, it stops happening.

from racket-gui-easy.

benknoble avatar benknoble commented on June 18, 2024

I need to wrap my head around this a little better: I think you are saying (you suspect) the renderer creates the widget in one eventspace, but the callback is happening in another?
Yes, that would be the only explanation I can think of for why the Cocoa-level callback is ending up being called before the object is fully instantiated.

The code boils down to render/eventspace, which is like render but with an eventspace argument (and sets a custom parameter in the eventspace).

Essentially, I have (unimportant details commented or removed; in particular, an eventspace-generating macro expanded and some details removed)

(define (render/eventspace tree #:parent [parent #f] #:eventspace [es (current-eventspace)])
  (parameterize ([current-eventspace es])
    (define r (render tree parent))
    ;; set current-renderer in handler-thread of es
    #;(queue-callback (thunk (current-renderer r)) 'high-priority)
    r))

;; in the other file

(button "AoE" (thunk
               (define @pict (@> @base base->pict))
               (define cust (make-custodian))
               (define es (parameterize ([current-custodian cust]) (make-eventspace)))
               (render/eventspace
                #:eventspace es
                (window
                 #:title "AoE pattern"
                 (pict-canvas @pict values)))))

On second glance, the tree object (which is (window … (pict-canvas …)) is created in the current eventspace because of strict evaluation for functions like render/eventspace; but, render is called in the new eventspace es. Could this be the culprit?

I should be able to quickly adjust render/eventspace into a macro backed by a version of the current function that delays evaluation of tree until we are in the correct eventspace. Fingers crossed that breaks nothing else :)

from racket-gui-easy.

benknoble avatar benknoble commented on June 18, 2024

Update: the following diff did not solve my problem (by creating tree in the separate eventspace):

-(define (render/eventspace tree #:parent [parent #f] #:eventspace [es (current-eventspace)])
+(define (render/eventspace- tree #:parent [parent #f] #:eventspace [es (current-eventspace)])
   (parameterize ([current-eventspace es])
-    (define r (render tree parent))
+    (define r (render (tree) parent))
     ;; set current-renderer in handler-thread of es
     #;(queue-callback (thunk (current-renderer r)) 'high-priority)
     r))

+(define-syntax-parse-rule
+  (render/eventspace {~or* {~optional {~seq #:parent parent:expr}}
+                           {~optional {~seq #:eventspace es:expr}}}
+                     tree:expr)
+  (render/eventspace- (thunk tree) (~? (~@ #:parent parent)) (~? (~@ #:eventspace es))))

from racket-gui-easy.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.