diff --git a/po/de.po b/po/de.po index 84f3f52..25ee6ee 100644 --- a/po/de.po +++ b/po/de.po @@ -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 \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" diff --git a/po/es.po b/po/es.po index 305da17..61f2d93 100644 --- a/po/es.po +++ b/po/es.po @@ -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 \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 "" diff --git a/po/fr.po b/po/fr.po index e16133d..f23e18f 100644 --- a/po/fr.po +++ b/po/fr.po @@ -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 \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" diff --git a/po/it.po b/po/it.po index 009b2d5..bc24892 100644 --- a/po/it.po +++ b/po/it.po @@ -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 \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 "" diff --git a/src/callbacks.c b/src/callbacks.c index a666b4f..186548b 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -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) { diff --git a/src/callbacks.h b/src/callbacks.h index 6280216..2da6c13 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -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 diff --git a/src/common.h b/src/common.h index 5e5b361..f129e46 100644 --- a/src/common.h +++ b/src/common.h @@ -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; diff --git a/src/common/conn.c b/src/common/conn.c index fdce1c9..eb59dd6 100644 --- a/src/common/conn.c +++ b/src/common/conn.c @@ -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); } diff --git a/src/ghtml-gtkhtml.c b/src/ghtml-gtkhtml.c index 6d2a8a2..c6f3f7d 100644 --- a/src/ghtml-gtkhtml.c +++ b/src/ghtml-gtkhtml.c @@ -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); } diff --git a/src/ghtml-gtkmozembed.c b/src/ghtml-gtkmozembed.c index 51bf246..8311074 100644 --- a/src/ghtml-gtkmozembed.c +++ b/src/ghtml-gtkmozembed.c @@ -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) { diff --git a/src/ghtml-gtktextview.c b/src/ghtml-gtktextview.c index 674b83c..0feb2a5 100644 --- a/src/ghtml-gtktextview.c +++ b/src/ghtml-gtktextview.c @@ -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) { diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c index 4514a3b..117dc8d 100644 --- a/src/ghtml-webkit.c +++ b/src/ghtml-webkit.c @@ -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; } diff --git a/src/ghtml.h b/src/ghtml.h index 46c3b39..ba56d3e 100644 --- a/src/ghtml.h +++ b/src/ghtml.h @@ -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); diff --git a/src/surfer.c b/src/surfer.c index 155b630..7534b59 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -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); } diff --git a/src/surfer.h b/src/surfer.h index eb3b298..9df8093 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -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);