分页: 1 / 2

surf 辅助浏览器(添加 bookmarks 补丁)

发表于 : 2011-01-09 22:38
aBiNg
因为连 EE 都不知晓这神器,故推荐。基于 gtk+/webkit,源代码 800+ 行,不想开 firefox/opera/chrome 之流时非常实用,譬如临时搜索个东东,用下 google 翻译,看下 google news,打开 irc 上帖的网页等。

用法:(高手都会想到在 WM 中绑定个 google 的快捷键)
surf url

快捷键:(c 指 Ctrl 键)
c-h: 后退
c-r: 刷新
c-g: 输入 url(需要 dmenu 支援)
c-d: 添加到收藏夹
c-b: 打开收藏夹

我只会这么多,其余看 man。:P

遗憾:
需手动編輯收藏夹条目,位于 ~/.surf/bookmarks 文件中。

下载见附件(i386 版本)。另一个附件伪装得还可以吧。XD

忘了说,我动态编译的这个是 0.4.1 版本,主页:http://surf.suckless.org/

14/01/2011 更新:我给补个 dirty patch,用以收藏夹功能,并顺带将下载目录改到 ~/download 下,而不是家目录:

代码: 全选

diff -r 7a931a352cf9 Makefile
--- a/Makefile	Thu Sep 09 11:15:02 2010 +0200
+++ b/Makefile	Fri Jan 14 18:30:40 2011 +0800
@@ -20,7 +20,7 @@
 
 ${OBJ}: config.h config.mk
 
-config.h:
+config.h: config.def.h
 	@echo creating $@ from config.def.h
 	@cp config.def.h $@
 
diff -r 7a931a352cf9 config.def.h
--- a/config.def.h	Thu Sep 09 11:15:02 2010 +0200
+++ b/config.def.h	Fri Jan 14 18:30:40 2011 +0800
@@ -5,6 +5,7 @@
 static char *stylefile      = ".surf/style.css";
 static char *scriptfile     = ".surf/script.js";
 static char *cookiefile     = ".surf/cookies.txt";
+static char *bookmarkfile   = ".surf/bookmarks";
 static time_t sessiontime   = 3600;
 #define NOBACKGROUND 0
 
@@ -14,8 +15,14 @@
 	p, q, winid, NULL } }
 #define DOWNLOAD(d) { \
 	.v = (char *[]){ "/bin/sh", "-c", \
-	"xterm -e \"wget --load-cookies ~/.surf/cookies.txt '$0';\"", \
+	"xterm -e \"wget --load-cookies ~/.surf/cookies.txt '$0' -P ~/download;\"", \
 	d, NULL } }
+#define GETBOOKMARKS(p, q) { \
+	.v = (char *[]){ "/bin/sh", "-c", \
+	"prop=\"`cat ~/.surf/bookmarks | dmenu`\" &&" \
+	"xprop -id $2 -f $1 8s -set $1 \"$prop\"", \
+	p, q, winid, NULL } }
 #define MODKEY GDK_CONTROL_MASK
 static Key keys[] = {
     /* modifier	            keyval      function    arg             Focus */
@@ -37,4 +44,6 @@
     { MODKEY,               GDK_f,      spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
     { MODKEY,               GDK_n,      find,       { .b = TRUE } },
     { MODKEY|GDK_SHIFT_MASK,GDK_n,      find,       { .b = FALSE } },
+    { MODKEY,               GDK_d,      bookmarks,  { 0 } },
+    { MODKEY,               GDK_b,      spawn,      GETBOOKMARKS("_SURF_URI", "_SURF_GO") },
 };
diff -r 7a931a352cf9 surf.c
--- a/surf.c	Thu Sep 09 11:15:02 2010 +0200
+++ b/surf.c	Fri Jan 14 18:30:40 2011 +0800
@@ -82,6 +82,7 @@
 static char *geturi(Client *c);
 void gotheaders(SoupMessage *msg, gpointer user_data);
 static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
+static void bookmarks(Client *c, const Arg *arg);
 static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c);
 static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c);
 static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
@@ -337,6 +338,26 @@
 	return FALSE;
 }
 
+void
+bookmarks(Client *c, const Arg *arg) {
+    char *uri;
+    char buf[512];
+    FILE *f;
+    gboolean exists = FALSE;
+
+    uri = (char *)webkit_web_view_get_uri(c->view);
+    f = fopen(bookmarkfile, "r+");
+    while(fgets(buf, sizeof buf, f)) {
+        if(strncmp(buf, uri, strlen(uri)) == 0) {
+            exists = TRUE;
+            break;
+        }
+    }
+    if(!exists)
+        fputs(strcat(uri, "\n"), f);
+    fclose(f);
+}
+
 gboolean
 keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
 	guint i;
@@ -692,6 +713,7 @@
 	cookiefile = buildpath(cookiefile);
 	scriptfile = buildpath(scriptfile);
 	stylefile = buildpath(stylefile);
+	bookmarkfile = buildpath(bookmarkfile);
 
 	/* request handler */
 	s = webkit_get_default_session();
15/01/2011 更新:收藏夾帶標題,但多個 zenity 依賴了,悲劇(要讓 dmenu 搞出中文更悲劇啊 XD):

代码: 全选

diff -r 7a931a352cf9 Makefile
--- a/Makefile	Thu Sep 09 11:15:02 2010 +0200
+++ b/Makefile	Sat Jan 15 16:02:08 2011 +0800
@@ -20,7 +20,7 @@
 
 ${OBJ}: config.h config.mk
 
-config.h:
+config.h: config.def.h
 	@echo creating $@ from config.def.h
 	@cp config.def.h $@
 
diff -r 7a931a352cf9 config.def.h
--- a/config.def.h	Thu Sep 09 11:15:02 2010 +0200
+++ b/config.def.h	Sat Jan 15 16:02:08 2011 +0800
@@ -5,6 +5,7 @@
 static char *stylefile      = ".surf/style.css";
 static char *scriptfile     = ".surf/script.js";
 static char *cookiefile     = ".surf/cookies.txt";
+static char *bookmarkfile   = ".surf/bookmarks";
 static time_t sessiontime   = 3600;
 #define NOBACKGROUND 0
 
@@ -14,8 +15,15 @@
 	p, q, winid, NULL } }
 #define DOWNLOAD(d) { \
 	.v = (char *[]){ "/bin/sh", "-c", \
-	"xterm -e \"wget --load-cookies ~/.surf/cookies.txt '$0';\"", \
+	"xterm -e \"wget --load-cookies ~/.surf/cookies.txt '$0' -P ~/download;\"", \
 	d, NULL } }
+#define GETBOOKMARKS(p, q) { \
+	.v = (char *[]){ "/bin/sh", "-c", \
+	"prop=$(sel=`cut -d '@' -f 1 ~/.surf/bookmarks | \
+    zenity --list --column='Bookmarks' --width=320 --height=280` && \
+    awk -F@ -v a=\"$sel\" '{if($1==a) print $2}' ~/.surf/bookmarks) &&" \
+	"xprop -id $2 -f $1 8s -set $1 \"$prop\"", \
+	p, q, winid, NULL } }
 #define MODKEY GDK_CONTROL_MASK
 static Key keys[] = {
     /* modifier	            keyval      function    arg             Focus */
@@ -37,4 +45,6 @@
     { MODKEY,               GDK_f,      spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
     { MODKEY,               GDK_n,      find,       { .b = TRUE } },
     { MODKEY|GDK_SHIFT_MASK,GDK_n,      find,       { .b = FALSE } },
+    { MODKEY,               GDK_d,      bookmarks,  { 0 } },
+    { MODKEY,               GDK_b,      spawn,      GETBOOKMARKS("_SURF_URI", "_SURF_GO") },
 };
diff -r 7a931a352cf9 surf.c
--- a/surf.c	Thu Sep 09 11:15:02 2010 +0200
+++ b/surf.c	Sat Jan 15 16:02:08 2011 +0800
@@ -82,6 +82,7 @@
 static char *geturi(Client *c);
 void gotheaders(SoupMessage *msg, gpointer user_data);
 static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
+static void bookmarks(Client *c, const Arg *arg);
 static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c);
 static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c);
 static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
@@ -337,6 +338,32 @@
 	return FALSE;
 }
 
+void
+bookmarks(Client *c, const Arg *arg) {
+    char uri[256];
+    char tit[512];
+    char buf[512];
+    FILE *f;
+    gboolean exists = FALSE;
+
+    memcpy(uri, webkit_web_view_get_uri(c->view), sizeof(uri) - 1);
+    uri[255] = '\0';
+    memcpy(tit, webkit_web_view_get_title(c->view), sizeof(uri) - 1);
+    strcat(tit, "@");
+    strcat(tit, uri);
+
+    f = fopen(bookmarkfile, "r+");
+    while(fgets(buf, sizeof buf, f)) {
+        if(strncmp(buf, tit, strlen(tit)) == 0) {
+            exists = TRUE;
+            break;
+        }
+    }
+    if(!exists)
+        fputs(strcat(tit, "\n"), f);
+    fclose(f);
+}
+
 gboolean
 keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
 	guint i;
@@ -692,6 +719,7 @@
 	cookiefile = buildpath(cookiefile);
 	scriptfile = buildpath(scriptfile);
 	stylefile = buildpath(stylefile);
+	bookmarkfile = buildpath(bookmarkfile);
 
 	/* request handler */
 	s = webkit_get_default_session();
以上二個 patch,自己權衡了。

Re: surf 辅助浏览器

发表于 : 2011-01-09 22:41
adagio
不愧是老鸟,有档次 :em11

Re: surf 辅助浏览器

发表于 : 2011-01-09 22:43
photor
:em06

Re: surf 辅助浏览器

发表于 : 2011-01-09 22:50
susbarbatus
这东西弱到我都佩服了……
我比较期待jumanji

Re: surf 辅助浏览器

发表于 : 2011-01-09 22:53
adagio
哇哈哈,居然是类vi的键绑定 :em05

Re: surf 辅助浏览器

发表于 : 2011-01-09 22:57
susbarbatus
800+ 行源码用来学习浏览器倒是不错,就好像用linux0.01学OS

Re: surf 辅助浏览器

发表于 : 2011-01-10 12:46
eexpress
支持bt的,上。

Re: surf 辅助浏览器

发表于 : 2011-01-11 10:08
levee
喜欢VI风格浏览器的不妨试试这个:http://opensource.conformal.com/wiki/XXXTerm

Re: surf 辅助浏览器

发表于 : 2011-01-11 20:07
momova
EE竟然不知道,神,你已经堕落神坛了

Re: surf 辅助浏览器

发表于 : 2011-01-11 21:36
feng8899
susbarbatus 写了:800+ 行源码用来学习浏览器倒是不错,就好像用linux0.01学OS
这个给力

Re: surf 辅助浏览器

发表于 : 2011-01-12 16:44
susbarbatus
levee 写了:喜欢VI风格浏览器的不妨试试这个:http://opensource.conformal.com/wiki/XXXTerm
试了一下,不好用……

Re: surf 辅助浏览器

发表于 : 2011-01-12 16:57
后山人
:em03

不好意思。这东西 怎么用啊???

Re: surf 辅助浏览器

发表于 : 2011-01-12 20:31
adagio
后山人 写了::em03

不好意思。这东西 怎么用啊???
用神器的第一步,鼠标扔掉,其他的慢慢就知道了

Re: surf 辅助浏览器

发表于 : 2011-01-12 20:39
billbear
:em01

Re: surf 辅助浏览器

发表于 : 2011-01-12 22:08
后山人
adagio 写了:
后山人 写了::em03

不好意思。这东西 怎么用啊???
用神器的第一步,鼠标扔掉,其他的慢慢就知道了

你说的没懂。不过我把他拷到/bin 下了。不知道这样有没有什么不好的?