Compare commits

...

2 Commits

Author SHA1 Message Date
Matthias Clasen
996798b901 image: Stop using gtk_image_clear in finalize
This causes criticals with recent glib.
So do the same things clear() does, manually.
2023-02-19 12:44:30 -05:00
Julian Sparber
9d6a67e3bf gtk-builder-tool-validate: Use GtkBuilder to find parent class
This allows `LD_PRELOAD` to be used to load an additional libarary, and
therefore it's possible to validate composite templates that subclass a
class that's not part of gtk.
2022-10-05 16:02:00 +02:00
2 changed files with 31 additions and 6 deletions

View File

@@ -290,12 +290,35 @@ gtk_image_init (GtkImage *image)
image->icon_helper = gtk_icon_helper_new (widget_node, GTK_WIDGET (image)); image->icon_helper = gtk_icon_helper_new (widget_node, GTK_WIDGET (image));
} }
static void gtk_image_paintable_invalidate_contents (GdkPaintable *paintable,
GtkImage *image);
static void gtk_image_paintable_invalidate_size (GdkPaintable *paintable,
GtkImage *image);
static void static void
gtk_image_finalize (GObject *object) gtk_image_finalize (GObject *object)
{ {
GtkImage *image = GTK_IMAGE (object); GtkImage *image = GTK_IMAGE (object);
gtk_image_clear (image); g_free (image->filename);
g_free (image->resource_path);
if (_gtk_icon_helper_get_storage_type (image->icon_helper) == GTK_IMAGE_PAINTABLE)
{
GdkPaintable *paintable = _gtk_icon_helper_peek_paintable (image->icon_helper);
const guint flags = gdk_paintable_get_flags (paintable);
if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
g_signal_handlers_disconnect_by_func (paintable,
gtk_image_paintable_invalidate_contents,
image);
if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
g_signal_handlers_disconnect_by_func (paintable,
gtk_image_paintable_invalidate_size,
image);
}
g_clear_object (&image->icon_helper); g_clear_object (&image->icon_helper);

View File

@@ -31,13 +31,14 @@
#include "gtk-builder-tool.h" #include "gtk-builder-tool.h"
static GType static GType
make_fake_type (const char *type_name, make_fake_type (GtkBuilder *builder,
const char *type_name,
const char *parent_name) const char *parent_name)
{ {
GType parent_type; GType parent_type;
GTypeQuery query; GTypeQuery query;
parent_type = g_type_from_name (parent_name); parent_type = gtk_builder_get_type_from_name (builder, parent_name);
if (parent_type == G_TYPE_INVALID) if (parent_type == G_TYPE_INVALID)
{ {
g_printerr ("Failed to lookup template parent type %s\n", parent_name); g_printerr ("Failed to lookup template parent type %s\n", parent_name);
@@ -65,12 +66,14 @@ do_validate_template (const char *filename,
GError *error = NULL; GError *error = NULL;
int ret; int ret;
builder = gtk_builder_new ();
/* Only make a fake type if it doesn't exist yet. /* Only make a fake type if it doesn't exist yet.
* This lets us e.g. validate the GtkFileChooserWidget template. * This lets us e.g. validate the GtkFileChooserWidget template.
*/ */
template_type = g_type_from_name (type_name); template_type = gtk_builder_get_type_from_name (builder, type_name);
if (template_type == G_TYPE_INVALID) if (template_type == G_TYPE_INVALID)
template_type = make_fake_type (type_name, parent_name); template_type = make_fake_type (builder, type_name, parent_name);
object = g_object_new (template_type, NULL); object = g_object_new (template_type, NULL);
if (!object) if (!object)
@@ -79,7 +82,6 @@ do_validate_template (const char *filename,
exit (1); exit (1);
} }
builder = gtk_builder_new ();
ret = gtk_builder_extend_with_template (builder, object , template_type, " ", 1, &error); ret = gtk_builder_extend_with_template (builder, object , template_type, " ", 1, &error);
if (ret) if (ret)
ret = gtk_builder_add_from_file (builder, filename, &error); ret = gtk_builder_add_from_file (builder, filename, &error);