r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[View] discuss view related issues

Henrik
4-Sep-2006
[5424]
:-( ran 2000 updates on the test version without problems.
Anton
4-Sep-2006
[5425]
Just looking at the toolbar code, I suspect the DRAW dialect, perhaps 
it is the use of FILL-PEN LINEAR ? I seem to remember a bug there...
Henrik
4-Sep-2006
[5426]
I could try disabling it...
Anton
4-Sep-2006
[5427x2]
Well, the best idea is to start with a copy of the full app, as I 
suggested above. I've done the same thing as you, trying to track 
down bugs, trying to guess what it is.
Guessing is cool but it's not as sure as subdivision.
Henrik
4-Sep-2006
[5429]
true, but it will be very time consuming...
Anton
4-Sep-2006
[5430]
Can be hard sometimes to remove certain chunks, but usually you can 
disable large chunks of code using comments, verify that the bug 
is still there, then remove the code - and repeat until there's not 
much left and the bug is obvious.
Henrik
4-Sep-2006
[5431]
well, DRAW isn't the culprit
Anton
4-Sep-2006
[5432]
Ok, so my first guess has removed a small amount of code. (wouldn't 
it be better if it was 50% of the code ? :-)
Henrik
4-Sep-2006
[5433x2]
http://hmkdesign.dk/rebol/toolbar/toolbar-demo.r<--- I don't know 
if the bug shows here
the thing is, what if it's a buffer overflow? that will be really 
hard to fix, because you might run into the bug randomly.
Anton
4-Sep-2006
[5435]
It could be. But never miss a chance to find a deterministic View 
bug. :)
Henrik
4-Sep-2006
[5436x3]
phew.. down to 500 lines of code
REBOL []

stylize/master [
  f: FACE WITH [
    do-this: does [
      insert tail pane: [] make face [
        feel: make feel [
          detect: func [face evt] [
            if evt/type = 'up [
              repeat i 5000 [
                do-this
              ]
            ]
            evt
          ]
        ]
        pane: make face []
      ]
    ]
    init: [do-this]
  ]
]
view layout [
  f 100x100
]
This is about as small as it gets for now. Run the code and click 
the gray area to crash rebol
Anton
4-Sep-2006
[5439x5]
Mmm.. that code is asking for at least 143 MB for those 5000 faces. 
:)
err... that's if a 100x100 bitmap is allocated for each of them..
Ok, this still shows the bug:
- removed stylize
- removed layout and view
- set object facets to none
view make face [
	size: 10x10 
	do do-this: does [
		insert tail pane: [] make face [
			feel: make feel [
				detect: func [face evt][
					if evt/type = 'up [
						repeat i 5000 [
							do-this
						]
					]
					evt
				]
			]
			color: edge: font: para: none
			pane: make face [color: edge: font: para: feel: none]
		]
	]
	color: edge: font: para: none
]
Click the little 10x10 box once or twice to crash.
Gabriele
5-Sep-2006
[5444x2]
is that related to the inform bug you were talking about or something 
different?
anyway - please RAMBO it.
Graham
5-Sep-2006
[5446]
is this just a recursive crash ?
Henrik
5-Sep-2006
[5447x2]
gabriele, in my program it was triggered by closing an inform window, 
but after stripping away all the code to the above, it didn't have 
anything to do with it. It merely triggered the bug accidentally.
anton, in the "insert tail pane: []" part, it will still crash, when 
using copy on that array
Anton
5-Sep-2006
[5449]
Yes, it looks like maybe the View system can't handle too much recursion 
while processing events. It's still fairly serious as it shuts down 
rebol.
Henrik
5-Sep-2006
[5450x2]
anton, interestingly also, speed has nothing to do with it. you can 
do the same thing at keyboard typing speed.
(that is, run each iteration at keyboard typing speed, not full rebol 
light speed :-))
Anton
5-Sep-2006
[5452]
must go - more investigation later... :)
Henrik
5-Sep-2006
[5453x3]
graham, some kind of buffer overflow I think. The more code that 
is used in the toolbar, the fewer iterations it requires to crash 
REBOL. In my program it takes 10-20 iterations to crash it.
if this can't be cooked any further down, I'll RAMBO it.
done
Henrik
7-Sep-2006
[5456]
does anyone have a fix for SCROLLER, so that scroller buttons don't 
move the scroller only one pixel at a time when the scrollbar is 
only slightly smaller than max size?
Anton
7-Sep-2006
[5457x6]
The STEP facet controls how much the scroll buttons change the data 
value.
view layout [scroller with [ratio: 0.9 step: 1 / 10]]
Here I set RATIO to 0.9 which represents 90% of the total data.
The calculation is     step = 1 / (total rows - visible rows)
In my scroll-table style, what I do when resizing is this:

 vscroll/ratio: rows / (1 + length? list-data) ; visible rows over 
 total
	vscroll/resize vscroll/size: (calculate new size here)
	; step = 1 / (total rows - visible rows)
	use [y][
		y: max 0 ((length? list-data) - rows)

  vscroll/step: either 0 = y [1][1 / y] ; prevent division by zero
	]
Don't be worried that the unit of my data is rows of text and not 
pixels, it should be the same calculation.
Just change: 
	total rows  (length? list-data)  -->  total height in pixels 
	visible rows  (rows)  --> visible height in pixels
Henrik
7-Sep-2006
[5463x2]
I've studied the problem now, and it's the same algorithm as I use 
in LIST-VIEW, but it's defective and causes the scroller only to 
move 1-2 pixels at a time, when the list is only slightly larger 
than the visible area. I found a different solution which was not 
to trust the step at all and use LIST-VIEW's own function to move 
the list and scroller separately, i.e. the list position is not derived 
from the scroller anymore.
I think the solution currently used in SCROLLER only works when you 
want smooth scrolling.
Anton
8-Sep-2006
[5465]
I think doing it that way can also avoid floating point rounding 
errors, which would sometimes cause two rows to be stepped instead 
of one (or the opposite, zero rows were stepped).
Henrik
13-Sep-2006
[5466]
I found an interesting scenario, that I'd like to know if it will 
be possible to fix. Maybe it's the wrong approach, but here goes:


I've wrapped an entire app in a TRY. Theoretically, then if the app 
crashes to console, it will be handled and the error disarmed. The 
error object is then sent to an INFORM window which displays a nice 
crash requester which offers you to send an error log and a description 
of what you were doing at the time of the crash to me via the internet.


This works fine for the most cases, but I noticed an error that was 
caused during a mouse drag operation. When dragging, the requester 
will pop up, but events are still flowing in the window that caused 
the error. When I release the mouse button, it then crashes one more 
time and this time brings up the console, ruining the purpose of 
my nice crash requester.


What should have happened was that the INFORM window should have 
blocked all events from other windows, so the application would stop 
to a controlled state. Is there a way to block events like this or 
is there another way around this?
Anton
13-Sep-2006
[5467x3]
Maybe clear the event port as soon as you get the first error.
.. by doing
	pick system/view/event-port 1
until it returns NONE
(Just like system/view/wake-event does)
Henrik
13-Sep-2006
[5470]
is there a guarantee that it will eventually return none?
Anton
13-Sep-2006
[5471x3]
Um... if you remove event-port from the wait-list.
remove find system/ports/wait-list system/view/event-port
You can put it back when you want to process events again.