libpurple/smiley-list.c

Fri, 04 Apr 2014 22:23:32 +0200

author
Tomasz Wasilczyk <twasilczyk@pidgin.im>
date
Fri, 04 Apr 2014 22:23:32 +0200
changeset 35756
fe6aba70046e
parent 35755
d91c44b4a8e6
child 35757
05981ff3fb7b
permissions
-rw-r--r--

Custom smileys: make it possible to find them by prpl

35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1 /* purple
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2 *
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3 * Purple is the legal property of its developers, whose names are too numerous
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
4 * to list here. Please refer to the COPYRIGHT file distributed with this
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
5 * source distribution.
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
6 *
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
10 * (at your option) any later version.
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
11 *
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
15 * GNU General Public License for more details.
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
16 *
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
20 */
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
21
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
22 #include "smiley-list.h"
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
23
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
24 #include "dbus-maybe.h"
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
25 #include "debug.h"
35716
80bedd712883 Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35713
diff changeset
26 #include "smiley-parser.h"
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
27 #include "trie.h"
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
28
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
29 #define PURPLE_SMILEY_LIST_GET_PRIVATE(obj) \
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
30 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_SMILEY_LIST, \
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
31 PurpleSmileyListPrivate))
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
32
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
33 typedef struct {
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
34 GList *smileys;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
35 GList *smileys_end;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
36 PurpleTrie *trie;
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
37 GHashTable *path_map;
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
38 GHashTable *shortcut_map;
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
39
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
40 gboolean drop_failed_remotes;
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
41 } PurpleSmileyListPrivate;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
42
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
43 enum
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
44 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
45 PROP_0,
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
46 PROP_DROP_FAILED_REMOTES,
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
47 PROP_LAST
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
48 };
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
49
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
50 static GParamSpec *properties[PROP_LAST];
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
51
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
52 static void
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
53 _list_append2(GList **head_p, GList **tail_p, gpointer data)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
54 {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
55 GList *head = *head_p;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
56 GList *tail = *tail_p;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
57 GList *elem;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
58
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
59 g_return_if_fail((head == NULL) == (tail == NULL));
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
60 g_return_if_fail((tail == NULL) || (tail->next == NULL));
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
61
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
62 elem = g_list_alloc();
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
63 elem->data = data;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
64 elem->prev = tail;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
65 elem->next = NULL;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
66
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
67 if (head) {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
68 tail->next = elem;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
69 *tail_p = elem;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
70 } else
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
71 *head_p = *tail_p = elem;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
72 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
73
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
74 static void
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
75 _list_remove_link2(GList **head_p, GList **tail_p, GList *link)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
76 {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
77 GList *head = *head_p;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
78 GList *tail = *tail_p;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
79
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
80 g_return_if_fail(head != NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
81 g_return_if_fail(tail != NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
82
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
83 if (link == tail)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
84 *tail_p = tail->prev;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
85 *head_p = g_list_remove_link(head, link);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
86 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
87
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
88 /*******************************************************************************
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
89 * API implementation
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
90 ******************************************************************************/
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
91
35709
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
92 PurpleSmileyList *
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
93 purple_smiley_list_new(void)
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
94 {
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
95 return g_object_new(PURPLE_TYPE_SMILEY_LIST, NULL);
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
96 }
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
97
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
98 static void
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
99 remote_smiley_failed(PurpleSmiley *smiley, gpointer _list)
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
100 {
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
101 PurpleSmileyList *list = _list;
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
102
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
103 purple_debug_info("smiley-list", "remote smiley '%s' has failed, "
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
104 "removing it from the list...",
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
105 purple_smiley_get_shortcut(smiley));
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
106
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
107 purple_smiley_list_remove(list, smiley);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
108 }
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
109
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
110 gboolean
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
111 purple_smiley_list_add(PurpleSmileyList *list, PurpleSmiley *smiley)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
112 {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
113 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
114 const gchar *smiley_path;
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
115 gboolean succ;
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
116 gchar *shortcut_escaped;
35716
80bedd712883 Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35713
diff changeset
117 const gchar *shortcut;
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
118
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
119 g_return_val_if_fail(priv != NULL, FALSE);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
120 g_return_val_if_fail(PURPLE_IS_SMILEY(smiley), FALSE);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
121
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
122 if (g_object_get_data(G_OBJECT(smiley), "purple-smiley-list") != NULL) {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
123 purple_debug_warning("smiley-list",
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
124 "smiley is already associated with some list");
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
125 return FALSE;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
126 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
127
35716
80bedd712883 Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35713
diff changeset
128 shortcut = purple_smiley_get_shortcut(smiley);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
129
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
130 if (g_hash_table_lookup(priv->shortcut_map, shortcut) != NULL)
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
131 return FALSE;
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
132
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
133 shortcut_escaped = g_markup_escape_text(shortcut, -1);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
134 succ = purple_trie_add(priv->trie, shortcut_escaped, smiley);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
135 g_free(shortcut_escaped);
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
136 if (!succ)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
137 return FALSE;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
138
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
139 g_object_ref(smiley);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
140 _list_append2(&priv->smileys, &priv->smileys_end, smiley);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
141 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list", list);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
142 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list-elem",
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
143 priv->smileys_end);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
144
35747
25085b485441 Remote smileys: parse them too
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
145 g_hash_table_insert(priv->shortcut_map, g_strdup(shortcut), smiley);
25085b485441 Remote smileys: parse them too
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
146
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
147 /* We don't expect non-remote non-ready smileys, but let's check it just
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
148 * to be safe. */
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
149 if (priv->drop_failed_remotes && !purple_smiley_is_ready(smiley) &&
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
150 PURPLE_IS_REMOTE_SMILEY(smiley))
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
151 {
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
152 g_signal_connect_object(smiley, "failed",
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
153 G_CALLBACK(remote_smiley_failed), list, 0);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
154 }
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
155
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
156 smiley_path = purple_smiley_get_path(smiley);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
157
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
158 /* TODO: add to the table, when the smiley sets the path */
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
159 if (!smiley_path)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
160 return TRUE;
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
161
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
162 if (g_hash_table_lookup(priv->path_map, smiley_path) == NULL) {
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
163 g_hash_table_insert(priv->path_map,
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
164 g_strdup(smiley_path), smiley);
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
165 }
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
166
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
167 return TRUE;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
168 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
169
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
170 void
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
171 purple_smiley_list_remove(PurpleSmileyList *list, PurpleSmiley *smiley)
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
172 {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
173 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
174 GList *list_elem, *it;
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
175 const gchar *shortcut, *path;
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
176 gchar *shortcut_escaped;
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
177
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
178 g_return_if_fail(priv != NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
179 g_return_if_fail(PURPLE_IS_SMILEY(smiley));
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
180
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
181 if (g_object_get_data(G_OBJECT(smiley), "purple-smiley-list") != list) {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
182 purple_debug_warning("smiley-list", "remove: invalid list");
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
183 return;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
184 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
185
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
186 list_elem = g_object_get_data(G_OBJECT(smiley),
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
187 "purple-smiley-list-elem");
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
188
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
189 shortcut = purple_smiley_get_shortcut(smiley);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
190 path = purple_smiley_get_path(smiley);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
191
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
192 g_hash_table_remove(priv->shortcut_map, shortcut);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
193 if (path)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
194 g_hash_table_remove(priv->path_map, path);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
195
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
196 shortcut_escaped = g_markup_escape_text(shortcut, -1);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
197 purple_trie_remove(priv->trie, shortcut);
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35755
diff changeset
198 g_free(shortcut_escaped);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
199
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
200 _list_remove_link2(&priv->smileys, &priv->smileys_end, list_elem);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
201
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
202 /* re-add entry to path_map if smiley was not unique */
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35738
diff changeset
203 for (it = priv->smileys; it && path; it = g_list_next(it)) {
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
204 PurpleSmiley *smiley = it->data;
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
205
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
206 if (g_strcmp0(purple_smiley_get_path(smiley), path) == 0) {
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
207 g_hash_table_insert(priv->path_map,
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
208 g_strdup(path), smiley);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
209 break;
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
210 }
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
211 }
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
212
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
213 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list", NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
214 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list-elem", NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
215 g_object_unref(smiley);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
216 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
217
35738
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
218 gboolean
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
219 purple_smiley_list_is_empty(PurpleSmileyList *list)
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
220 {
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
221 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
222
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
223 g_return_val_if_fail(priv != NULL, TRUE);
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
224
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
225 return (priv->smileys == NULL);
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
226 }
030ce6840163 Smileys: toolbar button sensitivity
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35728
diff changeset
227
35717
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
228 PurpleSmiley *
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
229 purple_smiley_list_get_by_shortcut(PurpleSmileyList *list,
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
230 const gchar *shortcut)
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
231 {
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
232 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
233
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
234 g_return_val_if_fail(priv != NULL, NULL);
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
235
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
236 return g_hash_table_lookup(priv->shortcut_map, shortcut);
35717
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
237 }
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35716
diff changeset
238
35709
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
239 PurpleTrie *
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
240 purple_smiley_list_get_trie(PurpleSmileyList *list)
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
241 {
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
242 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
243
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
244 g_return_val_if_fail(priv != NULL, NULL);
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
245
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
246 return priv->trie;
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
247 }
0d7a84931572 Smileys: implement and use new parser, only themes for now
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35702
diff changeset
248
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
249 GList *
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
250 purple_smiley_list_get_unique(PurpleSmileyList *list)
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
251 {
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
252 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
253
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
254 g_return_val_if_fail(priv != NULL, NULL);
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
255
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
256 return g_hash_table_get_values(priv->path_map);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
257 }
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
258
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
259 GList *
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
260 purple_smiley_list_get_all(PurpleSmileyList *list)
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
261 {
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
262 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
263
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
264 g_return_val_if_fail(priv != NULL, NULL);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
265
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
266 return g_hash_table_get_values(priv->shortcut_map);
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
267 }
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
268
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
269
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
270 /*******************************************************************************
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
271 * Object stuff
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
272 ******************************************************************************/
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
273
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
274 static void
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
275 purple_smiley_list_init(GTypeInstance *instance, gpointer klass)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
276 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
277 PurpleSmileyList *sl = PURPLE_SMILEY_LIST(instance);
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
278 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(sl);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
279
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
280 priv->trie = purple_trie_new();
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
281 priv->path_map = g_hash_table_new_full(g_str_hash, g_str_equal,
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
282 g_free, NULL);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
283 priv->shortcut_map = g_hash_table_new_full(g_str_hash, g_str_equal,
35713
4423f463a782 Smileys in PidginWebviewToolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35709
diff changeset
284 g_free, NULL);
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
285
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
286 PURPLE_DBUS_REGISTER_POINTER(sl, PurpleSmileyList);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
287 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
288
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
289 static void
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
290 purple_smiley_list_finalize(GObject *obj)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
291 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
292 PurpleSmileyList *sl = PURPLE_SMILEY_LIST(obj);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
293 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(sl);
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
294 GList *it;
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
295
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
296 g_object_unref(priv->trie);
35728
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
297 g_hash_table_destroy(priv->path_map);
6cd9aee7f276 Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
298 g_hash_table_destroy(priv->shortcut_map);
35702
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
299
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
300 for (it = priv->smileys; it; it = g_list_next(it)) {
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
301 PurpleSmiley *smiley = it->data;
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
302 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list", NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
303 g_object_set_data(G_OBJECT(smiley), "purple-smiley-list-elem", NULL);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
304 g_object_unref(smiley);
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
305 }
06a934baa610 Smiley list: add/remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35701
diff changeset
306 g_list_free(priv->smileys);
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
307
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
308 PURPLE_DBUS_UNREGISTER_POINTER(sl);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
309 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
310
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
311 static void
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
312 purple_smiley_list_get_property(GObject *object, guint par_id, GValue *value,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
313 GParamSpec *pspec)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
314 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
315 PurpleSmileyList *sl = PURPLE_SMILEY_LIST(object);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
316 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(sl);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
317
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
318 switch (par_id) {
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
319 case PROP_DROP_FAILED_REMOTES:
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
320 g_value_set_boolean(value, priv->drop_failed_remotes);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
321 break;
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
322 default:
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
323 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
324 break;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
325 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
326 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
327
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
328 static void
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
329 purple_smiley_list_set_property(GObject *object, guint par_id, const GValue *value,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
330 GParamSpec *pspec)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
331 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
332 PurpleSmileyList *sl = PURPLE_SMILEY_LIST(object);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
333 PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(sl);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
334
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
335 switch (par_id) {
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
336 case PROP_DROP_FAILED_REMOTES:
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
337 priv->drop_failed_remotes = g_value_get_boolean(value);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
338 /* XXX: we could scan for remote smiley's on our list
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
339 * and change the setting, but we don't care that much.
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
340 */
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
341 break;
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
342 default:
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
343 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
344 break;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
345 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
346 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
347
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
348 static void
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
349 purple_smiley_list_class_init(PurpleSmileyListClass *klass)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
350 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
351 GObjectClass *gobj_class = G_OBJECT_CLASS(klass);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
352
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
353 g_type_class_add_private(klass, sizeof(PurpleSmileyListPrivate));
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
354
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
355 gobj_class->get_property = purple_smiley_list_get_property;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
356 gobj_class->set_property = purple_smiley_list_set_property;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
357 gobj_class->finalize = purple_smiley_list_finalize;
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
358
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
359 properties[PROP_DROP_FAILED_REMOTES] = g_param_spec_boolean(
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
360 "drop-failed-remotes", "Drop failed PurpleRemoteSmileys",
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
361 "Watch added remote smileys and remove them from the list, "
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
362 "if they change their state to failed", FALSE,
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
363 G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
364
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35747
diff changeset
365 g_object_class_install_properties(gobj_class, PROP_LAST, properties);
35701
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
366 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
367
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
368 GType
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
369 purple_smiley_list_get_type(void)
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
370 {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
371 static GType type = 0;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
372
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
373 if (G_UNLIKELY(type == 0)) {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
374 static const GTypeInfo info = {
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
375 .class_size = sizeof(PurpleSmileyListClass),
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
376 .class_init = (GClassInitFunc)purple_smiley_list_class_init,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
377 .instance_size = sizeof(PurpleSmileyList),
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
378 .instance_init = purple_smiley_list_init,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
379 };
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
380
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
381 type = g_type_register_static(G_TYPE_OBJECT,
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
382 "PurpleSmileyList", &info, 0);
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
383 }
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
384
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
385 return type;
34f4a4318d19 Initial PurpleSmileyList implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
386 }

mercurial