tAdapted buttonrelease() - surf - customized build of surf, the suckless webkit… | |
git clone git://src.adamsgaard.dk/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit f6a35e5fbfb4a5e9f92a126dae0cca103727d9d4 | |
parent 96188f83f0f77f93fc5f4590c1f1c8f13b78e599 | |
Author: Quentin Rameau <[email protected]> | |
Date: Thu, 19 Nov 2015 13:19:27 +0100 | |
Adapted buttonrelease() | |
Use the current hit test (c->mousepos) to determine where the mouse | |
pointer is. | |
It is possible to link an action to a click and still propagate the | |
event after that by setting the “stop event” parameter of a Button to 0. | |
Diffstat: | |
M config.def.h | 4 ++-- | |
M surf.c | 43 +++++++++++++++--------------… | |
2 files changed, 23 insertions(+), 24 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -129,9 +129,9 @@ static Key keys[] = { | |
}; | |
/* button definitions */ | |
-/* where can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ | |
+/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ | |
static Button buttons[] = { | |
- /* where event mask button function argument … | |
+ /* target event mask button function argument … | |
{ OnLink, 0, 2, linkopenembed, { 0 }, … | |
{ OnLink, MODKEY, 2, linkopen, { 0 }, … | |
{ OnLink, MODKEY, 1, linkopen, { 0 }, … | |
diff --git a/surf.c b/surf.c | |
t@@ -76,11 +76,12 @@ typedef struct { | |
} Key; | |
typedef struct { | |
- unsigned int click; | |
+ unsigned int target; | |
unsigned int mask; | |
guint button; | |
- void (*func)(Client *c, const Arg *arg); | |
+ void (*func)(Client *c, const Arg *a, WebKitHitTestResult *h); | |
const Arg arg; | |
+ unsigned int stopevent; | |
} Button; | |
typedef struct { | |
t@@ -107,7 +108,7 @@ static void beforerequest(WebKitWebView *w, WebKitWebFrame… | |
WebKitNetworkResponse *resp, Client *c); | |
static char *buildfile(const char *path); | |
static char *buildpath(const char *path); | |
-static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c… | |
+static gboolean buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c); | |
static void cleanup(void); | |
static void clipboard(Client *c, const Arg *arg); | |
t@@ -308,27 +309,25 @@ buildpath(const char *path) | |
} | |
gboolean | |
-buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c) | |
+buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c) | |
{ | |
- WebKitHitTestResultContext context; | |
- WebKitHitTestResult *result; | |
- Arg arg; | |
- unsigned int i; | |
- | |
- result = webkit_web_view_get_hit_test_result(web, e); | |
- g_object_get(result, "context", &context, NULL); | |
- g_object_get(result, "link-uri", &arg.v, NULL); | |
- 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; | |
+ WebKitHitTestResultContext element; | |
+ GdkEventButton *eb = (GdkEventButton*)e; | |
+ int i; | |
+ | |
+ element = webkit_hit_test_result_get_context(c->mousepos); | |
+ | |
+ for (i = 0; i < LENGTH(buttons); ++i) { | |
+ if (element & buttons[i].target && | |
+ eb->button == buttons[i].button && | |
+ CLEANMASK(eb->state) == CLEANMASK(buttons[i].mask) && | |
+ buttons[i].func) { | |
+ buttons[i].func(c, &buttons[i].arg, c->mousepos); | |
+ return buttons[i].stopevent; | |
} | |
} | |
- return false; | |
+ | |
+ return FALSE; | |
} | |
void | |
t@@ -1015,7 +1014,7 @@ newview(Client *c, WebKitWebView *rv) | |
G_CALLBACK(progresschanged), c); | |
g_signal_connect(G_OBJECT(v), | |
"button-release-event", | |
- G_CALLBACK(buttonrelease), c); | |
+ G_CALLBACK(buttonreleased), c); | |
g_signal_connect(G_OBJECT(v), | |
"context-menu", | |
G_CALLBACK(contextmenu), c); |