Update HACKING for changed doc generation instructions
[geany-mirror.git] / src / about.c
blob8bf37e7a6c1ceae90c97f48b97413068c762584c
1 /*
2 * about.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2005-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2006-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
6 * Copyright 2006-2012 Frank Lanitz <frank@frank.uvena.de>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * About dialog and credits.
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
31 #include "about.h"
33 #include "app.h"
34 #include "gb.c"
35 #include "geany.h"
36 #include "geanywraplabel.h"
37 #include "main.h"
38 #include "support.h"
39 #include "ui_utils.h"
40 #include "utils.h"
42 #include "gtkcompat.h"
44 #define HEADER "<span size=\"larger\" weight=\"bold\">Geany %s</span>"
45 #define INFO "<span size=\"larger\" weight=\"bold\">%s</span>"
46 #define CODENAME "<span weight=\"bold\">\"" GEANY_CODENAME "\"</span>"
47 #define BUILDDATE "<span size=\"smaller\">%s</span>"
48 #define COPYRIGHT _("Copyright (c) 2005-2014\nColomban Wendling\nNick Treleaven\nMatthew Brush\nEnrico Tröger\nFrank Lanitz\nAll rights reserved.")
50 static const gchar *translators[][2] = {
51 { "ar", "Fayssal Chamekh &lt;chamfay@gmail.com&gt;"},
52 { "ast", "Marcos Costales &lt;marcoscostales@gmail.com&gt;"},
53 { "be_BY", "Yura Siamashka &lt;yurand2@gmail.com&gt;" },
54 { "bg", "Dilyan Rusev &lt;dilyanrusev@gmail.com&gt;" },
55 { "ca_ES", "Toni Garcia-Navarro &lt;topi@elpiset.net&gt;" },
56 { "cs_CZ", "Petr Messner &lt;messa@messa.cz&gt;\nAnna Talianova &lt;anickat1@gmail.com&gt;" },
57 { "de_DE", "Frank Lanitz &lt;frank@frank.uvena.de&gt;\nDominic Hopf &lt;dmaphy@googlemail.com&gt;" },
58 { "el", "Stavros Temertzidis &lt;bullgr@gmail.com&gt;" },
59 { "en_GB", "Jeff Bailes &lt;thepizzaking@gmail.com&gt;" },
60 { "es", "Antonio Jiménez González &lt;tonificante@hotmail.com&gt;\nLucas Vieites &lt;lucasvieites@gmail.com&gt;" },
61 { "eu", "Asier Iturralde Sarasola &lt;asier.iturralde@gmail.com&gt;"},
62 { "fa", "Moein Owhadi Kareshk &lt;moein.owhadi@gmail.com&gt;"},
63 { "fi", "Harri Koskinen &lt;harri@fastmonkey.org&gt;\nJari Rahkonen &lt;jari.rahkonen@pp1.inet.fi&gt;" },
64 { "fr", "Jean-Philippe Moal &lt;skateinmars@skateinmars.net&gt;" },
65 { "gl", "José Manuel Castroagudín Silva &lt;chavescesures@gmail.com&gt;"},
66 { "hi", "Asheesh Ranjan &lt;asheeshranjan1@gmail.com&gt;"},
67 { "he", "Yosef Or Boczko &lt;yoseforb@gmail.com&gt;"},
68 { "hu", "Gabor Kmetyko &lt;kg_kilo@freemail.hu&gt;" },
69 { "it", "Max Baldinelli &lt;m.baldinelli@agora.it&gt;,\nDario Santomarco &lt;dariello@yahoo.it&gt;" },
70 { "ja", "Tarot Osuji &lt;tarot@sdf.lonestar.org&gt;\nChikahiro Masami &lt;cmasa.z321@gmail.com&gt;" },
71 { "ko", "Park Jang-heon &lt;dotkabi@gmail.com&gt;" },
72 { "kk", "Baurzhan Muftakhidinov &lt;baurthefirst@gmail.com&gt;"},
73 { "lt", "Algimantas Margevičius &lt;margevicius.algimantas@gmail.com&gt;"},
74 { "lb", "Laurent Hoeltgen &lt;hoeltgman@gmail.com&gt;" },
75 { "mn", "tsetsee &lt;tsetsee.yugi@gmail.com&gt;"},
76 { "nl", "Peter Scholtens &lt;peter.scholtens@xs4all.nl&gt;\nAyke van Laethem &lt;aykevanlaethem@gmail.com&gt;" },
77 { "pl", "Wojciech Świderski &lt;woj.swiderski@gmail.com&gt;"},
78 { "pt_BR", "Alexandra Moreire &lt;alexandream@gmail.com&gt;\n"
79 "Adrovane Marques Kade &lt;adrovane@gmail.com&gt;\n"
80 "Rafael Peregrino da Silva &lt;rperegrino@linuxnewmedia.com.br&gt;"},
81 { "ro", "Alex Eftimie &lt;alex@rosedu.org&gt;" },
82 { "ru", "brahmann_ &lt;brahmann@pisem.net&gt;,\nNikita E. Shalaev &lt;nshalaev@eu.spb.ru&gt;" },
83 { "sk", "Tomáš Vadina &lt;kyberdev@gmail.com&gt;" },
84 { "sl", "Jože Klepec &lt;joze.klepec@siol.net&gt;"},
85 { "sv", "Tony Mattsson &lt;superxorn@gmail.com&gt;" },
86 { "sr", "Nikola Radovanovic &lt;cobisimo@gmail.com&gt;"},
87 { "tr", "Gürkan Gür &lt;seqizz@gmail.com&gt;"},
88 { "uk", "Boris Dibrov &lt;dibrov.bor@gmail.com&gt;" },
89 { "vi_VN", "Clytie Siddall &lt;clytie@riverland.net.au&gt;" },
90 { "zh_CN", "Dormouse Young &lt;mouselinux@163.com&gt;,\nXhacker Liu &lt;liu.dongyuan@gmail.com&gt;" },
91 { "zh_TW", "KoViCH &lt;kovich.ian@gmail.com&gt;\nWei-Lun Chao &lt;chaoweilun@gmail.com&gt;" }
93 static const guint translators_len = G_N_ELEMENTS(translators);
95 static const gchar *prev_translators[][2] = {
96 { "es", "Damián Viano &lt;debian@damianv.com.ar&gt;\nNacho Cabanes &lt;ncabanes@gmail.com&gt;" },
97 { "pl", "Jacek Wolszczak &lt;shutdownrunner@o2.pl&gt;\nJarosław Foksa &lt;jfoksa@gmail.com&gt;" },
98 { "nl", "Kurt De Bree &lt;kdebree@telenet.be&gt;" }
100 static const guint prev_translators_len = G_N_ELEMENTS(prev_translators);
102 static const gchar *contributors =
103 "Adam Ples, "
104 "Alexander Rodin, Alexey Antipov, Andrew Rowland, Anh Phạm, blackdog, Bo Lorentsen, Bob Doan, "
105 "Bronisław Białek, Can Koy, Catalin Marinas, "
106 "Chris Macksey, Christoph Berg, Colomban Wendling, Conrad Steenberg, Daniel Richard G., "
107 "Daniel Marjamaki, Dave Moore, "
108 "Dimitar Zhekov, Dirk Weber, Elias Pschernig, Eric Forgeot, "
109 "Erik de Castro Lopo, Eugene Arshinov, Felipe Pena, François Cami, "
110 "Giuseppe Torelli, Guillaume de Rorthais, Guillaume Hoffmann, Herbert Voss, Jason Oster, "
111 "Jean-François Wauthy, Jeff Pohlmeyer, Jesse Mayes, Jiří Techet, "
112 "John Gabriele, Jon Senior, Jon Strait, Josef Whiter, "
113 "Jörn Reder, Kelvin Gardiner, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, "
114 "Manuel Bua, Mário Silva, Marko Peric, Matthew Brush, Matti Mårds, "
115 "Moritz Barsnick, Nicolas Sierro, Ondrej Donek, Peter Strand, Philipp Gildein, "
116 "Pierre Joye, Rob van der Linde, "
117 "Robert McGinley, Roland Baudin, Ross McKay, S Jagannathan, Saleem Abdulrasool, "
118 "Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Taylor Venable, "
119 "Thomas Huth, Thomas Martitz, Tomás Vírseda, "
120 "Tyler Mulligan, Walery Studennikov, Yura Siamashka";
123 static void homepage_clicked(GtkButton *button, gpointer data);
126 #define ROW(text, row, col, x_align, y_padding, col_span) \
127 label = gtk_label_new((text)); \
128 gtk_table_attach(GTK_TABLE(table), label, (col), (col) + (col_span) + 1, (row), (row) + 1, \
129 (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, (y_padding)); \
130 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); \
131 gtk_misc_set_alignment(GTK_MISC(label), (x_align), 0);
134 static GtkWidget *create_dialog(void)
136 GtkWidget *dialog;
137 GtkWidget *header_image;
138 GtkWidget *header_label;
139 GtkWidget *label_info;
140 GtkWidget *codename_label;
141 GtkWidget *builddate_label;
142 GtkWidget *url_button;
143 GtkWidget *cop_label;
144 GtkWidget *label;
145 GtkWidget *license_textview;
146 GtkWidget *notebook;
147 GtkWidget *box;
148 GtkWidget *credits_scrollwin;
149 GtkWidget *table;
150 GtkWidget *license_scrollwin;
151 GtkWidget *info_box;
152 GtkWidget *header_hbox;
153 GtkWidget *header_eventbox;
154 GtkTextBuffer* tb;
155 gchar *license_text = NULL;
156 gchar buffer[512];
157 gchar buffer2[128];
158 guint i, row = 0;
159 gchar *build_date;
161 dialog = gtk_dialog_new();
163 /* configure dialog */
164 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_widgets.window));
165 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
166 gtk_window_set_title(GTK_WINDOW(dialog), _("About Geany"));
167 gtk_window_set_icon_name(GTK_WINDOW(dialog), "geany");
168 gtk_widget_set_name(dialog, "GeanyDialog");
169 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
170 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
171 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
172 g_signal_connect(dialog, "key-press-event", G_CALLBACK(gb_on_key_pressed), NULL);
174 /* create header */
175 header_eventbox = gtk_event_box_new();
176 gtk_widget_show(header_eventbox);
177 header_hbox = gtk_hbox_new(FALSE, 12);
178 gtk_container_set_border_width(GTK_CONTAINER(header_hbox), 4);
179 gtk_widget_show(header_hbox);
180 gtk_container_add(GTK_CONTAINER(header_eventbox), header_hbox);
181 header_image = gtk_image_new_from_icon_name("geany", GTK_ICON_SIZE_DIALOG);
182 gtk_box_pack_start(GTK_BOX(header_hbox), header_image, FALSE, FALSE, 0);
183 header_label = gtk_label_new(NULL);
184 gtk_label_set_use_markup(GTK_LABEL(header_label), TRUE);
185 /* print the subversion revision generated by ./configure if it is available */
186 g_snprintf(buffer, sizeof(buffer), HEADER, main_get_version_string());
187 gtk_label_set_markup(GTK_LABEL(header_label), buffer);
188 gtk_widget_show(header_label);
189 gtk_box_pack_start(GTK_BOX(header_hbox), header_label, FALSE, FALSE, 0);
190 gtk_widget_set_state(header_eventbox, GTK_STATE_SELECTED);
191 gtk_widget_set_state(header_label, GTK_STATE_SELECTED);
192 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), header_eventbox, FALSE, FALSE, 0);
194 /* create notebook */
195 notebook = gtk_notebook_new();
196 gtk_widget_show(notebook);
197 gtk_container_set_border_width(GTK_CONTAINER(notebook), 2);
198 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), notebook, TRUE, TRUE, 0);
200 /* create "Info" tab */
201 info_box = gtk_vbox_new(FALSE, 0);
202 gtk_container_set_border_width(GTK_CONTAINER(info_box), 6);
203 gtk_widget_show(info_box);
205 label_info = gtk_label_new(NULL);
206 gtk_label_set_justify(GTK_LABEL(label_info), GTK_JUSTIFY_CENTER);
207 gtk_label_set_selectable(GTK_LABEL(label_info), TRUE);
208 gtk_label_set_use_markup(GTK_LABEL(label_info), TRUE);
209 g_snprintf(buffer, sizeof(buffer), INFO, _("A fast and lightweight IDE"));
210 gtk_label_set_markup(GTK_LABEL(label_info), buffer);
211 gtk_misc_set_padding(GTK_MISC(label_info), 2, 11);
212 gtk_widget_show(label_info);
213 gtk_box_pack_start(GTK_BOX(info_box), label_info, FALSE, FALSE, 0);
215 /* Codename label */
216 codename_label = gtk_label_new(NULL);
217 gtk_label_set_justify(GTK_LABEL(codename_label), GTK_JUSTIFY_CENTER);
218 gtk_label_set_selectable(GTK_LABEL(codename_label), TRUE);
219 gtk_label_set_use_markup(GTK_LABEL(codename_label), TRUE);
220 gtk_label_set_markup(GTK_LABEL(codename_label), CODENAME);
221 gtk_misc_set_padding(GTK_MISC(codename_label), 2, 8);
222 gtk_widget_show(codename_label);
223 gtk_box_pack_start(GTK_BOX(info_box), codename_label, FALSE, FALSE, 0);
225 /* build date label */
226 builddate_label = gtk_label_new(NULL);
227 gtk_label_set_justify(GTK_LABEL(builddate_label), GTK_JUSTIFY_CENTER);
228 gtk_label_set_selectable(GTK_LABEL(builddate_label), TRUE);
229 gtk_label_set_use_markup(GTK_LABEL(builddate_label), TRUE);
230 build_date = utils_parse_and_format_build_date(__DATE__);
231 g_snprintf(buffer2, sizeof(buffer2), _("(built on or after %s)"), build_date);
232 g_free(build_date);
233 g_snprintf(buffer, sizeof(buffer), BUILDDATE, buffer2);
234 gtk_label_set_markup(GTK_LABEL(builddate_label), buffer);
235 gtk_misc_set_padding(GTK_MISC(builddate_label), 2, 2);
236 gtk_widget_show(builddate_label);
237 gtk_box_pack_start(GTK_BOX(info_box), builddate_label, FALSE, FALSE, 0);
239 box = gtk_hbutton_box_new();
240 url_button = gtk_button_new();
241 gtk_button_set_relief(GTK_BUTTON(url_button), GTK_RELIEF_NONE);
242 g_signal_connect(url_button, "clicked", G_CALLBACK(homepage_clicked), (gpointer)GEANY_HOMEPAGE);
243 label = gtk_label_new(NULL);
244 gtk_label_set_text(GTK_LABEL(label), GEANY_HOMEPAGE);
245 gtk_widget_show(label);
246 gtk_container_add(GTK_CONTAINER(url_button), label);
247 gtk_widget_show(url_button);
248 gtk_box_pack_start(GTK_BOX(box), url_button, FALSE, FALSE, 0);
249 gtk_widget_show(box);
250 gtk_box_pack_start(GTK_BOX(info_box), box, FALSE, FALSE, 10);
252 /* copyright label */
253 cop_label = gtk_label_new(NULL);
254 gtk_label_set_justify(GTK_LABEL(cop_label), GTK_JUSTIFY_CENTER);
255 gtk_label_set_selectable(GTK_LABEL(cop_label), FALSE);
256 gtk_label_set_use_markup(GTK_LABEL(cop_label), TRUE);
257 gtk_label_set_markup(GTK_LABEL(cop_label), COPYRIGHT);
258 gtk_misc_set_padding(GTK_MISC(cop_label), 2, 10);
259 gtk_widget_show(cop_label);
260 gtk_box_pack_start(GTK_BOX(info_box), cop_label, FALSE, FALSE, 0);
261 /*gtk_container_add(GTK_CONTAINER(info_box), cop_label); */
263 label = gtk_label_new(_("Info"));
264 gtk_widget_show(label);
265 gtk_widget_show_all(info_box);
266 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), info_box, label);
268 /* create "Credits" tab */
269 credits_scrollwin = gtk_scrolled_window_new(NULL, NULL);
270 gtk_container_set_border_width(GTK_CONTAINER(credits_scrollwin), 6);
271 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(credits_scrollwin),
272 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
274 table = gtk_table_new(23 + translators_len + prev_translators_len, 3, FALSE);
275 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
277 row = 0;
278 g_snprintf(buffer, sizeof(buffer),
279 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Developers"));
280 label = gtk_label_new(buffer);
281 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1, GTK_FILL, 0, 0, 5);
282 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
283 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
284 row++;
286 g_snprintf(buffer, sizeof(buffer), "Colomban Wendling - %s", _("maintainer"));
287 ROW(buffer, row, 0, 0, 0, 1);
288 row++;
289 ROW("&lt;lists.ban@herbesfolles.org&gt;", row, 0, 0, 0, 1);
290 row++;
291 ROW("", row, 0, 0, 0, 0);
292 row++;
294 g_snprintf(buffer, sizeof(buffer), "Nick Treleaven - %s", _("developer"));
295 ROW(buffer, row, 0, 0, 0, 1);
296 row++;
297 ROW("&lt;nick.treleaven@btinternet.com&gt;", row, 0, 0, 0, 1);
298 row++;
299 ROW("", row, 0, 0, 0, 0);
300 row++;
302 g_snprintf(buffer, sizeof(buffer), "Enrico Tröger - %s", _("developer"));
303 ROW(buffer, row, 0, 0, 0, 1);
304 row++;
305 ROW("&lt;enrico.troeger@uvena.de&gt;", row, 0, 0, 0, 1);
306 row++;
307 ROW("", row, 0, 0, 0, 0);
308 row++;
310 g_snprintf(buffer, sizeof(buffer), "Matthew Brush - %s", _("developer"));
311 ROW(buffer, row, 0, 0, 0, 1);
312 row++;
313 ROW("&lt;mbrush@codebrainz.ca&gt;", row, 0, 0, 0, 1);
314 row++;
315 ROW("", row, 0, 0, 0, 0);
316 row++;
318 g_snprintf(buffer, sizeof(buffer), "Frank Lanitz - %s", _("translation maintainer"));
319 ROW(buffer, row, 0, 0, 0, 1);
320 row++;
321 ROW("&lt;frank@frank.uvena.de&gt;", row, 0, 0, 0, 1);
322 row++;
323 ROW("", row, 0, 0, 0, 0);
324 row++;
326 g_snprintf(buffer, sizeof(buffer),
327 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Translators"));
328 label = gtk_label_new(buffer);
329 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
330 (GtkAttachOptions) (GTK_FILL),
331 (GtkAttachOptions) (0), 0, 5);
332 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
333 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
334 row++;
336 for (i = 0; i < translators_len; i++)
338 ROW(translators[i][0], row, 0, 1, 4, 0);
339 ROW(translators[i][1], row, 1, 0, 4, 0);
340 row++;
343 ROW("", row, 0, 0, 0, 0);
344 row++;
346 g_snprintf(buffer, sizeof(buffer),
347 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Previous Translators"));
348 label = gtk_label_new(buffer);
349 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
350 (GtkAttachOptions) (GTK_FILL),
351 (GtkAttachOptions) (0), 0, 5);
352 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
353 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
354 row++;
356 for (i = 0; i < prev_translators_len; i++)
358 ROW(prev_translators[i][0], row, 0, 1, 4, 0);
359 ROW(prev_translators[i][1], row, 1, 0, 4, 0);
360 row++;
364 ROW("", row, 0, 0, 0, 0);
365 row++;
367 g_snprintf(buffer, sizeof(buffer),
368 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Contributors"));
369 label = gtk_label_new(buffer);
370 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
371 (GtkAttachOptions) (GTK_FILL),
372 (GtkAttachOptions) (0), 0, 5);
373 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
374 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
375 row++;
377 g_snprintf(buffer, sizeof(buffer),
378 _("Some of the many contributors (for a more detailed list, see the file %s):"),
379 #ifdef G_OS_WIN32
380 "Thanks.txt"
381 #else
382 "THANKS"
383 #endif
385 label = geany_wrap_label_new(buffer);
386 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
387 (GtkAttachOptions) (GTK_FILL),
388 (GtkAttachOptions) (0), 0, 5);
389 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
390 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
391 row++;
393 label = geany_wrap_label_new(contributors);
394 gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row + 1,
395 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
396 (GtkAttachOptions) (0), 0, 5);
397 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
398 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
399 row++;
401 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(credits_scrollwin), table);
402 gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_widget_get_parent(table)), GTK_SHADOW_NONE);
403 gtk_widget_show_all(table);
404 label = gtk_label_new(_("Credits"));
405 gtk_widget_show(label);
406 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), credits_scrollwin, label);
408 /* create "License" tab */
409 license_scrollwin = gtk_scrolled_window_new(NULL, NULL);
410 gtk_container_set_border_width(GTK_CONTAINER(license_scrollwin), 6);
411 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(license_scrollwin),
412 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
413 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(license_scrollwin), GTK_SHADOW_IN);
414 license_textview = gtk_text_view_new();
415 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(license_textview), 2);
416 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(license_textview), 2);
417 gtk_text_view_set_editable(GTK_TEXT_VIEW(license_textview), FALSE);
418 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(license_textview), FALSE);
419 gtk_widget_show(license_textview);
420 gtk_container_add(GTK_CONTAINER(license_scrollwin), license_textview);
421 label = gtk_label_new(_("License"));
422 gtk_widget_show(label);
424 g_snprintf(buffer, sizeof(buffer), "%s" G_DIR_SEPARATOR_S "GPL-2", app->datadir);
426 g_file_get_contents(buffer, &license_text, NULL, NULL);
427 if (license_text == NULL)
429 license_text = g_strdup(
430 _("License text could not be found, please visit http://www.gnu.org/licenses/gpl-2.0.txt to view it online."));
432 tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(license_textview));
433 gtk_text_buffer_set_text(tb, license_text, -1);
435 g_free(license_text);
437 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), license_scrollwin, label);
439 gtk_widget_show_all(dialog);
440 return dialog;
444 void about_dialog_show(void)
446 GtkWidget *dialog;
448 dialog = create_dialog();
450 gtk_dialog_run(GTK_DIALOG(dialog));
451 gtk_widget_destroy(dialog);
455 static void homepage_clicked(GtkButton *button, gpointer data)
457 utils_open_browser(data);