Mercurial > pidgin
comparison src/plugins.c @ 92:f3c6cf79f651
[gaim-migrate @ 102]
Loading/unloading plugins works correctly. I have to add "hooks" to the
rest of gaim now to do certain things. Other than that, it's all good.
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Fri, 07 Apr 2000 22:48:58 +0000 |
| parents | f5b305c0d974 |
| children | 9f6ce50ffb78 |
comparison
equal
deleted
inserted
replaced
| 91:308d0896d979 | 92:f3c6cf79f651 |
|---|---|
| 49 static GtkWidget *plugin_dialog = NULL; | 49 static GtkWidget *plugin_dialog = NULL; |
| 50 static GList *plugins = NULL; | 50 static GList *plugins = NULL; |
| 51 | 51 |
| 52 static GtkWidget *pluglist; | 52 static GtkWidget *pluglist; |
| 53 static GtkWidget *plugtext; | 53 static GtkWidget *plugtext; |
| 54 static GtkWidget *plugwindow; | |
| 54 | 55 |
| 55 /* --------------- Function Declarations -------------------- */ | 56 /* --------------- Function Declarations -------------------- */ |
| 56 | 57 |
| 57 void load_plugin (GtkWidget *, gpointer); | 58 void load_plugin (GtkWidget *, gpointer); |
| 58 void unload_plugin(GtkWidget *, gpointer); | 59 void unload_plugin(GtkWidget *, gpointer); |
| 60 | 61 |
| 61 static void destroy_plugins (GtkWidget *, gpointer); | 62 static void destroy_plugins (GtkWidget *, gpointer); |
| 62 static void load_which_plugin(GtkWidget *, gpointer); | 63 static void load_which_plugin(GtkWidget *, gpointer); |
| 63 static void unload (GtkWidget *, gpointer); | 64 static void unload (GtkWidget *, gpointer); |
| 64 static void list_clicked (GtkWidget *, struct gaim_plugin *); | 65 static void list_clicked (GtkWidget *, struct gaim_plugin *); |
| 66 static void update_show_plugins(); | |
| 67 static void hide_plugins (GtkWidget *, gpointer); | |
| 65 | 68 |
| 66 /* ------------------ Code Below ---------------------------- */ | 69 /* ------------------ Code Below ---------------------------- */ |
| 67 | 70 |
| 68 static void destroy_plugins(GtkWidget *w, gpointer data) { | 71 static void destroy_plugins(GtkWidget *w, gpointer data) { |
| 69 if (plugin_dialog) | 72 if (plugin_dialog) |
| 106 | 109 |
| 107 void load_which_plugin(GtkWidget *w, gpointer data) { | 110 void load_which_plugin(GtkWidget *w, gpointer data) { |
| 108 struct gaim_plugin *plug; | 111 struct gaim_plugin *plug; |
| 109 void (*gaim_plugin_init)(); | 112 void (*gaim_plugin_init)(); |
| 110 char *(*cfunc)(); | 113 char *(*cfunc)(); |
| 111 int (*nfunc)(); | |
| 112 char *error; | 114 char *error; |
| 113 | 115 |
| 114 plug = g_malloc(sizeof *plug); | 116 plug = g_malloc(sizeof *plug); |
| 115 plug->filename = gtk_file_selection_get_filename( | 117 plug->filename = g_strdup(gtk_file_selection_get_filename( |
| 116 GTK_FILE_SELECTION(plugin_dialog)); | 118 GTK_FILE_SELECTION(plugin_dialog))); |
| 117 /* do NOT OR with RTLD_GLOBAL, otherwise plugins may conflict | 119 /* do NOT OR with RTLD_GLOBAL, otherwise plugins may conflict |
| 118 * (it's really just a way to work around other people's bad | 120 * (it's really just a way to work around other people's bad |
| 119 * programming, by not using RTLD_GLOBAL :P ) */ | 121 * programming, by not using RTLD_GLOBAL :P ) */ |
| 120 plug->handle = dlopen(plug->filename, RTLD_LAZY); | 122 plug->handle = dlopen(plug->filename, RTLD_LAZY); |
| 121 if (!plug->handle) { | 123 if (!plug->handle) { |
| 149 cfunc = dlsym(plug->handle, "description"); | 151 cfunc = dlsym(plug->handle, "description"); |
| 150 if ((error = dlerror()) == NULL) | 152 if ((error = dlerror()) == NULL) |
| 151 plug->description = (*cfunc)(); | 153 plug->description = (*cfunc)(); |
| 152 else | 154 else |
| 153 plug->description = NULL; | 155 plug->description = NULL; |
| 156 | |
| 157 update_show_plugins(); | |
| 154 } | 158 } |
| 155 | 159 |
| 156 void unload_plugin(GtkWidget *w, gpointer data) { | 160 void unload_plugin(GtkWidget *w, gpointer data) { |
| 157 /* FIXME */ | 161 /* FIXME */ |
| 158 } | 162 } |
| 159 | 163 |
| 160 void show_plugins(GtkWidget *w, gpointer data) { | 164 void show_plugins(GtkWidget *w, gpointer data) { |
| 161 /* most of this code was shamelessly stolen from prefs.c */ | 165 /* most of this code was shamelessly stolen from prefs.c */ |
| 162 GtkWidget *window; | |
| 163 GtkWidget *page; | 166 GtkWidget *page; |
| 164 GtkWidget *topbox; | 167 GtkWidget *topbox; |
| 165 GtkWidget *botbox; | 168 GtkWidget *botbox; |
| 166 GtkWidget *sw; | 169 GtkWidget *sw; |
| 167 GtkWidget *label; | 170 GtkWidget *label; |
| 171 GtkWidget *remove; | 174 GtkWidget *remove; |
| 172 GList *plugs = plugins; | 175 GList *plugs = plugins; |
| 173 struct gaim_plugin *p; | 176 struct gaim_plugin *p; |
| 174 gchar buffer[1024]; | 177 gchar buffer[1024]; |
| 175 | 178 |
| 176 window = gtk_window_new(GTK_WINDOW_DIALOG); | 179 if (plugwindow) return; |
| 177 gtk_widget_realize(window); | 180 |
| 178 aol_icon(window->window); | 181 plugwindow = gtk_window_new(GTK_WINDOW_DIALOG); |
| 179 gtk_container_border_width(GTK_CONTAINER(window), 10); | 182 gtk_widget_realize(plugwindow); |
| 180 gtk_window_set_title(GTK_WINDOW(window), "Gaim - Plugins"); | 183 aol_icon(plugwindow->window); |
| 184 gtk_container_border_width(GTK_CONTAINER(plugwindow), 10); | |
| 185 gtk_window_set_title(GTK_WINDOW(plugwindow), "Gaim - Plugins"); | |
| 186 gtk_widget_set_usize(plugwindow, 400, 250); | |
| 187 gtk_signal_connect(GTK_OBJECT(plugwindow), "destroy", | |
| 188 GTK_SIGNAL_FUNC(hide_plugins), NULL); | |
| 181 | 189 |
| 182 page = gtk_vbox_new(FALSE, 0); | 190 page = gtk_vbox_new(FALSE, 0); |
| 183 topbox = gtk_hbox_new(FALSE, 0); | 191 topbox = gtk_hbox_new(FALSE, 0); |
| 184 botbox = gtk_hbox_new(FALSE, 0); | 192 botbox = gtk_hbox_new(FALSE, 0); |
| 185 | 193 |
| 235 gtk_container_add(GTK_CONTAINER(pluglist), list_item); | 243 gtk_container_add(GTK_CONTAINER(pluglist), list_item); |
| 236 gtk_widget_show(list_item); | 244 gtk_widget_show(list_item); |
| 237 | 245 |
| 238 plugs = plugs->next; | 246 plugs = plugs->next; |
| 239 } | 247 } |
| 248 if (plugins != NULL) | |
| 249 gtk_list_select_item(GTK_LIST(pluglist), 0); | |
| 240 | 250 |
| 241 gtk_widget_show(page); | 251 gtk_widget_show(page); |
| 242 gtk_widget_show(topbox); | 252 gtk_widget_show(topbox); |
| 243 gtk_widget_show(botbox); | 253 gtk_widget_show(botbox); |
| 244 gtk_widget_show(sw); | 254 gtk_widget_show(sw); |
| 246 gtk_widget_show(pluglist); | 256 gtk_widget_show(pluglist); |
| 247 gtk_widget_show(plugtext); | 257 gtk_widget_show(plugtext); |
| 248 gtk_widget_show(add); | 258 gtk_widget_show(add); |
| 249 gtk_widget_show(remove); | 259 gtk_widget_show(remove); |
| 250 | 260 |
| 251 gtk_container_add(GTK_CONTAINER(window), page); | 261 gtk_container_add(GTK_CONTAINER(plugwindow), page); |
| 252 gtk_widget_show(window); | 262 gtk_widget_show(plugwindow); |
| 263 } | |
| 264 | |
| 265 void update_show_plugins() { | |
| 266 GList *plugs = plugins; | |
| 267 struct gaim_plugin *p; | |
| 268 GtkWidget *label; | |
| 269 GtkWidget *list_item; | |
| 270 | |
| 271 if (pluglist == NULL) return; | |
| 272 | |
| 273 gtk_list_clear_items(GTK_LIST(pluglist), 0, -1); | |
| 274 while (plugs) { | |
| 275 p = (struct gaim_plugin *)plugs->data; | |
| 276 label = gtk_label_new(p->filename); | |
| 277 list_item = gtk_list_item_new(); | |
| 278 gtk_container_add(GTK_CONTAINER(list_item), label); | |
| 279 gtk_signal_connect(GTK_OBJECT(list_item), "select", | |
| 280 GTK_SIGNAL_FUNC(list_clicked), p); | |
| 281 gtk_object_set_user_data(GTK_OBJECT(list_item), p); | |
| 282 | |
| 283 gtk_widget_show(label); | |
| 284 gtk_container_add(GTK_CONTAINER(pluglist), list_item); | |
| 285 gtk_widget_show(list_item); | |
| 286 plugs = plugs->next; | |
| 287 } | |
| 288 if (plugins != NULL) | |
| 289 gtk_list_select_item(GTK_LIST(pluglist), 0); | |
| 290 else { | |
| 291 gtk_text_set_point(GTK_TEXT(plugtext), 0); | |
| 292 gtk_text_forward_delete(GTK_TEXT(plugtext), | |
| 293 gtk_text_get_length(GTK_TEXT(plugtext))); | |
| 294 } | |
| 253 } | 295 } |
| 254 | 296 |
| 255 void unload(GtkWidget *w, gpointer data) { | 297 void unload(GtkWidget *w, gpointer data) { |
| 256 GList *i; | 298 GList *i; |
| 257 struct gaim_plugin *p; | 299 struct gaim_plugin *p; |
| 258 void (*gaim_plugin_remove)(); | 300 void (*gaim_plugin_remove)(); |
| 259 char *error; | 301 char *error; |
| 260 | 302 |
| 261 i = GTK_LIST(pluglist)->selection; | 303 i = GTK_LIST(pluglist)->selection; |
| 262 | 304 |
| 305 if (i == NULL) return; | |
| 306 | |
| 263 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); | 307 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); |
| 264 | |
| 265 g_list_remove(plugins, p); | |
| 266 | 308 |
| 267 gaim_plugin_remove = dlsym(p->handle, "gaim_plugin_remove"); | 309 gaim_plugin_remove = dlsym(p->handle, "gaim_plugin_remove"); |
| 268 if ((error = dlerror()) == NULL) | 310 if ((error = dlerror()) == NULL) |
| 269 (*gaim_plugin_remove)(); | 311 (*gaim_plugin_remove)(); |
| 270 dlclose(p->handle); | 312 dlclose(p->handle); |
| 313 | |
| 314 plugins = g_list_remove(plugins, p); | |
| 271 g_free(p); | 315 g_free(p); |
| 316 update_show_plugins(); | |
| 272 } | 317 } |
| 273 | 318 |
| 274 void list_clicked(GtkWidget *w, struct gaim_plugin *p) { | 319 void list_clicked(GtkWidget *w, struct gaim_plugin *p) { |
| 275 gchar buffer[2048]; | 320 gchar buffer[2048]; |
| 276 guint text_len; | 321 guint text_len; |
| 281 | 326 |
| 282 g_snprintf(buffer, sizeof buffer, "%s\n%s", p->name, p->description); | 327 g_snprintf(buffer, sizeof buffer, "%s\n%s", p->name, p->description); |
| 283 gtk_text_insert(GTK_TEXT(plugtext), NULL, NULL, NULL, buffer, -1); | 328 gtk_text_insert(GTK_TEXT(plugtext), NULL, NULL, NULL, buffer, -1); |
| 284 } | 329 } |
| 285 | 330 |
| 331 void hide_plugins(GtkWidget *w, gpointer data) { | |
| 332 if (plugwindow) | |
| 333 gtk_widget_destroy(plugwindow); | |
| 334 plugwindow = NULL; | |
| 335 } | |
| 336 | |
| 286 #endif /* GAIM_PLUGINS */ | 337 #endif /* GAIM_PLUGINS */ |
