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

View File

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

View File

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

View File

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

View File

@ -28,6 +28,7 @@ gboolean on_closex(gpointer data);
/* file menu */ /* file menu */
void on_file_close(gpointer data); void on_file_close(gpointer data);
void on_file_new_window(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(gpointer data);
void on_file_open_url(gpointer data); void on_file_open_url(gpointer data);
void on_file_print(gpointer data); void on_file_print(gpointer data);
@ -63,4 +64,9 @@ void on_preferences(gpointer data);
void on_refresh(gpointer data); void on_refresh(gpointer data);
void on_stop(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 #endif

View File

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

View File

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

View File

@ -64,6 +64,7 @@ typedef struct _GHtml
/* connections */ /* connections */
struct _GHtmlConn ** conns; struct _GHtmlConn ** conns;
size_t conns_cnt; size_t conns_cnt;
gdouble progress;
/* html widget */ /* html widget */
HtmlDocument * html_document; HtmlDocument * html_document;
@ -103,6 +104,7 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn);
static char const * _ghtml_get_base(GHtml * ghtml); static char const * _ghtml_get_base(GHtml * ghtml);
static int _ghtml_set_base(GHtml * ghtml, char const * url); 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, static int _ghtml_document_load(GHtml * ghtml, gchar const * url,
gchar const * post); gchar const * post);
static int _ghtml_document_reload(GHtml * ghtml); static int _ghtml_document_reload(GHtml * ghtml);
@ -140,6 +142,7 @@ GtkWidget * ghtml_new(Surfer * surfer)
ghtml->current = NULL; ghtml->current = NULL;
ghtml->conns = NULL; ghtml->conns = NULL;
ghtml->conns_cnt = 0; ghtml->conns_cnt = 0;
ghtml->progress = -1.0;
ghtml->html_view = html_view_new(); ghtml->html_view = html_view_new();
g_object_set_data(G_OBJECT(ghtml->html_view), "ghtml", ghtml); g_object_set_data(G_OBJECT(ghtml->html_view), "ghtml", ghtml);
g_signal_connect(G_OBJECT(ghtml->html_view), "button-press-event", 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 */ /* accessors */
/* ghtml_can_go_back */ /* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * widget) 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 */ /* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget) 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 */ /* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * widget) 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 */ /* ghtml_document_load */
static int _ghtml_document_load(GHtml * ghtml, gchar const * url, static int _ghtml_document_load(GHtml * ghtml, gchar const * url,
gchar const * post) gchar const * post)
@ -676,7 +722,7 @@ static gboolean _stream_load_idle_directory(GHtmlConn * conn)
#endif #endif
html_stream_write(conn->stream, tail, sizeof(tail) - 1); html_stream_write(conn->stream, tail, sizeof(tail) - 1);
closedir(dir); closedir(dir);
surfer_set_progress(conn->ghtml->surfer, -1.0); _ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL); surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn); _ghtmlconn_delete(conn);
return FALSE; return FALSE;
@ -698,7 +744,7 @@ static gboolean _stream_load_idle_file(GHtmlConn * conn)
} }
else else
{ {
surfer_set_progress(conn->ghtml->surfer, 0.0); _ghtml_set_progress(conn->ghtml, 0.0);
surfer_set_status(conn->ghtml->surfer, _("Reading file...")); surfer_set_status(conn->ghtml->surfer, _("Reading file..."));
if(fstat(fd, &st) == 0) if(fstat(fd, &st) == 0)
{ {
@ -737,7 +783,7 @@ static gboolean _stream_load_watch_file(GIOChannel * source,
} }
if(len == 0) /* no more data */ 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); surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn); _ghtmlconn_delete(conn);
return FALSE; return FALSE;
@ -748,15 +794,14 @@ static gboolean _stream_load_watch_file(GIOChannel * source,
if(conn->file_size > 0) if(conn->file_size > 0)
{ {
fraction = conn->file_read; fraction = conn->file_read;
surfer_set_progress(conn->ghtml->surfer, _ghtml_set_progress(conn->ghtml, fraction / conn->file_size);
fraction / conn->file_size);
} }
return TRUE; return TRUE;
} }
static gboolean _stream_load_idle_http(GHtmlConn * conn) 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...")); surfer_set_status(conn->ghtml->surfer, _("Resolving..."));
conn->http = gnet_conn_http_new(); conn->http = gnet_conn_http_new();
gnet_conn_http_set_uri(conn->http, conn->url); 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) if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE)
{ {
/* FIXME report error */ /* FIXME report error */
surfer_set_progress(conn->ghtml->surfer, -1.0); _ghtml_set_progress(conn->ghtml, -1.0);
} }
else else
{ {
@ -875,7 +920,7 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn)
rec += p->data_received; rec += p->data_received;
} }
fraction = rec; 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) static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)
@ -900,7 +945,7 @@ static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)
msg = _("Unspecified error"); msg = _("Unspecified error");
break; break;
} }
surfer_set_progress(conn->ghtml->surfer, -1.0); _ghtml_set_progress(conn->ghtml, -1.0);
surfer_set_status(conn->ghtml->surfer, NULL); surfer_set_status(conn->ghtml->surfer, NULL);
surfer_error(conn->ghtml->surfer, msg, 0); surfer_error(conn->ghtml->surfer, msg, 0);
_ghtmlconn_delete(conn); _ghtmlconn_delete(conn);
@ -947,7 +992,7 @@ static void _http_resolved(GConnHttpEventResolved * event, GHtmlConn * conn)
if(event->ia == NULL) if(event->ia == NULL)
{ {
#if 0 /* XXX check again if this is really an error case */ #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_set_status(conn->ghtml->surfer, NULL);
surfer_error(conn->ghtml->surfer, "Unknown host", 0); surfer_error(conn->ghtml->surfer, "Unknown host", 0);
_ghtmlconn_delete(conn); _ghtmlconn_delete(conn);
@ -994,7 +1039,7 @@ static void _http_response(GConnHttpEventResponse * event, GHtmlConn * conn)
static void _http_timeout(GHtmlConn * conn) static void _http_timeout(GHtmlConn * conn)
{ {
surfer_error(conn->ghtml->surfer, _("Timeout"), 0); 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); surfer_set_status(conn->ghtml->surfer, NULL);
_ghtmlconn_delete(conn); _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 */ /* accessors */
/* ghtml_can_go_back */ /* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * ghtml) 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 */ /* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget) 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 */ /* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * ghtml) 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 */ /* accessors */
/* ghtml_can_go_back */ /* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * widget) 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 */ /* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * widget) 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 */ /* ghtml_get_title */
char const * ghtml_get_title(GtkWidget * widget) 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 * 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, * Surfer; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA */ * 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 */ /* accessors */
/* ghtml_can_go_back */ /* ghtml_can_go_back */
gboolean ghtml_can_go_back(GtkWidget * ghtml) 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) char const * ghtml_get_location(GtkWidget * ghtml)
{ {
GtkWidget * view; 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 */ /* ghtml_get_source */
char const * ghtml_get_source(GtkWidget * ghtml) 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) char const * ghtml_get_title(GtkWidget * ghtml)
{ {
GtkWidget * view; GtkWidget * view;
@ -325,10 +357,9 @@ static WebKitWebView * _on_create_web_view(WebKitWebView * view,
* - this is a bit ugly (showing and hiding) * - this is a bit ugly (showing and hiding)
* - we may not want history etc to be copied * - we may not want history etc to be copied
* - it loads the current URL first */ * - it loads the current URL first */
surfer_show_window(copy, FALSE); ret = g_object_get_data(G_OBJECT(surfer_get_view(copy)), "view");
ret = g_object_get_data(G_OBJECT(copy->view), "view");
g_signal_connect(G_OBJECT(ret), "web-view-ready", G_CALLBACK( 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; return ret;
} }

View File

@ -25,6 +25,7 @@
/* GHTML */ /* GHTML */
/* functions */ /* functions */
GtkWidget * ghtml_new(Surfer * surfer); GtkWidget * ghtml_new(Surfer * surfer);
void ghtml_delete(GtkWidget * ghtml);
/* accessors */ /* accessors */
gboolean ghtml_can_go_back(GtkWidget * ghtml); 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_link_message(GtkWidget * ghtml);
char const * ghtml_get_location(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_source(GtkWidget * ghtml);
char const * ghtml_get_title(GtkWidget * ghtml); char const * ghtml_get_title(GtkWidget * ghtml);

View File

@ -31,6 +31,14 @@
/* Surfer */ /* Surfer */
/* private */ /* private */
/* types */
typedef struct _SurferIdle
{
Surfer * surfer;
char * url;
} SurferIdle;
/* variables */ /* variables */
static DesktopAccel _surfer_accel[] = static DesktopAccel _surfer_accel[] =
{ {
@ -46,6 +54,8 @@ static DesktopAccel _surfer_accel[] =
#ifndef EMBEDDED #ifndef EMBEDDED
static DesktopMenu _menu_file[] = 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", { N_("_New window"), G_CALLBACK(on_file_new_window), "window-new",
GDK_N }, GDK_N },
{ N_("_Open..."), G_CALLBACK(on_file_open), GTK_STOCK_OPEN, { 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 */ /* public */
/* functions */ /* functions */
/* surfer_new */ /* surfer_new */
static Surfer * _new_do(char const * url);
static gboolean _new_idle(gpointer data); static gboolean _new_idle(gpointer data);
Surfer * surfer_new(char const * url) 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; Surfer * surfer;
GtkAccelGroup * group; GtkAccelGroup * group;
@ -163,11 +197,9 @@ Surfer * surfer_new(char const * url)
if((surfer = malloc(sizeof(*surfer))) == NULL) if((surfer = malloc(sizeof(*surfer))) == NULL)
return NULL; return NULL;
surfer->url = NULL;
surfer->homepage = NULL; surfer->homepage = NULL;
if((surfer->config = config_new()) == NULL if((surfer->config = config_new()) == NULL
|| surfer_config_load(surfer) != 0 || surfer_config_load(surfer) != 0)
|| (url != NULL && (surfer->url = strdup(url)) == NULL))
{ {
surfer_delete(surfer); surfer_delete(surfer);
return NULL; return NULL;
@ -181,7 +213,7 @@ Surfer * surfer_new(char const * url)
#if GTK_CHECK_VERSION(2, 6, 0) #if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(surfer->window), "stock_internet"); gtk_window_set_icon_name(GTK_WINDOW(surfer->window), "stock_internet");
#endif #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_signal_connect_swapped(G_OBJECT(surfer->window), "delete-event",
G_CALLBACK(on_closex), surfer); G_CALLBACK(on_closex), surfer);
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
@ -248,14 +280,13 @@ Surfer * surfer_new(char const * url)
on_path_activate), surfer); on_path_activate), surfer);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
/* view */ /* notebook */
if((surfer->view = ghtml_new(surfer)) == NULL) surfer->notebook = gtk_notebook_new();
{ gtk_notebook_set_show_border(GTK_NOTEBOOK(surfer->notebook), FALSE);
surfer_error(NULL, _("Could not initialize HTML renderer"), 0); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(surfer->notebook), FALSE);
surfer_delete(surfer); g_signal_connect(G_OBJECT(surfer->notebook), "switch-page", G_CALLBACK(
return NULL; on_notebook_switch_page), surfer);
} gtk_box_pack_start(GTK_BOX(vbox), surfer->notebook, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0);
/* statusbar */ /* statusbar */
surfer->statusbox = gtk_hbox_new(FALSE, 0); surfer->statusbox = gtk_hbox_new(FALSE, 0);
surfer->progress = gtk_progress_bar_new(); surfer->progress = gtk_progress_bar_new();
@ -268,7 +299,7 @@ Surfer * surfer_new(char const * url)
gtk_widget_show_all(surfer->statusbox); gtk_widget_show_all(surfer->statusbox);
gtk_container_add(GTK_CONTAINER(surfer->window), vbox); gtk_container_add(GTK_CONTAINER(surfer->window), vbox);
gtk_widget_grab_focus(GTK_WIDGET(surfer->lb_path)); gtk_widget_grab_focus(GTK_WIDGET(surfer->lb_path));
gtk_widget_show_all(surfer->window); gtk_widget_show_all(vbox);
/* preferences window */ /* preferences window */
surfer->pr_window = NULL; surfer->pr_window = NULL;
/* find dialog */ /* find dialog */
@ -277,18 +308,16 @@ Surfer * surfer_new(char const * url)
gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0);
surfer_set_status(surfer, NULL); surfer_set_status(surfer, NULL);
surfer_cnt++; 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; return surfer;
} }
static gboolean _new_idle(gpointer data) 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; return FALSE;
} }
@ -297,8 +326,14 @@ static gboolean _new_idle(gpointer data)
Surfer * surfer_new_copy(Surfer * surfer) Surfer * surfer_new_copy(Surfer * surfer)
{ {
Surfer * ret; Surfer * ret;
GtkWidget * view;
char const * url;
if((ret = surfer_new(surfer->url)) == NULL) if((view = surfer_get_view(surfer)) == NULL)
url = NULL;
else
url = ghtml_get_location(view);
if((ret = surfer_new(url)) == NULL)
return NULL; return NULL;
/* FIXME also copy history */ /* FIXME also copy history */
return ret; return ret;
@ -310,7 +345,6 @@ void surfer_delete(Surfer * surfer)
{ {
gtk_widget_destroy(surfer->window); gtk_widget_destroy(surfer->window);
config_delete(surfer->config); config_delete(surfer->config);
free(surfer->url);
free(surfer->homepage); free(surfer->homepage);
free(surfer); free(surfer);
if(--surfer_cnt == 0) if(--surfer_cnt == 0)
@ -319,6 +353,18 @@ void surfer_delete(Surfer * surfer)
/* accessors */ /* 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 */ /* surfer_set_fullscreen */
void surfer_set_fullscreen(Surfer * surfer, gboolean 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 */ static int i = 0; /* XXX should be set per-window */
GtkWidget * widget; GtkWidget * widget;
char * p; GtkWidget * view;
if(url == NULL)
url = "";
widget = gtk_bin_get_child(GTK_BIN(surfer->lb_path)); widget = gtk_bin_get_child(GTK_BIN(surfer->lb_path));
gtk_entry_set_text(GTK_ENTRY(widget), url); gtk_entry_set_text(GTK_ENTRY(widget), url);
/* FIXME what about history? */ if((view = surfer_get_view(surfer)) == NULL)
if((p = strdup(url)) != NULL) return; /* XXX really correct? */
{
free(surfer->url);
surfer->url = p;
}
if(i == 8) if(i == 8)
gtk_combo_box_remove_text(GTK_COMBO_BOX(surfer->lb_path), 0); gtk_combo_box_remove_text(GTK_COMBO_BOX(surfer->lb_path), 0);
else else
i++; i++;
gtk_combo_box_append_text(GTK_COMBO_BOX(surfer->lb_path), url); gtk_combo_box_append_text(GTK_COMBO_BOX(surfer->lb_path), url);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), ghtml_can_go_back(
ghtml_can_go_back(surfer->view)); view));
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward),
ghtml_can_go_forward(surfer->view)); ghtml_can_go_forward(view));
} }
/* surfer_set_progress */ /* surfer_set_progress */
void surfer_set_progress(Surfer * surfer, gdouble fraction) void surfer_set_progress(Surfer * surfer, gdouble fraction)
{ {
GtkWidget * view;
char buf[10] = " "; 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) if(fraction >= 0.0 && fraction <= 1.0)
snprintf(buf, sizeof(buf), "%.1f%%", fraction * 100); snprintf(buf, sizeof(buf), "%.1f%%", fraction * 100);
else else
@ -403,8 +451,12 @@ void surfer_set_status(Surfer * surfer, char const * status)
/* surfer_set_title */ /* surfer_set_title */
void surfer_set_title(Surfer * surfer, char const * title) void surfer_set_title(Surfer * surfer, char const * title)
{ {
GtkWidget * view;
char buf[256]; 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) snprintf(buf, sizeof(buf), "%s%s%s", "Web surfer", (title != NULL)
? " - " : "", (title != NULL) ? title : ""); ? " - " : "", (title != NULL) ? title : "");
gtk_window_set_title(GTK_WINDOW(surfer->window), buf); gtk_window_set_title(GTK_WINDOW(surfer->window), buf);
@ -412,6 +464,27 @@ void surfer_set_title(Surfer * surfer, char const * title)
/* useful */ /* 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 */ /* surfer_config_load */
int surfer_config_load(Surfer * surfer) 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) static void _on_find_activate(GtkWidget * widget, gpointer data)
{ {
Surfer * surfer = data; Surfer * surfer = data;
GtkWidget * view;
char const * text; char const * text;
gboolean sensitive; gboolean sensitive;
gboolean wrap; gboolean wrap;
if((view = surfer_get_view(surfer)) == NULL)
return;
if((text = gtk_entry_get_text(GTK_ENTRY(widget))) == NULL if((text = gtk_entry_get_text(GTK_ENTRY(widget))) == NULL
|| strlen(text) == 0) || strlen(text) == 0)
return; return;
@ -572,7 +648,7 @@ static void _on_find_activate(GtkWidget * widget, gpointer data)
surfer->fi_case)); surfer->fi_case));
wrap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( wrap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_wrap)); surfer->fi_wrap));
if(ghtml_find(surfer->view, text, sensitive, wrap) == TRUE) if(ghtml_find(view, text, sensitive, wrap) == TRUE)
return; return;
surfer_error(surfer, _("Text not found"), 0); 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 surfer_go_back(Surfer * surfer)
{ {
gboolean ret; gboolean ret;
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return FALSE;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE); 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); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), ret);
return ret; return ret;
} }
@ -608,9 +687,12 @@ gboolean surfer_go_back(Surfer * surfer)
gboolean surfer_go_forward(Surfer * surfer) gboolean surfer_go_forward(Surfer * surfer)
{ {
gboolean ret; gboolean ret;
GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return FALSE;
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE); 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); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), ret);
return ret; return ret;
} }
@ -630,12 +712,20 @@ void surfer_go_home(Surfer * surfer)
/* surfer_open */ /* surfer_open */
void surfer_open(Surfer * surfer, char const * url) 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) 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_refresh), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ghtml_stop(surfer->view); ghtml_stop(view);
ghtml_load_url(surfer->view, url); ghtml_load_url(view, url);
} }
else else
gtk_widget_grab_focus(surfer->lb_path); 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 */ /* surfer_print */
void surfer_print(Surfer * surfer) void surfer_print(Surfer * surfer)
{ {
ghtml_print(surfer->view); GtkWidget * view;
if((view = surfer_get_view(surfer)) == NULL)
return;
ghtml_print(view);
} }
/* surfer_refresh */ /* surfer_refresh */
void surfer_refresh(Surfer * surfer) 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); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE);
ghtml_refresh(surfer->view); ghtml_refresh(view);
} }
/* surfer_reload */ /* surfer_reload */
void surfer_reload(Surfer * surfer) 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); 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 */ /* surfer_save */
void surfer_save(Surfer * surfer, char const * filename) void surfer_save(Surfer * surfer, char const * filename)
{ {
GtkWidget * view;
char const * source; char const * source;
GtkWidget * dialog; GtkWidget * dialog;
size_t len; size_t len;
FILE * fp; FILE * fp;
char buf[256]; 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 */ return; /* XXX report error */
if(filename == NULL) if(filename == NULL)
{ {
@ -738,7 +884,11 @@ void surfer_save(Surfer * surfer, char const * filename)
/* surfer_select_all */ /* surfer_select_all */
void surfer_select_all(Surfer * surfer) 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 */ /* surfer_stop */
void surfer_stop(Surfer * surfer) 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 */ /* surfer_unselect_all */
void surfer_unselect_all(Surfer * surfer) 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; GtkTextBuffer * tbuf;
PangoFontDescription * desc; PangoFontDescription * desc;
char buf[256]; char buf[256];
char const * url;
char const * source; char const * source;
if(surfer->url == NULL) if((widget = surfer_get_view(surfer)) == NULL)
return; 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 */ return; /* FIXME download to a temporary file and open */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
group = gtk_accel_group_new(); group = gtk_accel_group_new();
@ -831,8 +992,7 @@ void surfer_view_source(Surfer * surfer)
GTK_ACCEL_VISIBLE, cc); GTK_ACCEL_VISIBLE, cc);
gtk_window_add_accel_group(GTK_WINDOW(window), group); gtk_window_add_accel_group(GTK_WINDOW(window), group);
gtk_window_set_default_size(GTK_WINDOW(window), 640, 480); gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
snprintf(buf, sizeof(buf), "%s%s", _("Web surfer - Source of "), snprintf(buf, sizeof(buf), "%s%s", _("Web surfer - Source of "), url);
surfer->url);
gtk_window_set_title(GTK_WINDOW(window), buf); gtk_window_set_title(GTK_WINDOW(window), buf);
g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK( g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(
_on_source_closex), NULL); _on_source_closex), NULL);
@ -886,21 +1046,33 @@ void surfer_warning(Surfer * surfer, char const * message)
/* surfer_zoom_in */ /* surfer_zoom_in */
void surfer_zoom_in(Surfer * surfer) 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 */ /* surfer_zoom_out */
void surfer_zoom_out(Surfer * surfer) 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 */ /* surfer_zoom_reset */
void surfer_zoom_reset(Surfer * surfer) 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 */ /* accessors */
GtkWidget * surfer_get_view(Surfer * surfer);
void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen); void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen);
void surfer_set_location(Surfer * surfer, char const * url); void surfer_set_location(Surfer * surfer, char const * url);
void surfer_set_progress(Surfer * surfer, gdouble fraction); 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(Surfer * surfer, char const * url);
void surfer_open_dialog(Surfer * surfer); 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); void surfer_print(Surfer * surfer);