Add options for scriptfile, cookiefile and stylefile. And changing the default

behaviour of buildpath to be more like in open().
This commit is contained in:
Christoph Lohmann 2012-10-31 21:13:50 +01:00
parent 0b885f18e3
commit 4ce3808684
3 changed files with 109 additions and 42 deletions

41
arg.h Normal file
View file

@ -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

12
surf.1
View file

@ -3,10 +3,13 @@
surf \- simple webkit-based browser surf \- simple webkit-based browser
.SH SYNOPSIS .SH SYNOPSIS
.B surf .B surf
.RB [-c\ cookiefile]
.RB [-e\ xid] .RB [-e\ xid]
.RB [-i] .RB [-i]
.RB [-p] .RB [-p]
.RB [-r\ scriptfile]
.RB [-s] .RB [-s]
.RB [-t\ stylefile]
.RB [-v] .RB [-v]
.RB [-x] .RB [-x]
.RB "URI" .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. one can point surf to another URI by setting its XProperties.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-c cookiefile
Specify the cookiefile to use.
.TP
.B \-e xid .B \-e xid
Reparents to window specified by xid. Reparents to window specified by xid.
.TP .TP
@ -26,9 +32,15 @@ Disable Images
.B \-p .B \-p
Disable Plugins Disable Plugins
.TP .TP
.B \-r scriptfile
Specify the user scriptfile.
.TP
.B \-s .B \-s
Disable Javascript Disable Javascript
.TP .TP
.B \-t stylefile
Specify the user stylefile.
.TP
.B \-v .B \-v
Prints version information to standard output, then exits. Prints version information to standard output, then exits.
.TP .TP

98
surf.c
View file

@ -20,6 +20,10 @@
#include <JavaScriptCore/JavaScript.h> #include <JavaScriptCore/JavaScript.h>
#include <sys/file.h> #include <sys/file.h>
#include "arg.h"
char *argv0;
#define LENGTH(x) (sizeof x / sizeof x[0]) #define LENGTH(x) (sizeof x / sizeof x[0])
#define COOKIEJAR_TYPE (cookiejar_get_type ()) #define COOKIEJAR_TYPE (cookiejar_get_type ())
#define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar)) #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 GdkNativeWindow embed = 0;
static gboolean showxid = FALSE; static gboolean showxid = FALSE;
static char winid[64]; static char winid[64];
static char *progname;
static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0; static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
static char *buildpath(const char *path); static char *buildpath(const char *path);
@ -138,10 +141,19 @@ buildpath(const char *path) {
FILE *f; FILE *f;
/* creating directory */ /* creating directory */
if(path[0] == '/') if(path[0] == '/') {
apath = g_strdup(path); apath = g_strdup(path);
else } else if(path[0] == '~') {
apath = g_strconcat(g_get_home_dir(), "/", path, NULL); 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, '/'))) { if((p = strrchr(apath, '/'))) {
*p = '\0'; *p = '\0';
g_mkdir_with_parents(apath, 0700); g_mkdir_with_parents(apath, 0700);
@ -153,6 +165,7 @@ buildpath(const char *path) {
g_chmod(apath, 0600); /* always */ g_chmod(apath, 0600); /* always */
fclose(f); fclose(f);
} }
return apath; return apath;
} }
@ -216,7 +229,7 @@ cookiejar_new(const char *filename, gboolean read_only) {
return g_object_new(COOKIEJAR_TYPE, return g_object_new(COOKIEJAR_TYPE,
SOUP_COOKIE_JAR_TEXT_FILENAME, filename, SOUP_COOKIE_JAR_TEXT_FILENAME, filename,
SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL); SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL);
} }
static void static void
cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec) { 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 }; const Arg a = { .v = (void *)cmd };
char tmp[64]; char tmp[64];
cmd[i++] = progname; cmd[i++] = argv0;
if(embed && !noembed) { if(embed && !noembed) {
cmd[i++] = "-e"; cmd[i++] = "-e";
snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed); snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
@ -905,7 +918,8 @@ updatewinid(Client *c) {
void void
usage(void) { usage(void) {
fputs("surf - simple browser\n", stderr); 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 void
@ -928,49 +942,49 @@ zoom(Client *c, const Arg *arg) {
int int
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
int i;
Arg arg; Arg arg;
progname = argv[0];
/* command line args */ /* command line args */
for(i = 1, arg.v = NULL; i < argc && argv[i][0] == '-' && ARGBEGIN {
argv[i][1] != '\0' && argv[i][2] == '\0'; i++) { case 'c':
if(!strcmp(argv[i], "--")) { cookiefile = EARGF(usage());
i++; break;
break; case 'e':
} embed = strtol(EARGF(usage()), NULL, 0);
switch(argv[i][1]) { break;
case 'e': case 'i':
if(++i < argc) loadimage = 0;
embed = strtol(argv[i], NULL, 0); break;
else case 'p':
usage(); plugin = 0;
break; break;
case 'i': case 'r':
loadimage = 0; scriptfile = EARGF(usage());
break; break;
case 'p': case 's':
plugin = 0; script = 0;
break; break;
case 's': case 't':
script = 0; stylefile = EARGF(usage());
break; break;
case 'x': case 'x':
showxid = TRUE; showxid = TRUE;
break; break;
case 'v': case 'v':
die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n"); die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n");
default: default:
usage(); usage();
} } ARGEND;
} if(argc > 0)
if(i < argc) arg.v = argv[0];
arg.v = argv[i];
setup(); setup();
newclient(); newclient();
if(arg.v) if(arg.v)
loaduri(clients, &arg); loaduri(clients, &arg);
gtk_main(); gtk_main();
cleanup(); cleanup();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }