On 7/15/22 14:47, Anthony Walter via lazarus wrote:
Denis,

I will attempt the big design flaws [...]
Now here is the first big problem with the Gtk3 widgetset as implemented. Somehow someone decided it would be a neat idea to add a 4th piece just for Gtk3. [...]

This isn't a flaw, the approach the Gtk3 backend has makes sense if you consider that it is trying to avoid all the special case functionality for what essentially mimicing the Win32 API in an increasingly (in every major version) weird and "non-Win32-like" API.

In a way the Gtk1 and Gtk2 widgetsets do it too but if anything they do it in a messier way because for anything non-trivial they allocate a separate TWidgetInfo object (a record) that they map between the Gtk1/Gtk base widget and the LCL functionality/data that needs to emulate the Win32 behavior all the time when that data is needed with the source code being littered with calls like "GetOrCreateWidgetInfo(handle)".

The Gtk3 widgetset instead of doing that uses the OOP functionality that Free Pascal had for decades now :-P to avoid doing that runtime mapping and put widget-specific functionality in its own class. Otherwise that functionality would need to be spread all over the place - especially for calls that assume that a call with HWND would apply to all widgets the same way.

Also about that "just for Gtk3", in fact it isn't just the Gtk3 backend that takes the OOP approach with a custom class per control - from a quick look, the Qt, Qt5, FPGUI, Carbon and MUI widgetsets take that approach too.

Just make the control handle an actual reference to the underlying system toolkit handle, and please DO NOT attempt to recreate another object hierarchy
While it can be a minor surprise, in practice you are already dealing with widgetset-specific functionality anyway and you should always keep the widgetset itself "in the loop" - meaning that even if you try to bypass it, you still need to know what the widgetset does. And again, if anything, the Gtk3 approach still seems better because control has its own class for the underlying widgets which makes it easier to find what is going on.

Kostas
--
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to