tazweb rev 79
Make 'Open in new window' open a new webview window, but still a bit buggy :-(
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Sun Apr 24 03:21:36 2011 +0200 (2011-04-24) |
parents | 9828b4fa1fa7 |
children | 32ceefc08f61 |
files | src/main.c |
line diff
1.1 --- a/src/main.c Sun Apr 24 02:54:48 2011 +0200 1.2 +++ b/src/main.c Sun Apr 24 03:21:36 2011 +0200 1.3 @@ -23,13 +23,14 @@ 1.4 static gchar *useragent = "TazWeb (X11; SliTaz GNU/Linux; U; en_US)"; 1.5 1.6 static gchar* pagetitle; 1.7 -static gchar* title; 1.8 static GtkWidget *mainwindow, *browser, *loader, *toolbar; 1.9 static GtkWidget *urientry, *search; 1.10 static WebKitWebView* webview; 1.11 static WebKitWebFrame* frame; 1.12 static gint progress; 1.13 +static gint count = 0; 1.14 const gchar* uri; 1.15 +static GtkWidget* create_window(WebKitWebView** newwebview); 1.16 1.17 /* Create an icon */ 1.18 static GdkPixbuf* 1.19 @@ -81,7 +82,7 @@ 1.20 static void 1.21 update() 1.22 { 1.23 - title = g_strdup(pagetitle); 1.24 + gchar* title = g_strdup(pagetitle); 1.25 if(! pagetitle) 1.26 title = g_strdup_printf("Unknow - TazWeb", pagetitle); 1.27 draw_loader(); 1.28 @@ -124,10 +125,12 @@ 1.29 gtk_entry_set_text(GTK_ENTRY(urientry), uri); 1.30 } 1.31 1.32 +/* Destroy the window */ 1.33 static void 1.34 destroy_cb(GtkWidget* widget, GtkWindow* window) 1.35 { 1.36 - gtk_main_quit(); 1.37 + if (g_atomic_int_dec_and_test(&count)) 1.38 + gtk_main_quit(); 1.39 } 1.40 1.41 /* Show page source */ 1.42 @@ -234,6 +237,31 @@ 1.43 webkit_web_view_zoom_in(webview); 1.44 } 1.45 1.46 +/* New webview clallbacks */ 1.47 +static WebKitWebView* 1.48 +create_web_view_cb(WebKitWebView* webview, WebKitWebFrame* web_frame, 1.49 + GtkWidget* window) 1.50 +{ 1.51 + WebKitWebView *newview; 1.52 + create_window(&newview); 1.53 + return newview; 1.54 +} 1.55 + 1.56 +static gboolean 1.57 +webview_ready_cb(WebKitWebView* webview, GtkWidget* window) 1.58 +{ 1.59 + gtk_widget_grab_focus(GTK_WIDGET(webview)); 1.60 + gtk_widget_show_all(window); 1.61 + return FALSE; 1.62 +} 1.63 + 1.64 +static gboolean 1.65 +close_webview_cb(WebKitWebView* webview, GtkWidget* window) 1.66 +{ 1.67 + gtk_widget_destroy(window); 1.68 + return TRUE; 1.69 +} 1.70 + 1.71 /* Add items to WebKit contextual menu */ 1.72 static void 1.73 populate_menu_cb(WebKitWebView *webview, GtkMenu *menu, gpointer data) 1.74 @@ -279,16 +307,9 @@ 1.75 gtk_widget_show_all(GTK_WIDGET(menu)); 1.76 } 1.77 1.78 -/* Open in a new window from menu */ 1.79 -static WebKitWebView* 1.80 -create_web_view_cb(WebKitWebView* webview, GtkWidget* window) 1.81 -{ 1.82 - return WEBKIT_WEB_VIEW(webview); 1.83 -} 1.84 - 1.85 /* Scrolled window for the webview */ 1.86 static GtkWidget* 1.87 -create_browser() 1.88 +create_browser(GtkWidget* window) 1.89 { 1.90 WebKitWebSettings *settings; 1.91 1.92 @@ -313,7 +334,11 @@ 1.93 g_signal_connect(webview, "download-requested", 1.94 G_CALLBACK(download_requested_cb), NULL); 1.95 g_signal_connect(webview, "create-web-view", 1.96 - G_CALLBACK(create_web_view_cb), webview); 1.97 + G_CALLBACK(create_web_view_cb), window); 1.98 + g_signal_connect(webview, "web-view-ready", 1.99 + G_CALLBACK(webview_ready_cb), window); 1.100 + g_signal_connect(webview, "close-web-view", 1.101 + G_CALLBACK(close_webview_cb), window); 1.102 1.103 /* Connect WebKit contextual menu items */ 1.104 g_object_connect(G_OBJECT(webview), "signal::populate-popup", 1.105 @@ -404,8 +429,10 @@ 1.106 1.107 /* Main window */ 1.108 static GtkWidget* 1.109 -create_window() 1.110 +create_window(WebKitWebView** newwebview) 1.111 { 1.112 + g_atomic_int_inc(&count); 1.113 + 1.114 GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 1.115 GtkWidget* vbox = gtk_vbox_new(FALSE, 0); 1.116 1.117 @@ -417,13 +444,16 @@ 1.118 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL); 1.119 1.120 /* Pack box and container */ 1.121 - gtk_box_pack_start(GTK_BOX(vbox), create_browser(), TRUE, TRUE, 0); 1.122 + gtk_box_pack_start(GTK_BOX(vbox), create_browser(window), TRUE, TRUE, 0); 1.123 gtk_container_add(GTK_CONTAINER(vbox), create_loader()); 1.124 gtk_box_set_child_packing(GTK_BOX(vbox), loader, 1.125 FALSE, FALSE, 0, GTK_PACK_START); 1.126 gtk_box_pack_start(GTK_BOX(vbox), create_toolbar(), FALSE, FALSE, 0); 1.127 gtk_container_add(GTK_CONTAINER(window), vbox); 1.128 1.129 + if (newwebview) 1.130 + *newwebview = webview; 1.131 + 1.132 return window; 1.133 } 1.134 1.135 @@ -443,7 +473,7 @@ 1.136 if (argv[1]) 1.137 check_requested_uri(); 1.138 1.139 - mainwindow = create_window(); 1.140 + mainwindow = create_window(&webview); 1.141 gtk_widget_show_all(mainwindow); 1.142 1.143 webkit_web_view_load_uri(webview, uri);