Fri, 01 Apr 2022 01:14:35 -0500
Add gdk-pixbuf as a libpurple dependency and move helpers from pidgin to purple
Adding gdk-pixbuf as a dependency to libpurple is kind of questionable, but it's dependencies are really just libpng, libjpeg, and libtiff. In other words, nothing UI specific. Which means we can remove a bunch of API with this change which is awesome.
This is the first step in replacing `PurpleImage` with `GdkPixbuf`. Which will also eventually include `PurpleBuddyIcon` and remove the need for `PurpleBuddyIconSpec` as protocol plugins will just be able to scale and format images themselves.
* Move `pidgingdkpixbuf.[ch]` to `purplegdkpixbuf.[ch]`
* Renamed all function from `purplegdkpixbuf.[ch]` to be in the purple_gdk_pixbuf namespace
* Removed all unused function from `purplegdkpixbuf.[ch]`
I also did some research on how much disk space adding gdkpixbuf would add.
The base is a base debian container and this is against libpurple2 which is obviously going to be different. But the question was how much additional disk space will be used by adding gdkpixbuf.
```
base: 157680
bitlbee: 216452
bitlbee+gdkpixbuf: 222388
bitlbee-purple *: 363860
bitlbee-purple+gdkpixbuf *: 369796
* --no-install-recommends
```
We can see that for gdkpixbuf will about about 6MB of of disk usage which I would hope would be acceptable when libpurple adds 141MB by itself.
Testing Done:
Ran and verified that an animated buddy icon was still displayed properly in the infopane and the buddy list.
Reviewed at https://reviews.imfreedom.org/r/1224/
--- a/ChangeLog.API Fri Apr 01 01:09:23 2022 -0500 +++ b/ChangeLog.API Fri Apr 01 01:14:35 2022 -0500 @@ -14,6 +14,12 @@ libpurple: Added: * displaying-emails-clear signal (notification signal) + * purple_gdk_pixbuf_make_round + * purple_gdk_pixbuf_is_opaque + * purple_gdk_pixbuf_from_data + * purple_gdk_pixbuf_from_image + * purple_gdk_pixbuf_new_from_file + * purple_gdk_pixbuf_new_from_file_at_size * PurplePluginInfoFlags (PURPLE_PLUGIN_INFO_FLAGS_INTERNAL and PURPLE_PLUGIN_INFO_FLAGS_AUTO_LOAD) * purple_plugin_get_dependent_plugins @@ -742,7 +748,6 @@ Added: * pidgin_create_webview * PidginDockletFlag - * pidgin_gdk_pixbuf_new_from_image * PidginPluginInfo, inherits PurplePluginInfo * Various WebKit-related functions in gtkwebview.h @@ -885,6 +890,15 @@ * pidgin_dialogs_alias_contact * pidgin_dialogs_log * pidgin_get_dim_grey_string + * pidgin_gdk_pixbuf_make_round, use purple_gdk_pixbuf_make_round instead. + * pidgin_gdk_pixbuf_is_opaque, use purple_gdk_pixbuf_is_opaque instead. + * pidgin_pixbuf_from_data, use purple_gdk_pixbuf_from_data instead. + * pidgin_pixbuf_anim_from_data + * pidgin_pixbuf_from_image, use purple_gdk_pixbuf_from_image instead. + * pidgin_pixbuf_new_from_file, use purple_gdk_pixbuf_new_from_file instead. + * pidgin_pixbuf_new_from_file_at_size, use purple_gdk_pixbuf_new_from_file_at_size instead. + * pidgin_pixbuf_new_from_file_at_scale + * pidgin_pixbuf_scale_down * PIDGIN_ICON_SIZE_* * PIDGIN_ICON_THEME * PIDGIN_ICON_THEME_CLASS
--- a/libpurple/meson.build Fri Apr 01 01:09:23 2022 -0500 +++ b/libpurple/meson.build Fri Apr 01 01:14:35 2022 -0500 @@ -51,6 +51,7 @@ 'purplecredentialmanager.c', 'purplecredentialprovider.c', 'purpledebugui.c', + 'purplegdkpixbuf.c', 'purplehistoryadapter.c', 'purplehistorymanager.c', 'purpleidleui.c', @@ -144,6 +145,7 @@ 'purplecredentialmanager.h', 'purplecredentialprovider.h', 'purpledebugui.h', + 'purplegdkpixbuf.h', 'purplehistoryadapter.h', 'purplehistorymanager.h', 'purpleidleui.h', @@ -298,7 +300,7 @@ version : PURPLE_LIB_VERSION, dependencies : # static_link_libs [dnsapi, ws2_32, glib, gio, gplugin_dep, libsoup, - libxml, gstreamer, gstreamer_video, + libxml, gdk_pixbuf, gstreamer, gstreamer_video, gstreamer_app, json, sqlite3, math]) install_headers(purple_coreheaders, @@ -316,7 +318,7 @@ # TODO: Only use purple_filebase once everything is ported to only use purple.h subdirs : [purple_filebase, purple_include_base], # NOTE: Don't use gplugin from pkgconfig, as it might be a subproject. - requires : [glib, 'gplugin'], + requires : [glib, gdk_pixbuf, 'gplugin'], variables : ['plugindir=${libdir}/@0@'.format(purple_filebase)]) if enable_introspection @@ -325,7 +327,7 @@ libpurple_gir = gnome.generate_gir(libpurple, sources : introspection_sources, - includes : ['GLib-2.0', 'Gio-2.0', 'GObject-2.0', 'Gst-1.0', 'GPlugin-1.0'], + includes : ['GdkPixbuf-2.0', 'GLib-2.0', 'Gio-2.0', 'GObject-2.0', 'Gst-1.0', 'GPlugin-1.0'], header : 'purple.h', namespace : 'Purple', symbol_prefix : 'purple', @@ -345,7 +347,7 @@ sources : [purple_builtheaders] + purple_generated_sources, include_directories : [toplevel_inc, libpurple_inc], link_with : libpurple, - dependencies : [gstreamer, gplugin_dep, glib, gio]) + dependencies : [gdk_pixbuf, gstreamer, gplugin_dep, glib, gio]) meson.override_dependency(purple_filebase, libpurple_dep)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/purplegdkpixbuf.c Fri Apr 01 01:14:35 2022 -0500 @@ -0,0 +1,235 @@ +/* + * Purple - Internet Messaging Library + * Copyright (C) Pidgin Developers <devel@pidgin.im> + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + */ + +#include "libpurple/purplegdkpixbuf.h" + +#include "debug.h" + +void purple_gdk_pixbuf_make_round(GdkPixbuf *pixbuf) { + gint width, height, rowstride; + guchar *pixels; + + if (!gdk_pixbuf_get_has_alpha(pixbuf)) { + return; + } + + width = gdk_pixbuf_get_width(pixbuf); + height = gdk_pixbuf_get_height(pixbuf); + rowstride = gdk_pixbuf_get_rowstride(pixbuf); + pixels = gdk_pixbuf_get_pixels(pixbuf); + + if (width < 6 || height < 6) { + return; + } + + /* The following code will convert the alpha of the pixel data in all + * corners to look something like the following diagram. + * + * 00 80 c0 FF FF c0 80 00 + * 80 FF FF FF FF FF FF 80 + * c0 FF FF FF FF FF FF c0 + * FF FF FF FF FF FF FF FF + * FF FF FF FF FF FF FF FF + * c0 FF FF FF FF FF FF c0 + * 80 FF FF FF FF FF FF 80 + * 00 80 c0 FF FF c0 80 00 + */ + + /* Top left */ + pixels[3] = 0; + pixels[7] = 0x80; + pixels[11] = 0xC0; + pixels[rowstride + 3] = 0x80; + pixels[rowstride * 2 + 3] = 0xC0; + + /* Top right */ + pixels[width * 4 - 1] = 0; + pixels[width * 4 - 5] = 0x80; + pixels[width * 4 - 9] = 0xC0; + pixels[rowstride + (width * 4) - 1] = 0x80; + pixels[(2 * rowstride) + (width * 4) - 1] = 0xC0; + + /* Bottom left */ + pixels[(height - 1) * rowstride + 3] = 0; + pixels[(height - 1) * rowstride + 7] = 0x80; + pixels[(height - 1) * rowstride + 11] = 0xC0; + pixels[(height - 2) * rowstride + 3] = 0x80; + pixels[(height - 3) * rowstride + 3] = 0xC0; + + /* Bottom right */ + pixels[height * rowstride - 1] = 0; + pixels[(height - 1) * rowstride - 1] = 0x80; + pixels[(height - 2) * rowstride - 1] = 0xC0; + pixels[height * rowstride - 5] = 0x80; + pixels[height * rowstride - 9] = 0xC0; +} + +gboolean +purple_gdk_pixbuf_is_opaque(GdkPixbuf *pixbuf) { + gint height, rowstride, i; + guchar *pixels; + guchar *row; + + if (!gdk_pixbuf_get_has_alpha(pixbuf)) { + return TRUE; + } + + height = gdk_pixbuf_get_height (pixbuf); + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + pixels = gdk_pixbuf_get_pixels (pixbuf); + + /* check the top row */ + row = pixels; + for (i = 3; i < rowstride; i+=4) { + if (row[i] < 0xfe) { + return FALSE; + } + } + + /* check the left and right sides */ + for (i = 1; i < height - 1; i++) { + row = pixels + (i * rowstride); + if (row[3] < 0xfe || row[rowstride - 1] < 0xfe) { + return FALSE; + } + } + + /* check the bottom */ + row = pixels + ((height - 1) * rowstride); + for (i = 3; i < rowstride; i += 4) { + if (row[i] < 0xfe) { + return FALSE; + } + } + + return TRUE; +} + +static GObject *purple_gdk_pixbuf_from_data_helper(const guchar *buf, gsize count, gboolean animated) +{ + GObject *pixbuf; + GdkPixbufLoader *loader; + GError *error = NULL; + + loader = gdk_pixbuf_loader_new(); + + if (!gdk_pixbuf_loader_write(loader, buf, count, &error) || error) { + purple_debug_warning("gtkutils", "gdk_pixbuf_loader_write() " + "failed with size=%" G_GSIZE_FORMAT ": %s\n", count, + error ? error->message : "(no error message)"); + if (error) + g_error_free(error); + g_object_unref(G_OBJECT(loader)); + return NULL; + } + + if (!gdk_pixbuf_loader_close(loader, &error) || error) { + purple_debug_warning("gtkutils", "gdk_pixbuf_loader_close() " + "failed for image of size %" G_GSIZE_FORMAT ": %s\n", count, + error ? error->message : "(no error message)"); + if (error) + g_error_free(error); + g_object_unref(G_OBJECT(loader)); + return NULL; + } + + if (animated) + pixbuf = G_OBJECT(gdk_pixbuf_loader_get_animation(loader)); + else + pixbuf = G_OBJECT(gdk_pixbuf_loader_get_pixbuf(loader)); + if (!pixbuf) { + purple_debug_warning("gtkutils", "%s() returned NULL for image " + "of size %" G_GSIZE_FORMAT "\n", + animated ? "gdk_pixbuf_loader_get_animation" + : "gdk_pixbuf_loader_get_pixbuf", count); + g_object_unref(G_OBJECT(loader)); + return NULL; + } + + g_object_ref(pixbuf); + g_object_unref(G_OBJECT(loader)); + + return pixbuf; +} + +GdkPixbuf *purple_gdk_pixbuf_from_data(const guchar *buf, gsize count) +{ + return GDK_PIXBUF(purple_gdk_pixbuf_from_data_helper(buf, count, FALSE)); +} + +GdkPixbuf * +purple_gdk_pixbuf_from_image(PurpleImage *image) +{ + return purple_gdk_pixbuf_from_data(purple_image_get_data(image), + purple_image_get_data_size(image)); +} + +GdkPixbuf *purple_gdk_pixbuf_new_from_file(const gchar *filename) +{ + GdkPixbuf *pixbuf; + GError *error = NULL; + + g_return_val_if_fail(filename != NULL, NULL); + g_return_val_if_fail(filename[0] != '\0', NULL); + + pixbuf = gdk_pixbuf_new_from_file(filename, &error); + if (!pixbuf || error) { + purple_debug_warning("gtkutils", "gdk_pixbuf_new_from_file() " + "returned %s for file %s: %s\n", + pixbuf ? "something" : "nothing", + filename, + error ? error->message : "(no error message)"); + if (error) + g_error_free(error); + if (pixbuf) + g_object_unref(G_OBJECT(pixbuf)); + return NULL; + } + + return pixbuf; +} + +GdkPixbuf *purple_gdk_pixbuf_new_from_file_at_size(const char *filename, int width, int height) +{ + GdkPixbuf *pixbuf; + GError *error = NULL; + + g_return_val_if_fail(filename != NULL, NULL); + g_return_val_if_fail(filename[0] != '\0', NULL); + + pixbuf = gdk_pixbuf_new_from_file_at_size(filename, + width, height, &error); + if (!pixbuf || error) { + purple_debug_warning("gtkutils", "gdk_pixbuf_new_from_file_at_size() " + "returned %s for file %s: %s\n", + pixbuf ? "something" : "nothing", + filename, + error ? error->message : "(no error message)"); + if (error) + g_error_free(error); + if (pixbuf) + g_object_unref(G_OBJECT(pixbuf)); + return NULL; + } + + return pixbuf; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/purplegdkpixbuf.h Fri Apr 01 01:14:35 2022 -0500 @@ -0,0 +1,132 @@ +/* + * Purple - Internet Messaging Library + * Copyright (C) Pidgin Developers <devel@pidgin.im> + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION) +# error "only <purple.h> may be included directly" +#endif + +#ifndef PURPLE_GDK_PIXBUF_H +#define PURPLE_GDK_PIXBUF_H + +#include <glib.h> + +#include <gdk-pixbuf/gdk-pixbuf.h> + +#include <libpurple/image.h> + +G_BEGIN_DECLS + +/** + * purple_gdk_pixbuf_make_round: + * @pixbuf: The buddy icon to transform + * + * Rounds the corners of a GdkPixbuf in place. + */ +void purple_gdk_pixbuf_make_round(GdkPixbuf *pixbuf); + +/** + * purple_gdk_pixbuf_is_opaque: + * @pixbuf: The pixbuf + * + * Returns TRUE if the GdkPixbuf is opaque, as determined by no + * alpha at any of the edge pixels. + * + * Returns: TRUE if the pixbuf is opaque around the edges, FALSE otherwise + */ +gboolean purple_gdk_pixbuf_is_opaque(GdkPixbuf *pixbuf); + +/** + * purple_gdk_pixbuf_from_data: + * @buf: The raw binary image data. + * @count: The length of buf in bytes. + * + * Create a GdkPixbuf from a chunk of image data. + * + * Returns: (transfer full): A GdkPixbuf created from the image data, or NULL if + * there was an error parsing the data. + */ +GdkPixbuf *purple_gdk_pixbuf_from_data(const guchar *buf, gsize count); + +/** + * purple_gdk_pixbuf_from_image: + * @image: a PurpleImage. + * + * Create a GdkPixbuf from a PurpleImage. + * + * Returns: (transfer full): a GdkPixbuf created from the @image. + */ +GdkPixbuf * +purple_gdk_pixbuf_from_image(PurpleImage *image); + +/** + * purple_gdk_pixbuf_new_from_file: + * @filename: Name of file to load, in the GLib file name encoding + * + * Helper function that calls gdk_pixbuf_new_from_file() and checks both + * the return code and the GError and returns NULL if either one failed. + * + * The gdk-pixbuf documentation implies that it is sufficient to check + * the return value of gdk_pixbuf_new_from_file() to determine + * whether the image was able to be loaded. However, this is not the case + * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some + * cases a GdkPixbuf object is returned that will cause some operations + * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an + * infinite loop. + * + * This function shouldn't be necessary once Pidgin requires a version of + * gdk-pixbuf where the aforementioned bug is fixed. However, it might be + * nice to keep this function around for the debug message that it logs. + * + * Returns: (transfer full): The GdkPixbuf if successful. Otherwise NULL is returned and + * a warning is logged. + */ +GdkPixbuf *purple_gdk_pixbuf_new_from_file(const char *filename); + +/** + * purple_gdk_pixbuf_new_from_file_at_size: + * @filename: Name of file to load, in the GLib file name encoding + * @width: The width the image should have or -1 to not constrain the width + * @height: The height the image should have or -1 to not constrain the height + * + * Helper function that calls gdk_pixbuf_new_from_file_at_size() and checks + * both the return code and the GError and returns NULL if either one failed. + * + * The gdk-pixbuf documentation implies that it is sufficient to check + * the return value of gdk_pixbuf_new_from_file_at_size() to determine + * whether the image was able to be loaded. However, this is not the case + * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some + * cases a GdkPixbuf object is returned that will cause some operations + * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an + * infinite loop. + * + * This function shouldn't be necessary once Pidgin requires a version of + * gdk-pixbuf where the aforementioned bug is fixed. However, it might be + * nice to keep this function around for the debug message that it logs. + * + * Returns: (transfer full): The GdkPixbuf if successful. Otherwise NULL is returned and + * a warning is logged. + */ +GdkPixbuf *purple_gdk_pixbuf_new_from_file_at_size(const char *filename, int width, int height); + +G_END_DECLS + +#endif /* PURPLE_GDK_PIXBUF_H */
--- a/meson.build Fri Apr 01 01:09:23 2022 -0500 +++ b/meson.build Fri Apr 01 01:14:35 2022 -0500 @@ -222,9 +222,9 @@ conf.set('HAVE_IOKIT', true) endif -# ####################################################################### -# # Check for GLib (required) -# ####################################################################### +####################################################################### +# Check for GLib (required) +####################################################################### glib = dependency('glib-2.0', version : '>= 2.70.0') gio = dependency('gio-2.0') gobject = dependency('gobject-2.0') @@ -237,9 +237,13 @@ language : 'c',) ####################################################################### +# Check for gdk-pixbuf (required) +####################################################################### +gdk_pixbuf = dependency('gdk-pixbuf-2.0') + +####################################################################### # Check for GObject Introspection ####################################################################### - if get_option('introspection') enable_introspection = dependency('gobject-introspection-1.0', version : '>= 1.39.0').found() else
--- a/pidgin/gtkaccount.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkaccount.c Fri Apr 01 01:14:35 2022 -0500 @@ -36,7 +36,6 @@ #include "pidgincore.h" #include "pidgindialog.h" #include "minidialog.h" -#include "pidgingdkpixbuf.h" #include "pidginprotocolchooser.h" enum @@ -194,7 +193,7 @@ } if (dialog->icon_img != NULL) { - pixbuf = pidgin_pixbuf_from_image(dialog->icon_img); + pixbuf = purple_gdk_pixbuf_from_image(dialog->icon_img); } if (dialog->protocol) @@ -1968,7 +1967,7 @@ if (img != NULL) { GdkPixbuf *buddyicon_pixbuf; - buddyicon_pixbuf = pidgin_pixbuf_from_image(img); + buddyicon_pixbuf = purple_gdk_pixbuf_from_image(img); g_object_unref(img); if (buddyicon_pixbuf != NULL) { @@ -2016,7 +2015,7 @@ path = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon"); if(path != NULL && *path != '\0') { - GdkPixbuf *pixbuf = pidgin_pixbuf_new_from_file(path); + GdkPixbuf *pixbuf = purple_gdk_pixbuf_new_from_file(path); if(pixbuf != NULL) { global_buddyicon = gdk_pixbuf_scale_simple(pixbuf, 22, 22, GDK_INTERP_HYPER);
--- a/pidgin/gtkblist.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkblist.c Fri Apr 01 01:14:35 2022 -0500 @@ -46,7 +46,6 @@ #include "pidgin/pidgincontactlist.h" #include "pidgin/pidgincore.h" #include "pidgin/pidgindebug.h" -#include "pidgin/pidgingdkpixbuf.h" #include "pidgin/pidginmooddialog.h" #include "pidgin/pidginplugininfo.h" #include "pidginscrollbook.h" @@ -2001,7 +2000,7 @@ return NULL; } - buf = pidgin_pixbuf_from_data(data, len); + buf = purple_gdk_pixbuf_from_data(data, len); purple_buddy_icon_unref(icon); if (!buf) { purple_debug_warning("gtkblist", "Couldn't load buddy icon on " @@ -2068,8 +2067,8 @@ tmpbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, scale_width, scale_height); gdk_pixbuf_fill(tmpbuf, 0x00000000); gdk_pixbuf_scale(buf, tmpbuf, 0, 0, scale_width, scale_height, 0, 0, (double)scale_width/(double)orig_width, (double)scale_height/(double)orig_height, GDK_INTERP_BILINEAR); - if (pidgin_gdk_pixbuf_is_opaque(tmpbuf)) - pidgin_gdk_pixbuf_make_round(tmpbuf); + if (purple_gdk_pixbuf_is_opaque(tmpbuf)) + purple_gdk_pixbuf_make_round(tmpbuf); ret = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, scale_size, scale_size); gdk_pixbuf_fill(ret, 0x00000000); gdk_pixbuf_copy_area(tmpbuf, 0, 0, scale_width, scale_height, ret, (scale_size-scale_width)/2, (scale_size-scale_height)/2); @@ -2657,7 +2656,7 @@ g_object_ref(pb); g_free(path); } else { - pb = pidgin_pixbuf_new_from_file(path); + pb = purple_gdk_pixbuf_new_from_file(path); if (pb != NULL) { /* We don't want to own a ref to the pixbuf, but we need to keep clean up. */ /* I'm not sure if it would be better to just keep our ref and not let the emblem ever be destroyed */
--- a/pidgin/gtkconv.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkconv.c Fri Apr 01 01:14:35 2022 -0500 @@ -49,7 +49,6 @@ #include "pidgincolor.h" #include "pidginconversationwindow.h" #include "pidgincore.h" -#include "pidgingdkpixbuf.h" #include "pidgininfopane.h" #include "pidgininvitedialog.h" #include "pidginmessage.h"
--- a/pidgin/gtkrequest.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkrequest.c Fri Apr 01 01:14:35 2022 -0500 @@ -33,7 +33,6 @@ #include "pidginaccountstore.h" #include "pidgincore.h" #include "pidgindialog.h" -#include "pidgingdkpixbuf.h" #include <gdk/gdkkeysyms.h> @@ -359,7 +358,7 @@ if (icon_data) { GdkPixbuf *pixbuf; - pixbuf = pidgin_pixbuf_from_data(icon_data, icon_size); + pixbuf = purple_gdk_pixbuf_from_data(icon_data, icon_size); if (pixbuf) { /* scale the image if it is too large */ int width = gdk_pixbuf_get_width(pixbuf); @@ -1311,7 +1310,7 @@ GtkWidget *widget; GdkPixbuf *buf, *scale; - buf = pidgin_pixbuf_from_data( + buf = purple_gdk_pixbuf_from_data( (const guchar *)purple_request_field_image_get_buffer(field), purple_request_field_image_get_size(field)); @@ -1452,7 +1451,7 @@ GdkPixbuf* pixbuf = NULL; if (icon_path) - pixbuf = pidgin_pixbuf_new_from_file(icon_path); + pixbuf = purple_gdk_pixbuf_new_from_file(icon_path); gtk_list_store_set(store, &iter, 0, purple_request_field_list_get_data(field, text),
--- a/pidgin/gtkstatusbox.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkstatusbox.c Fri Apr 01 01:14:35 2022 -0500 @@ -48,7 +48,6 @@ #include "gtkstatusbox.h" #include "gtkutils.h" #include "pidgincore.h" -#include "pidgingdkpixbuf.h" #include "pidginiconname.h" /* Timeout for typing notifications in seconds */
--- a/pidgin/gtkutils.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkutils.c Fri Apr 01 01:14:35 2022 -0500 @@ -47,7 +47,6 @@ #include "gtkutils.h" #include "minidialog.h" #include "pidgincore.h" -#include "pidgingdkpixbuf.h" /****************************************************************************** * Enums @@ -519,7 +518,6 @@ gtk_tree_path_free(path); } - void pidgin_buddy_icon_get_scale_size(GdkPixbuf *buf, PurpleBuddyIconSpec *spec, PurpleBuddyIconScaleFlags rules, int *width, int *height) { *width = gdk_pixbuf_get_width(buf); @@ -937,7 +935,7 @@ filename = gtk_file_chooser_get_preview_filename( GTK_FILE_CHOOSER(dialog->icon_filesel)); - if (!filename || g_stat(filename, &st) || !(pixbuf = pidgin_pixbuf_new_from_file_at_size(filename, 128, 128))) + if (!filename || g_stat(filename, &st) || !(pixbuf = purple_gdk_pixbuf_new_from_file_at_size(filename, 128, 128))) { gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_preview), NULL); gtk_label_set_markup(GTK_LABEL(dialog->icon_text), "");
--- a/pidgin/gtkxfer.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/gtkxfer.c Fri Apr 01 01:14:35 2022 -0500 @@ -28,7 +28,6 @@ #include "gtkxfer.h" #include "gtkutils.h" #include "pidgincore.h" -#include "pidgingdkpixbuf.h" #ifdef _WIN32 # include <shellapi.h> @@ -835,7 +834,7 @@ if (purple_xfer_get_size(xfer) <= PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL) { GdkPixbuf *thumbnail = - pidgin_pixbuf_new_from_file_at_size( + purple_gdk_pixbuf_new_from_file_at_size( purple_xfer_get_local_filename(xfer), 128, 128); if (thumbnail) {
--- a/pidgin/meson.build Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/meson.build Fri Apr 01 01:14:35 2022 -0500 @@ -40,7 +40,6 @@ 'pidgincontactlist.c', 'pidgindebug.c', 'pidgindialog.c', - 'pidgingdkpixbuf.c', 'pidginiconname.c', 'pidgininactiveaccountsmenu.c', 'pidgininfopane.c', @@ -105,7 +104,6 @@ 'pidgincore.h', 'pidgindialog.h', 'pidgindebug.h', - 'pidgingdkpixbuf.h', 'pidginiconname.h', 'pidgininactiveaccountsmenu.h', 'pidgininfopane.h',
--- a/pidgin/pidginaccountmanager.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/pidginaccountmanager.c Fri Apr 01 01:14:35 2022 -0500 @@ -28,7 +28,6 @@ #include "gtkaccount.h" #include "pidgincore.h" -#include "pidgingdkpixbuf.h" struct _PidginAccountManager { GtkDialog parent; @@ -124,7 +123,7 @@ if(image != NULL) { GdkPixbuf *raw = NULL; - raw = pidgin_pixbuf_from_image(image); + raw = purple_gdk_pixbuf_from_image(image); g_object_unref(image); avatar = gdk_pixbuf_scale_simple(raw, 22, 22, GDK_INTERP_HYPER);
--- a/pidgin/pidgingdkpixbuf.c Fri Apr 01 01:09:23 2022 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,343 +0,0 @@ -/* pidgin - * - * Pidgin is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ - -#include "pidgin/pidgingdkpixbuf.h" - -GdkPixbuf * -pidgin_gdk_pixbuf_new_from_image(PurpleImage *image, GError **error) { - GdkPixbufLoader *loader = NULL; - GdkPixbuf *pixbuf = NULL; - GBytes *data = NULL; - gboolean success = FALSE; - - g_return_val_if_fail(PURPLE_IS_IMAGE(image), NULL); - - data = purple_image_get_contents(image); - success = gdk_pixbuf_loader_write_bytes(loader, data, error); - g_bytes_unref(data); - - if(success) { - if(error != NULL && *error != NULL) { - g_object_unref(G_OBJECT(loader)); - - return NULL; - } - - if(gdk_pixbuf_loader_close(loader, error)) { - pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); - if(pixbuf != NULL) { - pixbuf = g_object_ref(pixbuf); - } - } - - g_object_unref(G_OBJECT(loader)); - } - - return pixbuf; -} - -void pidgin_gdk_pixbuf_make_round(GdkPixbuf *pixbuf) { - gint width, height, rowstride; - guchar *pixels; - - if (!gdk_pixbuf_get_has_alpha(pixbuf)) { - return; - } - - width = gdk_pixbuf_get_width(pixbuf); - height = gdk_pixbuf_get_height(pixbuf); - rowstride = gdk_pixbuf_get_rowstride(pixbuf); - pixels = gdk_pixbuf_get_pixels(pixbuf); - - if (width < 6 || height < 6) { - return; - } - - /* The following code will convert the alpha of the pixel data in all - * corners to look something like the following diagram. - * - * 00 80 c0 FF FF c0 80 00 - * 80 FF FF FF FF FF FF 80 - * c0 FF FF FF FF FF FF c0 - * FF FF FF FF FF FF FF FF - * FF FF FF FF FF FF FF FF - * c0 FF FF FF FF FF FF c0 - * 80 FF FF FF FF FF FF 80 - * 00 80 c0 FF FF c0 80 00 - */ - - /* Top left */ - pixels[3] = 0; - pixels[7] = 0x80; - pixels[11] = 0xC0; - pixels[rowstride + 3] = 0x80; - pixels[rowstride * 2 + 3] = 0xC0; - - /* Top right */ - pixels[width * 4 - 1] = 0; - pixels[width * 4 - 5] = 0x80; - pixels[width * 4 - 9] = 0xC0; - pixels[rowstride + (width * 4) - 1] = 0x80; - pixels[(2 * rowstride) + (width * 4) - 1] = 0xC0; - - /* Bottom left */ - pixels[(height - 1) * rowstride + 3] = 0; - pixels[(height - 1) * rowstride + 7] = 0x80; - pixels[(height - 1) * rowstride + 11] = 0xC0; - pixels[(height - 2) * rowstride + 3] = 0x80; - pixels[(height - 3) * rowstride + 3] = 0xC0; - - /* Bottom right */ - pixels[height * rowstride - 1] = 0; - pixels[(height - 1) * rowstride - 1] = 0x80; - pixels[(height - 2) * rowstride - 1] = 0xC0; - pixels[height * rowstride - 5] = 0x80; - pixels[height * rowstride - 9] = 0xC0; -} - -gboolean -pidgin_gdk_pixbuf_is_opaque(GdkPixbuf *pixbuf) { - gint height, rowstride, i; - guchar *pixels; - guchar *row; - - if (!gdk_pixbuf_get_has_alpha(pixbuf)) { - return TRUE; - } - - height = gdk_pixbuf_get_height (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixels = gdk_pixbuf_get_pixels (pixbuf); - - /* check the top row */ - row = pixels; - for (i = 3; i < rowstride; i+=4) { - if (row[i] < 0xfe) { - return FALSE; - } - } - - /* check the left and right sides */ - for (i = 1; i < height - 1; i++) { - row = pixels + (i * rowstride); - if (row[3] < 0xfe || row[rowstride - 1] < 0xfe) { - return FALSE; - } - } - - /* check the bottom */ - row = pixels + ((height - 1) * rowstride); - for (i = 3; i < rowstride; i += 4) { - if (row[i] < 0xfe) { - return FALSE; - } - } - - return TRUE; -} - -static GObject *pidgin_pixbuf_from_data_helper(const guchar *buf, gsize count, gboolean animated) -{ - GObject *pixbuf; - GdkPixbufLoader *loader; - GError *error = NULL; - - loader = gdk_pixbuf_loader_new(); - - if (!gdk_pixbuf_loader_write(loader, buf, count, &error) || error) { - purple_debug_warning("gtkutils", "gdk_pixbuf_loader_write() " - "failed with size=%" G_GSIZE_FORMAT ": %s\n", count, - error ? error->message : "(no error message)"); - if (error) - g_error_free(error); - g_object_unref(G_OBJECT(loader)); - return NULL; - } - - if (!gdk_pixbuf_loader_close(loader, &error) || error) { - purple_debug_warning("gtkutils", "gdk_pixbuf_loader_close() " - "failed for image of size %" G_GSIZE_FORMAT ": %s\n", count, - error ? error->message : "(no error message)"); - if (error) - g_error_free(error); - g_object_unref(G_OBJECT(loader)); - return NULL; - } - - if (animated) - pixbuf = G_OBJECT(gdk_pixbuf_loader_get_animation(loader)); - else - pixbuf = G_OBJECT(gdk_pixbuf_loader_get_pixbuf(loader)); - if (!pixbuf) { - purple_debug_warning("gtkutils", "%s() returned NULL for image " - "of size %" G_GSIZE_FORMAT "\n", - animated ? "gdk_pixbuf_loader_get_animation" - : "gdk_pixbuf_loader_get_pixbuf", count); - g_object_unref(G_OBJECT(loader)); - return NULL; - } - - g_object_ref(pixbuf); - g_object_unref(G_OBJECT(loader)); - - return pixbuf; -} - -GdkPixbuf *pidgin_pixbuf_from_data(const guchar *buf, gsize count) -{ - return GDK_PIXBUF(pidgin_pixbuf_from_data_helper(buf, count, FALSE)); -} - -GdkPixbufAnimation *pidgin_pixbuf_anim_from_data(const guchar *buf, gsize count) -{ - return GDK_PIXBUF_ANIMATION(pidgin_pixbuf_from_data_helper(buf, count, TRUE)); -} - -GdkPixbuf * -pidgin_pixbuf_from_image(PurpleImage *image) -{ - return pidgin_pixbuf_from_data(purple_image_get_data(image), - purple_image_get_data_size(image)); -} - -GdkPixbuf *pidgin_pixbuf_new_from_file(const gchar *filename) -{ - GdkPixbuf *pixbuf; - GError *error = NULL; - - g_return_val_if_fail(filename != NULL, NULL); - g_return_val_if_fail(filename[0] != '\0', NULL); - - pixbuf = gdk_pixbuf_new_from_file(filename, &error); - if (!pixbuf || error) { - purple_debug_warning("gtkutils", "gdk_pixbuf_new_from_file() " - "returned %s for file %s: %s\n", - pixbuf ? "something" : "nothing", - filename, - error ? error->message : "(no error message)"); - if (error) - g_error_free(error); - if (pixbuf) - g_object_unref(G_OBJECT(pixbuf)); - return NULL; - } - - return pixbuf; -} - -GdkPixbuf *pidgin_pixbuf_new_from_file_at_size(const char *filename, int width, int height) -{ - GdkPixbuf *pixbuf; - GError *error = NULL; - - g_return_val_if_fail(filename != NULL, NULL); - g_return_val_if_fail(filename[0] != '\0', NULL); - - pixbuf = gdk_pixbuf_new_from_file_at_size(filename, - width, height, &error); - if (!pixbuf || error) { - purple_debug_warning("gtkutils", "gdk_pixbuf_new_from_file_at_size() " - "returned %s for file %s: %s\n", - pixbuf ? "something" : "nothing", - filename, - error ? error->message : "(no error message)"); - if (error) - g_error_free(error); - if (pixbuf) - g_object_unref(G_OBJECT(pixbuf)); - return NULL; - } - - return pixbuf; -} - -GdkPixbuf *pidgin_pixbuf_new_from_file_at_scale(const char *filename, int width, int height, gboolean preserve_aspect_ratio) -{ - GdkPixbuf *pixbuf; - GError *error = NULL; - - g_return_val_if_fail(filename != NULL, NULL); - g_return_val_if_fail(filename[0] != '\0', NULL); - - pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, - width, height, preserve_aspect_ratio, &error); - if (!pixbuf || error) { - purple_debug_warning("gtkutils", "gdk_pixbuf_new_from_file_at_scale() " - "returned %s for file %s: %s\n", - pixbuf ? "something" : "nothing", - filename, - error ? error->message : "(no error message)"); - if (error) - g_error_free(error); - if (pixbuf) - g_object_unref(G_OBJECT(pixbuf)); - return NULL; - } - - return pixbuf; -} - -GdkPixbuf * -pidgin_pixbuf_scale_down(GdkPixbuf *src, guint max_width, guint max_height, - GdkInterpType interp_type, gboolean preserve_ratio) -{ - guint cur_w, cur_h; - GdkPixbuf *dst; - - g_return_val_if_fail(src != NULL, NULL); - - if (max_width == 0 || max_height == 0) { - g_object_unref(src); - g_return_val_if_reached(NULL); - } - - cur_w = gdk_pixbuf_get_width(src); - cur_h = gdk_pixbuf_get_height(src); - - if (cur_w <= max_width && cur_h <= max_height) - return src; - - /* cur_ratio = cur_w / cur_h - * max_ratio = max_w / max_h - */ - - if (!preserve_ratio) { - cur_w = MIN(cur_w, max_width); - cur_h = MIN(cur_h, max_height); - } else if ((guint64)cur_w * max_height > (guint64)max_width * cur_h) { - /* cur_w / cur_h > max_width / max_height */ - cur_h = (guint64)max_width * cur_h / cur_w; - cur_w = max_width; - } else { - cur_w = (guint64)max_height * cur_w / cur_h; - cur_h = max_height; - } - - if (cur_w <= 0) - cur_w = 1; - if (cur_h <= 0) - cur_h = 1; - - dst = gdk_pixbuf_scale_simple(src, cur_w, cur_h, interp_type); - g_object_unref(src); - - return dst; -}
--- a/pidgin/pidgingdkpixbuf.h Fri Apr 01 01:09:23 2022 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,203 +0,0 @@ -/* pidgin - * - * Pidgin is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ - -#if !defined(PIDGIN_GLOBAL_HEADER_INSIDE) && !defined(PIDGIN_COMPILATION) -# error "only <pidgin.h> may be included directly" -#endif - -#ifndef PIDGIN_GDK_PIXBUF_H -#define PIDGIN_GDK_PIXBUF_H - -#include <glib.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <purple.h> - -G_BEGIN_DECLS - -/** - * pidgin_gdk_pixbuf_new_from_image: - * @image: A #PurpleImage instance. - * @error: (out) (nullable): A return address for a #GError. - * - * Creates a new #GdkPixbuf from the #PurpleImage @image. If provided Sets - * @error on error. - * - * Returns: (transfer full) (nullable): The new #GdkPixbuf or %NULL or error. - */ -GdkPixbuf *pidgin_gdk_pixbuf_new_from_image(PurpleImage *image, GError **error); - -/** - * pidgin_gdk_pixbuf_make_round: - * @pixbuf: The buddy icon to transform - * - * Rounds the corners of a GdkPixbuf in place. - */ -void pidgin_gdk_pixbuf_make_round(GdkPixbuf *pixbuf); - -/** - * pidgin_gdk_pixbuf_is_opaque: - * @pixbuf: The pixbuf - * - * Returns TRUE if the GdkPixbuf is opaque, as determined by no - * alpha at any of the edge pixels. - * - * Returns: TRUE if the pixbuf is opaque around the edges, FALSE otherwise - */ -gboolean pidgin_gdk_pixbuf_is_opaque(GdkPixbuf *pixbuf); - -/** - * pidgin_pixbuf_from_data: - * @buf: The raw binary image data. - * @count: The length of buf in bytes. - * - * Create a GdkPixbuf from a chunk of image data. - * - * Returns: (transfer full): A GdkPixbuf created from the image data, or NULL if - * there was an error parsing the data. - */ -GdkPixbuf *pidgin_pixbuf_from_data(const guchar *buf, gsize count); - -/** - * pidgin_pixbuf_anim_from_data: - * @buf: The raw binary image data. - * @count: The length of buf in bytes. - * - * Create a GdkPixbufAnimation from a chunk of image data. - * - * Returns: (transfer full): A GdkPixbufAnimation created from the image data, or NULL if - * there was an error parsing the data. - */ -GdkPixbufAnimation *pidgin_pixbuf_anim_from_data(const guchar *buf, gsize count); - -/** - * pidgin_pixbuf_from_image: - * @image: a PurpleImage. - * - * Create a GdkPixbuf from a PurpleImage. - * - * Returns: (transfer full): a GdkPixbuf created from the @image. - */ -GdkPixbuf * -pidgin_pixbuf_from_image(PurpleImage *image); - -/** - * pidgin_pixbuf_new_from_file: - * @filename: Name of file to load, in the GLib file name encoding - * - * Helper function that calls gdk_pixbuf_new_from_file() and checks both - * the return code and the GError and returns NULL if either one failed. - * - * The gdk-pixbuf documentation implies that it is sufficient to check - * the return value of gdk_pixbuf_new_from_file() to determine - * whether the image was able to be loaded. However, this is not the case - * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some - * cases a GdkPixbuf object is returned that will cause some operations - * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an - * infinite loop. - * - * This function shouldn't be necessary once Pidgin requires a version of - * gdk-pixbuf where the aforementioned bug is fixed. However, it might be - * nice to keep this function around for the debug message that it logs. - * - * Returns: (transfer full): The GdkPixbuf if successful. Otherwise NULL is returned and - * a warning is logged. - */ -GdkPixbuf *pidgin_pixbuf_new_from_file(const char *filename); - -/** - * pidgin_pixbuf_new_from_file_at_size: - * @filename: Name of file to load, in the GLib file name encoding - * @width: The width the image should have or -1 to not constrain the width - * @height: The height the image should have or -1 to not constrain the height - * - * Helper function that calls gdk_pixbuf_new_from_file_at_size() and checks - * both the return code and the GError and returns NULL if either one failed. - * - * The gdk-pixbuf documentation implies that it is sufficient to check - * the return value of gdk_pixbuf_new_from_file_at_size() to determine - * whether the image was able to be loaded. However, this is not the case - * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some - * cases a GdkPixbuf object is returned that will cause some operations - * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an - * infinite loop. - * - * This function shouldn't be necessary once Pidgin requires a version of - * gdk-pixbuf where the aforementioned bug is fixed. However, it might be - * nice to keep this function around for the debug message that it logs. - * - * Returns: (transfer full): The GdkPixbuf if successful. Otherwise NULL is returned and - * a warning is logged. - */ -GdkPixbuf *pidgin_pixbuf_new_from_file_at_size(const char *filename, int width, int height); - -/** - * pidgin_pixbuf_new_from_file_at_scale: - * @filename: Name of file to load, in the GLib file name encoding - * @width: The width the image should have or -1 to not constrain the width - * @height: The height the image should have or -1 to not constrain the height - * @preserve_aspect_ratio: TRUE to preserve the image's aspect ratio - * - * Helper function that calls gdk_pixbuf_new_from_file_at_scale() and checks - * both the return code and the GError and returns NULL if either one failed. - * - * The gdk-pixbuf documentation implies that it is sufficient to check - * the return value of gdk_pixbuf_new_from_file_at_scale() to determine - * whether the image was able to be loaded. However, this is not the case - * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some - * cases a GdkPixbuf object is returned that will cause some operations - * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an - * infinite loop. - * - * This function shouldn't be necessary once Pidgin requires a version of - * gdk-pixbuf where the aforementioned bug is fixed. However, it might be - * nice to keep this function around for the debug message that it logs. - * - * Returns: (transfer full): The GdkPixbuf if successful. Otherwise NULL is returned and - * a warning is logged. - */ -GdkPixbuf *pidgin_pixbuf_new_from_file_at_scale(const char *filename, int width, int height, gboolean preserve_aspect_ratio); - -/** - * pidgin_pixbuf_scale_down: - * @src: The source image. - * @max_width: Maximum width in px. - * @max_height: Maximum height in px. - * @interp_type: Interpolation method. - * @preserve_ratio: %TRUE to preserve image's aspect ratio. - * - * Scales the image to the desired dimensions. If image is smaller, it will be - * returned without modifications. - * - * If new image is created, @src reference count will be decreased and new image - * with a ref count of 1 will be returned. - * - * Returns: (transfer full): The image with proper sizing. %NULL in case of error. - */ -GdkPixbuf * -pidgin_pixbuf_scale_down(GdkPixbuf *src, guint max_width, guint max_height, - GdkInterpType interp_type, gboolean preserve_ratio); - - - -G_END_DECLS - -#endif /* PIDGIN_GDK_PIXBUF_H */
--- a/pidgin/prefs/pidginprefs.c Fri Apr 01 01:09:23 2022 -0500 +++ b/pidgin/prefs/pidginprefs.c Fri Apr 01 01:14:35 2022 -0500 @@ -41,7 +41,6 @@ #include "gtkutils.h" #include "pidgincore.h" #include "pidgindebug.h" -#include "pidgingdkpixbuf.h" #include "pidginprefs.h" #include <libsoup/soup.h>
--- a/po/POTFILES.in Fri Apr 01 01:09:23 2022 -0500 +++ b/po/POTFILES.in Fri Apr 01 01:14:35 2022 -0500 @@ -248,6 +248,7 @@ libpurple/purplecredentialmanager.c libpurple/purplecredentialprovider.c libpurple/purpledebugui.c +libpurple/purplegdkpixbuf.c libpurple/purple-gio.c libpurple/purplehistoryadapter.c libpurple/purplehistorymanager.c @@ -353,7 +354,6 @@ pidgin/pidginconversationwindow.c pidgin/pidgindebug.c pidgin/pidgindialog.c -pidgin/pidgingdkpixbuf.c pidgin/pidginiconname.c pidgin/pidgininactiveaccountsmenu.c pidgin/pidgininfopane.c