From 9fc16aef17168afb208bcefe484549bd1f6eb2d2 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 29 Mar 2009 01:53:43 +0000 Subject: [PATCH] Implementing more callbacks --- src/ghtml-webkit.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ src/surfer.c | 29 ++++++++++++++++------- src/surfer.h | 3 +++ 3 files changed, 81 insertions(+), 8 deletions(-) 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);