tAdd options for scriptfile, cookiefile and stylefile. And changing the default behaviour of buildpath to be more like in open(). - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 4ce3808684c5ea5d14eab0c3e24119784d2ae255
 (DIR) parent 0b885f18e3aebee047e952620f8541491fe77b8a
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Wed, 31 Oct 2012 21:13:50 +0100
       
       Add options for scriptfile, cookiefile and stylefile. And changing the default
       behaviour of buildpath to be more like in open().
       Diffstat:
         A arg.h                               |      41 +++++++++++++++++++++++++++++++
         M surf.1                              |      12 ++++++++++++
         M surf.c                              |      98 ++++++++++++++++++-------------
       
       3 files changed, 109 insertions(+), 42 deletions(-)
       ---
 (DIR) diff --git a/arg.h b/arg.h
       t@@ -0,0 +1,41 @@
       +/*
       + * Copy me if you can.
       + * by 20h
       + */
       +
       +#ifndef __ARG_H__
       +#define __ARG_H__
       +
       +extern char *argv0;
       +
       +#define USED(x) ((void)(x))
       +
       +#define ARGBEGIN        for (argv0 = *argv, argv++, argc--;\
       +                                        argv[0] && argv[0][1]\
       +                                        && argv[0][0] == '-';\
       +                                        argc--, argv++) {\
       +                                char _argc;\
       +                                char **_argv;\
       +                                if (argv[0][1] == '-' && argv[0][2] == '\0') {\
       +                                        argv++;\
       +                                        argc--;\
       +                                        break;\
       +                                }\
       +                                for (argv[0]++, _argv = argv; argv[0][0];\
       +                                                argv[0]++) {\
       +                                        if (_argv != argv)\
       +                                                break;\
       +                                        _argc = argv[0][0];\
       +                                        switch (_argc)
       +
       +#define ARGEND                        }\
       +                                USED(_argc);\
       +                        }\
       +                        USED(argv);\
       +                        USED(argc);
       +
       +#define EARGF(x)        ((argv[1] == NULL)? ((x), abort(), (char *)0) :\
       +                        (argc--, argv++, argv[0]))
       +
       +#endif
       +
 (DIR) diff --git a/surf.1 b/surf.1
       t@@ -3,10 +3,13 @@
        surf \- simple webkit-based browser
        .SH SYNOPSIS
        .B surf
       +.RB [-c\ cookiefile]
        .RB [-e\ xid]
        .RB [-i]
        .RB [-p]
       +.RB [-r\ scriptfile]
        .RB [-s]
       +.RB [-t\ stylefile]
        .RB [-v]
        .RB [-x]
        .RB "URI"
       t@@ -17,6 +20,9 @@ which makes it possible to embed it in another application. Furthermore,
        one can point surf to another URI by setting its XProperties.
        .SH OPTIONS
        .TP
       +.B \-c cookiefile 
       +Specify the cookiefile to use.
       +.TP
        .B \-e xid
        Reparents to window specified by xid.
        .TP
       t@@ -26,9 +32,15 @@ Disable Images
        .B \-p
        Disable Plugins
        .TP
       +.B \-r scriptfile 
       +Specify the user scriptfile.
       +.TP
        .B \-s
        Disable Javascript
        .TP
       +.B \-t stylefile
       +Specify the user stylefile.
       +.TP
        .B \-v
        Prints version information to standard output, then exits.
        .TP
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -20,6 +20,10 @@
        #include <JavaScriptCore/JavaScript.h>
        #include <sys/file.h>
        
       +#include "arg.h"
       +
       +char *argv0;
       +
        #define LENGTH(x)               (sizeof x / sizeof x[0])
        #define COOKIEJAR_TYPE          (cookiejar_get_type ())
        #define COOKIEJAR(obj)          (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar))
       t@@ -74,7 +78,6 @@ static Client *clients = NULL;
        static GdkNativeWindow embed = 0;
        static gboolean showxid = FALSE;
        static char winid[64];
       -static char *progname;
        static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
        
        static char *buildpath(const char *path);
       t@@ -138,10 +141,19 @@ buildpath(const char *path) {
                FILE *f;
        
                /* creating directory */
       -        if(path[0] == '/')
       +        if(path[0] == '/') {
                        apath = g_strdup(path);
       -        else
       -                apath = g_strconcat(g_get_home_dir(), "/", path, NULL);
       +        } else if(path[0] == '~') {
       +                if(path[1] == '/') {
       +                        apath = g_strconcat(g_get_home_dir(), &path[1], NULL);
       +                } else {
       +                        apath = g_strconcat(g_get_home_dir(), "/",
       +                                        &path[1], NULL);
       +                }
       +        } else {
       +                apath = g_strconcat(g_get_current_dir(), "/", path, NULL);
       +        }
       +
                if((p = strrchr(apath, '/'))) {
                        *p = '\0';
                        g_mkdir_with_parents(apath, 0700);
       t@@ -153,6 +165,7 @@ buildpath(const char *path) {
                        g_chmod(apath, 0600); /* always */
                        fclose(f);
                }
       +
                return apath;
        }
        
       t@@ -216,7 +229,7 @@ cookiejar_new(const char *filename, gboolean read_only) {
                return g_object_new(COOKIEJAR_TYPE,
                                    SOUP_COOKIE_JAR_TEXT_FILENAME, filename,
                                    SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL);
       -} 
       +}
        
        static void
        cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec) {
       t@@ -628,7 +641,7 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) {
                const Arg a = { .v = (void *)cmd };
                char tmp[64];
        
       -        cmd[i++] = progname;
       +        cmd[i++] = argv0;
                if(embed && !noembed) {
                        cmd[i++] = "-e";
                        snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
       t@@ -905,7 +918,8 @@ updatewinid(Client *c) {
        void
        usage(void) {
                fputs("surf - simple browser\n", stderr);
       -        die("usage: surf [-e xid] [-i] [-p] [-s] [-v] [-x] [uri]\n");
       +        die("usage: surf [-c cookiefile] [-e xid] [-i] [-p] [-r scriptfile]"
       +                " [-s] [-t stylefile] [-v] [-x] [uri]\n");
        }
        
        void
       t@@ -928,49 +942,49 @@ zoom(Client *c, const Arg *arg) {
        
        int
        main(int argc, char *argv[]) {
       -        int i;
                Arg arg;
        
       -        progname = argv[0];
                /* command line args */
       -        for(i = 1, arg.v = NULL; i < argc && argv[i][0] == '-' &&
       -                        argv[i][1] != '\0' && argv[i][2] == '\0'; i++) {
       -                if(!strcmp(argv[i], "--")) {
       -                        i++;
       -                        break;
       -                }
       -                switch(argv[i][1]) {
       -                case 'e':
       -                        if(++i < argc)
       -                                embed = strtol(argv[i], NULL, 0);
       -                        else
       -                                usage();
       -                        break;
       -                case 'i':
       -                        loadimage = 0;
       -                        break;
       -                case 'p':
       -                        plugin = 0;
       -                        break;
       -                case 's':
       -                        script = 0;
       -                        break;
       -                case 'x':
       -                        showxid = TRUE;
       -                        break;
       -                case 'v':
       -                        die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n");
       -                default:
       -                        usage();
       -                }
       -        }
       -        if(i < argc)
       -                arg.v = argv[i];
       +        ARGBEGIN {
       +        case 'c':
       +                cookiefile = EARGF(usage());
       +                break;
       +        case 'e':
       +                embed = strtol(EARGF(usage()), NULL, 0);
       +                break;
       +        case 'i':
       +                loadimage = 0;
       +                break;
       +        case 'p':
       +                plugin = 0;
       +                break;
       +        case 'r':
       +                scriptfile = EARGF(usage());
       +                break;
       +        case 's':
       +                script = 0;
       +                break;
       +        case 't':
       +                stylefile = EARGF(usage());
       +                break;
       +        case 'x':
       +                showxid = TRUE;
       +                break;
       +        case 'v':
       +                die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n");
       +        default:
       +                usage();
       +        } ARGEND;
       +        if(argc > 0)
       +                arg.v = argv[0];
       +
                setup();
                newclient();
                if(arg.v)
                        loaduri(clients, &arg);
                gtk_main();
                cleanup();
       +
                return EXIT_SUCCESS;
        }
       +