allow buttonrelease customization in config.h

Signed-off-by: Christoph Lohmann <20h@r-36.net>
This commit is contained in:
Markus Teich 2015-01-28 21:01:55 +01:00 committed by Christoph Lohmann
parent f7e358280c
commit 29c2ab207a
2 changed files with 48 additions and 8 deletions

View File

@ -127,3 +127,13 @@ static Key keys[] = {
{ MODKEY|GDK_SHIFT_MASK,GDK_g, togglegeolocation, { 0 } }, { MODKEY|GDK_SHIFT_MASK,GDK_g, togglegeolocation, { 0 } },
}; };
/* button definitions */
/* click can be ClkDoc, ClkLink, ClkImg, ClkMedia, ClkSel, ClkEdit, ClkAny */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLink, 0, 2, linkopenembed, { 0 } },
{ ClkLink, MODKEY, 2, linkopen, { 0 } },
{ ClkLink, MODKEY, 1, linkopen, { 0 } },
{ ClkAny, 0, 8, navigate, { .i = -1 } },
{ ClkAny, 0, 9, navigate, { .i = +1 } },
};

44
surf.c
View File

@ -35,6 +35,15 @@ char *argv0;
#define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar)) #define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar))
enum { AtomFind, AtomGo, AtomUri, AtomLast }; enum { AtomFind, AtomGo, AtomUri, AtomLast };
enum {
ClkDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT,
ClkLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK,
ClkImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE,
ClkMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA,
ClkSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION,
ClkEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE,
ClkAny = ClkDoc | ClkLink | ClkImg | ClkMedia | ClkSel | ClkEdit,
};
typedef union Arg Arg; typedef union Arg Arg;
union Arg { union Arg {
@ -61,6 +70,14 @@ typedef struct {
const Arg arg; const Arg arg;
} Key; } Key;
typedef struct {
unsigned int click;
unsigned int mask;
guint button;
void (*func)(Client *c, const Arg *arg);
const Arg arg;
} Button;
typedef struct { typedef struct {
SoupCookieJarText parent_instance; SoupCookieJarText parent_instance;
int lock; int lock;
@ -97,8 +114,7 @@ static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
WebKitWebResource *r, WebKitNetworkRequest *req, WebKitWebResource *r, WebKitNetworkRequest *req,
WebKitNetworkResponse *resp, Client *c); WebKitNetworkResponse *resp, Client *c);
static char *buildpath(const char *path); static char *buildpath(const char *path);
static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c);
GList *gl);
static void cleanup(void); static void cleanup(void);
static void clipboard(Client *c, const Arg *arg); static void clipboard(Client *c, const Arg *arg);
@ -168,6 +184,8 @@ static void print(Client *c, const Arg *arg);
static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event,
gpointer d); gpointer d);
static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c); static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
static void linkopen(Client *c, const Arg *arg);
static void linkopenembed(Client *c, const Arg *arg);
static void reload(Client *c, const Arg *arg); static void reload(Client *c, const Arg *arg);
static void scroll_h(Client *c, const Arg *arg); static void scroll_h(Client *c, const Arg *arg);
static void scroll_v(Client *c, const Arg *arg); static void scroll_v(Client *c, const Arg *arg);
@ -273,18 +291,20 @@ buildpath(const char *path) {
} }
static gboolean static gboolean
buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl) { buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c) {
WebKitHitTestResultContext context; WebKitHitTestResultContext context;
WebKitHitTestResult *result = webkit_web_view_get_hit_test_result(web, WebKitHitTestResult *result = webkit_web_view_get_hit_test_result(web,
e); e);
Arg arg; Arg arg;
unsigned int i;
g_object_get(result, "context", &context, NULL); g_object_get(result, "context", &context, NULL);
if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) {
if(e->button == 2 ||
(e->button == 1 && CLEANMASK(e->state) == CLEANMASK(MODKEY))) {
g_object_get(result, "link-uri", &arg.v, NULL); g_object_get(result, "link-uri", &arg.v, NULL);
newwindow(NULL, &arg, e->state & GDK_CONTROL_MASK); printf("%d %d\n", context, e->button);
for(i = 0; i < LENGTH(buttons); i++) {
if(context & buttons[i].click && e->button == buttons[i].button &&
CLEANMASK(e->state) == CLEANMASK(buttons[i].mask) && buttons[i].func) {
buttons[i].func(c, buttons[i].click == ClkLink && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
return true; return true;
} }
} }
@ -1118,6 +1138,16 @@ progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
updatetitle(c); updatetitle(c);
} }
static void
linkopen(Client *c, const Arg *arg) {
newwindow(NULL, arg, 1);
}
static void
linkopenembed(Client *c, const Arg *arg) {
newwindow(NULL, arg, 0);
}
static void static void
reload(Client *c, const Arg *arg) { reload(Client *c, const Arg *arg) {
gboolean nocache = *(gboolean *)arg; gboolean nocache = *(gboolean *)arg;