Mercurial > pidgin.yaz
comparison src/gtkplugin.c @ 11781:10317f1a2de2
[gaim-migrate @ 14072]
Kevin Stange fixed the plugin prefs to not be accessible until the plugin is loaded
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Mon, 24 Oct 2005 01:40:51 +0000 |
parents | 1253620ea5f2 |
children | b75d8a37e603 |
comparison
equal
deleted
inserted
replaced
11780:8cb75ba77f9d | 11781:10317f1a2de2 |
---|---|
31 #include <string.h> | 31 #include <string.h> |
32 | 32 |
33 static GtkWidget *plugin_dialog = NULL; | 33 static GtkWidget *plugin_dialog = NULL; |
34 static GtkWidget *plugin_details = NULL; | 34 static GtkWidget *plugin_details = NULL; |
35 static GtkWidget *pref_button = NULL; | 35 static GtkWidget *pref_button = NULL; |
36 static GHashTable *plugin_pref_dialogs = NULL; | |
36 | 37 |
37 GtkWidget * | 38 GtkWidget * |
38 gaim_gtk_plugin_get_config_frame(GaimPlugin *plugin) | 39 gaim_gtk_plugin_get_config_frame(GaimPlugin *plugin) |
39 { | 40 { |
40 GaimGtkPluginUiInfo *ui_info; | 41 GaimGtkPluginUiInfo *ui_info; |
108 2, plug, -1); | 109 2, plug, -1); |
109 g_free(desc); | 110 g_free(desc); |
110 } | 111 } |
111 } | 112 } |
112 | 113 |
114 static void pref_dialog_response_cb(GtkWidget *d, int response, GaimPlugin *plug) | |
115 { | |
116 switch (response) { | |
117 case GTK_RESPONSE_CLOSE: | |
118 case GTK_RESPONSE_DELETE_EVENT: | |
119 g_hash_table_remove(plugin_pref_dialogs, plug); | |
120 if (g_hash_table_size(plugin_pref_dialogs) == 0) { | |
121 g_hash_table_destroy(plugin_pref_dialogs); | |
122 plugin_pref_dialogs = NULL; | |
123 } | |
124 gtk_widget_destroy(d); | |
125 break; | |
126 } | |
127 } | |
128 | |
113 static void plugin_load (GtkCellRendererToggle *cell, gchar *pth, gpointer data) | 129 static void plugin_load (GtkCellRendererToggle *cell, gchar *pth, gpointer data) |
114 { | 130 { |
115 GtkTreeModel *model = (GtkTreeModel *)data; | 131 GtkTreeModel *model = (GtkTreeModel *)data; |
116 GtkTreeIter iter; | 132 GtkTreeIter iter; |
117 GtkTreePath *path = gtk_tree_path_new_from_string(pth); | 133 GtkTreePath *path = gtk_tree_path_new_from_string(pth); |
118 GaimPlugin *plug; | 134 GaimPlugin *plug; |
119 gchar buf[1024]; | 135 gchar buf[1024]; |
120 gchar *name = NULL, *description = NULL; | 136 gchar *name = NULL, *description = NULL; |
137 GtkWidget *dialog = NULL; | |
121 | 138 |
122 GdkCursor *wait = gdk_cursor_new (GDK_WATCH); | 139 GdkCursor *wait = gdk_cursor_new (GDK_WATCH); |
123 gdk_window_set_cursor(plugin_dialog->window, wait); | 140 gdk_window_set_cursor(plugin_dialog->window, wait); |
124 gdk_cursor_unref(wait); | 141 gdk_cursor_unref(wait); |
125 | 142 |
126 gtk_tree_model_get_iter (model, &iter, path); | 143 gtk_tree_model_get_iter (model, &iter, path); |
127 gtk_tree_model_get (model, &iter, 2, &plug, -1); | 144 gtk_tree_model_get (model, &iter, 2, &plug, -1); |
128 | 145 |
129 if (!gaim_plugin_is_loaded(plug)) | 146 if (!gaim_plugin_is_loaded(plug)) |
130 gaim_plugin_load(plug); | 147 gaim_plugin_load(plug); |
131 else | 148 else { |
149 if (plugin_pref_dialogs != NULL && | |
150 (dialog = g_hash_table_lookup(plugin_pref_dialogs, plug))) | |
151 pref_dialog_response_cb(dialog, GTK_RESPONSE_DELETE_EVENT, plug); | |
132 gaim_plugin_unload(plug); | 152 gaim_plugin_unload(plug); |
133 | 153 } |
154 | |
155 gtk_widget_set_sensitive(pref_button, | |
156 plug->info->ui_info != NULL && | |
157 GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame != NULL && | |
158 gaim_plugin_is_loaded(plug)); | |
134 | 159 |
135 gdk_window_set_cursor(plugin_dialog->window, NULL); | 160 gdk_window_set_cursor(plugin_dialog->window, NULL); |
136 | 161 |
137 name = g_markup_escape_text(_(plug->info->name), -1); | 162 name = g_markup_escape_text(_(plug->info->name), -1); |
138 description = g_markup_escape_text(_(plug->info->description), -1); | 163 description = g_markup_escape_text(_(plug->info->description), -1); |
139 | 164 |
140 if (plug->error != NULL) { | 165 if (plug->error != NULL) { |
141 gchar *error = g_markup_escape_text(plug->error, -1); | 166 gchar *error = g_markup_escape_text(plug->error, -1); |
142 gchar *desc; | 167 gchar *desc; |
143 g_snprintf(buf, sizeof(buf), | 168 g_snprintf(buf, sizeof(buf), |
144 "<span size=\"larger\">%s %s</span>\n\n" | 169 "<span size=\"larger\">%s %s</span>\n\n" |
145 "<span weight=\"bold\" color=\"red\">%s</span>\n\n" | 170 "<span weight=\"bold\" color=\"red\">%s</span>\n\n" |
146 "%s", | 171 "%s", |
147 name, plug->info->version, error, description); | 172 name, plug->info->version, error, description); |
148 desc = g_strdup_printf("<b>%s</b> %s\n<span weight=\"bold\" color=\"red\"%s</span>", | 173 desc = g_strdup_printf("<b>%s</b> %s\n<span weight=\"bold\" color=\"red\"%s</span>", |
149 plug->info->name, plug->info->version, error); | 174 plug->info->name, plug->info->version, error); |
150 gtk_list_store_set (GTK_LIST_STORE (model), &iter, | 175 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
151 1, desc, | 176 1, desc, |
152 -1); | 177 -1); |
153 g_free(desc); | 178 g_free(desc); |
154 g_free(error); | 179 g_free(error); |
155 } else { | 180 } else { |
205 pdesc ? pdesc : "", pdesc ? "\n\n" : "", | 230 pdesc ? pdesc : "", pdesc ? "\n\n" : "", |
206 pauth ? pauth : "", pweb ? pweb : "", plug->path); | 231 pauth ? pauth : "", pweb ? pweb : "", plug->path); |
207 | 232 |
208 gtk_widget_set_sensitive(pref_button, | 233 gtk_widget_set_sensitive(pref_button, |
209 plug->info->ui_info != NULL && | 234 plug->info->ui_info != NULL && |
210 GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame != NULL); | 235 GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame != NULL && |
236 gaim_plugin_is_loaded(plug)); | |
211 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); | 237 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
212 g_value_unset(&val); | 238 g_value_unset(&val); |
213 g_free(buf); | 239 g_free(buf); |
214 g_free(pname); | 240 g_free(pname); |
215 g_free(pdesc); | 241 g_free(pdesc); |
216 g_free(pauth); | 242 g_free(pauth); |
217 g_free(pweb); | 243 g_free(pweb); |
218 } | 244 } |
219 | 245 |
220 static GSList *plugin_pref_dialogs = NULL; | |
221 static void pref_dialog_response_cb(GtkWidget *d, int response, GaimPlugin *plug) | |
222 { | |
223 switch (response) { | |
224 case GTK_RESPONSE_CLOSE: | |
225 case GTK_RESPONSE_DELETE_EVENT: | |
226 plugin_pref_dialogs = g_slist_remove(plugin_pref_dialogs, plug); | |
227 gtk_widget_destroy(d); | |
228 break; | |
229 } | |
230 } | |
231 static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) | 246 static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) |
232 { | 247 { |
233 GaimPlugin *plug; | 248 GaimPlugin *plug; |
234 GtkWidget *dialog, *box; | 249 GtkWidget *dialog, *box; |
235 GtkTreeModel *model; | 250 GtkTreeModel *model; |
247 return; | 262 return; |
248 gtk_tree_model_get_value (model, &iter, 2, &val); | 263 gtk_tree_model_get_value (model, &iter, 2, &val); |
249 plug = g_value_get_pointer(&val); | 264 plug = g_value_get_pointer(&val); |
250 if (plug == NULL) | 265 if (plug == NULL) |
251 break; | 266 break; |
252 if (g_slist_find(plugin_pref_dialogs, plug)) | 267 if (plugin_pref_dialogs != NULL && |
268 g_hash_table_lookup(plugin_pref_dialogs, plug)) | |
253 break; | 269 break; |
254 plugin_pref_dialogs = g_slist_prepend(plugin_pref_dialogs, plug); | |
255 box = gaim_gtk_plugin_get_config_frame(plug); | 270 box = gaim_gtk_plugin_get_config_frame(plug); |
256 if (box == NULL) | 271 if (box == NULL) |
257 break; | 272 break; |
258 | 273 |
259 dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), | 274 dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), |
260 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, | 275 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, |
261 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, | 276 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
262 NULL); | 277 NULL); |
278 if (plugin_pref_dialogs == NULL) | |
279 plugin_pref_dialogs = g_hash_table_new(NULL, NULL); | |
280 | |
281 g_hash_table_insert(plugin_pref_dialogs, plug, dialog); | |
282 | |
263 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); | 283 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); |
264 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); | 284 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); |
265 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); | 285 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); |
266 gtk_window_set_title(GTK_WINDOW(dialog), gaim_plugin_get_name(plug)); | 286 gtk_window_set_title(GTK_WINDOW(dialog), gaim_plugin_get_name(plug)); |
267 gtk_widget_show_all(dialog); | 287 gtk_widget_show_all(dialog); |