GTK+3 replacing/swapping pixbuf seems to break

0

I have a simple GTK3 grid layout using images as buttons and I want to replace the images when various things happen.

What's weird is that this works fine if I replace/remove the image from the same piece of code each time but not when I alternate between the two different sources despite (as far as I can see) everything being almost identical.

Anyway, here's my code...

Initial setup - create pixbuf, make it an image, attach it to the button - this works fine:

/*
 * Initial setup
 *
 * dbp is a pointer to a struct that contains the button, the pixbuf, etc.
 */

// Create new blank (&transprent) image
dbp->pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, innerButton.width, innerButton.height);
gdk_pixbuf_fill(dbp->pixbuf, 0x00000000);

// Image holds pixbuf
dbp->image = (GtkImage*)gtk_image_new_from_pixbuf(dbp->pixbuf);

// Attach image to button
gtk_button_set_image(GTK_BUTTON(dbp->btn), GTK_WIDGET(dbp->image));

// Attach button to grid
gtk_grid_attach(GTK_GRID(_grid), dbp->btn, c, r, 1, 1);

Clear image code - blanks the image (transparent):

gdk_pixbuf_fill(dbp->pixbuf, 0x00000000);

Button refresh callback (updates image from pixbuf):

if(dbp->image_modified != 0)
{
    gtk_image_set_from_pixbuf(GTK_IMAGE(dbp->image), dbp->pixbuf);
    dbp->image_modified = 0;
}

1st image replacement code - takes data input in our own format & creates new pixbuf:

GdkPixbuf *newpixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, BITMAP_WIDTH, BITMAP_HEIGHT);
g_object_unref(dbp->pixbuf);
// <Data unpacked to pixels here, code removed for clarity>
dbp->pixbuf = gdk_pixbuf_copy(newpixbuf);
gdk_pixbuf_copy_options(newpixbuf , dbp->pixbuf);
dbp->image_modified = 1; // Trigger refresh

2nd image replacement - loads image from file and creates new pixbuf:

GdkPixbuf *newpixbuf = gdk_pixbuf_new_from_file_at_scale (file_path, BITMAP_WIDTH, BITMAP_HEIGHT, FALSE, &err);
// [Error check code removed for clarity]
g_object_unref(dbp->pixbuf);
dbp->pixbuf = gdk_pixbuf_copy(newpixbuf );
gdk_pixbuf_copy_options(newpixbuf , dbp->pixbuf);
dbp->image_modified = 1; // Trigger refresh

Now, if I do repeated calls to these routines I get odd interactions;

If I do clear, image_replace_1, clear, image_replace_1, clear, image_replace_1 etc... it works absolutely perfectly.

If I do clear, image_replace_2, clear, image_replace_2, clear, image_replace_2 etc... it works absolutely perfectly.

However, when I do:

If I do clear, image_replace_1, clear, image_replace_2, clear, image_replace_1... it falls over with complaints that GDK_IS_PIXBUF(pixbuf) failed and I can't for the life of me work out how that happens?

I have also tried this alternative code for the button refresh callback;

dbp->image = (GtkImage*)gtk_image_new_from_pixbuf(dbp->pixbuf);
gtk_button_set_image(GTK_BUTTON(dbp->btn), GTK_WIDGET(dbp->image));

But the result is the same.

c
user-interface
gtk
gtk3
asked on Stack Overflow Dec 22, 2020 by John U

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0