Comments (9)
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.
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.
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.
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.
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.
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)
- (progress #:range) contract HOT 1
- List view + dialog + slider appears not to update correctly HOT 3
- update-children in container%: hash-ref: no value found for key HOT 1
- tabs: 'new-button (send tab-panel on-new-request) not implemented HOT 3
- How does one program GUIs to handle heterogeneous data, especially with sub-views that contain internal state? HOT 1
- Containers which create internal panels are always stretchable HOT 2
- dyn-view with hidden observable dependencies HOT 11
- is there a way to close a dialog programmatically? HOT 5
- Is it possible to detect when the main window closes? HOT 2
- Render popup-menus relative to a child widget? HOT 1
- Documentation for case-view condition doesn't match implementation HOT 1
- Default keymap for (input) should be (keymap:get-editor) HOT 6
- `group` does not accept styles shown in docs HOT 1
- button contract should allow bitmap%, not just label-text% HOT 1
- Error in remove-dependencies while updating conditional view within a list-view HOT 3
- Feature-request: Slightly fancier menus HOT 1
- observable-view: change-children: cannot delete non-window area HOT 2
- Docs say default hpanel alignment is `'(center top)`, but it isn't
- Clean way to implement a list of checkboxes? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from racket-gui-easy.