aboutsummaryrefslogtreecommitdiff
path: root/shotkey.c
diff options
context:
space:
mode:
Diffstat (limited to 'shotkey.c')
-rw-r--r--shotkey.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/shotkey.c b/shotkey.c
index 20d507b..a9c2da2 100644
--- a/shotkey.c
+++ b/shotkey.c
@@ -16,6 +16,12 @@ typedef struct Key {
Command command;
} Key;
+typedef struct Button {
+ unsigned int mod;
+ unsigned int button;
+ Command command;
+} Button;
+
typedef struct ModeProperties {
char* label;
} ModeProperties;
@@ -28,7 +34,7 @@ typedef struct ModeProperties {
#include "config.h"
#define LENGTH(X) (sizeof X / sizeof X[0])
-#define CLEANMASK(mask) (mask & ~LockMask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
+#define CLEANMASK(mask) (mask & ~LockMask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask|Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask))
int current_mode = NormalMode;
int is_mode_persistent = 0;
@@ -44,7 +50,7 @@ void unbind_key(Display *dpy, Window win, unsigned int mod, KeySym key) {
XUngrabKey(dpy, keycode, mod, win);
}
-void bind_mouse_button(Display *dpy, Window win, unsigned int mod, KeySym button) {
+void bind_mouse_button(Display *dpy, Window win, unsigned int mod, unsigned int button) {
XGrabButton(dpy, button, mod, win, False, ButtonPress, GrabModeSync, GrabModeAsync, None, None);
}
@@ -158,15 +164,23 @@ void keypress(Display *dpy, Window win, XKeyEvent *ev) {
void buttonpress(Display* dpy, Window win, XButtonEvent* ev) {
printf("Muse click\n");
+ int i;
+ short int should_forward_event = False;
+
+ for (i = 0; i < LENGTH(buttons); i++) {
+ if (buttons[i].button == ev->button && CLEANMASK(buttons[i].mod) == CLEANMASK(ev->state)) {
+ run(dpy, win, buttons[i].command);
+ }
+ }
// Replay event
- XAllowEvents(dpy, ReplayPointer, CurrentTime);
+ XAllowEvents(dpy, should_forward_event ? ReplayPointer : SyncPointer, CurrentTime);
}
int main() {
XSetErrorHandler(error_handler);
- int running = 1, i = 0;
+ int running = True, i = 0;
Display *dpy = XOpenDisplay(0);
Window root = DefaultRootWindow(dpy);
@@ -176,7 +190,10 @@ int main() {
bind_key(dpy, root, keys[i].mod, keys[i].key);
}
- bind_mouse_button(dpy, root, 0, Button1);
+ // Grab mouse buttons
+ for (i = 0; i < LENGTH(buttons); i++) {
+ bind_mouse_button(dpy, root, buttons[i].mod, buttons[i].button);
+ }
long int event_mask = KeyPressMask | ButtonPressMask;
XSelectInput(dpy, root, event_mask);