Mercurial > pidgin
annotate src/gtkplugin.c @ 12640:de306144dc8a
[gaim-migrate @ 14976]
Yahoo profiles use links of this form:
<a href="http://gaim.sf.net">gaim.sf.net</a>
The Yahoo prpl strips HTML, manipulates the text, then passes it to the core, which passes to the UI, which calls another UI function which calls ...linkify. This leads to these URLs looking quite odd.
The fix is to have the HTML stripping function deal properly with URLs of the above format. With HTTP being the most common type of URL these days, that's probably a good plan anyway.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Fri, 23 Dec 2005 06:48:27 +0000 |
| parents | e856f985a0b9 |
| children | 0bc110c7ab91 |
| 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, | |
| 133 2, plug, -1); | |
| 134 g_free(desc); | |
| 135 } | |
| 136 } | |
| 137 | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
138 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
|
139 { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
140 switch (response) { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
141 case GTK_RESPONSE_CLOSE: |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
142 case GTK_RESPONSE_DELETE_EVENT: |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
143 g_hash_table_remove(plugin_pref_dialogs, plug); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
144 if (g_hash_table_size(plugin_pref_dialogs) == 0) { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
145 g_hash_table_destroy(plugin_pref_dialogs); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
146 plugin_pref_dialogs = NULL; |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
147 } |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
148 gtk_widget_destroy(d); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
149 break; |
|
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 } |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
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
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
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
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
172 else { |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
173 if (plugin_pref_dialogs != NULL && |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
174 (dialog = g_hash_table_lookup(plugin_pref_dialogs, plug))) |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
175 pref_dialog_response_cb(dialog, GTK_RESPONSE_DELETE_EVENT, plug); |
| 11740 | 176 gaim_plugin_unload(plug); |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
177 } |
| 11740 | 178 |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
179 gtk_widget_set_sensitive(pref_button, |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
180 gaim_plugin_is_loaded(plug) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
181 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
182 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
183 || (plug->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
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
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
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
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
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 | 206 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11740 | 207 } |
| 208 g_free(name); | |
| 209 g_free(description); | |
| 210 | |
| 211 | |
| 12246 | 212 gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
| 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 | 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; |
|
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
239 GValue val; |
| 11740 | 240 GaimPlugin *plug; |
| 241 | |
| 11833 | 242 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) |
| 243 { | |
| 244 /* Clear the old plugin details */ | |
| 245 gtk_label_set_markup(GTK_LABEL(plugin_details), ""); | |
| 246 gtk_widget_set_sensitive(pref_button, FALSE); | |
| 12343 | 247 |
| 248 /* Collapse and disable the expander widget */ | |
| 249 gtk_expander_set_expanded(GTK_EXPANDER(expander), FALSE); | |
| 250 gtk_widget_set_sensitive(expander, FALSE); | |
| 251 | |
| 11740 | 252 return; |
| 11833 | 253 } |
| 254 | |
| 12343 | 255 gtk_widget_set_sensitive(expander, TRUE); |
| 256 | |
|
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
257 val.g_type = 0; |
| 11740 | 258 gtk_tree_model_get_value (model, &iter, 2, &val); |
| 259 plug = g_value_get_pointer(&val); | |
| 260 | |
| 261 pname = g_markup_escape_text(_(plug->info->name), -1); | |
| 262 pdesc = (plug->info->description) ? | |
| 263 g_markup_escape_text(_(plug->info->description), -1) : NULL; | |
| 264 pauth = (plug->info->author) ? | |
| 265 g_markup_escape_text(_(plug->info->author), -1) : NULL; | |
| 266 pweb = (plug->info->homepage) ? | |
| 267 g_markup_escape_text(_(plug->info->homepage), -1) : NULL; | |
| 268 buf = g_strdup_printf( | |
|
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
269 _("%s%s" |
| 11740 | 270 "<span weight=\"bold\">Written by:</span>\t%s\n" |
|
11777
1253620ea5f2
[gaim-migrate @ 14068]
Richard Laager <rlaager@wiktel.com>
parents:
11775
diff
changeset
|
271 "<span weight=\"bold\">Web site:</span>\t\t%s\n" |
| 11740 | 272 "<span weight=\"bold\">File name:</span>\t%s"), |
|
11771
08b1dd8aa11c
[gaim-migrate @ 14062]
Richard Laager <rlaager@wiktel.com>
parents:
11770
diff
changeset
|
273 pdesc ? pdesc : "", pdesc ? "\n\n" : "", |
| 11740 | 274 pauth ? pauth : "", pweb ? pweb : "", plug->path); |
| 275 | |
|
11817
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
276 gtk_widget_set_sensitive(pref_button, |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
277 gaim_plugin_is_loaded(plug) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
278 && ((GAIM_IS_GTK_PLUGIN(plug) && plug->info->ui_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
279 && GAIM_GTK_PLUGIN_UI_INFO(plug)->get_config_frame) |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
280 || (plug->info->prefs_info |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
281 && plug->info->prefs_info->get_plugin_pref_frame))); |
|
1bb0efbd4394
[gaim-migrate @ 14108]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11813
diff
changeset
|
282 |
| 11740 | 283 gtk_label_set_markup(GTK_LABEL(plugin_details), buf); |
| 11877 | 284 |
| 285 /* Make sure the selected plugin is still visible */ | |
| 286 g_idle_add(ensure_plugin_visible, sel); | |
| 287 | |
| 288 | |
| 11740 | 289 g_value_unset(&val); |
| 290 g_free(buf); | |
| 291 g_free(pname); | |
| 292 g_free(pdesc); | |
| 293 g_free(pauth); | |
| 294 g_free(pweb); | |
| 295 } | |
| 296 | |
| 11741 | 297 static void plugin_dialog_response_cb(GtkWidget *d, int response, GtkTreeSelection *sel) |
| 11740 | 298 { |
| 299 GaimPlugin *plug; | |
| 300 GtkWidget *dialog, *box; | |
| 301 GtkTreeModel *model; | |
|
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
302 GValue val; |
| 11740 | 303 GtkTreeIter iter; |
| 304 | |
| 305 switch (response) { | |
| 306 case GTK_RESPONSE_CLOSE: | |
| 307 case GTK_RESPONSE_DELETE_EVENT: | |
| 308 gtk_widget_destroy(d); | |
| 11888 | 309 if (plugin_pref_dialogs != NULL) { |
| 310 g_hash_table_destroy(plugin_pref_dialogs); | |
| 311 plugin_pref_dialogs = NULL; | |
| 312 } | |
| 11740 | 313 plugin_dialog = NULL; |
| 314 break; | |
| 12246 | 315 case GAIM_RESPONSE_CONFIGURE: |
| 11740 | 316 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) |
| 317 return; | |
|
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
318 val.g_type = 0; |
|
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12343
diff
changeset
|
319 gtk_tree_model_get_value(model, &iter, 2, &val); |
| 11740 | 320 plug = g_value_get_pointer(&val); |
| 321 if (plug == NULL) | |
| 322 break; | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
323 if (plugin_pref_dialogs != NULL && |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
324 g_hash_table_lookup(plugin_pref_dialogs, plug)) |
| 11770 | 325 break; |
| 11740 | 326 box = gaim_gtk_plugin_get_config_frame(plug); |
| 327 if (box == NULL) | |
| 328 break; | |
| 329 | |
| 11741 | 330 dialog = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, GTK_WINDOW(d), |
| 11744 | 331 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, |
| 11740 | 332 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
| 333 NULL); | |
|
11781
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
334 if (plugin_pref_dialogs == NULL) |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
335 plugin_pref_dialogs = g_hash_table_new(NULL, NULL); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
336 |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
337 g_hash_table_insert(plugin_pref_dialogs, plug, dialog); |
|
10317f1a2de2
[gaim-migrate @ 14072]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11777
diff
changeset
|
338 |
| 11770 | 339 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pref_dialog_response_cb), plug); |
| 11740 | 340 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box); |
|
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
341 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config"); |
| 12290 | 342 gtk_window_set_title(GTK_WINDOW(dialog), _(gaim_plugin_get_name(plug))); |
| 11740 | 343 gtk_widget_show_all(dialog); |
| 11770 | 344 g_value_unset(&val); |
| 11740 | 345 break; |
| 346 } | |
| 347 } | |
| 348 | |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
349 static void |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
350 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
|
351 { |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
352 GtkTreeSelection *sel; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
353 GtkTreeIter iter; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
354 GaimPlugin *plugin; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
355 GtkTreeModel *model; |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
356 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
357 sel = gtk_tree_view_get_selection(view); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
358 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
359 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
360 return; |
| 12246 | 361 |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
362 gtk_tree_model_get(model, &iter, 2, &plugin, -1); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
363 |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
364 if (!gaim_plugin_is_loaded(plugin)) |
|
12174
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
365 return; |
|
c7652a910308
[gaim-migrate @ 14476]
Richard Laager <rlaager@wiktel.com>
parents:
12162
diff
changeset
|
366 |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
367 /* Now show the pref-dialog for the plugin */ |
| 12246 | 368 plugin_dialog_response_cb(NULL, GAIM_RESPONSE_CONFIGURE, sel); |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
369 } |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
370 |
| 11740 | 371 void gaim_gtk_plugin_dialog_show() |
| 372 { | |
| 11741 | 373 GtkWidget *sw; |
| 11740 | 374 GtkWidget *event_view; |
| 375 GtkListStore *ls; | |
| 376 GtkCellRenderer *rend, *rendt; | |
| 377 GtkTreeViewColumn *col; | |
| 378 GtkTreeSelection *sel; | |
| 379 | |
| 380 if (plugin_dialog != NULL) { | |
| 381 gtk_window_present(GTK_WINDOW(plugin_dialog)); | |
| 382 return; | |
| 383 } | |
| 384 | |
| 385 plugin_dialog = gtk_dialog_new_with_buttons(_("Plugins"), | |
| 386 NULL, | |
| 387 GTK_DIALOG_NO_SEPARATOR, | |
| 388 NULL); | |
| 12246 | 389 pref_button = gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
|
12276
b3652193d359
[gaim-migrate @ 14580]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12246
diff
changeset
|
390 _("Configure Pl_ugin"), GAIM_RESPONSE_CONFIGURE); |
| 12246 | 391 gtk_dialog_add_button(GTK_DIALOG(plugin_dialog), |
| 392 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); | |
|
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
393 gtk_widget_set_sensitive(pref_button, FALSE); |
|
11747
b8bf638cc4aa
[gaim-migrate @ 14038]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11744
diff
changeset
|
394 gtk_window_set_role(GTK_WINDOW(plugin_dialog), "plugins"); |
| 11740 | 395 |
| 396 sw = gtk_scrolled_window_new(NULL,NULL); | |
| 397 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
| 398 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 399 | |
| 400 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), sw, TRUE, TRUE, 0); | |
| 401 | |
| 402 ls = gtk_list_store_new (3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER); | |
| 403 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), | |
| 404 1, GTK_SORT_ASCENDING); | |
| 405 | |
| 406 update_plugin_list(ls); | |
|
11813
1f7f4f850db5
[gaim-migrate @ 14104]
Gary Kramlich <grim@reaperworld.com>
parents:
11794
diff
changeset
|
407 |
| 11740 | 408 event_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(ls)); |
| 409 | |
|
12162
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
410 g_signal_connect(G_OBJECT(event_view), "row-activated", |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
411 G_CALLBACK(show_plugin_prefs_cb), event_view); |
|
5e24b8e49522
[gaim-migrate @ 14463]
Richard Laager <rlaager@wiktel.com>
parents:
12066
diff
changeset
|
412 |
| 11740 | 413 rend = gtk_cell_renderer_toggle_new(); |
| 414 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (event_view)); | |
| 415 | |
| 416 col = gtk_tree_view_column_new_with_attributes (_("Enabled"), | |
| 417 rend, | |
| 418 "active", 0, | |
| 419 NULL); | |
| 420 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
|
421 gtk_tree_view_column_set_sort_column_id(col, 0); |
| 11740 | 422 g_signal_connect (G_OBJECT(rend), "toggled", |
| 423 G_CALLBACK(plugin_load), ls); | |
| 12246 | 424 |
| 11740 | 425 rendt = gtk_cell_renderer_text_new(); |
| 426 col = gtk_tree_view_column_new_with_attributes (_("Name"), | |
| 427 rendt, | |
| 428 "markup", 1, | |
| 429 NULL); | |
| 430 #if GTK_CHECK_VERSION(2,6,0) | |
| 431 gtk_tree_view_column_set_expand (col, TRUE); | |
| 432 g_object_set(rendt, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
| 433 #endif | |
| 434 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
|
435 gtk_tree_view_column_set_sort_column_id(col, 1); |
| 11740 | 436 g_object_unref(G_OBJECT(ls)); |
| 437 gtk_container_add(GTK_CONTAINER(sw), event_view); | |
| 12246 | 438 |
| 11740 | 439 expander = gtk_expander_new(_("<b>Plugin Details</b>")); |
| 440 gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE); | |
| 441 plugin_details = gtk_label_new(NULL); | |
| 442 gtk_label_set_line_wrap(GTK_LABEL(plugin_details), TRUE); | |
| 443 gtk_container_add(GTK_CONTAINER(expander), plugin_details); | |
| 12343 | 444 gtk_widget_set_sensitive(expander, FALSE); |
| 11740 | 445 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), expander, FALSE, FALSE, 0); |
| 446 | |
| 447 g_signal_connect (G_OBJECT (sel), "changed", G_CALLBACK (prefs_plugin_sel), NULL); | |
| 448 g_signal_connect(G_OBJECT(plugin_dialog), "response", G_CALLBACK(plugin_dialog_response_cb), sel); | |
| 449 gtk_window_set_default_size(GTK_WINDOW(plugin_dialog), 430, 430); | |
| 450 gtk_widget_show_all(plugin_dialog); | |
| 451 } |
