tGet rid of JavaScript for scrolling in views - 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 af7522006b2aa1b92081a474f831df52d6d9ff13
 (DIR) parent 50befe4a9586f7ef29a00ae78e7580dfe16a48df
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Wed,  2 Mar 2016 14:29:21 +0100
       
       Get rid of JavaScript for scrolling in views
       
       This is still a hack, until WebKitGTK gives us a more practical and
       stable way to do that. Manipulating directly the DOM inside a
       webextension is a pain and only usable with unstable API atm.
       
       Diffstat:
         M config.def.h                        |      17 ++++++++++-------
         M surf.c                              |      62 +++++++++++++++++++++++++------
       
       2 files changed, 61 insertions(+), 18 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -109,13 +109,16 @@ static Key keys[] = {
                { MODKEY,                GDK_KEY_l,      navigate,   { .i = +1 } },
                { MODKEY,                GDK_KEY_h,      navigate,   { .i = -1 } },
        
       -                                                             /* in page % */
       -        { MODKEY,                GDK_KEY_j,      scroll_v,   { .i = +10 } },
       -        { MODKEY,                GDK_KEY_k,      scroll_v,   { .i = -10 } },
       -        { MODKEY,                GDK_KEY_b,      scroll_v,   { .i = -50 } },
       -        { MODKEY,                GDK_KEY_space,  scroll_v,   { .i = +50 } },
       -        { MODKEY,                GDK_KEY_i,      scroll_h,   { .i = +10 } },
       -        { MODKEY,                GDK_KEY_u,      scroll_h,   { .i = -10 } },
       +        /* Currently we have to use scrolling steps that WebKit2GTK+ gives us
       +         * d: step down, u: step up, r: step right, l:step left
       +         * D: page down, U: page up */
       +        { MODKEY,                GDK_KEY_j,      scroll,     { .i = 'd' } },
       +        { MODKEY,                GDK_KEY_k,      scroll,     { .i = 'u' } },
       +        { MODKEY,                GDK_KEY_b,      scroll,     { .i = 'U' } },
       +        { MODKEY,                GDK_KEY_space,  scroll,     { .i = 'D' } },
       +        { MODKEY,                GDK_KEY_i,      scroll,     { .i = 'r' } },
       +        { MODKEY,                GDK_KEY_u,      scroll,     { .i = 'l' } },
       +
        
                { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j,      zoom,       { .i = -1 } },
                { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k,      zoom,       { .i = +1 } },
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -126,6 +126,7 @@ static void destroyclient(Client *c);
        static void cleanup(void);
        
        /* GTK/WebKit */
       +static GdkDevice *getkbdevice(void);
        static WebKitWebView *newview(Client *c, WebKitWebView *rv);
        static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a,
                                     Client *c);
       t@@ -160,8 +161,7 @@ static void reload(Client *c, const Arg *a);
        static void print(Client *c, const Arg *a);
        static void clipboard(Client *c, const Arg *a);
        static void zoom(Client *c, const Arg *a);
       -static void scroll_v(Client *c, const Arg *a);
       -static void scroll_h(Client *c, const Arg *a);
       +static void scroll(Client *c, const Arg *a);
        static void navigate(Client *c, const Arg *a);
        static void stop(Client *c, const Arg *a);
        static void toggle(Client *c, const Arg *a);
       t@@ -185,6 +185,7 @@ static int showxid;
        static int cookiepolicy;
        static Display *dpy;
        static Client *clients;
       +static GdkDevice *gdkkb;
        static char *stylefile;
        static const char *useragent;
        char *argv0;
       t@@ -232,6 +233,8 @@ setup(void)
                scriptfile = buildfile(scriptfile);
                cachedir   = buildpath(cachedir);
        
       +        gdkkb = getkbdevice();
       +
                if (!stylefile) {
                        styledir = buildpath(styledir);
                        for (i = 0; i < LENGTH(styles); ++i) {
       t@@ -660,6 +663,22 @@ cleanup(void)
                g_free(cachedir);
        }
        
       +static GdkDevice *
       +getkbdevice(void)
       +{
       +        GList *l, *gdl = gdk_device_manager_list_devices(
       +                   gdk_display_get_device_manager(gdk_display_get_default()),
       +                   GDK_DEVICE_TYPE_MASTER);
       +        GdkDevice *gd = NULL;
       +
       +        for (l = gdl; l != NULL; l = l->next)
       +                if (gdk_device_get_source(l->data) == GDK_SOURCE_KEYBOARD)
       +                        gd = l->data;
       +
       +        g_list_free(gdl);
       +        return gd;
       +}
       +
        WebKitWebView *
        newview(Client *c, WebKitWebView *rv)
        {
       t@@ -1257,17 +1276,38 @@ zoom(Client *c, const Arg *a)
        }
        
        void
       -scroll_v(Client *c, const Arg *a)
       +scroll(Client *c, const Arg *a)
        {
       -        evalscript(c, "window.scrollBy(0, %d * (window.innerHeight / 100))",
       -                   a->i);
       -}
       +        GdkEvent *ev = gdk_event_new(GDK_KEY_PRESS);
        
       -void
       -scroll_h(Client *c, const Arg *a)
       -{
       -        evalscript(c, "window.scrollBy(%d * (window.innerWidth / 100), 0)",
       -                   a->i);
       +        gdk_event_set_device(ev, gdkkb);
       +//        gdk_event_set_screen(ev, gdk_screen_get_default());
       +        ev->key.window = gtk_widget_get_window(GTK_WIDGET(c->win));
       +        ev->key.state = GDK_CONTROL_MASK;
       +        ev->key.time = GDK_CURRENT_TIME;
       +
       +        switch (a->i) {
       +        case 'd':
       +                ev->key.keyval = GDK_KEY_Down;
       +                break;
       +        case 'D':
       +                ev->key.keyval = GDK_KEY_Page_Down;
       +                break;
       +        case 'l':
       +                ev->key.keyval = GDK_KEY_Left;
       +                break;
       +        case 'r':
       +                ev->key.keyval = GDK_KEY_Right;
       +                break;
       +        case 'U':
       +                ev->key.keyval = GDK_KEY_Page_Up;
       +                break;
       +        case 'u':
       +                ev->key.keyval = GDK_KEY_Up;
       +                break;
       +        }
       +
       +        gdk_event_put(ev);
        }
        
        void