Mercurial > pidgin
annotate src/plugins.c @ 134:00c1ee609648
[gaim-migrate @ 144]
Heh, whoops. Silly bug. If you only have one plugin loaded, and it's
configurable, and you unload it, the 'configure' button wouldn't deactivate,
and so you could still click on it, and it would segfault.
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Wed, 19 Apr 2000 02:23:30 +0000 |
| parents | 4290a5a20d3c |
| children | e8ea1e2fdf0c |
| rev | line source |
|---|---|
| 1 | 1 /* |
| 2 * gaim | |
| 3 * | |
| 4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 5 * | |
| 6 * This program is free software; you can redistribute it and/or modify | |
| 7 * it under the terms of the GNU General Public License as published by | |
| 8 * the Free Software Foundation; either version 2 of the License, or | |
| 9 * (at your option) any later version. | |
| 10 * | |
| 11 * This program is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 * GNU General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU General Public License | |
| 17 * along with this program; if not, write to the Free Software | |
| 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 * | |
| 20 * ---------------- | |
| 21 * The Plug-in plug | |
| 22 * | |
| 23 * Plugin support is currently being maintained by Mike Saraf | |
| 24 * msaraf@dwc.edu | |
| 25 * | |
| 90 | 26 * Well, I didn't see any work done on it for a while, so I'm going to try |
| 27 * my hand at it. - Eric warmenhoven@yahoo.com | |
| 28 * | |
| 1 | 29 */ |
| 30 | |
| 90 | 31 #ifdef GAIM_PLUGINS |
| 32 | |
| 1 | 33 #include <string.h> |
| 34 #include <sys/time.h> | |
| 35 | |
| 36 #include <sys/types.h> | |
| 37 #include <sys/stat.h> | |
| 38 | |
| 39 #include <unistd.h> | |
| 40 #include <stdio.h> | |
| 41 #include <stdlib.h> | |
| 42 #include <gtk/gtk.h> | |
| 43 #include "gaim.h" | |
| 44 | |
| 90 | 45 #include <dlfcn.h> |
| 46 | |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
47 /* ------------------ Global Variables ----------------------- */ |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
48 |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
49 GList *callbacks = NULL; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
50 |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
51 /* ------------------ Local Variables ------------------------ */ |
| 1 | 52 |
| 90 | 53 static GtkWidget *plugin_dialog = NULL; |
| 54 static GList *plugins = NULL; | |
| 55 | |
| 56 static GtkWidget *pluglist; | |
| 57 static GtkWidget *plugtext; | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
58 static GtkWidget *plugwindow; |
| 1 | 59 |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
60 static GtkWidget *config; |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
61 |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
62 /* --------------- Function Declarations --------------------- */ |
| 1 | 63 |
| 90 | 64 void load_plugin (GtkWidget *, gpointer); |
| 65 void unload_plugin(GtkWidget *, gpointer); | |
| 66 void show_plugins (GtkWidget *, gpointer); | |
| 67 | |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
68 void gaim_signal_connect (void *, enum gaim_event, void *, void *); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
69 void gaim_signal_disconnect(void *, enum gaim_event, void *); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
70 |
| 90 | 71 static void destroy_plugins (GtkWidget *, gpointer); |
| 72 static void load_which_plugin(GtkWidget *, gpointer); | |
| 73 static void unload (GtkWidget *, gpointer); | |
| 74 static void list_clicked (GtkWidget *, struct gaim_plugin *); | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
75 static void update_show_plugins(); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
76 static void hide_plugins (GtkWidget *, gpointer); |
| 90 | 77 |
| 1 | 78 /* ------------------ Code Below ---------------------------- */ |
| 79 | |
| 90 | 80 static void destroy_plugins(GtkWidget *w, gpointer data) { |
| 81 if (plugin_dialog) | |
| 82 gtk_widget_destroy(plugin_dialog); | |
| 83 plugin_dialog = NULL; | |
| 84 } | |
| 85 | |
| 86 void load_plugin(GtkWidget *w, gpointer data) | |
| 1 | 87 { |
| 90 | 88 char *buf = g_malloc(BUF_LEN); |
| 1 | 89 |
| 90 | 90 if (!plugin_dialog) { |
| 91 plugin_dialog = gtk_file_selection_new("Gaim - Plugin List"); | |
| 92 | |
| 93 gtk_file_selection_hide_fileop_buttons( | |
| 94 GTK_FILE_SELECTION(plugin_dialog)); | |
| 95 | |
| 96 if(getenv("PLUGIN_DIR") == NULL) { | |
| 97 g_snprintf(buf, BUF_LEN - 1, "%s/%s", getenv("HOME"), PLUGIN_DIR); | |
| 98 } else { | |
| 99 g_snprintf(buf, BUF_LEN - 1, "%s/", getenv("PLUGIN_DIR")); | |
| 100 } | |
| 1 | 101 |
| 90 | 102 gtk_file_selection_set_filename(GTK_FILE_SELECTION(plugin_dialog), buf); |
| 103 gtk_signal_connect(GTK_OBJECT(plugin_dialog), "destroy", | |
| 104 GTK_SIGNAL_FUNC(destroy_plugins), plugin_dialog); | |
| 105 | |
| 106 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->ok_button), | |
| 107 "clicked", GTK_SIGNAL_FUNC(load_which_plugin), NULL); | |
| 108 | |
| 109 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plugin_dialog)->cancel_button), | |
| 110 "clicked", GTK_SIGNAL_FUNC(destroy_plugins), NULL); | |
| 111 | |
| 112 } | |
| 113 | |
| 114 g_free(buf); | |
| 115 gtk_widget_show(plugin_dialog); | |
| 116 gdk_window_raise(plugin_dialog->window); | |
| 117 } | |
| 1 | 118 |
| 90 | 119 void load_which_plugin(GtkWidget *w, gpointer data) { |
| 120 struct gaim_plugin *plug; | |
| 121 void (*gaim_plugin_init)(); | |
| 122 char *(*cfunc)(); | |
| 123 char *error; | |
| 124 | |
| 125 plug = g_malloc(sizeof *plug); | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
126 plug->filename = g_strdup(gtk_file_selection_get_filename( |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
127 GTK_FILE_SELECTION(plugin_dialog))); |
| 90 | 128 /* do NOT OR with RTLD_GLOBAL, otherwise plugins may conflict |
| 129 * (it's really just a way to work around other people's bad | |
| 130 * programming, by not using RTLD_GLOBAL :P ) */ | |
| 131 plug->handle = dlopen(plug->filename, RTLD_LAZY); | |
| 132 if (!plug->handle) { | |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
133 error = (char *)dlerror(); |
| 90 | 134 do_error_dialog(error, "Plugin Error"); |
| 135 g_free(plug); | |
| 136 return; | |
| 137 } | |
| 138 | |
| 139 if (plugin_dialog) | |
| 140 gtk_widget_destroy(plugin_dialog); | |
| 141 plugin_dialog = NULL; | |
| 1 | 142 |
| 90 | 143 gaim_plugin_init = dlsym(plug->handle, "gaim_plugin_init"); |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
144 if ((error = (char *)dlerror()) != NULL) { |
| 90 | 145 do_error_dialog(error, "Plugin Error"); |
| 146 dlclose(plug->handle); | |
| 147 g_free(plug); | |
| 148 return; | |
| 149 } | |
| 150 | |
| 151 plugins = g_list_append(plugins, plug); | |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
152 (*gaim_plugin_init)(plug->handle); |
| 1 | 153 |
| 90 | 154 cfunc = dlsym(plug->handle, "name"); |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
155 if ((error = (char *)dlerror()) == NULL) |
| 90 | 156 plug->name = (*cfunc)(); |
| 157 else | |
| 158 plug->name = NULL; | |
| 1 | 159 |
| 90 | 160 cfunc = dlsym(plug->handle, "description"); |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
161 if ((error = (char *)dlerror()) == NULL) |
| 90 | 162 plug->description = (*cfunc)(); |
| 163 else | |
| 164 plug->description = NULL; | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
165 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
166 update_show_plugins(); |
| 90 | 167 } |
| 1 | 168 |
| 90 | 169 void unload_plugin(GtkWidget *w, gpointer data) { |
| 170 /* FIXME */ | |
| 1 | 171 } |
| 172 | |
| 90 | 173 void show_plugins(GtkWidget *w, gpointer data) { |
| 174 /* most of this code was shamelessly stolen from prefs.c */ | |
| 175 GtkWidget *page; | |
| 176 GtkWidget *topbox; | |
| 177 GtkWidget *botbox; | |
| 178 GtkWidget *sw; | |
| 179 GtkWidget *label; | |
| 180 GtkWidget *list_item; | |
| 181 GtkWidget *sw2; | |
| 182 GtkWidget *add; | |
| 183 GtkWidget *remove; | |
|
96
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
184 GtkWidget *close; |
| 90 | 185 GList *plugs = plugins; |
| 186 struct gaim_plugin *p; | |
| 187 gchar buffer[1024]; | |
| 188 | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
189 if (plugwindow) return; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
190 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
191 plugwindow = gtk_window_new(GTK_WINDOW_DIALOG); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
192 gtk_widget_realize(plugwindow); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
193 aol_icon(plugwindow->window); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
194 gtk_container_border_width(GTK_CONTAINER(plugwindow), 10); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
195 gtk_window_set_title(GTK_WINDOW(plugwindow), "Gaim - Plugins"); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
196 gtk_widget_set_usize(plugwindow, 400, 250); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
197 gtk_signal_connect(GTK_OBJECT(plugwindow), "destroy", |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
198 GTK_SIGNAL_FUNC(hide_plugins), NULL); |
| 90 | 199 |
| 200 page = gtk_vbox_new(FALSE, 0); | |
| 201 topbox = gtk_hbox_new(FALSE, 0); | |
| 202 botbox = gtk_hbox_new(FALSE, 0); | |
| 203 | |
| 204 sw2 = gtk_scrolled_window_new(NULL, NULL); | |
| 205 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2), | |
| 206 GTK_POLICY_AUTOMATIC, | |
| 207 GTK_POLICY_AUTOMATIC); | |
| 208 | |
| 209 pluglist = gtk_list_new(); | |
| 210 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), pluglist); | |
| 211 gtk_box_pack_start(GTK_BOX(topbox), sw2, TRUE, TRUE, 0); | |
| 212 | |
| 213 sw = gtk_scrolled_window_new(NULL, NULL); | |
| 214 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
| 215 GTK_POLICY_AUTOMATIC, | |
| 216 GTK_POLICY_AUTOMATIC); | |
| 217 | |
| 218 plugtext = gtk_text_new(NULL, NULL); | |
| 219 gtk_container_add(GTK_CONTAINER(sw), plugtext); | |
| 220 gtk_box_pack_start(GTK_BOX(topbox), sw, TRUE, TRUE, 0); | |
| 221 gtk_text_set_word_wrap(GTK_TEXT(plugtext), TRUE); | |
| 222 gtk_text_set_editable(GTK_TEXT(plugtext), FALSE); | |
| 223 | |
| 224 add = gtk_button_new_with_label("Load Plugin"); | |
| 225 gtk_signal_connect(GTK_OBJECT(add), "clicked", | |
| 226 GTK_SIGNAL_FUNC(load_plugin), NULL); | |
| 227 gtk_box_pack_start(GTK_BOX(botbox), add, TRUE, FALSE, 5); | |
| 228 | |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
229 config = gtk_button_new_with_label("Configure Plugin"); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
230 gtk_widget_set_sensitive(config, 0); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
231 gtk_box_pack_start(GTK_BOX(botbox), config, TRUE, FALSE, 5); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
232 |
| 90 | 233 remove = gtk_button_new_with_label("Unload Plugin"); |
| 234 gtk_signal_connect(GTK_OBJECT(remove), "clicked", | |
| 235 GTK_SIGNAL_FUNC(unload), pluglist); | |
| 236 gtk_box_pack_start(GTK_BOX(botbox), remove, TRUE, FALSE, 5); | |
| 237 | |
|
96
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
238 close = gtk_button_new_with_label("Close"); |
|
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
239 gtk_signal_connect(GTK_OBJECT(close), "clicked", |
|
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
240 GTK_SIGNAL_FUNC(hide_plugins), NULL); |
|
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
241 gtk_box_pack_start(GTK_BOX(botbox), close, TRUE, FALSE, 5); |
|
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
242 |
| 90 | 243 gtk_box_pack_start(GTK_BOX(page), topbox, TRUE, TRUE, 0); |
| 244 gtk_box_pack_start(GTK_BOX(page), botbox, FALSE, FALSE, 0); | |
| 245 | |
| 246 if (plugs != NULL) { | |
| 247 p = (struct gaim_plugin *)plugs->data; | |
| 248 g_snprintf(buffer, sizeof(buffer), "%s", p->filename); | |
| 249 gtk_text_insert(GTK_TEXT(plugtext), NULL, NULL, NULL, buffer, -1); | |
| 250 } | |
| 251 | |
| 252 while (plugs) { | |
| 253 p = (struct gaim_plugin *)plugs->data; | |
| 254 label = gtk_label_new(p->filename); | |
| 255 list_item = gtk_list_item_new(); | |
| 256 gtk_container_add(GTK_CONTAINER(list_item), label); | |
| 257 gtk_signal_connect(GTK_OBJECT(list_item), "select", | |
| 258 GTK_SIGNAL_FUNC(list_clicked), p); | |
| 259 gtk_object_set_user_data(GTK_OBJECT(list_item), p); | |
| 260 | |
| 261 gtk_widget_show(label); | |
| 262 gtk_container_add(GTK_CONTAINER(pluglist), list_item); | |
| 263 gtk_widget_show(list_item); | |
| 264 | |
| 265 plugs = plugs->next; | |
| 266 } | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
267 if (plugins != NULL) |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
268 gtk_list_select_item(GTK_LIST(pluglist), 0); |
| 90 | 269 |
| 270 gtk_widget_show(page); | |
| 271 gtk_widget_show(topbox); | |
| 272 gtk_widget_show(botbox); | |
| 273 gtk_widget_show(sw); | |
| 274 gtk_widget_show(sw2); | |
| 275 gtk_widget_show(pluglist); | |
| 276 gtk_widget_show(plugtext); | |
| 277 gtk_widget_show(add); | |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
278 gtk_widget_show(config); |
| 90 | 279 gtk_widget_show(remove); |
|
96
247f540ea6e1
[gaim-migrate @ 106]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
94
diff
changeset
|
280 gtk_widget_show(close); |
| 90 | 281 |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
282 gtk_container_add(GTK_CONTAINER(plugwindow), page); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
283 gtk_widget_show(plugwindow); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
284 } |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
285 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
286 void update_show_plugins() { |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
287 GList *plugs = plugins; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
288 struct gaim_plugin *p; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
289 GtkWidget *label; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
290 GtkWidget *list_item; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
291 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
292 if (pluglist == NULL) return; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
293 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
294 gtk_list_clear_items(GTK_LIST(pluglist), 0, -1); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
295 while (plugs) { |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
296 p = (struct gaim_plugin *)plugs->data; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
297 label = gtk_label_new(p->filename); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
298 list_item = gtk_list_item_new(); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
299 gtk_container_add(GTK_CONTAINER(list_item), label); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
300 gtk_signal_connect(GTK_OBJECT(list_item), "select", |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
301 GTK_SIGNAL_FUNC(list_clicked), p); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
302 gtk_object_set_user_data(GTK_OBJECT(list_item), p); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
303 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
304 gtk_widget_show(label); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
305 gtk_container_add(GTK_CONTAINER(pluglist), list_item); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
306 gtk_widget_show(list_item); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
307 plugs = plugs->next; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
308 } |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
309 if (plugins != NULL) |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
310 gtk_list_select_item(GTK_LIST(pluglist), 0); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
311 else { |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
312 gtk_text_set_point(GTK_TEXT(plugtext), 0); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
313 gtk_text_forward_delete(GTK_TEXT(plugtext), |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
314 gtk_text_get_length(GTK_TEXT(plugtext))); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
315 } |
| 1 | 316 } |
| 317 | |
| 90 | 318 void unload(GtkWidget *w, gpointer data) { |
| 319 GList *i; | |
| 320 struct gaim_plugin *p; | |
| 321 void (*gaim_plugin_remove)(); | |
| 322 char *error; | |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
323 GList *c = callbacks; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
324 struct gaim_callback *g; |
| 90 | 325 |
| 326 i = GTK_LIST(pluglist)->selection; | |
| 327 | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
328 if (i == NULL) return; |
| 90 | 329 |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
330 p = gtk_object_get_user_data(GTK_OBJECT(i->data)); |
| 1 | 331 |
| 90 | 332 gaim_plugin_remove = dlsym(p->handle, "gaim_plugin_remove"); |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
333 if ((error = (char *)dlerror()) == NULL) |
| 90 | 334 (*gaim_plugin_remove)(); |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
335 while (c) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
336 g = (struct gaim_callback *)c->data; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
337 if (g->handle == p->handle) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
338 callbacks = g_list_remove(callbacks, c); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
339 g_free(g); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
340 } |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
341 c = c->next; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
342 } |
| 90 | 343 dlclose(p->handle); |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
344 |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
345 plugins = g_list_remove(plugins, p); |
| 90 | 346 g_free(p); |
|
134
00c1ee609648
[gaim-migrate @ 144]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
129
diff
changeset
|
347 gtk_widget_set_sensitive(config, 0); |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
348 update_show_plugins(); |
| 90 | 349 } |
| 350 | |
| 351 void list_clicked(GtkWidget *w, struct gaim_plugin *p) { | |
| 352 gchar buffer[2048]; | |
| 353 guint text_len; | |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
354 void (*gaim_plugin_config)(); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
355 char *error; |
| 90 | 356 |
| 357 text_len = gtk_text_get_length(GTK_TEXT(plugtext)); | |
| 358 gtk_text_set_point(GTK_TEXT(plugtext), 0); | |
| 359 gtk_text_forward_delete(GTK_TEXT(plugtext), text_len); | |
| 360 | |
| 361 g_snprintf(buffer, sizeof buffer, "%s\n%s", p->name, p->description); | |
| 362 gtk_text_insert(GTK_TEXT(plugtext), NULL, NULL, NULL, buffer, -1); | |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
363 |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
364 gaim_plugin_config = dlsym(p->handle, "gaim_plugin_config"); |
|
129
4290a5a20d3c
[gaim-migrate @ 139]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
110
diff
changeset
|
365 if ((error = (char *)dlerror()) == NULL) { |
|
110
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
366 gtk_signal_connect(GTK_OBJECT(config), "clicked", |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
367 GTK_SIGNAL_FUNC(gaim_plugin_config), NULL); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
368 gtk_widget_set_sensitive(config, 1); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
369 } else { |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
370 gtk_widget_set_sensitive(config, 0); |
|
f7c6366ca703
[gaim-migrate @ 120]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
96
diff
changeset
|
371 } |
| 90 | 372 } |
| 373 | |
|
92
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
374 void hide_plugins(GtkWidget *w, gpointer data) { |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
375 if (plugwindow) |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
376 gtk_widget_destroy(plugwindow); |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
377 plugwindow = NULL; |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
378 } |
|
f3c6cf79f651
[gaim-migrate @ 102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
90
diff
changeset
|
379 |
|
94
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
380 void gaim_signal_connect(void *handle, enum gaim_event which, |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
381 void *func, void *data) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
382 struct gaim_callback *call = g_malloc(sizeof *call); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
383 call->handle = handle; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
384 call->event = which; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
385 call->function = func; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
386 call->data = data; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
387 |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
388 callbacks = g_list_append(callbacks, call); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
389 } |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
390 |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
391 void gaim_signal_disconnect(void *handle, enum gaim_event which, void *func) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
392 GList *c = callbacks; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
393 struct gaim_callback *g = NULL; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
394 while (c) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
395 g = (struct gaim_callback *)c->data; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
396 if (handle == g->handle && func == g->function) { |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
397 callbacks = g_list_remove(callbacks, g); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
398 g_free(g); |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
399 } |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
400 c = c->next; |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
401 } |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
402 } |
|
9f6ce50ffb78
[gaim-migrate @ 104]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
92
diff
changeset
|
403 |
| 90 | 404 #endif /* GAIM_PLUGINS */ |
