Mercurial > pidgin
annotate src/gtkplugin.c @ 12695:0bc110c7ab91
[gaim-migrate @ 15038]
Let's display outdated plugins in the plugins dialog, but grey them out. This way, the user can find out which plugins need to be updated. They will also be able to view the website address so they know where to get a new version.
Inspired by SF Feature Request #1395058 from Daniel Beardsmore (uilleann).
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 03 Jan 2006 12:03:02 +0000 |
parents | e856f985a0b9 |
children | ba7834d6e2c9 |
rev | line source |
---|---|
5205 | 1 /** |
6927
ee51189dfe76
[gaim-migrate @ 7474]
Christian Hammond <chipx86@chipx86.com>
parents:
5982
diff
changeset
|
2 * @file gtkplugin.c GTK+ Plugins support |
ee51189dfe76
[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
ee51189dfe76
[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
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
28 #include "gtkpluginpref.h" |
5981
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
29 #include "debug.h" |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
30 #include "prefs.h" |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
31 |
5205 | 32 #include <string.h> |
33 | |
12246 | 34 #define GAIM_RESPONSE_CONFIGURE 98121 |
35 | |
12343 | 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
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
40 static GHashTable *plugin_pref_dialogs = NULL; |
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
41 |
5205 | 42 GtkWidget * |
43 gaim_gtk_plugin_get_config_frame(GaimPlugin *plugin) | |
44 { | |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
45 GtkWidget *config = NULL; |
5205 | 46 |
47 g_return_val_if_fail(plugin != NULL, NULL); | |
48 | |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
49 if (GAIM_IS_GTK_PLUGIN(plugin) && plugin->info->ui_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
50 && GAIM_GTK_PLUGIN_UI_INFO(plugin)->get_config_frame) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
51 { |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
52 GaimGtkPluginUiInfo *ui_info; |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
53 |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
54 ui_info = GAIM_GTK_PLUGIN_UI_INFO(plugin); |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
55 |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
56 config = ui_info->get_config_frame(plugin); |
5205 | 57 |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
58 if (plugin->info->prefs_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
59 && plugin->info->prefs_info->get_plugin_pref_frame) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
60 { |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
61 gaim_debug_warning("gtkplugin", |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
62 "Plugin %s contains both, ui_info and " |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
63 "prefs_info preferences; prefs_info will be " |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
64 "ignored.", plugin->info->name); |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
65 } |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
66 } |
5205 | 67 |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
68 if (config == NULL && plugin->info->prefs_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
69 && plugin->info->prefs_info->get_plugin_pref_frame) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
70 { |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
71 GaimPluginPrefFrame *frame; |
5205 | 72 |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
73 frame = plugin->info->prefs_info->get_plugin_pref_frame(plugin); |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
74 |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
75 config = gaim_gtk_plugin_pref_create_frame(frame); |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
76 } |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
77 |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
78 return config; |
5205 | 79 } |
5981
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
80 |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
81 void |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
82 gaim_gtk_plugins_save(void) |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
83 { |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
84 GList *pl; |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
85 GList *files = NULL; |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
86 GaimPlugin *p; |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
87 |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
88 for (pl = gaim_plugins_get_loaded(); pl != NULL; pl = pl->next) { |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
89 p = pl->data; |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
90 |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
91 if (p->info->type != GAIM_PLUGIN_PROTOCOL && |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
92 p->info->type != GAIM_PLUGIN_LOADER) { |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
93 |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
94 files = g_list_append(files, p->path); |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
95 } |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
96 } |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
97 |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
98 gaim_prefs_set_string_list("/gaim/gtk/plugins/loaded", files); |
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
99 g_list_free(files); |
81564bb4db68
[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 | 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 | 129 _(plug->info->summary)); |
11740 | 130 gtk_list_store_set(ls, &iter, |
131 0, gaim_plugin_is_loaded(plug), | |
132 1, desc, | |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
133 2, plug, |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
134 3, gaim_plugin_is_unloadable(plug), |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
135 -1); |
11740 | 136 g_free(desc); |
137 } | |
138 } | |
139 | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
140 static void pref_dialog_response_cb(GtkWidget *d, int response, GaimPlugin *plug) |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
141 { |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
142 switch (response) { |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
143 case GTK_RESPONSE_CLOSE: |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
144 case GTK_RESPONSE_DELETE_EVENT: |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
145 g_hash_table_remove(plugin_pref_dialogs, plug); |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
146 if (g_hash_table_size(plugin_pref_dialogs) == 0) { |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
147 g_hash_table_destroy(plugin_pref_dialogs); |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
148 plugin_pref_dialogs = NULL; |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
149 } |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
150 gtk_widget_destroy(d); |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
151 break; |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
152 } |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
153 } |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
154 |
11740 | 155 static void plugin_load (GtkCellRendererToggle *cell, gchar *pth, gpointer data) |
156 { | |
157 GtkTreeModel *model = (GtkTreeModel *)data; | |
158 GtkTreeIter iter; | |
159 GtkTreePath *path = gtk_tree_path_new_from_string(pth); | |
160 GaimPlugin *plug; | |
161 gchar buf[1024]; | |
162 gchar *name = NULL, *description = NULL; | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
163 GtkWidget *dialog = NULL; |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
164 GdkCursor *wait; |
11740 | 165 |
166 gtk_tree_model_get_iter (model, &iter, path); | |
167 gtk_tree_model_get (model, &iter, 2, &plug, -1); | |
168 | |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
169 /* Apparently, GTK+ won't honor the sensitive flag on cell renderers for booleans. */ |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
170 if (gaim_plugin_is_unloadable(plug)) |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
171 return; |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
172 |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
173 wait = gdk_cursor_new (GDK_WATCH); |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
174 gdk_window_set_cursor(plugin_dialog->window, wait); |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
175 gdk_cursor_unref(wait); |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
176 |
11740 | 177 if (!gaim_plugin_is_loaded(plug)) |
178 gaim_plugin_load(plug); | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
179 else { |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
180 if (plugin_pref_dialogs != NULL && |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
181 (dialog = g_hash_table_lookup(plugin_pref_dialogs, plug))) |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
182 pref_dialog_response_cb(dialog, GTK_RESPONSE_DELETE_EVENT, plug); |
11740 | 183 gaim_plugin_unload(plug); |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
184 } |
11740 | 185 |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
186 gtk_widget_set_sensitive(pref_button, |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
187 gaim_plugin_is_loaded(plug) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
188 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
189 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
190 || (plug->info->prefs_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
191 && plug->info->prefs_info->get_plugin_pref_frame))); |
11740 | 192 |
11742 | 193 gdk_window_set_cursor(plugin_dialog->window, NULL); |
11740 | 194 |
195 name = g_markup_escape_text(_(plug->info->name), -1); | |
196 description = g_markup_escape_text(_(plug->info->description), -1); | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
197 |
11740 | 198 if (plug->error != NULL) { |
199 gchar *error = g_markup_escape_text(plug->error, -1); | |
200 gchar *desc; | |
201 g_snprintf(buf, sizeof(buf), | |
202 "<span size=\"larger\">%s %s</span>\n\n" | |
203 "<span weight=\"bold\" color=\"red\">%s</span>\n\n" | |
204 "%s", | |
205 name, plug->info->version, error, description); | |
206 desc = g_strdup_printf("<b>%s</b> %s\n<span weight=\"bold\" color=\"red\"%s</span>", | |
207 plug->info->name, plug->info->version, error); | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
208 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
11740 | 209 1, desc, |
210 -1); | |
211 g_free(desc); | |
212 g_free(error); | |
11843 | 213 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
11740 | 214 } |
215 g_free(name); | |
216 g_free(description); | |
217 | |
218 | |
12246 | 219 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
220 0, gaim_plugin_is_loaded(plug), | |
11740 | 221 -1); |
222 | |
223 gtk_tree_path_free(path); | |
224 gaim_gtk_plugins_save(); | |
225 } | |
226 | |
11877 | 227 static gboolean ensure_plugin_visible(void *data) |
228 { | |
229 GtkTreeSelection *sel = GTK_TREE_SELECTION(data); | |
12246 | 230 GtkTreeView *tv = gtk_tree_selection_get_tree_view(sel); |
11877 | 231 GtkTreeModel *model = gtk_tree_view_get_model(tv); |
232 GtkTreePath *path; | |
233 GtkTreeIter iter; | |
234 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) | |
235 return FALSE; | |
236 path = gtk_tree_model_get_path(model, &iter); | |
237 gtk_tree_view_scroll_to_cell(gtk_tree_selection_get_tree_view(sel), path, NULL, FALSE, 0, 0); | |
238 gtk_tree_path_free(path); | |
239 return FALSE; | |
240 } | |
241 | |
11740 | 242 static void prefs_plugin_sel (GtkTreeSelection *sel, GtkTreeModel *model) |
243 { | |
11741 | 244 gchar *buf, *pname, *pdesc, *pauth, *pweb; |
11740 | 245 GtkTreeIter iter; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
246 GValue val; |
11740 | 247 GaimPlugin *plug; |
248 | |
11833 | 249 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) |
250 { | |
251 /* Clear the old plugin details */ | |
252 gtk_label_set_markup(GTK_LABEL(plugin_details), ""); | |
253 gtk_widget_set_sensitive(pref_button, FALSE); | |
12343 | 254 |
255 /* Collapse and disable the expander widget */ | |
256 gtk_expander_set_expanded(GTK_EXPANDER(expander), FALSE); | |
257 gtk_widget_set_sensitive(expander, FALSE); | |
258 | |
11740 | 259 return; |
11833 | 260 } |
261 | |
12343 | 262 gtk_widget_set_sensitive(expander, TRUE); |
263 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
264 val.g_type = 0; |
11740 | 265 gtk_tree_model_get_value (model, &iter, 2, &val); |
266 plug = g_value_get_pointer(&val); | |
267 | |
268 pname = g_markup_escape_text(_(plug->info->name), -1); | |
269 pdesc = (plug->info->description) ? | |
270 g_markup_escape_text(_(plug->info->description), -1) : NULL; | |
271 pauth = (plug->info->author) ? | |
272 g_markup_escape_text(_(plug->info->author), -1) : NULL; | |
273 pweb = (plug->info->homepage) ? | |
274 g_markup_escape_text(_(plug->info->homepage), -1) : NULL; | |
275 buf = g_strdup_printf( | |
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
276 _("%s%s" |
11740 | 277 "<span weight=\"bold\">Written by:</span>\t%s\n" |
11777
1253620ea5f2
[gaim-migrate @ 14068]
Richard Laager <rlaager@wiktel.com>
parents:
11775
diff
changeset
|
278 "<span weight=\"bold\">Web site:</span>\t\t%s\n" |
11740 | 279 "<span weight=\"bold\">File name:</span>\t%s"), |
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
280 pdesc ? pdesc : "", pdesc ? "\n\n" : "", |
11740 | 281 pauth ? pauth : "", pweb ? pweb : "", plug->path); |
282 | |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
283 if (plug->error != NULL) |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
284 { |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
285 char *tmp = g_strdup_printf( |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
286 _("%s\n" |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
287 "<span foreground=\"#ff0000\" weight=\"bold\">Error: %s</span>"), |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
288 buf, plug->error); |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
289 g_free(buf); |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
290 buf = tmp; |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
291 } |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
292 |
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
293 gtk_widget_set_sensitive(pref_button, |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
294 gaim_plugin_is_loaded(plug) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
295 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
296 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
297 || (plug->info->prefs_info |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
298 && plug->info->prefs_info->get_plugin_pref_frame))); |
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
299 |
11740 | 300 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
11877 | 301 |
302 /* Make sure the selected plugin is still visible */ | |
303 g_idle_add(ensure_plugin_visible, sel); | |
304 | |
305 | |
11740 | 306 g_value_unset(&val); |
307 g_free(buf); | |
308 g_free(pname); | |
309 g_free(pdesc); | |
310 g_free(pauth); | |
311 g_free(pweb); | |
312 } | |
313 | |
11741 | 314 static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) |
11740 | 315 { |
316 GaimPlugin *plug; | |
317 GtkWidget *dialog, *box; | |
318 GtkTreeModel *model; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
319 GValue val; |
11740 | 320 GtkTreeIter iter; |
321 | |
322 switch (response) { | |
323 case GTK_RESPONSE_CLOSE: | |
324 case GTK_RESPONSE_DELETE_EVENT: | |
325 gtk_widget_destroy(d); | |
11888 | 326 if (plugin_pref_dialogs != NULL) { |
327 g_hash_table_destroy(plugin_pref_dialogs); | |
328 plugin_pref_dialogs = NULL; | |
329 } | |
11740 | 330 plugin_dialog = NULL; |
331 break; | |
12246 | 332 case GAIM_RESPONSE_CONFIGURE: |
11740 | 333 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) |
334 return; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
335 val.g_type = 0; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
336 gtk_tree_model_get_value(model, &iter, 2, &val); |
11740 | 337 plug = g_value_get_pointer(&val); |
338 if (plug == NULL) | |
339 break; | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
340 if (plugin_pref_dialogs != NULL && |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
341 g_hash_table_lookup(plugin_pref_dialogs, plug)) |
11770 | 342 break; |
11740 | 343 box = gaim_gtk_plugin_get_config_frame(plug); |
344 if (box == NULL) | |
345 break; | |
346 | |
11741 | 347 dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), |
11744 | 348 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, |
11740 | 349 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
350 NULL); | |
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
351 if (plugin_pref_dialogs == NULL) |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
352 plugin_pref_dialogs = g_hash_table_new(NULL, NULL); |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
353 |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
354 g_hash_table_insert(plugin_pref_dialogs, plug, dialog); |
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
355 |
11770 | 356 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); |
11740 | 357 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); |
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
358 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); |
12290 | 359 gtk_window_set_title(GTK_WINDOW(dialog), _(gaim_plugin_get_name(plug))); |
11740 | 360 gtk_widget_show_all(dialog); |
11770 | 361 g_value_unset(&val); |
11740 | 362 break; |
363 } | |
364 } | |
365 | |
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
366 static void |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
367 show_plugin_prefs_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer null) |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
368 { |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
369 GtkTreeSelection *sel; |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
370 GtkTreeIter iter; |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
371 GaimPlugin *plugin; |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
372 GtkTreeModel *model; |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
373 |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
374 sel = gtk_tree_view_get_selection(view); |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
375 |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
376 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
377 return; |
12246 | 378 |
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
379 gtk_tree_model_get(model, &iter, 2, &plugin, -1); |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
380 |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
381 if (!gaim_plugin_is_loaded(plugin)) |
12174
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
382 return; |
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
383 |
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
384 /* Now show the pref-dialog for the plugin */ |
12246 | 385 plugin_dialog_response_cb(NULL, GAIM_RESPONSE_CONFIGURE, sel); |
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
386 } |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
387 |
11740 | 388 void gaim_gtk_plugin_dialog_show() |
389 { | |
11741 | 390 GtkWidget *sw; |
11740 | 391 GtkWidget *event_view; |
392 GtkListStore *ls; | |
393 GtkCellRenderer *rend, *rendt; | |
394 GtkTreeViewColumn *col; | |
395 GtkTreeSelection *sel; | |
396 | |
397 if (plugin_dialog != NULL) { | |
398 gtk_window_present(GTK_WINDOW(plugin_dialog)); | |
399 return; | |
400 } | |
401 | |
402 plugin_dialog = gtk_dialog_new_with_buttons(_("Plugins"), | |
403 NULL, | |
404 GTK_DIALOG_NO_SEPARATOR, | |
405 NULL); | |
12246 | 406 pref_button = gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
12276
b3652193d359
[gaim-migrate @ 14580]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12246
diff
changeset
|
407 _("Configure Pl_ugin"), GAIM_RESPONSE_CONFIGURE); |
12246 | 408 gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
409 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); | |
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
410 gtk_widget_set_sensitive(pref_button, FALSE); |
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
411 gtk_window_set_role(GTK_WINDOW(plugin_dialog), "plugins"); |
11740 | 412 |
413 sw = gtk_scrolled_window_new(NULL,NULL); | |
414 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
415 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
416 | |
417 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), sw, TRUE, TRUE, 0); | |
418 | |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
419 ls = gtk_list_store_new (4, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); |
11740 | 420 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), |
421 1, GTK_SORT_ASCENDING); | |
422 | |
423 update_plugin_list(ls); | |
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
424 |
11740 | 425 event_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(ls)); |
426 | |
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
427 g_signal_connect(G_OBJECT(event_view), "row-activated", |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
428 G_CALLBACK(show_plugin_prefs_cb), event_view); |
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
429 |
11740 | 430 rend = gtk_cell_renderer_toggle_new(); |
431 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (event_view)); | |
432 | |
433 col = gtk_tree_view_column_new_with_attributes (_("Enabled"), | |
434 rend, | |
435 "active", 0, | |
436 NULL); | |
437 gtk_tree_view_append_column (GTK_TREE_VIEW(event_view), col); | |
11794
f5105a2b8bf6
[gaim-migrate @ 14085]
Gary Kramlich <grim@reaperworld.com>
parents:
11783
diff
changeset
|
438 gtk_tree_view_column_set_sort_column_id(col, 0); |
11740 | 439 g_signal_connect (G_OBJECT(rend), "toggled", |
440 G_CALLBACK(plugin_load), ls); | |
12246 | 441 |
11740 | 442 rendt = gtk_cell_renderer_text_new(); |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
443 g_object_set(rendt, |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
444 "foreground", "#c0c0c0", |
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
445 NULL); |
11740 | 446 col = gtk_tree_view_column_new_with_attributes (_("Name"), |
447 rendt, | |
448 "markup", 1, | |
12695
0bc110c7ab91
[gaim-migrate @ 15038]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
449 "foreground-set", 3, |
11740 | 450 NULL); |
451 #if GTK_CHECK_VERSION(2,6,0) | |
452 gtk_tree_view_column_set_expand (col, TRUE); | |
453 g_object_set(rendt, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
454 #endif | |
455 gtk_tree_view_append_column (GTK_TREE_VIEW(event_view), col); | |
11794
f5105a2b8bf6
[gaim-migrate @ 14085]
Gary Kramlich <grim@reaperworld.com>
parents:
11783
diff
changeset
|
456 gtk_tree_view_column_set_sort_column_id(col, 1); |
11740 | 457 g_object_unref(G_OBJECT(ls)); |
458 gtk_container_add(GTK_CONTAINER(sw), event_view); | |
12246 | 459 |
11740 | 460 expander = gtk_expander_new(_("<b>Plugin Details</b>")); |
461 gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE); | |
462 plugin_details = gtk_label_new(NULL); | |
463 gtk_label_set_line_wrap(GTK_LABEL(plugin_details), TRUE); | |
464 gtk_container_add(GTK_CONTAINER(expander), plugin_details); | |
12343 | 465 gtk_widget_set_sensitive(expander, FALSE); |
11740 | 466 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), expander, FALSE, FALSE, 0); |
467 | |
468 g_signal_connect (G_OBJECT (sel), "changed", G_CALLBACK (prefs_plugin_sel), NULL); | |
469 g_signal_connect(G_OBJECT(plugin_dialog), "response", G_CALLBACK(plugin_dialog_response_cb), sel); | |
470 gtk_window_set_default_size(GTK_WINDOW(plugin_dialog), 430, 430); | |
471 gtk_widget_show_all(plugin_dialog); | |
472 } |