Mercurial > pidgin.yaz
annotate plugins/chatlist.c @ 4171:858822a27529
[gaim-migrate @ 4400]
Alex Converse (alex4):
"Gaim had a nasty habbit of not converting prefrenced
colors from 48-bit to 24-bit for outputting as html.
(causing malformed colors like #00FFFF00) I fixed this
by doing all the conversions at the time of outputting."
he further wrote, when i failed to see a need for this patch at first:
"The issue is GdkColors are 48-bit (16 of Red, green, and
blue) HTML colors are 24-bit (bit of Red, Green, and Blue)
gaim stores colors as GdkColors but when sends the color as
HTML. The problem is colors that were stored inb gaimrc
never got downsampled to 24bit."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Thu, 02 Jan 2003 16:24:53 +0000 |
parents | 07a3d1fae88f |
children | 59751fe608c5 |
rev | line source |
---|---|
2241 | 1 #define GAIM_PLUGINS |
2 | |
3 #include "pixmaps/refresh.xpm" | |
4 #include "pixmaps/gnome_add.xpm" | |
5 #include "pixmaps/gnome_remove.xpm" | |
6 | |
7 #include "proxy.h" | |
8 #include "gaim.h" | |
9 | |
10 #include <stdlib.h> | |
2272
4ecc9a9a75d8
[gaim-migrate @ 2282]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2241
diff
changeset
|
11 #include <string.h> |
3630 | 12 #ifdef _WIN32 |
13 #include "win32dep.h" | |
14 #endif | |
2241 | 15 |
2993 | 16 #define AOL_SRCHSTR "aim:GoChat?RoomName=" |
2417
5473c8c5378d
[gaim-migrate @ 2430]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2356
diff
changeset
|
17 |
2241 | 18 struct chat_page { |
19 GtkWidget *list1; | |
20 GtkWidget *list2; | |
21 }; | |
22 | |
23 struct chat_room { | |
24 char name[80]; | |
25 int exchange; | |
26 }; | |
27 | |
28 static GtkWidget *item = NULL; /* this is the parent tree */ | |
29 static GList *chat_rooms = NULL; | |
30 | |
31 static struct chat_page *cp = NULL; | |
32 | |
33 static void des_item() | |
34 { | |
35 if (item) | |
36 gtk_widget_destroy(item); | |
37 item = NULL; | |
38 } | |
39 | |
40 static void handle_click_chat(GtkWidget *widget, GdkEventButton * event, struct chat_room *cr) | |
41 { | |
42 if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { | |
43 GList *m = g_list_append(NULL, cr->name); | |
44 int *x = g_new0(int, 1); | |
45 *x = cr->exchange; | |
46 m = g_list_append(m, x); | |
47 serv_join_chat(connections->data, m); | |
48 g_free(x); | |
49 g_list_free(m); | |
50 } | |
51 } | |
52 | |
53 static void setup_buddy_chats() | |
54 { | |
55 GList *crs = chat_rooms; | |
56 GtkWidget *tree; | |
57 | |
58 if (!blist) | |
59 return; | |
60 | |
61 if (item) | |
62 gtk_tree_remove_item(GTK_TREE(buddies), item); | |
63 item = NULL; | |
64 | |
65 if (!chat_rooms) | |
66 return; | |
67 | |
68 item = gtk_tree_item_new_with_label(_("Buddy Chat")); | |
4165
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
69 g_signal_connect(GTK_OBJECT(item), "destroy", G_CALLBACK(des_item), NULL); |
2241 | 70 gtk_tree_append(GTK_TREE(buddies), item); |
71 gtk_tree_item_expand(GTK_TREE_ITEM(item)); | |
72 gtk_widget_show(item); | |
73 | |
74 tree = gtk_tree_new(); | |
75 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree); | |
76 gtk_widget_show(tree); | |
77 | |
78 while (crs) { | |
79 struct chat_room *cr = (struct chat_room *)crs->data; | |
80 GtkWidget *titem = gtk_tree_item_new_with_label(cr->name); | |
81 gtk_object_set_user_data(GTK_OBJECT(titem), cr); | |
82 gtk_tree_append(GTK_TREE(tree), titem); | |
83 gtk_widget_show(titem); | |
4165
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
84 g_signal_connect(GTK_OBJECT(titem), "button_press_event", |
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
85 G_CALLBACK(handle_click_chat), cr); |
2241 | 86 crs = crs->next; |
87 } | |
2900
aaaca46b507b
[gaim-migrate @ 2913]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2892
diff
changeset
|
88 |
aaaca46b507b
[gaim-migrate @ 2913]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2892
diff
changeset
|
89 gtk_tree_item_expand(GTK_TREE_ITEM(item)); |
2241 | 90 } |
91 | |
92 static void save_chat_prefs() | |
93 { | |
94 FILE *f; | |
95 char path[1024]; | |
96 char *x = gaim_user_dir(); | |
97 GList *crs = chat_rooms; | |
98 | |
99 g_snprintf(path, sizeof(path), "%s/%s", x, "chats"); | |
100 f = fopen(path, "w"); | |
3930 | 101 if (!f) |
2241 | 102 return; |
103 while (crs) { | |
104 struct chat_room *cr = crs->data; | |
105 crs = crs->next; | |
106 fprintf(f, "%s\n%d\n", cr->name, cr->exchange); | |
107 } | |
108 fclose(f); | |
109 } | |
110 | |
111 static void restore_chat_prefs() | |
112 { | |
113 FILE *f; | |
114 char path[1024]; | |
115 char *x = gaim_user_dir(); | |
116 char buf[1024]; | |
117 | |
118 g_snprintf(path, sizeof(path), "%s/%s", x, "chats"); | |
119 f = fopen(path, "r"); | |
3930 | 120 if (!f) |
2241 | 121 return; |
122 while (fgets(buf, 1024, f)) { | |
123 struct chat_room *cr = g_new0(struct chat_room, 1); | |
2356
ddf404cd9757
[gaim-migrate @ 2369]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2272
diff
changeset
|
124 g_snprintf(cr->name, sizeof(cr->name), "%s", g_strchomp(buf)); |
2241 | 125 if (!fgets(buf, 1024, f)) { |
126 g_free(cr); | |
127 break; | |
128 } | |
129 cr->exchange = atoi(buf); | |
130 chat_rooms = g_list_append(chat_rooms, cr); | |
131 } | |
132 fclose(f); | |
133 setup_buddy_chats(); | |
134 } | |
135 | |
136 static void ref_list_callback(gpointer data, char *text) | |
137 { | |
138 char *c; | |
139 int len; | |
140 GtkWidget *item; | |
141 GList *items = GTK_LIST(cp->list1)->children; | |
142 struct chat_room *cr; | |
143 c = text; | |
144 | |
145 if (!text) | |
146 return; | |
147 | |
148 len = strlen(text); | |
149 | |
150 while (items) { | |
151 g_free(gtk_object_get_user_data(GTK_OBJECT(items->data))); | |
152 items = items->next; | |
153 } | |
154 | |
155 items = NULL; | |
156 | |
157 gtk_list_clear_items(GTK_LIST(cp->list1), 0, -1); | |
158 | |
159 item = gtk_list_item_new_with_label(_("Gaim Chat")); | |
160 cr = g_new0(struct chat_room, 1); | |
161 strcpy(cr->name, _("Gaim Chat")); | |
162 cr->exchange = 4; | |
163 gtk_object_set_user_data(GTK_OBJECT(item), cr); | |
164 gtk_widget_show(item); | |
165 | |
166 items = g_list_append(NULL, item); | |
167 | |
168 while (c) { | |
169 if (c - text > len - 30) | |
170 break; /* assume no chat rooms 30 from end, padding */ | |
171 if (!g_strncasecmp(AOL_SRCHSTR, c, strlen(AOL_SRCHSTR))) { | |
172 char *t; | |
173 int len = 0; | |
3000 | 174 int exchange = 5; |
2241 | 175 char *name = NULL; |
176 | |
177 c += strlen(AOL_SRCHSTR); | |
178 t = c; | |
179 while (t) { | |
180 len++; | |
181 name = g_realloc(name, len); | |
182 if (*t == '+') | |
183 name[len - 1] = ' '; | |
184 else if (*t == '&') { | |
185 name[len - 1] = 0; | |
3000 | 186 sscanf(t, "&Exchange=%d", &exchange); |
187 c = t + strlen("&Exchange=x"); | |
2241 | 188 break; |
189 } else | |
190 name[len - 1] = *t; | |
191 t++; | |
192 } | |
193 cr = g_new0(struct chat_room, 1); | |
194 strcpy(cr->name, name); | |
195 cr->exchange = exchange; | |
4164
a55c2a0ddcd4
[gaim-migrate @ 4393]
Christian Hammond <chipx86@chipx86.com>
parents:
3930
diff
changeset
|
196 printf("Adding '%s'\n", name); |
2241 | 197 item = gtk_list_item_new_with_label(name); |
198 gtk_widget_show(item); | |
199 items = g_list_append(items, item); | |
200 gtk_object_set_user_data(GTK_OBJECT(item), cr); | |
201 g_free(name); | |
202 } | |
203 c++; | |
204 } | |
205 gtk_list_append_items(GTK_LIST(cp->list1), items); | |
206 } | |
207 | |
208 static void refresh_list(GtkWidget *w, gpointer *m) | |
209 { | |
2872
30828b83143d
[gaim-migrate @ 2885]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2692
diff
changeset
|
210 grab_url("http://www.aim.com/community/chats.adp", FALSE, ref_list_callback, NULL); |
2241 | 211 } |
212 | |
213 static void add_chat(GtkWidget *w, gpointer *m) | |
214 { | |
215 GList *sel = GTK_LIST(cp->list1)->selection; | |
216 struct chat_room *cr, *cr2; | |
217 GList *crs = chat_rooms; | |
218 GtkWidget *item; | |
219 | |
220 if (sel) { | |
221 cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(sel->data)); | |
222 } else | |
223 return; | |
224 | |
225 while (crs) { | |
226 cr2 = (struct chat_room *)crs->data; | |
227 if (!g_strcasecmp(cr->name, cr2->name)) | |
228 return; | |
229 crs = crs->next; | |
230 } | |
231 item = gtk_list_item_new_with_label(cr->name); | |
232 cr2 = g_new0(struct chat_room, 1); | |
233 strcpy(cr2->name, cr->name); | |
234 cr2->exchange = cr->exchange; | |
235 gtk_object_set_user_data(GTK_OBJECT(item), cr2); | |
236 gtk_widget_show(item); | |
237 sel = g_list_append(NULL, item); | |
238 gtk_list_append_items(GTK_LIST(cp->list2), sel); | |
239 chat_rooms = g_list_append(chat_rooms, cr2); | |
240 | |
241 setup_buddy_chats(); | |
242 save_chat_prefs(); | |
243 } | |
244 | |
245 static void remove_chat(GtkWidget *w, gpointer *m) | |
246 { | |
247 GList *sel = GTK_LIST(cp->list2)->selection; | |
248 struct chat_room *cr; | |
249 GList *crs; | |
250 GtkWidget *item; | |
251 | |
252 if (sel) { | |
253 item = (GtkWidget *)sel->data; | |
254 cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(item)); | |
255 } else | |
256 return; | |
257 | |
258 chat_rooms = g_list_remove(chat_rooms, cr); | |
259 | |
260 | |
261 gtk_list_clear_items(GTK_LIST(cp->list2), 0, -1); | |
262 | |
263 if (g_list_length(chat_rooms) == 0) | |
264 chat_rooms = NULL; | |
265 | |
266 crs = chat_rooms; | |
267 | |
268 while (crs) { | |
269 cr = (struct chat_room *)crs->data; | |
270 item = gtk_list_item_new_with_label(cr->name); | |
271 gtk_object_set_user_data(GTK_OBJECT(item), cr); | |
272 gtk_widget_show(item); | |
273 gtk_list_append_items(GTK_LIST(cp->list2), g_list_append(NULL, item)); | |
274 | |
275 | |
276 crs = crs->next; | |
277 } | |
278 | |
279 setup_buddy_chats(); | |
280 save_chat_prefs(); | |
281 } | |
282 | |
3630 | 283 G_MODULE_EXPORT GtkWidget *gaim_plugin_config_gtk() |
2241 | 284 { |
3565 | 285 GtkWidget *ret, *vbox; |
2241 | 286 GtkWidget *list1, *list2; |
287 GtkWidget *sw1, *sw2; | |
3565 | 288 GtkWidget *ref_button, *add_button, *rem_button; |
289 GtkWidget *table, *label; | |
290 struct chat_room *cr = NULL; | |
2241 | 291 GList *items = NULL; |
3565 | 292 GList *crs = chat_rooms; |
293 | |
2241 | 294 if (cp) |
3565 | 295 g_free(cp); |
296 cp = g_new0(struct chat_page, 1); | |
2241 | 297 |
298 | |
3565 | 299 ret = gtk_vbox_new(FALSE, 18); |
300 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); | |
2241 | 301 |
3565 | 302 vbox = make_frame(ret, _("Chat Rooms")); |
2241 | 303 |
304 table = gtk_table_new(4, 2, FALSE); | |
305 gtk_widget_show(table); | |
306 | |
3565 | 307 gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); |
2241 | 308 |
309 list1 = gtk_list_new(); | |
310 list2 = gtk_list_new(); | |
311 sw1 = gtk_scrolled_window_new(NULL, NULL); | |
312 sw2 = gtk_scrolled_window_new(NULL, NULL); | |
313 | |
3565 | 314 ref_button = picture_button(prefs, _("Refresh"), refresh_xpm); |
315 add_button = picture_button(prefs, _("Add"), gnome_add_xpm); | |
316 rem_button = picture_button(prefs, _("Remove"), gnome_remove_xpm); | |
2241 | 317 gtk_widget_show(list1); |
318 gtk_widget_show(sw1); | |
319 gtk_widget_show(list2); | |
320 gtk_widget_show(sw2); | |
321 | |
322 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw1), list1); | |
323 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list2); | |
324 | |
325 cp->list1 = list1; | |
326 cp->list2 = list2; | |
327 | |
4165
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
328 g_signal_connect(GTK_OBJECT(ref_button), "clicked", G_CALLBACK(refresh_list), cp); |
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
329 g_signal_connect(GTK_OBJECT(rem_button), "clicked", G_CALLBACK(remove_chat), cp); |
07a3d1fae88f
[gaim-migrate @ 4394]
Christian Hammond <chipx86@chipx86.com>
parents:
4164
diff
changeset
|
330 g_signal_connect(GTK_OBJECT(add_button), "clicked", G_CALLBACK(add_chat), cp); |
2241 | 331 |
332 label = gtk_label_new(_("List of available chats")); | |
333 gtk_widget_show(label); | |
334 | |
335 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); | |
336 gtk_table_attach(GTK_TABLE(table), ref_button, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); | |
337 gtk_table_attach(GTK_TABLE(table), sw1, 0, 1, 2, 3, | |
338 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5); | |
339 gtk_table_attach(GTK_TABLE(table), add_button, 0, 1, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0); | |
340 | |
341 | |
342 label = gtk_label_new(_("List of subscribed chats")); | |
343 gtk_widget_show(label); | |
344 | |
345 gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); | |
346 gtk_table_attach(GTK_TABLE(table), sw2, 1, 2, 2, 3, | |
347 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5); | |
348 gtk_table_attach(GTK_TABLE(table), rem_button, 1, 2, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0); | |
349 | |
350 | |
351 item = gtk_list_item_new_with_label(_("Gaim Chat")); | |
352 cr = g_new0(struct chat_room, 1); | |
353 strcpy(cr->name, _("Gaim Chat")); | |
354 cr->exchange = 4; | |
355 gtk_object_set_user_data(GTK_OBJECT(item), cr); | |
356 gtk_widget_show(item); | |
357 gtk_list_append_items(GTK_LIST(list1), g_list_append(NULL, item)); | |
358 | |
359 | |
360 while (crs) { | |
361 cr = (struct chat_room *)crs->data; | |
362 item = gtk_list_item_new_with_label(cr->name); | |
363 gtk_object_set_user_data(GTK_OBJECT(item), cr); | |
364 gtk_widget_show(item); | |
365 items = g_list_append(items, item); | |
366 | |
367 crs = crs->next; | |
368 } | |
369 | |
370 gtk_list_append_items(GTK_LIST(list2), items); | |
3565 | 371 gtk_widget_show_all(ret); |
372 return ret; | |
2241 | 373 } |
374 | |
375 static void handle_signon(struct gaim_connection *gc) | |
376 { | |
377 setup_buddy_chats(); | |
378 } | |
379 | |
3630 | 380 G_MODULE_EXPORT char *gaim_plugin_init(GModule *m) |
2241 | 381 { |
382 restore_chat_prefs(); | |
383 gaim_signal_connect(m, event_signon, handle_signon, NULL); | |
384 return NULL; | |
385 } | |
386 | |
3630 | 387 G_MODULE_EXPORT void gaim_plugin_remove() |
2241 | 388 { |
389 if (item) | |
390 gtk_tree_remove_item(GTK_TREE(buddies), item); | |
391 item = NULL; | |
392 | |
393 while (chat_rooms) { | |
394 g_free(chat_rooms->data); | |
395 chat_rooms = g_list_remove(chat_rooms, chat_rooms->data); | |
396 } | |
397 | |
398 if (cp) | |
399 g_free(cp); | |
400 cp = NULL; | |
401 } | |
402 | |
3551 | 403 struct gaim_plugin_description desc; |
404 struct gaim_plugin_description *gaim_plugin_desc() { | |
405 desc.api_version = PLUGIN_API_VERSION; | |
406 desc.name = g_strdup("Chat List"); | |
407 desc.version = g_strdup(VERSION); | |
408 desc.description = g_strdup("Allows you to add chat rooms to your buddy list."); | |
409 desc.authors = g_strdup("Eric Warmenhoven <eric@warmenhoven.org>"); | |
410 desc.url = g_strdup(WEBSITE); | |
411 return &desc; | |
412 } | |
413 | |
3630 | 414 G_MODULE_EXPORT char *name() |
2241 | 415 { |
416 return "Chat List"; | |
417 } | |
418 | |
3630 | 419 G_MODULE_EXPORT char *description() |
2241 | 420 { |
421 return "Allows you to add chat rooms to your buddy list. Click the configure button to choose" | |
422 " which rooms."; | |
423 } |