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);