Minor improvements

This commit is contained in:
Pierre Pronchery 2009-02-22 21:24:37 +00:00
parent 4a77cbc3f4
commit 15aa31d3c8
9 changed files with 368 additions and 48 deletions

View File

@ -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:

View File

@ -1,6 +1,6 @@
/* $Id$ */
static char const _copyright[] =
"Copyright (c) 2008 Pierre Pronchery <khorben@defora.org>";
"Copyright (c) 2009 Pierre Pronchery <khorben@defora.org>";
/* 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 */

View File

@ -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);

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2008 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2009 Pierre Pronchery <khorben@defora.org> */
/* 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 <stdlib.h>
#include <string.h>
#include <libgtkhtml/gtkhtml.h>
#include <libgtkhtml/util/rfc1738.h>
#include <libgtkhtml/view/htmlselection.h>
#define GNET_EXPERIMENTAL
#include <gnet.h>
#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)
{

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2008 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2009 Pierre Pronchery <khorben@defora.org> */
/* 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 */
}

View File

@ -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 */

View File

@ -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

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2008 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2009 Pierre Pronchery <khorben@defora.org> */
/* 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);
}

View File

@ -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 */