I'm porting a little Morphic geometry program from Morphic to a Spec 2
application using GTK. I need to draw a shape in an SpAthensPresenter but to draw it I need to know the current dimensions (extent) of the presenter so it can still work OK even when the window is resized. The old Morphic version also used An Athens canvas but I had no problem then as a morph has an extent method that provides this information. But now that I can't use a morph I find that the extent method of an SpPresenter always seems to answer nil. Is that right? How d you get the current size of a presenter? Is it a bug? I'm using a very recent Pharo 9 image and headless VM on Linux. Image ----- /home/kmp/Pharo/images/gtkRoses/gtkRoses.image Pharo9.0.0 Build information: Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit) Unnamed Virtual Machine --------------- /home/kmp/Pharo/vms/90-x64-headless/lib/pharo CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 StackToRegisterMappingCogit VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200 Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609 VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200 CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 StackToRegisterMappingCogit VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 Any help woudl be appreciated. -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Hi, short answer: you can't (and you shouldn't) :) long answer: conceptually, a presenter does not has an extent because it is not a component by itself, is just a set of other presenters arranged into a layout. However, that does not means you can't know the extent where your athens component will be drawn! Basically, you cannot know the presenter size (or position), but you can know the extent assigned to your athens canvas because the renderer will call your drawBlock with a canvas already initialized. So, you can do something like: athensPresenter := self newAthens drawBlock: [ :aCanvas | | extent | extent := aCanvas surface extent. ... etc ... ]. But! This is poorly documented and even less used, so there may be missing parts (both bugs and things I didn't think on when I implemented the component). Please let me know if this is working for you :) cheers! Esteban On May 24 2021, at 5:18 pm, kmo <[hidden email]> wrote:
|
I'm afraid it still doesn't work for me.
If I have a drawBlock like this: drawBlock ^ [ :aCanvas | | paint surface | surface := aCanvas surface. paint := surface createLinearGradient: { (0 -> Color blue). (1 -> Color black) } start: 0 @ 0 stop: aCanvas surface extent. surface clear. aCanvas setPaint: paint. aCanvas drawShape: (0 @ 0 corner: aCanvas surface extent) ] I get just a blank canvas.- nothing is drawn. If I replace the aCanvas surface extent with a fixed size like this: drawBlock ^ [ :aCanvas | | paint surface | surface := aCanvas surface. paint := surface createLinearGradient: { (0 -> Color red). (1 -> Color green) } start: 0 @ 0 stop: 300 @ 300. surface clear. aCanvas setPaint: paint. aCanvas drawShape: (0 @ 0 corner: 300 @ 300) ] then it works. Any ideas what i might be doing wrong? -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
I should also point out that nothing works unless I also set a surfaceExtent
when the presenter is set up - initializePresenters rosesAthensPresenter := RosesAthensPresenter new. rosesAthensPresenter surfaceExtent: 400 @ 400. rosesAthensPresenter drawBlock: [ :aCanvas | | paint surface | surface := aCanvas surface. paint := surface createLinearGradient: { (0 -> Color blue). (1 -> Color black) } start: 0 @ 0 stop: 300 @ 300. surface clear. aCanvas setPaint: paint. aCanvas drawShape: (0 @ 0 corner: 300 @ 300) ]. -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Well, I noticed that it was working on gtk backend but not in morphic this works perfect: exampleResizing | extent | extent := 350@300. SpAthensPresenter new application: (SpApplication new useBackend: #Gtk); surfaceExtent: extent; drawBlock: [ :aCanvas | | paint surface | surface := aCanvas surface. paint := surface createLinearGradient: { 0->Color red. 1->Color green } start: 0@0 stop: surface extent. surface clear. aCanvas setPaint: paint. aCanvas drawShape: (0@0 corner: surface extent) ]; openWithSpec. but it does not work if you change the backend for morphic. Anyway, I submit a fix: It will be in image soon :) Esteban On May 24 2021, at 8:06 pm, kmo <[hidden email]> wrote:
|
Hi Estaban.
Thank you for your helpful and prompt replies to my problem. Unfortunately, your code does not work for me. I pasted your code into a playground. When it runs I get no errors but I get a completely blank window - no sign of the colour gradient. If I change the backend to #Morphic, I get the gradient but, as you say, it does not resize. I just seem to be very unlucky with Gtk. Ken -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Hi again, Mmm.... that should not be possible. Can you tell me how are you installing and running your gtk backend? Also, not today and not tomorrow (because I am busy), but you can contact me from thursday in discord and I can try to help you pair programming with you. Esteban On May 25 2021, at 11:43 am, kmo <[hidden email]> wrote:
|
I'm running Xubuntu 20.04. I didn't install Gtk - it comes with the OS.
I'm using the Nvidia video driver. Perhaps that has an effect. -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
x11 ? On May 25 2021, at 12:43 pm, kmo <[hidden email]> wrote:
|
and which vm? On May 25 2021, at 1:43 pm, Esteban Lorenzano <[hidden email]> wrote:
|
Here are details of X11, the Image and the VM
X11 ------- xdpyinfo | grep version version number: 11.0 X.Org version: 1.20.9 Image ----- /home/kmp/Pharo/images/gtkRoses/gtkRoses.image Pharo9.0.0 Build information: Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit) Unnamed Virtual Machine --------------- /home/kmp/Pharo/vms/90-x64-headless/lib/pharo CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 StackToRegisterMappingCogit VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200 Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609 VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200 CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 StackToRegisterMappingCogit VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021 -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Hi, So, I was able to reproduce your problem : for some reason, cairo does not answer a correct surface extent while in x11 (I didn't noticed before because I use wayland). I can hack a solution (and I will), but have fear that will cause future problems :/ Anyway, I will commit a fix and you will be able to use the surface extent message. Esteban On May 25 2021, at 1:59 pm, kmo <[hidden email]> wrote:
|
In reply to this post by Esteban Lorenzano
Hi Esteban
Do you know when the fix for the extent problem under Gtk will be in the image? I downloaded the latest Pharo 9 image a couple of days ago and, though the fix was in for the extent problem in Morphic, it still didn't work in Gtk. Thanks. Ken -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Hi, Yes, it is there. Thing is... since cairo does not informs correctly extent of surface in x11, what I did is to add an extra parameter to the drawing block, as you can see in the example : SpAthensPresenter>>#exampleResizing | extent | extent := 350@300. self new surfaceExtent: extent; drawBlock: [ :aCanvas :boundingBox | | paint surface | "Since sometimes a cairo surface does not brings the correct extent (in X11 or Windows, for example), we use the bounding box of the component." surface := aCanvas surface. paint := surface createLinearGradient: { 0->Color red. 1->Color green } start: 0@0 stop: boundingBox extent. surface clear. aCanvas setPaint: paint. aCanvas drawShape: (0@0 extent: boundingBox extent) ]; openWithSpec That was tested on Wayland and x11 and it was working properly :) Esteban On Jun 16 2021, at 2:20 pm, kmo <[hidden email]> wrote:
|
boo... format lost :P On Jun 16 2021, at 2:27 pm, Esteban Lorenzano <[hidden email]> wrote:
|
In reply to this post by Esteban Lorenzano
Many thanks esteban - works fine now in Gtk
-- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Free forum by Nabble | Edit this page |