DrawingArea Internal Behaviour

Here is more information about the DrawingArea internal stuffs.

It is related to the way qt manages draw events sent by the X Server.

First, you must know that a draw event is a rectangle in your window that you must redraw.

Then there is two ways:

  1. All X11 draw events are merged by QT into a Region object, that is not rectangular, and then the QT paint event is called, and thus the Gambas Draw event. All drawings during the draw event handler will be clipped by this region.

    It worked like that before my modifications.

  2. QT merges nothing, and you get one Gambas draw event for each X11 draw event. The drawing is clipped by the rectangle.

    It works like that now.

Why doing that ?

Logically, during the drawing event handler, you have to draw the less possible things to speed up the drawing.

The only way in Gambas to know what to draw is using the Clip property. of the Draw class.

In the first case, as drawing is clipped by the region, Draw.Clip.[X/Y/W/H] returns the smallest rectangle that includes the region.

But, for example, when you enlarge a little a window, the region contains two rectangles: one at the right of the window, the other at the bottom. And so, the including rectangle is the entire window!

+--------------------------------+---+
|                                | x |      xxx = The region used by Qt
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                    Old size    | x |
|                                | x |
+--------------------------------+ x |
|xxxxxxxxxxxxxxxxxxxxx New size xxxx |
+------------------------------------+

When you can easily draw any sub-rectangle of your drawing area, the second way is the better.

When you can't easily do that, i.e. when your drawing is too complex to be easily splitted into a rectangle, you prefer drawing everything each time you receive a Draw event. And so, you do the job twice or more times comparing to the first way. So it is twice or more slower.

The solution is having a property in the DrawingArea to tell it merging or not drawing events.

This is the merge ? property.