79 Commits

Author SHA1 Message Date
Troels Henriksen bb01475018 Change horizontal scrolling to ^u and ^i, remove ^g scrolling. 2012-06-11 17:16:52 +02:00
pancake d4b030eeb4 apply nick's patch removing unused variable and parameters 2012-06-11 16:45:48 +02:00
pancake 101f2d6455 apply nick's patch removing the autoresize functionality 2012-06-11 16:01:03 +02:00
Troels Henriksen 3083ef4031 Keybindings for scrolling left and right; code by stanio. 2012-05-31 11:46:24 +02:00
Troels Henriksen cf75bf2777 Manpage patch from Evan Gates. 2012-03-26 09:33:42 +02:00
Troels Henriksen 96041e5ba2 Close standard output after printing XID, patch due Abby Cedar. 2012-02-21 12:00:01 +01:00
anselm@garbe.us 6af15aa636 making cookie file creation a bit more pedantic 2012-02-11 17:51:48 +01:00
anselm@garbe.us a0e269b6bd applied fix from dev list and debian reviewers 2012-02-11 10:40:32 +01:00
Christoph Lohmann 3da24a7481 Fixing the javascriptcoregtk-1.0 dependency. 2012-02-01 15:23:39 +01:00
Troels Henriksen 7c7a3b58cf Add a variable in config.def.h for configuring spatial browsing. 2012-01-17 13:58:04 +01:00
Troels Henriksen e75753775f Status message patch from Jeremy Jackins and skls. 2012-01-17 13:54:35 +01:00
Connor Lane Smith fc31616141 link Xlib in config.mk 2011-11-20 16:06:38 +01:00
Troels Henriksen b8f45a588d Manual fixes from Nick White. 2011-11-09 15:09:59 +01:00
Troels Henriksen 590a9bb19d Cleanup previous patch. 2011-11-05 12:06:08 +01:00
Troels Henriksen df96fe4171 Use the surf user agent when downloading with wget. 2011-11-05 11:43:46 +01:00
Troels Henriksen 543d0c77ee The ICCCM states that window classes should be capitalised. 2011-11-04 13:57:04 +01:00
Troels Henriksen bc73b48743 Add SSL verification patch by Nick White. 2011-11-04 13:23:57 +01:00
Troels Henriksen 2e62372969 Add eval() function for executing Javascript. Handy for keybindings. 2011-11-03 14:09:19 +01:00
garbeam@gmail.com 3b104416d3 added 20h's patch of 8 Sep 2011 to surf, thanks 2011-10-29 10:59:34 +02:00
pancake 62f54a3745 rename NOBACKGROUND to HIDE_BACKGROUND and use TRUE/FALSE instead of 0/1 2011-03-31 12:52:35 +02:00
Enno Boland (tox) f1299dcfc1 Adding nibbles patch 2010-09-09 11:15:02 +02:00
pancake a1db4e9bf5 fix for segfault when closing window while loading (via nibble) 2010-09-02 14:02:12 +02:00
Enno Boland (tox) db72e066d1 using ctrl-f to find. 2010-06-25 09:42:58 +02:00
Enno Boland (tox) 86c230c2bb Added tag 0.4.1 for changeset 71388899ac09 2010-06-08 09:06:15 +02:00
Enno Boland (tox) d1eb8253b1 next will be 0.4.1 2010-06-08 09:06:10 +02:00
Enno Boland (tox) 54df460866 reverting sessiontime 2010-06-03 22:50:04 +02:00
Enno Boland (tox) 1005ea0ac9 Added tag 0.4 for changeset ac8e058003ed 2010-05-30 22:05:37 +02:00
Enno Boland (tox) ca1c7f434b Adding Nibbles patch 2010-05-28 13:20:17 +02:00
Enno Boland (tox) 8cc71f8216 typo 2010-05-26 15:34:09 +02:00
Enno Boland (tox) 7330d0e261 Applying Nibbles download patch. Thanks! 2010-05-26 15:33:01 +02:00
Enno Boland (tox) 7d3d996a3d merge 2010-05-25 10:38:23 +02:00
Enno Boland (tox) d46697044e changing user agent string as suggested by Marvin Vek 2010-05-25 10:34:43 +02:00
Enno Boland (tox) 532205d7e7 removing spatial navigation. 2010-05-24 21:35:20 +02:00
Enno Boland (tox) aadcd5b3f0 implementing downloading. 2010-05-24 21:23:39 +02:00
Enno Boland (tox) 7fcf745092 enabling spatial-navigation 2010-05-24 21:23:28 +02:00
Enno Boland (tox) 5878067225 AtomHiLight is set correctly for links. 2010-05-18 14:20:24 +02:00
Enno Boland (tox) 7ce2856194 merge 2010-05-17 23:13:44 +02:00
Enno Boland (tox) 36129338cf changing xprops 2010-05-17 11:45:28 +02:00
Enno Boland (tox) 0a6eafe077 dl is not needed anymore 2010-05-17 11:01:37 +02:00
Enno Boland (tox) 6376a30379 removing context-menu, downloading. 2010-05-17 10:58:08 +02:00
Enno Boland (tox) 3dbf628964 changing sessiontime to 3600 2010-05-15 15:47:47 +02:00
Enno Boland (tox) 91d04b15f0 merge 2010-05-11 14:57:44 +02:00
Enno Boland (tox) b1e9a6e9ab fix download/history bug 2010-05-11 14:57:09 +02:00
pancake 424936e96c Fix NOBACKGROUND meaning 2010-05-09 22:51:26 +02:00
Enno Boland (tox) 8acc31bbde changing default value of NOBACKGROUND 2010-05-09 22:46:22 +02:00
Enno Boland (tox) f304d0af52 merge 2010-05-09 22:41:11 +02:00
Enno Boland (tox) 168da3730f added js-fix by Troels Henriksen. Thanks :) 2010-05-09 19:37:46 +02:00
pancake 11039e5e2b Do not set cookie session time if set to 0
Add NOBACKGROUND config.def.h option
 - requires body {background-color} in style.css
 - fixes white background when loading pages
2010-05-08 21:43:53 +02:00
Enno Boland (tox) 602eb61623 implementing naive file locking. 2010-05-06 13:58:49 +02:00
Enno Boland (tox) bef892f513 fixing compilerwarning in newer webkit versions 2010-05-06 13:09:54 +02:00
Enno Boland (tox) f9a411f22d fixing config.mk 2010-05-06 13:06:50 +02:00
Enno Boland (tox) e9c9715f52 Adding small fix by Alex Puterbaugh. Thanks. 2010-05-02 10:59:28 +02:00
pancake 4b1b1b8a20 remove empty lines 2010-04-08 20:28:32 +02:00
Enno Boland (tox) 8aabfa5b45 whoops... linking Oo 2010-03-29 17:49:34 +02:00
Enno Boland (tox) 981e52d5a7 typofix. 2010-03-26 21:44:48 +01:00
Enno Boland (tox) a7f2765da4 reimplementing cookies. Now we need some file locking. 2010-03-25 09:59:30 +01:00
Enno Boland (tox) a05bcc653e updating manpage, reformating help output. 2010-03-25 00:05:37 +01:00
Enno Boland (tox) 62dc599a04 fixing argument parsing. 2010-03-24 23:55:41 +01:00
Enno Boland (tox) 3ede103556 fixing downloads 2010-03-24 23:18:03 +01:00
Enno Boland (tox) 19aaa5a74b gotheaders will now be called correctly. 2010-03-24 22:04:36 +01:00
Enno Boland (tox) 3434ccc16a adding surf-logo. 2010-03-24 21:05:11 +01:00
Enno Boland (tox) b8105c64ed working on cookies 2010-03-24 20:56:56 +01:00
Enno Boland (tox) e2cae4d1f5 reformating 2010-03-24 19:16:10 +01:00
Enno Boland (tox) 814bf92565 adding cmd-switches for turning of images/plugins/scripts 2010-03-24 19:11:01 +01:00
Enno Boland (tox) e252a5ec63 now we've got access to cookies before they're sended. Let's start building a cookiehandler. 2010-03-24 18:17:19 +01:00
Enno Boland (tox) b2a970d04d session gets set properly in setup() 2010-03-10 21:38:07 +01:00
Enno Boland (tox) 1cbeab188d fixing progress, beginning new cookie implementation 2010-03-08 10:06:32 +01:00
Enno Boland (tox) 764550e087 small typo. 2010-03-08 09:30:26 +01:00
Enno Boland (tox) 4f7fdd1dfa removed persistent cookies, replaced deprecated eventlisteners 2010-03-08 09:24:55 +01:00
Enno Boland (tox) 94601622a1 _SURF_URI gets initialised as soon as the window opens. 2010-01-29 09:44:14 +01:00
Enno Boland (tox) b18189d016 fixing manpage 2010-01-20 14:46:22 +01:00
Enno Boland (tox) 0fb97666ec dl has to be a directory, not a file. 2010-01-04 14:39:40 +01:00
Enno Boland (tox) 2f9c554f02 adding fixes from thomas_adam. Thanks :) 2009-12-15 17:16:01 +01:00
Enno Boland (tox) f42461c3cc Backed out changeset 260fda70689f 2009-11-09 00:05:45 +01:00
Enno Boland (tox) 1d93bfa9ce changing locking algorythm for setprop. 2009-11-08 23:45:36 +01:00
Enno Boland (tox) b57eca1a2b SETPROP() macro shows now the current value in dwm. 2009-11-08 23:45:11 +01:00
Enno Boland (tox) c0510b0cc9 next version will be 0.4 2009-11-02 09:29:54 +01:00
Enno Boland (tox) f0f3ddce76 adding environment variables for proxy and useragent 2009-11-02 09:27:32 +01:00
Enno Boland (tox) 7365214bbf Added tag 0.3 for changeset 46d516fd2167 2009-10-30 13:40:49 +01:00
7 changed files with 370 additions and 296 deletions
+3
View File
@@ -4,3 +4,6 @@ d8628fc93353faa411c9fc7eef82d11a84d26ae2 0.1
3ef997607115303fe93873b592d152f0ec186f77 0.1.1
bffb0c3c23410ac7f260d167f4b9771497fc1127 0.1.2
a5db79d487c85615be2ecf30815c6b4977e88000 0.2
46d516fd216731adf91740496e6823c1be4f6199 0.3
ac8e058003ed2c0974529808752e5da7692fd7d8 0.4
71388899ac09d21e6c93518cc57a28395034f63c 0.4.1
+2 -1
View File
@@ -1,6 +1,7 @@
MIT/X Consortium License
© 2009 Enno Boland <g s01 de>
© 2011-2012 Troels Henriksen <athas@sigkill.at>
© 2009-2011 Enno Boland <g s01 de>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
+24 -22
View File
@@ -1,17 +1,26 @@
/* modifier 0 means no modifier */
static char *useragent = "Mozilla/5.0 (X11; U; Linux; en-us) AppleWebKit/531.2+ (KHTML, like Gecko, surf-"VERSION") Safari/531.2+";
static char *progress = "#FF0000";
static char *useragent = "Surf/"VERSION" (X11; U; Unix; en-US) AppleWebKit/531.2+ Compatible (Safari)";
static char *progress = "#0066FF";
static char *progress_untrust = "#FF6600";
static char *progress_trust = "#00FF00";
static char *stylefile = ".surf/style.css";
static char *scriptfile = ".surf/script.js";
static char *cookiefile = ".surf/cookies.txt";
static char *dldir = ".surf/dl";
static time_t sessiontime = 3600;
static char *cafile = "/etc/ssl/certs/ca-certificates.crt";
static char *strictssl = FALSE; /* Refuse untrusted SSL connections */
#define HIDE_BACKGROUND FALSE
#define SPATIAL_BROWSING TRUE
#define SETPROP(p) { .v = (char *[]){ "/bin/sh", "-c", \
"prop=\"`dmenu < /dev/null`\" &&" \
"xprop -id $1 -f $0 8s -set $0 \"$prop\"", \
p, winid, NULL } }
#define SETPROP(p, q) { .v = (char *[]){ "/bin/sh", "-c", \
"prop=\"`xprop -id $2 $0 | cut -d '\"' -f 2 | dmenu`\" &&" \
"xprop -id $2 -f $1 8s -set $1 \"$prop\"", \
p, q, winid, NULL } }
#define DOWNLOAD(d) { \
.v = (char *[]){ "/bin/sh", "-c", \
"xterm -e \"wget '$0' \
--load-cookies ~/.surf/cookies.txt \
--user-agent '$1' ; sleep 5\"", d, useragent, NULL } }
#define MODKEY GDK_CONTROL_MASK
static Key keys[] = {
/* modifier keyval function arg Focus */
@@ -25,23 +34,16 @@ static Key keys[] = {
{ MODKEY|GDK_SHIFT_MASK,GDK_i, zoom, { .i = 0 } },
{ MODKEY, GDK_l, navigate, { .i = +1 } },
{ MODKEY, GDK_h, navigate, { .i = -1 } },
{ MODKEY, GDK_j, scroll, { .i = +1 } },
{ MODKEY, GDK_k, scroll, { .i = -1 } },
{ MODKEY, GDK_j, scroll_v, { .i = +1 } },
{ MODKEY, GDK_k, scroll_v, { .i = -1 } },
{ MODKEY, GDK_b, scroll_v, { .i = -10000 } },
{ MODKEY, GDK_space, scroll_v, { .i = +10000 } },
{ MODKEY, GDK_i, scroll_h, { .i = +1 } },
{ MODKEY, GDK_u, scroll_h, { .i = -1 } },
{ 0, GDK_Escape, stop, { 0 } },
{ MODKEY, GDK_o, source, { 0 } },
{ MODKEY, GDK_g, spawn, SETPROP("_SURF_URI") },
{ MODKEY, GDK_slash, spawn, SETPROP("_SURF_FIND") },
{ MODKEY, GDK_g, spawn, SETPROP("_SURF_URI", "_SURF_GO") },
{ MODKEY, GDK_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },
{ MODKEY, GDK_n, find, { .b = TRUE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_n, find, { .b = FALSE } },
};
static Item items[] = {
{ "Back", navigate, { .i = -1 } },
{ "Forward", navigate, { .i = +1 } },
{ "New Window", newwindow, { .v = NULL } },
{ "Reload", reload, { .b = FALSE } },
{ "Stop", stop, { 0 } },
{ "Paste URI", clipboard, { .b = TRUE } },
{ "Copy URI", clipboard, { .b = FALSE } },
{ "Download", download, { 0 } },
};
+9 -6
View File
@@ -1,5 +1,5 @@
# surf version
VERSION = 0.3
VERSION = 0.5
# Customize below to fit your system
@@ -7,18 +7,21 @@ VERSION = 0.3
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man
GTKINC=$(shell pkg-config --cflags gtk+-2.0 webkit-1.0)
GTKLIB=$(shell pkg-config --libs gtk+-2.0 webkit-1.0)
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
GTKINC = `pkg-config --cflags gtk+-2.0 webkit-1.0`
GTKLIB = `pkg-config --libs gtk+-2.0 webkit-1.0`
# includes and libs
INCS = -I. -I/usr/include ${GTKINC}
LIBS = -L/usr/lib -lc ${GTKLIB} -lgthread-2.0
INCS = -I. -I/usr/include -I${X11INC} ${GTKINC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${GTKLIB} -lgthread-2.0 \
-ljavascriptcoregtk-1.0
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\"
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
LDFLAGS = -g ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
+35 -9
View File
@@ -3,7 +3,12 @@
surf \- simple webkit-based browser
.SH SYNOPSIS
.B surf
.RB [ \-ehvx ]
.RB [-e\ xid]
.RB [-i]
.RB [-p]
.RB [-s]
.RB [-v]
.RB [-x]
.RB "URI"
.SH DESCRIPTION
surf is a simple Web browser based on WebKit/GTK+. It is able
@@ -12,12 +17,17 @@ 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 \-e
Prints xid to standard output and waits until an application reparents the
window.
.B \-e xid
Reparents to window specified by xid.
.TP
.B \-h
Prints usage information to standard output, then exits.
.B \-i
Disable Images
.TP
.B \-p
Disable Plugins
.TP
.B \-s
Disable Javascript
.TP
.B \-v
Prints version information to standard output, then exits.
@@ -26,6 +36,8 @@ Prints version information to standard output, then exits.
Prints xid to standard output. This can be used to script the browser by using
.BR xprop(1).
.SH USAGE
.B Escape
Stops loading current page or stops download.
.TP
.B Ctrl\-h
Walks back the history.
@@ -48,9 +60,15 @@ Zooms page out
.B Ctrl\-Shift\-i
Resets Zoom
.TP
.B Ctrl\-/
.B Ctrl\-f
Opens the search-bar.
.TP
.B Ctrl\-n
Go to next search result.
.TP
.B Ctrl\-Shift\-n
Go to previous search result.
.TP
.B Ctrl\-g
Opens the URL-bar.
.TP
@@ -71,8 +89,16 @@ Copies current URI to primary selection.
.TP
.B Ctrl\-o
show the sourcecode of the current page.
.SH ENVIRONMENT
.TP
.B SURF_USERAGENT
If this variable is set upon startup, surf will use it as the useragent string
.TP
.B http_proxy
If this variable is set and not empty upon startup, surf will use it as the http proxy
.SH SEE ALSO
.BR dmenu(1)
.BR xprop(1)
.BR dmenu(1),
.BR xprop(1),
.BR tabbed(1)
.SH BUGS
Please report them!
+297 -258
View File
@@ -18,9 +18,11 @@
#include <webkit/webkit.h>
#include <glib/gstdio.h>
#include <JavaScriptCore/JavaScript.h>
#include <sys/file.h>
#define LENGTH(x) (sizeof x / sizeof x[0])
#define CLEANMASK(mask) (mask & ~(GDK_MOD2_MASK))
enum { AtomFind, AtomGo, AtomUri, AtomLast };
typedef union Arg Arg;
union Arg {
@@ -31,12 +33,11 @@ union Arg {
typedef struct Client {
GtkWidget *win, *scroll, *vbox, *indicator;
GtkWidget **items;
WebKitWebView *view;
WebKitDownload *download;
char *title, *linkhover;
const char *uri, *needle;
gint progress;
gboolean sslfailed;
struct Client *next;
gboolean zoomed;
} Client;
@@ -55,22 +56,17 @@ typedef struct {
} Key;
static Display *dpy;
static Atom uriprop, findprop;
static SoupCookieJar *cookies;
static SoupSession *session;
static Atom atoms[AtomLast];
static Client *clients = NULL;
static GdkNativeWindow embed = 0;
static gboolean showxid = FALSE;
static int ignorexprop = 0;
static char winid[64];
static char *progname;
static gboolean lockcookie = FALSE;
static gboolean loadimage = 1, plugin = 1, script = 1;
static char *buildpath(const char *path);
static void changecookie(SoupCookieJar *jar, SoupCookie *o, SoupCookie *n, gpointer p);
static void cleanup(void);
static void clipboard(Client *c, const Arg *arg);
static void context(WebKitWebView *v, GtkMenu *m, Client *c);
static char *copystr(char **str, const char *src);
static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c);
static gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *m, WebKitWebPolicyDecision *p, Client *c);
@@ -78,39 +74,40 @@ static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkR
static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(char *str);
static void download(Client *c, const Arg *arg);
static void drawindicator(Client *c);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static void find(Client *c, const Arg *arg);
static const char *getatom(Client *c, Atom a);
static const char *getatom(Client *c, int a);
static const char *getcookies(SoupURI *uri);
static char *geturi(Client *c);
void gotheaders(SoupMessage *msg, gpointer user_data);
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
static void itemclick(GtkMenuItem *mi, Client *c);
static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c);
static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c);
static void loadcommit(WebKitWebView *v, WebKitWebFrame *f, Client *c);
static void loadstart(WebKitWebView *v, WebKitWebFrame *f, Client *c);
static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
static void loaduri(Client *c, const Arg *arg);
static void navigate(Client *c, const Arg *arg);
static Client *newclient(void);
static void newwindow(Client *c, const Arg *arg);
static void newrequest(SoupSession *s, SoupMessage *msg, gpointer v);
static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
static void print(Client *c, const Arg *arg);
static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d);
static void progresschange(WebKitWebView *v, gint p, Client *c);
static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
static void reload(Client *c, const Arg *arg);
static void reloadcookies();
static void resize(GtkWidget *w, GtkAllocation *a, Client *c);
static void scroll(Client *c, const Arg *arg);
static void setatom(Client *c, Atom a, const char *v);
static void scroll_h(Client *c, const Arg *arg);
static void scroll_v(Client *c, const Arg *arg);
static void scroll(GtkAdjustment *a, const Arg *arg);
static void setatom(Client *c, int a, const char *v);
static void setcookie(SoupCookie *c);
static void setup(void);
static void sigchld(int unused);
static void source(Client *c, const Arg *arg);
static void spawn(Client *c, const Arg *arg);
static void eval(Client *c, const Arg *arg);
static void stop(Client *c, const Arg *arg);
static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* title, Client *c);
static void update(Client *c);
static void updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c);
static void updatewinid(Client *c);
static void usage(void);
static void windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObjectRef win, Client *c);
@@ -131,34 +128,16 @@ buildpath(const char *path) {
apath = g_strconcat(g_get_home_dir(), "/", path, NULL);
if((p = strrchr(apath, '/'))) {
*p = '\0';
g_mkdir_with_parents(apath, 0755);
g_mkdir_with_parents(apath, 0700);
g_chmod(apath, 0700); /* in case it existed */
*p = '/';
}
/* creating file (gives error when apath ends with "/") */
if((f = g_fopen(apath, "a")))
if((f = fopen(apath, "a"))) {
g_chmod(apath, 0600); /* always */
fclose(f);
return apath;
}
void
changecookie(SoupCookieJar *j, SoupCookie *oc, SoupCookie *c, gpointer p) {
SoupDate *e;
SoupCookieJar *jar;
if(lockcookie)
return;
if(c && c->expires == NULL) {
e = soup_date_new_from_time_t(time(NULL) + sessiontime);
c = soup_cookie_copy(c);
soup_cookie_set_expires(c, e);
}
jar = soup_cookie_jar_text_new(cookiefile, FALSE);
if(c)
soup_cookie_jar_add_cookie(jar, soup_cookie_copy(c));
else
soup_cookie_jar_delete_cookie(jar, oc);
g_object_unref(jar);
return apath;
}
void
@@ -166,11 +145,32 @@ cleanup(void) {
while(clients)
destroyclient(clients);
g_free(cookiefile);
g_free(dldir);
g_free(scriptfile);
g_free(stylefile);
}
void
evalscript(JSContextRef js, char *script, char* scriptname) {
JSStringRef jsscript, jsscriptname;
JSValueRef exception = NULL;
jsscript = JSStringCreateWithUTF8CString(script);
jsscriptname = JSStringCreateWithUTF8CString(scriptname);
JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), jsscriptname, 0, &exception);
JSStringRelease(jsscript);
JSStringRelease(jsscriptname);
}
void
runscript(WebKitWebFrame *frame) {
char *script;
GError *error;
if(g_file_get_contents(scriptfile, &script, NULL, &error)) {
evalscript(webkit_web_frame_get_global_context(frame), script, scriptfile);
}
}
void
clipboard(Client *c, const Arg *arg) {
gboolean paste = *(gboolean *)arg;
@@ -181,22 +181,6 @@ clipboard(Client *c, const Arg *arg) {
gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), c->linkhover ? c->linkhover : geturi(c), -1);
}
void
context(WebKitWebView *v, GtkMenu *m, Client *c) {
int i;
GtkContainer *parent;
gtk_widget_hide_all(GTK_WIDGET(m));
gtk_widget_show(GTK_WIDGET(m));
for(i = 0; i < LENGTH(items); i++) {
parent = GTK_CONTAINER(gtk_widget_get_parent(c->items[i]));
if(parent)
gtk_container_remove(parent, c->items[i]);
gtk_menu_shell_append(GTK_MENU_SHELL(m), c->items[i]);
gtk_widget_show(c->items[i]);
}
}
char *
copystr(char **str, const char *src) {
char *tmp;
@@ -239,17 +223,14 @@ decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, We
void
destroyclient(Client *c) {
int i;
Client *p;
webkit_web_view_stop_loading(c->view);
gtk_widget_destroy(c->indicator);
gtk_widget_destroy(GTK_WIDGET(c->view));
gtk_widget_destroy(c->scroll);
gtk_widget_destroy(c->vbox);
gtk_widget_destroy(c->win);
for(i = 0; i < LENGTH(items); i++)
gtk_widget_destroy(c->items[i]);
free(c->items);
for(p = clients; p && p->next != c; p = p->next);
if(p)
@@ -272,21 +253,6 @@ die(char *str) {
exit(EXIT_FAILURE);
}
void
download(Client *c, const Arg *arg) {
char *uri;
WebKitNetworkRequest *r;
WebKitDownload *dl;
if(arg->v)
uri = (char *)arg->v;
else
uri = c->linkhover ? c->linkhover : geturi(c);
r = webkit_network_request_new(uri);
dl = webkit_download_new(r);
initdownload(c->view, dl, c);
}
void
drawindicator(Client *c) {
gint width;
@@ -295,12 +261,15 @@ drawindicator(Client *c) {
GdkGC *gc;
GdkColor fg;
uri = getatom(c, uriprop);
uri = geturi(c);
w = c->indicator;
width = c->progress * w->allocation.width / 100;
gc = gdk_gc_new(w->window);
gdk_color_parse(strstr(uri, "https://") == uri ?
progress_trust : progress, &fg);
if(strstr(uri, "https://") == uri)
gdk_color_parse(c->sslfailed ?
progress_untrust : progress_trust, &fg);
else
gdk_color_parse(progress, &fg);
gdk_gc_set_rgb_fg_color(gc, &fg);
gdk_draw_rectangle(w->window,
w->style->bg_gc[GTK_WIDGET_STATE(w)],
@@ -320,13 +289,22 @@ void
find(Client *c, const Arg *arg) {
const char *s;
s = getatom(c, findprop);
s = getatom(c, AtomFind);
gboolean forward = *(gboolean *)arg;
webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE);
}
const char *
getatom(Client *c, Atom a) {
getcookies(SoupURI *uri) {
const char *c;
SoupCookieJar *j = soup_cookie_jar_text_new(cookiefile, TRUE);
c = soup_cookie_jar_get_cookies(j, uri, TRUE);
g_object_unref(j);
return c;
}
const char *
getatom(Client *c, int a) {
static char buf[BUFSIZ];
Atom adummy;
int idummy;
@@ -334,7 +312,7 @@ getatom(Client *c, Atom a) {
unsigned char *p = NULL;
XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window),
a, 0L, BUFSIZ, False, XA_STRING,
atoms[a], 0L, BUFSIZ, False, XA_STRING,
&adummy, &idummy, &ldummy, &ldummy, &p);
if(p)
strncpy(buf, (char *)p, LENGTH(buf)-1);
@@ -353,42 +331,25 @@ geturi(Client *c) {
return uri;
}
gboolean
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
const char *filename;
char *uri, *html;
void
gotheaders(SoupMessage *msg, gpointer v) {
GSList *l, *p;
stop(c, NULL);
c->download = o;
filename = webkit_download_get_suggested_filename(o);
if(!strcmp("", filename))
filename = "index.html";
uri = g_strconcat("file://", dldir, "/", filename, NULL);
webkit_download_set_destination_uri(c->download, uri);
c->progress = 0;
g_free(uri);
html = g_strdup_printf("Download <b>%s</b>...", filename);
webkit_web_view_load_html_string(c->view, html,
webkit_download_get_uri(c->download));
g_signal_connect(c->download, "notify::progress", G_CALLBACK(updatedownload), c);
g_signal_connect(c->download, "notify::status", G_CALLBACK(updatedownload), c);
webkit_download_start(c->download);
c->title = copystr(&c->title, filename);
update(c);
g_free(html);
return TRUE;
for(p = l = soup_cookies_from_response(msg); p;
p = g_slist_next(p)) {
setcookie((SoupCookie *)p->data);
}
soup_cookies_free(l);
}
void
itemclick(GtkMenuItem *mi, Client *c) {
int i;
const char *label;
gboolean
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
Arg arg;
label = gtk_menu_item_get_label(mi);
for(i = 0; i < LENGTH(items); i++)
if(!strcmp(items[i].label, label))
items[i].func(c, &(items[i].arg));
updatewinid(c);
arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o));
spawn(c, &arg);
return FALSE;
}
gboolean
@@ -399,7 +360,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
updatewinid(c);
for(i = 0; i < LENGTH(keys); i++) {
if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval
&& CLEANMASK(ev->state) == keys[i].mod
&& (ev->state & keys[i].mod) == keys[i].mod
&& keys[i].func) {
keys[i].func(c, &(keys[i].arg));
processed = TRUE;
@@ -410,8 +371,9 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
void
linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) {
if(l)
if(l) {
c->linkhover = copystr(&c->linkhover, l);
}
else if(c->linkhover) {
free(c->linkhover);
c->linkhover = NULL;
@@ -420,44 +382,71 @@ linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) {
}
void
loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
setatom(c, uriprop, geturi(c));
}
loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
WebKitWebFrame *frame;
WebKitWebDataSource *src;
WebKitNetworkRequest *request;
SoupMessage *msg;
char *uri;
void
loadstart(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
c->progress = 0;
update(c);
reloadcookies();
switch(webkit_web_view_get_load_status (c->view)) {
case WEBKIT_LOAD_COMMITTED:
uri = geturi(c);
if(strstr(uri, "https://") == uri) {
frame = webkit_web_view_get_main_frame(c->view);
src = webkit_web_frame_get_data_source(frame);
request = webkit_web_data_source_get_request(src);
msg = webkit_network_request_get_message(request);
c->sslfailed = soup_message_get_flags(msg)
^ SOUP_MESSAGE_CERTIFICATE_TRUSTED;
}
setatom(c, AtomUri, uri);
break;
case WEBKIT_LOAD_FINISHED:
c->progress = 0;
update(c);
break;
default:
break;
}
}
void
loaduri(Client *c, const Arg *arg) {
char *u;
const char *uri = (char *)arg->v;
Arg a = { .b = FALSE };
if(strcmp(uri, "") == 0)
return;
u = g_strrstr(uri, "://") ? g_strdup(uri)
: g_strdup_printf("http://%s", uri);
webkit_web_view_load_uri(c->view, u);
c->progress = 0;
c->title = copystr(&c->title, u);
g_free(u);
update(c);
/* prevents endless loop */
if(c->uri && strcmp(u, c->uri) == 0) {
reload(c, &a);
}
else {
webkit_web_view_load_uri(c->view, u);
c->progress = 0;
c->title = copystr(&c->title, u);
g_free(u);
update(c);
}
}
void
navigate(Client *c, const Arg *arg) {
gint steps = *(gint *)arg;
int steps = *(int *)arg;
webkit_web_view_go_back_or_forward(c->view, steps);
}
Client *
newclient(void) {
int i;
Client *c;
WebKitWebSettings *settings;
WebKitWebFrame *frame;
GdkGeometry hints = { 1, 1 };
char *uri;
char *uri, *ua;
if(!(c = calloc(1, sizeof(Client))))
die("Cannot malloc!\n");
@@ -467,22 +456,23 @@ newclient(void) {
}
else {
c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "surf");
/* TA: 20091214: Despite what the GNOME docs say, the ICCCM
* is always correct, so we should still call this function.
* But when doing so, we *must* differentiate between a
* WM_CLASS and a resource on the window. By convention, the
* window class (WM_CLASS) is capped, while the resource is in
* lowercase. Both these values come as a pair.
*/
gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "Surf");
/* TA: 20091214: And set the role here as well -- so that
* sessions can pick this up.
*/
gtk_window_set_role(GTK_WINDOW(c->win), "Surf");
}
gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600);
g_signal_connect(G_OBJECT(c->win), "destroy", G_CALLBACK(destroywin), c);
g_signal_connect(G_OBJECT(c->win), "key-press-event", G_CALLBACK(keypress), c);
g_signal_connect(G_OBJECT(c->win), "size-allocate", G_CALLBACK(resize), c);
if(!(c->items = calloc(1, sizeof(GtkWidget *) * LENGTH(items))))
die("Cannot malloc!\n");
/* contextmenu */
for(i = 0; i < LENGTH(items); i++) {
c->items[i] = gtk_menu_item_new_with_label(items[i].label);
g_signal_connect(G_OBJECT(c->items[i]), "activate",
G_CALLBACK(itemclick), c);
}
/* VBox */
c->vbox = gtk_vbox_new(FALSE, 0);
@@ -495,16 +485,14 @@ newclient(void) {
/* Webview */
c->view = WEBKIT_WEB_VIEW(webkit_web_view_new());
g_signal_connect(G_OBJECT(c->view), "title-changed", G_CALLBACK(titlechange), c);
g_signal_connect(G_OBJECT(c->view), "load-progress-changed", G_CALLBACK(progresschange), c);
g_signal_connect(G_OBJECT(c->view), "load-committed", G_CALLBACK(loadcommit), c);
g_signal_connect(G_OBJECT(c->view), "load-started", G_CALLBACK(loadstart), c);
g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c);
g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c);
g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c);
g_signal_connect(G_OBJECT(c->view), "mime-type-policy-decision-requested", G_CALLBACK(decidedownload), c);
g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c);
g_signal_connect(G_OBJECT(c->view), "populate-popup", G_CALLBACK(context), c);
g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c);
g_signal_connect(G_OBJECT(c->view), "notify::progress", G_CALLBACK(progresschange), c);
g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
/* Indicator */
c->indicator = gtk_drawing_area_new();
@@ -531,14 +519,26 @@ newclient(void) {
gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK);
gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c);
webkit_web_view_set_full_content_zoom(c->view, TRUE);
frame = webkit_web_view_get_main_frame(c->view);
runscript(frame);
settings = webkit_web_view_get_settings(c->view);
g_object_set(G_OBJECT(settings), "user-agent", useragent, NULL);
if(!(ua = getenv("SURF_USERAGENT")))
ua = useragent;
g_object_set(G_OBJECT(settings), "user-agent", ua, NULL);
uri = g_strconcat("file://", stylefile, NULL);
g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL);
g_free(uri);
setatom(c, findprop, "");
g_object_set(G_OBJECT(settings), "auto-load-images", loadimage, NULL);
g_object_set(G_OBJECT(settings), "enable-plugins", plugin, NULL);
g_object_set(G_OBJECT(settings), "enable-scripts", script, NULL);
g_object_set(G_OBJECT(settings), "enable-spatial-navigation", SPATIAL_BROWSING, NULL);
g_free(uri);
setatom(c, AtomFind, "");
setatom(c, AtomUri, "about:blank");
if(HIDE_BACKGROUND)
webkit_web_view_set_transparent(c->view, TRUE);
c->download = NULL;
c->title = NULL;
c->next = clients;
clients = c;
@@ -546,14 +546,30 @@ newclient(void) {
gdk_display_sync(gtk_widget_get_display(c->win));
printf("%u\n", (guint)GDK_WINDOW_XID(GTK_WIDGET(c->win)->window));
fflush(NULL);
if (fclose(stdout) != 0) {
die("Error closing stdout");
}
}
return c;
}
void
newrequest(SoupSession *s, SoupMessage *msg, gpointer v) {
SoupMessageHeaders *h = msg->request_headers;
SoupURI *uri;
const char *c;
soup_message_headers_remove(h, "Cookie");
uri = soup_message_get_uri(msg);
if((c = getcookies(uri)))
soup_message_headers_append(h, "Cookie", c);
g_signal_connect_after(G_OBJECT(msg), "got-headers", G_CALLBACK(gotheaders), NULL);
}
void
newwindow(Client *c, const Arg *arg) {
guint i = 0;
const char *cmd[7], *uri;
const char *cmd[10], *uri;
const Arg a = { .v = (void *)cmd };
char tmp[64];
@@ -563,9 +579,14 @@ newwindow(Client *c, const Arg *arg) {
snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
cmd[i++] = tmp;
}
if(showxid) {
if(!script)
cmd[i++] = "-s";
if(!plugin)
cmd[i++] = "-p";
if(!loadimage)
cmd[i++] = "-i";
if(showxid)
cmd[i++] = "-x";
}
cmd[i++] = "--";
uri = arg->v ? (char *)arg->v : c->linkhover;
if(uri)
@@ -594,26 +615,25 @@ processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty;
if(ignorexprop)
ignorexprop--;
else if(ev->state == PropertyNewValue) {
if(ev->atom == uriprop) {
arg.v = getatom(c, uriprop);
loaduri(c, &arg);
}
else if(ev->atom == findprop) {
if(ev->state == PropertyNewValue) {
if(ev->atom == atoms[AtomFind]) {
arg.b = TRUE;
find(c, &arg);
return GDK_FILTER_REMOVE;
}
else if(ev->atom == atoms[AtomGo]) {
arg.v = getatom(c, AtomGo);
loaduri(c, &arg);
return GDK_FILTER_REMOVE;
}
return GDK_FILTER_REMOVE;
}
}
return GDK_FILTER_CONTINUE;
}
void
progresschange(WebKitWebView *v, gint p, Client *c) {
c->progress = p;
progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
c->progress = webkit_web_view_get_progress(c->view) * 100;
update(c);
}
@@ -627,59 +647,66 @@ reload(Client *c, const Arg *arg) {
}
void
reloadcookies() {
SoupCookieJar *jar;
GSList *l, *e;
lockcookie = TRUE;
for(l = e = soup_cookie_jar_all_cookies(cookies); e; e = e->next)
soup_cookie_jar_delete_cookie(cookies, (SoupCookie *)e->data);
soup_cookies_free(l);
jar = soup_cookie_jar_text_new(cookiefile, TRUE);
for(l = e = soup_cookie_jar_all_cookies(jar); e; e = e->next)
soup_cookie_jar_add_cookie(cookies, (SoupCookie *)e->data);
g_slist_free(l);
lockcookie = FALSE;
g_object_unref(jar);
scroll_h(Client *c, const Arg *arg) {
scroll(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(c->scroll)), arg);
}
void
resize(GtkWidget *w, GtkAllocation *a, Client *c) {
double zoom;
if(c->zoomed)
return;
zoom = webkit_web_view_get_zoom_level(c->view);
if(a->width * a->height < 300 * 400 && zoom != 0.2)
webkit_web_view_set_zoom_level(c->view, 0.2);
else if(zoom != 1.0)
webkit_web_view_set_zoom_level(c->view, 1.0);
scroll_v(Client *c, const Arg *arg) {
scroll(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(c->scroll)), arg);
}
void
scroll(Client *c, const Arg *arg) {
gdouble v;
GtkAdjustment *a;
scroll(GtkAdjustment *a, const Arg *arg) {
gdouble v;
a = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(c->scroll));
v = gtk_adjustment_get_value(a);
v += gtk_adjustment_get_step_increment(a) * arg->i;
v = MAX(v, 0.0);
v = MIN(v, gtk_adjustment_get_upper(a) - gtk_adjustment_get_page_size(a));
gtk_adjustment_set_value(a, v);
v = gtk_adjustment_get_value(a);
switch (arg->i){
case +10000:
case -10000:
v += gtk_adjustment_get_page_increment(a) * (arg->i / 10000); break;
case +20000:
case -20000:
default:
v += gtk_adjustment_get_step_increment(a) * arg->i;
}
v = MAX(v, 0.0);
v = MIN(v, gtk_adjustment_get_upper(a) - gtk_adjustment_get_page_size(a));
gtk_adjustment_set_value(a, v);
}
void
setatom(Client *c, Atom a, const char *v) {
setcookie(SoupCookie *c) {
int lock;
lock = open(cookiefile, 0);
flock(lock, LOCK_EX);
SoupDate *e;
SoupCookieJar *j = soup_cookie_jar_text_new(cookiefile, FALSE);
c = soup_cookie_copy(c);
if(c->expires == NULL && sessiontime) {
e = soup_date_new_from_time_t(time(NULL) + sessiontime);
soup_cookie_set_expires(c, e);
}
soup_cookie_jar_add_cookie(j, c);
g_object_unref(j);
flock(lock, LOCK_UN);
close(lock);
}
void
setatom(Client *c, int a, const char *v) {
XSync(dpy, False);
ignorexprop++;
XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), a,
XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), atoms[a],
XA_STRING, 8, PropModeReplace, (unsigned char *)v,
strlen(v) + 1);
}
void
setup(void) {
char *proxy;
char *new_proxy;
SoupURI *puri;
SoupSession *s;
/* clean up any zombies immediately */
@@ -689,22 +716,37 @@ setup(void) {
g_thread_init(NULL);
dpy = GDK_DISPLAY();
session = webkit_get_default_session();
uriprop = XInternAtom(dpy, "_SURF_URI", False);
findprop = XInternAtom(dpy, "_SURF_FIND", False);
s = webkit_get_default_session();
/* create dirs and files */
/* atoms */
atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False);
atoms[AtomGo] = XInternAtom(dpy, "_SURF_GO", False);
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
/* dirs and files */
cookiefile = buildpath(cookiefile);
dldir = buildpath(dldir);
scriptfile = buildpath(scriptfile);
stylefile = buildpath(stylefile);
/* cookie persistance */
/* request handler */
s = webkit_get_default_session();
cookies = soup_cookie_jar_new();
soup_session_add_feature(s, SOUP_SESSION_FEATURE(cookies));
g_signal_connect(cookies, "changed", G_CALLBACK(changecookie), NULL);
reloadcookies();
soup_session_remove_feature_by_type(s, soup_cookie_get_type());
soup_session_remove_feature_by_type(s, soup_cookie_jar_get_type());
g_signal_connect_after(G_OBJECT(s), "request-started", G_CALLBACK(newrequest), NULL);
/* ssl */
g_object_set(G_OBJECT(s), "ssl-ca-file", cafile, NULL);
g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL);
/* proxy */
if((proxy = getenv("http_proxy")) && strcmp(proxy, "")) {
new_proxy = g_strrstr(proxy, "http://") ? g_strdup(proxy) :
g_strdup_printf("http://%s", proxy);
puri = soup_uri_new(new_proxy);
g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL);
soup_uri_free(puri);
g_free(new_proxy);
}
}
void
@@ -737,13 +779,15 @@ spawn(Client *c, const Arg *arg) {
}
}
void
eval(Client *c, const Arg *arg) {
WebKitWebFrame *frame = webkit_web_view_get_main_frame(c->view);
evalscript(webkit_web_frame_get_global_context(frame), ((char **)arg->v)[0], "");
}
void
stop(Client *c, const Arg *arg) {
if(c->download)
webkit_download_cancel(c->download);
else
webkit_web_view_stop_loading(c->view);
c->download = NULL;
webkit_web_view_stop_loading(c->view);
}
void
@@ -756,10 +800,10 @@ void
update(Client *c) {
char *t;
if(c->progress != 100)
t = g_strdup_printf("[%i%%] %s", c->progress, c->title);
else if(c->linkhover)
if(c->linkhover)
t = g_strdup(c->linkhover);
else if(c->progress != 100)
t = g_strdup_printf("[%i%%] %s", c->progress, c->title);
else
t = g_strdup(c->title);
drawindicator(c);
@@ -767,17 +811,6 @@ update(Client *c) {
g_free(t);
}
void
updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c) {
WebKitDownloadStatus status;
status = webkit_download_get_status(c->download);
if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLOAD_STATUS_CREATED) {
c->progress = (gint)(webkit_download_get_progress(c->download)*100);
}
update(c);
}
void
updatewinid(Client *c) {
snprintf(winid, LENGTH(winid), "%u",
@@ -787,20 +820,12 @@ updatewinid(Client *c) {
void
usage(void) {
fputs("surf - simple browser\n", stderr);
die("usage: surf [-e Window] [-x] [uri]\n");
die("usage: surf [-e xid] [-i] [-p] [-s] [-v] [-x] [uri]\n");
}
void
windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObjectRef win, Client *c) {
JSStringRef jsscript;
char *script;
JSValueRef exception = NULL;
GError *error;
if(g_file_get_contents(scriptfile, &script, NULL, &error)) {
jsscript = JSStringCreateWithUTF8CString(script);
JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), NULL, 0, &exception);
}
runscript(frame);
}
void
@@ -816,29 +841,43 @@ zoom(Client *c, const Arg *arg) {
}
}
int main(int argc, char *argv[]) {
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] == '-'; i++) {
if(!strcmp(argv[i], "-x"))
showxid = TRUE;
else if(!strcmp(argv[i], "-e")) {
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 = atoi(argv[i]);
else
usage();
}
else if(!strcmp(argv[i], "--")) {
i++;
break;
}
else if(!strcmp(argv[i], "-v"))
die("surf-"VERSION", © 2009 surf engineers, see LICENSE for details\n");
else
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];
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B