* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Dafydd Harrie <dafydd.harries@collabora.co.uk>
* Xavier Claessens <xclaesse@gmail.com>
*/
} 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);
tree->c = c;
tree->pixbuf = NULL;
tree->childrens = NULL;
+ tree->path = NULL;
return tree;
}
g_slice_free (SmileyManagerTree, tree);
}
+/* Note: This function takes the ownership of str */
static EmpathySmiley *
-smiley_new (GdkPixbuf *pixbuf, const gchar *str)
+smiley_new (GdkPixbuf *pixbuf, gchar *str, const gchar *path)
{
EmpathySmiley *smiley;
if (pixbuf) {
smiley->pixbuf = g_object_ref (pixbuf);
}
- smiley->str = g_strdup (str);
+ smiley->str = str;
+ smiley->path = path;
return smiley;
}
smiley_manager_finalize (GObject *object)
{
EmpathySmileyManagerPriv *priv = GET_PRIV (object);
+ GSList *l;
smiley_manager_tree_free (priv->tree);
- g_slist_foreach (priv->smileys, (GFunc) empathy_smiley_free, NULL);
+ 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_free (priv->smileys);
}
(type, n_props, props);
manager_singleton = EMPATHY_SMILEY_MANAGER (retval);
- g_object_add_weak_pointer (retval, (gpointer *) &manager_singleton);
+ g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
}
return retval;
static void
smiley_manager_tree_insert (SmileyManagerTree *tree,
- GdkPixbuf *smiley,
- const gchar *str)
+ GdkPixbuf *pixbuf,
+ const gchar *str,
+ const gchar *path)
{
SmileyManagerTree *child;
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, 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
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)
{
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));
+ smiley = smiley_new (NULL,
+ g_strndup (cur_str, t - cur_str),
+ NULL);
smileys = g_slist_prepend (smileys, smiley);
}
cur_str = t;
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;
}
}
- 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);
typedef struct {
EmpathySmileyManager *manager;
EmpathySmiley *smiley;
- EmpathySmileyMenuFunc func;
- gpointer user_data;
+ EmpathySmileyMenuFunc func;
+ gpointer user_data;
} ActivateData;
static void
smiley_menu_data_free (gpointer user_data,
GClosure *closure)
{
- ActivateData *data = (ActivateData*) user_data;
+ ActivateData *data = (ActivateData *) user_data;
g_object_unref (data->manager);
g_slice_free (ActivateData, data);
smiley_menu_activate_cb (GtkMenuItem *menuitem,
gpointer user_data)
{
- ActivateData *data = (ActivateData*) user_data;
+ ActivateData *data = (ActivateData *) user_data;
data->func (data->manager, data->smiley, data->user_data);
}
item = gtk_image_menu_item_new_with_label ("");
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
gtk_menu_attach (GTK_MENU (menu), item,
x, x + 1, y, y + 1);