`gtk_builder_get_parameters()` is a hot path, being called twice for
each object in each UI file in an application. The majority of objects
have ≤ 8 properties, which are each filtered into either `parameters` or
`filtered_parameters`.
Unfortunately, both of those arrays are created as empty `GArray`s, and
adding 8 elements to an empty `GArray` hits the worst possible case of
reallocating and `memcpy()`ing the array 3 times. As the array size is
doubled with each reallocation, the cost is not particularly well
amortised when the array size is small.
From the `ObjectInfo`, we actually know how many properties there are in
total, so just allocate the arrays at the right size to begin with.
This saves 7% of the instruction cycles needed to start up
gnome-software to the point where it’s showing its main window,
according to callgrind. gnome-software is making around 5500 calls to
`gtk_builder_get_parameters()`.
Signed-off-by: Philip Withnall <withnall@endlessm.com>
Add a convenience function that is like gtk_builder_get_object()
but stashes away a GError if a lookup fails. To make the error
message informative, the function takes a line/column pair.
Doing things this way is necessary because the custom_tag_end,
custom_finished, and parser_finished vfuncs don't take a
GError parameter, despite being called from a place where
we can report a GError back.
Added GTK_BUILDER_ERROR_INVALID_PROPERTY and GTK_BUILDER_ERROR_INVALID_SIGNAL
error codes
ObjectInfo: Use a GType instead of a char * for the class name.
PropertyInfo: Use a GParamSpec instead of a char * for the property name.
SignalInfo: Use signal id and detail quark instead of a detailed signal name string.
This not only save us a few malloc in each case but lets us simplify the code
and report unknown properties and signals as a parsing error instead of just
printing a warning.
Binding an object sensitive property with a check button active property will look like this:
<object class="GtkButton" id="button">
<property name="sensitive" bind-source="checkbutton" bind-property="active"/>
</object>
This is based on the original work done by Denis Washington for his GSoC project
This closes Bug 654417 "[GSoC] Add <binding> element to GtkBuilder syntax"
One requirement of .ui files is that each object must have an ID,
even if it is never referred to or directly loaded from the code.
This makes editing .ui files much more onerous than it has to be,
due to the frequent need to invent new IDs, while avoiding
clashes.
This commit makes IDs optional in the XML. They only need to
be provided for objects which are referred to or explictly loaded
from the code. Since GtkBuilder needs IDs for its own internal
accounting, we create IDs of the form ___object_N___ if not
specified in the XML.
https://bugzilla.gnome.org/show_bug.cgi?id=712553
Pointed out in https://bugzilla.gnome.org/show_bug.cgi?id=699016
The fix here is slightly different. We make
_gtk_builder_parser_translate return a const char * instead of
a dup'ed string, and fix up the callers.
This adds the definition of the <template> tag with some documentation
on the variant of the format.
_gtk_builder_extend_with_template() is to be used while GtkContainer
builds from composite templates. A couple of error codes are also added
to handle a few new possible failure cases.
DTD Files gtkbuilder.rnc and gtkbuilder.rng have been updated to include
the new <template> tag and it's attributes.
Change the format of GtkBuilder <menu> to be more in-line with the style
of the rest of GtkBuilder so that we can do translation in a consistent
way.
The format is now substantially more difficult to hand-write, but tools
should be along soon.
There is an xslt program attached to the bug to help you convert your
existing .ui files from the old format to the new one.
https://bugzilla.gnome.org/show_bug.cgi?id=668696
There are new calls to load ui files from resources, and
you can now read pixbufs by using relative paths in a ui
file read from a resource, or by using absolute resource:/// uris.
This makes GtkBuilder accept a GMenuMarkup tree at the toplevel
(ie with <menu id='foo'> being a child of <interface>) and the resulting
GMenu object can be obtained via gtk_builder_get_object (builder, "foo").
2008-07-15 Paolo Borelli <pborelli@katamail.com>
Bug 447998 - GtkBuilder does not support building parts of the xml tree
* gtk/gtkbuilder.c:
* gtk/gtkbuilder.h:
* gtk/gtkbuilderprivate.h:
* gtk/gtkbuilderparser.c:
* gtk/gtk.symbols:
Add two new functions that allow cherry picking and construct
objects from a ui description file or string.
* gtk/tests/builder.c: tests for the above.
svn path=/trunk/; revision=20845
2008-06-23 Michael Natterer <mitch@imendio.com>
* gtk/gtkaction.h
* gtk/gtkbuildable.h
* gtk/gtkbuilderprivate.h
* gtk/gtkcelllayout.h
* gtk/gtkentrycompletion.h
* gtk/gtkfilechoosersettings.h
* gtk/gtkfilesystem.h
* gtk/gtkfilesystemmodel.h
* gtk/gtkicontheme.h
* gtk/gtklinkbutton.h
* gtk/gtkpagesetup.h
* gtk/gtkpapersize.h
* gtk/gtkprintcontext.h
* gtk/gtkprintoperation.h
* gtk/gtkprintoperationpreview.h
* gtk/gtkprintsettings.h
* gtk/gtkrecentchooserprivate.h
* gtk/gtkrecentmanager.h
* gtk/gtksearchengine.h
* gtk/gtktexttag.h
* gtk/gtktreeselection.h
* gtk/gtktreeviewcolumn.h
* gtk/gtkuimanager.h: remove redundant inclusion of <glib.h> and
<glib-object.h>. There is no point in relying on them being pulled
in by other headers in some places and placing them explicitly in
other places, so choose the "as little includes as possible"
approach and get rid of them.
svn path=/trunk/; revision=20675
* gtk/gtkbuilderprivate.h, gtk/gtkbuilder.h, gtk/gtkbuilderparser.c:
Added support for parsing required toolkit versions (so that ui descriptions
can target specific versions of the backend widget libraries) bug 527612.
* gtk/docs/reference/gtk/tmpl/gtkbuilder.sgml: Added documentation
for the added xml tags to the ui description.
svn path=/trunk/; revision=20152
2008-03-14 Michael Natterer <mitch@imendio.com>
* gdk/gdkspawn.h
* gtk/gtkbuilderprivate.h
* gtk/gtkfilechoosersettings.c
* gtk/gtksearchenginesimple.c
* gtk/tests/liststore.c
* gtk/tests/treestore.c: remove single-file includes of GLib
headers or replace them by <glib.h> where needed.
svn path=/trunk/; revision=19877
2008-03-07 Johan Dahlin <johan@gnome.org>
* gtk/gtkbuilder.c:
* gtk/gtkbuilderparser.c:
* gtk/gtkbuilderprivate.h:
* gtk/gtkiconfactory.c:
* tests/buildertest.c:
- Treat enums like enums and not values
- Avoid invalid free, in case of more than two sources
- Add better error messages
- Add much improved tests
(#520979, Christian Persch)
svn path=/trunk/; revision=19732
2008-03-06 Johan Dahlin <jdahlin@async.com.br>
* docs/reference/gtk/tmpl/gtkiconfactory.sgml:
* gtk/gtkbuilder.c:
* gtk/gtkbuilderprivate.h:
* gtk/gtkiconfactory.c:
* tests/buildertest.c:
Implement GtkBuildable on GtkIconFactory, to make
it possible to register custom stock icons.
Fixes#517066
svn path=/trunk/; revision=19726
2008-02-29 Johan Dahlin <johan@gnome.org>
* demos/gtk-demo/demo.ui:
* gtk/gtkbuilderparser.c:
* gtk/gtkbuilderprivate.h:
* gtk/gtkliststore.c:
* tests/buildertest.c:
Add translatable/context and comment attributes on
<col> tags under a GtkListStore. Refactor parts of the
translation api and make it available inside gtk+ itself.
Update tests and example.
Fixes a part of #518642
svn path=/trunk/; revision=19685
2008-02-29 Johan Dahlin <johan@gnome.org>
* gtk/gtkbuilder.c:
* gtk/gtkbuilderparser.c:
* gtk/gtkbuilderprivate.h:
Do not use g_error for a few more errors, instead set
the GError sent in through add_from_file/add_from_string.
* tests/buildertest.c:
Add a couple of new parsing tests.
(#519199, Pavel Syomin)
svn path=/trunk/; revision=19681
* gtk/gtkbuilder.c, gtk/gtkbuilderprivate.h: Use proper sign
for value argument of _gtk_builder_flags_from_string.
* gtk/gtkwidget.c: Don't alias the child pointer passed
to gdk_window_get_user_data.
svn path=/trunk/; revision=19306