From 6a44e188537ee2d70226ad9dba4ae89c15437e2b Mon Sep 17 00:00:00 2001 From: MarcoPolo-PasTonMolo Date: Thu, 26 May 2022 17:49:34 +0300 Subject: Add `/avatar set` command to publish avatar Use `/avatar set ` where is an image file to upload a new avatar for the current user. When the avatar is too big it gets scaled down. Scaling code copied from dino. Fixes https://github.com/profanity-im/profanity/issues/1687 --- src/command/cmd_ac.c | 6 +++ src/command/cmd_defs.c | 4 ++ src/command/cmd_funcs.c | 6 ++- src/xmpp/avatar.c | 55 ++++++++++++++++++++++++++ src/xmpp/avatar.h | 1 + src/xmpp/stanza.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ src/xmpp/stanza.h | 4 ++ 7 files changed, 176 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index ec0e9c30..9fc70a1d 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -1057,6 +1057,7 @@ cmd_ac_init(void) autocomplete_add(correction_ac, "char"); avatar_ac = autocomplete_new(); + autocomplete_add(avatar_ac, "set"); autocomplete_add(avatar_ac, "get"); autocomplete_add(avatar_ac, "open"); @@ -4101,6 +4102,11 @@ _avatar_autocomplete(ProfWin* window, const char* const input, gboolean previous jabber_conn_status_t conn_status = connection_get_status(); if (conn_status == JABBER_CONNECTED) { + result = cmd_ac_complete_filepath(input, "/avatar set", previous); + if (result) { + return result; + } + result = autocomplete_param_with_func(input, "/avatar get", roster_barejid_autocomplete, previous, NULL); if (result) { return result; diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index e62e2d2d..ffc4ec83 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2443,16 +2443,20 @@ static struct cmd_t command_defs[] = { CMD_TAGS( CMD_TAG_CHAT) CMD_SYN( + "/avatar set ", "/avatar get ", "/avatar open ") CMD_DESC( + "Upload avatar for oneself (XEP-0084). " "Download avatar (XEP-0084) for a certain contact. " "If nothing happens after using this command the user either doesn't have an avatar set at all " "or doesn't use XEP-0084 to publish it.") CMD_ARGS( + { "set ", "Set avatar to the img at ." }, { "get ", "Download the avatar. barejid is the JID to download avatar from." }, { "open ", "Download avatar and open it with command." }) CMD_EXAMPLES( + "/avatar set ~/images/avatar.png", "/avatar get thor@valhalla.edda", "/avatar open freyja@vanaheimr.edda") }, diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 9e821ede..26eb9c3e 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9195,7 +9195,11 @@ cmd_avatar(ProfWin* window, const char* const command, gchar** args) return TRUE; } - if (g_strcmp0(args[0], "get") == 0) { + if (g_strcmp0(args[0], "set") == 0) { + if (avatar_set(args[1])) { + cons_show("Avatar updated successfully"); + } + } else if (g_strcmp0(args[0], "get") == 0) { avatar_get_by_nick(args[1], false); } else if (g_strcmp0(args[0], "open") == 0) { avatar_get_by_nick(args[1], true); diff --git a/src/xmpp/avatar.c b/src/xmpp/avatar.c index b962fcef..d826dd90 100644 --- a/src/xmpp/avatar.c +++ b/src/xmpp/avatar.c @@ -36,10 +36,12 @@ #include "config.h" #include +#include #include #include #include #include +#include #include #include "log.h" @@ -59,6 +61,7 @@ typedef struct avatar_metadata static GHashTable* looking_for = NULL; // contains nicks/barejids from who we want to get the avatar static GHashTable* shall_open = NULL; // contains a list of nicks that shall not just downloaded but also opened +const int MAX_PIXEL = 192; static void _avatar_request_item_by_id(const char* jid, avatar_metadata* data); static int _avatar_metadata_handler(xmpp_stanza_t* const stanza, void* const userdata); @@ -92,6 +95,58 @@ avatar_pep_subscribe(void) shall_open = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); } +gboolean +avatar_set(const char* path) +{ + char* expanded_path = get_expanded_path(path); + + GError* err = NULL; + GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file(expanded_path, &err); + + if (pixbuf == NULL) { + cons_show("An error occurred while opening %s: %s.", expanded_path, err ? err->message : "No error message given"); + return FALSE; + } + free(expanded_path); + + // Scale img + int w = gdk_pixbuf_get_width(pixbuf); + int h = gdk_pixbuf_get_height(pixbuf); + + if (w >= h && w > MAX_PIXEL) { + int dest_height = (int)((float)MAX_PIXEL / w * h); + GdkPixbuf* new_pixbuf = gdk_pixbuf_scale_simple(pixbuf, MAX_PIXEL, dest_height, GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + pixbuf = new_pixbuf; + } else if (h > w && w > MAX_PIXEL) { + int dest_width = (int)((float)MAX_PIXEL / h * w); + GdkPixbuf* new_pixbuf = gdk_pixbuf_scale_simple(pixbuf, dest_width, MAX_PIXEL, GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + pixbuf = new_pixbuf; + } + + gchar* img_data; + gsize len = -1; + + if (!gdk_pixbuf_save_to_buffer(pixbuf, &img_data, &len, "png", &err, NULL)) { + cons_show("Unable to scale and convert avatar."); + return FALSE; + } + + xmpp_ctx_t* const ctx = connection_get_ctx(); + xmpp_stanza_t* iq = stanza_create_avatar_data_publish_iq(ctx, img_data, len); + iq_send_stanza(iq); + xmpp_stanza_release(iq); + + iq = stanza_create_avatar_metadata_publish_iq(ctx, img_data, len, gdk_pixbuf_get_height(pixbuf), gdk_pixbuf_get_width(pixbuf)); + free(img_data); + g_object_unref(pixbuf); + iq_send_stanza(iq); + xmpp_stanza_release(iq); + + return TRUE; +} + gboolean avatar_get_by_nick(const char* nick, gboolean open) { diff --git a/src/xmpp/avatar.h b/src/xmpp/avatar.h index 98532917..1767a2b2 100644 --- a/src/xmpp/avatar.h +++ b/src/xmpp/avatar.h @@ -40,5 +40,6 @@ void avatar_pep_subscribe(void); gboolean avatar_get_by_nick(const char* nick, gboolean open); +gboolean avatar_set(const char* path); #endif diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index bfb782da..8dcad982 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -2586,6 +2586,107 @@ stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_i return iq; } +xmpp_stanza_t* +stanza_create_avatar_data_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len) +{ + char* id = connection_create_stanza_id(); + xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id); + free(id); + xmpp_stanza_set_attribute(iq, STANZA_ATTR_FROM, connection_get_fulljid()); + + xmpp_stanza_t* pubsub = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB); + xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB); + + xmpp_stanza_t* publish = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(publish, STANZA_NAME_PUBLISH); + xmpp_stanza_set_attribute(publish, STANZA_ATTR_NODE, STANZA_NS_USER_AVATAR_DATA); + + xmpp_stanza_t* item = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(item, STANZA_NAME_ITEM); + char* sha1 = xmpp_sha1(ctx, (guchar*)img_data, len); + xmpp_stanza_set_attribute(item, "id", sha1); + xmpp_free(ctx, sha1); + + xmpp_stanza_t* data = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(data, STANZA_NAME_DATA); + xmpp_stanza_set_ns(data, STANZA_NS_USER_AVATAR_DATA); + + xmpp_stanza_t* text = xmpp_stanza_new(ctx); + gchar* base64 = g_base64_encode((guchar*)img_data, len); + xmpp_stanza_set_text(text, base64); + free(base64); + + xmpp_stanza_add_child(data, text); + xmpp_stanza_add_child(item, data); + xmpp_stanza_add_child(publish, item); + xmpp_stanza_add_child(pubsub, publish); + xmpp_stanza_add_child(iq, pubsub); + + xmpp_stanza_release(text); + xmpp_stanza_release(data); + xmpp_stanza_release(item); + xmpp_stanza_release(publish); + xmpp_stanza_release(pubsub); + + return iq; +} + +xmpp_stanza_t* +stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len, int height, int width) +{ + char* id = id = connection_create_stanza_id(); + xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id); + free(id); + xmpp_stanza_set_attribute(iq, STANZA_ATTR_FROM, connection_get_fulljid()); + + xmpp_stanza_t* pubsub = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB); + xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB); + + xmpp_stanza_t* publish = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(publish, STANZA_NAME_PUBLISH); + xmpp_stanza_set_attribute(publish, STANZA_ATTR_NODE, STANZA_NS_USER_AVATAR_METADATA); + + xmpp_stanza_t* item = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(item, STANZA_NAME_ITEM); + char* sha1 = xmpp_sha1(ctx, (guchar*)img_data, len); + xmpp_stanza_set_attribute(item, "id", sha1); + + xmpp_stanza_t* metadata = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(metadata, STANZA_NAME_METADATA); + xmpp_stanza_set_ns(metadata, STANZA_NS_USER_AVATAR_METADATA); + + xmpp_stanza_t* info = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(info, STANZA_NAME_INFO); + xmpp_stanza_set_attribute(info, "id", sha1); + xmpp_free(ctx, sha1); + char* bytes = g_strdup_printf("%lu", len); + char* h = g_strdup_printf("%d", height); + char* w = g_strdup_printf("%d", width); + xmpp_stanza_set_attribute(info, "bytes", bytes); + xmpp_stanza_set_attribute(info, "type", "img/png"); + xmpp_stanza_set_attribute(info, "height", h); + xmpp_stanza_set_attribute(info, "width", w); + g_free(bytes); + g_free(h); + g_free(w); + + xmpp_stanza_add_child(metadata, info); + xmpp_stanza_add_child(item, metadata); + xmpp_stanza_add_child(publish, item); + xmpp_stanza_add_child(pubsub, publish); + xmpp_stanza_add_child(iq, pubsub); + + xmpp_stanza_release(info); + xmpp_stanza_release(metadata); + xmpp_stanza_release(item); + xmpp_stanza_release(publish); + xmpp_stanza_release(pubsub); + + return iq; +} + xmpp_stanza_t* stanza_attach_correction(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza, const char* const replace_id) { diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h index 6e201497..12c9a5ee 100644 --- a/src/xmpp/stanza.h +++ b/src/xmpp/stanza.h @@ -62,6 +62,8 @@ #define STANZA_NAME_PUBLIC_KEYS_LIST "public-keys-list" #define STANZA_NAME_PUBKEY_METADATA "pubkey-metadata" #define STANZA_NAME_DATA "data" +#define STANZA_NAME_METADATA "metadata" +#define STANZA_NAME_INFO "info" #define STANZA_NAME_SHOW "show" #define STANZA_NAME_STATUS "status" #define STANZA_NAME_IQ "iq" @@ -409,6 +411,8 @@ XMPPCaps* stanza_parse_caps(xmpp_stanza_t* const stanza); void stanza_free_caps(XMPPCaps* caps); xmpp_stanza_t* stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_id, const char* const item_id, const char* const jid); +xmpp_stanza_t* stanza_create_avatar_data_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len); +xmpp_stanza_t* stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len, int height, int width); xmpp_stanza_t* stanza_create_mam_iq(xmpp_ctx_t* ctx, const char* const jid, const char* const startdate, const char* const lastid); xmpp_stanza_t* stanza_change_password(xmpp_ctx_t* ctx, const char* const user, const char* const password); xmpp_stanza_t* stanza_register_new_account(xmpp_ctx_t* ctx, const char* const user, const char* const password); -- cgit 1.4.1-2-gfad0 From 0cff111249ae60f7b9b6662fc7beaed1b5ec8dde Mon Sep 17 00:00:00 2001 From: MarcoPolo-PasTonMolo Date: Thu, 26 May 2022 21:06:27 +0300 Subject: Add checks for whether gdk-pixbuf exists before using avatar set --- configure.ac | 11 +++++++++++ src/command/cmd_funcs.c | 4 ++++ src/main.c | 6 ++++++ src/xmpp/avatar.c | 6 ++++-- src/xmpp/avatar.h | 2 ++ tests/unittests/xmpp/stub_avatar.c | 5 ++++- 6 files changed, 31 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/configure.ac b/configure.ac index 158878b0..5124f2ed 100644 --- a/configure.ac +++ b/configure.ac @@ -65,6 +65,8 @@ AC_ARG_WITH([themes], [AS_HELP_STRING([--with-themes[[=PATH]]], [install themes (default yes)])]) AC_ARG_ENABLE([icons-and-clipboard], [AS_HELP_STRING([--enable-icons-and-clipboard], [enable GTK tray icons and clipboard paste support])]) +AC_ARG_ENABLE([gdk-pixbuf], + [AS_HELP_STRING([--enable-gdk-pixbuf], [enable GDK Pixbuf support])]) # Required dependencies @@ -306,6 +308,15 @@ if test "x$enable_otr" != xno; then AM_COND_IF([BUILD_OTR], [AC_DEFINE([HAVE_LIBOTR], [1], [Have libotr])]) fi +dnl feature: pixbuf +AS_IF([test "x$enable_pixbuf" != xno], + [PKG_CHECK_MODULES([gdk_pixbuf], [gdk-pixbuf-2.0 >= 2.4], + [AC_DEFINE([HAVE_PIXBUF], [1], [gdk-pixbuf module])], + [AS_IF([test "x$enable_pixbuf" = xyes], + [AC_MSG_ERROR([gdk-pixbuf-2.0 >= 2.4 is required for GDK Pixbuf support])], + [AC_MSG_NOTICE([gdk-pixbuf-2.0 >= 2.4 not found, GDK Pixbuf support not enabled])])])]) + + dnl feature: omemo AM_CONDITIONAL([BUILD_OMEMO], [false]) if test "x$enable_omemo" != xno; then diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 26eb9c3e..dfe96971 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9196,9 +9196,13 @@ cmd_avatar(ProfWin* window, const char* const command, gchar** args) } if (g_strcmp0(args[0], "set") == 0) { +#ifdef HAVE_PIXBUF if (avatar_set(args[1])) { cons_show("Avatar updated successfully"); } +#else + cons_show("This version of Profanity has not been built with GDK Pixbuf support enabled"); +#endif } else if (g_strcmp0(args[0], "get") == 0) { avatar_get_by_nick(args[1], false); } else if (g_strcmp0(args[0], "open") == 0) { diff --git a/src/main.c b/src/main.c index 15e4948a..42629370 100644 --- a/src/main.c +++ b/src/main.c @@ -173,6 +173,12 @@ main(int argc, char** argv) g_print("GTK icons/clipboard: Disabled\n"); #endif +#ifdef HAVE_PIXBUF + g_print("GDK Pixbuf: Enabled\n"); +#else + g_print("GDK Pixbuf: Disabled\n"); +#endif + return 0; } diff --git a/src/xmpp/avatar.c b/src/xmpp/avatar.c index d826dd90..15ec7f1a 100644 --- a/src/xmpp/avatar.c +++ b/src/xmpp/avatar.c @@ -95,6 +95,7 @@ avatar_pep_subscribe(void) shall_open = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); } +#ifdef HAVE_PIXBUF gboolean avatar_set(const char* path) { @@ -104,7 +105,7 @@ avatar_set(const char* path) GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file(expanded_path, &err); if (pixbuf == NULL) { - cons_show("An error occurred while opening %s: %s.", expanded_path, err ? err->message : "No error message given"); + cons_show_error("An error occurred while opening %s: %s.", expanded_path, err ? err->message : "No error message given"); return FALSE; } free(expanded_path); @@ -129,7 +130,7 @@ avatar_set(const char* path) gsize len = -1; if (!gdk_pixbuf_save_to_buffer(pixbuf, &img_data, &len, "png", &err, NULL)) { - cons_show("Unable to scale and convert avatar."); + cons_show_error("Unable to scale and convert avatar."); return FALSE; } @@ -146,6 +147,7 @@ avatar_set(const char* path) return TRUE; } +#endif gboolean avatar_get_by_nick(const char* nick, gboolean open) diff --git a/src/xmpp/avatar.h b/src/xmpp/avatar.h index 1767a2b2..c65328ad 100644 --- a/src/xmpp/avatar.h +++ b/src/xmpp/avatar.h @@ -40,6 +40,8 @@ void avatar_pep_subscribe(void); gboolean avatar_get_by_nick(const char* nick, gboolean open); +#ifdef HAVE_PIXBUF gboolean avatar_set(const char* path); +#endif #endif diff --git a/tests/unittests/xmpp/stub_avatar.c b/tests/unittests/xmpp/stub_avatar.c index 453d1863..9f07c334 100644 --- a/tests/unittests/xmpp/stub_avatar.c +++ b/tests/unittests/xmpp/stub_avatar.c @@ -8,8 +8,11 @@ avatar_get_by_nick(const char* nick) { return TRUE; } + +#ifdef HAVE_PIXBUF gboolean avatar_set(const char* path) { - return FALSE; + return TRUE; } +#endif -- cgit 1.4.1-2-gfad0 From d510f3a4309cf0a42fc135bbf0905f476757a9c8 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Fri, 27 May 2022 10:39:49 +0200 Subject: Final touches for `/avatar set` --- configure.ac | 7 +++---- src/command/cmd_defs.c | 2 +- src/command/cmd_funcs.c | 2 +- src/xmpp/avatar.c | 5 +++-- tests/unittests/xmpp/stub_avatar.c | 2 -- 5 files changed, 8 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/configure.ac b/configure.ac index 5124f2ed..dad9cc28 100644 --- a/configure.ac +++ b/configure.ac @@ -66,7 +66,7 @@ AC_ARG_WITH([themes], AC_ARG_ENABLE([icons-and-clipboard], [AS_HELP_STRING([--enable-icons-and-clipboard], [enable GTK tray icons and clipboard paste support])]) AC_ARG_ENABLE([gdk-pixbuf], - [AS_HELP_STRING([--enable-gdk-pixbuf], [enable GDK Pixbuf support])]) + [AS_HELP_STRING([--enable-gdk-pixbuf], [enable GDK Pixbuf support to scale avatars before uploading])]) # Required dependencies @@ -308,15 +308,14 @@ if test "x$enable_otr" != xno; then AM_COND_IF([BUILD_OTR], [AC_DEFINE([HAVE_LIBOTR], [1], [Have libotr])]) fi -dnl feature: pixbuf +dnl feature: pixbuf / used for scaling avatars before uploading via `/avatar set` AS_IF([test "x$enable_pixbuf" != xno], [PKG_CHECK_MODULES([gdk_pixbuf], [gdk-pixbuf-2.0 >= 2.4], [AC_DEFINE([HAVE_PIXBUF], [1], [gdk-pixbuf module])], [AS_IF([test "x$enable_pixbuf" = xyes], - [AC_MSG_ERROR([gdk-pixbuf-2.0 >= 2.4 is required for GDK Pixbuf support])], + [AC_MSG_ERROR([gdk-pixbuf-2.0 >= 2.4 is required to scale avatars before uploading])], [AC_MSG_NOTICE([gdk-pixbuf-2.0 >= 2.4 not found, GDK Pixbuf support not enabled])])])]) - dnl feature: omemo AM_CONDITIONAL([BUILD_OMEMO], [false]) if test "x$enable_omemo" != xno; then diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index ffc4ec83..599262c1 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2452,7 +2452,7 @@ static struct cmd_t command_defs[] = { "If nothing happens after using this command the user either doesn't have an avatar set at all " "or doesn't use XEP-0084 to publish it.") CMD_ARGS( - { "set ", "Set avatar to the img at ." }, + { "set ", "Set avatar to the image at ." }, { "get ", "Download the avatar. barejid is the JID to download avatar from." }, { "open ", "Download avatar and open it with command." }) CMD_EXAMPLES( diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index dfe96971..2a8331d1 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9201,7 +9201,7 @@ cmd_avatar(ProfWin* window, const char* const command, gchar** args) cons_show("Avatar updated successfully"); } #else - cons_show("This version of Profanity has not been built with GDK Pixbuf support enabled"); + cons_show("Profanity has not been built with GDK Pixbuf support enabled which is needed to scale the avatar when uploading."); #endif } else if (g_strcmp0(args[0], "get") == 0) { avatar_get_by_nick(args[1], false); diff --git a/src/xmpp/avatar.c b/src/xmpp/avatar.c index 15ec7f1a..9345ba3a 100644 --- a/src/xmpp/avatar.c +++ b/src/xmpp/avatar.c @@ -36,12 +36,13 @@ #include "config.h" #include +#ifdef HAVE_PIXBUF #include +#endif #include #include #include #include -#include #include #include "log.h" @@ -61,7 +62,7 @@ typedef struct avatar_metadata static GHashTable* looking_for = NULL; // contains nicks/barejids from who we want to get the avatar static GHashTable* shall_open = NULL; // contains a list of nicks that shall not just downloaded but also opened -const int MAX_PIXEL = 192; +const int MAX_PIXEL = 192; // max pixel width/height for an avatar static void _avatar_request_item_by_id(const char* jid, avatar_metadata* data); static int _avatar_metadata_handler(xmpp_stanza_t* const stanza, void* const userdata); diff --git a/tests/unittests/xmpp/stub_avatar.c b/tests/unittests/xmpp/stub_avatar.c index 9f07c334..fd63293e 100644 --- a/tests/unittests/xmpp/stub_avatar.c +++ b/tests/unittests/xmpp/stub_avatar.c @@ -9,10 +9,8 @@ avatar_get_by_nick(const char* nick) return TRUE; } -#ifdef HAVE_PIXBUF gboolean avatar_set(const char* path) { return TRUE; } -#endif -- cgit 1.4.1-2-gfad0