From 4ce3808684c5ea5d14eab0c3e24119784d2ae255 Mon Sep 17 00:00:00 2001 From: Christoph Lohmann <20h@r-36.net> Date: Wed, 31 Oct 2012 21:13:50 +0100 Subject: [PATCH] Add options for scriptfile, cookiefile and stylefile. And changing the default behaviour of buildpath to be more like in open(). --- arg.h | 41 ++++++++++++++++++++++++ surf.1 | 12 +++++++ surf.c | 98 +++++++++++++++++++++++++++++++++------------------------- 3 files changed, 109 insertions(+), 42 deletions(-) create mode 100644 arg.h diff --git a/arg.h b/arg.h new file mode 100644 index 0000000..6414822 --- /dev/null +++ b/arg.h @@ -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 + diff --git a/surf.1 b/surf.1 index 8cf8c28..6cd4044 100644 --- a/surf.1 +++ b/surf.1 @@ -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" @@ -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 @@ -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 diff --git a/surf.c b/surf.c index 4247de2..3b291b5 100644 --- a/surf.c +++ b/surf.c @@ -20,6 +20,10 @@ #include #include +#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)) @@ -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); @@ -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); @@ -153,6 +165,7 @@ buildpath(const char *path) { g_chmod(apath, 0600); /* always */ fclose(f); } + return apath; } @@ -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) { @@ -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); @@ -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 @@ -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; } +