tEnable the insert mode. Thanks to stanio@cs.tu-berlin.de! - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c12b6499fe68b4bc3114ed241c937dd38f94de87
 (DIR) parent d911219554e1b51f02ac29aaf200f15f083c9dee
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Thu, 15 Nov 2012 15:26:48 +0100
       
       Enable the insert mode. Thanks to stanio@cs.tu-berlin.de!
       Diffstat:
         M config.def.h                        |       1 +
         M surf.1                              |      41 +++++++++++++++++++++++++++++--
         M surf.c                              |      74 +++++++++++++++++++++++++++----
       
       3 files changed, 106 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -43,6 +43,7 @@ static Key keys[] = {
            { MODKEY,               GDK_k,           scroll_v,   { .i = -1 } },
            { MODKEY,               GDK_b,           scroll_v,   { .i = -10000 } },
            { MODKEY,               GDK_space,       scroll_v,   { .i = +10000 } },
       +    { 0,                    GDK_i,      insert,     { 0 } },
            { MODKEY,               GDK_i,           scroll_h,   { .i = +1 } },
            { MODKEY,               GDK_u,           scroll_h,   { .i = -1 } },
            { 0,                    GDK_Escape, stop,       { 0 } },
 (DIR) diff --git a/surf.1 b/surf.1
       t@@ -67,6 +67,18 @@ Scrolls page upwards.
        .B Ctrl\-j
        Scrolls page downwards.
        .TP
       +.B Ctrl\-b
       +Scroll up one whole page view.
       +.TP
       +.B Ctrl\-Space
       +Scroll down one whole page view.
       +.TP
       +.B Ctrl\-i
       +Scroll horizontally to the right.
       +.TP
       +.B Ctrl\-u
       +Scroll horizontally to the left.
       +.TP
        .B Ctrl\-Shift\-k
        Zooms page in.
        .TP
       t@@ -76,7 +88,20 @@ Zooms page out
        .B Ctrl\-Shift\-i
        Resets Zoom
        .TP
       -.B Ctrl\-f
       +.B i
       +Enter insert mode. There all keybindings have effect with and without
       +pressing the modkey.
       +.TP
       +.B ESC
       +Leave the insert mode.
       +.TP
       +.B Ctrl\-h
       +Navigate back one step in history.
       +.TP
       +.B Ctrl\-l
       +Navigate forward one step in history.
       +.TP
       +.B Ctrl\-f and Ctrl\-\\
        Opens the search-bar.
        .TP
        .B Ctrl\-n
       t@@ -104,7 +129,19 @@ Reloads the website without using cache.
        Copies current URI to primary selection.
        .TP
        .B Ctrl\-o
       -show the sourcecode of the current page.
       +Show the sourcecode of the current page.
       +.TP
       +.B Ctrl\-v
       +Toggle the enabling of plugins on that surf instance.
       +.TP
       +.B Ctrl\-Shift\-i
       +Toggle auto-loading of images.
       +.TP
       +.B Ctrl\-c
       +Toggle caret browsing.
       +.TP
       +.B Ctrl\-Shift\-s
       +Toggle script execution.
        .SH ENVIRONMENT
        .TP
        .B SURF_USERAGENT
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -79,6 +79,8 @@ static GdkNativeWindow embed = 0;
        static gboolean showxid = FALSE;
        static char winid[64];
        static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
       +static char togglestat[6];
       +static gboolean insertmode = FALSE;
        
        static char *buildpath(const char *path);
        static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
       t@@ -101,6 +103,7 @@ static void find(Client *c, const Arg *arg);
        static const char *getatom(Client *c, int a);
        static char *geturi(Client *c);
        static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
       +static void insert(Client *c, const Arg *arg);
        static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c);
        static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c);
        static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
       t@@ -127,6 +130,7 @@ 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);
       t@@ -433,20 +437,50 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
                return FALSE;
        }
        
       +void
       +insert(Client *c, const Arg *arg) {
       +        insertmode = TRUE;
       +        update(clients);
       +}
       +
        gboolean
        keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
       -        guint i;
       +        guint i, state;
                gboolean processed = FALSE;
        
       +        /* turn off insert mode */
       +        if(insertmode && (ev->keyval == GDK_Escape)) {
       +                insertmode = FALSE;
       +                update(c);
       +                return TRUE;
       +        }
       +
       +        if(insertmode && (((ev->state & MODKEY) != MODKEY) || !MODKEY)) {
       +                return FALSE;
       +        }
       +
       +        if(ev->keyval == GDK_Escape) {
       +                webkit_web_view_set_highlight_text_matches(c->view, FALSE);
       +                return TRUE;
       +        }
       +
                updatewinid(c);
                for(i = 0; i < LENGTH(keys); i++) {
       +                if(!insertmode && (MODKEY & keys[i].mod)) {
       +                        state = ev->state | MODKEY;
       +                } else {
       +                        state = ev->state;
       +                }
       +
                        if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval
       -                                && (ev->state & keys[i].mod) == keys[i].mod
                                        && keys[i].func) {
       -                        keys[i].func(c, &(keys[i].arg));
       -                        processed = TRUE;
       +                        if(state == keys[i].mod) {
       +                                keys[i].func(c, &(keys[i].arg));
       +                                processed = TRUE;
       +                        }
                        }
                }
       +
                return processed;
        }
        
       t@@ -891,7 +925,7 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) {
        }
        
        void
       -toggle(Client *c, const Arg *arg) { 
       +toggle(Client *c, const Arg *arg) {
                WebKitWebSettings *settings;
                char *name = (char *)arg->v;
                gboolean value;
       t@@ -905,18 +939,42 @@ toggle(Client *c, const Arg *arg) {
        }
        
        void
       +gettogglestat(Client *c){
       +        gboolean value;
       +        WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
       +
       +        togglestat[4] = '\0';
       +        g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL);
       +        togglestat[0] = value?'I':'i';
       +        g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL);
       +        togglestat[1] = value?'S':'s';
       +        g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL);
       +        togglestat[2] = value?'V':'v';
       +        g_object_get(G_OBJECT(settings), "enable-caret-browsing",
       +                        &value, NULL);
       +        togglestat[3] = value?'C':'c';
       +
       +        togglestat[4] = insertmode? '+' : '-';
       +        togglestat[5] = '\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);