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
					
				
							
								
								
									
										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 New Issue