diff --git a/src/Makefile b/src/Makefile index 9317642..753db92 100644 --- a/src/Makefile +++ b/src/Makefile @@ -35,13 +35,13 @@ download.o: download.c surfer.o: surfer.c callbacks.h surfer.h ../config.h $(CC) $(surfer_CFLAGS) -c surfer.c -ghtml.o: ghtml.c ghtml.h ghtml-gtkhtml.c ghtml-gtkmozembed.c ghtml-gtktextview.c +ghtml.o: ghtml.c ghtml.h ghtml-gtkhtml.c ghtml-gtkmozembed.c ghtml-gtktextview.c ../config.h $(CC) $(surfer_CFLAGS) -c ghtml.c -callbacks.o: callbacks.c surfer.h ghtml.h callbacks.h +callbacks.o: callbacks.c surfer.h ghtml.h callbacks.h ../config.h $(CC) $(surfer_CFLAGS) -c callbacks.c -main.o: main.c surfer.h +main.o: main.c surfer.h ../config.h $(CC) $(surfer_CFLAGS) -c main.c clean: diff --git a/src/callbacks.c b/src/callbacks.c index 4f2e472..00bd1ca 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -1,6 +1,6 @@ /* $Id$ */ static char const _copyright[] = -"Copyright (c) 2008 Pierre Pronchery "; +"Copyright (c) 2009 Pierre Pronchery "; /* This file is part of DeforaOS Desktop Surfer */ static char const _license[] = "Surfer is free software; you can redistribute it and/or modify it\n" @@ -49,6 +49,7 @@ gboolean on_closex(GtkWidget * widget, GdkEvent * event, gpointer data) } +#ifndef FOR_EMBEDDED /* file menu */ void on_file_close(GtkWidget * widget, gpointer data) { @@ -61,6 +62,7 @@ void on_file_close(GtkWidget * widget, gpointer data) } +/* on_file_new_window */ void on_file_new_window(GtkWidget * widget, gpointer data) { Surfer * surfer = data; @@ -71,42 +73,116 @@ void on_file_new_window(GtkWidget * widget, gpointer data) } -void on_file_refresh(GtkWidget * widget, gpointer data) +/* on_file_open */ +void on_file_open(GtkWidget * widget, gpointer data) { - Surfer * surfer = data; - - ghtml_reload(surfer->view); -} - - -void on_file_force_refresh(GtkWidget * widget, gpointer data) -{ - Surfer * surfer = data; - - ghtml_refresh(surfer->view); + /* FIXME implement */ } /* edit menu */ +/* on_edit_preferences */ void on_edit_preferences(GtkWidget * widget, gpointer data) { /* FIXME implement */ } +/* on_edit_select_all */ +void on_edit_select_all(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_select_all(surfer); +} + + +/* on_edit_unselect_all */ +void on_edit_unselect_all(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_unselect_all(surfer); +} + + +/* view menu */ +/* on_view_force_refresh */ +void on_view_force_refresh(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_refresh(surfer); +} + + +/* on_view_normal_size */ +void on_view_normal_size(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_zoom_reset(surfer); +} + + +/* on_view_page_source */ +void on_view_page_source(GtkWidget * widget, gpointer data) +{ + /* FIXME implement */ +} + + +/* on_view_refresh */ +void on_view_refresh(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_reload(surfer); +} + + +/* on_view_stop */ +void on_view_stop(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_stop(surfer); +} + + +/* on_view_zoom_in */ +void on_view_zoom_in(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_zoom_in(surfer); +} + + +/* on_view_zoom_out */ +void on_view_zoom_out(GtkWidget * widget, gpointer data) +{ + Surfer * surfer = data; + + surfer_zoom_out(surfer); +} + + /* help menu */ +/* on_help_about */ static gboolean _about_on_closex(GtkWidget * widget, GdkEvent * event, gpointer data); -#if !GTK_CHECK_VERSION(2, 6, 0) +# if !GTK_CHECK_VERSION(2, 6, 0) static void _about_on_close(GtkWidget * widget, gpointer data); static void _about_on_credits(GtkWidget * widget, gpointer data); static void _about_on_license(GtkWidget * widget, gpointer data); -#endif +# endif + void on_help_about(GtkWidget * widget, gpointer data) { Surfer * surfer = data; static GtkWidget * window = NULL; -#if GTK_CHECK_VERSION(2, 6, 0) +# if GTK_CHECK_VERSION(2, 6, 0) gsize cnt = 65536; gchar * buf; @@ -140,7 +216,7 @@ void on_help_about(GtkWidget * widget, gpointer data) gtk_widget_hide), NULL); gtk_widget_show(window); } -#else +# else GtkWidget * vbox; GtkWidget * hbox; GtkWidget * button; @@ -179,7 +255,7 @@ void on_help_about(GtkWidget * widget, gpointer data) gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(window); } -#endif +# endif static gboolean _about_on_closex(GtkWidget * widget, GdkEvent * event, gpointer data) @@ -188,7 +264,7 @@ static gboolean _about_on_closex(GtkWidget * widget, GdkEvent * event, return TRUE; } -#if !GTK_CHECK_VERSION(2, 6, 0) +# if !GTK_CHECK_VERSION(2, 6, 0) static void _about_on_close(GtkWidget * widget, gpointer data) { GtkWidget * window = data; @@ -293,7 +369,8 @@ static void _about_on_license(GtkWidget * widget, gpointer data) gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(window); } -#endif +# endif /* !GTK_CHECK_VERSION(2, 6, 0) */ +#endif /* !FOR_EMBEDDED */ /* toolbar */ diff --git a/src/callbacks.h b/src/callbacks.h index c108dbc..b998c98 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -24,17 +24,29 @@ /* window */ gboolean on_closex(GtkWidget * widget, GdkEvent * event, gpointer data); +#ifndef FOR_EMBEDDED /* file menu */ void on_file_close(GtkWidget * widget, gpointer data); void on_file_new_window(GtkWidget * widget, gpointer data); -void on_file_refresh(GtkWidget * widget, gpointer data); -void on_file_force_refresh(GtkWidget * widget, gpointer data); +void on_file_open(GtkWidget * widget, gpointer data); /* edit menu */ void on_edit_preferences(GtkWidget * widget, gpointer data); +void on_edit_select_all(GtkWidget * widget, gpointer data); +void on_edit_unselect_all(GtkWidget * widget, gpointer data); + +/* view menu */ +void on_view_zoom_in(GtkWidget * widget, gpointer data); +void on_view_zoom_out(GtkWidget * widget, gpointer data); +void on_view_normal_size(GtkWidget * widget, gpointer data); +void on_view_refresh(GtkWidget * widget, gpointer data); +void on_view_force_refresh(GtkWidget * widget, gpointer data); +void on_view_stop(GtkWidget * widget, gpointer data); +void on_view_page_source(GtkWidget * widget, gpointer data); /* help menu */ void on_help_about(GtkWidget * widget, gpointer data); +#endif /* !FOR_EMBEDDED */ /* toolbar */ void on_back(GtkWidget * widget, gpointer data); diff --git a/src/ghtml-gtkhtml.c b/src/ghtml-gtkhtml.c index 7c2c196..6ea3bdb 100644 --- a/src/ghtml-gtkhtml.c +++ b/src/ghtml-gtkhtml.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2008 Pierre Pronchery */ +/* Copyright (c) 2009 Pierre Pronchery */ /* This file is part of DeforaOS Desktop Surfer */ /* Surfer is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 as published by the Free @@ -12,12 +12,18 @@ * You should have received a copy of the GNU General Public License along with * Surfer; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA */ +/* TODO: + * - fix URL generation for relative path + * - progressive file load + * - update the URL and title of the main window + * - implement selection */ #include +#include #include -#include +#include #define GNET_EXPERIMENTAL #include #include "ghtml.h" @@ -40,6 +46,8 @@ typedef struct _GHtml /* prototypes */ static gboolean _ghtml_document_load(GHtml * ghtml, gchar const * base, gchar const * url); +static gchar * _ghtml_make_url(gchar const * base, gchar const * url); + /* callbacks */ static void _on_link_clicked(HtmlDocument * document, const gchar * url); static void _on_request_url(HtmlDocument * document, const gchar * url, @@ -144,7 +152,7 @@ void ghtml_load_url(GtkWidget * widget, char const * url) fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, url); #endif ghtml = g_object_get_data(G_OBJECT(widget), "ghtml"); - if(_ghtml_document_load(ghtml, "", url) != TRUE) + if(_ghtml_document_load(ghtml, NULL, url) != TRUE) return; /* FIXME with current code another base may have been set in between */ g_free(ghtml->html_base); @@ -161,7 +169,7 @@ void ghtml_refresh(GtkWidget * widget) if(ghtml->html_base == NULL) return; /* FIXME should differentiate URL and base */ - _ghtml_document_load(ghtml, "", ghtml->html_base); + _ghtml_document_load(ghtml, NULL, ghtml->html_base); } @@ -172,12 +180,60 @@ void ghtml_reload(GtkWidget * ghtml) } +/* ghtml_select_all */ +void ghtml_select_all(GtkWidget * ghtml) +{ + /* FIXME implement */ +} + + +/* ghtml_stop */ void ghtml_stop(GtkWidget * ghtml) { /* FIXME implement */ } +/* ghtml_unselect_all */ +void ghtml_unselect_all(GtkWidget * widget) +{ + GHtml * ghtml; + + ghtml = g_object_get_data(G_OBJECT(widget), "ghtml"); + html_selection_clear(HTML_VIEW(ghtml->html_view)); +} + + +/* ghtml_zoom_in */ +void ghtml_zoom_in(GtkWidget * widget) +{ + GHtml * ghtml; + + ghtml = g_object_get_data(G_OBJECT(widget), "ghtml"); + html_view_zoom_in(HTML_VIEW(ghtml->html_view)); +} + + +/* ghtml_zoom_out */ +void ghtml_zoom_out(GtkWidget * widget) +{ + GHtml * ghtml; + + ghtml = g_object_get_data(G_OBJECT(widget), "ghtml"); + html_view_zoom_out(HTML_VIEW(ghtml->html_view)); +} + + +/* ghtml_zoom_reset */ +void ghtml_zoom_reset(GtkWidget * widget) +{ + GHtml * ghtml; + + ghtml = g_object_get_data(G_OBJECT(widget), "ghtml"); + html_view_zoom_reset(HTML_VIEW(ghtml->html_view)); +} + + /* private */ /* functions */ /* ghtml_document_load */ @@ -205,26 +261,59 @@ static gboolean _ghtml_document_load(GHtml * ghtml, gchar const * base, static gboolean _load_write_stream(HtmlStream * stream, gchar const * base, gchar const * url) { + gchar * u; gchar * buf = NULL; gsize len = 0; guint response; + gboolean error; - url = rfc1738_make_full_url(base, url); + if((u = _ghtml_make_url(base, url)) == NULL) + return FALSE; #ifdef DEBUG - fprintf(stderr, "DEBUG: %s() url=\"%s\"\n", __func__, url); -#endif - if(gnet_http_get(url, &buf, &len, &response) != TRUE) - { -#ifdef DEBUG - fprintf(stderr, "DEBUG: gnet_http_get() => %u\n", response); + fprintf(stderr, "DEBUG: %s() url=\"%s\"\n", __func__, u); #endif + if(u[0] == '/') + error = g_file_get_contents(u, &buf, &len, NULL) == FALSE; + else if(strncmp("file:/", u, 6) == 0) + error = g_file_get_contents(&u[5], &buf, &len, NULL) == FALSE; + /* XXX assuming the rest is http */ + else + error = gnet_http_get(u, &buf, &len, &response) != TRUE; + g_free(u); + if(error) return FALSE; /* FIXME report error */ - } html_stream_write(stream, buf, len); return TRUE; } +/* ghtml_make_url */ +static gchar * _ghtml_make_url(gchar const * base, gchar const * url) +{ + if(url == NULL) + return NULL; + /* XXX use a more generic protocol finder (strchr(':')) */ + if(strncmp("http://", url, 7) == 0) + return g_strdup(url); + if(strncmp("ftp://", url, 6) == 0) + return g_strdup(url); + if(base != NULL) + { + if(url[0] == '/') + /* FIXME construct from / */ + return g_strdup_printf("%s%s", base, url); + /* FIXME construct from last / */ + return g_strdup_printf("%s/%s", base, url); + } + /* base is NULL, url is not NULL */ + if(strncmp("ftp", url, 3) == 0) + return g_strdup_printf("%s%s", "ftp://", url); + if(url[0] == '/') + return g_strdup(url); + return g_strdup_printf("%s%s", "http://", url); +} + + /* callbacks */ static void _on_link_clicked(HtmlDocument * document, const gchar * url) { diff --git a/src/ghtml-gtkmozembed.c b/src/ghtml-gtkmozembed.c index b344574..8dd2bc6 100644 --- a/src/ghtml-gtkmozembed.c +++ b/src/ghtml-gtkmozembed.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2008 Pierre Pronchery */ +/* Copyright (c) 2009 Pierre Pronchery */ /* This file is part of DeforaOS Desktop Surfer */ /* Surfer is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 as published by the Free @@ -407,8 +407,43 @@ void ghtml_reload(GtkWidget * ghtml) } +/* ghtml_select_all */ +void ghtml_select_all(GtkWidget * ghtml) +{ + /* FIXME implement */ +} + + /* ghtml_stop */ void ghtml_stop(GtkWidget * ghtml) { gtk_moz_embed_stop_load(GTK_MOZ_EMBED(ghtml)); } + + +/* ghtml_unselect_all */ +void ghtml_unselect_all(GtkWidget * ghtml) +{ + /* FIXME implement */ +} + + +/* ghtml_zoom_in */ +void ghtml_zoom_in(GtkWidget * ghtml) +{ + /* FIXME implement */ +} + + +/* ghtml_zoom_out */ +void ghtml_zoom_out(GtkWidget * ghtml) +{ + /* FIXME implement */ +} + + +/* ghtml_zoom_reset */ +void ghtml_zoom_reset(GtkWidget * ghtml) +{ + /* FIXME implement */ +} diff --git a/src/ghtml.h b/src/ghtml.h index 824ee0a..b012363 100644 --- a/src/ghtml.h +++ b/src/ghtml.h @@ -48,4 +48,11 @@ void ghtml_refresh(GtkWidget * ghtml); void ghtml_reload(GtkWidget * ghtml); void ghtml_stop(GtkWidget * ghtml); +void ghtml_select_all(GtkWidget * ghtml); +void ghtml_unselect_all(GtkWidget * ghtml); + +void ghtml_zoom_in(GtkWidget * ghtml); +void ghtml_zoom_out(GtkWidget * ghtml); +void ghtml_zoom_reset(GtkWidget * ghtml); + #endif /* !SURFER_GHTML_H */ diff --git a/src/project.conf b/src/project.conf index 183779d..1dbb1ef 100644 --- a/src/project.conf +++ b/src/project.conf @@ -23,13 +23,13 @@ sources=surfer.c,ghtml.c,callbacks.c,main.c install=$(BINDIR) [callbacks.c] -depends=surfer.h,ghtml.h,callbacks.h +depends=surfer.h,ghtml.h,callbacks.h,../config.h [ghtml.c] -depends=ghtml.h,ghtml-gtkhtml.c,ghtml-gtkmozembed.c,ghtml-gtktextview.c +depends=ghtml.h,ghtml-gtkhtml.c,ghtml-gtkmozembed.c,ghtml-gtktextview.c,../config.h [main.c] -depends=surfer.h +depends=surfer.h,../config.h [surfer.c] depends=callbacks.h,surfer.h,../config.h diff --git a/src/surfer.c b/src/surfer.c index 78fb7f8..e5ea1e8 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2008 Pierre Pronchery */ +/* Copyright (c) 2009 Pierre Pronchery */ /* This file is part of DeforaOS Desktop Surfer */ /* Surfer is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 as published by the Free @@ -25,6 +25,7 @@ /* Surfer */ /* types */ +#ifndef FOR_EMBEDDED struct _menu { char * name; @@ -39,15 +40,14 @@ struct _menubar struct _menu * menu; }; + /* variables */ static struct _menu _menu_file[] = { { "_New window", G_CALLBACK(on_file_new_window), "window-new", GDK_N }, - { "", NULL, NULL, 0 }, - { "_Refresh", G_CALLBACK(on_file_refresh), GTK_STOCK_REFRESH, - GDK_R }, - { "_Force refresh", G_CALLBACK(on_file_force_refresh), NULL, 0 }, + { "_Open...", G_CALLBACK(on_file_open), GTK_STOCK_OPEN, + GDK_O }, { "", NULL, NULL, 0 }, { "_Close", G_CALLBACK(on_file_close), GTK_STOCK_CLOSE, GDK_W }, @@ -56,11 +56,38 @@ static struct _menu _menu_file[] = static struct _menu _menu_edit[] = { + { "_Cut", NULL, GTK_STOCK_CUT, GDK_X }, + { "Cop_y", NULL, GTK_STOCK_COPY, GDK_C }, + { "_Paste", NULL, GTK_STOCK_PASTE, GDK_V }, + { "", NULL, NULL, 0 }, + { "Select _all", G_CALLBACK(on_edit_select_all), + GTK_STOCK_SELECT_ALL, GDK_A }, + { "Unselect all", G_CALLBACK(on_edit_unselect_all), NULL, 0 }, + { "", NULL, NULL, 0 }, { "_Preferences", G_CALLBACK(on_edit_preferences), GTK_STOCK_PREFERENCES, GDK_P }, { NULL, NULL, NULL, 0 } }; +static struct _menu _menu_view[] = +{ + { "Zoom in", G_CALLBACK(on_view_zoom_in), "zoom-in", + GDK_plus }, + { "Zoom out", G_CALLBACK(on_view_zoom_out), "zoom-out", + GDK_minus }, + { "Normal size", G_CALLBACK(on_view_normal_size), "zoom-1", + GDK_0 }, + { "", NULL, NULL, 0 }, + { "_Refresh", G_CALLBACK(on_view_refresh), GTK_STOCK_REFRESH, + GDK_R }, + { "_Force refresh", G_CALLBACK(on_view_force_refresh), NULL, 0 }, + { "_Stop", G_CALLBACK(on_view_stop), GTK_STOCK_STOP, 0 }, + { "", NULL, NULL, 0 }, + { "Page so_urce", G_CALLBACK(on_view_page_source), + "stock_view-html-source", GDK_U }, + { NULL, NULL, NULL, 0 } +}; + static struct _menu _menu_help[] = { { "_About", G_CALLBACK(on_help_about), @@ -76,14 +103,18 @@ static struct _menubar _menubar[] = { { "_File", _menu_file }, { "_Edit", _menu_edit }, + { "_View", _menu_view }, { "_Help", _menu_help }, { NULL, NULL } }; +#endif /* !FOR_EMBEDDED */ unsigned int surfer_cnt = 0; /* functions */ +#ifndef FOR_EMBEDDED static GtkWidget * _new_menubar(Surfer * surfer); +#endif Surfer * surfer_new(char const * url) { @@ -102,9 +133,11 @@ Surfer * surfer_new(char const * url) g_signal_connect(G_OBJECT(surfer->window), "delete_event", G_CALLBACK( on_closex), surfer); vbox = gtk_vbox_new(FALSE, 0); +#ifndef FOR_EMBEDDED /* menubar */ surfer->menubar = _new_menubar(surfer); gtk_box_pack_start(GTK_BOX(vbox), surfer->menubar, FALSE, FALSE, 0); +#endif /* toolbar */ toolbar = gtk_toolbar_new(); surfer->tb_back = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK); @@ -121,10 +154,8 @@ Surfer * surfer_new(char const * url) surfer->tb_stop = gtk_tool_button_new_from_stock(GTK_STOCK_STOP); g_signal_connect(G_OBJECT(surfer->tb_stop), "clicked", G_CALLBACK( on_stop), surfer); - gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), FALSE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), surfer->tb_stop, -1); surfer->tb_refresh = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH); - gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_refresh), FALSE); g_signal_connect(G_OBJECT(surfer->tb_refresh), "clicked", G_CALLBACK( on_refresh), surfer); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), surfer->tb_refresh, -1); @@ -191,6 +222,7 @@ Surfer * surfer_new(char const * url) return surfer; } +#ifndef FOR_EMBEDDED static GtkWidget * _new_menubar(Surfer * surfer) { GtkWidget * tb_menubar; @@ -249,6 +281,7 @@ static GtkWidget * _new_menubar(Surfer * surfer) } return tb_menubar; } +#endif /* !FOR_EMBEDDED */ /* surfer_delete */ @@ -274,3 +307,59 @@ int surfer_error(Surfer * surfer, char const * message, int ret) gtk_widget_show(dialog); return ret; } + + +/* surfer_refresh */ +void surfer_refresh(Surfer * surfer) +{ + ghtml_refresh(surfer->view); +} + + +/* surfer_reload */ +void surfer_reload(Surfer * surfer) +{ + ghtml_reload(surfer->view); +} + + +/* surfer_select_all */ +void surfer_select_all(Surfer * surfer) +{ + ghtml_select_all(surfer->view); +} + + +/* surfer_stop */ +void surfer_stop(Surfer * surfer) +{ + ghtml_stop(surfer->view); +} + + +/* surfer_unselect_all */ +void surfer_unselect_all(Surfer * surfer) +{ + ghtml_unselect_all(surfer->view); +} + + +/* surfer_zoom_in */ +void surfer_zoom_in(Surfer * surfer) +{ + ghtml_zoom_in(surfer->view); +} + + +/* surfer_zoom_out */ +void surfer_zoom_out(Surfer * surfer) +{ + ghtml_zoom_out(surfer->view); +} + + +/* surfer_zoom_reset */ +void surfer_zoom_reset(Surfer * surfer) +{ + ghtml_zoom_reset(surfer->view); +} diff --git a/src/surfer.h b/src/surfer.h index 500a141..affa4d8 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -68,4 +68,15 @@ void surfer_delete(Surfer * surfer); /* useful */ int surfer_error(Surfer * surfer, char const * message, int ret); +void surfer_refresh(Surfer * surfer); +void surfer_reload(Surfer * surfer); +void surfer_stop(Surfer * surfer); + +void surfer_select_all(Surfer * surfer); +void surfer_unselect_all(Surfer * surfer); + +void surfer_zoom_in(Surfer * surfer); +void surfer_zoom_out(Surfer * surfer); +void surfer_zoom_reset(Surfer * surfer); + #endif /* !SURFER_SURFER_H */