Add eval() function for executing Javascript. Handy for keybindings.
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 79ca9c9..60d1b14 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -21,7 +21,6 @@
 #include <sys/file.h>
 
 #define LENGTH(x)               (sizeof x / sizeof x[0])
-#define CLEANMASK(mask)         (mask & ~(GDK_MOD2_MASK))
 
 enum { AtomFind, AtomGo, AtomUri, AtomLast };
 
@@ -103,6 +102,7 @@ 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);
@@ -144,16 +144,25 @@ cleanup(void) {
        g_free(stylefile);
 }
 
+void
+evalscript(WebKitWebFrame *frame, 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, JSContextRef js) {
-       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);
+               evalscript(frame, webkit_web_frame_get_global_context(frame), script, scriptfile);
        }
 }
 
@@ -345,7 +354,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;
@@ -507,7 +516,7 @@ newclient(void) {
 
        setatom(c, AtomFind, "");
        setatom(c, AtomUri, "about:blank");
-       if(NOBACKGROUND)
+       if(HIDE_BACKGROUND)
                webkit_web_view_set_transparent(c->view, TRUE);
 
        c->title = NULL;
@@ -740,6 +749,12 @@ spawn(Client *c, const Arg *arg) {
        }
 }
 
+void
+eval(Client *c, const Arg *arg) {
+       WebKitWebFrame *frame = webkit_web_view_get_main_frame(c->view);
+       evalscript(frame, webkit_web_frame_get_global_context(frame), ((char **)arg->v)[0], "");
+}
+
 void
 stop(Client *c, const Arg *arg) {
        webkit_web_view_stop_loading(c->view);