- GtkAboutDialog * const dlg = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
- gtk_about_dialog_set_name(dlg, info.GetName());
- if ( info.HasVersion() )
- gtk_about_dialog_set_version(dlg, info.GetVersion());
- if ( info.HasCopyright() )
- gtk_about_dialog_set_copyright(dlg, info.GetCopyright());
- if ( info.HasDescription() )
- gtk_about_dialog_set_comments(dlg, info.GetDescription());
- if ( info.HasLicence() )
- gtk_about_dialog_set_license(dlg, info.GetLicence());
-
- wxIcon icon = info.GetIcon();
- if ( icon.Ok() )
- gtk_about_dialog_set_logo(dlg, info.GetIcon().GetPixbuf());
-
- if ( info.HasWebSite() )
+ wxLaunchDefaultBrowser(wxGTK_CONV_BACK_SYS(link));
+ return true;
+ }
+ return false;
+}
+}
+#else
+extern "C" {
+static void wxGtkAboutDialogOnLink(GtkAboutDialog*, const char* link, void*)
+{
+ wxLaunchDefaultBrowser(wxGTK_CONV_BACK_SYS(link));
+}
+}
+#endif
+
+void wxAboutBox(const wxAboutDialogInfo& info, wxWindow* WXUNUSED(parent))
+{
+ // don't create another dialog if one is already present
+ if ( !gs_aboutDialog )
+ gs_aboutDialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
+
+ GtkAboutDialog * const dlg = gs_aboutDialog;
+ gtk_about_dialog_set_program_name(dlg, wxGTK_CONV_SYS(info.GetName()));
+ if ( info.HasVersion() )
+ gtk_about_dialog_set_version(dlg, wxGTK_CONV_SYS(info.GetVersion()));
+ else
+ gtk_about_dialog_set_version(dlg, NULL);
+ if ( info.HasCopyright() )
+ gtk_about_dialog_set_copyright(dlg, wxGTK_CONV_SYS(info.GetCopyrightToDisplay()));
+ else
+ gtk_about_dialog_set_copyright(dlg, NULL);
+ if ( info.HasDescription() )
+ gtk_about_dialog_set_comments(dlg, wxGTK_CONV_SYS(info.GetDescription()));
+ else
+ gtk_about_dialog_set_comments(dlg, NULL);
+ if ( info.HasLicence() )
+ gtk_about_dialog_set_license(dlg, wxGTK_CONV_SYS(info.GetLicence()));
+ else
+ gtk_about_dialog_set_license(dlg, NULL);
+
+ wxIcon icon = info.GetIcon();
+ if ( icon.IsOk() )
+ gtk_about_dialog_set_logo(dlg, info.GetIcon().GetPixbuf());
+
+ if ( info.HasWebSite() )
+ {
+#ifdef __WXGTK3__
+ g_signal_connect(dlg, "activate-link", G_CALLBACK(activate_link), dlg);
+#else
+ // NB: must be called before gtk_about_dialog_set_website() as
+ // otherwise it has no effect (although GTK+ docs don't mention
+ // this...)
+ gtk_about_dialog_set_url_hook(wxGtkAboutDialogOnLink, NULL, NULL);
+#endif
+
+ gtk_about_dialog_set_website(dlg, wxGTK_CONV_SYS(info.GetWebSiteURL()));
+ gtk_about_dialog_set_website_label
+ (
+ dlg,
+ wxGTK_CONV_SYS(info.GetWebSiteDescription())
+ );
+ }
+ else
+ {
+ gtk_about_dialog_set_website(dlg, NULL);
+ gtk_about_dialog_set_website_label(dlg, NULL);
+#ifdef __WXGTK3__
+ g_signal_connect(dlg, "activate-link", G_CALLBACK(activate_link), NULL);
+#else
+ gtk_about_dialog_set_url_hook(NULL, NULL, NULL);
+#endif
+ }
+
+ if ( info.HasDevelopers() )
+ gtk_about_dialog_set_authors(dlg, GtkArray(info.GetDevelopers()));
+ else
+ gtk_about_dialog_set_authors(dlg, GtkArray());
+ if ( info.HasDocWriters() )
+ gtk_about_dialog_set_documenters(dlg, GtkArray(info.GetDocWriters()));
+ else
+ gtk_about_dialog_set_documenters(dlg, GtkArray());
+ if ( info.HasArtists() )
+ gtk_about_dialog_set_artists(dlg, GtkArray(info.GetArtists()));
+ else
+ gtk_about_dialog_set_artists(dlg, GtkArray());
+
+ wxString transCredits;
+ if ( info.HasTranslators() )
+ {
+ const wxArrayString& translators = info.GetTranslators();
+ const size_t count = translators.size();
+ for ( size_t n = 0; n < count; n++ )