Making zoom available when used in tabbed.
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 07c689e..a15ed00 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -13,6 +13,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <webkit/webkit.h>
@@ -78,7 +79,9 @@ static Client *clients = NULL;
 static GdkNativeWindow embed = 0;
 static gboolean showxid = FALSE;
 static char winid[64];
-static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
+static gboolean loadimages = 1, enableplugins = 1, enablescripts = 1,
+               usingproxy = 0;
+static char togglestat[5];
 
 static char *buildpath(const char *path);
 static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
@@ -126,6 +129,8 @@ 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 toggle(Client *c, const Arg *arg);
+static void gettogglestat(Client *c);
 static void update(Client *c);
 static void updatewinid(Client *c);
 static void usage(void);
@@ -356,13 +361,13 @@ drawindicator(Client *c) {
        width = c->progress * w->allocation.width / 100;
        gc = gdk_gc_new(w->window);
        if(strstr(uri, "https://") == uri) {
-               if(using_proxy) {
+               if(usingproxy) {
                        colorname = c->sslfailed? progress_proxy_untrust : progress_proxy_trust;
                } else {
                        colorname = c->sslfailed? progress_untrust : progress_trust;
                }
        } else {
-               if(using_proxy) {
+               if(usingproxy) {
                        colorname = progress_proxy;
                } else {
                        colorname = progress;
@@ -427,7 +432,7 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
        Arg arg;
 
        updatewinid(c);
-       arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o));
+       arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(c));
        spawn(c, &arg);
        return FALSE;
 }
@@ -446,6 +451,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
                        processed = TRUE;
                }
        }
+
        return processed;
 }
 
@@ -453,8 +459,7 @@ void
 linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) {
        if(l) {
                c->linkhover = copystr(&c->linkhover, l);
-       }
-       else if(c->linkhover) {
+       } else if(c->linkhover) {
                free(c->linkhover);
                c->linkhover = NULL;
        }
@@ -493,19 +498,27 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
 
 void
 loaduri(Client *c, const Arg *arg) {
-       char *u;
+       char *u, *rp;
        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);
+
+       /* In case it's a file path. */
+       if(uri[0] == '/') {
+               rp = realpath(uri, NULL);
+               u = g_strdup_printf("file://%s", rp);
+               free(rp);
+       } else {
+               u = g_strrstr(uri, "://") ? g_strdup(uri)
+                       : g_strdup_printf("http://%s", uri);
+       }
+
        /* prevents endless loop */
        if(c->uri && strcmp(u, c->uri) == 0) {
                reload(c, &a);
-       }
-       else {
+       } else {
                webkit_web_view_load_uri(c->view, u);
                c->progress = 0;
                c->title = copystr(&c->title, u);
@@ -530,12 +543,13 @@ newclient(void) {
 
        if(!(c = calloc(1, sizeof(Client))))
                die("Cannot malloc!\n");
+
        /* Window */
        if(embed) {
                c->win = gtk_plug_new(embed);
-       }
-       else {
+       } else {
                c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
                /* 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
@@ -600,6 +614,7 @@ 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);
@@ -608,16 +623,17 @@ newclient(void) {
        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_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_object_set(G_OBJECT(settings), "auto-load-images", loadimages, NULL);
+       g_object_set(G_OBJECT(settings), "enable-plugins", enableplugins, NULL);
+       g_object_set(G_OBJECT(settings), "enable-scripts", enablescripts, NULL);
+       g_object_set(G_OBJECT(settings), "enable-spatial-navigation",
+                       spatialbrowsing, NULL);
 
        g_free(uri);
 
        setatom(c, AtomFind, "");
        setatom(c, AtomUri, "about:blank");
-       if(HIDE_BACKGROUND)
+       if(hidebackground)
                webkit_web_view_set_transparent(c->view, TRUE);
 
        c->title = NULL;
@@ -647,11 +663,11 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) {
                snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
                cmd[i++] = tmp;
        }
-       if(!script)
+       if(!enablescripts)
                cmd[i++] = "-s";
-       if(!plugin)
+       if(!enableplugins)
                cmd[i++] = "-p";
-       if(!loadimage)
+       if(!loadimages)
                cmd[i++] = "-i";
        if(showxid)
                cmd[i++] = "-x";
@@ -839,7 +855,7 @@ setup(void) {
                g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL);
                soup_uri_free(puri);
                g_free(new_proxy);
-               using_proxy = 1;
+               usingproxy = 1;
        }
 }
 
@@ -891,20 +907,60 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) {
        update(c);
 }
 
+void
+toggle(Client *c, const Arg *arg) {
+       WebKitWebSettings *settings;
+       char *name = (char *)arg->v;
+       gboolean value;
+       Arg a = { .b = FALSE };
+
+       settings = webkit_web_view_get_settings(c->view);
+       g_object_get(G_OBJECT(settings), name, &value, NULL);
+       g_object_set(G_OBJECT(settings), name, !value, NULL);
+
+       reload(c,&a);
+}
+
+void
+gettogglestat(Client *c){
+       gboolean value;
+       WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
+
+       g_object_get(G_OBJECT(settings), "enable-caret-browsing",
+                       &value, NULL);
+       togglestat[0] = value? 'C': 'c';
+
+       g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL);
+       togglestat[1] = value? 'I': 'i';
+
+       g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL);
+       togglestat[2] = value? 'S': 's';
+
+       g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL);
+       togglestat[3] = value? 'V': 'v';
+
+       togglestat[4] = '\0';
+}
+
+
 void
 update(Client *c) {
        char *t;
 
+       gettogglestat(c);
+
        if(c->linkhover) {
-               t = g_strdup(c->linkhover);
+               t = g_strdup_printf("%s| %s", togglestat, c->linkhover);
        } else if(c->progress != 100) {
                drawindicator(c);
                gtk_widget_show(c->indicator);
-               t = g_strdup_printf("[%i%%] %s", c->progress, c->title);
+               t = g_strdup_printf("[%i%%] %s| %s", c->progress, togglestat,
+                               c->title);
        } else {
                gtk_widget_hide_all(c->indicator);
-               t = g_strdup(c->title);
+               t = g_strdup_printf("%s| %s", togglestat, c->title);
        }
+
        gtk_window_set_title(GTK_WINDOW(c->win), t);
        g_free(t);
 }
@@ -930,11 +986,14 @@ windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObje
 void
 zoom(Client *c, const Arg *arg) {
        c->zoomed = TRUE;
-       if(arg->i < 0)          /* zoom out */
+       if(arg->i < 0) {
+               /* zoom out */
                webkit_web_view_zoom_out(c->view);
-       else if(arg->i > 0)     /* zoom in */
+       } else if(arg->i > 0) {
+               /* zoom in */
                webkit_web_view_zoom_in(c->view);
-       else {                  /* reset */
+       } else {
+               /* reset */
                c->zoomed = FALSE;
                webkit_web_view_set_zoom_level(c->view, 1.0);
        }
@@ -944,6 +1003,8 @@ int
 main(int argc, char *argv[]) {
        Arg arg;
 
+       memset(&arg, 0, sizeof(arg));
+
        /* command line args */
        ARGBEGIN {
        case 'c':
@@ -953,16 +1014,16 @@ main(int argc, char *argv[]) {
                embed = strtol(EARGF(usage()), NULL, 0);
                break;
        case 'i':
-               loadimage = 0;
+               loadimages = 0;
                break;
        case 'p':
-               plugin = 0;
+               enableplugins = 0;
                break;
        case 'r':
                scriptfile = EARGF(usage());
                break;
        case 's':
-               script = 0;
+               enablescripts = 0;
                break;
        case 't':
                stylefile = EARGF(usage());
@@ -985,6 +1046,7 @@ main(int argc, char *argv[]) {
        newclient();
        if(arg.v)
                loaduri(clients, &arg);
+
        gtk_main();
        cleanup();