static int prepareUinputInstance (UinputObject *uinput, int keyboard) { { int type = EV_KEY; BITMASK(mask, KEY_MAX+1, char); int size = ioctl(keyboard, EVIOCGBIT(type, sizeof(mask)), mask); if (size == -1) { logSystemError("ioctl[EVIOCGBIT]"); return 0; } { int count = size * 8; { int key = KEY_ENTER; if (key >= count) return 0; if (!BITMASK_TEST(mask, key)) return 0; } if (!enableUinputEventType(uinput, type)) return 0; for (int key=0; key<count; key+=1) { if (BITMASK_TEST(mask, key)) { if (!enableUinputKey(uinput, key)) { return 0; } } } } } if (!enableUinputEventType(uinput, EV_REP)) return 0; if (!createUinputDevice(uinput)) return 0; { int properties[2]; if (ioctl(keyboard, EVIOCGREP, properties) != -1) { if (!writeRepeatDelay(uinput, properties[0])) return 0; if (!writeRepeatPeriod(uinput, properties[1])) return 0; } } { BITMASK(mask, KEY_MAX+1, char); int size = ioctl(keyboard, EVIOCGKEY(sizeof(mask)), mask); if (size != -1) { int count = size * 8; for (int key=0; key<count; key+=1) { if (BITMASK_TEST(mask, key)) { logMessage(LOG_WARNING, "key already pressed: %d", key); } } } } return 1; }
static int prepareUinputObject (UinputObject *uinput) { if (!enableUinputEventType(uinput, EV_SND)) return 0; if (!enableUinputSound(uinput, SND_BELL)) return 0; return 1; }