[Lazarus] Qt/Qt5 under X11 new feature - accurate frame size

zeljko zeljko at holobit.net
Tue Apr 14 15:41:56 CEST 2020


Hi all,

Why this feature ?
1.Assume form with position poWorkAreaRect - you expect that your form
   will be shown in the middle of the screen, taking systray into account.
2.Inside FormCreate() you change your form width and height eg:
   Width := Screen.Width - (Screen.Width div 10);
   Height := Screen.Height - (Screen.Height div 10);

3.Now show your form. It's not centered but offsetted right-down by left 
border and title bar - so not in center (gtk2 has this problem too).
Problem comes from fact that x11 does not provide window frame until 
window is mapped , so we calculate eg form position with wrong values 
because we are missing complete window frame info.

Problem is visible by using GetWindowRect() anywhere in code where 
handle is allocated but window isn't mapped by window manager (x11).

There's no way to know decorations size (borders, title bar) under X11 
when window is not mapped (but eg handle exists) - so it is much 
different from eg win32 which have full frame correct even when window 
is not visible.

I've decided to fix it (thanks to more spare time those days) and 
finally I've managed GetWindowRect() (and maybe other later) to get 
accurate frame size under X11.

I set it up by using dummy widget in the background when app starts and 
creates it's Application.MainForm handle, so after Application.MainForm 
handle is created we have WM frame size.
If you don't want to use this trick then pass -disableaccurateframe to 
your app.

I've tested both qt and qt5 on Mint 19.2 64bit on KDE, cinnamon, xfce, 
openbox, lxde and xfce, and same WMs under Fedora 30 64bit and it work 
like a charm.
Note that creation of dummy widget is pretty fast on my machines (20-30 
msec) so it's not big deal in comparision to this feature. I would like 
to get some feedback about timings from older hardware and older distros 
if possible (qt or qt5).
If someone want to debug dummy widget timings add -dDEBUGQTFRAMESIZE.

Please test and report if there's any problem under x11 with qt/qt5 
(minimum is lazarus svn r62975 :)

Later, maybe gtk2 can be fixed in same way, so probably no more 
segfaults with size messages because of invalid GetWindowRect().

zeljko


More information about the lazarus mailing list