Implemented tabbed browsing (mostly usable already)

This commit is contained in:
Pierre Pronchery 2010-04-20 17:56:25 +00:00
parent 83dc7491b6
commit 7ec113c1eb
15 changed files with 502 additions and 135 deletions

View File

@ -7,12 +7,12 @@ msgid ""
msgstr ""
"Project-Id-Version: Surfer 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-11 15:12+0200\n"
"POT-Creation-Date: 2010-04-11 19:45+0200\n"
"PO-Revision-Date: 2010-04-01 19:40+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -113,8 +113,8 @@ msgstr ""
msgid "Close window when the download is complete"
msgstr ""
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:506
#: ../src/surfer.c:509
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:510
#: ../src/surfer.c:513
msgid "Error"
msgstr "Fehler"
@ -157,7 +157,7 @@ msgstr ""
msgid "Code "
msgstr ""
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:508
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:512
msgid "Unknown error"
msgstr ""
@ -300,46 +300,46 @@ msgstr ""
msgid " Location: "
msgstr ""
#: ../src/surfer.c:254
#: ../src/surfer.c:256
msgid "Could not initialize HTML renderer"
msgstr ""
#: ../src/surfer.c:455 ../src/surfer.c:458
#: ../src/surfer.c:459 ../src/surfer.c:462
msgid "Question"
msgstr ""
#: ../src/surfer.c:475 ../src/surfer.c:709
#: ../src/surfer.c:479 ../src/surfer.c:713
msgid "Save file as..."
msgstr ""
#: ../src/surfer.c:537
#: ../src/surfer.c:541
msgid "Find text"
msgstr "Suchen"
#: ../src/surfer.c:544
#: ../src/surfer.c:548
msgid "Text:"
msgstr ""
#: ../src/surfer.c:551
#: ../src/surfer.c:555
msgid "Case-sensitive"
msgstr ""
#: ../src/surfer.c:553
#: ../src/surfer.c:557
msgid "Wrap"
msgstr ""
#: ../src/surfer.c:576
#: ../src/surfer.c:580
msgid "Text not found"
msgstr ""
#: ../src/surfer.c:650
#: ../src/surfer.c:654
msgid "Open file..."
msgstr ""
#: ../src/surfer.c:833
#: ../src/surfer.c:837
msgid "Web surfer - Source of "
msgstr ""
#: ../src/surfer.c:875 ../src/surfer.c:878
#: ../src/surfer.c:879 ../src/surfer.c:882
msgid "Warning"
msgstr "Achtung"

View File

@ -7,12 +7,12 @@ msgid ""
msgstr ""
"Project-Id-Version: Surfer 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-11 15:12+0200\n"
"POT-Creation-Date: 2010-04-11 19:45+0200\n"
"PO-Revision-Date: 2010-04-01 19:40+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -113,8 +113,8 @@ msgstr ""
msgid "Close window when the download is complete"
msgstr ""
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:506
#: ../src/surfer.c:509
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:510
#: ../src/surfer.c:513
msgid "Error"
msgstr ""
@ -157,7 +157,7 @@ msgstr ""
msgid "Code "
msgstr ""
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:508
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:512
msgid "Unknown error"
msgstr ""
@ -300,46 +300,46 @@ msgstr ""
msgid " Location: "
msgstr ""
#: ../src/surfer.c:254
#: ../src/surfer.c:256
msgid "Could not initialize HTML renderer"
msgstr ""
#: ../src/surfer.c:455 ../src/surfer.c:458
#: ../src/surfer.c:459 ../src/surfer.c:462
msgid "Question"
msgstr ""
#: ../src/surfer.c:475 ../src/surfer.c:709
#: ../src/surfer.c:479 ../src/surfer.c:713
msgid "Save file as..."
msgstr "Guardar como..."
#: ../src/surfer.c:537
#: ../src/surfer.c:541
msgid "Find text"
msgstr "Buscar"
#: ../src/surfer.c:544
#: ../src/surfer.c:548
msgid "Text:"
msgstr ""
#: ../src/surfer.c:551
#: ../src/surfer.c:555
msgid "Case-sensitive"
msgstr ""
#: ../src/surfer.c:553
#: ../src/surfer.c:557
msgid "Wrap"
msgstr ""
#: ../src/surfer.c:576
#: ../src/surfer.c:580
msgid "Text not found"
msgstr ""
#: ../src/surfer.c:650
#: ../src/surfer.c:654
msgid "Open file..."
msgstr "Abrir..."
#: ../src/surfer.c:833
#: ../src/surfer.c:837
msgid "Web surfer - Source of "
msgstr ""
#: ../src/surfer.c:875 ../src/surfer.c:878
#: ../src/surfer.c:879 ../src/surfer.c:882
msgid "Warning"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Surfer 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-11 15:12+0200\n"
"POT-Creation-Date: 2010-04-11 19:45+0200\n"
"PO-Revision-Date: 2010-04-01 19:40+0200\n"
"Last-Translator: Calimero <calimeroteknik@free.fr>\n"
"Language-Team: French\n"
@ -113,8 +113,8 @@ msgstr "0.0 Kio/s"
msgid "Close window when the download is complete"
msgstr "Fermer la fenêtre à la fin du téléchargement"
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:506
#: ../src/surfer.c:509
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:510
#: ../src/surfer.c:513
msgid "Error"
msgstr "Erreur"
@ -157,7 +157,7 @@ msgstr "Résolu"
msgid "Code "
msgstr "Code "
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:508
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:512
msgid "Unknown error"
msgstr "Erreur inconnue"
@ -303,46 +303,46 @@ msgstr "_Aide"
msgid " Location: "
msgstr " Adresse: "
#: ../src/surfer.c:254
#: ../src/surfer.c:256
msgid "Could not initialize HTML renderer"
msgstr "Ne peut charger le moteur de rendu HTML"
#: ../src/surfer.c:455 ../src/surfer.c:458
#: ../src/surfer.c:459 ../src/surfer.c:462
msgid "Question"
msgstr "Question"
#: ../src/surfer.c:475 ../src/surfer.c:709
#: ../src/surfer.c:479 ../src/surfer.c:713
msgid "Save file as..."
msgstr "Enregistrer sous..."
#: ../src/surfer.c:537
#: ../src/surfer.c:541
msgid "Find text"
msgstr "Chercher du texte"
#: ../src/surfer.c:544
#: ../src/surfer.c:548
msgid "Text:"
msgstr "Texte: "
#: ../src/surfer.c:551
#: ../src/surfer.c:555
msgid "Case-sensitive"
msgstr "Sensible à la casse"
#: ../src/surfer.c:553
#: ../src/surfer.c:557
msgid "Wrap"
msgstr "Chercher en boucle"
#: ../src/surfer.c:576
#: ../src/surfer.c:580
msgid "Text not found"
msgstr "Texte non trouvé"
#: ../src/surfer.c:650
#: ../src/surfer.c:654
msgid "Open file..."
msgstr "Ouvrir un fichier..."
#: ../src/surfer.c:833
#: ../src/surfer.c:837
msgid "Web surfer - Source of "
msgstr "Web surfer - Source de "
#: ../src/surfer.c:875 ../src/surfer.c:878
#: ../src/surfer.c:879 ../src/surfer.c:882
msgid "Warning"
msgstr "Avertissement"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Surfer 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-11 15:12+0200\n"
"POT-Creation-Date: 2010-04-11 19:45+0200\n"
"PO-Revision-Date: 2010-04-11 12:06+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: Italian\n"
@ -113,8 +113,8 @@ msgstr ""
msgid "Close window when the download is complete"
msgstr ""
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:506
#: ../src/surfer.c:509
#: ../src/download.c:263 ../src/download.c:572 ../src/surfer.c:510
#: ../src/surfer.c:513
msgid "Error"
msgstr ""
@ -157,7 +157,7 @@ msgstr ""
msgid "Code "
msgstr ""
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:508
#: ../src/download.c:546 ../src/ghtml-webkit.c:387 ../src/surfer.c:512
msgid "Unknown error"
msgstr ""
@ -300,46 +300,46 @@ msgstr ""
msgid " Location: "
msgstr ""
#: ../src/surfer.c:254
#: ../src/surfer.c:256
msgid "Could not initialize HTML renderer"
msgstr ""
#: ../src/surfer.c:455 ../src/surfer.c:458
#: ../src/surfer.c:459 ../src/surfer.c:462
msgid "Question"
msgstr ""
#: ../src/surfer.c:475 ../src/surfer.c:709
#: ../src/surfer.c:479 ../src/surfer.c:713
msgid "Save file as..."
msgstr ""
#: ../src/surfer.c:537
#: ../src/surfer.c:541
msgid "Find text"
msgstr ""
#: ../src/surfer.c:544
#: ../src/surfer.c:548
msgid "Text:"
msgstr ""
#: ../src/surfer.c:551
#: ../src/surfer.c:555
msgid "Case-sensitive"
msgstr ""
#: ../src/surfer.c:553
#: ../src/surfer.c:557
msgid "Wrap"
msgstr ""
#: ../src/surfer.c:576
#: ../src/surfer.c:580
msgid "Text not found"
msgstr ""
#: ../src/surfer.c:650
#: ../src/surfer.c:654
msgid "Open file..."
msgstr ""
#: ../src/surfer.c:833
#: ../src/surfer.c:837
msgid "Web surfer - Source of "
msgstr ""
#: ../src/surfer.c:875 ../src/surfer.c:878
#: ../src/surfer.c:879 ../src/surfer.c:882
msgid "Warning"
msgstr ""

View File

@ -57,6 +57,15 @@ void on_file_close(gpointer data)
}
/* on_file_new_tab */
void on_file_new_tab(gpointer data)
{
Surfer * surfer = data;
surfer_open_tab(surfer, NULL);
}
/* on_file_new_window */
void on_file_new_window(gpointer data)
{
@ -474,6 +483,33 @@ void on_home(gpointer data)
}
/* on_notebook_close_tab */
void on_notebook_close_tab(gpointer data)
{
Surfer * surfer = data;
surfer_close_tab(surfer);
}
/* on_notebook_switch_page */
void on_notebook_switch_page(GtkWidget * widget, GtkNotebookPage * page,
guint n, gpointer data)
{
Surfer * surfer = data;
GtkWidget * ghtml;
ghtml = gtk_notebook_get_nth_page(GTK_NOTEBOOK(surfer->notebook), n);
/* FIXME implement:
* - change the title (tab)
* - update toolbar buttons */
surfer_set_location(surfer, ghtml_get_location(ghtml));
surfer_set_progress(surfer, ghtml_get_progress(ghtml));
surfer_set_status(surfer, ghtml_get_status(ghtml));
surfer_set_title(surfer, ghtml_get_title(ghtml));
}
/* on_path_activate */
void on_path_activate(gpointer data)
{

View File

@ -28,6 +28,7 @@ gboolean on_closex(gpointer data);
/* file menu */
void on_file_close(gpointer data);
void on_file_new_window(gpointer data);
void on_file_new_tab(gpointer data);
void on_file_open(gpointer data);
void on_file_open_url(gpointer data);
void on_file_print(gpointer data);
@ -63,4 +64,9 @@ void on_preferences(gpointer data);
void on_refresh(gpointer data);
void on_stop(gpointer data);
/* notebook */
void on_notebook_close_tab(gpointer data);
void on_notebook_switch_page(GtkWidget * widget, GtkNotebookPage * page,
guint n, gpointer data);
#endif

View File

@ -27,7 +27,6 @@
struct _Surfer
{
Config * config;
char * url;
/* preferences */
char * homepage;
@ -46,7 +45,7 @@ struct _Surfer
GtkToolItem * tb_fullscreen;
GtkWidget * locationbar;
GtkWidget * lb_path;
GtkWidget * view;
GtkWidget * notebook;
GtkWidget * progress;
GtkWidget * statusbox;
GtkWidget * statusbar;

View File

@ -37,6 +37,7 @@ struct _Conn
char const * anchor;
guint64 content_length;
guint64 data_received;
gdouble progress;
int direct;
int image;
@ -58,6 +59,9 @@ static Conn * _conn_new(Surfer * surfer, char const * url,
static void _conn_delete(Conn * conn);
/* accessors */
static gdouble _conn_get_progress(Conn * conn);
static void _conn_set_progress(Conn * conn, gdouble progress);
static void _conn_set_callback_write(Conn * conn,
ssize_t (*callback)(Conn *, char const *, ssize_t, gpointer),
gpointer data);
@ -94,6 +98,7 @@ static Conn * _conn_new(Surfer * surfer, char const * url, char const * post)
}
conn->content_length = 0;
conn->data_received = 0;
conn->progress = -1.0;
conn->direct = 0;
conn->image = 0;
conn->callback_write = _new_callback_write;
@ -127,6 +132,19 @@ static void _conn_delete(Conn * conn)
/* accessors */
static gdouble _conn_get_progress(Conn * conn)
{
return conn->progress;
}
static void _conn_set_progress(Conn * conn, gdouble progress)
{
conn->progress = progress;
surfer_set_progress(conn->surfer, progress);
}
static void _conn_set_callback_write(Conn * conn,
ssize_t (*callback)(Conn *, char const *, ssize_t, gpointer),
gpointer data)
@ -159,7 +177,7 @@ static int _conn_load(Conn * conn)
/* FIXME support "file:", report error */
return 1;
}
surfer_set_progress(conn->surfer, -1.0);
_conn_set_progress(conn, -1.0);
surfer_set_status(conn->surfer, _("Resolving..."));
conn->http = gnet_conn_http_new();
gnet_conn_http_set_uri(conn->http, conn->url);
@ -220,7 +238,7 @@ static void _http_data_complete(GConnHttpEventData * event, Conn * conn)
if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE)
{
/* FIXME report error */
surfer_set_progress(conn->surfer, -1.0);
_conn_set_progress(conn, -1.0);
surfer_set_status(conn->surfer, NULL);
return;
}
@ -249,7 +267,7 @@ static void _http_data_progress(GConnHttpEventData * event, Conn * conn)
conn->data_received = event->data_received;
conn->content_length = event->content_length;
fraction = conn->data_received;
surfer_set_progress(conn->surfer, fraction / conn->content_length);
_conn_set_progress(conn, fraction / conn->content_length);
}
static void _http_error(GConnHttpEventError * event, Conn * conn)
@ -271,7 +289,7 @@ static void _http_error(GConnHttpEventError * event, Conn * conn)
msg = _("Unspecified error");
break;
}
surfer_set_progress(conn->surfer, -1.0);
_conn_set_progress(conn, -1.0);
surfer_set_status(conn->surfer, NULL);
surfer_error(conn->surfer, msg, 0);
}
@ -303,6 +321,6 @@ static void _http_response(GConnHttpEventResponse * event, Conn * conn)
static void _http_timeout(Conn * conn)
{
surfer_error(conn->surfer, _("Timeout"), 0);
surfer_set_progress(conn->surfer, -1.0);
_conn_set_progress(conn, -1.0);
surfer_set_status(conn->surfer, NULL);
}

View File

@ -64,6 +64,7 @@ typedef struct _GHtml
/* connections */
struct _GHtmlConn ** conns;
size_t conns_cnt;
gdouble progress;
/* html widget */
HtmlDocument * html_document;
@ -103,6 +104,7 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn);
static char const * _ghtml_get_base(GHtml * ghtml);
static int _ghtml_set_base(GHtml * ghtml, char const * url);
static void _ghtml_set_progress(GHtml * ghtml, gdouble progress);
static int _ghtml_document_load(GHtml * ghtml, gchar const * url,
gchar const * post);
static int _ghtml_document_reload(GHtml * ghtml);
@ -140,6 +142,7 @@ GtkWidget * ghtml_new(Surfer * surfer)
ghtml->current = NULL;
ghtml->conns = NULL;
ghtml->conns_cnt = 0;
ghtml->progress = -1.0;
ghtml->html_view = html_view_new();
g_object_set_data(G_OBJECT(ghtml->html_view), "ghtml", ghtml);
g_signal_connect(G_OBJECT(ghtml->html_view), "button-press-event",
@ -170,6 +173,23 @@ GtkWidget * ghtml_new(Surfer * surfer)
}
/* ghtml_delete */
void ghtml_delete(GtkWidget * widget)
{
GHtml * ghtml;
size_t i;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
free(ghtml->source);
for(i = 0; i < ghtml->conns_cnt; i++)
if(ghtml->conns[i] != NULL)
_ghtmlconn_delete(ghtml->conns[i]);
free(ghtml->conns); /* may not be free()'d by _ghtmlconn_delete() */
free(ghtml->html_title);
free(ghtml);
}
/* accessors */
/* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * widget)
@ -209,6 +229,16 @@ char const * ghtml_get_location(GtkWidget * widget)
}
/* ghtml_get_progress */
gdouble ghtml_get_progress(GtkWidget * widget)
{
GHtml * ghtml;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
return ghtml->progress;
}
/* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget)
{
@ -219,6 +249,14 @@ char const * ghtml_get_source(GtkWidget * widget)
}
/* ghtml_get_status */
char const * ghtml_get_status(GtkWidget * widget)
{
/* FIXME really implement */
return NULL;
}
/* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * widget)
{
@ -512,6 +550,14 @@ static int _ghtml_set_base(GHtml * ghtml, char const * url)
}
/* ghtml_set_progress */
static void _ghtml_set_progress(GHtml * ghtml, gdouble progress)
{
surfer_set_progress(ghtml->surfer, progress);
ghtml->progress = progress;
}
/* ghtml_document_load */
static int _ghtml_document_load(GHtml * ghtml, gchar const * url,
gchar const * post)
@ -676,7 +722,7 @@ static gboolean _stream_load_idle_directory(GHtmlConn * conn)
#endif
html_stream_write(conn->stream, tail, sizeof(tail) - 1);
closedir(dir);
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn);
return FALSE;
@ -698,7 +744,7 @@ static gboolean _stream_load_idle_file(GHtmlConn * conn)
}
else
{
surfer_set_progress(conn->ghtml->surfer, 0.0);
_ghtml_set_progress(conn->ghtml, 0.0);
surfer_set_status(conn->ghtml->surfer, _("Reading file..."));
if(fstat(fd, &st) == 0)
{
@ -737,7 +783,7 @@ static gboolean _stream_load_watch_file(GIOChannel * source,
}
if(len == 0) /* no more data */
{
surfer_set_progress(conn->ghtml->surfer, 1.0);
_ghtml_set_progress(conn->ghtml, 1.0);
surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn);
return FALSE;
@ -748,15 +794,14 @@ static gboolean _stream_load_watch_file(GIOChannel * source,
if(conn->file_size > 0)
{
fraction = conn->file_read;
surfer_set_progress(conn->ghtml->surfer,
fraction / conn->file_size);
_ghtml_set_progress(conn->ghtml, fraction / conn->file_size);
}
return TRUE;
}
static gboolean _stream_load_idle_http(GHtmlConn * conn)
{
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, _("Resolving..."));
conn->http = gnet_conn_http_new();
gnet_conn_http_set_uri(conn->http, conn->url);
@ -819,7 +864,7 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn)
if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE)
{
/* FIXME report error */
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
}
else
{
@ -875,7 +920,7 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn)
rec += p->data_received;
}
fraction = rec;
surfer_set_progress(conn->ghtml->surfer, fraction / len);
_ghtml_set_progress(conn->ghtml, fraction / len);
}
static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)
@ -900,7 +945,7 @@ static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)
msg = _("Unspecified error");
break;
}
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL);
surfer_error(conn->ghtml->surfer, msg, 0);
_ghtmlconn_delete(conn);
@ -947,7 +992,7 @@ static void _http_resolved(GConnHttpEventResolved * event, GHtmlConn * conn)
if(event->ia == NULL)
{
#if 0 /* XXX check again if this is really an error case */
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL);
surfer_error(conn->ghtml->surfer, "Unknown host", 0);
_ghtmlconn_delete(conn);
@ -994,7 +1039,7 @@ static void _http_response(GConnHttpEventResponse * event, GHtmlConn * conn)
static void _http_timeout(GHtmlConn * conn)
{
surfer_error(conn->ghtml->surfer, _("Timeout"), 0);
surfer_set_progress(conn->ghtml->surfer, -1.0);
_ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn);
}

View File

@ -270,6 +270,13 @@ static char const * _new_get_prefs_directory(void)
}
/* ghtml_delete */
void ghtml_delete(GtkWidget * ghtml)
{
/* FIXME nothing to do? */
}
/* accessors */
/* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * ghtml)
@ -313,6 +320,14 @@ char const * ghtml_get_location(GtkWidget * ghtml)
}
/* ghtml_get_progress */
gdouble ghtml_get_progress(GtkWidget * ghtml)
{
/* FIXME implement */
return -1.0;
}
/* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget)
{
@ -321,6 +336,14 @@ char const * ghtml_get_source(GtkWidget * widget)
}
/* ghtml_get_status */
char const * ghtml_get_status(GtkWidget * widget)
{
/* FIXME really implement */
return NULL;
}
/* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * ghtml)
{

View File

@ -85,6 +85,17 @@ GtkWidget * ghtml_new(Surfer * surfer)
}
/* ghtml_delete */
void ghtml_delete(GtkWidget * widget)
{
GHtml * ghtml;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
_conn_delete(ghtml->conn);
free(ghtml);
}
/* accessors */
/* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * widget)
@ -124,6 +135,18 @@ char const * ghtml_get_location(GtkWidget * widget)
}
/* ghtml_get_progress */
gdouble ghtml_get_progress(GtkWidget * widget)
{
GHtml * ghtml;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
if(ghtml->conn == NULL)
return -1.0;
return _conn_get_progress(ghtml->conn);
}
/* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget)
{
@ -139,6 +162,14 @@ char const * ghtml_get_source(GtkWidget * widget)
}
/* ghtml_get_status */
char const * ghtml_get_status(GtkWidget * widget)
{
/* FIXME really implement */
return NULL;
}
/* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * widget)
{

View File

@ -12,6 +12,8 @@
* 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 */
/* FIXME
* - implement undo/redo */
@ -100,6 +102,13 @@ GtkWidget * ghtml_new(Surfer * surfer)
}
/* ghtml_delete */
void ghtml_delete(GtkWidget * ghtml)
{
/* FIXME is it necessary to destroy any widget? */
}
/* accessors */
/* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * ghtml)
@ -127,6 +136,7 @@ char const * ghtml_get_link_message(GtkWidget * ghtml)
}
/* ghtml_get_location */
char const * ghtml_get_location(GtkWidget * ghtml)
{
GtkWidget * view;
@ -138,6 +148,20 @@ char const * ghtml_get_location(GtkWidget * ghtml)
}
/* ghtml_get_progress */
gdouble ghtml_get_progress(GtkWidget * ghtml)
{
gdouble ret;
GtkWidget * view;
view = g_object_get_data(G_OBJECT(ghtml), "view");
ret = webkit_web_view_get_progress(WEBKIT_WEB_VIEW(view));
if(ret == 0.0)
ret = -1.0;
return ret;
}
/* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * ghtml)
{
@ -155,6 +179,14 @@ char const * ghtml_get_source(GtkWidget * ghtml)
}
/* ghtml_get_status */
char const * ghtml_get_status(GtkWidget * widget)
{
/* FIXME really implement */
return NULL;
}
char const * ghtml_get_title(GtkWidget * ghtml)
{
GtkWidget * view;
@ -325,10 +357,9 @@ static WebKitWebView * _on_create_web_view(WebKitWebView * view,
* - this is a bit ugly (showing and hiding)
* - we may not want history etc to be copied
* - it loads the current URL first */
surfer_show_window(copy, FALSE);
ret = g_object_get_data(G_OBJECT(copy->view), "view");
ret = g_object_get_data(G_OBJECT(surfer_get_view(copy)), "view");
g_signal_connect(G_OBJECT(ret), "web-view-ready", G_CALLBACK(
_on_web_view_ready), copy->view);
_on_web_view_ready), surfer_get_view(copy));
return ret;
}

View File

@ -25,6 +25,7 @@
/* GHTML */
/* functions */
GtkWidget * ghtml_new(Surfer * surfer);
void ghtml_delete(GtkWidget * ghtml);
/* accessors */
gboolean ghtml_can_go_back(GtkWidget * ghtml);
@ -32,6 +33,7 @@ gboolean ghtml_can_go_forward(GtkWidget * ghtml);
char const * ghtml_get_link_message(GtkWidget * ghtml);
char const * ghtml_get_location(GtkWidget * ghtml);
gdouble ghtml_get_progress(GtkWidget * ghtml);
char const * ghtml_get_source(GtkWidget * ghtml);
char const * ghtml_get_title(GtkWidget * ghtml);

View File

@ -31,6 +31,14 @@
/* Surfer */
/* private */
/* types */
typedef struct _SurferIdle
{
Surfer * surfer;
char * url;
} SurferIdle;
/* variables */
static DesktopAccel _surfer_accel[] =
{
@ -46,6 +54,8 @@ static DesktopAccel _surfer_accel[] =
#ifndef EMBEDDED
static DesktopMenu _menu_file[] =
{
{ N_("_New tab"), G_CALLBACK(on_file_new_tab), "tab-new",
GDK_T },
{ N_("_New window"), G_CALLBACK(on_file_new_window), "window-new",
GDK_N },
{ N_("_Open..."), G_CALLBACK(on_file_open), GTK_STOCK_OPEN,
@ -150,9 +160,33 @@ static int _config_save_string(Config * config, char const * variable,
/* public */
/* functions */
/* surfer_new */
static Surfer * _new_do(char const * url);
static gboolean _new_idle(gpointer data);
Surfer * surfer_new(char const * url)
{
Surfer * surfer;
SurferIdle * si;
if((surfer = _new_do(url)) == NULL)
return NULL;
gtk_widget_show(surfer->window);
/* load url as soon as we're idle */
if((si = malloc(sizeof(*si))) == NULL
|| (url != NULL && (si->url = strdup(url)) == NULL))
{
free(si);
surfer_delete(surfer);
return NULL;
}
si->surfer = surfer;
if(url == NULL)
si->url = NULL;
g_idle_add(_new_idle, si);
return surfer;
}
Surfer * _new_do(char const * url)
{
Surfer * surfer;
GtkAccelGroup * group;
@ -163,11 +197,9 @@ Surfer * surfer_new(char const * url)
if((surfer = malloc(sizeof(*surfer))) == NULL)
return NULL;
surfer->url = NULL;
surfer->homepage = NULL;
if((surfer->config = config_new()) == NULL
|| surfer_config_load(surfer) != 0
|| (url != NULL && (surfer->url = strdup(url)) == NULL))
|| surfer_config_load(surfer) != 0)
{
surfer_delete(surfer);
return NULL;
@ -181,7 +213,7 @@ Surfer * surfer_new(char const * url)
#if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(surfer->window), "stock_internet");
#endif
surfer_set_title(surfer, NULL);
gtk_window_set_title(GTK_WINDOW(surfer->window), "Surfer");
g_signal_connect_swapped(G_OBJECT(surfer->window), "delete-event",
G_CALLBACK(on_closex), surfer);
vbox = gtk_vbox_new(FALSE, 0);
@ -248,14 +280,13 @@ Surfer * surfer_new(char const * url)
on_path_activate), surfer);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
/* view */
if((surfer->view = ghtml_new(surfer)) == NULL)
{
surfer_error(NULL, _("Could not initialize HTML renderer"), 0);
surfer_delete(surfer);
return NULL;
}
gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0);
/* notebook */
surfer->notebook = gtk_notebook_new();
gtk_notebook_set_show_border(GTK_NOTEBOOK(surfer->notebook), FALSE);
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(surfer->notebook), FALSE);
g_signal_connect(G_OBJECT(surfer->notebook), "switch-page", G_CALLBACK(
on_notebook_switch_page), surfer);
gtk_box_pack_start(GTK_BOX(vbox), surfer->notebook, TRUE, TRUE, 0);
/* statusbar */
surfer->statusbox = gtk_hbox_new(FALSE, 0);
surfer->progress = gtk_progress_bar_new();
@ -268,7 +299,7 @@ Surfer * surfer_new(char const * url)
gtk_widget_show_all(surfer->statusbox);
gtk_container_add(GTK_CONTAINER(surfer->window), vbox);
gtk_widget_grab_focus(GTK_WIDGET(surfer->lb_path));
gtk_widget_show_all(surfer->window);
gtk_widget_show_all(vbox);
/* preferences window */
surfer->pr_window = NULL;
/* find dialog */
@ -277,18 +308,16 @@ Surfer * surfer_new(char const * url)
gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0);
surfer_set_status(surfer, NULL);
surfer_cnt++;
/* load url as soon as we're idle */
/* FIXME this apparently breaks surfer_new_copy() */
if(url != NULL)
g_idle_add(_new_idle, surfer);
return surfer;
}
static gboolean _new_idle(gpointer data)
{
Surfer * surfer = data;
SurferIdle * si = data;
surfer_open(surfer, surfer->url);
surfer_open_tab(si->surfer, si->url);
free(si->url);
free(si);
return FALSE;
}
@ -297,8 +326,14 @@ static gboolean _new_idle(gpointer data)
Surfer * surfer_new_copy(Surfer * surfer)
{
Surfer * ret;
if((ret = surfer_new(surfer->url)) == NULL)
GtkWidget * view;
char const * url;
if((view = surfer_get_view(surfer)) == NULL)
url = NULL;
else
url = ghtml_get_location(view);
if((ret = surfer_new(url)) == NULL)
return NULL;
/* FIXME also copy history */
return ret;
@ -310,7 +345,6 @@ void surfer_delete(Surfer * surfer)
{
gtk_widget_destroy(surfer->window);
config_delete(surfer->config);
free(surfer->url);
free(surfer->homepage);
free(surfer);
if(--surfer_cnt == 0)
@ -319,6 +353,18 @@ void surfer_delete(Surfer * surfer)
/* accessors */
/* surfer_get_view */
GtkWidget * surfer_get_view(Surfer * surfer)
{
int cur;
if((cur = gtk_notebook_get_current_page(GTK_NOTEBOOK(surfer->notebook)))
< 0)
return NULL;
return gtk_notebook_get_nth_page(GTK_NOTEBOOK(surfer->notebook), cur);
}
/* surfer_set_fullscreen */
void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen)
{
@ -334,33 +380,35 @@ void surfer_set_location(Surfer * surfer, char const * url)
{
static int i = 0; /* XXX should be set per-window */
GtkWidget * widget;
char * p;
GtkWidget * view;
if(url == NULL)
url = "";
widget = gtk_bin_get_child(GTK_BIN(surfer->lb_path));
gtk_entry_set_text(GTK_ENTRY(widget), url);
/* FIXME what about history? */
if((p = strdup(url)) != NULL)
{
free(surfer->url);
surfer->url = p;
}
if((view = surfer_get_view(surfer)) == NULL)
return; /* XXX really correct? */
if(i == 8)
gtk_combo_box_remove_text(GTK_COMBO_BOX(surfer->lb_path), 0);
else
i++;
gtk_combo_box_append_text(GTK_COMBO_BOX(surfer->lb_path), url);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back),
ghtml_can_go_back(surfer->view));
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward),
ghtml_can_go_forward(surfer->view));
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), ghtml_can_go_back(
view));
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward),
ghtml_can_go_forward(view));
}
/* surfer_set_progress */
void surfer_set_progress(Surfer * surfer, gdouble fraction)
{
GtkWidget * view;
char buf[10] = " ";
if((view = surfer_get_view(surfer)) == NULL)
return; /* consider the current tab only */
fraction = ghtml_get_progress(view);
if(fraction >= 0.0 && fraction <= 1.0)
snprintf(buf, sizeof(buf), "%.1f%%", fraction * 100);
else
@ -403,8 +451,12 @@ void surfer_set_status(Surfer * surfer, char const * status)
/* surfer_set_title */
void surfer_set_title(Surfer * surfer, char const * title)
{
GtkWidget * view;
char buf[256];
if((view = surfer_get_view(surfer)) == NULL)
return; /* consider the current tab only */
title = ghtml_get_title(view);
snprintf(buf, sizeof(buf), "%s%s%s", "Web surfer", (title != NULL)
? " - " : "", (title != NULL) ? title : "");
gtk_window_set_title(GTK_WINDOW(surfer->window), buf);
@ -412,6 +464,27 @@ void surfer_set_title(Surfer * surfer, char const * title)
/* useful */
/* surfer_close_tab */
void surfer_close_tab(Surfer * surfer)
{
gint n;
GtkWidget * view;
if(gtk_notebook_get_n_pages(GTK_NOTEBOOK(surfer->notebook)) == 1)
{
surfer_delete(surfer);
return;
}
n = gtk_notebook_get_current_page(GTK_NOTEBOOK(surfer->notebook));
view = gtk_notebook_get_nth_page(GTK_NOTEBOOK(surfer->notebook), n);
ghtml_delete(view);
gtk_notebook_remove_page(GTK_NOTEBOOK(surfer->notebook), n);
if(gtk_notebook_get_n_pages(GTK_NOTEBOOK(surfer->notebook)) == 1)
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(surfer->notebook),
FALSE);
}
/* surfer_config_load */
int surfer_config_load(Surfer * surfer)
{
@ -561,10 +634,13 @@ static void _find_dialog(Surfer * surfer)
static void _on_find_activate(GtkWidget * widget, gpointer data)
{
Surfer * surfer = data;
GtkWidget * view;
char const * text;
gboolean sensitive;
gboolean wrap;
if((view = surfer_get_view(surfer)) == NULL)
return;
if((text = gtk_entry_get_text(GTK_ENTRY(widget))) == NULL
|| strlen(text) == 0)
return;
@ -572,7 +648,7 @@ static void _on_find_activate(GtkWidget * widget, gpointer data)
surfer->fi_case));
wrap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_wrap));
if(ghtml_find(surfer->view, text, sensitive, wrap) == TRUE)
if(ghtml_find(view, text, sensitive, wrap) == TRUE)
return;
surfer_error(surfer, _("Text not found"), 0);
}
@ -596,9 +672,12 @@ static void _on_find_response(GtkWidget * widget, gint response, gpointer data)
gboolean surfer_go_back(Surfer * surfer)
{
gboolean ret;
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return FALSE;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ret = ghtml_go_back(surfer->view);
ret = ghtml_go_back(view);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), ret);
return ret;
}
@ -608,9 +687,12 @@ gboolean surfer_go_back(Surfer * surfer)
gboolean surfer_go_forward(Surfer * surfer)
{
gboolean ret;
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return FALSE;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ret = ghtml_go_forward(surfer->view);
ret = ghtml_go_forward(view);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), ret);
return ret;
}
@ -630,12 +712,20 @@ void surfer_go_home(Surfer * surfer)
/* surfer_open */
void surfer_open(Surfer * surfer, char const * url)
{
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
{
surfer_open_tab(surfer, url);
return;
}
if(url != NULL)
{
view = surfer_get_view(surfer);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_refresh), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ghtml_stop(surfer->view);
ghtml_load_url(surfer->view, url);
ghtml_stop(view);
ghtml_load_url(view, url);
}
else
gtk_widget_grab_focus(surfer->lb_path);
@ -664,26 +754,79 @@ void surfer_open_dialog(Surfer * surfer)
}
/* surfer_open_tab */
static GtkWidget * _tab_button(Surfer * surfer, char const * label);
void surfer_open_tab(Surfer * surfer, char const * url)
{
GtkWidget * widget;
if((widget = ghtml_new(surfer)) == NULL)
{
surfer_error(NULL, _("Could not initialize HTML renderer"), 0);
return;
}
if(url != NULL)
ghtml_load_url(widget, url);
gtk_notebook_append_page(GTK_NOTEBOOK(surfer->notebook), widget,
_tab_button(surfer, _("Untitled")));
if(gtk_notebook_get_n_pages(GTK_NOTEBOOK(surfer->notebook)) > 1)
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(surfer->notebook),
TRUE);
gtk_widget_show_all(widget);
}
static GtkWidget * _tab_button(Surfer * surfer, char const * label)
{
GtkWidget * hbox;
GtkWidget * button;
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(label), TRUE, TRUE, 4);
button = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_stock(
GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(
on_notebook_close_tab), surfer);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 0);
gtk_widget_show_all(hbox);
return hbox;
}
/* surfer_print */
void surfer_print(Surfer * surfer)
{
ghtml_print(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_print(view);
}
/* surfer_refresh */
void surfer_refresh(Surfer * surfer)
{
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ghtml_refresh(surfer->view);
ghtml_refresh(view);
}
/* surfer_reload */
void surfer_reload(Surfer * surfer)
{
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ghtml_reload(surfer->view);
ghtml_reload(view);
}
@ -697,13 +840,16 @@ void surfer_resize(Surfer * surfer, gint width, gint height)
/* surfer_save */
void surfer_save(Surfer * surfer, char const * filename)
{
GtkWidget * view;
char const * source;
GtkWidget * dialog;
size_t len;
FILE * fp;
char buf[256];
if((source = ghtml_get_source(surfer->view)) == NULL)
if((view = surfer_get_view(surfer)) == NULL)
return;
if((source = ghtml_get_source(view)) == NULL)
return; /* XXX report error */
if(filename == NULL)
{
@ -738,7 +884,11 @@ void surfer_save(Surfer * surfer, char const * filename)
/* surfer_select_all */
void surfer_select_all(Surfer * surfer)
{
ghtml_select_all(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_select_all(view);
}
@ -793,14 +943,22 @@ void surfer_show_window(Surfer * surfer, gboolean show)
/* surfer_stop */
void surfer_stop(Surfer * surfer)
{
ghtml_stop(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_stop(view);
}
/* surfer_unselect_all */
void surfer_unselect_all(Surfer * surfer)
{
ghtml_unselect_all(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_unselect_all(view);
}
@ -818,11 +976,14 @@ void surfer_view_source(Surfer * surfer)
GtkTextBuffer * tbuf;
PangoFontDescription * desc;
char buf[256];
char const * url;
char const * source;
if(surfer->url == NULL)
if((widget = surfer_get_view(surfer)) == NULL)
return;
if((source = ghtml_get_source(surfer->view)) == NULL)
if((url = ghtml_get_location(widget)) == NULL)
return;
if((source = ghtml_get_source(widget)) == NULL)
return; /* FIXME download to a temporary file and open */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
group = gtk_accel_group_new();
@ -831,8 +992,7 @@ void surfer_view_source(Surfer * surfer)
GTK_ACCEL_VISIBLE, cc);
gtk_window_add_accel_group(GTK_WINDOW(window), group);
gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
snprintf(buf, sizeof(buf), "%s%s", _("Web surfer - Source of "),
surfer->url);
snprintf(buf, sizeof(buf), "%s%s", _("Web surfer - Source of "), url);
gtk_window_set_title(GTK_WINDOW(window), buf);
g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(
_on_source_closex), NULL);
@ -886,21 +1046,33 @@ void surfer_warning(Surfer * surfer, char const * message)
/* surfer_zoom_in */
void surfer_zoom_in(Surfer * surfer)
{
ghtml_zoom_in(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_zoom_in(view);
}
/* surfer_zoom_out */
void surfer_zoom_out(Surfer * surfer)
{
ghtml_zoom_out(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_zoom_out(view);
}
/* surfer_zoom_reset */
void surfer_zoom_reset(Surfer * surfer)
{
ghtml_zoom_reset(surfer->view);
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_zoom_reset(view);
}

View File

@ -52,6 +52,8 @@ void surfer_delete(Surfer * surfer);
/* accessors */
GtkWidget * surfer_get_view(Surfer * surfer);
void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen);
void surfer_set_location(Surfer * surfer, char const * url);
void surfer_set_progress(Surfer * surfer, gdouble fraction);
@ -69,6 +71,8 @@ void surfer_warning(Surfer * surfer, char const * message);
void surfer_open(Surfer * surfer, char const * url);
void surfer_open_dialog(Surfer * surfer);
void surfer_open_tab(Surfer * surfer, char const * url);
void surfer_close_tab(Surfer * surfer);
void surfer_print(Surfer * surfer);