Add the user guide to the Help menu

The old GLib put up a good fight, it says "URIs not supported"
even for the file:// scheme.
This commit is contained in:
Přemysl Eric Janouch 2021-10-25 00:59:01 +02:00
parent 384dad7bd8
commit da0a5c43dc
Signed by: p
GPG Key ID: A0420B94F92B9493
3 changed files with 81 additions and 0 deletions

View File

@ -16,11 +16,14 @@
#ifdef OPTION_NOINSTALL #ifdef OPTION_NOINSTALL
/* For developers. */ /* For developers. */
#define PROJECT_DOC_DIR "${CMAKE_SOURCE_DIR}/docs/"
#define PROJECT_SHARE_DIR "${CMAKE_SOURCE_DIR}/share/" #define PROJECT_SHARE_DIR "${CMAKE_SOURCE_DIR}/share/"
#define PROJECT_GSETTINGS_DIR "${CMAKE_BINARY_DIR}" #define PROJECT_GSETTINGS_DIR "${CMAKE_BINARY_DIR}"
#elif defined (_WIN32) #elif defined (_WIN32)
#define PROJECT_DOC_DIR "share/doc/${PROJECT_NAME}/"
#define PROJECT_SHARE_DIR "share/${PROJECT_NAME}/" #define PROJECT_SHARE_DIR "share/${PROJECT_NAME}/"
#else #else
#define PROJECT_DOC_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}/"
#define PROJECT_SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/" #define PROJECT_SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/"
#endif #endif

View File

@ -36,6 +36,7 @@
<menuitem action="NormalSize" /> <menuitem action="NormalSize" />
</menu> </menu>
<menu name="HelpMenu" action="HelpMenu"> <menu name="HelpMenu" action="HelpMenu">
<menuitem action="UserGuide" />
<menuitem action="About" /> <menuitem action="About" />
</menu> </menu>
</menubar> </menubar>

View File

@ -100,6 +100,7 @@ static void on_action_open (GtkAction *action, LdWindowMain *self);
static void on_action_save (GtkAction *action, LdWindowMain *self); static void on_action_save (GtkAction *action, LdWindowMain *self);
static void on_action_save_as (GtkAction *action, LdWindowMain *self); static void on_action_save_as (GtkAction *action, LdWindowMain *self);
static void on_action_quit (GtkAction *action, LdWindowMain *self); static void on_action_quit (GtkAction *action, LdWindowMain *self);
static void on_action_user_guide (GtkAction *action, LdWindowMain *self);
static void on_action_about (GtkAction *action, LdWindowMain *self); static void on_action_about (GtkAction *action, LdWindowMain *self);
static void on_action_undo (GtkAction *action, LdWindowMain *self); static void on_action_undo (GtkAction *action, LdWindowMain *self);
@ -176,6 +177,9 @@ static GtkActionEntry wm_action_entries[] =
G_CALLBACK (on_action_normal_size)}, G_CALLBACK (on_action_normal_size)},
{"HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL}, {"HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL},
{"UserGuide", GTK_STOCK_HELP, N_("_User Guide"), NULL,
N_("Open the manual"),
G_CALLBACK (on_action_user_guide)},
{"About", GTK_STOCK_ABOUT, N_("_About"), NULL, {"About", GTK_STOCK_ABOUT, N_("_About"), NULL,
N_("Show a dialog about this application"), N_("Show a dialog about this application"),
G_CALLBACK (on_action_about)} G_CALLBACK (on_action_about)}
@ -973,6 +977,79 @@ on_action_quit (GtkAction *action, LdWindowMain *self)
gtk_widget_destroy (GTK_WIDGET (self)); gtk_widget_destroy (GTK_WIDGET (self));
} }
static GFile *
user_guide_path (const gchar *language)
{
gchar *filename, *path;
GFile *file;
filename = g_strdup_printf ("user-guide-%s.html", language);
path = g_build_filename (PROJECT_DOC_DIR, "user-guide", filename, NULL);
g_free (filename);
file = g_file_new_for_path (path);
g_free (path);
return file;
}
static gboolean
open_file (GFile *file, GdkScreen *screen, GError **error)
{
GdkDisplay *display;
GAppInfo *app_info;
GdkAppLaunchContext *context;
GList link;
gboolean success;
/* GLib 2.36.1 prevents us from using gtk_show_uri() on Windows XP. */
if (!(app_info = g_file_query_default_handler (file, NULL, error)))
return FALSE;
link.next = link.prev = NULL;
link.data = file;
display = gdk_screen_get_display (screen);
context = gdk_display_get_app_launch_context (display);
gdk_app_launch_context_set_screen (context, screen);
success = g_app_info_launch (app_info,
&link, G_APP_LAUNCH_CONTEXT (context), error);
g_object_unref (context);
return success;
}
static void
on_action_user_guide (GtkAction *action, LdWindowMain *self)
{
const gchar *const *iter;
GFile *file;
GError *error = NULL;
/* Look for a usable language variant, or fall back to the lingua franca. */
for (iter = g_get_language_names (); *iter; iter++)
{
if (g_file_query_exists ((file = user_guide_path (*iter)), NULL))
break;
g_object_unref (file);
}
if (!*iter)
file = user_guide_path ("en");
if (!open_file (file, gtk_window_get_screen (GTK_WINDOW (self)), &error))
{
GtkWidget *message_dialog;
message_dialog = gtk_message_dialog_new (GTK_WINDOW (self),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
_("Failed to open the user guide"));
gtk_message_dialog_format_secondary_text
(GTK_MESSAGE_DIALOG (message_dialog), "%s", error->message);
g_error_free (error);
gtk_dialog_run (GTK_DIALOG (message_dialog));
gtk_widget_destroy (message_dialog);
}
g_object_unref (file);
}
static void static void
on_action_about (GtkAction *action, LdWindowMain *self) on_action_about (GtkAction *action, LdWindowMain *self)
{ {