Enable the insert mode. Thanks to stanio@cs.tu-berlin.de!
authorChristoph Lohmann <20h@r-36.net>
Thu, 15 Nov 2012 14:26:48 +0000 (15:26 +0100)
committerChristoph Lohmann <20h@r-36.net>
Thu, 15 Nov 2012 14:26:48 +0000 (15:26 +0100)
config.def.h
surf.1
surf.c

index 5f554ff..6f58da7 100644 (file)
@@ -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 } },
     { 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 } },
     { MODKEY,               GDK_i,           scroll_h,   { .i = +1 } },
     { MODKEY,               GDK_u,           scroll_h,   { .i = -1 } },
     { 0,                    GDK_Escape, stop,       { 0 } },
diff --git a/surf.1 b/surf.1
index 2f3b1e5..b1c33dd 100644 (file)
--- a/surf.1
+++ b/surf.1
@@ -67,6 +67,18 @@ Scrolls page upwards.
 .B Ctrl\-j
 Scrolls page downwards.
 .TP
 .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
 .B Ctrl\-Shift\-k
 Zooms page in.
 .TP
@@ -76,7 +88,20 @@ Zooms page out
 .B Ctrl\-Shift\-i
 Resets Zoom
 .TP
 .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
 Opens the search-bar.
 .TP
 .B Ctrl\-n
@@ -104,7 +129,19 @@ Reloads the website without using cache.
 Copies current URI to primary selection.
 .TP
 .B Ctrl\-o
 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
 .SH ENVIRONMENT
 .TP
 .B SURF_USERAGENT
diff --git a/surf.c b/surf.c
index 2465fd1..dcd0ad0 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -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 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);
 
 static char *buildpath(const char *path);
 static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
@@ -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 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);
 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);
@@ -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 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);
 static void update(Client *c);
 static void updatewinid(Client *c);
 static void usage(void);
@@ -433,20 +437,50 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
        return FALSE;
 }
 
        return FALSE;
 }
 
+void
+insert(Client *c, const Arg *arg) {
+       insertmode = TRUE;
+       update(clients);
+}
+
 gboolean
 keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
 gboolean
 keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
-       guint i;
+       guint i, state;
        gboolean processed = FALSE;
 
        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++) {
        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
                if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval
-                               && (ev->state & keys[i].mod) == keys[i].mod
                                && keys[i].func) {
                                && 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;
 }
 
        return processed;
 }
 
@@ -891,7 +925,7 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) {
 }
 
 void
 }
 
 void
-toggle(Client *c, const Arg *arg) { 
+toggle(Client *c, const Arg *arg) {
        WebKitWebSettings *settings;
        char *name = (char *)arg->v;
        gboolean value;
        WebKitWebSettings *settings;
        char *name = (char *)arg->v;
        gboolean value;
@@ -904,19 +938,43 @@ toggle(Client *c, const Arg *arg) {
        reload(c,&a);
 }
 
        reload(c,&a);
 }
 
+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;
 
 void
 update(Client *c) {
        char *t;
 
+       gettogglestat(c);
+
        if(c->linkhover) {
        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);
        } 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);
        } 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);
        }
 
        gtk_window_set_title(GTK_WINDOW(c->win), t);