GSList * empathy_smiley_manager_parse (EmpathySmileyManager *manager, const gchar *text) { EmpathySmileyManagerPriv *priv = GET_PRIV (manager); EmpathySmiley *smiley; SmileyManagerTree *cur_tree = priv->tree; const gchar *t; const gchar *cur_str = text; GSList *smileys = NULL; g_return_val_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager), NULL); g_return_val_if_fail (text != NULL, NULL); for (t = text; *t; t = g_utf8_next_char (t)) { SmileyManagerTree *child; gunichar c; c = g_utf8_get_char (t); child = smiley_manager_tree_find_child (cur_tree, c); if (cur_tree == priv->tree) { if (child) { if (t > cur_str) { smiley = smiley_new (NULL, g_strndup (cur_str, t - cur_str)); smileys = g_slist_prepend (smileys, smiley); } cur_str = t; cur_tree = child; } continue; } if (child) { cur_tree = child; continue; } smiley = smiley_new (cur_tree->pixbuf, g_strndup (cur_str, t - cur_str)); smileys = g_slist_prepend (smileys, smiley); if (cur_tree->pixbuf) { cur_str = t; cur_tree = smiley_manager_tree_find_child (priv->tree, c); if (!cur_tree) { cur_tree = priv->tree; } } else { cur_str = t; cur_tree = priv->tree; } } smiley = smiley_new (cur_tree->pixbuf, g_strndup (cur_str, t - cur_str)); smileys = g_slist_prepend (smileys, smiley); return g_slist_reverse (smileys); }
static void smiley_manager_add_valist (EmpathySmileyManager *manager, GdkPixbuf *smiley, const gchar *first_str, va_list var_args) { EmpathySmileyManagerPriv *priv = GET_PRIV (manager); const gchar *str; for (str = first_str; str; str = va_arg (var_args, gchar*)) { smiley_manager_tree_insert (priv->tree, smiley, str); } priv->smileys = g_slist_prepend (priv->smileys, smiley_new (smiley, first_str)); }
static void smiley_manager_add_valist (EmpathySmileyManager *manager, 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, pixbuf, str, path); } /* 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); }
static void smiley_manager_add_valist (EmpathySmileyManager *manager, GdkPixbuf *pixbuf, const 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, pixbuf, str, path); } g_object_set_data_full (G_OBJECT (pixbuf), "smiley_str", g_strdup (first_str), g_free); smiley = smiley_new (pixbuf, first_str); priv->smileys = g_slist_prepend (priv->smileys, smiley); }