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.
This commit is contained in:
parent
50befe4a95
commit
af7522006b
2 changed files with 61 additions and 18 deletions
17
config.def.h
17
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 } },
|
||||
|
|
62
surf.c
62
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
|
||||
|
|
Loading…
Reference in a new issue