I've been revisiting a clim project from 15 years ago which was to provide clim graphics to Dan Corkhill's very nice GBBopen blackboard system. I have an initial version now working nicely on Lispworks clim-2.0 on Windows. It is close to running with McCLIM as well.
I have two issues, updating-output appears to work in that the :cache-test is respected but where Lispworks clim calls clear-output-record when a displayed object moves or is deleted McCLIM does not do so. I have attached a simple demo that shows that problem. Just click right or left anywhere in the pane to move the green disk left or right to see the problem.
The other issue is that redisplay-frame-pane (not used in the demo) always causes an infinite recursion that finally results in a blown stack. Part of the problem is with window-clear which in addition to using medium-clear-area, etc to clear the screen also sets window size to zero and then calls compose-space. I have an :around method that avoids that problem but the redisplay recursion persists. My workaround for that is to just call the display function directly but that does not allow updating-output to work correctly.
Paul
Hey Paul,
regarding the attached code: why do you expect a call to clear-output-record when it is only moved around? how the issue is visible in the attached code (except for that (trace clear-output-record) doesn't yield anything).
Mind that recently I rewrote parts of the incremental redisplay to fix some issues - I'm not sure whether these changes are already propagated to quicklisp.
btw when you draw the border it makes the window bigger with each iteration, because the line thickness is 1 and it is not filled, so drawing (x1 y1 x2 y2) actually covers the area (x1 y1 x2+1 y2+1).
As of the second issue, could you supply a code that triggers the issue? Thanks!
Best regards, Daniel
-- Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland TurtleWare - Daniel Kochmański | www.turtleware.eu
"Be the change that you wish to see in the world." - Mahatma Gandhi
------- Original Message ------- On Friday, January 28th, 2022 at 19:26, Paul Werkowski pw@snoopy.qozzy.com wrote:
I've been revisiting a clim project from 15 years ago which was to provide clim graphics to Dan Corkhill's very nice GBBopen blackboard system. I have an initial version now working nicely on Lispworks clim-2.0 on Windows. It is close to running with McCLIM as well.
I have two issues, updating-output appears to work in that the :cache-test is respected but where Lispworks clim calls clear-output-record when a displayed object moves or is deleted McCLIM does not do so. I have attached a simple demo that shows that problem. Just click right or left anywhere in the pane to move the green disk left or right to see the problem.
The other issue is that redisplay-frame-pane (not used in the demo) always causes an infinite recursion that finally results in a blown stack. Part of the problem is with window-clear which in addition to using medium-clear-area, etc to clear the screen also sets window size to zero and then calls compose-space. I have an :around method that avoids that problem but the redisplay recursion persists. My workaround for that is to just call the display function directly but that does not allow updating-output to work correctly.
Paul
Hey Paul,
regarding the attached code: why do you expect a call to clear-output-record when it is only moved around? how the issue is visible in the attached code (except for that (trace clear-output-record) doesn't yield anything).
Just noting that LispWorks CLIM calls clear-output-record restoring the previously drawn area. That may be from LispWorks CLIM using redisplay-output-record ,as shown in the following trace, which is supposed to take care to restore anything previously covered. I don't a clear understanding of how all this works as yet.
UTEST 5 > (testme) 0 CLEAR-OUTPUT-RECORD > ... >> CLIM-INTERNALS::RECORD : #<STANDARD-TREE-OUTPUT-HISTORY /x 0:0 y 0:0/ 22B34603> 0 CLEAR-OUTPUT-RECORD < ... << VALUE-0 : 0 draw-unit #<TEST-UNIT <150 150>> --draw-circle draw-unit #<TEST-UNIT <250 50>> --draw-circle
Now I click right once.
0 REDISPLAY-OUTPUT-RECORD > ... >> CLIM-INTERNALS::RECORD : #<STANDARD-UPDATING-OUTPUT-RECORD /x 0:301 y 0:301/ 22D6E923> >> STREAM : #<EXAMPLE-PANE 22E3274B> >> CLIM-INTERNALS::CHECK-OVERLAPPING : T 1 CLEAR-OUTPUT-RECORD > ... >> CLIM-INTERNALS::RECORD : #<STANDARD-UPDATING-OUTPUT-RECORD /x 0:301 y 0:301/ 22D6E923> 1 CLEAR-OUTPUT-RECORD < ... << VALUE-0 : 0 draw-unit #<TEST-UNIT <145.0 150>> 1 CLEAR-OUTPUT-RECORD > ... >> CLIM-INTERNALS::RECORD : #<STANDARD-UPDATING-OUTPUT-RECORD /x 140.0:162.0 y 140.0:162.0/ 22C61A13> 1 CLEAR-OUTPUT-RECORD < ... << VALUE-0 : NIL 1 CLEAR-OUTPUT-RECORD > ... >> CLIM-INTERNALS::RECORD : #<STANDARD-PRESENTATION UNIT #<TEST-UNIT <145.0 150>> /x 140.0:162.0 y 140.0:162.0/ 22C60F2F> 1 CLEAR-OUTPUT-RECORD < ... << VALUE-0 : NIL --draw-circle draw-unit #<TEST-UNIT <250 50>> 0 REDISPLAY-OUTPUT-RECORD < ... << VALUE-0 : NIL
On 2/1/2022 5:23 AM, Daniel Kochmański wrote:
Mind that recently I rewrote parts of the incremental redisplay to fix some issues - I'm not sure whether these changes are already propagated to quicklisp.
I don't use quicklisp but do use github desktop to check on things. I found a bunch of changes yesterday and found that my hack of calling the display function for redisplay now works where before changes made to the display were computed but not shown on the screen. I had observed a lot of stuff in the output record cache that I could not account for which is now gone.
btw when you draw the border it makes the window bigger with each iteration, because the line thickness is 1 and it is not filled, so drawing (x1 y1 x2 y2) actually covers the area (x1 y1 x2+1 y2+1).
I had not even noticed that problem! Thanks for the info.
As of the second issue, could you supply a code that triggers the issue? Thanks!
That would be redisplay-frame-pane causing infinite recursion. I shall work something up.
Thanks for looking at this.
Paul
For the recursion problem:
I add the following to the example code (complete example attached)
(defmethod resize-sheet :after ((sheet example-pane) w h) (declare (ignore w h)) ;;(clear-window) (redisplay-frame-pane (pane-frame sheet) sheet))
I use this when I want to display to expand/shrink via pointer motion.
Here, just running (testme) results in blowing stack. LispWorks CLIM works fine.
Paul