Merge keybinding and mousebinding queues into using the same merged

struct, binding; they were essentially the same accept for what was
'pressed', keysym or button.
This commit is contained in:
okan 2014-01-29 21:13:52 +00:00
parent 4438970b64
commit db0b2fde5c
3 changed files with 38 additions and 43 deletions

View File

@ -94,6 +94,11 @@ union arg {
int i; int i;
}; };
union press {
KeySym keysym;
unsigned int button;
};
enum cursor_font { enum cursor_font {
CF_DEFAULT, CF_DEFAULT,
CF_MOVE, CF_MOVE,
@ -247,26 +252,17 @@ struct screen_ctx {
}; };
TAILQ_HEAD(screen_ctx_q, screen_ctx); TAILQ_HEAD(screen_ctx_q, screen_ctx);
struct keybinding { struct binding {
TAILQ_ENTRY(keybinding) entry; TAILQ_ENTRY(binding) entry;
void (*callback)(struct client_ctx *, union arg *); void (*callback)(struct client_ctx *, union arg *);
union arg argument; union arg argument;
unsigned int modmask; unsigned int modmask;
KeySym keysym; union press press;
int flags; int flags;
int argtype; int argtype;
}; };
TAILQ_HEAD(keybinding_q, keybinding); TAILQ_HEAD(keybinding_q, binding);
TAILQ_HEAD(mousebinding_q, binding);
struct mousebinding {
TAILQ_ENTRY(mousebinding) entry;
void (*callback)(struct client_ctx *, union arg *);
union arg argument;
unsigned int modmask;
unsigned int button;
int flags;
};
TAILQ_HEAD(mousebinding_q, mousebinding);
struct cmd { struct cmd {
TAILQ_ENTRY(cmd) entry; TAILQ_ENTRY(cmd) entry;
@ -290,10 +286,10 @@ TAILQ_HEAD(menu_q, menu);
struct conf { struct conf {
struct keybinding_q keybindingq; struct keybinding_q keybindingq;
struct mousebinding_q mousebindingq;
struct autogroupwin_q autogroupq; struct autogroupwin_q autogroupq;
struct winmatch_q ignoreq; struct winmatch_q ignoreq;
struct cmd_q cmdq; struct cmd_q cmdq;
struct mousebinding_q mousebindingq;
#define CONF_STICKY_GROUPS 0x0001 #define CONF_STICKY_GROUPS 0x0001
int flags; int flags;
#define CONF_BWIDTH 1 #define CONF_BWIDTH 1

45
conf.c
View File

@ -33,8 +33,8 @@
static const char *conf_bind_getmask(const char *, unsigned int *); static const char *conf_bind_getmask(const char *, unsigned int *);
static void conf_cmd_remove(struct conf *, const char *); static void conf_cmd_remove(struct conf *, const char *);
static void conf_unbind_kbd(struct conf *, struct keybinding *); static void conf_unbind_kbd(struct conf *, struct binding *);
static void conf_unbind_mouse(struct conf *, struct mousebinding *); static void conf_unbind_mouse(struct conf *, struct binding *);
int int
conf_cmd_add(struct conf *c, const char *name, const char *path) conf_cmd_add(struct conf *c, const char *name, const char *path)
@ -288,10 +288,9 @@ void
conf_clear(struct conf *c) conf_clear(struct conf *c)
{ {
struct autogroupwin *ag; struct autogroupwin *ag;
struct keybinding *kb; struct binding *kb, *mb;
struct winmatch *wm; struct winmatch *wm;
struct cmd *cmd; struct cmd *cmd;
struct mousebinding *mb;
int i; int i;
while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) { while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) {
@ -491,16 +490,16 @@ conf_bind_getmask(const char *name, unsigned int *mask)
int int
conf_bind_kbd(struct conf *c, const char *bind, const char *cmd) conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
{ {
struct keybinding *kb; struct binding *kb;
const char *key; const char *key;
unsigned int i, mask; unsigned int i, mask;
kb = xcalloc(1, sizeof(*kb)); kb = xcalloc(1, sizeof(*kb));
key = conf_bind_getmask(bind, &mask); key = conf_bind_getmask(bind, &mask);
kb->modmask |= mask; kb->modmask |= mask;
kb->keysym = XStringToKeysym(key); kb->press.keysym = XStringToKeysym(key);
if (kb->keysym == NoSymbol) { if (kb->press.keysym == NoSymbol) {
warnx("unknown symbol: %s", key); warnx("unknown symbol: %s", key);
free(kb); free(kb);
return (0); return (0);
@ -535,15 +534,15 @@ conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
} }
static void static void
conf_unbind_kbd(struct conf *c, struct keybinding *unbind) conf_unbind_kbd(struct conf *c, struct binding *unbind)
{ {
struct keybinding *key = NULL, *keynxt; struct binding *key = NULL, *keynxt;
TAILQ_FOREACH_SAFE(key, &c->keybindingq, entry, keynxt) { TAILQ_FOREACH_SAFE(key, &c->keybindingq, entry, keynxt) {
if (key->modmask != unbind->modmask) if (key->modmask != unbind->modmask)
continue; continue;
if (key->keysym == unbind->keysym) { if (key->press.keysym == unbind->press.keysym) {
TAILQ_REMOVE(&c->keybindingq, key, entry); TAILQ_REMOVE(&c->keybindingq, key, entry);
if (key->argtype & ARG_CHAR) if (key->argtype & ARG_CHAR)
free(key->argument.c); free(key->argument.c);
@ -574,15 +573,15 @@ static const struct {
int int
conf_bind_mouse(struct conf *c, const char *bind, const char *cmd) conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
{ {
struct mousebinding *mb; struct binding *mb;
const char *button, *errstr; const char *button, *errstr;
unsigned int i, mask; unsigned int i, mask;
mb = xcalloc(1, sizeof(*mb)); mb = xcalloc(1, sizeof(*mb));
button = conf_bind_getmask(bind, &mask); button = conf_bind_getmask(bind, &mask);
mb->modmask |= mask; mb->modmask |= mask;
mb->button = strtonum(button, Button1, Button5, &errstr); mb->press.button = strtonum(button, Button1, Button5, &errstr);
if (errstr) { if (errstr) {
warnx("button number is %s: %s", errstr, button); warnx("button number is %s: %s", errstr, button);
free(mb); free(mb);
@ -612,15 +611,15 @@ conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
} }
static void static void
conf_unbind_mouse(struct conf *c, struct mousebinding *unbind) conf_unbind_mouse(struct conf *c, struct binding *unbind)
{ {
struct mousebinding *mb = NULL, *mbnxt; struct binding *mb = NULL, *mbnxt;
TAILQ_FOREACH_SAFE(mb, &c->mousebindingq, entry, mbnxt) { TAILQ_FOREACH_SAFE(mb, &c->mousebindingq, entry, mbnxt) {
if (mb->modmask != unbind->modmask) if (mb->modmask != unbind->modmask)
continue; continue;
if (mb->button == unbind->button) { if (mb->press.button == unbind->press.button) {
TAILQ_REMOVE(&c->mousebindingq, mb, entry); TAILQ_REMOVE(&c->mousebindingq, mb, entry);
free(mb); free(mb);
} }
@ -647,25 +646,25 @@ conf_cursor(struct conf *c)
void void
conf_grab_mouse(Window win) conf_grab_mouse(Window win)
{ {
struct mousebinding *mb; struct binding *mb;
xu_btn_ungrab(win); xu_btn_ungrab(win);
TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
if (mb->flags & CWM_WIN) if (mb->flags & CWM_WIN)
xu_btn_grab(win, mb->modmask, mb->button); xu_btn_grab(win, mb->modmask, mb->press.button);
} }
} }
void void
conf_grab_kbd(Window win) conf_grab_kbd(Window win)
{ {
struct keybinding *kb; struct binding *kb;
xu_key_ungrab(win); xu_key_ungrab(win);
TAILQ_FOREACH(kb, &Conf.keybindingq, entry) TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
xu_key_grab(win, kb->modmask, kb->keysym); xu_key_grab(win, kb->modmask, kb->press.keysym);
} }
static char *cwmhints[] = { static char *cwmhints[] = {

View File

@ -224,12 +224,12 @@ xev_handle_buttonpress(XEvent *ee)
{ {
XButtonEvent *e = &ee->xbutton; XButtonEvent *e = &ee->xbutton;
struct client_ctx *cc, fakecc; struct client_ctx *cc, fakecc;
struct mousebinding *mb; struct binding *mb;
e->state &= ~IGNOREMODMASK; e->state &= ~IGNOREMODMASK;
TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
if (e->button == mb->button && e->state == mb->modmask) if (e->button == mb->press.button && e->state == mb->modmask)
break; break;
} }
@ -263,7 +263,7 @@ xev_handle_keypress(XEvent *ee)
{ {
XKeyEvent *e = &ee->xkey; XKeyEvent *e = &ee->xkey;
struct client_ctx *cc = NULL, fakecc; struct client_ctx *cc = NULL, fakecc;
struct keybinding *kb; struct binding *kb;
KeySym keysym, skeysym; KeySym keysym, skeysym;
unsigned int modshift; unsigned int modshift;
@ -273,7 +273,7 @@ xev_handle_keypress(XEvent *ee)
e->state &= ~IGNOREMODMASK; e->state &= ~IGNOREMODMASK;
TAILQ_FOREACH(kb, &Conf.keybindingq, entry) { TAILQ_FOREACH(kb, &Conf.keybindingq, entry) {
if (keysym != kb->keysym && skeysym == kb->keysym) if (keysym != kb->press.keysym && skeysym == kb->press.keysym)
modshift = ShiftMask; modshift = ShiftMask;
else else
modshift = 0; modshift = 0;
@ -281,7 +281,7 @@ xev_handle_keypress(XEvent *ee)
if ((kb->modmask | modshift) != e->state) if ((kb->modmask | modshift) != e->state)
continue; continue;
if (kb->keysym == (modshift == 0 ? keysym : skeysym)) if (kb->press.keysym == (modshift == 0 ? keysym : skeysym))
break; break;
} }