Mercurial > pidgin.yaz
annotate src/themes.c @ 7834:99ffabc6ce73
[gaim-migrate @ 8487]
This patch from Mike Hearn should fix HTTP proxy support for MSN, and
provides another step toward the MSN HTTP access method working. The HTTP
proxy may need testing from other people, but looks like it shouldn't give
any problems.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Fri, 12 Dec 2003 00:14:40 +0000 |
parents | 662a33ce4343 |
children | 1b8261f374ea |
rev | line source |
---|---|
4263 | 1 /* |
2 * Themes for Gaim | |
3 * | |
4 * Copyright (C) 2003, Sean Egan <bj91704@binghamton.edu> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
21 #include "gtkinternal.h" |
4263 | 22 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
23 #include "conversation.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
24 #include "debug.h" |
4667 | 25 #include "prpl.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
26 #include "util.h" |
4263 | 27 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
28 #include "gtkconv.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
29 #include "gtkimhtml.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
30 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
31 #include "ui.h" |
4321
1cfad48b7d93
[gaim-migrate @ 4576]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4301
diff
changeset
|
32 |
4263 | 33 struct smiley_list { |
34 char *sml; | |
35 GSList *smileys; | |
36 struct smiley_list *next; | |
37 }; | |
38 | |
4892 | 39 GSList *smiley_themes = NULL; |
4288 | 40 struct smiley_theme *current_smiley_theme; |
4263 | 41 |
42 void smiley_themeize(GtkWidget *imhtml) | |
43 { | |
44 struct smiley_list *list; | |
45 if (!current_smiley_theme) | |
46 return; | |
47 | |
48 gtk_imhtml_remove_smileys(GTK_IMHTML(imhtml)); | |
49 list = current_smiley_theme->list; | |
50 while (list) { | |
51 char *sml = !strcmp(list->sml, "default") ? NULL : list->sml; | |
52 GSList *icons = list->smileys; | |
53 while (icons) { | |
54 gtk_imhtml_associate_smiley(GTK_IMHTML(imhtml), sml, icons->data); | |
55 icons = icons->next; | |
56 } | |
57 list = list->next; | |
58 } | |
59 } | |
60 | |
4892 | 61 void load_smiley_theme(const char *file, gboolean load) |
4263 | 62 { |
63 FILE *f = fopen(file, "r"); | |
64 char buf[256]; | |
65 char *i; | |
66 struct smiley_theme *theme=NULL; | |
67 struct smiley_list *list = NULL; | |
68 GSList *lst = smiley_themes; | |
69 char *dirname; | |
4892 | 70 |
71 if (!f) | |
72 return; | |
4630 | 73 |
4263 | 74 while (lst) { |
75 struct smiley_theme *thm = lst->data; | |
4288 | 76 if (!strcmp(thm->path, file)) { |
4263 | 77 theme = thm; |
78 break; | |
79 } | |
80 lst = lst->next; | |
81 } | |
4630 | 82 |
4263 | 83 if (!theme) { |
84 theme = g_new0(struct smiley_theme, 1); | |
4288 | 85 theme->path = g_strdup(file); |
4892 | 86 smiley_themes = g_slist_append(smiley_themes, theme); |
4263 | 87 } |
4630 | 88 |
4263 | 89 dirname = g_path_get_dirname(file); |
90 if (load) { | |
91 if (current_smiley_theme) { | |
4288 | 92 GSList *already_freed = NULL; |
4892 | 93 struct smiley_list *wer = current_smiley_theme->list, *wer2; |
4263 | 94 while (wer) { |
4288 | 95 while (wer->smileys) { |
96 GtkIMHtmlSmiley *uio = wer->smileys->data; | |
4263 | 97 if (uio->icon) |
98 g_object_unref(uio->icon); | |
4288 | 99 if (!g_slist_find(already_freed, uio->file)) { |
100 g_free(uio->file); | |
101 already_freed = g_slist_append(already_freed, uio->file); | |
102 } | |
4263 | 103 g_free(uio->smile); |
4288 | 104 g_free(uio); |
105 wer->smileys=g_slist_remove(wer->smileys, uio); | |
4263 | 106 } |
4892 | 107 wer2 = wer->next; |
108 g_free(wer->sml); | |
109 g_free(wer); | |
110 wer = wer2; | |
4263 | 111 } |
4288 | 112 current_smiley_theme->list = NULL; |
113 g_slist_free(already_freed); | |
4263 | 114 } |
4288 | 115 current_smiley_theme = theme; |
4263 | 116 } |
4816 | 117 |
118 | |
4263 | 119 while (!feof(f)) { |
120 if (!fgets(buf, sizeof(buf), f)) { | |
4288 | 121 break; |
4263 | 122 } |
4630 | 123 |
124 if (buf[0] == '#' || buf[0] == '\0') | |
4263 | 125 continue; |
4630 | 126 |
4263 | 127 i = buf; |
128 while (isspace(*i)) | |
129 i++; | |
4630 | 130 |
4816 | 131 if (*i == '[' && strchr(i, ']') && load) { |
4263 | 132 struct smiley_list *child = g_new0(struct smiley_list, 1); |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
133 child->sml = g_strndup(i+1, strchr(i, ']') - i - 1); |
4816 | 134 if (theme->list) |
4263 | 135 list->next = child; |
136 else | |
137 theme->list = child; | |
138 list = child; | |
4816 | 139 } else if (!g_ascii_strncasecmp(i, "Name=", strlen("Name="))) { |
4892 | 140 if(theme->name) |
141 g_free(theme->name); | |
4816 | 142 theme->name = g_strdup(i+ strlen("Name=")); |
143 theme->name[strlen(theme->name)-1] = 0; | |
144 } else if (!g_ascii_strncasecmp(i, "Description=", strlen("Description="))) { | |
4892 | 145 if(theme->desc) |
146 g_free(theme->desc); | |
4816 | 147 theme->desc = g_strdup(i + strlen("Description=")); |
148 theme->desc[strlen(theme->desc)-1] = 0; | |
149 } else if (!g_ascii_strncasecmp(i, "Icon=", strlen("Icon="))) { | |
4892 | 150 if(theme->icon) |
151 g_free(theme->icon); | |
4816 | 152 theme->icon = g_build_filename(dirname, i + strlen("Icon="), NULL); |
153 theme->icon[strlen(theme->icon)-1] = 0; | |
154 } else if (!g_ascii_strncasecmp(i, "Author=", strlen("Author="))) { | |
4892 | 155 if(theme->author) |
156 g_free(theme->author); | |
4816 | 157 theme->author = g_strdup(i + strlen("Author=")); |
158 theme->author[strlen(theme->author)-1] = 0; | |
159 } else if (load && list) { | |
4667 | 160 gboolean hidden = FALSE; |
4288 | 161 char *sfile = NULL; |
4630 | 162 |
4266 | 163 if (*i == '!' && *(i + 1) == ' ') { |
4263 | 164 hidden = TRUE; |
165 i = i + 2; | |
166 } | |
167 while (*i) { | |
168 char l[64]; | |
169 int li = 0; | |
4630 | 170 while (!isspace(*i)) |
4263 | 171 l[li++] = *(i++); |
4288 | 172 if (!sfile) { |
4263 | 173 l[li] = 0; |
4288 | 174 sfile = g_build_filename(dirname, l, NULL); |
4263 | 175 } else { |
4632 | 176 GtkIMHtmlSmiley *smiley = g_new0(GtkIMHtmlSmiley, 1); |
4263 | 177 l[li] = 0; |
4288 | 178 smiley->file = sfile; |
4263 | 179 smiley->smile = g_strdup(l); |
4667 | 180 smiley->hidden = hidden; |
4263 | 181 list->smileys = g_slist_append(list->smileys, smiley); |
182 } | |
4630 | 183 while (isspace(*i)) |
4263 | 184 i++; |
4630 | 185 |
4263 | 186 } |
187 } | |
188 } | |
4288 | 189 |
190 if (load) { | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4341
diff
changeset
|
191 GList *cnv; |
4630 | 192 |
4375
90eaa3486949
[gaim-migrate @ 4641]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
193 for (cnv = gaim_get_conversations(); cnv != NULL; cnv = cnv->next) { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
194 GaimConversation *conv = cnv->data; |
4630 | 195 |
7736 | 196 if (GAIM_IS_GTK_CONVERSATION(conv)) { |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4341
diff
changeset
|
197 smiley_themeize(GAIM_GTK_CONVERSATION(conv)->imhtml); |
7736 | 198 smiley_themeize(GAIM_GTK_CONVERSATION(conv)->entry); |
199 } | |
4338
6c1230d15958
[gaim-migrate @ 4602]
Christian Hammond <chipx86@chipx86.com>
parents:
4323
diff
changeset
|
200 } |
4288 | 201 } |
202 | |
4263 | 203 g_free(dirname); |
4989 | 204 fclose(f); |
4263 | 205 } |
206 | |
207 void smiley_theme_probe() | |
208 { | |
209 GDir *dir; | |
210 const gchar *file; | |
211 gchar *path; | |
212 int l; | |
213 | |
214 char* probedirs[3]; | |
215 probedirs[0] = g_build_filename(DATADIR, "pixmaps", "gaim", "smileys", NULL); | |
216 probedirs[1] = g_build_filename(gaim_user_dir(), "smileys", NULL); | |
217 probedirs[2] = 0; | |
218 for (l=0; probedirs[l]; l++) { | |
219 dir = g_dir_open(probedirs[l], 0, NULL); | |
220 if (dir) { | |
221 while ((file = g_dir_read_name(dir))) { | |
4301 | 222 path = g_build_filename(probedirs[l], file, "theme", NULL); |
4892 | 223 |
4263 | 224 /* Here we check to see that the theme has proper syntax. |
225 * We set the second argument to FALSE so that it doesn't load | |
226 * the theme yet. | |
227 */ | |
4892 | 228 load_smiley_theme(path, FALSE); |
4263 | 229 g_free(path); |
230 } | |
231 g_dir_close(dir); | |
4341 | 232 } else if (l == 1) { |
233 mkdir(probedirs[l], S_IRUSR | S_IWUSR | S_IXUSR); | |
4892 | 234 } |
4263 | 235 g_free(probedirs[l]); |
236 } | |
237 } | |
4667 | 238 |
239 GSList *get_proto_smileys(int protocol) { | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4989
diff
changeset
|
240 GaimPlugin *proto = gaim_find_prpl(protocol); |
4667 | 241 struct smiley_list *list, *def; |
242 | |
243 if(!current_smiley_theme) | |
244 return NULL; | |
245 | |
246 def = list = current_smiley_theme->list; | |
247 | |
248 while(list) { | |
249 if(!strcmp(list->sml, "default")) | |
250 def = list; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4989
diff
changeset
|
251 else if(proto && !strcmp(proto->info->name, list->sml)) |
4667 | 252 break; |
253 | |
254 list = list->next; | |
255 } | |
256 | |
257 return list ? list->smileys : def->smileys; | |
258 } |