2023-05-14 00:21:16 +02:00
|
|
|
/* See LICENSE file for copyright and license details. */
|
|
|
|
|
2023-05-06 14:36:50 +02:00
|
|
|
void updatenumlockmask(void) {
|
2023-05-08 23:00:45 +02:00
|
|
|
unsigned int i, j;
|
|
|
|
XModifierKeymap *modmap;
|
2023-03-08 17:20:32 +01:00
|
|
|
|
2023-05-08 23:00:45 +02:00
|
|
|
numlockmask = 0;
|
|
|
|
modmap = XGetModifierMapping(dpy);
|
|
|
|
for (i = 0; i < 8; i++)
|
|
|
|
for (j = 0; j < modmap->max_keypermod; j++)
|
|
|
|
if (modmap->modifiermap[i * modmap->max_keypermod + j]
|
|
|
|
== XKeysymToKeycode(dpy, XK_Num_Lock))
|
|
|
|
numlockmask = (1 << i);
|
|
|
|
XFreeModifiermap(modmap);
|
2023-03-08 17:20:32 +01:00
|
|
|
}
|
|
|
|
|
2023-06-02 18:37:51 +02:00
|
|
|
void keypress_x11(XEvent *e) {
|
2023-05-08 23:00:45 +02:00
|
|
|
updatenumlockmask();
|
2023-03-08 17:20:32 +01:00
|
|
|
{
|
|
|
|
unsigned int i;
|
2023-06-08 22:42:25 +02:00
|
|
|
KeySym keysym = NoSymbol;
|
|
|
|
KeySym keysym_case = NoSymbol;
|
2023-03-08 17:20:32 +01:00
|
|
|
XKeyEvent *ev;
|
|
|
|
char buf[64];
|
|
|
|
KeySym ksym = NoSymbol;
|
|
|
|
Status status;
|
|
|
|
|
|
|
|
int len = 0;
|
|
|
|
ev = &e->xkey;
|
|
|
|
len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
|
|
|
|
|
2023-06-08 22:42:25 +02:00
|
|
|
// keysym = XkbKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0, 0);
|
|
|
|
XConvertCase(ksym, &keysym, &keysym_case);
|
2023-03-08 17:20:32 +01:00
|
|
|
|
2023-05-15 09:53:34 +02:00
|
|
|
// this makes sure we always have a way to exit if we unbind our quit key
|
|
|
|
if (keysym == hkeys[0].keysym && CLEANMASK(hkeys[0].mod) == CLEANMASK(ev->state) && hkeys[0].func) hkeys[0].func(&(hkeys[0].arg));
|
|
|
|
|
2023-03-08 17:20:32 +01:00
|
|
|
for (i = 0; i < LENGTH(keys); i++) {
|
2023-04-25 09:56:11 +02:00
|
|
|
if (ignoreglobalkeys) break;
|
2023-03-08 17:20:32 +01:00
|
|
|
if (keysym == keys[i].keysym && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) && keys[i].func) {
|
|
|
|
if ((keys[i].mode && curMode) || keys[i].mode == -1) {
|
|
|
|
keys[i].func(&(keys[i].arg));
|
|
|
|
return;
|
|
|
|
} else if (!keys[i].mode && !curMode) {
|
|
|
|
keys[i].func(&(keys[i].arg));
|
|
|
|
} else {
|
|
|
|
continue;
|
2023-04-25 09:56:11 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < LENGTH(ckeys); i++) {
|
|
|
|
if (ignoreconfkeys) break;
|
|
|
|
if (keysym == ckeys[i].keysym && CLEANMASK(ckeys[i].mod) == CLEANMASK(ev->state) && ckeys[i].func) {
|
|
|
|
if ((ckeys[i].mode && curMode) || ckeys[i].mode == -1) {
|
|
|
|
ckeys[i].func(&(ckeys[i].arg));
|
|
|
|
return;
|
|
|
|
} else if (!ckeys[i].mode && !curMode) {
|
|
|
|
ckeys[i].func(&(ckeys[i].arg));
|
|
|
|
} else {
|
|
|
|
continue;
|
2023-03-08 17:20:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!iscntrl(*buf) && type && curMode ) {
|
|
|
|
if (allowkeys) {
|
|
|
|
insert(buf, len);
|
|
|
|
} else {
|
|
|
|
allowkeys = !allowkeys;
|
|
|
|
}
|
|
|
|
|
|
|
|
drawmenu();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-03-13 21:21:40 +01:00
|
|
|
|
2023-06-02 18:37:51 +02:00
|
|
|
void grabkeyboard_x11(void) {
|
2023-05-08 23:00:45 +02:00
|
|
|
struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 };
|
|
|
|
int i;
|
2023-03-13 21:21:40 +01:00
|
|
|
|
2023-03-16 16:54:36 +01:00
|
|
|
// don't grab if embedded
|
2023-05-08 23:00:45 +02:00
|
|
|
if (embed || managed)
|
|
|
|
return;
|
|
|
|
// try to grab keyboard, we may have to wait for another process to ungrab
|
|
|
|
for (i = 0; i < 1000; i++) {
|
|
|
|
if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync,
|
|
|
|
GrabModeAsync, CurrentTime) == GrabSuccess) {
|
2023-04-20 21:22:45 +02:00
|
|
|
getcapsstate();
|
2023-05-08 23:00:45 +02:00
|
|
|
return;
|
2023-04-20 21:22:45 +02:00
|
|
|
}
|
2023-05-08 23:00:45 +02:00
|
|
|
nanosleep(&ts, NULL);
|
|
|
|
}
|
|
|
|
die("cannot grab keyboard");
|
2023-03-13 21:21:40 +01:00
|
|
|
}
|
2023-04-20 21:22:45 +02:00
|
|
|
|
2023-05-06 14:36:50 +02:00
|
|
|
void getcapsstate(void) {
|
2023-04-20 21:22:45 +02:00
|
|
|
unsigned int cs = 0;
|
|
|
|
|
|
|
|
XkbGetIndicatorState(dpy, XkbUseCoreKbd, &cs);
|
|
|
|
capslockstate = (cs & 0x01) == 1;
|
|
|
|
|
|
|
|
strncpy(capstext, capslockstate ? capslockontext : capslockofftext, 15);
|
|
|
|
}
|