Hi Markus,

First of all, I have to confess (*glups*) that I am not a programmer, just a
beginner enjoying quality software and trying to learn from that.
For that, suckless tools and software help a lot due to the clarity of the
code.

Le dimanche 15 mars 2015 à 01:12:19, Markus Teich a écrit :
> Sébastien Poher wrote:
> > I've add cariage return so that visited URIs are not put one after one in
> > history file but each one on a new line.
> 
> > +           FILE *f;
> > +           f = fopen(historyfile, "a+");
> > +           fprintf(f, "\n%s", u);
> > +           fclose(f);
> 
> You should check if the file could be opened. Also you can replace the
> suckless-less printf function with two calls to fputs, which don't have to 
> parse
> a formatstring:
> 
> if((f = fopen(historyfile, "a+"))) {
>     fputs(u, f);
>     fputs("\n", f);
>     fclose(f);
> }

As I mentionned above, I am not, at the moment at least, able to understand
the inherent differences between those two functions, so I'll rely on your code.

> > Instead of using the original version, I've adapted the function in the same
> > vein of the bookmarking patch so that one can browse its history from dmenu 
> > by
> > hiting C+S+h keys.
> 
> I think having another shortcut to open a URL is superfluous. I changed ctrl-g
> to also display the history (most recent entry topmost). Also I use a search
> history and therefore split the SETPROP define into SETURI and SETSEARCH:
> 
> #define SETURI { \
>     .v = (char *[]){ "/bin/sh", "-c", \
>         "prop=\"`xprop -id $0 _SURF_URI" \
>         " | cut -d '\"' -f 2" \
>         " | tac - \"${HOME}/.surf/history\"" \
>         " | awk '!x[$0]++'" \
>         " | dmenu -i -l 10`\"" \
>         " && xprop -id $0 -f _SURF_GO 8s -set _SURF_GO \"$prop\"", \
>         winid, NULL \
>     } \
> }
> 
> #define SETSEARCH { \
>     .v = (char *[]){ "/bin/sh", "-c", \
>         "prop=\"`xprop -id $0 _SURF_FIND" \
>         " | cut -d '\"' -f 2" \
>         " | tac - \"${HOME}/.surf/searches\"" \
>         " | awk '!x[$0]++'" \
>         " | xargs -0 printf %b" \
>         " | dmenu -i -l 10`\"" \
>         " && xprop -id $0 -f _SURF_FIND 8s -set _SURF_FIND \"$prop\"" \
>         " && echo \"$prop\" >> \"${HOME}/.surf/searches\"", \
>         winid, NULL \
>     } \
> }
> 
> In the SETURI call the `xargs` part is missing in the pipeline, since my 
> history
> is already >2MiB and after too many characters the commandline call generated 
> by
> xargs becomes too large for the shell to handle. Without the `xargs` all the
> data is passed over stdin and stdout and the commandlines always stay in O(1)
> and don't depend on the length of the history file. BEWARE: The person
> introducing this `xargs` call is convinced it is necessary, however I did not
> run into any case where it breaks when leaving it out.

Thanks for that, that's a clean way to handle both history and searches and
it works well. The only problem I have is that it messes with the bookmarks
patch that uses SETPROP, so I was thinking about something like:

#define SETURI { \
    .v = (char *[]){ "/bin/sh", "-c", \
        "prop=\"`xprop -id $0 _SURF_URI" \
        " | cut -d '\"' -f 2" \
        " | tac - \"${HOME}/.surf/bookmarks\" \"${HOME}/.surf/history\"" \
        " | awk '!x[$0]++'" \
        " | dmenu -i -l 10`\"" \
        " && xprop -id $0 -f _SURF_GO 8s -set _SURF_GO \"$prop\"", \
        winid, NULL \
    } \
}

So that one can have access to its bookmarks at the top of the dmenu list as
well as its history whithout the need of a superfluous shortcut.

> I also have a script to deduplicate the history files, which I run regularly:
> 
> cd ~/.surf
> 
> du -h history
> tac history | awk '!x[$0]++' | tac >history.$$
> cp history.$$ history
> rm -f history.$$
> du -h history
> 
> du -h searches
> tac searches | awk '!x[$0]++' | tac >history.$$
> cp history.$$ searches
> rm -f history.$$
> du -h searches
> 
> I also changed tabbed's SETPROP, so it displays a list of all open tabs first,
> followed by the history (most recent entry topmost) as above. Now with 
> MODKEY+t
> (tabbed) you can either switch to an already opened tab, open a new tab with a
> URL already in the history or open a new tab with a changed URL from history 
> or
> a completely new URL all with the help of dmenu and it's awesome filtering.
> 
> #define SETPROP(p) { \
>     .v = (char *[]){ "/bin/sh", "-c", \
>         "prop=\"`xwininfo -children -id $1 | grep '^     0x'" \
>         " | sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@'" \
>         " | tac - \"${HOME}/.$2/history\"" \
>         " | awk '!x[$0]++'" \
>         " | xargs -0 printf %b | dmenu -l 10`\"" \
>         " && xprop -id $1 -f $0 8s -set $0 \"$prop\"", \
>         p, winid, clientbin, NULL \
>     } \
> }
> 
> I hope this is useful to you.

It is indeed, I'll will try that.
Thanks a lot.
I'va attached the patch that sums up all your comments.

Sincerely, 

-- 
Sébastien Poher
www.volted.net
Aidez-nous à défendre la liberté du logiciel: 
http://www.fsf.org/register_form?referrer=11902
diff --git a/config.def.h b/config.def.h
index a1ab211..9f1de5f 100644
--- a/config.def.h
+++ b/config.def.h
@@ -16,6 +16,7 @@ static gfloat zoomlevel = 1.0;       /* Default zoom level */
 
 /* Soup default features */
 static char *cookiefile     = "~/.surf/cookies.txt";
+static char *historyfile    = "~/.surf/history";
 static char *cookiepolicies = "Aa@"; /* A: accept all; a: accept nothing,
                                         @: accept no third party */
 static char *cafile         = "/etc/ssl/certs/ca-certificates.crt";
@@ -35,12 +36,30 @@ static Bool loadimages            = TRUE;
 static Bool hidebackground        = FALSE;
 static Bool allowgeolocation      = TRUE;
 
-#define SETPROP(p, q) { \
-	.v = (char *[]){ "/bin/sh", "-c", \
-		"prop=\"`xprop -id $2 $0 | cut -d '\"' -f 2 | xargs -0 printf %b | dmenu`\" &&" \
-		"xprop -id $2 -f $1 8s -set $1 \"$prop\"", \
-		p, q, winid, NULL \
-	} \
+#define SETURI { \
+    .v = (char *[]){ "/bin/sh", "-c", \
+        "prop=\"`xprop -id $0 _SURF_URI" \
+        " | cut -d '\"' -f 2" \
+        " | tac - \"${HOME}/.surf/history\"" \
+        " | awk '!x[$0]++'" \
+        " | dmenu -i -l 10`\"" \
+        " && xprop -id $0 -f _SURF_GO 8s -set _SURF_GO \"$prop\"", \
+        winid, NULL \
+    } \
+}
+
+#define SETSEARCH { \
+    .v = (char *[]){ "/bin/sh", "-c", \
+        "prop=\"`xprop -id $0 _SURF_FIND" \
+        " | cut -d '\"' -f 2" \
+        " | tac - \"${HOME}/.surf/searches\"" \
+        " | awk '!x[$0]++'" \
+        " | xargs -0 printf %b" \
+        " | dmenu -i -l 10`\"" \
+        " && xprop -id $0 -f _SURF_FIND 8s -set _SURF_FIND \"$prop\"" \
+        " && echo \"$prop\" >> \"${HOME}/.surf/searches\"", \
+        winid, NULL \
+    } \
 }
 
 /* DOWNLOAD(URI, referer) */
@@ -110,9 +129,9 @@ static Key keys[] = {
     { MODKEY,               GDK_o,      source,     { 0 } },
     { MODKEY|GDK_SHIFT_MASK,GDK_o,      inspector,  { 0 } },
 
-    { MODKEY,               GDK_g,      spawn,      SETPROP("_SURF_URI", "_SURF_GO") },
-    { MODKEY,               GDK_f,      spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
-    { MODKEY,               GDK_slash,  spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
+    { MODKEY,               GDK_g,      spawn,      SETURI },
+    { MODKEY,               GDK_f,      spawn,      SETSEARCH },
+    { MODKEY,               GDK_slash,  spawn,      SETSEARCH }, 
 
     { MODKEY,               GDK_n,      find,       { .b = TRUE } },
     { MODKEY|GDK_SHIFT_MASK,GDK_n,      find,       { .b = FALSE } },
diff --git a/surf.c b/surf.c
index 87c10ef..c91db86 100644
--- a/surf.c
+++ b/surf.c
@@ -319,6 +319,7 @@ cleanup(void) {
 	while(clients)
 		destroyclient(clients);
 	g_free(cookiefile);
+	g_free(historyfile);
 	g_free(scriptfile);
 	g_free(stylefile);
 }
@@ -772,6 +773,12 @@ loaduri(Client *c, const Arg *arg) {
 		reload(c, &a);
 	} else {
 		webkit_web_view_load_uri(c->view, u);
+		FILE *f;
+	if((f = fopen(historyfile, "a+"))) {
+		fputs(u, f);
+		fputs("\n", f);
+		fclose(f);
+	}
 		c->progress = 0;
 		c->title = copystr(&c->title, u);
 		updatetitle(c);
@@ -1222,6 +1229,7 @@ setup(void) {
 
 	/* dirs and files */
 	cookiefile = buildpath(cookiefile);
+	historyfile = buildpath(historyfile);
 	scriptfile = buildpath(scriptfile);
 	cachefolder = buildpath(cachefolder);
 	styledir = buildpath(styledir);

Attachment: signature.asc
Description: Digital signature

Reply via email to