comparison src/plugins.c @ 1252:46c09828e929

[gaim-migrate @ 1262] still need to do buddy.c, conversation.c, dialogs.c, prefs.c. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 13 Dec 2000 22:12:02 +0000
parents b5783215b245
children 96e93119268d
comparison
equal deleted inserted replaced
1251:2d12541cedb1 1252:46c09828e929
48 48
49 #include <dlfcn.h> 49 #include <dlfcn.h>
50 50
51 /* ------------------ Global Variables ----------------------- */ 51 /* ------------------ Global Variables ----------------------- */
52 52
53 GList *plugins = NULL; 53 GList *plugins = NULL;
54 GList *callbacks = NULL; 54 GList *callbacks = NULL;
55 55
56 /* ------------------ Local Variables ------------------------ */ 56 /* ------------------ Local Variables ------------------------ */
57 57
58 static GtkWidget *plugin_dialog = NULL; 58 static GtkWidget *plugin_dialog = NULL;
65 static guint confighandle = 0; 65 static guint confighandle = 0;
66 static char *last_dir = NULL; 66 static char *last_dir = NULL;
67 67
68 /* --------------- Function Declarations --------------------- */ 68 /* --------------- Function Declarations --------------------- */
69 69
70 void show_plugins (GtkWidget *, gpointer); 70 void show_plugins(GtkWidget *, gpointer);
71 void load_plugin (char *); 71 void load_plugin(char *);
72 72
73 void gaim_signal_connect (GModule *, enum gaim_event, void *, void *); 73 void gaim_signal_connect(GModule *, enum gaim_event, void *, void *);
74 void gaim_signal_disconnect(GModule *, enum gaim_event, void *); 74 void gaim_signal_disconnect(GModule *, enum gaim_event, void *);
75 void gaim_plugin_unload (GModule *); 75 void gaim_plugin_unload(GModule *);
76 76
77 static void destroy_plugins (GtkWidget *, gpointer); 77 static void destroy_plugins(GtkWidget *, gpointer);
78 static void load_file (GtkWidget *, gpointer); 78 static void load_file(GtkWidget *, gpointer);
79 static void load_which_plugin(GtkWidget *, gpointer); 79 static void load_which_plugin(GtkWidget *, gpointer);
80 static void unload (GtkWidget *, gpointer); 80 static void unload(GtkWidget *, gpointer);
81 static void unload_immediate (GModule *); 81 static void unload_immediate(GModule *);
82 static void list_clicked (GtkWidget *, struct gaim_plugin *); 82 static void list_clicked(GtkWidget *, struct gaim_plugin *);
83 static void update_show_plugins(); 83 static void update_show_plugins();
84 static void hide_plugins (GtkWidget *, gpointer); 84 static void hide_plugins(GtkWidget *, gpointer);
85 85
86 /* ------------------ Code Below ---------------------------- */ 86 /* ------------------ Code Below ---------------------------- */
87 87
88 static void destroy_plugins(GtkWidget *w, gpointer data) { 88 static void destroy_plugins(GtkWidget *w, gpointer data)
89 {
89 if (plugin_dialog) 90 if (plugin_dialog)
90 gtk_widget_destroy(plugin_dialog); 91 gtk_widget_destroy(plugin_dialog);
91 plugin_dialog = NULL; 92 plugin_dialog = NULL;
92 } 93 }
93 94
94 static void load_file(GtkWidget *w, gpointer data) 95 static void load_file(GtkWidget *w, gpointer data)
95 { 96 {
96 gchar *buf; 97 gchar *buf;
97 98
98 if (plugin_dialog) { 99 if (plugin_dialog) {
99 gtk_widget_show(plugin_dialog); 100 gtk_widget_show(plugin_dialog);
100 gdk_window_raise(plugin_dialog->window); 101 gdk_window_raise(plugin_dialog->window);
101 return; 102 return;
102 } 103 }
103 104
104 plugin_dialog = gtk_file_selection_new(_("Gaim - Plugin List")); 105 plugin_dialog = gtk_file_selection_new(_("Gaim - Plugin List"));
105 106
106 gtk_file_selection_hide_fileop_buttons( 107 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(plugin_dialog));
107 GTK_FILE_SELECTION(plugin_dialog));
108 108
109 if (!last_dir) 109 if (!last_dir)
110 buf = g_strdup(LIBDIR); 110 buf = g_strdup(LIBDIR);
111 else 111 else
112 buf = g_strconcat(last_dir, G_DIR_SEPARATOR_S, NULL); 112 buf = g_strconcat(last_dir, G_DIR_SEPARATOR_S, NULL);
113 113
114 gtk_file_selection_set_filename(GTK_FILE_SELECTION(plugin_dialog), buf); 114 gtk_file_selection_set_filename(GTK_FILE_SELECTION(plugin_dialog), buf);
115 gtk_file_selection_complete(GTK_FILE_SELECTION(plugin_dialog), "*.so"); 115 gtk_file_selection_complete(GTK_FILE_SELECTION(plugin_dialog), "*.so");
116 gtk_signal_connect(GTK_OBJECT(plugin_dialog), "destroy", 116 gtk_signal_connect(GTK_OBJECT(plugin_dialog), "destroy",
117 GTK_SIGNAL_FUNC(destroy_plugins), plugin_dialog); 117 GTK_SIGNAL_FUNC(destroy_plugins), plugin_dialog);
118 118
119 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->ok_button), 119 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->ok_button),
120 "clicked", GTK_SIGNAL_FUNC(load_which_plugin), NULL); 120 "clicked", GTK_SIGNAL_FUNC(load_which_plugin), NULL);
121 121
122 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->cancel_button), 122 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->cancel_button),
123 "clicked", GTK_SIGNAL_FUNC(destroy_plugins), NULL); 123 "clicked", GTK_SIGNAL_FUNC(destroy_plugins), NULL);
124 124
125 g_free(buf); 125 g_free(buf);
126 gtk_widget_show(plugin_dialog); 126 gtk_widget_show(plugin_dialog);
127 gdk_window_raise(plugin_dialog->window); 127 gdk_window_raise(plugin_dialog->window);
128 } 128 }
129 129
130 static void load_which_plugin(GtkWidget *w, gpointer data) { 130 static void load_which_plugin(GtkWidget *w, gpointer data)
131 {
131 char *file; 132 char *file;
132 133
133 file = gtk_file_selection_get_filename( 134 file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(plugin_dialog));
134 GTK_FILE_SELECTION(plugin_dialog));
135 if (file_is_dir(file, plugin_dialog)) { 135 if (file_is_dir(file, plugin_dialog)) {
136 return; 136 return;
137 } 137 }
138 138
139 load_plugin(file); 139 load_plugin(file);
141 if (plugin_dialog) 141 if (plugin_dialog)
142 gtk_widget_destroy(plugin_dialog); 142 gtk_widget_destroy(plugin_dialog);
143 plugin_dialog = NULL; 143 plugin_dialog = NULL;
144 } 144 }
145 145
146 void load_plugin(char *filename) { 146 void load_plugin(char *filename)
147 {
147 struct gaim_plugin *plug; 148 struct gaim_plugin *plug;
148 GList *c = plugins; 149 GList *c = plugins;
149 char *(*gaim_plugin_init)(GModule *); 150 char *(*gaim_plugin_init)(GModule *);
150 char *(*cfunc)(); 151 char *(*cfunc)();
151 char *error; 152 char *error;
152 char *retval; 153 char *retval;
153 154
154 if (!g_module_supported()) return; 155 if (!g_module_supported())
155 if (filename == NULL) return; 156 return;
156 if (strlen(filename) == 0) return; 157 if (filename == NULL)
158 return;
159 if (strlen(filename) == 0)
160 return;
157 161
158 while (c) { 162 while (c) {
159 plug = (struct gaim_plugin *)c->data; 163 plug = (struct gaim_plugin *)c->data;
160 if (!strcmp(filename, g_module_name(plug->handle))) { 164 if (!strcmp(filename, g_module_name(plug->handle))) {
161 void (*gaim_plugin_remove)(); 165 void (*gaim_plugin_remove)();
162 if (g_module_symbol(plug->handle, "gaim_plugin_remove", (gpointer *)&gaim_plugin_remove)) 166 if (g_module_symbol(plug->handle, "gaim_plugin_remove",
167 (gpointer *)&gaim_plugin_remove))
163 (*gaim_plugin_remove)(); 168 (*gaim_plugin_remove)();
164 169
165 unload_immediate(plug->handle); 170 unload_immediate(plug->handle);
166 c = plugins; 171 c = plugins;
167 } else 172 } else
227 232
228 update_show_plugins(); 233 update_show_plugins();
229 save_prefs(); 234 save_prefs();
230 } 235 }
231 236
232 void show_plugins(GtkWidget *w, gpointer data) { 237 void show_plugins(GtkWidget *w, gpointer data)
238 {
233 /* most of this code was shamelessly stolen from prefs.c */ 239 /* most of this code was shamelessly stolen from prefs.c */
234 GtkWidget *page; 240 GtkWidget *page;
235 GtkWidget *topbox; 241 GtkWidget *topbox;
236 GtkWidget *botbox; 242 GtkWidget *botbox;
237 GtkWidget *sw; 243 GtkWidget *sw;
239 GtkWidget *list_item; 245 GtkWidget *list_item;
240 GtkWidget *sw2; 246 GtkWidget *sw2;
241 GtkWidget *add; 247 GtkWidget *add;
242 GtkWidget *remove; 248 GtkWidget *remove;
243 GtkWidget *close; 249 GtkWidget *close;
244 GList *plugs = plugins; 250 GList *plugs = plugins;
245 struct gaim_plugin *p; 251 struct gaim_plugin *p;
246 252
247 if (plugwindow) return; 253 if (plugwindow)
254 return;
248 255
249 plugwindow = gtk_window_new(GTK_WINDOW_DIALOG); 256 plugwindow = gtk_window_new(GTK_WINDOW_DIALOG);
250 gtk_window_set_wmclass(GTK_WINDOW(plugwindow), "plugins", "Gaim"); 257 gtk_window_set_wmclass(GTK_WINDOW(plugwindow), "plugins", "Gaim");
251 gtk_widget_realize(plugwindow); 258 gtk_widget_realize(plugwindow);
252 aol_icon(plugwindow->window); 259 aol_icon(plugwindow->window);
253 gtk_container_border_width(GTK_CONTAINER(plugwindow), 5); 260 gtk_container_border_width(GTK_CONTAINER(plugwindow), 5);
254 gtk_window_set_title(GTK_WINDOW(plugwindow), _("Gaim - Plugins")); 261 gtk_window_set_title(GTK_WINDOW(plugwindow), _("Gaim - Plugins"));
255 gtk_widget_set_usize(plugwindow, 400, 250); 262 gtk_widget_set_usize(plugwindow, 400, 250);
256 gtk_signal_connect(GTK_OBJECT(plugwindow), "destroy", 263 gtk_signal_connect(GTK_OBJECT(plugwindow), "destroy", GTK_SIGNAL_FUNC(hide_plugins), NULL);
257 GTK_SIGNAL_FUNC(hide_plugins), NULL);
258 264
259 page = gtk_vbox_new(FALSE, 5); 265 page = gtk_vbox_new(FALSE, 5);
260 topbox = gtk_hbox_new(FALSE, 5); 266 topbox = gtk_hbox_new(FALSE, 5);
261 botbox = gtk_hbox_new(FALSE, 5); 267 botbox = gtk_hbox_new(FALSE, 5);
262 268
263 /* Left side: list of plugin file names */ 269 /* Left side: list of plugin file names */
264 sw2 = gtk_scrolled_window_new(NULL, NULL); 270 sw2 = gtk_scrolled_window_new(NULL, NULL);
265 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2), 271 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2),
266 GTK_POLICY_AUTOMATIC, 272 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
267 GTK_POLICY_AUTOMATIC);
268 273
269 pluglist = gtk_list_new(); 274 pluglist = gtk_list_new();
270 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), pluglist); 275 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), pluglist);
271 gtk_box_pack_start(GTK_BOX(topbox), sw2, TRUE, TRUE, 0); 276 gtk_box_pack_start(GTK_BOX(topbox), sw2, TRUE, TRUE, 0);
272 277
273 /* Right side: the text description of the plugin */ 278 /* Right side: the text description of the plugin */
274 sw = gtk_scrolled_window_new(NULL, NULL); 279 sw = gtk_scrolled_window_new(NULL, NULL);
275 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 280 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
276 GTK_POLICY_AUTOMATIC, 281 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
277 GTK_POLICY_AUTOMATIC);
278 282
279 plugtext = gtk_text_new(NULL, NULL); 283 plugtext = gtk_text_new(NULL, NULL);
280 gtk_container_add(GTK_CONTAINER(sw), plugtext); 284 gtk_container_add(GTK_CONTAINER(sw), plugtext);
281 gtk_box_pack_start(GTK_BOX(topbox), sw, TRUE, TRUE, 0); 285 gtk_box_pack_start(GTK_BOX(topbox), sw, TRUE, TRUE, 0);
282 gtk_text_set_word_wrap(GTK_TEXT(plugtext), TRUE); 286 gtk_text_set_word_wrap(GTK_TEXT(plugtext), TRUE);
283 gtk_text_set_editable(GTK_TEXT(plugtext), FALSE); 287 gtk_text_set_editable(GTK_TEXT(plugtext), FALSE);
284 288
285 /* Build the bottom button bar */ 289 /* Build the bottom button bar */
286 add = gtk_button_new_with_label(_("Load Plugin")); 290 add = gtk_button_new_with_label(_("Load Plugin"));
287 gtk_signal_connect(GTK_OBJECT(add), "clicked", 291 gtk_signal_connect(GTK_OBJECT(add), "clicked", GTK_SIGNAL_FUNC(load_file), NULL);
288 GTK_SIGNAL_FUNC(load_file), NULL);
289 gtk_box_pack_start(GTK_BOX(botbox), add, TRUE, TRUE, 0); 292 gtk_box_pack_start(GTK_BOX(botbox), add, TRUE, TRUE, 0);
290 if (display_options & OPT_DISP_COOL_LOOK) 293 if (display_options & OPT_DISP_COOL_LOOK)
291 gtk_button_set_relief(GTK_BUTTON(add), GTK_RELIEF_NONE); 294 gtk_button_set_relief(GTK_BUTTON(add), GTK_RELIEF_NONE);
292 295
293 config = gtk_button_new_with_label(_("Configure Plugin")); 296 config = gtk_button_new_with_label(_("Configure Plugin"));
295 gtk_box_pack_start(GTK_BOX(botbox), config, TRUE, TRUE, 0); 298 gtk_box_pack_start(GTK_BOX(botbox), config, TRUE, TRUE, 0);
296 if (display_options & OPT_DISP_COOL_LOOK) 299 if (display_options & OPT_DISP_COOL_LOOK)
297 gtk_button_set_relief(GTK_BUTTON(config), GTK_RELIEF_NONE); 300 gtk_button_set_relief(GTK_BUTTON(config), GTK_RELIEF_NONE);
298 301
299 remove = gtk_button_new_with_label(_("Unload Plugin")); 302 remove = gtk_button_new_with_label(_("Unload Plugin"));
300 gtk_signal_connect(GTK_OBJECT(remove), "clicked", 303 gtk_signal_connect(GTK_OBJECT(remove), "clicked", GTK_SIGNAL_FUNC(unload), pluglist);
301 GTK_SIGNAL_FUNC(unload), pluglist);
302 gtk_box_pack_start(GTK_BOX(botbox), remove, TRUE, TRUE, 0); 304 gtk_box_pack_start(GTK_BOX(botbox), remove, TRUE, TRUE, 0);
303 if (display_options & OPT_DISP_COOL_LOOK) 305 if (display_options & OPT_DISP_COOL_LOOK)
304 gtk_button_set_relief(GTK_BUTTON(remove), GTK_RELIEF_NONE); 306 gtk_button_set_relief(GTK_BUTTON(remove), GTK_RELIEF_NONE);
305 307
306 close = gtk_button_new_with_label(_("Close")); 308 close = gtk_button_new_with_label(_("Close"));
307 gtk_signal_connect(GTK_OBJECT(close), "clicked", 309 gtk_signal_connect(GTK_OBJECT(close), "clicked", GTK_SIGNAL_FUNC(hide_plugins), NULL);
308 GTK_SIGNAL_FUNC(hide_plugins), NULL);
309 gtk_box_pack_start(GTK_BOX(botbox), close, TRUE, TRUE, 0); 310 gtk_box_pack_start(GTK_BOX(botbox), close, TRUE, TRUE, 0);
310 if (display_options & OPT_DISP_COOL_LOOK) 311 if (display_options & OPT_DISP_COOL_LOOK)
311 gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE); 312 gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE);
312 313
313 gtk_box_pack_start(GTK_BOX(page), topbox, TRUE, TRUE, 0); 314 gtk_box_pack_start(GTK_BOX(page), topbox, TRUE, TRUE, 0);
316 while (plugs) { 317 while (plugs) {
317 p = (struct gaim_plugin *)plugs->data; 318 p = (struct gaim_plugin *)plugs->data;
318 label = gtk_label_new(g_module_name(p->handle)); 319 label = gtk_label_new(g_module_name(p->handle));
319 list_item = gtk_list_item_new(); 320 list_item = gtk_list_item_new();
320 gtk_container_add(GTK_CONTAINER(list_item), label); 321 gtk_container_add(GTK_CONTAINER(list_item), label);
321 gtk_signal_connect(GTK_OBJECT(list_item), "select", 322 gtk_signal_connect(GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(list_clicked), p);
322 GTK_SIGNAL_FUNC(list_clicked), p);
323 gtk_object_set_user_data(GTK_OBJECT(list_item), p); 323 gtk_object_set_user_data(GTK_OBJECT(list_item), p);
324 324
325 gtk_widget_show(label); 325 gtk_widget_show(label);
326 gtk_container_add(GTK_CONTAINER(pluglist), list_item); 326 gtk_container_add(GTK_CONTAINER(pluglist), list_item);
327 gtk_widget_show(list_item); 327 gtk_widget_show(list_item);
328 328
329 plugs = g_list_next(plugs); 329 plugs = g_list_next(plugs);
330 } 330 }
331 331
332 /* Make the first item selected */ 332 /* Make the first item selected */
333 if (plugins != NULL) 333 if (plugins != NULL)
334 gtk_list_select_item(GTK_LIST(pluglist), 0); 334 gtk_list_select_item(GTK_LIST(pluglist), 0);
335 335
336 gtk_widget_show(page); 336 gtk_widget_show(page);
347 347
348 gtk_container_add(GTK_CONTAINER(plugwindow), page); 348 gtk_container_add(GTK_CONTAINER(plugwindow), page);
349 gtk_widget_show(plugwindow); 349 gtk_widget_show(plugwindow);
350 } 350 }
351 351
352 void update_show_plugins() { 352 void update_show_plugins()
353 {
353 GList *plugs = plugins; 354 GList *plugs = plugins;
354 struct gaim_plugin *p; 355 struct gaim_plugin *p;
355 GtkWidget *label; 356 GtkWidget *label;
356 GtkWidget *list_item; 357 GtkWidget *list_item;
357 358
358 if (plugwindow == NULL) return; 359 if (plugwindow == NULL)
360 return;
359 361
360 gtk_list_clear_items(GTK_LIST(pluglist), 0, -1); 362 gtk_list_clear_items(GTK_LIST(pluglist), 0, -1);
361 while (plugs) { 363 while (plugs) {
362 p = (struct gaim_plugin *)plugs->data; 364 p = (struct gaim_plugin *)plugs->data;
363 label = gtk_label_new(g_module_name(p->handle)); 365 label = gtk_label_new(g_module_name(p->handle));
364 list_item = gtk_list_item_new(); 366 list_item = gtk_list_item_new();
365 gtk_container_add(GTK_CONTAINER(list_item), label); 367 gtk_container_add(GTK_CONTAINER(list_item), label);
366 gtk_signal_connect(GTK_OBJECT(list_item), "select", 368 gtk_signal_connect(GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(list_clicked), p);
367 GTK_SIGNAL_FUNC(list_clicked), p);
368 gtk_object_set_user_data(GTK_OBJECT(list_item), p); 369 gtk_object_set_user_data(GTK_OBJECT(list_item), p);
369 370
370 gtk_widget_show(label); 371 gtk_widget_show(label);
371 gtk_container_add(GTK_CONTAINER(pluglist), list_item); 372 gtk_container_add(GTK_CONTAINER(pluglist), list_item);
372 gtk_widget_show(list_item); 373 gtk_widget_show(list_item);
374 } 375 }
375 if (plugins != NULL) 376 if (plugins != NULL)
376 gtk_list_select_item(GTK_LIST(pluglist), 0); 377 gtk_list_select_item(GTK_LIST(pluglist), 0);
377 else { 378 else {
378 gtk_text_set_point(GTK_TEXT(plugtext), 0); 379 gtk_text_set_point(GTK_TEXT(plugtext), 0);
379 gtk_text_forward_delete(GTK_TEXT(plugtext), 380 gtk_text_forward_delete(GTK_TEXT(plugtext), gtk_text_get_length(GTK_TEXT(plugtext)));
380 gtk_text_get_length(GTK_TEXT(plugtext))); 381 }
381 } 382 }
382 } 383
383 384 void unload(GtkWidget *w, gpointer data)
384 void unload(GtkWidget *w, gpointer data) { 385 {
385 GList *i; 386 GList *i;
386 struct gaim_plugin *p; 387 struct gaim_plugin *p;
387 void (*gaim_plugin_remove)(); 388 void (*gaim_plugin_remove)();
388 389
389 i = GTK_LIST(pluglist)->selection; 390 i = GTK_LIST(pluglist)->selection;
390 391
391 if (i == NULL) return; 392 if (i == NULL)
393 return;
392 394
393 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); 395 p = gtk_object_get_user_data(GTK_OBJECT(i->data));
394 396
395 /* Attempt to call the plugin's remove function (if there) */ 397 /* Attempt to call the plugin's remove function (if there) */
396 if (g_module_symbol(p->handle, "gaim_plugin_remove", (gpointer *)&gaim_plugin_remove)) 398 if (g_module_symbol(p->handle, "gaim_plugin_remove", (gpointer *)&gaim_plugin_remove))
397 (*gaim_plugin_remove)(); 399 (*gaim_plugin_remove)();
398 400
399 unload_immediate(p->handle); 401 unload_immediate(p->handle);
400 } 402 }
401 403
402 static void unload_for_real(void *handle) { 404 static void unload_for_real(void *handle)
405 {
403 GList *i; 406 GList *i;
404 struct gaim_plugin *p = NULL; 407 struct gaim_plugin *p = NULL;
405 GList *c = callbacks; 408 GList *c = callbacks;
406 struct gaim_callback *g; 409 struct gaim_callback *g;
407 410
436 } 439 }
437 } 440 }
438 441
439 plugins = g_list_remove(plugins, p); 442 plugins = g_list_remove(plugins, p);
440 g_free(p); 443 g_free(p);
441 if (config) gtk_widget_set_sensitive(config, 0); 444 if (config)
445 gtk_widget_set_sensitive(config, 0);
442 update_show_plugins(); 446 update_show_plugins();
443 save_prefs(); 447 save_prefs();
444 } 448 }
445 449
446 void unload_immediate(GModule *handle) { 450 void unload_immediate(GModule *handle)
451 {
447 unload_for_real(handle); 452 unload_for_real(handle);
448 g_module_close(handle); 453 g_module_close(handle);
449 } 454 }
450 455
451 static gint unload_timeout(GModule *handle) { 456 static gint unload_timeout(GModule *handle)
457 {
452 g_module_close(handle); 458 g_module_close(handle);
453 return FALSE; 459 return FALSE;
454 } 460 }
455 461
456 void gaim_plugin_unload(GModule *handle) { 462 void gaim_plugin_unload(GModule *handle)
463 {
457 unload_for_real(handle); 464 unload_for_real(handle);
458 gtk_timeout_add(5000, (GtkFunction)unload_timeout, handle); 465 gtk_timeout_add(5000, (GtkFunction)unload_timeout, handle);
459 } 466 }
460 467
461 void list_clicked(GtkWidget *w, struct gaim_plugin *p) { 468 void list_clicked(GtkWidget *w, struct gaim_plugin *p)
469 {
462 gchar *temp; 470 gchar *temp;
463 guint text_len; 471 guint text_len;
464 void (*gaim_plugin_config)(); 472 void (*gaim_plugin_config)();
465 473
466 if (confighandle != 0) 474 if (confighandle != 0)
474 g_free(temp); 482 g_free(temp);
475 483
476 /* Find out if this plug-in has a configuration function */ 484 /* Find out if this plug-in has a configuration function */
477 if (g_module_symbol(p->handle, "gaim_plugin_config", (gpointer *)&gaim_plugin_config)) { 485 if (g_module_symbol(p->handle, "gaim_plugin_config", (gpointer *)&gaim_plugin_config)) {
478 confighandle = gtk_signal_connect(GTK_OBJECT(config), "clicked", 486 confighandle = gtk_signal_connect(GTK_OBJECT(config), "clicked",
479 GTK_SIGNAL_FUNC(gaim_plugin_config), NULL); 487 GTK_SIGNAL_FUNC(gaim_plugin_config), NULL);
480 gtk_widget_set_sensitive(config, 1); 488 gtk_widget_set_sensitive(config, 1);
481 } else { 489 } else {
482 confighandle = 0; 490 confighandle = 0;
483 gtk_widget_set_sensitive(config, 0); 491 gtk_widget_set_sensitive(config, 0);
484 } 492 }
485 } 493 }
486 494
487 void hide_plugins(GtkWidget *w, gpointer data) { 495 void hide_plugins(GtkWidget *w, gpointer data)
496 {
488 if (plugwindow) 497 if (plugwindow)
489 gtk_widget_destroy(plugwindow); 498 gtk_widget_destroy(plugwindow);
490 plugwindow = NULL; 499 plugwindow = NULL;
491 config = NULL; 500 config = NULL;
492 confighandle = 0; 501 confighandle = 0;
493 } 502 }
494 503
495 void gaim_signal_connect(GModule *handle, enum gaim_event which, 504 void gaim_signal_connect(GModule *handle, enum gaim_event which, void *func, void *data)
496 void *func, void *data) { 505 {
497 struct gaim_callback *call = g_new0(struct gaim_callback, 1); 506 struct gaim_callback *call = g_new0(struct gaim_callback, 1);
498 call->handle = handle; 507 call->handle = handle;
499 call->event = which; 508 call->event = which;
500 call->function = func; 509 call->function = func;
501 call->data = data; 510 call->data = data;
502 511
503 callbacks = g_list_append(callbacks, call); 512 callbacks = g_list_append(callbacks, call);
504 debug_printf("Adding callback %d\n", g_list_length(callbacks)); 513 debug_printf("Adding callback %d\n", g_list_length(callbacks));
505 } 514 }
506 515
507 void gaim_signal_disconnect(GModule *handle, enum gaim_event which, void *func) { 516 void gaim_signal_disconnect(GModule *handle, enum gaim_event which, void *func)
517 {
508 GList *c = callbacks; 518 GList *c = callbacks;
509 struct gaim_callback *g = NULL; 519 struct gaim_callback *g = NULL;
510 520
511 while (c) { 521 while (c) {
512 g = (struct gaim_callback *)c->data; 522 g = (struct gaim_callback *)c->data;
513 if (handle == g->handle && func == g->function) { 523 if (handle == g->handle && func == g->function) {
514 callbacks = g_list_remove(callbacks, c->data); 524 callbacks = g_list_remove(callbacks, c->data);
515 g_free(g); 525 g_free(g);
516 c = callbacks; 526 c = callbacks;
517 if (c == NULL) break; 527 if (c == NULL)
528 break;
518 } 529 }
519 c = g_list_next(c); 530 c = g_list_next(c);
520 } 531 }
521 } 532 }
522 533
523 #endif /* GAIM_PLUGINS */ 534 #endif /* GAIM_PLUGINS */
524 535
525 char *event_name(enum gaim_event event) 536 char *event_name(enum gaim_event event)
526 { 537 {
527 static char buf[128]; 538 static char buf[128];
528 switch(event) { 539 switch (event) {
529 case event_signon: 540 case event_signon:
530 sprintf(buf, "event_signon"); 541 sprintf(buf, "event_signon");
531 break; 542 break;
532 case event_signoff: 543 case event_signoff:
533 sprintf(buf, "event_signoff"); 544 sprintf(buf, "event_signoff");
534 break; 545 break;
535 case event_away: 546 case event_away:
536 sprintf(buf, "event_away"); 547 sprintf(buf, "event_away");
537 break; 548 break;
538 case event_back: 549 case event_back:
539 sprintf(buf, "event_back"); 550 sprintf(buf, "event_back");
540 break; 551 break;
541 case event_im_recv: 552 case event_im_recv:
542 sprintf(buf, "event_im_recv"); 553 sprintf(buf, "event_im_recv");
543 break; 554 break;
544 case event_im_send: 555 case event_im_send:
545 sprintf(buf, "event_im_send"); 556 sprintf(buf, "event_im_send");
546 break; 557 break;
547 case event_buddy_signon: 558 case event_buddy_signon:
548 sprintf(buf, "event_buddy_signon"); 559 sprintf(buf, "event_buddy_signon");
549 break; 560 break;
550 case event_buddy_signoff: 561 case event_buddy_signoff:
551 sprintf(buf, "event_buddy_signoff"); 562 sprintf(buf, "event_buddy_signoff");
552 break; 563 break;
553 case event_buddy_away: 564 case event_buddy_away:
554 sprintf(buf, "event_buddy_away"); 565 sprintf(buf, "event_buddy_away");
555 break; 566 break;
556 case event_buddy_back: 567 case event_buddy_back:
557 sprintf(buf, "event_buddy_back"); 568 sprintf(buf, "event_buddy_back");
558 break; 569 break;
559 case event_buddy_idle: 570 case event_buddy_idle:
560 sprintf(buf, "event_buddy_idle"); 571 sprintf(buf, "event_buddy_idle");
561 break; 572 break;
562 case event_buddy_unidle: 573 case event_buddy_unidle:
563 sprintf(buf, "event_buddy_unidle"); 574 sprintf(buf, "event_buddy_unidle");
564 break; 575 break;
565 case event_blist_update: 576 case event_blist_update:
566 sprintf(buf, "event_blist_update"); 577 sprintf(buf, "event_blist_update");
567 break; 578 break;
568 case event_chat_invited: 579 case event_chat_invited:
569 sprintf(buf, "event_chat_invited"); 580 sprintf(buf, "event_chat_invited");
570 break; 581 break;
571 case event_chat_join: 582 case event_chat_join:
572 sprintf(buf, "event_chat_join"); 583 sprintf(buf, "event_chat_join");
573 break; 584 break;
574 case event_chat_leave: 585 case event_chat_leave:
575 sprintf(buf, "event_chat_leave"); 586 sprintf(buf, "event_chat_leave");
576 break; 587 break;
577 case event_chat_buddy_join: 588 case event_chat_buddy_join:
578 sprintf(buf, "event_chat_buddy_join"); 589 sprintf(buf, "event_chat_buddy_join");
579 break; 590 break;
580 case event_chat_buddy_leave: 591 case event_chat_buddy_leave:
581 sprintf(buf, "event_chat_buddy_leave"); 592 sprintf(buf, "event_chat_buddy_leave");
582 break; 593 break;
583 case event_chat_recv: 594 case event_chat_recv:
584 sprintf(buf, "event_chat_recv"); 595 sprintf(buf, "event_chat_recv");
585 break; 596 break;
586 case event_chat_send: 597 case event_chat_send:
587 sprintf(buf, "event_chat_send"); 598 sprintf(buf, "event_chat_send");
588 break; 599 break;
589 case event_warned: 600 case event_warned:
590 sprintf(buf, "event_warned"); 601 sprintf(buf, "event_warned");
591 break; 602 break;
592 case event_error: 603 case event_error:
593 sprintf(buf, "event_error"); 604 sprintf(buf, "event_error");
594 break; 605 break;
595 case event_quit: 606 case event_quit:
596 sprintf(buf, "event_quit"); 607 sprintf(buf, "event_quit");
597 break; 608 break;
598 case event_new_conversation: 609 case event_new_conversation:
599 sprintf(buf, "event_new_conversaion"); 610 sprintf(buf, "event_new_conversaion");
600 break; 611 break;
601 default: 612 default:
602 sprintf(buf, "event_unknown"); 613 sprintf(buf, "event_unknown");
603 break; 614 break;
604 } 615 }
605 return buf; 616 return buf;
606 } 617 }
607 618
608 int plugin_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4) { 619 int plugin_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4)
620 {
609 #ifdef USE_PERL 621 #ifdef USE_PERL
610 char buf[BUF_LONG]; 622 char buf[BUF_LONG];
611 char *tmp; 623 char *tmp;
612 #endif 624 #endif
613 #ifdef GAIM_PLUGINS 625 #ifdef GAIM_PLUGINS
614 GList *c = callbacks; 626 GList *c = callbacks;
615 struct gaim_callback *g; 627 struct gaim_callback *g;
616 628
617 while (c) { 629 while (c) {
618 g = (struct gaim_callback *)c->data; 630 g = (struct gaim_callback *)c->data;
619 if (g->event == event && g->function != NULL) { 631 if (g->event == event && g->function !=NULL) {
620 switch(event) { 632 switch (event) {
621 633
622 /* struct gaim_connection * */ 634 /* struct gaim_connection * */
623 case event_signon: 635 case event_signon:
624 case event_signoff: 636 case event_signoff:
625 { 637 {
626 void (*function)(struct gaim_connection *, void *) = g->function; 638 void (*function) (struct gaim_connection *, void *) =
639 g->function;
627 (*function)(arg1, g->data); 640 (*function)(arg1, g->data);
628 } 641 }
629 break; 642 break;
630 643
631 /* no args */ 644 /* no args */
632 case event_away: 645 case event_away:
633 case event_back: 646 case event_back:
634 case event_blist_update: 647 case event_blist_update:
635 case event_quit: 648 case event_quit:
636 { 649 {
637 void (*function)(void *) = g->function; 650 void (*function)(void *) = g->function;
638 (*function)(g->data); 651 (*function)(g->data);
639 } 652 }
640 break; 653 break;
641 654
642 /* struct gaim_connection *, char **, char ** */ 655 /* struct gaim_connection *, char **, char ** */
643 case event_im_recv: 656 case event_im_recv:
644 { 657 {
645 void (*function)(struct gaim_connection *, char **, char **, 658 void (*function)(struct gaim_connection *, char **, char **,
646 void *) = g->function; 659 void *) = g->function;
647 (*function)(arg1, arg2, arg3, g->data); 660 (*function)(arg1, arg2, arg3, g->data);
648 } 661 }
649 break; 662 break;
650 663
651 /* struct gaim_connection *, char *, char ** */ 664 /* struct gaim_connection *, char *, char ** */
652 case event_im_send: 665 case event_im_send:
653 case event_chat_send: 666 case event_chat_send:
654 { 667 {
655 void (*function)(struct gaim_connection *, char *, char **, 668 void (*function)(struct gaim_connection *, char *, char **,
656 void *) = g->function; 669 void *) = g->function;
657 (*function)(arg1, arg2, arg3, g->data); 670 (*function)(arg1, arg2, arg3, g->data);
658 } 671 }
659 break; 672 break;
660 673
661 /* struct gaim_connection *, char * */ 674 /* struct gaim_connection *, char * */
662 case event_chat_join: 675 case event_chat_join:
663 case event_chat_leave: 676 case event_chat_leave:
664 case event_buddy_signon: 677 case event_buddy_signon:
665 case event_buddy_signoff: 678 case event_buddy_signoff:
666 case event_buddy_away: 679 case event_buddy_away:
667 case event_buddy_back: 680 case event_buddy_back:
668 case event_buddy_idle: 681 case event_buddy_idle:
669 case event_buddy_unidle: 682 case event_buddy_unidle:
670 { 683 {
671 void (*function)(struct gaim_connection *, char *, void *) = 684 void (*function)(struct gaim_connection *, char *, void *) =
672 g->function; 685 g->function;
673 (*function)(arg1, arg2, g->data); 686 (*function)(arg1, arg2, g->data);
674 } 687 }
675 break; 688 break;
676 689
677 /* char * */ 690 /* char * */
678 case event_new_conversation: 691 case event_new_conversation:
679 { 692 {
680 void (*function)(char *, void *) = g->function; 693 void (*function)(char *, void *) = g->function;
681 (*function)(arg1, g->data); 694 (*function)(arg1, g->data);
682 } 695 }
683 break; 696 break;
684 697
685 /* struct gaim_connection *, char *, char *, char * */ 698 /* struct gaim_connection *, char *, char *, char * */
686 case event_chat_invited: 699 case event_chat_invited:
687 case event_chat_recv: 700 case event_chat_recv:
688 { 701 {
689 void (*function)(struct gaim_connection *, char *, char *, 702 void (*function)(struct gaim_connection *, char *, char *,
690 char *, void *) = g->function; 703 char *, void *) = g->function;
691 (*function)(arg1, arg2, arg3, arg4, g->data); 704 (*function)(arg1, arg2, arg3, arg4, g->data);
692 } 705 }
693 break; 706 break;
694 707
695 /* struct gaim_connection *, char *, char * */ 708 /* struct gaim_connection *, char *, char * */
696 case event_chat_buddy_join: 709 case event_chat_buddy_join:
697 case event_chat_buddy_leave: 710 case event_chat_buddy_leave:
698 { 711 {
699 void (*function)(struct gaim_connection *, char *, char *, 712 void (*function)(struct gaim_connection *, char *, char *,
700 void *) = g->function; 713 void *) = g->function;
701 (*function)(arg1, arg2, arg3, g->data); 714 (*function)(arg1, arg2, arg3, g->data);
702 } 715 }
703 break; 716 break;
704 717
705 /* char *, int */ 718 /* char *, int */
706 case event_warned: 719 case event_warned:
707 { 720 {
708 void (*function)(char *, int, void *) = g->function; 721 void (*function)(char *, int, void *) = g->function;
709 (*function)(arg1, (int)arg2, g->data); 722 (*function)(arg1, (int)arg2, g->data);
710 } 723 }
711 break; 724 break;
712 725
713 /* int */ 726 /* int */
714 case event_error: 727 case event_error:
715 { 728 {
716 void (*function)(int, void *) = g->function; 729 void (*function)(int, void *) = g->function;
717 (*function)((int)arg1, g->data); 730 (*function)((int)arg1, g->data);
718 } 731 }
726 c = c->next; 739 c = c->next;
727 } 740 }
728 #endif /* GAIM_PLUGINS */ 741 #endif /* GAIM_PLUGINS */
729 #ifdef USE_PERL 742 #ifdef USE_PERL
730 switch (event) { 743 switch (event) {
731 case event_signon: 744 case event_signon:
732 g_snprintf(buf, sizeof buf, "\"%s\"", ((struct gaim_connection *)arg1)->username); 745 g_snprintf(buf, sizeof buf, "\"%s\"", ((struct gaim_connection *)arg1)->username);
733 break; 746 break;
734 case event_signoff: 747 case event_signoff:
735 g_snprintf(buf, sizeof buf, "\"%s\"", ((struct gaim_connection *)arg1)->username); 748 g_snprintf(buf, sizeof buf, "\"%s\"", ((struct gaim_connection *)arg1)->username);
736 break; 749 break;
737 case event_away: 750 case event_away:
738 buf[0] = 0; 751 buf[0] = 0;
739 break; 752 break;
740 case event_back: 753 case event_back:
741 buf[0] = 0; 754 buf[0] = 0;
742 break; 755 break;
743 case event_im_recv: 756 case event_im_recv:
744 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", ((struct gaim_connection *)arg1)->username, *(char **)arg2, *(char **)arg3); 757 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s",
745 break; 758 ((struct gaim_connection *)arg1)->username, *(char **)arg2, *(char **)arg3);
746 case event_im_send: 759 break;
747 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", ((struct gaim_connection *)arg1)->username, (char *)arg2, *(char **)arg3); 760 case event_im_send:
748 break; 761 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s",
749 case event_buddy_signon: 762 ((struct gaim_connection *)arg1)->username, (char *)arg2, *(char **)arg3);
750 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 763 break;
751 break; 764 case event_buddy_signon:
752 case event_buddy_signoff: 765 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
753 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 766 break;
754 break; 767 case event_buddy_signoff:
755 case event_buddy_away: 768 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
756 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 769 break;
757 break; 770 case event_buddy_away:
758 case event_buddy_back: 771 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
759 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 772 break;
760 break; 773 case event_buddy_back:
761 case event_buddy_idle: 774 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
762 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 775 break;
763 break; 776 case event_buddy_idle:
764 case event_buddy_unidle: 777 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
765 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 778 break;
766 break; 779 case event_buddy_unidle:
767 case event_blist_update: 780 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
768 buf[0] = 0; 781 break;
769 break; 782 case event_blist_update:
770 case event_chat_invited: 783 buf[0] = 0;
771 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", (char *)arg2, (char *)arg3, (char *)arg4); 784 break;
772 break; 785 case event_chat_invited:
773 case event_chat_join: 786 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", (char *)arg2, (char *)arg3,
774 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 787 (char *)arg4);
775 break; 788 break;
776 case event_chat_leave: 789 case event_chat_join:
777 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); 790 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
778 break; 791 break;
779 case event_chat_buddy_join: 792 case event_chat_leave:
780 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\"", (char *)arg2, (char *)arg3); 793 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2);
781 break; 794 break;
782 case event_chat_buddy_leave: 795 case event_chat_buddy_join:
783 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\"", (char *)arg2, (char *)arg3); 796 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\"", (char *)arg2, (char *)arg3);
784 break; 797 break;
785 case event_chat_recv: 798 case event_chat_buddy_leave:
786 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", (char *)arg2, (char *)arg3, (char *)arg4); 799 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\"", (char *)arg2, (char *)arg3);
787 break; 800 break;
788 case event_chat_send: 801 case event_chat_recv:
789 g_snprintf(buf, sizeof buf, "\"%s\" %s", (char *)arg2, *(char **)arg3); 802 g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", (char *)arg2, (char *)arg3,
790 break; 803 (char *)arg4);
791 case event_warned: 804 break;
792 g_snprintf(buf, sizeof buf, "\"%s\" %d", (char *)arg1, (int)arg2); 805 case event_chat_send:
793 break; 806 g_snprintf(buf, sizeof buf, "\"%s\" %s", (char *)arg2, *(char **)arg3);
794 case event_error: 807 break;
795 g_snprintf(buf, sizeof buf, "%d", (int)arg1); 808 case event_warned:
796 break; 809 g_snprintf(buf, sizeof buf, "\"%s\" %d", (char *)arg1, (int)arg2);
797 case event_quit: 810 break;
798 buf[0] = 0; 811 case event_error:
799 break; 812 g_snprintf(buf, sizeof buf, "%d", (int)arg1);
800 case event_new_conversation: 813 break;
801 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg1); 814 case event_quit:
802 break; 815 buf[0] = 0;
803 default: 816 break;
804 break; 817 case event_new_conversation:
818 g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg1);
819 break;
820 default:
821 break;
805 } 822 }
806 tmp = event_name(event); 823 tmp = event_name(event);
807 debug_printf("%s: %s\n", tmp, buf); 824 debug_printf("%s: %s\n", tmp, buf);
808 return perl_event(tmp, buf); 825 return perl_event(tmp, buf);
809 #else 826 #else