2241
|
1 #define GAIM_PLUGINS
|
|
2
|
|
3 #include "pixmaps/cancel.xpm"
|
|
4 #include "pixmaps/refresh.xpm"
|
|
5 #include "pixmaps/gnome_add.xpm"
|
|
6 #include "pixmaps/gnome_remove.xpm"
|
|
7
|
|
8 #include "proxy.h"
|
|
9 #include "gaim.h"
|
|
10
|
|
11 #include <stdlib.h>
|
|
12
|
|
13 struct chat_page {
|
|
14 GtkWidget *list1;
|
|
15 GtkWidget *list2;
|
|
16 };
|
|
17
|
|
18 struct chat_room {
|
|
19 char name[80];
|
|
20 int exchange;
|
|
21 };
|
|
22
|
|
23 static GtkWidget *item = NULL; /* this is the parent tree */
|
|
24 static GList *chat_rooms = NULL;
|
|
25
|
|
26 static GtkWidget *parent = NULL; /* this is the config thing where you can see the list */
|
|
27 static struct chat_page *cp = NULL;
|
|
28
|
|
29 static void des_item()
|
|
30 {
|
|
31 if (item)
|
|
32 gtk_widget_destroy(item);
|
|
33 item = NULL;
|
|
34 }
|
|
35
|
|
36 static void handle_click_chat(GtkWidget *widget, GdkEventButton * event, struct chat_room *cr)
|
|
37 {
|
|
38 if (event->type == GDK_2BUTTON_PRESS && event->button == 1) {
|
|
39 GList *m = g_list_append(NULL, cr->name);
|
|
40 int *x = g_new0(int, 1);
|
|
41 *x = cr->exchange;
|
|
42 m = g_list_append(m, x);
|
|
43 serv_join_chat(connections->data, m);
|
|
44 g_free(x);
|
|
45 g_list_free(m);
|
|
46 }
|
|
47 }
|
|
48
|
|
49 static void setup_buddy_chats()
|
|
50 {
|
|
51 GList *crs = chat_rooms;
|
|
52 GtkWidget *tree;
|
|
53
|
|
54 if (!blist)
|
|
55 return;
|
|
56
|
|
57 if (item)
|
|
58 gtk_tree_remove_item(GTK_TREE(buddies), item);
|
|
59 item = NULL;
|
|
60
|
|
61 if (!chat_rooms)
|
|
62 return;
|
|
63
|
|
64 item = gtk_tree_item_new_with_label(_("Buddy Chat"));
|
|
65 gtk_signal_connect(GTK_OBJECT(item), "destroy", GTK_SIGNAL_FUNC(des_item), NULL);
|
|
66 gtk_tree_append(GTK_TREE(buddies), item);
|
|
67 gtk_tree_item_expand(GTK_TREE_ITEM(item));
|
|
68 gtk_widget_show(item);
|
|
69
|
|
70 tree = gtk_tree_new();
|
|
71 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree);
|
|
72 gtk_widget_show(tree);
|
|
73
|
|
74 while (crs) {
|
|
75 struct chat_room *cr = (struct chat_room *)crs->data;
|
|
76 GtkWidget *titem = gtk_tree_item_new_with_label(cr->name);
|
|
77 gtk_object_set_user_data(GTK_OBJECT(titem), cr);
|
|
78 gtk_tree_append(GTK_TREE(tree), titem);
|
|
79 gtk_widget_show(titem);
|
|
80 gtk_signal_connect(GTK_OBJECT(titem), "button_press_event",
|
|
81 GTK_SIGNAL_FUNC(handle_click_chat), cr);
|
|
82 crs = crs->next;
|
|
83 }
|
|
84 }
|
|
85
|
|
86 static void save_chat_prefs()
|
|
87 {
|
|
88 FILE *f;
|
|
89 char path[1024];
|
|
90 char *x = gaim_user_dir();
|
|
91 GList *crs = chat_rooms;
|
|
92
|
|
93 g_snprintf(path, sizeof(path), "%s/%s", x, "chats");
|
|
94 f = fopen(path, "w");
|
|
95 if (!f) {
|
|
96 g_free(x);
|
|
97 return;
|
|
98 }
|
|
99 while (crs) {
|
|
100 struct chat_room *cr = crs->data;
|
|
101 crs = crs->next;
|
|
102 fprintf(f, "%s\n%d\n", cr->name, cr->exchange);
|
|
103 }
|
|
104 fclose(f);
|
|
105 }
|
|
106
|
|
107 static void restore_chat_prefs()
|
|
108 {
|
|
109 FILE *f;
|
|
110 char path[1024];
|
|
111 char *x = gaim_user_dir();
|
|
112 char buf[1024];
|
|
113
|
|
114 g_snprintf(path, sizeof(path), "%s/%s", x, "chats");
|
|
115 f = fopen(path, "r");
|
|
116 if (!f) {
|
|
117 g_free(x);
|
|
118 return;
|
|
119 }
|
|
120 while (fgets(buf, 1024, f)) {
|
|
121 struct chat_room *cr = g_new0(struct chat_room, 1);
|
|
122 g_snprintf(cr->name, sizeof(cr->name), "%s", buf);
|
|
123 if (!fgets(buf, 1024, f)) {
|
|
124 g_free(cr);
|
|
125 break;
|
|
126 }
|
|
127 cr->exchange = atoi(buf);
|
|
128 chat_rooms = g_list_append(chat_rooms, cr);
|
|
129 }
|
|
130 fclose(f);
|
|
131 setup_buddy_chats();
|
|
132 }
|
|
133
|
|
134 static void ref_list_callback(gpointer data, char *text)
|
|
135 {
|
|
136 char *c;
|
|
137 int len;
|
|
138 GtkWidget *item;
|
|
139 GList *items = GTK_LIST(cp->list1)->children;
|
|
140 struct chat_room *cr;
|
|
141 c = text;
|
|
142
|
|
143 if (!text)
|
|
144 return;
|
|
145
|
|
146 len = strlen(text);
|
|
147
|
|
148 while (items) {
|
|
149 g_free(gtk_object_get_user_data(GTK_OBJECT(items->data)));
|
|
150 items = items->next;
|
|
151 }
|
|
152
|
|
153 items = NULL;
|
|
154
|
|
155 gtk_list_clear_items(GTK_LIST(cp->list1), 0, -1);
|
|
156
|
|
157 item = gtk_list_item_new_with_label(_("Gaim Chat"));
|
|
158 cr = g_new0(struct chat_room, 1);
|
|
159 strcpy(cr->name, _("Gaim Chat"));
|
|
160 cr->exchange = 4;
|
|
161 gtk_object_set_user_data(GTK_OBJECT(item), cr);
|
|
162 gtk_widget_show(item);
|
|
163
|
|
164 items = g_list_append(NULL, item);
|
|
165
|
|
166 while (c) {
|
|
167 if (c - text > len - 30)
|
|
168 break; /* assume no chat rooms 30 from end, padding */
|
|
169 if (!g_strncasecmp(AOL_SRCHSTR, c, strlen(AOL_SRCHSTR))) {
|
|
170 char *t;
|
|
171 int len = 0;
|
|
172 int exchange;
|
|
173 char *name = NULL;
|
|
174
|
|
175 c += strlen(AOL_SRCHSTR);
|
|
176 t = c;
|
|
177 while (t) {
|
|
178 len++;
|
|
179 name = g_realloc(name, len);
|
|
180 if (*t == '+')
|
|
181 name[len - 1] = ' ';
|
|
182 else if (*t == '&') {
|
|
183 name[len - 1] = 0;
|
|
184 sscanf(t, "&Exchange=%d", &exchange);
|
|
185 c = t + strlen("&Exchange=x");
|
|
186 break;
|
|
187 } else
|
|
188 name[len - 1] = *t;
|
|
189 t++;
|
|
190 }
|
|
191 cr = g_new0(struct chat_room, 1);
|
|
192 strcpy(cr->name, name);
|
|
193 cr->exchange = exchange;
|
|
194 item = gtk_list_item_new_with_label(name);
|
|
195 gtk_widget_show(item);
|
|
196 items = g_list_append(items, item);
|
|
197 gtk_object_set_user_data(GTK_OBJECT(item), cr);
|
|
198 g_free(name);
|
|
199 }
|
|
200 c++;
|
|
201 }
|
|
202 gtk_list_append_items(GTK_LIST(cp->list1), items);
|
|
203 g_free(text);
|
|
204 }
|
|
205
|
|
206 static void refresh_list(GtkWidget *w, gpointer *m)
|
|
207 {
|
|
208 grab_url("http://www.aol.com/community/chat/allchats.html", ref_list_callback, NULL);
|
|
209 }
|
|
210
|
|
211 static void add_chat(GtkWidget *w, gpointer *m)
|
|
212 {
|
|
213 GList *sel = GTK_LIST(cp->list1)->selection;
|
|
214 struct chat_room *cr, *cr2;
|
|
215 GList *crs = chat_rooms;
|
|
216 GtkWidget *item;
|
|
217
|
|
218 if (sel) {
|
|
219 cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(sel->data));
|
|
220 } else
|
|
221 return;
|
|
222
|
|
223 while (crs) {
|
|
224 cr2 = (struct chat_room *)crs->data;
|
|
225 if (!g_strcasecmp(cr->name, cr2->name))
|
|
226 return;
|
|
227 crs = crs->next;
|
|
228 }
|
|
229 item = gtk_list_item_new_with_label(cr->name);
|
|
230 cr2 = g_new0(struct chat_room, 1);
|
|
231 strcpy(cr2->name, cr->name);
|
|
232 cr2->exchange = cr->exchange;
|
|
233 gtk_object_set_user_data(GTK_OBJECT(item), cr2);
|
|
234 gtk_widget_show(item);
|
|
235 sel = g_list_append(NULL, item);
|
|
236 gtk_list_append_items(GTK_LIST(cp->list2), sel);
|
|
237 chat_rooms = g_list_append(chat_rooms, cr2);
|
|
238
|
|
239 setup_buddy_chats();
|
|
240 save_chat_prefs();
|
|
241 }
|
|
242
|
|
243 static void remove_chat(GtkWidget *w, gpointer *m)
|
|
244 {
|
|
245 GList *sel = GTK_LIST(cp->list2)->selection;
|
|
246 struct chat_room *cr;
|
|
247 GList *crs;
|
|
248 GtkWidget *item;
|
|
249
|
|
250 if (sel) {
|
|
251 item = (GtkWidget *)sel->data;
|
|
252 cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(item));
|
|
253 } else
|
|
254 return;
|
|
255
|
|
256 chat_rooms = g_list_remove(chat_rooms, cr);
|
|
257
|
|
258
|
|
259 gtk_list_clear_items(GTK_LIST(cp->list2), 0, -1);
|
|
260
|
|
261 if (g_list_length(chat_rooms) == 0)
|
|
262 chat_rooms = NULL;
|
|
263
|
|
264 crs = chat_rooms;
|
|
265
|
|
266 while (crs) {
|
|
267 cr = (struct chat_room *)crs->data;
|
|
268 item = gtk_list_item_new_with_label(cr->name);
|
|
269 gtk_object_set_user_data(GTK_OBJECT(item), cr);
|
|
270 gtk_widget_show(item);
|
|
271 gtk_list_append_items(GTK_LIST(cp->list2), g_list_append(NULL, item));
|
|
272
|
|
273
|
|
274 crs = crs->next;
|
|
275 }
|
|
276
|
|
277 setup_buddy_chats();
|
|
278 save_chat_prefs();
|
|
279 }
|
|
280
|
|
281 static void parent_destroy()
|
|
282 {
|
|
283 if (parent)
|
|
284 gtk_widget_destroy(parent);
|
|
285 parent = NULL;
|
|
286 }
|
|
287
|
|
288 void gaim_plugin_config()
|
|
289 {
|
|
290 GtkWidget *vbox;
|
|
291 GtkWidget *frame;
|
|
292 GtkWidget *box;
|
|
293 GtkWidget *table;
|
|
294 GtkWidget *rem_button, *add_button, *ref_button;
|
|
295 GtkWidget *list1, *list2;
|
|
296 GtkWidget *label;
|
|
297 GtkWidget *sw1, *sw2;
|
|
298 GtkWidget *item;
|
|
299 GtkWidget *hbox;
|
|
300 GtkWidget *button;
|
|
301 GList *crs = chat_rooms;
|
|
302 GList *items = NULL;
|
|
303 struct chat_room *cr;
|
|
304
|
|
305 if (parent) {
|
|
306 gtk_widget_show(parent);
|
|
307 return;
|
|
308 }
|
|
309
|
|
310 if (cp)
|
|
311 g_free(cp);
|
|
312 cp = g_new0(struct chat_page, 1);
|
|
313
|
|
314 parent = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
315 gtk_widget_set_usize(parent, 300, 400);
|
|
316 gtk_window_set_title(GTK_WINDOW(parent), "Chat Rooms");
|
|
317 gtk_window_set_wmclass(GTK_WINDOW(parent), "chatlist", "Gaim");
|
|
318 gtk_widget_realize(parent);
|
|
319 aol_icon(parent->window);
|
|
320 gtk_signal_connect(GTK_OBJECT(parent), "destroy",
|
|
321 GTK_SIGNAL_FUNC(parent_destroy), NULL);
|
|
322
|
|
323 vbox = gtk_vbox_new(FALSE, 0);
|
|
324 gtk_container_add(GTK_CONTAINER(parent), vbox);
|
|
325 gtk_widget_show(vbox);
|
|
326
|
|
327 hbox = gtk_hbox_new(FALSE, 0);
|
|
328 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
|
|
329 gtk_widget_show(hbox);
|
|
330
|
|
331 button = picture_button(parent, _("Close"), cancel_xpm);
|
|
332 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);
|
|
333 gtk_signal_connect(GTK_OBJECT(button), "clicked",
|
|
334 GTK_SIGNAL_FUNC(parent_destroy), NULL);
|
|
335
|
|
336 frame = gtk_frame_new(_("Chat Rooms"));
|
|
337 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
|
|
338 gtk_widget_show(frame);
|
|
339
|
|
340 box = gtk_vbox_new(FALSE, 5);
|
|
341 gtk_container_set_border_width(GTK_CONTAINER(box), 5);
|
|
342 gtk_container_add(GTK_CONTAINER(frame), box);
|
|
343 gtk_widget_show(box);
|
|
344
|
|
345 table = gtk_table_new(4, 2, FALSE);
|
|
346 gtk_widget_show(table);
|
|
347
|
|
348 gtk_box_pack_start(GTK_BOX(box), table, TRUE, TRUE, 0);
|
|
349
|
|
350 list1 = gtk_list_new();
|
|
351 list2 = gtk_list_new();
|
|
352 sw1 = gtk_scrolled_window_new(NULL, NULL);
|
|
353 sw2 = gtk_scrolled_window_new(NULL, NULL);
|
|
354
|
|
355 ref_button = picture_button(parent, _("Refresh"), refresh_xpm);
|
|
356 add_button = picture_button(parent, _("Add"), gnome_add_xpm);
|
|
357 rem_button = picture_button(parent, _("Remove"), gnome_remove_xpm);
|
|
358 gtk_widget_show(list1);
|
|
359 gtk_widget_show(sw1);
|
|
360 gtk_widget_show(list2);
|
|
361 gtk_widget_show(sw2);
|
|
362
|
|
363 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw1), list1);
|
|
364 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list2);
|
|
365
|
|
366 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw1),
|
|
367 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
|
|
368 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2),
|
|
369 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
|
|
370
|
|
371 cp->list1 = list1;
|
|
372 cp->list2 = list2;
|
|
373
|
|
374 gtk_signal_connect(GTK_OBJECT(ref_button), "clicked", GTK_SIGNAL_FUNC(refresh_list), cp);
|
|
375 gtk_signal_connect(GTK_OBJECT(rem_button), "clicked", GTK_SIGNAL_FUNC(remove_chat), cp);
|
|
376 gtk_signal_connect(GTK_OBJECT(add_button), "clicked", GTK_SIGNAL_FUNC(add_chat), cp);
|
|
377
|
|
378
|
|
379
|
|
380 label = gtk_label_new(_("List of available chats"));
|
|
381 gtk_widget_show(label);
|
|
382
|
|
383 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
|
384 gtk_table_attach(GTK_TABLE(table), ref_button, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
|
385 gtk_table_attach(GTK_TABLE(table), sw1, 0, 1, 2, 3,
|
|
386 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
|
|
387 gtk_table_attach(GTK_TABLE(table), add_button, 0, 1, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
|
388
|
|
389
|
|
390 label = gtk_label_new(_("List of subscribed chats"));
|
|
391 gtk_widget_show(label);
|
|
392
|
|
393 gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
|
394 gtk_table_attach(GTK_TABLE(table), sw2, 1, 2, 2, 3,
|
|
395 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
|
|
396 gtk_table_attach(GTK_TABLE(table), rem_button, 1, 2, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
|
397
|
|
398
|
|
399 item = gtk_list_item_new_with_label(_("Gaim Chat"));
|
|
400 cr = g_new0(struct chat_room, 1);
|
|
401 strcpy(cr->name, _("Gaim Chat"));
|
|
402 cr->exchange = 4;
|
|
403 gtk_object_set_user_data(GTK_OBJECT(item), cr);
|
|
404 gtk_widget_show(item);
|
|
405 gtk_list_append_items(GTK_LIST(list1), g_list_append(NULL, item));
|
|
406
|
|
407
|
|
408 while (crs) {
|
|
409 cr = (struct chat_room *)crs->data;
|
|
410 item = gtk_list_item_new_with_label(cr->name);
|
|
411 gtk_object_set_user_data(GTK_OBJECT(item), cr);
|
|
412 gtk_widget_show(item);
|
|
413 items = g_list_append(items, item);
|
|
414
|
|
415 crs = crs->next;
|
|
416 }
|
|
417
|
|
418 gtk_list_append_items(GTK_LIST(list2), items);
|
|
419
|
|
420 gtk_widget_show(parent);
|
|
421 }
|
|
422
|
|
423 static void handle_signon(struct gaim_connection *gc)
|
|
424 {
|
|
425 setup_buddy_chats();
|
|
426 }
|
|
427
|
|
428 char *gaim_plugin_init(GModule *m)
|
|
429 {
|
|
430 restore_chat_prefs();
|
|
431 gaim_signal_connect(m, event_signon, handle_signon, NULL);
|
|
432 return NULL;
|
|
433 }
|
|
434
|
|
435 void gaim_plugin_remove()
|
|
436 {
|
|
437 if (parent)
|
|
438 gtk_widget_destroy(parent);
|
|
439 parent = NULL;
|
|
440
|
|
441 if (item)
|
|
442 gtk_tree_remove_item(GTK_TREE(buddies), item);
|
|
443 item = NULL;
|
|
444
|
|
445 while (chat_rooms) {
|
|
446 g_free(chat_rooms->data);
|
|
447 chat_rooms = g_list_remove(chat_rooms, chat_rooms->data);
|
|
448 }
|
|
449
|
|
450 if (cp)
|
|
451 g_free(cp);
|
|
452 cp = NULL;
|
|
453 }
|
|
454
|
|
455 char *name()
|
|
456 {
|
|
457 return "Chat List";
|
|
458 }
|
|
459
|
|
460 char *description()
|
|
461 {
|
|
462 return "Allows you to add chat rooms to your buddy list. Click the configure button to choose"
|
|
463 " which rooms.";
|
|
464 }
|