void QEvdevKeyboardHandler::readKeycode() { struct ::input_event buffer[32]; int n = 0; forever { int result = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n); if (result == 0) { qWarning("evdevkeyboard: Got EOF from the input device"); return; } else if (result < 0) { if (errno != EINTR && errno != EAGAIN) { qErrnoWarning(errno, "evdevkeyboard: Could not read from input device"); return; } } else { n += result; if (n % sizeof(buffer[0]) == 0) break; } } n /= sizeof(buffer[0]); for (int i = 0; i < n; ++i) { if (buffer[i].type != EV_KEY) continue; quint16 code = buffer[i].code; qint32 value = buffer[i].value; QEvdevKeyboardHandler::KeycodeAction ka; ka = processKeycode(code, value != 0, value == 2); switch (ka) { case QEvdevKeyboardHandler::CapsLockOn: case QEvdevKeyboardHandler::CapsLockOff: switchLed(LED_CAPSL, ka == QEvdevKeyboardHandler::CapsLockOn); break; case QEvdevKeyboardHandler::NumLockOn: case QEvdevKeyboardHandler::NumLockOff: switchLed(LED_NUML, ka == QEvdevKeyboardHandler::NumLockOn); break; case QEvdevKeyboardHandler::ScrollLockOn: case QEvdevKeyboardHandler::ScrollLockOff: switchLed(LED_SCROLLL, ka == QEvdevKeyboardHandler::ScrollLockOn); break; default: // ignore console switching and reboot break; } } }
void QEvdevKeyboardHandler::unloadKeymap() { qCDebug(qLcEvdevKey) << "Unload current keymap and restore built-in"; if (m_keymap && m_keymap != s_keymap_default) delete [] m_keymap; if (m_keycompose && m_keycompose != s_keycompose_default) delete [] m_keycompose; m_keymap = s_keymap_default; m_keymap_size = sizeof(s_keymap_default) / sizeof(s_keymap_default[0]); m_keycompose = s_keycompose_default; m_keycompose_size = sizeof(s_keycompose_default) / sizeof(s_keycompose_default[0]); // reset state, so we could switch keymaps at runtime m_modifiers = 0; memset(m_locks, 0, sizeof(m_locks)); m_composing = 0; m_dead_unicode = 0xffff; //Set locks according to keyboard leds quint16 ledbits[1]; memset(ledbits, 0, sizeof(ledbits)); if (::ioctl(m_fd, EVIOCGLED(sizeof(ledbits)), ledbits) < 0) { qWarning("evdevkeyboard: Failed to query led states"); switchLed(LED_NUML,false); switchLed(LED_CAPSL, false); switchLed(LED_SCROLLL,false); } else { //Capslock if ((ledbits[0]&0x02) > 0) m_locks[0] = 1; //Numlock if ((ledbits[0]&0x01) > 0) m_locks[1] = 1; //Scrollock if ((ledbits[0]&0x04) > 0) m_locks[2] = 1; qCDebug(qLcEvdevKey, "numlock=%d , capslock=%d, scrolllock=%d", m_locks[1], m_locks[0], m_locks[2]); } }
void runPWMInternal(LedId led) { if (currentCount[led] >= LED_ON_FREQ) { currentCount[led] = LED_OFF_FREQ; } else { currentCount[led]++; } if (fade && currentCount[led] == LED_OFF_FREQ) { fadeCounter[led]++; fadeCounter[led] %= FADE_COUNTER_FREQ; if (ledStatus[led] && currentTrigger[led] < LED_ON_FREQ) { if (fadeCounter[led] == 0) { currentTrigger[led]++; } } else if (!ledStatus[led] && currentTrigger[led] > LED_OFF_FREQ) { if (fadeCounter[led] == 0) { currentTrigger[led]--; } } } switchLed(led, currentCount[led] < currentTrigger[led]); }
void QEvdevKeyboardHandler::readKeycode() { struct ::input_event buffer[32]; int n = 0; forever { int result = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n); if (result == 0) { qWarning("evdevkeyboard: Got EOF from the input device"); return; } else if (result < 0) { if (errno != EINTR && errno != EAGAIN) { qErrnoWarning(errno, "evdevkeyboard: Could not read from input device"); // If the device got disconnected, stop reading, otherwise we get flooded // by the above error over and over again. if (errno == ENODEV) { delete m_notify; m_notify = Q_NULLPTR; qt_safe_close(m_fd); m_fd = -1; } return; } } else { n += result; if (n % sizeof(buffer[0]) == 0) break; } } n /= sizeof(buffer[0]); for (int i = 0; i < n; ++i) { if (buffer[i].type != EV_KEY) continue; quint16 code = buffer[i].code; qint32 value = buffer[i].value; QEvdevKeyboardHandler::KeycodeAction ka; ka = processKeycode(code, value != 0, value == 2); switch (ka) { case QEvdevKeyboardHandler::CapsLockOn: case QEvdevKeyboardHandler::CapsLockOff: switchLed(LED_CAPSL, ka == QEvdevKeyboardHandler::CapsLockOn); break; case QEvdevKeyboardHandler::NumLockOn: case QEvdevKeyboardHandler::NumLockOff: switchLed(LED_NUML, ka == QEvdevKeyboardHandler::NumLockOn); break; case QEvdevKeyboardHandler::ScrollLockOn: case QEvdevKeyboardHandler::ScrollLockOff: switchLed(LED_SCROLLL, ka == QEvdevKeyboardHandler::ScrollLockOn); break; default: // ignore console switching and reboot break; } } }