tGet rid of JavaScript for scrolling in views - surf - customized build of surf… | |
git clone git://src.adamsgaard.dk/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit af7522006b2aa1b92081a474f831df52d6d9ff13 | |
parent 50befe4a9586f7ef29a00ae78e7580dfe16a48df | |
Author: Quentin Rameau <[email protected]> | |
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(-) | |
--- | |
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 } }, | |
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 |