Cache G_TYPE_INSTANCE_GET_PRIVATE() result when initializing an
[geany-mirror.git] / src / about.c
blobb197bd10428ec4fcbca23c9ad012e6fc3c22eafb
1 /*
2 * about.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2005-2010 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2006-2010 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 * $Id$
25 * About dialog and credits.
28 #include "about.h"
29 #include "geany.h"
30 #include "utils.h"
31 #include "ui_utils.h"
32 #include "support.h"
33 #include "geanywraplabel.h"
34 #include "main.h"
36 #include "gb.c"
39 #define HEADER "<span size=\"larger\" weight=\"bold\">Geany %s</span>"
40 #define INFO "<span size=\"larger\" weight=\"bold\">%s</span>"
41 #define CODENAME "<span weight=\"bold\">\"" GEANY_CODENAME "\"</span>"
42 #define BUILDDATE "<span size=\"smaller\">%s</span>"
43 #define COPYRIGHT "Copyright (c) 2005-2010\nEnrico Tröger\nNick Treleaven\nFrank Lanitz\nAll rights reserved."
45 const gchar *translators[][2] = {
46 { "ast", "Marcos Costales &lt;marcoscostales@gmail.com&gt;"},
47 { "be_BY", "Yura Semashko &lt;yurand2@gmail.com&gt;" },
48 { "bg", "Dilyan Rusev &lt;dilyanrusev@gmail.com&gt;" },
49 { "ca_ES", "Toni Garcia-Navarro &lt;topi@elpiset.net&gt;" },
50 { "cs_CZ", "Petr Messner &lt;messa@messa.cz&gt;\nAnna Talianova &lt;anickat1@gmail.com&gt;" },
51 { "de_DE", "Frank Lanitz &lt;frank@frank.uvena.de&gt;\nDominic Hopf &lt;dmaphy@googlemail.com&gt;" },
52 { "el", "Stavros Temertzidis &lt;bullgr@gmail.com&gt;" },
53 { "en_GB", "Jeff Bailes &lt;thepizzaking@gmail.com&gt;" },
54 { "es", "Damián Viano &lt;debian@damianv.com.ar&gt;\nNacho Cabanes &lt;ncabanes@gmail.com&gt;" },
55 { "fi", "Harri Koskinen &lt;harri@fastmonkey.org&gt;\nJari Rahkonen &lt;jari.rahkonen@pp1.inet.fi&gt;" },
56 { "fr", "Jean-Philippe Moal &lt;skateinmars@skateinmars.net&gt;" },
57 { "gl", "José Manuel Castroagudín Silva &lt;chavescesures@gmail.com&gt;"},
58 { "hu", "Gabor Kmetyko &lt;kg_kilo@freemail.hu&gt;" },
59 { "it", "Max Baldinelli &lt;m.baldinelli@agora.it&gt;,\nDario Santomarco &lt;dariello@yahoo.it&gt;" },
60 { "ja", "Tarot Osuji &lt;tarot@sdf.lonestar.org&gt;\nChikahiro Masami &lt;cmasa.z321@gmail.com&gt;" },
61 { "ko", "Park Jang-heon &lt;dotkabi@gmail.com&gt;" },
62 { "lb", "Laurent Hoeltgen &lt;hoeltgman@gmail.com&gt;" },
63 { "nl", "Peter Scholtens &lt;peter.scholtens@xs4all.nl&gt;\nAyke van Laethem &lt;aykevanlaethem@gmail.com&gt;" },
64 { "pl_PL", "Jarosław Foksa &lt;jfoksa@gmail.com&gt;" },
65 { "pt_BR", "Alexandra Moreire &lt;alexandream@gmail.com&gt;\nAdrovane Marques Kade &lt;adrovane@gmail.com&gt;" },
66 { "ro", "Alex Eftimie &lt;alex@rosedu.org&gt;" },
67 { "ru_RU", "brahmann_ &lt;brahmann@pisem.net&gt;,\nNikita E. Shalaev &lt;nshalaev@eu.spb.ru&gt;" },
68 { "sl", "Jože Klepec &lt;joze.klepec@siol.net&gt;"},
69 { "sv", "Tony Mattsson &lt;superxorn@gmail.com&gt;" },
70 { "tr", "Gürkan Gür &lt;seqizz@gmail.com&gt;"},
71 { "uk", "Boris Dibrov &lt;dibrov.bor@gmail.com&gt;" },
72 { "vi_VN", "Clytie Siddall &lt;clytie@riverland.net.au&gt;" },
73 { "zh_CN", "Dormouse Young &lt;mouselinux@163.com&gt;,\nXhacker Liu &lt;liu.dongyuan@gmail.com&gt;" },
74 { "zh_TW", "KoViCH &lt;kovich.ian@gmail.com&gt;" }
76 static const gint translators_len = G_N_ELEMENTS(translators);
78 const gchar *prev_translators[][2] = {
79 { "pl_PL", "Jacek Wolszczak &lt;shutdownrunner@o2.pl&gt;" },
80 { "nl", "Kurt De Bree &lt;kdebree@telenet.be&gt;" }
82 static const gint prev_translators_len = G_N_ELEMENTS(prev_translators);
84 static const gchar *contributors =
85 "Alexander Rodin, Alexey Antipov, Andrew Rowland, Anh Phạm, blackdog, Bo Lorentsen, Bob Doan, "
86 "Bronisław Białek, Can Koy, Catalin Marinas, "
87 "Chris Macksey, Christoph Berg, Colomban Wendling, Conrad Steenberg, Daniel Richard G., Dave Moore, "
88 "Dirk Weber, Elias Pschernig, Eric Forgeot, Eugene Arshinov, Felipe Pena, François Cami, "
89 "Giuseppe Torelli, Guillaume de Rorthais, Guillaume Hoffmann, Herbert Voss, Jason Oster, "
90 "Jean-François Wauthy, Jeff Pohlmeyer, Jesse Mayes, John Gabriele, Jon Senior, Jon Strait, Josef Whiter, "
91 "Jörn Reder, Kelvin Gardiner, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, Marko Peric, Matti Mårds, "
92 "Moritz Barsnick, Peter Strand, Philipp Gildein, Pierre Joye, Rob van der Linde, Robert McGinley, "
93 "Roland Baudin, Ross McKay, S Jagannathan, Saleem Abdulrasool, "
94 "Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Thomas Martitz, Tomás Vírseda, "
95 "Tyler Mulligan, Walery Studennikov, Yura Siamashka";
98 static void header_eventbox_style_set(GtkWidget *widget);
99 static void header_label_style_set(GtkWidget *widget);
100 static void homepage_clicked(GtkButton *button, gpointer data);
103 #define ROW(text, row, col, x_align, y_padding, col_span) \
104 label = gtk_label_new((text)); \
105 gtk_table_attach(GTK_TABLE(table), label, (col), (col) + (col_span) + 1, (row), (row) + 1, \
106 (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, (y_padding)); \
107 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); \
108 gtk_misc_set_alignment(GTK_MISC(label), (x_align), 0);
111 static GtkWidget *create_dialog(void)
113 GtkWidget *dialog;
114 GtkWidget *header_image;
115 GtkWidget *header_label;
116 GtkWidget *label_info;
117 GtkWidget *codename_label;
118 GtkWidget *builddate_label;
119 GtkWidget *url_button;
120 GtkWidget *cop_label;
121 GtkWidget *label;
122 GtkWidget *license_textview;
123 GtkWidget *notebook;
124 GtkWidget *box;
125 GtkWidget *credits_scrollwin;
126 GtkWidget *table;
127 GtkWidget *license_scrollwin;
128 GtkWidget *info_box;
129 GtkWidget *button;
130 GtkWidget *header_hbox;
131 GtkWidget *header_eventbox;
132 GdkPixbuf *icon;
133 GtkTextBuffer* tb;
134 gchar *license_text = NULL;
135 gchar buffer[512];
136 gchar buffer2[128];
137 gint i, row = 0;
139 dialog = gtk_dialog_new();
141 /* configure dialog */
142 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_widgets.window));
143 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
144 gtk_window_set_title(GTK_WINDOW(dialog), _("About Geany"));
145 gtk_widget_set_name(dialog, "GeanyDialog");
146 button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
147 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
148 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
149 g_signal_connect(dialog, "key-press-event", G_CALLBACK(gb_on_key_pressed), NULL);
151 /* create header */
152 header_eventbox = gtk_event_box_new();
153 gtk_widget_show(header_eventbox);
154 header_hbox = gtk_hbox_new(FALSE, 12);
155 gtk_container_set_border_width(GTK_CONTAINER(header_hbox), 4);
156 gtk_widget_show(header_hbox);
157 gtk_container_add(GTK_CONTAINER(header_eventbox), header_hbox);
158 header_image = gtk_image_new();
159 gtk_box_pack_start(GTK_BOX(header_hbox), header_image, FALSE, FALSE, 0);
160 header_label = gtk_label_new(NULL);
161 gtk_label_set_use_markup(GTK_LABEL(header_label), TRUE);
162 /* print the subversion revision generated by ./configure if it is available */
163 g_snprintf(buffer, sizeof(buffer), HEADER, main_get_version_string());
164 gtk_label_set_markup(GTK_LABEL(header_label), buffer);
165 gtk_widget_show(header_label);
166 gtk_box_pack_start(GTK_BOX(header_hbox), header_label, FALSE, FALSE, 0);
167 header_eventbox_style_set(header_eventbox);
168 header_label_style_set(header_label);
169 g_signal_connect_after(header_eventbox, "style-set", G_CALLBACK(header_eventbox_style_set), NULL);
170 g_signal_connect_after(header_label, "style-set", G_CALLBACK(header_label_style_set), NULL);
171 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), header_eventbox, FALSE, FALSE, 0);
173 /* set image */
174 icon = ui_new_pixbuf_from_inline(GEANY_IMAGE_LOGO);
175 gtk_image_set_from_pixbuf(GTK_IMAGE(header_image), icon);
176 gtk_window_set_icon(GTK_WINDOW(dialog), icon);
177 g_object_unref(icon); /* free our reference */
179 /* create notebook */
180 notebook = gtk_notebook_new();
181 gtk_widget_show(notebook);
182 gtk_container_set_border_width(GTK_CONTAINER(notebook), 2);
183 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook, TRUE, TRUE, 0);
185 /* create "Info" tab */
186 info_box = gtk_vbox_new(FALSE, 0);
187 gtk_container_set_border_width(GTK_CONTAINER(info_box), 6);
188 gtk_widget_show(info_box);
190 label_info = gtk_label_new(NULL);
191 gtk_label_set_justify(GTK_LABEL(label_info), GTK_JUSTIFY_CENTER);
192 gtk_label_set_selectable(GTK_LABEL(label_info), TRUE);
193 gtk_label_set_use_markup(GTK_LABEL(label_info), TRUE);
194 g_snprintf(buffer, sizeof(buffer), INFO, _("A fast and lightweight IDE"));
195 gtk_label_set_markup(GTK_LABEL(label_info), buffer);
196 gtk_misc_set_padding(GTK_MISC(label_info), 2, 11);
197 gtk_widget_show(label_info);
198 gtk_box_pack_start(GTK_BOX(info_box), label_info, FALSE, FALSE, 0);
200 /* Codename label */
201 codename_label = gtk_label_new(NULL);
202 gtk_label_set_justify(GTK_LABEL(codename_label), GTK_JUSTIFY_CENTER);
203 gtk_label_set_selectable(GTK_LABEL(codename_label), TRUE);
204 gtk_label_set_use_markup(GTK_LABEL(codename_label), TRUE);
205 gtk_label_set_markup(GTK_LABEL(codename_label), CODENAME);
206 gtk_misc_set_padding(GTK_MISC(codename_label), 2, 8);
207 gtk_widget_show(codename_label);
208 gtk_box_pack_start(GTK_BOX(info_box), codename_label, FALSE, FALSE, 0);
210 /* build date label */
211 builddate_label = gtk_label_new(NULL);
212 gtk_label_set_justify(GTK_LABEL(builddate_label), GTK_JUSTIFY_CENTER);
213 gtk_label_set_selectable(GTK_LABEL(builddate_label), TRUE);
214 gtk_label_set_use_markup(GTK_LABEL(builddate_label), TRUE);
215 g_snprintf(buffer2, sizeof(buffer2), _("(built on or after %s)"), __DATE__);
216 g_snprintf(buffer, sizeof(buffer), BUILDDATE, buffer2);
217 gtk_label_set_markup(GTK_LABEL(builddate_label), buffer);
218 gtk_misc_set_padding(GTK_MISC(builddate_label), 2, 2);
219 gtk_widget_show(builddate_label);
220 gtk_box_pack_start(GTK_BOX(info_box), builddate_label, FALSE, FALSE, 0);
222 box = gtk_hbutton_box_new();
223 url_button = gtk_button_new();
224 gtk_button_set_relief(GTK_BUTTON(url_button), GTK_RELIEF_NONE);
225 g_signal_connect(url_button, "clicked", G_CALLBACK(homepage_clicked), GEANY_HOMEPAGE);
226 label = gtk_label_new(NULL);
227 gtk_label_set_text(GTK_LABEL(label), GEANY_HOMEPAGE);
228 gtk_widget_show(label);
229 gtk_container_add(GTK_CONTAINER(url_button), label);
230 gtk_widget_show(url_button);
231 gtk_box_pack_start(GTK_BOX(box), url_button, FALSE, FALSE, 0);
232 gtk_widget_show(box);
233 gtk_box_pack_start(GTK_BOX(info_box), box, FALSE, FALSE, 10);
235 /* copyright label */
236 cop_label = gtk_label_new(NULL);
237 gtk_label_set_justify(GTK_LABEL(cop_label), GTK_JUSTIFY_CENTER);
238 gtk_label_set_selectable(GTK_LABEL(cop_label), FALSE);
239 gtk_label_set_use_markup(GTK_LABEL(cop_label), TRUE);
240 gtk_label_set_markup(GTK_LABEL(cop_label), COPYRIGHT);
241 gtk_misc_set_padding(GTK_MISC(cop_label), 2, 10);
242 gtk_widget_show(cop_label);
243 gtk_box_pack_start(GTK_BOX(info_box), cop_label, FALSE, FALSE, 0);
244 /*gtk_container_add(GTK_CONTAINER(info_box), cop_label); */
246 label = gtk_label_new(_("Info"));
247 gtk_widget_show(label);
248 gtk_widget_show_all(info_box);
249 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), info_box, label);
251 /* create "Credits" tab */
252 credits_scrollwin = gtk_scrolled_window_new(NULL, NULL);
253 gtk_container_set_border_width(GTK_CONTAINER(credits_scrollwin), 10);
254 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(credits_scrollwin),
255 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
257 table = gtk_table_new(18 + translators_len + prev_translators_len, 3, FALSE);
258 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
260 row = 0;
261 g_snprintf(buffer, sizeof(buffer),
262 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Developers"));
263 label = gtk_label_new(buffer);
264 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
265 (GtkAttachOptions) (GTK_FILL),
266 (GtkAttachOptions) (0), 0, 5);
267 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
268 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
269 row++;
271 g_snprintf(buffer, sizeof(buffer), "Enrico Tröger - %s", _("maintainer"));
272 ROW(buffer, row, 0, 0, 0, 1);
273 row++;
274 ROW("&lt;enrico.troeger@uvena.de&gt;", row, 0, 0, 0, 1);
275 row++;
276 ROW("", row, 0, 0, 0, 0);
277 row++;
279 g_snprintf(buffer, sizeof(buffer), "Nick Treleaven - %s", _("developer"));
280 ROW(buffer, row, 0, 0, 0, 1);
281 row++;
282 ROW("&lt;nick.treleaven@btinternet.com&gt;", row, 0, 0, 0, 1);
283 row++;
284 ROW("", row, 0, 0, 0, 0);
285 row++;
287 g_snprintf(buffer, sizeof(buffer), "Frank Lanitz - %s", _("translation maintainer"));
288 ROW(buffer, 7, 0, 0, 0, 1);
289 row++;
290 ROW("&lt;frank@frank.uvena.de&gt;", row, 0, 0, 0, 1);
291 row++;
292 ROW("", row, 0, 0, 0, 0);
293 row++;
295 g_snprintf(buffer, sizeof(buffer),
296 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Translators"));
297 label = gtk_label_new(buffer);
298 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
299 (GtkAttachOptions) (GTK_FILL),
300 (GtkAttachOptions) (0), 0, 5);
301 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
302 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
303 row++;
305 for (i = 0; i < translators_len; i++)
307 ROW(translators[i][0], row, 0, 1, 4, 0);
308 ROW(translators[i][1], row, 1, 0, 4, 0);
309 row++;
312 ROW("", row, 0, 0, 0, 0);
313 row++;
315 g_snprintf(buffer, sizeof(buffer),
316 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Previous Translators"));
317 label = gtk_label_new(buffer);
318 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
319 (GtkAttachOptions) (GTK_FILL),
320 (GtkAttachOptions) (0), 0, 5);
321 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
322 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
323 row++;
325 for (i = 0; i < prev_translators_len; i++)
327 ROW(prev_translators[i][0], row, 0, 1, 4, 0);
328 ROW(prev_translators[i][1], row, 1, 0, 4, 0);
329 row++;
333 ROW("", row, 0, 0, 0, 0);
334 row++;
336 g_snprintf(buffer, sizeof(buffer),
337 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Contributors"));
338 label = gtk_label_new(buffer);
339 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
340 (GtkAttachOptions) (GTK_FILL),
341 (GtkAttachOptions) (0), 0, 5);
342 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
343 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
344 row++;
346 g_snprintf(buffer, sizeof(buffer),
347 _("Some of the many contributors (for a more detailed list, see the file %s):"),
348 #ifdef G_OS_WIN32
349 "Thanks.txt"
350 #else
351 "THANKS"
352 #endif
354 label = geany_wrap_label_new(buffer);
355 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
356 (GtkAttachOptions) (GTK_FILL),
357 (GtkAttachOptions) (0), 0, 5);
358 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
359 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
360 row++;
362 label = geany_wrap_label_new(contributors);
363 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
364 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
365 (GtkAttachOptions) (0), 0, 5);
366 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
367 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
368 row++;
370 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(credits_scrollwin), table);
371 gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_widget_get_parent(table)), GTK_SHADOW_NONE);
372 gtk_widget_show_all(table);
373 label = gtk_label_new(_("Credits"));
374 gtk_widget_show(label);
375 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), credits_scrollwin, label);
377 /* create "License" tab */
378 license_scrollwin = gtk_scrolled_window_new(NULL, NULL);
379 gtk_container_set_border_width(GTK_CONTAINER(license_scrollwin), 6);
380 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(license_scrollwin),
381 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
382 license_textview = gtk_text_view_new();
383 gtk_text_view_set_editable(GTK_TEXT_VIEW(license_textview), FALSE);
384 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(license_textview), FALSE);
385 gtk_widget_show(license_textview);
386 gtk_container_add(GTK_CONTAINER(license_scrollwin), license_textview);
387 label = gtk_label_new(_("License"));
388 gtk_widget_show(label);
390 g_snprintf(buffer, sizeof(buffer), "%s" G_DIR_SEPARATOR_S "GPL-2", app->datadir);
392 g_file_get_contents(buffer, &license_text, NULL, NULL);
393 if (license_text == NULL)
395 license_text = g_strdup(
396 _("License text could not be found, please visit http://www.gnu.org/licenses/gpl-2.0.txt to view it online."));
398 tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(license_textview));
399 gtk_text_buffer_set_text(tb, license_text, strlen(license_text));
401 g_free(license_text);
403 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), license_scrollwin, label);
405 gtk_widget_show_all(dialog);
406 return dialog;
410 void about_dialog_show(void)
412 GtkWidget *dialog;
414 dialog = create_dialog();
416 gtk_dialog_run(GTK_DIALOG(dialog));
417 gtk_widget_destroy(dialog);
421 static void header_eventbox_style_set(GtkWidget *widget)
423 static gint recursive = 0;
424 GtkStyle *style;
426 if (recursive > 0)
427 return;
429 ++recursive;
430 style = gtk_widget_get_style(widget);
431 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &style->bg[GTK_STATE_SELECTED]);
432 --recursive;
436 static void header_label_style_set(GtkWidget *widget)
438 static gint recursive = 0;
439 GtkStyle *style;
441 if (recursive > 0)
442 return;
444 ++recursive;
445 style = gtk_widget_get_style(widget);
446 gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &style->fg[GTK_STATE_SELECTED]);
447 --recursive;
451 static void homepage_clicked(GtkButton *button, gpointer data)
453 utils_open_browser(data);