[dev] 2surf, an experiment in tiled browsing

From: Christian Neukirchen <chneukirchen_AT_gmail.com>
Date: Sat, 11 Jun 2011 19:34:06 +0200

Hey,

I have been thinking about a Xanadu-style web browser (e.g.
http://xanadu.com.au/ted/XUsurvey/pingshot.gif) where you have two
panes, and each link opens in the other pane; this is especially nice
instead of the "click -> read -> back button"-cycle common when browsing
lists of search results, forum topics, etc. I built a quick prototype as
a patch to surf(1). (You can shift-click to open in the same pane.)


diff -r 2533f186089d surf.c
--- a/surf.c Thu Mar 31 12:52:35 2011 +0200
+++ b/surf.c Sat Jun 11 19:24:54 2011 +0200
@@ -207,6 +207,18 @@
        return FALSE;
 }
 
+WebKitNavigationResponse
+decidenavigation(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c) {
+ if(webkit_web_navigation_action_get_reason(n) ==
+ WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED
+ && !(webkit_web_navigation_action_get_modifier_state(n) & 1)) {//shift
+ webkit_web_policy_decision_ignore(p);
+ fprintf(stderr, "%s %s\n", winid, webkit_network_request_get_uri(r));
+ return TRUE;
+ }
+ return FALSE;
+}
+
 void
 destroyclient(Client *c) {
        Client *p;
@@ -459,6 +471,7 @@
        g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c);
        g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c);
        g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c);
+ g_signal_connect(G_OBJECT(c->view), "navigation-policy-decision-requested", G_CALLBACK(decidenavigation), c);
        g_signal_connect(G_OBJECT(c->view), "mime-type-policy-decision-requested", G_CALLBACK(decidedownload), c);
        g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c);
        g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c);

You can drive it with this small shell script, 2surf:


#!/bin/sh
(surf -x $1 2>&1 & surf -x $2 2>&1) | awk '
/^[0-9]+$/ {
  if (a==0) { a = $1 } else { b = $1 }
}
/^[0-9]+ / {
  if (a==$1) { to = b } else { to = a }
  system("xprop -id " to " -f _SURF_GO 8s -set _SURF_GO " $2)
}'

(Somehow it didnt work with plain output to stdout due to weird
buffering issues, any ideas?)

I think its pretty nice and certainly worth a try, especially with the
common big wide screens these days.

Enjoy,

-- 
Christian Neukirchen  <chneukirchen@gmail.com>  http://chneukirchen.org
Received on Sat Jun 11 2011 - 19:34:06 CEST

This archive was generated by hypermail 2.2.0 : Sat Jun 11 2011 - 19:36:02 CEST