--- src/daemon/input_linux.c | 21 ++++++++++++++------- src/gui/mainwindow.cpp | 14 ++++++++------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/daemon/input_linux.c b/src/daemon/input_linux.c index 0391243e..8489f5b5 100644 --- a/src/daemon/input_linux.c +++ b/src/daemon/input_linux.c @@ -55,13 +55,20 @@ int uinputopen(struct uinput_user_dev* indev, int mouse){ /// /// Some tips on using [uinput_user_dev in](http://thiemonge.org/getting-started-with-uinput) int os_inputopen(usbdevice* kb){ - /// First check whether the uinput module is loaded by the kernel. - /// - // Load the uinput module (if it's not loaded already) - if(system("modprobe uinput") != 0) { - ckb_fatal("Failed to load uinput module\n"); - return 1; + /// Let's see if uinput is already available + int fd = open("/dev/uinput", O_RDWR); + if(fd < 0){ + fd = open("/dev/input/uinput", O_RDWR); + } + + // If not available, load the module + if(fd < 0){ + if(system("modprobe uinput") != 0) { + ckb_fatal("Failed to load uinput module\n"); + return 1; + } } + close(fd); if(IS_SINGLE_EP(kb)) { kb->uinput_kb = 0; @@ -79,7 +86,7 @@ int os_inputopen(usbdevice* kb){ indev.id.product = kb->product; indev.id.version = kb->fwversion; // Open keyboard - int fd = uinputopen(&indev, 0); + fd = uinputopen(&indev, 0); kb->uinput_kb = fd; if(fd <= 0) return 0; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 968764e7..1eb95bda 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -282,14 +282,16 @@ void MainWindow::updateVersion(){ if(kextstatOut.isEmpty()) daemonWarning.append(tr("
Warning: System Extension by \"Fumihiko Takayama\" is not allowed in Security & Privacy. Please allow it and then unplug and replug your devices.")); #elif defined(Q_OS_LINUX) - QProcess modprobe; - modprobe.start("modprobe", QStringList("uinput")); + if(!(QFileInfo("/dev/uinput").exists() || QFileInfo("/dev/input/uinput").exists())){ + QProcess modprobe; + modprobe.start("modprobe", QStringList("uinput")); - if(!modprobe.waitForFinished()) - qDebug() << "Modprobe error"; + if(!modprobe.waitForFinished()) + qDebug() << "Modprobe error"; - if(modprobe.exitCode()) - daemonWarning.append(tr("
Warning: The uinput module could not be loaded. If this issue persists after rebooting, compile a kernel with CONFIG_INPUT_UINPUT=y.")); + if(modprobe.exitCode()) + daemonWarning.append(tr("
Warning: The uinput module could not be loaded. If this issue persists after rebooting, compile a kernel with CONFIG_INPUT_UINPUT=y.")); + } #endif settingsWidget->setStatus(tr("No devices connected") + daemonWarning); }