Fri, 06 Jan 2006 04:46:00 +0000
[gaim-migrate @ 15091]
" Adds an emblem to a buddy if they have a queued message
(hidden conversation). In the large buddy list it is
added in the northwest corner, sliding the existing
northwest emblem (if specified) to the northeast
position and discarding the northeast emblem. In the
small buddy list, the emblem is added to the southeast.
Attached is a patch and an emblem image to be dropped
in pixmaps/status/default/. The emblem image is a
scaled down version of the send-im.png image." -- Casey Harkins
as I asked for this patch, and since there don't seem to be objections to
it (yet), I'm going ahead and applying it.
committer: Luke Schierer <lschiere@pidgin.im>
| 10295 | 1 | /* |
| 2 | * Themes for Gaim | |
| 3 | * | |
| 4 | * Gaim is the legal property of its developers, whose names are too numerous | |
| 5 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 6 | * source distribution. | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
7 | * |
| 10295 | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 | * | |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 24 | #include "gtkgaim.h" | |
| 25 | ||
| 26 | #include "conversation.h" | |
| 27 | #include "debug.h" | |
| 28 | #include "prpl.h" | |
| 29 | #include "util.h" | |
| 30 | ||
| 31 | #include "gtkconv.h" | |
| 32 | #include "gtkdialogs.h" | |
| 33 | #include "gtkimhtml.h" | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
34 | #include "gtkthemes.h" |
| 10295 | 35 | |
| 36 | GSList *smiley_themes = NULL; | |
| 37 | struct smiley_theme *current_smiley_theme; | |
| 38 | ||
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
39 | gboolean gaim_gtkthemes_smileys_disabled() |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
40 | { |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
41 | if (!current_smiley_theme) |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
42 | return 1; |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
43 | |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
44 | return strcmp(current_smiley_theme->name, "none") == 0; |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
45 | } |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
46 | |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
47 | void gaim_gtkthemes_smiley_themeize(GtkWidget *imhtml) |
| 10295 | 48 | { |
| 49 | struct smiley_list *list; | |
| 50 | if (!current_smiley_theme) | |
| 51 | return; | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
52 | |
| 10295 | 53 | gtk_imhtml_remove_smileys(GTK_IMHTML(imhtml)); |
| 54 | list = current_smiley_theme->list; | |
| 55 | while (list) { | |
| 56 | char *sml = !strcmp(list->sml, "default") ? NULL : list->sml; | |
| 57 | GSList *icons = list->smileys; | |
| 58 | while (icons) { | |
| 59 | gtk_imhtml_associate_smiley(GTK_IMHTML(imhtml), sml, icons->data); | |
| 60 | icons = icons->next; | |
| 61 | } | |
| 62 | list = list->next; | |
| 63 | } | |
| 64 | } | |
| 65 | ||
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
66 | void gaim_gtkthemes_load_smiley_theme(const char *file, gboolean load) |
| 10295 | 67 | { |
|
10589
4e10236e06d4
[gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents:
10295
diff
changeset
|
68 | FILE *f = g_fopen(file, "r"); |
| 10295 | 69 | char buf[256]; |
| 70 | char *i; | |
| 71 | struct smiley_theme *theme=NULL; | |
| 72 | struct smiley_list *list = NULL; | |
| 73 | GSList *lst = smiley_themes; | |
| 74 | char *dirname; | |
| 75 | ||
| 76 | if (!f) | |
| 77 | return; | |
| 78 | ||
| 79 | while (lst) { | |
| 80 | struct smiley_theme *thm = lst->data; | |
| 81 | if (!strcmp(thm->path, file)) { | |
| 82 | theme = thm; | |
| 83 | break; | |
| 84 | } | |
| 85 | lst = lst->next; | |
| 86 | } | |
| 87 | ||
| 88 | if (!theme) { | |
| 89 | theme = g_new0(struct smiley_theme, 1); | |
| 90 | theme->path = g_strdup(file); | |
| 91 | smiley_themes = g_slist_append(smiley_themes, theme); | |
| 92 | } | |
| 93 | ||
| 94 | dirname = g_path_get_dirname(file); | |
| 95 | if (load) { | |
| 96 | if (current_smiley_theme) { | |
| 97 | GSList *already_freed = NULL; | |
| 98 | struct smiley_list *wer = current_smiley_theme->list, *wer2; | |
| 99 | while (wer) { | |
| 100 | while (wer->smileys) { | |
| 101 | GtkIMHtmlSmiley *uio = wer->smileys->data; | |
| 102 | if (uio->icon) | |
| 103 | g_object_unref(uio->icon); | |
| 104 | if (!g_slist_find(already_freed, uio->file)) { | |
| 105 | g_free(uio->file); | |
| 106 | already_freed = g_slist_append(already_freed, uio->file); | |
| 107 | } | |
| 108 | g_free(uio->smile); | |
| 109 | g_free(uio); | |
| 110 | wer->smileys=g_slist_remove(wer->smileys, uio); | |
| 111 | } | |
| 112 | wer2 = wer->next; | |
| 113 | g_free(wer->sml); | |
| 114 | g_free(wer); | |
| 115 | wer = wer2; | |
| 116 | } | |
| 117 | current_smiley_theme->list = NULL; | |
| 118 | g_slist_free(already_freed); | |
| 119 | } | |
| 120 | current_smiley_theme = theme; | |
| 121 | } | |
| 122 | ||
| 123 | ||
| 124 | while (!feof(f)) { | |
| 125 | if (!fgets(buf, sizeof(buf), f)) { | |
| 126 | break; | |
| 127 | } | |
| 128 | ||
| 129 | if (buf[0] == '#' || buf[0] == '\0') | |
| 130 | continue; | |
| 131 | ||
| 132 | i = buf; | |
| 133 | while (isspace(*i)) | |
| 134 | i++; | |
| 135 | ||
| 136 | if (*i == '[' && strchr(i, ']') && load) { | |
| 137 | struct smiley_list *child = g_new0(struct smiley_list, 1); | |
| 138 | child->sml = g_strndup(i+1, strchr(i, ']') - i - 1); | |
| 139 | if (theme->list) | |
| 140 | list->next = child; | |
| 141 | else | |
| 142 | theme->list = child; | |
| 143 | list = child; | |
| 144 | } else if (!g_ascii_strncasecmp(i, "Name=", strlen("Name="))) { | |
| 145 | if(theme->name) | |
| 146 | g_free(theme->name); | |
| 147 | theme->name = g_strdup(i+ strlen("Name=")); | |
| 148 | theme->name[strlen(theme->name)-1] = 0; | |
| 149 | } else if (!g_ascii_strncasecmp(i, "Description=", strlen("Description="))) { | |
| 150 | if(theme->desc) | |
| 151 | g_free(theme->desc); | |
| 152 | theme->desc = g_strdup(i + strlen("Description=")); | |
| 153 | theme->desc[strlen(theme->desc)-1] = 0; | |
| 154 | } else if (!g_ascii_strncasecmp(i, "Icon=", strlen("Icon="))) { | |
| 155 | if(theme->icon) | |
| 156 | g_free(theme->icon); | |
| 157 | theme->icon = g_build_filename(dirname, i + strlen("Icon="), NULL); | |
| 158 | theme->icon[strlen(theme->icon)-1] = 0; | |
| 159 | } else if (!g_ascii_strncasecmp(i, "Author=", strlen("Author="))) { | |
| 160 | if(theme->author) | |
| 161 | g_free(theme->author); | |
| 162 | theme->author = g_strdup(i + strlen("Author=")); | |
| 163 | theme->author[strlen(theme->author)-1] = 0; | |
| 164 | } else if (load && list) { | |
| 165 | gboolean hidden = FALSE; | |
| 166 | char *sfile = NULL; | |
| 167 | ||
| 168 | if (*i == '!' && *(i + 1) == ' ') { | |
| 169 | hidden = TRUE; | |
| 170 | i = i + 2; | |
| 171 | } | |
| 172 | while (*i) { | |
| 173 | char l[64]; | |
| 174 | int li = 0; | |
| 175 | while (!isspace(*i)) | |
| 176 | l[li++] = *(i++); | |
| 177 | if (!sfile) { | |
| 178 | l[li] = 0; | |
| 179 | sfile = g_build_filename(dirname, l, NULL); | |
| 180 | } else { | |
| 181 | GtkIMHtmlSmiley *smiley = g_new0(GtkIMHtmlSmiley, 1); | |
| 182 | l[li] = 0; | |
| 183 | smiley->file = sfile; | |
| 184 | smiley->smile = g_strdup(l); | |
| 185 | smiley->hidden = hidden; | |
| 186 | list->smileys = g_slist_append(list->smileys, smiley); | |
| 187 | } | |
| 188 | while (isspace(*i)) | |
| 189 | i++; | |
| 190 | ||
| 191 | } | |
| 192 | } | |
| 193 | } | |
| 194 | ||
| 195 | if (load) { | |
| 196 | GList *cnv; | |
| 197 | ||
| 198 | for (cnv = gaim_get_conversations(); cnv != NULL; cnv = cnv->next) { | |
| 199 | GaimConversation *conv = cnv->data; | |
| 200 | ||
| 201 | if (GAIM_IS_GTK_CONVERSATION(conv)) { | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
202 | gaim_gtkthemes_smiley_themeize(GAIM_GTK_CONVERSATION(conv)->imhtml); |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
203 | gaim_gtkthemes_smiley_themeize(GAIM_GTK_CONVERSATION(conv)->entry); |
| 10295 | 204 | } |
| 205 | } | |
| 206 | } | |
| 207 | ||
| 208 | g_free(dirname); | |
| 209 | fclose(f); | |
| 210 | } | |
| 211 | ||
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
212 | void gaim_gtkthemes_smiley_theme_probe() |
| 10295 | 213 | { |
| 214 | GDir *dir; | |
| 215 | const gchar *file; | |
| 216 | gchar *path; | |
| 217 | int l; | |
| 218 | ||
| 219 | char* probedirs[3]; | |
| 220 | probedirs[0] = g_build_filename(DATADIR, "pixmaps", "gaim", "smileys", NULL); | |
| 221 | probedirs[1] = g_build_filename(gaim_user_dir(), "smileys", NULL); | |
| 222 | probedirs[2] = 0; | |
| 223 | for (l=0; probedirs[l]; l++) { | |
| 224 | dir = g_dir_open(probedirs[l], 0, NULL); | |
| 225 | if (dir) { | |
| 226 | while ((file = g_dir_read_name(dir))) { | |
| 227 | path = g_build_filename(probedirs[l], file, "theme", NULL); | |
| 228 | ||
| 229 | /* Here we check to see that the theme has proper syntax. | |
| 230 | * We set the second argument to FALSE so that it doesn't load | |
| 231 | * the theme yet. | |
| 232 | */ | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
233 | gaim_gtkthemes_load_smiley_theme(path, FALSE); |
| 10295 | 234 | g_free(path); |
| 235 | } | |
| 236 | g_dir_close(dir); | |
| 237 | } else if (l == 1) { | |
|
10589
4e10236e06d4
[gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents:
10295
diff
changeset
|
238 | g_mkdir(probedirs[l], S_IRUSR | S_IWUSR | S_IXUSR); |
| 10295 | 239 | } |
| 240 | g_free(probedirs[l]); | |
| 241 | } | |
| 242 | } | |
| 243 | ||
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
244 | GSList *gaim_gtkthemes_get_proto_smileys(const char *id) { |
| 10295 | 245 | GaimPlugin *proto; |
| 246 | struct smiley_list *list, *def; | |
| 247 | ||
| 248 | if ((current_smiley_theme == NULL) || (current_smiley_theme->list == NULL)) | |
| 249 | return NULL; | |
| 250 | ||
| 251 | def = list = current_smiley_theme->list; | |
| 252 | ||
| 253 | if (id == NULL) | |
| 254 | return def->smileys; | |
| 255 | ||
| 256 | proto = gaim_find_prpl(id); | |
| 257 | ||
| 258 | while (list) { | |
| 259 | if (!strcmp(list->sml, "default")) | |
| 260 | def = list; | |
| 261 | else if (proto && !strcmp(proto->info->name, list->sml)) | |
| 262 | break; | |
| 263 | ||
| 264 | list = list->next; | |
| 265 | } | |
| 266 | ||
| 267 | return list ? list->smileys : def->smileys; | |
| 268 | } | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
269 | |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
270 | void gaim_gtkthemes_init() |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
271 | { |
|
11557
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
272 | GSList *l; |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
273 | const char *current_theme = |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
274 | gaim_prefs_get_string("/gaim/gtk/smileys/theme"); |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
275 | |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
276 | gaim_gtkthemes_smiley_theme_probe(); |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
277 | |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
278 | for (l = smiley_themes; l; l = l->next) { |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
279 | struct smiley_theme *smile = l->data; |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
280 | if (smile->name && strcmp(current_theme, smile->name) == 0) { |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
281 | gaim_gtkthemes_load_smiley_theme(smile->path, TRUE); |
|
11557
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
282 | break; |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
283 | } |
|
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
284 | } |
|
11557
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
285 | |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
286 | /* If we still don't have a smiley theme, choose the first one */ |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
287 | if (!current_smiley_theme && smiley_themes) { |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
288 | struct smiley_theme *smile = smiley_themes->data; |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
289 | gaim_gtkthemes_load_smiley_theme(smile->path, TRUE); |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
290 | } |
|
7a20e7fb7915
[gaim-migrate @ 13819]
Daniel Atallah <datallah@pidgin.im>
parents:
11525
diff
changeset
|
291 | |
|
11525
1d06283bdcc9
[gaim-migrate @ 13773]
Francesco Fracassi <ffracassi@users.sourceforge.net>
parents:
10589
diff
changeset
|
292 | } |