[Pkg-pascal-devel] Bug#1126737: libgtk-3-dev: Incorrect type definition for `state` fields in Gdk-3.0.gir
Simon McVittie
smcv at debian.org
Sun Feb 1 12:33:47 GMT 2026
Control: tags -1 + moreinfo
On Sun, 01 Feb 2026 at 01:40:02 +0100, Mazen Neifer wrote:
>Building GTK bindings for Free Pascal using `git2pas` tool.
Do you mean gir2pascal, or something different? A tool of that name
doesn't seem to be packaged as a binary in Debian, although
lazarus-src-4.4 and similar packages seem to contain source code for it.
>Cheked the definition of the fields in GIR file and compared it with relevant C
>header files.
...
>There is clearly a mismatch between C and GIR files.
What do you believe to be a clear mismatch between the C and the GIR
files? When reporting a bug it's usually best to describe what the
problem is, rather than expecting a reader to guess it from a proposed
solution.
>Provided a patch to fix the issue.
The GIR XML is machine-generated from the C source, C header files and
shared library by tools in the gobject-introspection package, which are
the reference implementation of GObject-Introspection - so patching the
GIR XML by hand is not going to be the right solution to any problem.
> line="703">a bit-mask representing the state of
> the modifier keys (e.g. Control, Shift and Alt) and the pointer
> buttons. See #GdkModifierType.</doc>
>- <type name="ModifierType"/>
>+ <type name="ModifierType" c:type="GdkModifierType*"/>
> </field>
> <field name="button" writable="1">
> <doc xml:space="preserve"
If the gobject-introspection tools generate GIR XML that gir2pascal
can't cope with, then there are three possibilities:
1. C source, etc. mis-parsed by gobject-introspection;
2. wrong annotations (doc-comments) in GTK source that would have made
gobject-introspection generate the right thing if corrected;
3. gir2pascal is misinterpreting the GIR XML
Other introspected languages seem to work well, so it seems most likely
that you're encountering some sort of gir2pascal problem.
For the part of your patch quoted above, I believe it's referring to the
GIR XML describing the GtkEventButton struct:
<record name="EventButton" c:type="GdkEventButton">
... more fields ...
<field name="state" writable="1">
<type name="ModifierType"/>
</field>
... more fields ...
</record>
This seems like something that gir2pascal might reasonably be expected
to be able to cope with: although the c:type of this field is not
explicitly given in the GIR XML, gir2pascal should be able to infer that
it's the same bit-representation as the <bitfield name="ModifierType">
that appears elsewhere in the file.
Adding `c:type="GdkModifierType*"` is certainly wrong: the field is a
GdkModifierType (an integer, in practice 32 bits, containing flags), but
you seem to be saying that you believe it should be a pointer to a
GdkModifierType (in practice usually 64 bits). That isn't even the same
memory layout...
In fact the field is declared as `guint` rather than `GdkModifierType`
in the C source, but the doc-comment overrides it to be treated as
GdkModifierType by introspection (something that was done intentionally
by the GTK maintainers), and the whole GLib, GObject,
GObject-Introspection ecosystem has an architectural assumption that
enums are the same size as `int` and `unsigned int`.
smcv
More information about the Pkg-pascal-devel
mailing list