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:
parent
28654d372c
commit
fb1d34f919
@ -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 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user