Mercurial > pidgin
comparison src/plugins.c @ 94:9f6ce50ffb78
[gaim-migrate @ 104]
Woohoo, the landing of the plugins. Nearly everything necessary is here. The
only thing missing is that you can't load a plugin without signing on first
(at least, not without some trickery).
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Sun, 09 Apr 2000 11:18:25 +0000 |
| parents | f3c6cf79f651 |
| children | 247f540ea6e1 |
comparison
equal
deleted
inserted
replaced
| 93:5ca21b68eb29 | 94:9f6ce50ffb78 |
|---|---|
| 42 #include <gtk/gtk.h> | 42 #include <gtk/gtk.h> |
| 43 #include "gaim.h" | 43 #include "gaim.h" |
| 44 | 44 |
| 45 #include <dlfcn.h> | 45 #include <dlfcn.h> |
| 46 | 46 |
| 47 /* ------------------ Local Variables -------------------------*/ | 47 /* ------------------ Global Variables ----------------------- */ |
| 48 | |
| 49 GList *callbacks = NULL; | |
| 50 | |
| 51 /* ------------------ Local Variables ------------------------ */ | |
| 48 | 52 |
| 49 static GtkWidget *plugin_dialog = NULL; | 53 static GtkWidget *plugin_dialog = NULL; |
| 50 static GList *plugins = NULL; | 54 static GList *plugins = NULL; |
| 51 | 55 |
| 52 static GtkWidget *pluglist; | 56 static GtkWidget *pluglist; |
| 53 static GtkWidget *plugtext; | 57 static GtkWidget *plugtext; |
| 54 static GtkWidget *plugwindow; | 58 static GtkWidget *plugwindow; |
| 55 | 59 |
| 56 /* --------------- Function Declarations -------------------- */ | 60 /* --------------- Function Declarations --------------------- */ |
| 57 | 61 |
| 58 void load_plugin (GtkWidget *, gpointer); | 62 void load_plugin (GtkWidget *, gpointer); |
| 59 void unload_plugin(GtkWidget *, gpointer); | 63 void unload_plugin(GtkWidget *, gpointer); |
| 60 void show_plugins (GtkWidget *, gpointer); | 64 void show_plugins (GtkWidget *, gpointer); |
| 65 | |
| 66 void gaim_signal_connect (void *, enum gaim_event, void *, void *); | |
| 67 void gaim_signal_disconnect(void *, enum gaim_event, void *); | |
| 61 | 68 |
| 62 static void destroy_plugins (GtkWidget *, gpointer); | 69 static void destroy_plugins (GtkWidget *, gpointer); |
| 63 static void load_which_plugin(GtkWidget *, gpointer); | 70 static void load_which_plugin(GtkWidget *, gpointer); |
| 64 static void unload (GtkWidget *, gpointer); | 71 static void unload (GtkWidget *, gpointer); |
| 65 static void list_clicked (GtkWidget *, struct gaim_plugin *); | 72 static void list_clicked (GtkWidget *, struct gaim_plugin *); |
| 138 g_free(plug); | 145 g_free(plug); |
| 139 return; | 146 return; |
| 140 } | 147 } |
| 141 | 148 |
| 142 plugins = g_list_append(plugins, plug); | 149 plugins = g_list_append(plugins, plug); |
| 143 (*gaim_plugin_init)(); | 150 (*gaim_plugin_init)(plug->handle); |
| 144 | 151 |
| 145 cfunc = dlsym(plug->handle, "name"); | 152 cfunc = dlsym(plug->handle, "name"); |
| 146 if ((error = dlerror()) == NULL) | 153 if ((error = dlerror()) == NULL) |
| 147 plug->name = (*cfunc)(); | 154 plug->name = (*cfunc)(); |
| 148 else | 155 else |
| 297 void unload(GtkWidget *w, gpointer data) { | 304 void unload(GtkWidget *w, gpointer data) { |
| 298 GList *i; | 305 GList *i; |
| 299 struct gaim_plugin *p; | 306 struct gaim_plugin *p; |
| 300 void (*gaim_plugin_remove)(); | 307 void (*gaim_plugin_remove)(); |
| 301 char *error; | 308 char *error; |
| 309 GList *c = callbacks; | |
| 310 struct gaim_callback *g; | |
| 302 | 311 |
| 303 i = GTK_LIST(pluglist)->selection; | 312 i = GTK_LIST(pluglist)->selection; |
| 304 | 313 |
| 305 if (i == NULL) return; | 314 if (i == NULL) return; |
| 306 | 315 |
| 307 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); | 316 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); |
| 308 | 317 |
| 309 gaim_plugin_remove = dlsym(p->handle, "gaim_plugin_remove"); | 318 gaim_plugin_remove = dlsym(p->handle, "gaim_plugin_remove"); |
| 310 if ((error = dlerror()) == NULL) | 319 if ((error = dlerror()) == NULL) |
| 311 (*gaim_plugin_remove)(); | 320 (*gaim_plugin_remove)(); |
| 321 while (c) { | |
| 322 g = (struct gaim_callback *)c->data; | |
| 323 if (g->handle == p->handle) { | |
| 324 callbacks = g_list_remove(callbacks, c); | |
| 325 g_free(g); | |
| 326 } | |
| 327 c = c->next; | |
| 328 } | |
| 312 dlclose(p->handle); | 329 dlclose(p->handle); |
| 313 | 330 |
| 314 plugins = g_list_remove(plugins, p); | 331 plugins = g_list_remove(plugins, p); |
| 315 g_free(p); | 332 g_free(p); |
| 316 update_show_plugins(); | 333 update_show_plugins(); |
| 332 if (plugwindow) | 349 if (plugwindow) |
| 333 gtk_widget_destroy(plugwindow); | 350 gtk_widget_destroy(plugwindow); |
| 334 plugwindow = NULL; | 351 plugwindow = NULL; |
| 335 } | 352 } |
| 336 | 353 |
| 354 void gaim_signal_connect(void *handle, enum gaim_event which, | |
| 355 void *func, void *data) { | |
| 356 struct gaim_callback *call = g_malloc(sizeof *call); | |
| 357 call->handle = handle; | |
| 358 call->event = which; | |
| 359 call->function = func; | |
| 360 call->data = data; | |
| 361 | |
| 362 callbacks = g_list_append(callbacks, call); | |
| 363 } | |
| 364 | |
| 365 void gaim_signal_disconnect(void *handle, enum gaim_event which, void *func) { | |
| 366 GList *c = callbacks; | |
| 367 struct gaim_callback *g = NULL; | |
| 368 while (c) { | |
| 369 g = (struct gaim_callback *)c->data; | |
| 370 if (handle == g->handle && func == g->function) { | |
| 371 callbacks = g_list_remove(callbacks, g); | |
| 372 g_free(g); | |
| 373 } | |
| 374 c = c->next; | |
| 375 } | |
| 376 } | |
| 377 | |
| 337 #endif /* GAIM_PLUGINS */ | 378 #endif /* GAIM_PLUGINS */ |
