From af7522006b2aa1b92081a474f831df52d6d9ff13 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Wed, 2 Mar 2016 14:29:21 +0100 Subject: [PATCH] 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. --- config.def.h | 17 ++++++++------ surf.c | 62 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/config.def.h b/config.def.h index 4f6d655..aca8f59 100644 --- a/config.def.h +++ b/config.def.h @@ -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 } }, diff --git a/surf.c b/surf.c index 9b4dbb9..8f2bfe9 100644 --- a/surf.c +++ b/surf.c @@ -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); @@ -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); @@ -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; @@ -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) { @@ -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) { @@ -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