diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c
index 68e797e..3c134d0 100644
--- a/src/ghtml-webkit.c
+++ b/src/ghtml-webkit.c
@@ -23,6 +23,8 @@
/* prototypes */
/* functions */
/* callbacks */
+static WebKitWebView * _on_create_web_view(WebKitWebView * view,
+ WebKitWebFrame * frame, gpointer data);
static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
const gchar * url, gpointer data);
static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * frame,
@@ -35,6 +37,7 @@ static void _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame,
gchar * message, gpointer data);
static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * title, gpointer data);
+static gboolean _on_web_view_ready(WebKitWebView * view, gpointer data);
/* public */
@@ -51,6 +54,8 @@ GtkWidget * ghtml_new(Surfer * surfer)
g_object_set_data(G_OBJECT(widget), "surfer", surfer);
g_object_set_data(G_OBJECT(widget), "view", view);
/* view */
+ g_signal_connect(G_OBJECT(view), "create-web-view", G_CALLBACK(
+ _on_create_web_view), widget);
g_signal_connect(G_OBJECT(view), "hovering-over-link", G_CALLBACK(
_on_hovering_over_link), widget);
g_signal_connect(G_OBJECT(view), "load-finished", G_CALLBACK(
@@ -221,6 +226,28 @@ void ghtml_zoom_reset(GtkWidget * ghtml)
/* private */
/* functions */
+static WebKitWebView * _on_create_web_view(WebKitWebView * view,
+ WebKitWebFrame * frame, gpointer data)
+{
+ WebKitWebView * ret;
+ Surfer * surfer;
+ Surfer * copy;
+
+ surfer = g_object_get_data(G_OBJECT(data), "surfer");
+ if((copy = surfer_new_copy(surfer)) == NULL)
+ return NULL;
+ /* FIXME many things:
+ * - this is a bit ugly (showing and hiding)
+ * - we may not want history etc to be copied
+ * - it loads the current URL first */
+ gtk_widget_hide(copy->window);
+ ret = g_object_get_data(G_OBJECT(copy->view), "view");
+ g_signal_connect(G_OBJECT(ret), "web-view-ready", G_CALLBACK(
+ _on_web_view_ready), copy->view);
+ return ret;
+}
+
+
static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
const gchar * url, gpointer data)
{
@@ -282,3 +309,33 @@ static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame,
surfer = g_object_get_data(G_OBJECT(data), "surfer");
surfer_set_title(surfer, title);
}
+
+
+static gboolean _on_web_view_ready(WebKitWebView * view, gpointer data)
+{
+ Surfer * surfer;
+ WebKitWebWindowFeatures * features;
+ gboolean b;
+ gint w;
+ gint h;
+
+ surfer = g_object_get_data(G_OBJECT(data), "surfer");
+ features = webkit_web_view_get_window_features(WEBKIT_WEB_VIEW(view));
+ /* FIXME track properties with notify:: instead */
+ g_object_get(G_OBJECT(features), "width", &w, "height", &h, NULL);
+ if(w > 0 && h > 0)
+ gtk_window_resize(GTK_WINDOW(surfer->window), w, h);
+ g_object_get(G_OBJECT(features), "fullscreen", &b, NULL);
+ if(b == TRUE)
+ gtk_window_fullscreen(GTK_WINDOW(surfer->window));
+#ifndef FOR_EMBEDDED
+ g_object_get(G_OBJECT(features), "menubar-visible", &b, NULL);
+ if(b == FALSE)
+ gtk_widget_hide(surfer->menubar);
+#endif
+ g_object_get(G_OBJECT(features), "statusbar-visible", &b, NULL);
+ if(b == FALSE)
+ gtk_widget_hide(surfer->statusbox);
+ gtk_widget_show(surfer->window);
+ return FALSE;
+}
diff --git a/src/surfer.c b/src/surfer.c
index 4805ce6..8f6a2ff 100644
--- a/src/surfer.c
+++ b/src/surfer.c
@@ -132,6 +132,13 @@ Surfer * surfer_new(char const * url)
if((surfer = malloc(sizeof(*surfer))) == NULL)
return NULL;
+ surfer->url = NULL;
+ if(url != NULL && (surfer->url = strdup(url)) == NULL)
+ {
+ free(surfer);
+ return NULL;
+ }
+ /* widgets */
/* window */
surfer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(surfer->window), 800, 600);
@@ -233,11 +240,7 @@ Surfer * surfer_new(char const * url)
surfer_cnt++;
/* load url as soon as we're idle */
if(url != NULL)
- {
- g_object_set_data(G_OBJECT(surfer->window), "url",
- g_strdup(url)); /* XXX a bit ugly */
g_idle_add(_new_idle, surfer);
- }
return surfer;
}
@@ -306,19 +309,29 @@ static GtkWidget * _new_menubar(Surfer * surfer)
static gboolean _new_idle(gpointer data)
{
Surfer * surfer = data;
- gchar * url;
- url = g_object_get_data(G_OBJECT(surfer->window), "url");
- ghtml_load_url(surfer->view, url);
- g_free(url);
+ ghtml_load_url(surfer->view, surfer->url);
return FALSE;
}
+/* surfer_new_copy */
+Surfer * surfer_new_copy(Surfer * surfer)
+{
+ Surfer * ret;
+
+ if((ret = surfer_new(surfer->url)) == NULL)
+ return NULL;
+ /* FIXME also copy history */
+ return ret;
+}
+
+
/* surfer_delete */
void surfer_delete(Surfer * surfer)
{
/* config_delete(surfer->config); */
+ free(surfer->url);
free(surfer);
surfer_cnt--;
}
diff --git a/src/surfer.h b/src/surfer.h
index 51e7ad7..204871d 100644
--- a/src/surfer.h
+++ b/src/surfer.h
@@ -41,6 +41,8 @@
/* types */
typedef struct _Surfer
{
+ char * url;
+
/* widgets */
/* main window */
GtkWidget * window;
@@ -66,6 +68,7 @@ extern unsigned int surfer_cnt;
/* functions */
Surfer * surfer_new(char const * url);
+Surfer * surfer_new_copy(Surfer * surfer);
void surfer_delete(Surfer * surfer);