aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-smiley-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-smiley-manager.c')
-rw-r--r--libempathy-gtk/empathy-smiley-manager.c82
1 files changed, 45 insertions, 37 deletions
diff --git a/libempathy-gtk/empathy-smiley-manager.c b/libempathy-gtk/empathy-smiley-manager.c
index a729a2929..21384c75b 100644
--- a/libempathy-gtk/empathy-smiley-manager.c
+++ b/libempathy-gtk/empathy-smiley-manager.c
@@ -37,9 +37,10 @@ typedef struct {
} EmpathySmileyManagerPriv;
struct _SmileyManagerTree {
- gunichar c;
- GdkPixbuf *pixbuf;
- GSList *childrens;
+ gunichar c;
+ GdkPixbuf *pixbuf;
+ const gchar *path;
+ GSList *childrens;
};
G_DEFINE_TYPE (EmpathySmileyManager, empathy_smiley_manager, G_TYPE_OBJECT);
@@ -55,6 +56,7 @@ smiley_manager_tree_new (gunichar c)
tree->c = c;
tree->pixbuf = NULL;
tree->childrens = NULL;
+ tree->path = NULL;
return tree;
}
@@ -81,7 +83,7 @@ smiley_manager_tree_free (SmileyManagerTree *tree)
/* Note: This function takes the ownership of str */
static EmpathySmiley *
-smiley_new (GdkPixbuf *pixbuf, gchar *str)
+smiley_new (GdkPixbuf *pixbuf, gchar *str, const gchar *path)
{
EmpathySmiley *smiley;
@@ -90,6 +92,7 @@ smiley_new (GdkPixbuf *pixbuf, gchar *str)
smiley->pixbuf = g_object_ref (pixbuf);
}
smiley->str = str;
+ smiley->path = path;
return smiley;
}
@@ -112,8 +115,16 @@ static void
smiley_manager_finalize (GObject *object)
{
EmpathySmileyManagerPriv *priv = GET_PRIV (object);
+ GSList *l;
smiley_manager_tree_free (priv->tree);
+ for (l = priv->smileys; l; l = l->next) {
+ EmpathySmiley *smiley = l->data;
+
+ /* The smiley got the ownership of the path */
+ g_free ((gchar*) smiley->path);
+ empathy_smiley_free (smiley);
+ }
g_slist_foreach (priv->smileys, (GFunc) empathy_smiley_free, NULL);
g_slist_free (priv->smileys);
}
@@ -201,8 +212,9 @@ smiley_manager_tree_find_or_insert_child (SmileyManagerTree *tree, gunichar c)
static void
smiley_manager_tree_insert (SmileyManagerTree *tree,
- GdkPixbuf *smiley,
- const gchar *str)
+ GdkPixbuf *pixbuf,
+ const gchar *str,
+ const gchar *path)
{
SmileyManagerTree *child;
@@ -210,28 +222,32 @@ smiley_manager_tree_insert (SmileyManagerTree *tree,
str = g_utf8_next_char (str);
if (*str) {
- smiley_manager_tree_insert (child, smiley, str);
+ smiley_manager_tree_insert (child, pixbuf, str, path);
return;
}
- child->pixbuf = g_object_ref (smiley);
+ child->pixbuf = g_object_ref (pixbuf);
+ child->path = path;
}
static void
smiley_manager_add_valist (EmpathySmileyManager *manager,
- GdkPixbuf *smiley,
+ GdkPixbuf *pixbuf,
+ gchar *path,
const gchar *first_str,
va_list var_args)
{
EmpathySmileyManagerPriv *priv = GET_PRIV (manager);
const gchar *str;
+ EmpathySmiley *smiley;
for (str = first_str; str; str = va_arg (var_args, gchar*)) {
- smiley_manager_tree_insert (priv->tree, smiley, str);
+ smiley_manager_tree_insert (priv->tree, pixbuf, str, path);
}
- priv->smileys = g_slist_prepend (priv->smileys,
- smiley_new (smiley, g_strdup (first_str)));
+ /* We give the ownership of path to the smiley */
+ smiley = smiley_new (pixbuf, g_strdup (first_str), path);
+ priv->smileys = g_slist_prepend (priv->smileys, smiley);
}
void
@@ -240,40 +256,26 @@ empathy_smiley_manager_add (EmpathySmileyManager *manager,
const gchar *first_str,
...)
{
- GdkPixbuf *smiley;
+ GdkPixbuf *pixbuf;
va_list var_args;
g_return_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager));
g_return_if_fail (!EMP_STR_EMPTY (icon_name));
g_return_if_fail (!EMP_STR_EMPTY (first_str));
- smiley = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
- if (smiley) {
+ pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+ if (pixbuf) {
+ gchar *path;
+
va_start (var_args, first_str);
- smiley_manager_add_valist (manager, smiley, first_str, var_args);
+ path = empathy_filename_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+ smiley_manager_add_valist (manager, pixbuf, path, first_str, var_args);
va_end (var_args);
- g_object_unref (smiley);
+ g_object_unref (pixbuf);
}
}
void
-empathy_smiley_manager_add_from_pixbuf (EmpathySmileyManager *manager,
- GdkPixbuf *smiley,
- const gchar *first_str,
- ...)
-{
- va_list var_args;
-
- g_return_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager));
- g_return_if_fail (GDK_IS_PIXBUF (smiley));
- g_return_if_fail (!EMP_STR_EMPTY (first_str));
-
- va_start (var_args, first_str);
- smiley_manager_add_valist (manager, smiley, first_str, var_args);
- va_end (var_args);
-}
-
-void
empathy_smiley_manager_load (EmpathySmileyManager *manager)
{
g_return_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager));
@@ -320,7 +322,9 @@ empathy_smiley_manager_parse (EmpathySmileyManager *manager,
if (cur_tree == priv->tree) {
if (child) {
if (t > cur_str) {
- smiley = smiley_new (NULL, g_strndup (cur_str, t - cur_str));
+ smiley = smiley_new (NULL,
+ g_strndup (cur_str, t - cur_str),
+ NULL);
smileys = g_slist_prepend (smileys, smiley);
}
cur_str = t;
@@ -335,7 +339,9 @@ empathy_smiley_manager_parse (EmpathySmileyManager *manager,
continue;
}
- smiley = smiley_new (cur_tree->pixbuf, g_strndup (cur_str, t - cur_str));
+ smiley = smiley_new (cur_tree->pixbuf,
+ g_strndup (cur_str, t - cur_str),
+ cur_tree->path);
smileys = g_slist_prepend (smileys, smiley);
if (cur_tree->pixbuf) {
cur_str = t;
@@ -350,7 +356,9 @@ empathy_smiley_manager_parse (EmpathySmileyManager *manager,
}
}
- smiley = smiley_new (cur_tree->pixbuf, g_strndup (cur_str, t - cur_str));
+ smiley = smiley_new (cur_tree->pixbuf,
+ g_strndup (cur_str, t - cur_str),
+ cur_tree->path);
smileys = g_slist_prepend (smileys, smiley);
return g_slist_reverse (smileys);