about summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Rameau <quinq@fifth.space>2016-03-02 14:29:21 +0100
committerQuentin Rameau <quinq@fifth.space>2016-03-02 14:46:14 +0100
commitaf7522006b2aa1b92081a474f831df52d6d9ff13 (patch)
tree4d643ca955d76c69af75de5b0e73f351753ae351
parentModify linking parameter (diff)
downloadsurf-af7522006b2aa1b92081a474f831df52d6d9ff13.tar.gz
surf-af7522006b2aa1b92081a474f831df52d6d9ff13.tar.bz2
surf-af7522006b2aa1b92081a474f831df52d6d9ff13.zip
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.
-rw-r--r--config.def.h17
-rw-r--r--surf.c62
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