Mercurial > pidgin
annotate src/gtkplugin.c @ 12301:39fca2edf7da
[gaim-migrate @ 14605]
I only caught this as I was committing, and besides I forgot to mention what
sadrul's patch did. It puts the emblem for the active status on the accounts
in the Accounts menu (he put them in the Remove menu as well but that felt
wrong to me.)
committer: Tailor Script <tailor@pidgin.im>
| author | Etan Reisner <pidgin@unreliablesource.net> |
|---|---|
| date | Sat, 03 Dec 2005 06:50:41 +0000 |
| parents | f17958be25ab |
| children | a02f877637a6 |
| 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 | |
| 11740 | 36 static GtkWidget *plugin_dialog = NULL; |
| 37 static GtkWidget *plugin_details = NULL; | |
| 38 static GtkWidget *pref_button = NULL; | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
39 static GHashTable *plugin_pref_dialogs = NULL; |
|
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
40 |
| 5205 | 41 GtkWidget * |
| 42 gaim_gtk_plugin_get_config_frame(GaimPlugin *plugin) | |
| 43 { | |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
44 GtkWidget *config = NULL; |
| 5205 | 45 |
| 46 g_return_val_if_fail(plugin != NULL, NULL); | |
| 47 | |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
48 if (GAIM_IS_GTK_PLUGIN(plugin) && plugin->info->ui_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
49 && GAIM_GTK_PLUGIN_UI_INFO(plugin)->get_config_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
50 { |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
51 GaimGtkPluginUiInfo *ui_info; |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
52 |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
53 ui_info = GAIM_GTK_PLUGIN_UI_INFO(plugin); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
54 |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
55 config = ui_info->get_config_frame(plugin); |
| 5205 | 56 |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
57 if (plugin->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
58 && plugin->info->prefs_info->get_plugin_pref_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
59 { |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
60 gaim_debug_warning("gtkplugin", |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
61 "Plugin %s contains both, ui_info and " |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
62 "prefs_info preferences; prefs_info will be " |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
63 "ignored.", plugin->info->name); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
64 } |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
65 } |
| 5205 | 66 |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
67 if (config == NULL && plugin->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
68 && plugin->info->prefs_info->get_plugin_pref_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
69 { |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
70 GaimPluginPrefFrame *frame; |
| 5205 | 71 |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
72 frame = plugin->info->prefs_info->get_plugin_pref_frame(plugin); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
73 |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
74 config = gaim_gtk_plugin_pref_create_frame(frame); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
75 } |
|
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 return config; |
| 5205 | 78 } |
|
5981
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
79 |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
80 void |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
81 gaim_gtk_plugins_save(void) |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
82 { |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
83 GList *pl; |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
84 GList *files = NULL; |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
85 GaimPlugin *p; |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
86 |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
87 for (pl = gaim_plugins_get_loaded(); pl != NULL; pl = pl->next) { |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
88 p = pl->data; |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
89 |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
90 if (p->info->type != GAIM_PLUGIN_PROTOCOL && |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
91 p->info->type != GAIM_PLUGIN_LOADER) { |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
92 |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
93 files = g_list_append(files, p->path); |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
94 } |
|
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 gaim_prefs_set_string_list("/gaim/gtk/plugins/loaded", files); |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
98 g_list_free(files); |
|
81564bb4db68
[gaim-migrate @ 6429]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
99 } |
| 11740 | 100 |
| 101 static void | |
| 102 update_plugin_list(void *data) | |
| 103 { | |
| 104 GtkListStore *ls = GTK_LIST_STORE(data); | |
| 105 GtkTreeIter iter; | |
| 106 GList *probes; | |
| 107 GaimPlugin *plug; | |
| 108 | |
| 109 gtk_list_store_clear(ls); | |
| 12066 | 110 gaim_plugins_probe(G_MODULE_SUFFIX); |
| 11740 | 111 |
| 112 for (probes = gaim_plugins_get_all(); | |
| 113 probes != NULL; | |
| 114 probes = probes->next) | |
| 115 { | |
| 116 char *desc; | |
| 117 plug = probes->data; | |
| 118 | |
| 119 if (plug->info->type != GAIM_PLUGIN_STANDARD || | |
| 120 (plug->info->flags & GAIM_PLUGIN_FLAG_INVISIBLE)) | |
| 121 { | |
| 122 continue; | |
| 123 } | |
| 124 | |
| 125 gtk_list_store_append (ls, &iter); | |
| 126 desc = g_strdup_printf("<b>%s</b> %s\n%s", plug->info->name ? _(plug->info->name) : g_basename(plug->path), | |
| 127 plug->info->version, | |
| 12240 | 128 _(plug->info->summary)); |
| 11740 | 129 gtk_list_store_set(ls, &iter, |
| 130 0, gaim_plugin_is_loaded(plug), | |
| 131 1, desc, | |
| 132 2, plug, -1); | |
| 133 g_free(desc); | |
| 134 } | |
| 135 } | |
| 136 | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
137 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
|
138 { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
139 switch (response) { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
140 case GTK_RESPONSE_CLOSE: |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
141 case GTK_RESPONSE_DELETE_EVENT: |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
142 g_hash_table_remove(plugin_pref_dialogs, plug); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
143 if (g_hash_table_size(plugin_pref_dialogs) == 0) { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
144 g_hash_table_destroy(plugin_pref_dialogs); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
145 plugin_pref_dialogs = NULL; |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
146 } |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
147 gtk_widget_destroy(d); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
148 break; |
|
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 } |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
151 |
| 11740 | 152 static void plugin_load (GtkCellRendererToggle *cell, gchar *pth, gpointer data) |
| 153 { | |
| 154 GtkTreeModel *model = (GtkTreeModel *)data; | |
| 155 GtkTreeIter iter; | |
| 156 GtkTreePath *path = gtk_tree_path_new_from_string(pth); | |
| 157 GaimPlugin *plug; | |
| 158 gchar buf[1024]; | |
| 159 gchar *name = NULL, *description = NULL; | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
160 GtkWidget *dialog = NULL; |
| 11740 | 161 |
| 162 GdkCursor *wait = gdk_cursor_new (GDK_WATCH); | |
| 11742 | 163 gdk_window_set_cursor(plugin_dialog->window, wait); |
| 11740 | 164 gdk_cursor_unref(wait); |
| 165 | |
| 166 gtk_tree_model_get_iter (model, &iter, path); | |
| 167 gtk_tree_model_get (model, &iter, 2, &plug, -1); | |
| 168 | |
| 169 if (!gaim_plugin_is_loaded(plug)) | |
| 170 gaim_plugin_load(plug); | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
171 else { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
172 if (plugin_pref_dialogs != NULL && |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
173 (dialog = g_hash_table_lookup(plugin_pref_dialogs, plug))) |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
174 pref_dialog_response_cb(dialog, GTK_RESPONSE_DELETE_EVENT, plug); |
| 11740 | 175 gaim_plugin_unload(plug); |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
176 } |
| 11740 | 177 |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
178 gtk_widget_set_sensitive(pref_button, |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
179 gaim_plugin_is_loaded(plug) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
180 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
181 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
182 || (plug->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
183 && plug->info->prefs_info->get_plugin_pref_frame))); |
| 11740 | 184 |
| 11742 | 185 gdk_window_set_cursor(plugin_dialog->window, NULL); |
| 11740 | 186 |
| 187 name = g_markup_escape_text(_(plug->info->name), -1); | |
| 188 description = g_markup_escape_text(_(plug->info->description), -1); | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
189 |
| 11740 | 190 if (plug->error != NULL) { |
| 191 gchar *error = g_markup_escape_text(plug->error, -1); | |
| 192 gchar *desc; | |
| 193 g_snprintf(buf, sizeof(buf), | |
| 194 "<span size=\"larger\">%s %s</span>\n\n" | |
| 195 "<span weight=\"bold\" color=\"red\">%s</span>\n\n" | |
| 196 "%s", | |
| 197 name, plug->info->version, error, description); | |
| 198 desc = g_strdup_printf("<b>%s</b> %s\n<span weight=\"bold\" color=\"red\"%s</span>", | |
| 199 plug->info->name, plug->info->version, error); | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
200 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
| 11740 | 201 1, desc, |
| 202 -1); | |
| 203 g_free(desc); | |
| 204 g_free(error); | |
| 11843 | 205 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11740 | 206 } |
| 207 g_free(name); | |
| 208 g_free(description); | |
| 209 | |
| 210 | |
| 12246 | 211 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
| 212 0, gaim_plugin_is_loaded(plug), | |
| 11740 | 213 -1); |
| 214 | |
| 215 gtk_tree_path_free(path); | |
| 216 gaim_gtk_plugins_save(); | |
| 217 } | |
| 218 | |
| 11877 | 219 static gboolean ensure_plugin_visible(void *data) |
| 220 { | |
| 221 GtkTreeSelection *sel = GTK_TREE_SELECTION(data); | |
| 12246 | 222 GtkTreeView *tv = gtk_tree_selection_get_tree_view(sel); |
| 11877 | 223 GtkTreeModel *model = gtk_tree_view_get_model(tv); |
| 224 GtkTreePath *path; | |
| 225 GtkTreeIter iter; | |
| 226 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) | |
| 227 return FALSE; | |
| 228 path = gtk_tree_model_get_path(model, &iter); | |
| 229 gtk_tree_view_scroll_to_cell(gtk_tree_selection_get_tree_view(sel), path, NULL, FALSE, 0, 0); | |
| 230 gtk_tree_path_free(path); | |
| 231 return FALSE; | |
| 232 } | |
| 233 | |
| 11740 | 234 static void prefs_plugin_sel (GtkTreeSelection *sel, GtkTreeModel *model) |
| 235 { | |
| 11741 | 236 gchar *buf, *pname, *pdesc, *pauth, *pweb; |
| 11740 | 237 GtkTreeIter iter; |
| 238 GValue val = { 0, }; | |
| 239 GaimPlugin *plug; | |
| 240 | |
| 11833 | 241 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) |
| 242 { | |
| 243 /* Clear the old plugin details */ | |
| 244 gtk_label_set_markup(GTK_LABEL(plugin_details), ""); | |
| 245 gtk_widget_set_sensitive(pref_button, FALSE); | |
| 11740 | 246 return; |
| 11833 | 247 } |
| 248 | |
| 11740 | 249 gtk_tree_model_get_value (model, &iter, 2, &val); |
| 250 plug = g_value_get_pointer(&val); | |
| 251 | |
| 252 pname = g_markup_escape_text(_(plug->info->name), -1); | |
| 253 pdesc = (plug->info->description) ? | |
| 254 g_markup_escape_text(_(plug->info->description), -1) : NULL; | |
| 255 pauth = (plug->info->author) ? | |
| 256 g_markup_escape_text(_(plug->info->author), -1) : NULL; | |
| 257 pweb = (plug->info->homepage) ? | |
| 258 g_markup_escape_text(_(plug->info->homepage), -1) : NULL; | |
| 259 buf = g_strdup_printf( | |
|
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
260 _("%s%s" |
| 11740 | 261 "<span weight=\"bold\">Written by:</span>\t%s\n" |
|
11777
1253620ea5f2
[gaim-migrate @ 14068]
Richard Laager <rlaager@wiktel.com>
parents:
11775
diff
changeset
|
262 "<span weight=\"bold\">Web site:</span>\t\t%s\n" |
| 11740 | 263 "<span weight=\"bold\">File name:</span>\t%s"), |
|
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
264 pdesc ? pdesc : "", pdesc ? "\n\n" : "", |
| 11740 | 265 pauth ? pauth : "", pweb ? pweb : "", plug->path); |
| 266 | |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
267 gtk_widget_set_sensitive(pref_button, |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
268 gaim_plugin_is_loaded(plug) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
269 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
270 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
271 || (plug->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
272 && plug->info->prefs_info->get_plugin_pref_frame))); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
273 |
| 11740 | 274 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11877 | 275 |
| 276 /* Make sure the selected plugin is still visible */ | |
| 277 g_idle_add(ensure_plugin_visible, sel); | |
| 278 | |
| 279 | |
| 11740 | 280 g_value_unset(&val); |
| 281 g_free(buf); | |
| 282 g_free(pname); | |
| 283 g_free(pdesc); | |
| 284 g_free(pauth); | |
| 285 g_free(pweb); | |
| 286 } | |
| 287 | |
| 11741 | 288 static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) |
| 11740 | 289 { |
| 290 GaimPlugin *plug; | |
| 291 GtkWidget *dialog, *box; | |
| 292 GtkTreeModel *model; | |
| 11743 | 293 GValue val = { 0, }; |
| 11740 | 294 GtkTreeIter iter; |
| 295 | |
| 296 switch (response) { | |
| 297 case GTK_RESPONSE_CLOSE: | |
| 298 case GTK_RESPONSE_DELETE_EVENT: | |
| 299 gtk_widget_destroy(d); | |
| 11888 | 300 if (plugin_pref_dialogs != NULL) { |
| 301 g_hash_table_destroy(plugin_pref_dialogs); | |
| 302 plugin_pref_dialogs = NULL; | |
| 303 } | |
| 11740 | 304 plugin_dialog = NULL; |
| 305 break; | |
| 12246 | 306 case GAIM_RESPONSE_CONFIGURE: |
| 11740 | 307 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) |
| 308 return; | |
| 309 gtk_tree_model_get_value (model, &iter, 2, &val); | |
| 310 plug = g_value_get_pointer(&val); | |
| 311 if (plug == NULL) | |
| 312 break; | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
313 if (plugin_pref_dialogs != NULL && |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
314 g_hash_table_lookup(plugin_pref_dialogs, plug)) |
| 11770 | 315 break; |
| 11740 | 316 box = gaim_gtk_plugin_get_config_frame(plug); |
| 317 if (box == NULL) | |
| 318 break; | |
| 319 | |
| 11741 | 320 dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), |
| 11744 | 321 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, |
| 11740 | 322 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
| 323 NULL); | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
324 if (plugin_pref_dialogs == NULL) |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
325 plugin_pref_dialogs = g_hash_table_new(NULL, NULL); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
326 |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
327 g_hash_table_insert(plugin_pref_dialogs, plug, dialog); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
328 |
| 11770 | 329 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); |
| 11740 | 330 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); |
|
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
331 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); |
| 12290 | 332 gtk_window_set_title(GTK_WINDOW(dialog), _(gaim_plugin_get_name(plug))); |
| 11740 | 333 gtk_widget_show_all(dialog); |
| 11770 | 334 g_value_unset(&val); |
| 11740 | 335 break; |
| 336 } | |
| 337 } | |
| 338 | |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
339 static void |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
340 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
|
341 { |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
342 GtkTreeSelection *sel; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
343 GtkTreeIter iter; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
344 GaimPlugin *plugin; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
345 GtkTreeModel *model; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
346 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
347 sel = gtk_tree_view_get_selection(view); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
348 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
349 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
350 return; |
| 12246 | 351 |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
352 gtk_tree_model_get(model, &iter, 2, &plugin, -1); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
353 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
354 if (!gaim_plugin_is_loaded(plugin)) |
|
12174
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
355 return; |
|
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
356 |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
357 /* Now show the pref-dialog for the plugin */ |
| 12246 | 358 plugin_dialog_response_cb(NULL, GAIM_RESPONSE_CONFIGURE, sel); |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
359 } |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
360 |
| 11740 | 361 void gaim_gtk_plugin_dialog_show() |
| 362 { | |
| 11741 | 363 GtkWidget *sw; |
| 11740 | 364 GtkWidget *event_view; |
| 365 GtkListStore *ls; | |
| 366 GtkCellRenderer *rend, *rendt; | |
| 367 GtkTreeViewColumn *col; | |
| 368 GtkTreeSelection *sel; | |
| 369 GtkWidget *expander; | |
| 370 | |
| 371 if (plugin_dialog != NULL) { | |
| 372 gtk_window_present(GTK_WINDOW(plugin_dialog)); | |
| 373 return; | |
| 374 } | |
| 375 | |
| 376 plugin_dialog = gtk_dialog_new_with_buttons(_("Plugins"), | |
| 377 NULL, | |
| 378 GTK_DIALOG_NO_SEPARATOR, | |
| 379 NULL); | |
| 12246 | 380 pref_button = gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
|
12276
b3652193d359
[gaim-migrate @ 14580]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12246
diff
changeset
|
381 _("Configure Pl_ugin"), GAIM_RESPONSE_CONFIGURE); |
| 12246 | 382 gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
| 383 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); | |
|
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
384 gtk_widget_set_sensitive(pref_button, FALSE); |
|
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
385 gtk_window_set_role(GTK_WINDOW(plugin_dialog), "plugins"); |
| 11740 | 386 |
| 387 sw = gtk_scrolled_window_new(NULL,NULL); | |
| 388 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
| 389 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 390 | |
| 391 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), sw, TRUE, TRUE, 0); | |
| 392 | |
| 393 ls = gtk_list_store_new (3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER); | |
| 394 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), | |
| 395 1, GTK_SORT_ASCENDING); | |
| 396 | |
| 397 update_plugin_list(ls); | |
|
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
398 |
| 11740 | 399 event_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(ls)); |
| 400 | |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
401 g_signal_connect(G_OBJECT(event_view), "row-activated", |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
402 G_CALLBACK(show_plugin_prefs_cb), event_view); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
403 |
| 11740 | 404 rend = gtk_cell_renderer_toggle_new(); |
| 405 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (event_view)); | |
| 406 | |
| 407 col = gtk_tree_view_column_new_with_attributes (_("Enabled"), | |
| 408 rend, | |
| 409 "active", 0, | |
| 410 NULL); | |
| 411 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
|
412 gtk_tree_view_column_set_sort_column_id(col, 0); |
| 11740 | 413 g_signal_connect (G_OBJECT(rend), "toggled", |
| 414 G_CALLBACK(plugin_load), ls); | |
| 12246 | 415 |
| 11740 | 416 rendt = gtk_cell_renderer_text_new(); |
| 417 col = gtk_tree_view_column_new_with_attributes (_("Name"), | |
| 418 rendt, | |
| 419 "markup", 1, | |
| 420 NULL); | |
| 421 #if GTK_CHECK_VERSION(2,6,0) | |
| 422 gtk_tree_view_column_set_expand (col, TRUE); | |
| 423 g_object_set(rendt, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
| 424 #endif | |
| 425 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
|
426 gtk_tree_view_column_set_sort_column_id(col, 1); |
| 11740 | 427 g_object_unref(G_OBJECT(ls)); |
| 428 gtk_container_add(GTK_CONTAINER(sw), event_view); | |
| 12246 | 429 |
| 11740 | 430 expander = gtk_expander_new(_("<b>Plugin Details</b>")); |
| 431 gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE); | |
| 432 plugin_details = gtk_label_new(NULL); | |
| 433 gtk_label_set_line_wrap(GTK_LABEL(plugin_details), TRUE); | |
| 434 gtk_container_add(GTK_CONTAINER(expander), plugin_details); | |
| 435 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), expander, FALSE, FALSE, 0); | |
| 436 | |
| 437 g_signal_connect (G_OBJECT (sel), "changed", G_CALLBACK (prefs_plugin_sel), NULL); | |
| 438 g_signal_connect(G_OBJECT(plugin_dialog), "response", G_CALLBACK(plugin_dialog_response_cb), sel); | |
| 439 gtk_window_set_default_size(GTK_WINDOW(plugin_dialog), 430, 430); | |
| 440 gtk_widget_show_all(plugin_dialog); | |
| 441 } |
