[Lazarus] Gtk 1.2 fixes (again)
Kostas Michalopoulos
badsectoracula at gmail.com
Sat Feb 12 18:25:18 CET 2022
Sending this mail again since it didn't arrive last time (can't even see
it in the archives).
This is actually my third attempt, using my gmail account now (i tried
my own email - not sure if it didn't pass through because the other one
wasn't subscribed or due to some configuration issue... the mailing list
page mentions that i only need to be subscribed to receive messages, not
to send them too so i assumed it'd work - in the former case, i wonder
how many of my replies were ignored since i switched to my own domain's
account).
---
Hi all,
I submitted some fixes for the Gtk 1.2 LCL backend here that should
bring it in working state (as it is right now it doesn't build due to
some procs being moved to other units and even after adding those it
barely works, windows get moved to 0,0, changing desktops or shading
windows is broken, opening various dialogs crashes the program and other
nice stuff :-P).
https://gitlab.com/freepascal.org/lazarus/lazarus/-/merge_requests/69
With the patch applied the IDE seems to work fine for the most part.
There are some glitches (e.g. the main window doesn't get the proper
height at first try but shading/unshading it or changing desktop and
coming back or even just changing active tab in the component palette -
basically anything that causes it to recalculate the height after it has
been visible for a bit - fixes it so it is more of an annoyance than a
blocker) but it works. Similarly it seems to use the wrong mouse cursor
in some cases.
I've also tried a bunch of examples as well as some of my own projects
and anything that didn't need functionality that wouldn't exist in Gtk
1.2 anyway seemed to work fine.
I might check those at some point but for now i wanted to fix the more
broken things, like windows not being positioned correctly, the IDE
getting minimized when switching desktops and crashing when trying to
open some forms like the console output or the Lazarus build
configuration. Especially that last one since i spend the whole day
trying to track it down (and turned out to be a bug in Gtk 1.2 that is
only triggered in specific creation order for notebook pages - which i
had to work around).
There are a couple of hacks in there that might have been done better
(but still beats the current state of not working at all :-P):
1. The Gtk 1.2 LCL backend treats the unmapping as if it was a minimize
event but that isn't strictly correct since unmapping can also happen
when a window is shaded or when the current desktop changes. In either
case you do not want all application windows to be minimized (which is
what normally happens for a minimize event). There was some code to
check for the desktop change case but there is a race condition which
triggers with modern fast desktops (i guess it was written a long time
ago) where the unmap event happens before the window manager switches
desktops. I added a check for the shaded state and... a hacky Sleep for
100ms (happens only once even with multiple unmapped windows) to avoid
the race condition :-P. Even at 10ms seemed to work but i put it at
100ms which seem safe.
2. The ScrollWindowEx function was not implemented at all and some
controls, like the tree widget seem to rely on it for visual updates
when scrolling, which in practice means that nothing scrolls when you
use the scrollbar or the mouse wheel over the control. With my patch it
still doesn't work, but i made it invalidate the control that requested
the scroll which causes it to fully draw itself (and adds the ironic
twist where the control uses ScrollWindowEx to optimize draws but ends
up doing more work instead :-P). The call still returns False (ie. it
failed) so it shouldn't break anything as the invalidation could
theoretically come from anything - ie. some overzealous window manager
or something. In theory some control could rely on scrolling to display
partial animations but that control would have been broken in Gtk 1.2
anyway.
I have also tried the OpenGL control but it doesn't seem to build. I've
spent very little time on it though but i'll try to fix it in a separate
patch.
Note that the link above also contains a link to the Gtk 1.2 libraries
(source code) that the LCL backend relies on that should compile with
current Linux OSes (though there will be some warnings). Gtk and glib
are from Slackware and with its patches applied with some minor mod and
Gdk_pixbuf (which Slackware doesn't seem to carry - or at least not the
version needed by the Gtk 1.2 backend since there is the Gtk 2.x verson)
is from an old Red Hat source distribution (might not be the latest
version but LCL doesn't seem to use it much - it might be possible to
remove the current dependency so that things work in Slackware out of
the box as it seems to be one of the very few distributions that still
ship with Gtk 1.2) that i have fixed to build and install without (much)
problem. So if you want to test it you can find the sources there (make
sure to read the README).
Kostas
More information about the lazarus
mailing list