Sat, 17 Dec 2005 02:24:05 +0000
[gaim-migrate @ 14820]
patch from Simon Wilkinson to add Cyrus SASL support for jabber
Give him credit if it works flawlessly. Blame me if it doesn't, as the
patch was against 1.3.1 (yeah, I've been sitting on it for that long), and
I had to merge it to HEAD, and clean up a bunch of warnings
committer: Nathan Walp <nwalp@pidgin.im>
| 5205 | 1 | /** |
|
6927
528988ef2781
[gaim-migrate @ 7474]
Christian Hammond <chipx86@chipx86.com>
parents:
5982
diff
changeset
|
2 | * @file gtkplugin.c GTK+ Plugins support |
|
528988ef2781
[gaim-migrate @ 7474]
Christian Hammond <chipx86@chipx86.com>
parents:
5982
diff
changeset
|
3 | * @ingroup gtkui |
| 5205 | 4 | * |
| 5 | * gaim | |
| 6 | * | |
| 8046 | 7 | * Gaim is the legal property of its developers, whose names are too numerous |
| 8 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 9 | * source distribution. | |
|
6927
528988ef2781
[gaim-migrate @ 7474]
Christian Hammond <chipx86@chipx86.com>
parents:
5982
diff
changeset
|
10 | * |
| 5205 | 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License as published by | |
| 13 | * the Free Software Foundation; either version 2 of the License, or | |
| 14 | * (at your option) any later version. | |
| 15 | * | |
| 16 | * This program is distributed in the hope that it will be useful, | |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 | * GNU General Public License for more details. | |
| 20 | * | |
| 21 | * You should have received a copy of the GNU General Public License | |
| 22 | * along with this program; if not, write to the Free Software | |
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 24 | */ | |
| 11740 | 25 | #include "internal.h" |
| 9791 | 26 | #include "gtkgaim.h" |
| 5205 | 27 | #include "gtkplugin.h" |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
28 | #include "gtkpluginpref.h" |
|
5981
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
29 | #include "debug.h" |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
30 | #include "prefs.h" |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
31 | |
| 5205 | 32 | #include <string.h> |
| 33 | ||
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
34 | #define GAIM_RESPONSE_CONFIGURE 98121 |
|
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
35 | |
|
12343
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
36 | static GtkWidget *expander = NULL; |
| 11740 | 37 | static GtkWidget *plugin_dialog = NULL; |
| 38 | static GtkWidget *plugin_details = NULL; | |
| 39 | static GtkWidget *pref_button = NULL; | |
| 11781 | 40 | static GHashTable *plugin_pref_dialogs = NULL; |
| 11747 | 41 | |
| 5205 | 42 | GtkWidget * |
| 43 | gaim_gtk_plugin_get_config_frame(GaimPlugin *plugin) | |
| 44 | { | |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
45 | GtkWidget *config = NULL; |
| 5205 | 46 | |
| 47 | g_return_val_if_fail(plugin != NULL, NULL); | |
| 48 | ||
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
49 | if (GAIM_IS_GTK_PLUGIN(plugin) && plugin->info->ui_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
50 | && GAIM_GTK_PLUGIN_UI_INFO(plugin)->get_config_frame) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
51 | { |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
52 | GaimGtkPluginUiInfo *ui_info; |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
53 | |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
54 | ui_info = GAIM_GTK_PLUGIN_UI_INFO(plugin); |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
55 | |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
56 | config = ui_info->get_config_frame(plugin); |
| 5205 | 57 | |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
58 | if (plugin->info->prefs_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
59 | && plugin->info->prefs_info->get_plugin_pref_frame) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
60 | { |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
61 | gaim_debug_warning("gtkplugin", |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
62 | "Plugin %s contains both, ui_info and " |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
63 | "prefs_info preferences; prefs_info will be " |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
64 | "ignored.", plugin->info->name); |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
65 | } |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
66 | } |
| 5205 | 67 | |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
68 | if (config == NULL && plugin->info->prefs_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
69 | && plugin->info->prefs_info->get_plugin_pref_frame) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
70 | { |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
71 | GaimPluginPrefFrame *frame; |
| 5205 | 72 | |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
73 | frame = plugin->info->prefs_info->get_plugin_pref_frame(plugin); |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
74 | |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
75 | config = gaim_gtk_plugin_pref_create_frame(frame); |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
76 | } |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
77 | |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
78 | return config; |
| 5205 | 79 | } |
|
5981
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
80 | |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
81 | void |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
82 | gaim_gtk_plugins_save(void) |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
83 | { |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
84 | GList *pl; |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
85 | GList *files = NULL; |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
86 | GaimPlugin *p; |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
87 | |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
88 | for (pl = gaim_plugins_get_loaded(); pl != NULL; pl = pl->next) { |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
89 | p = pl->data; |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
90 | |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
91 | if (p->info->type != GAIM_PLUGIN_PROTOCOL && |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
92 | p->info->type != GAIM_PLUGIN_LOADER) { |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
93 | |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
94 | files = g_list_append(files, p->path); |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
95 | } |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
96 | } |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
97 | |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
98 | gaim_prefs_set_string_list("/gaim/gtk/plugins/loaded", files); |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
99 | g_list_free(files); |
|
c91ece01ad12
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
100 | } |
| 11740 | 101 | |
| 102 | static void | |
| 103 | update_plugin_list(void *data) | |
| 104 | { | |
| 105 | GtkListStore *ls = GTK_LIST_STORE(data); | |
| 106 | GtkTreeIter iter; | |
| 107 | GList *probes; | |
| 108 | GaimPlugin *plug; | |
| 109 | ||
| 110 | gtk_list_store_clear(ls); | |
|
12066
58ee6aa007c8
[gaim-migrate @ 14361]
Mark Doliner <markdoliner@pidgin.im>
parents:
11888
diff
changeset
|
111 | gaim_plugins_probe(G_MODULE_SUFFIX); |
| 11740 | 112 | |
| 113 | for (probes = gaim_plugins_get_all(); | |
| 114 | probes != NULL; | |
| 115 | probes = probes->next) | |
| 116 | { | |
| 117 | char *desc; | |
| 118 | plug = probes->data; | |
| 119 | ||
| 120 | if (plug->info->type != GAIM_PLUGIN_STANDARD || | |
| 121 | (plug->info->flags & GAIM_PLUGIN_FLAG_INVISIBLE)) | |
| 122 | { | |
| 123 | continue; | |
| 124 | } | |
| 125 | ||
| 126 | gtk_list_store_append (ls, &iter); | |
| 127 | desc = g_strdup_printf("<b>%s</b> %s\n%s", plug->info->name ? _(plug->info->name) : g_basename(plug->path), | |
| 128 | plug->info->version, | |
|
12240
194dc3367706
[gaim-migrate @ 14542]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
12174
diff
changeset
|
129 | _(plug->info->summary)); |
| 11740 | 130 | gtk_list_store_set(ls, &iter, |
| 131 | 0, gaim_plugin_is_loaded(plug), | |
| 132 | 1, desc, | |
| 133 | 2, plug, -1); | |
| 134 | g_free(desc); | |
| 135 | } | |
| 136 | } | |
| 137 | ||
| 11781 | 138 | static void pref_dialog_response_cb(GtkWidget *d, int response, GaimPlugin *plug) |
| 139 | { | |
| 140 | switch (response) { | |
| 141 | case GTK_RESPONSE_CLOSE: | |
| 142 | case GTK_RESPONSE_DELETE_EVENT: | |
| 143 | g_hash_table_remove(plugin_pref_dialogs, plug); | |
| 144 | if (g_hash_table_size(plugin_pref_dialogs) == 0) { | |
| 145 | g_hash_table_destroy(plugin_pref_dialogs); | |
| 146 | plugin_pref_dialogs = NULL; | |
| 147 | } | |
| 148 | gtk_widget_destroy(d); | |
| 149 | break; | |
| 150 | } | |
| 151 | } | |
| 152 | ||
| 11740 | 153 | static void plugin_load (GtkCellRendererToggle *cell, gchar *pth, gpointer data) |
| 154 | { | |
| 155 | GtkTreeModel *model = (GtkTreeModel *)data; | |
| 156 | GtkTreeIter iter; | |
| 157 | GtkTreePath *path = gtk_tree_path_new_from_string(pth); | |
| 158 | GaimPlugin *plug; | |
| 159 | gchar buf[1024]; | |
| 160 | gchar *name = NULL, *description = NULL; | |
| 11781 | 161 | GtkWidget *dialog = NULL; |
| 11740 | 162 | |
| 163 | GdkCursor *wait = gdk_cursor_new (GDK_WATCH); | |
| 11742 | 164 | gdk_window_set_cursor(plugin_dialog->window, wait); |
| 11740 | 165 | gdk_cursor_unref(wait); |
| 166 | ||
| 167 | gtk_tree_model_get_iter (model, &iter, path); | |
| 168 | gtk_tree_model_get (model, &iter, 2, &plug, -1); | |
| 169 | ||
| 170 | if (!gaim_plugin_is_loaded(plug)) | |
| 171 | gaim_plugin_load(plug); | |
| 11781 | 172 | else { |
| 173 | if (plugin_pref_dialogs != NULL && | |
| 174 | (dialog = g_hash_table_lookup(plugin_pref_dialogs, plug))) | |
| 175 | pref_dialog_response_cb(dialog, GTK_RESPONSE_DELETE_EVENT, plug); | |
| 11740 | 176 | gaim_plugin_unload(plug); |
| 11781 | 177 | } |
| 11740 | 178 | |
| 11781 | 179 | gtk_widget_set_sensitive(pref_button, |
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
180 | gaim_plugin_is_loaded(plug) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
181 | && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
182 | && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
183 | || (plug->info->prefs_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
184 | && plug->info->prefs_info->get_plugin_pref_frame))); |
| 11740 | 185 | |
| 11742 | 186 | gdk_window_set_cursor(plugin_dialog->window, NULL); |
| 11740 | 187 | |
| 188 | name = g_markup_escape_text(_(plug->info->name), -1); | |
| 189 | description = g_markup_escape_text(_(plug->info->description), -1); | |
| 11781 | 190 | |
| 11740 | 191 | if (plug->error != NULL) { |
| 192 | gchar *error = g_markup_escape_text(plug->error, -1); | |
| 193 | gchar *desc; | |
| 194 | g_snprintf(buf, sizeof(buf), | |
| 195 | "<span size=\"larger\">%s %s</span>\n\n" | |
| 196 | "<span weight=\"bold\" color=\"red\">%s</span>\n\n" | |
| 197 | "%s", | |
| 198 | name, plug->info->version, error, description); | |
| 199 | desc = g_strdup_printf("<b>%s</b> %s\n<span weight=\"bold\" color=\"red\"%s</span>", | |
| 200 | plug->info->name, plug->info->version, error); | |
| 11781 | 201 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
| 11740 | 202 | 1, desc, |
| 203 | -1); | |
| 204 | g_free(desc); | |
| 205 | g_free(error); | |
|
11843
72bd7a3c9c3b
[gaim-migrate @ 14134]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11833
diff
changeset
|
206 | gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11740 | 207 | } |
| 208 | g_free(name); | |
| 209 | g_free(description); | |
| 210 | ||
| 211 | ||
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
212 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
|
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
213 | 0, gaim_plugin_is_loaded(plug), |
| 11740 | 214 | -1); |
| 215 | ||
| 216 | gtk_tree_path_free(path); | |
| 217 | gaim_gtk_plugins_save(); | |
| 218 | } | |
| 219 | ||
| 11877 | 220 | static gboolean ensure_plugin_visible(void *data) |
| 221 | { | |
| 222 | GtkTreeSelection *sel = GTK_TREE_SELECTION(data); | |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
223 | GtkTreeView *tv = gtk_tree_selection_get_tree_view(sel); |
| 11877 | 224 | GtkTreeModel *model = gtk_tree_view_get_model(tv); |
| 225 | GtkTreePath *path; | |
| 226 | GtkTreeIter iter; | |
| 227 | if (!gtk_tree_selection_get_selected (sel, &model, &iter)) | |
| 228 | return FALSE; | |
| 229 | path = gtk_tree_model_get_path(model, &iter); | |
| 230 | gtk_tree_view_scroll_to_cell(gtk_tree_selection_get_tree_view(sel), path, NULL, FALSE, 0, 0); | |
| 231 | gtk_tree_path_free(path); | |
| 232 | return FALSE; | |
| 233 | } | |
| 234 | ||
| 11740 | 235 | static void prefs_plugin_sel (GtkTreeSelection *sel, GtkTreeModel *model) |
| 236 | { | |
| 11741 | 237 | gchar *buf, *pname, *pdesc, *pauth, *pweb; |
| 11740 | 238 | GtkTreeIter iter; |
| 239 | GValue val = { 0, }; | |
| 240 | GaimPlugin *plug; | |
| 241 | ||
|
11833
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
242 | if (!gtk_tree_selection_get_selected (sel, &model, &iter)) |
|
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
243 | { |
|
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
244 | /* Clear the old plugin details */ |
|
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
245 | gtk_label_set_markup(GTK_LABEL(plugin_details), ""); |
|
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
246 | gtk_widget_set_sensitive(pref_button, FALSE); |
|
12343
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
247 | |
|
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
248 | /* Collapse and disable the expander widget */ |
|
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
249 | gtk_expander_set_expanded(GTK_EXPANDER(expander), FALSE); |
|
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
250 | gtk_widget_set_sensitive(expander, FALSE); |
|
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
251 | |
| 11740 | 252 | return; |
|
11833
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
253 | } |
|
119ea75db24b
[gaim-migrate @ 14124]
Mark Doliner <markdoliner@pidgin.im>
parents:
11817
diff
changeset
|
254 | |
|
12343
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
255 | gtk_widget_set_sensitive(expander, TRUE); |
|
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
256 | |
| 11740 | 257 | gtk_tree_model_get_value (model, &iter, 2, &val); |
| 258 | plug = g_value_get_pointer(&val); | |
| 259 | ||
| 260 | pname = g_markup_escape_text(_(plug->info->name), -1); | |
| 261 | pdesc = (plug->info->description) ? | |
| 262 | g_markup_escape_text(_(plug->info->description), -1) : NULL; | |
| 263 | pauth = (plug->info->author) ? | |
| 264 | g_markup_escape_text(_(plug->info->author), -1) : NULL; | |
| 265 | pweb = (plug->info->homepage) ? | |
| 266 | g_markup_escape_text(_(plug->info->homepage), -1) : NULL; | |
| 267 | buf = g_strdup_printf( | |
|
11771
7e16b808a6ee
[gaim-migrate @ 14062]
Richard Laager <rlaager@pidgin.im>
parents:
11770
diff
changeset
|
268 | _("%s%s" |
| 11740 | 269 | "<span weight=\"bold\">Written by:</span>\t%s\n" |
|
11777
ed650b58abb6
[gaim-migrate @ 14068]
Richard Laager <rlaager@pidgin.im>
parents:
11775
diff
changeset
|
270 | "<span weight=\"bold\">Web site:</span>\t\t%s\n" |
| 11740 | 271 | "<span weight=\"bold\">File name:</span>\t%s"), |
|
11771
7e16b808a6ee
[gaim-migrate @ 14062]
Richard Laager <rlaager@pidgin.im>
parents:
11770
diff
changeset
|
272 | pdesc ? pdesc : "", pdesc ? "\n\n" : "", |
| 11740 | 273 | pauth ? pauth : "", pweb ? pweb : "", plug->path); |
| 274 | ||
|
11817
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
275 | gtk_widget_set_sensitive(pref_button, |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
276 | gaim_plugin_is_loaded(plug) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
277 | && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
278 | && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
279 | || (plug->info->prefs_info |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
280 | && plug->info->prefs_info->get_plugin_pref_frame))); |
|
b8622a510778
[gaim-migrate @ 14108]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11813
diff
changeset
|
281 | |
| 11740 | 282 | gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11877 | 283 | |
| 284 | /* Make sure the selected plugin is still visible */ | |
| 285 | g_idle_add(ensure_plugin_visible, sel); | |
| 286 | ||
| 287 | ||
| 11740 | 288 | g_value_unset(&val); |
| 289 | g_free(buf); | |
| 290 | g_free(pname); | |
| 291 | g_free(pdesc); | |
| 292 | g_free(pauth); | |
| 293 | g_free(pweb); | |
| 294 | } | |
| 295 | ||
| 11741 | 296 | static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) |
| 11740 | 297 | { |
| 298 | GaimPlugin *plug; | |
| 299 | GtkWidget *dialog, *box; | |
| 300 | GtkTreeModel *model; | |
| 11743 | 301 | GValue val = { 0, }; |
| 11740 | 302 | GtkTreeIter iter; |
| 303 | ||
| 304 | switch (response) { | |
| 305 | case GTK_RESPONSE_CLOSE: | |
| 306 | case GTK_RESPONSE_DELETE_EVENT: | |
| 307 | gtk_widget_destroy(d); | |
|
11888
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11886
diff
changeset
|
308 | if (plugin_pref_dialogs != NULL) { |
|
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11886
diff
changeset
|
309 | g_hash_table_destroy(plugin_pref_dialogs); |
|
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11886
diff
changeset
|
310 | plugin_pref_dialogs = NULL; |
|
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11886
diff
changeset
|
311 | } |
| 11740 | 312 | plugin_dialog = NULL; |
| 313 | break; | |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
314 | case GAIM_RESPONSE_CONFIGURE: |
| 11740 | 315 | if (! gtk_tree_selection_get_selected (sel, &model, &iter)) |
| 316 | return; | |
| 317 | gtk_tree_model_get_value (model, &iter, 2, &val); | |
| 318 | plug = g_value_get_pointer(&val); | |
| 319 | if (plug == NULL) | |
| 320 | break; | |
| 11781 | 321 | if (plugin_pref_dialogs != NULL && |
| 322 | g_hash_table_lookup(plugin_pref_dialogs, plug)) | |
| 11770 | 323 | break; |
| 11740 | 324 | box = gaim_gtk_plugin_get_config_frame(plug); |
| 325 | if (box == NULL) | |
| 326 | break; | |
| 327 | ||
| 11741 | 328 | dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), |
| 11744 | 329 | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, |
| 11740 | 330 | GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
| 331 | NULL); | |
| 11781 | 332 | if (plugin_pref_dialogs == NULL) |
| 333 | plugin_pref_dialogs = g_hash_table_new(NULL, NULL); | |
| 334 | ||
| 335 | g_hash_table_insert(plugin_pref_dialogs, plug, dialog); | |
| 336 | ||
| 11770 | 337 | g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); |
| 11740 | 338 | gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); |
| 11747 | 339 | gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); |
|
12290
f2b2c5f855a1
[gaim-migrate @ 14594]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
12276
diff
changeset
|
340 | gtk_window_set_title(GTK_WINDOW(dialog), _(gaim_plugin_get_name(plug))); |
| 11740 | 341 | gtk_widget_show_all(dialog); |
| 11770 | 342 | g_value_unset(&val); |
| 11740 | 343 | break; |
| 344 | } | |
| 345 | } | |
| 346 | ||
|
12162
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
347 | static void |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
348 | show_plugin_prefs_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer null) |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
349 | { |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
350 | GtkTreeSelection *sel; |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
351 | GtkTreeIter iter; |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
352 | GaimPlugin *plugin; |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
353 | GtkTreeModel *model; |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
354 | |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
355 | sel = gtk_tree_view_get_selection(view); |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
356 | |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
357 | if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
358 | return; |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
359 | |
|
12162
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
360 | gtk_tree_model_get(model, &iter, 2, &plugin, -1); |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
361 | |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
362 | if (!gaim_plugin_is_loaded(plugin)) |
|
12174
3b0b53e84591
[gaim-migrate @ 14476]
Richard Laager <rlaager@pidgin.im>
parents:
12162
diff
changeset
|
363 | return; |
|
3b0b53e84591
[gaim-migrate @ 14476]
Richard Laager <rlaager@pidgin.im>
parents:
12162
diff
changeset
|
364 | |
|
12162
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
365 | /* Now show the pref-dialog for the plugin */ |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
366 | plugin_dialog_response_cb(NULL, GAIM_RESPONSE_CONFIGURE, sel); |
|
12162
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
367 | } |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
368 | |
| 11740 | 369 | void gaim_gtk_plugin_dialog_show() |
| 370 | { | |
| 11741 | 371 | GtkWidget *sw; |
| 11740 | 372 | GtkWidget *event_view; |
| 373 | GtkListStore *ls; | |
| 374 | GtkCellRenderer *rend, *rendt; | |
| 375 | GtkTreeViewColumn *col; | |
| 376 | GtkTreeSelection *sel; | |
| 377 | ||
| 378 | if (plugin_dialog != NULL) { | |
| 379 | gtk_window_present(GTK_WINDOW(plugin_dialog)); | |
| 380 | return; | |
| 381 | } | |
| 382 | ||
| 383 | plugin_dialog = gtk_dialog_new_with_buttons(_("Plugins"), | |
| 384 | NULL, | |
| 385 | GTK_DIALOG_NO_SEPARATOR, | |
| 386 | NULL); | |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
387 | pref_button = gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
| 12276 | 388 | _("Configure Pl_ugin"), GAIM_RESPONSE_CONFIGURE); |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
389 | gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
|
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
390 | GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); |
| 11813 | 391 | gtk_widget_set_sensitive(pref_button, FALSE); |
| 11747 | 392 | gtk_window_set_role(GTK_WINDOW(plugin_dialog), "plugins"); |
| 11740 | 393 | |
| 394 | sw = gtk_scrolled_window_new(NULL,NULL); | |
| 395 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
| 396 | gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 397 | ||
| 398 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), sw, TRUE, TRUE, 0); | |
| 399 | ||
| 400 | ls = gtk_list_store_new (3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER); | |
| 401 | gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), | |
| 402 | 1, GTK_SORT_ASCENDING); | |
| 403 | ||
| 404 | update_plugin_list(ls); | |
| 11813 | 405 | |
| 11740 | 406 | event_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(ls)); |
| 407 | ||
|
12162
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
408 | g_signal_connect(G_OBJECT(event_view), "row-activated", |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
409 | G_CALLBACK(show_plugin_prefs_cb), event_view); |
|
449845a545ab
[gaim-migrate @ 14463]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12066
diff
changeset
|
410 | |
| 11740 | 411 | rend = gtk_cell_renderer_toggle_new(); |
| 412 | sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (event_view)); | |
| 413 | ||
| 414 | col = gtk_tree_view_column_new_with_attributes (_("Enabled"), | |
| 415 | rend, | |
| 416 | "active", 0, | |
| 417 | NULL); | |
| 418 | gtk_tree_view_append_column (GTK_TREE_VIEW(event_view), col); | |
|
11794
6c39942d27a9
[gaim-migrate @ 14085]
Gary Kramlich <grim@reaperworld.com>
parents:
11783
diff
changeset
|
419 | gtk_tree_view_column_set_sort_column_id(col, 0); |
| 11740 | 420 | g_signal_connect (G_OBJECT(rend), "toggled", |
| 421 | G_CALLBACK(plugin_load), ls); | |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
422 | |
| 11740 | 423 | rendt = gtk_cell_renderer_text_new(); |
| 424 | col = gtk_tree_view_column_new_with_attributes (_("Name"), | |
| 425 | rendt, | |
| 426 | "markup", 1, | |
| 427 | NULL); | |
| 428 | #if GTK_CHECK_VERSION(2,6,0) | |
| 429 | gtk_tree_view_column_set_expand (col, TRUE); | |
| 430 | g_object_set(rendt, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
| 431 | #endif | |
| 432 | gtk_tree_view_append_column (GTK_TREE_VIEW(event_view), col); | |
|
11794
6c39942d27a9
[gaim-migrate @ 14085]
Gary Kramlich <grim@reaperworld.com>
parents:
11783
diff
changeset
|
433 | gtk_tree_view_column_set_sort_column_id(col, 1); |
| 11740 | 434 | g_object_unref(G_OBJECT(ls)); |
| 435 | gtk_container_add(GTK_CONTAINER(sw), event_view); | |
|
12246
7af1ef3b1cc4
[gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents:
12240
diff
changeset
|
436 | |
| 11740 | 437 | expander = gtk_expander_new(_("<b>Plugin Details</b>")); |
| 438 | gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE); | |
| 439 | plugin_details = gtk_label_new(NULL); | |
| 440 | gtk_label_set_line_wrap(GTK_LABEL(plugin_details), TRUE); | |
| 441 | gtk_container_add(GTK_CONTAINER(expander), plugin_details); | |
|
12343
0ede7c5a9465
[gaim-migrate @ 14647]
Mark Doliner <markdoliner@pidgin.im>
parents:
12290
diff
changeset
|
442 | gtk_widget_set_sensitive(expander, FALSE); |
| 11740 | 443 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), expander, FALSE, FALSE, 0); |
| 444 | ||
| 445 | g_signal_connect (G_OBJECT (sel), "changed", G_CALLBACK (prefs_plugin_sel), NULL); | |
| 446 | g_signal_connect(G_OBJECT(plugin_dialog), "response", G_CALLBACK(plugin_dialog_response_cb), sel); | |
| 447 | gtk_window_set_default_size(GTK_WINDOW(plugin_dialog), 430, 430); | |
| 448 | gtk_widget_show_all(plugin_dialog); | |
| 449 | } |