Also allow API pages to be opened

This commit is contained in:
Pierre Pronchery 2012-05-29 19:16:48 +00:00
parent 78623bfeef
commit 6d9e2832a1

View File

@ -1,17 +1,19 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */ static char const _copyright[] =
"Copyright (c) 2012 Pierre Pronchery <khorben@defora.org>";
/* This file is part of DeforaOS Desktop Surfer */ /* This file is part of DeforaOS Desktop Surfer */
/* This program is free software: you can redistribute it and/or modify static char const _license[] =
* it under the terms of the GNU General Public License as published by "This program is free software: you can redistribute it and/or modify\n"
* the Free Software Foundation, version 3 of the License. "it under the terms of the GNU General Public License as published by\n"
* "the Free Software Foundation, version 3 of the License.\n"
* This program is distributed in the hope that it will be useful, "\n"
* but WITHOUT ANY WARRANTY; without even the implied warranty of "This program is distributed in the hope that it will be useful,\n"
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
* GNU General Public License for more details. "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
* "GNU General Public License for more details.\n"
* You should have received a copy of the GNU General Public License "\n"
* along with this program. If not, see <http://www.gnu.org/licenses/>. */ "You should have received a copy of the GNU General Public License\n"
"along with this program. If not, see <http://www.gnu.org/licenses/>.";
@ -47,11 +49,18 @@ struct _Surfer
GtkWidget * window; GtkWidget * window;
GtkWidget * menubar; GtkWidget * menubar;
GtkWidget * view; GtkWidget * view;
GtkWidget * ab_window;
}; };
/* prototypes */ /* prototypes */
static int _helper(int section, char const * name); static int _helper(char const * page);
static int _helper_contents(char const * package);
static int _helper_man(int section, char const * page);
static int _helper_devel(char const * package);
static int _usage(void);
/* callbacks */ /* callbacks */
static gboolean _helper_on_closex(void); static gboolean _helper_on_closex(void);
static void _helper_on_file_close(void); static void _helper_on_file_close(void);
@ -61,6 +70,12 @@ static void _helper_on_view_fullscreen(gpointer data);
/* constants */ /* constants */
static char const * _authors[] =
{
"Pierre Pronchery <khorben@defora.org>",
NULL
};
static const DesktopMenu _menu_file[] = static const DesktopMenu _menu_file[] =
{ {
{ "Close", G_CALLBACK(_helper_on_file_close), GTK_STOCK_CLOSE, { "Close", G_CALLBACK(_helper_on_file_close), GTK_STOCK_CLOSE,
@ -97,14 +112,13 @@ static const DesktopMenubar _helper_menubar[] =
/* functions */ /* functions */
/* helper */ /* helper */
static int _helper(int section, char const * name) static int _helper(char const * page)
{ {
Helper * helper; Helper * helper;
GtkAccelGroup * group; GtkAccelGroup * group;
GtkWidget * vbox; GtkWidget * vbox;
GtkToolItem * toolitem; GtkToolItem * toolitem;
GtkWidget * widget; GtkWidget * widget;
char buf[256];
if((helper = object_new(sizeof(*helper))) == NULL) if((helper = object_new(sizeof(*helper))) == NULL)
return -1; return -1;
@ -116,8 +130,7 @@ static int _helper(int section, char const * name)
#if GTK_CHECK_VERSION(2, 6, 0) #if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(helper->window), "help-browser"); gtk_window_set_icon_name(GTK_WINDOW(helper->window), "help-browser");
#endif #endif
snprintf(buf, sizeof(buf), "%s - %s", "Helper", name); gtk_window_set_title(GTK_WINDOW(helper->window), "Helper");
gtk_window_set_title(GTK_WINDOW(helper->window), buf);
g_signal_connect_swapped(helper->window, "delete-event", G_CALLBACK( g_signal_connect_swapped(helper->window, "delete-event", G_CALLBACK(
_helper_on_closex), NULL); _helper_on_closex), NULL);
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
@ -139,24 +152,15 @@ static int _helper(int section, char const * name)
/* view */ /* view */
helper->view = ghtml_new(helper); helper->view = ghtml_new(helper);
ghtml_set_enable_javascript(helper->view, FALSE); ghtml_set_enable_javascript(helper->view, FALSE);
if(section > 0 && section < 10)
/* read a manual page */
snprintf(buf, sizeof(buf), "%s%d%s%s%s",
"file://" DATADIR "/man/html", section, "/",
name, ".html");
else
/* read a package document */
snprintf(buf, sizeof(buf), "%s%s%s%s%s",
"file://" DATADIR "/doc/html/", name, "/", name,
".html");
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, buf); fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, buf);
#endif #endif
ghtml_load_url(helper->view, buf); ghtml_load_url(helper->view, page);
gtk_box_pack_start(GTK_BOX(vbox), helper->view, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), helper->view, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(helper->window), vbox); gtk_container_add(GTK_CONTAINER(helper->window), vbox);
gtk_widget_grab_focus(helper->view); gtk_widget_grab_focus(helper->view);
gtk_widget_show_all(helper->window); gtk_widget_show_all(helper->window);
helper->ab_window = NULL;
gtk_main(); gtk_main();
/* delete everything */ /* delete everything */
object_delete(helper); object_delete(helper);
@ -164,6 +168,44 @@ static int _helper(int section, char const * name)
} }
/* helper_contents */
static int _helper_contents(char const * package)
{
char buf[256];
/* read a package documentation */
snprintf(buf, sizeof(buf), "%s%s%s%s%s", "file://" DATADIR "/doc/html/",
package, "/", package, ".html");
return _helper(buf);
}
/* helper_devel */
static int _helper_devel(char const * package)
{
char buf[256];
/* read a package API documentation */
snprintf(buf, sizeof(buf), "%s%s%s", "file://" DATADIR "/gtk-doc/html/",
package, "/index.html");
return _helper(buf);
}
/* helper_man */
static int _helper_man(int section, char const * page)
{
char buf[256];
if(section > 0 && section < 10)
return _usage();
/* read a manual page */
snprintf(buf, sizeof(buf), "%s%d%s%s%s", "file://" DATADIR "/man/html",
section, "/", page, ".html");
return _helper(buf);
}
/* callbacks */ /* callbacks */
/* helper_on_closex */ /* helper_on_closex */
static gboolean _helper_on_closex(void) static gboolean _helper_on_closex(void)
@ -200,9 +242,40 @@ static void _helper_on_fullscreen(gpointer data)
/* helper_on_help_about */ /* helper_on_help_about */
static gboolean _about_on_closex(gpointer data);
static void _helper_on_help_about(gpointer data) static void _helper_on_help_about(gpointer data)
{ {
/* FIXME implement */ Helper * helper = data;
if(helper->ab_window != NULL)
{
gtk_window_present(GTK_WINDOW(helper->ab_window));
return;
}
helper->ab_window = desktop_about_dialog_new();
gtk_window_set_transient_for(GTK_WINDOW(helper->ab_window), GTK_WINDOW(
helper->window));
desktop_about_dialog_set_authors(helper->ab_window, _authors);
desktop_about_dialog_set_comments(helper->ab_window,
"Online help for the DeforaOS desktop");
desktop_about_dialog_set_copyright(helper->ab_window, _copyright);
desktop_about_dialog_set_logo_icon_name(helper->ab_window,
"help-browser");
desktop_about_dialog_set_license(helper->ab_window, _license);
desktop_about_dialog_set_name(helper->ab_window, PACKAGE);
desktop_about_dialog_set_version(helper->ab_window, VERSION);
g_signal_connect_swapped(G_OBJECT(helper->ab_window), "delete-event",
G_CALLBACK(_about_on_closex), helper);
gtk_widget_show(helper->ab_window);
}
static gboolean _about_on_closex(gpointer data)
{
Helper * helper = data;
gtk_widget_hide(helper->ab_window);
return TRUE;
} }
@ -218,7 +291,7 @@ static void _helper_on_view_fullscreen(gpointer data)
/* usage */ /* usage */
static int _usage(void) static int _usage(void)
{ {
fputs("Usage: helper package\n" fputs("Usage: helper [-c|-d] package\n"
" helper -s section page\n" " helper -s section page\n"
" -s Section of the manual page\n", stderr); " -s Section of the manual page\n", stderr);
return 1; return 1;
@ -481,13 +554,22 @@ void surfer_warning(Surfer * surfer, char const * message)
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
int o; int o;
int devel = 0;
int section = -1; int section = -1;
char * p; char * p;
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
while((o = getopt(argc, argv, "s:")) != -1) while((o = getopt(argc, argv, "cds:")) != -1)
switch(o) switch(o)
{ {
case 'c':
section = -1;
devel = 0;
break;
case 'd':
section = -1;
devel = 1;
break;
case 's': case 's':
section = strtol(optarg, &p, 10); section = strtol(optarg, &p, 10);
if(optarg[0] == '\0' || *p != '\0' if(optarg[0] == '\0' || *p != '\0'
@ -499,5 +581,9 @@ int main(int argc, char * argv[])
} }
if(optind + 1 != argc) if(optind + 1 != argc)
return _usage(); return _usage();
return (_helper(section, argv[optind]) == 0) ? 0 : 2; if(section > 0)
return (_helper_man(section, argv[optind]) == 0) ? 0 : 2;
else if(devel != 0)
return (_helper_devel(argv[optind]) == 0) ? 0 : 2;
return (_helper_contents(argv[optind]) == 0) ? 0 : 2;
} }