From 385e2ccb66b13990587a88cd15e7663117d414c5 Mon Sep 17 00:00:00 2001 From: Edwin Hoksberg Date: Mon, 5 Jul 2021 21:14:38 +0200 Subject: [PATCH] Kernel: Add keyboard ioctl to get num/caps lock state --- Kernel/Devices/HID/KeyboardDevice.cpp | 34 +++++++++++++++++++++ Kernel/Devices/HID/KeyboardDevice.h | 4 +++ Userland/Libraries/LibC/sys/ioctl_numbers.h | 9 ++++++ 3 files changed, 47 insertions(+) diff --git a/Kernel/Devices/HID/KeyboardDevice.cpp b/Kernel/Devices/HID/KeyboardDevice.cpp index f7f04b05f4..f59fb5e741 100644 --- a/Kernel/Devices/HID/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/KeyboardDevice.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2021, Liav A. + * Copyright (c) 2021, Edwin Hoksberg * * SPDX-License-Identifier: BSD-2-Clause */ @@ -15,6 +16,7 @@ #include #include #include +#include namespace Kernel { @@ -314,4 +316,36 @@ KResultOr KeyboardDevice::write(FileDescription&, u64, const UserOrKerne return 0; } +int KeyboardDevice::ioctl(FileDescription&, unsigned request, FlatPtr arg) +{ + switch (request) { + case KEYBOARD_IOCTL_GET_NUM_LOCK: { + auto* output = (bool*)arg; + if (!copy_to_user(output, &m_num_lock_on)) + return -EFAULT; + return 0; + } + case KEYBOARD_IOCTL_SET_NUM_LOCK: { + if (arg != 0 && arg != 1) + return -EINVAL; + m_num_lock_on = arg; + return 0; + } + case KEYBOARD_IOCTL_GET_CAPS_LOCK: { + auto* output = (bool*)arg; + if (!copy_to_user(output, &m_caps_lock_on)) + return -EFAULT; + return 0; + } + case KEYBOARD_IOCTL_SET_CAPS_LOCK: { + if (arg != 0 && arg != 1) + return -EINVAL; + m_caps_lock_on = arg; + return 0; + } + default: + return -EINVAL; + }; +} + } diff --git a/Kernel/Devices/HID/KeyboardDevice.h b/Kernel/Devices/HID/KeyboardDevice.h index 15faa7db91..ea6057978c 100644 --- a/Kernel/Devices/HID/KeyboardDevice.h +++ b/Kernel/Devices/HID/KeyboardDevice.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, Liav A. + * Copyright (c) 2021, Edwin Hoksberg * * SPDX-License-Identifier: BSD-2-Clause */ @@ -35,6 +36,9 @@ public: // ^Device virtual mode_t required_mode() const override { return 0440; } + // ^File + virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; + virtual String device_name() const override { return String::formatted("keyboard{}", minor()); } void update_modifier(u8 modifier, bool state) diff --git a/Userland/Libraries/LibC/sys/ioctl_numbers.h b/Userland/Libraries/LibC/sys/ioctl_numbers.h index 62f0b2010e..234a5decd2 100644 --- a/Userland/Libraries/LibC/sys/ioctl_numbers.h +++ b/Userland/Libraries/LibC/sys/ioctl_numbers.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Edwin Hoksberg * * SPDX-License-Identifier: BSD-2-Clause */ @@ -63,6 +64,10 @@ enum IOCtlNumber { FB_IOCTL_GET_BUFFER_OFFSET, FB_IOCTL_SET_BUFFER, FB_IOCTL_FLUSH_BUFFERS, + KEYBOARD_IOCTL_GET_NUM_LOCK, + KEYBOARD_IOCTL_SET_NUM_LOCK, + KEYBOARD_IOCTL_GET_CAPS_LOCK, + KEYBOARD_IOCTL_SET_CAPS_LOCK, SIOCSIFADDR, SIOCGIFADDR, SIOCGIFHWADDR, @@ -97,6 +102,10 @@ enum IOCtlNumber { #define FB_IOCTL_GET_BUFFER_OFFSET FB_IOCTL_GET_BUFFER_OFFSET #define FB_IOCTL_SET_BUFFER FB_IOCTL_SET_BUFFER #define FB_IOCTL_FLUSH_BUFFERS FB_IOCTL_FLUSH_BUFFERS +#define KEYBOARD_IOCTL_GET_NUM_LOCK KEYBOARD_IOCTL_GET_NUM_LOCK +#define KEYBOARD_IOCTL_SET_NUM_LOCK KEYBOARD_IOCTL_SET_NUM_LOCK +#define KEYBOARD_IOCTL_GET_CAPS_LOCK KEYBOARD_IOCTL_GET_CAPS_LOCK +#define KEYBOARD_IOCTL_SET_CAPS_LOCK KEYBOARD_IOCTL_SET_CAPS_LOCK #define SIOCSIFADDR SIOCSIFADDR #define SIOCGIFADDR SIOCGIFADDR #define SIOCGIFHWADDR SIOCGIFHWADDR