1
0
mirror of https://github.com/ericonr/sndio.git synced 2024-02-18 04:45:21 -06:00

handle keyboard remappings

This commit is contained in:
Alexandre Ratchov 2014-02-04 13:03:59 +01:00
parent 28654d372c
commit fb1d34f919

View File

@ -49,6 +49,13 @@ unsigned char dumpreq[] = {
SYSEX_END SYSEX_END
}; };
/*
* X bits
*/
Display *dpy;
KeyCode inc_code, dec_code;
KeySym *inc_map, *dec_map;
void void
midi_setvol(int vol) midi_setvol(int vol)
{ {
@ -85,12 +92,6 @@ midi_sysex(unsigned char *msg, unsigned len)
{ {
int i; int i;
if (verbose >= 2) {
fprintf(stderr, "sysex: ");
for (i = 0; i < len; i++)
fprintf(stderr, " %02x", msg[i]);
fprintf(stderr, "\n");
}
if (len == 8 && if (len == 8 &&
msg[1] == SYSEX_TYPE_RT && msg[1] == SYSEX_TYPE_RT &&
msg[3] == SYSEX_CONTROL && msg[3] == SYSEX_CONTROL &&
@ -131,6 +132,60 @@ midi_parse(unsigned char *mbuf, unsigned len)
} }
} }
void
grab_keys(void)
{
unsigned int i, scr, nscr;
int nret;
if (verbose)
fprintf(stderr, "grabbing keys\n");
inc_code = XKeysymToKeycode(dpy, KEY_INC);
inc_map = XGetKeyboardMapping(dpy, inc_code, 1, &nret);
if (nret <= ShiftMask) {
fprintf(stderr, "Couldn't get keymap for '+' key\n");
exit(1);
}
dec_code = XKeysymToKeycode(dpy, KEY_DEC);
dec_map = XGetKeyboardMapping(dpy, dec_code, 1, &nret);
if (nret <= ShiftMask) {
fprintf(stderr, "Couldn't get keymap for '-' key\n");
exit(1);
}
nscr = ScreenCount(dpy);
for (i = 0; i <= 0xff; i++) {
if ((i & MODMASK) != 0)
continue;
for (scr = 0; scr != nscr; scr++) {
XGrabKey(dpy, inc_code, i | MODMASK,
RootWindow(dpy, scr), 1,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, dec_code, i | MODMASK,
RootWindow(dpy, scr), 1,
GrabModeAsync, GrabModeAsync);
}
}
}
void
ungrab_keys(void)
{
unsigned int scr, nscr;
if (verbose)
fprintf(stderr, "ungrabbing keys\n");
XFree(inc_map);
XFree(dec_map);
nscr = ScreenCount(dpy);
for (scr = 0; scr != nscr; scr++)
XUngrabKey(dpy, AnyKey, AnyModifier, RootWindow(dpy, scr));
}
void void
usage(void) usage(void)
{ {
@ -145,12 +200,9 @@ main(int argc, char **argv)
unsigned char msg[MIDIBUFSZ]; unsigned char msg[MIDIBUFSZ];
char *devname; char *devname;
struct pollfd *pfds; struct pollfd *pfds;
unsigned int i, scr, nscr; unsigned int i, scr;
Display *dpy;
KeyCode inc_code, dec_code;
KeySym *inc_map, *dec_map;
XEvent xev; XEvent xev;
int c, nfds, n, nret; int c, nfds, n;
int background; int background;
/* /*
@ -191,36 +243,8 @@ main(int argc, char **argv)
exit(1); exit(1);
} }
inc_code = XKeysymToKeycode(dpy, KEY_INC);
inc_map = XGetKeyboardMapping(dpy, inc_code, 1, &nret);
if (nret <= ShiftMask) {
fprintf(stderr, "Couldn't get keymap for '+' key\n");
exit(1);
}
dec_code = XKeysymToKeycode(dpy, KEY_DEC);
dec_map = XGetKeyboardMapping(dpy, dec_code, 1, &nret);
if (nret <= ShiftMask) {
fprintf(stderr, "Couldn't get keymap for '-' key\n");
exit(1);
}
nscr = ScreenCount(dpy);
for (i = 0; i <= 0xff; i++) {
if ((i & MODMASK) != 0)
continue;
for (scr = 0; scr != nscr; scr++) {
XGrabKey(dpy, inc_code, i | MODMASK,
RootWindow(dpy, scr), 1,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, dec_code, i | MODMASK,
RootWindow(dpy, scr), 1,
GrabModeAsync, GrabModeAsync);
}
}
/* mask non-key events for each screan */ /* mask non-key events for each screan */
for (scr = 0; scr != nscr; scr++) for (scr = 0; scr != ScreenCount(dpy); scr++)
XSelectInput(dpy, RootWindow(dpy, scr), KeyPress); XSelectInput(dpy, RootWindow(dpy, scr), KeyPress);
/* /*
@ -231,6 +255,8 @@ main(int argc, char **argv)
exit(1); exit(1);
} }
grab_keys();
pfds = malloc(sizeof(struct pollfd) * (mio_nfds(hdl) + 1)); pfds = malloc(sizeof(struct pollfd) * (mio_nfds(hdl) + 1));
if (pfds == NULL) { if (pfds == NULL) {
fprintf(stderr, "Failed to allocate pollfd structures\n"); fprintf(stderr, "Failed to allocate pollfd structures\n");
@ -248,6 +274,14 @@ main(int argc, char **argv)
while (1) { while (1) {
while (XPending(dpy)) { while (XPending(dpy)) {
XNextEvent(dpy, &xev); XNextEvent(dpy, &xev);
if (xev.type == MappingNotify) {
if (xev.xmapping.request != MappingKeyboard)
continue;
if (verbose)
fprintf(stderr, "keyboard remapped\n");
ungrab_keys();
grab_keys();
}
if (xev.type != KeyPress) if (xev.type != KeyPress)
continue; continue;
if (xev.xkey.keycode == inc_code && if (xev.xkey.keycode == inc_code &&