Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.