mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-13 06:32:54 +00:00
We use a global setting to determine if Caps Lock should be remapped to Control because we don't care how keyboard events come in, just that they should be massaged into different scan codes. The `proc` filesystem is able to manipulate this global variable using the `sysctl` utility like so: ``` # sysctl caps_lock_to_ctrl=1 ```
64 lines
1.8 KiB
C++
64 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/CircularQueue.h>
|
|
#include <AK/DoublyLinkedList.h>
|
|
#include <AK/Types.h>
|
|
#include <Kernel/API/KeyCode.h>
|
|
#include <Kernel/Devices/CharacterDevice.h>
|
|
#include <Kernel/Devices/HID/HIDDevice.h>
|
|
#include <Kernel/Interrupts/IRQHandler.h>
|
|
#include <Kernel/Random.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class KeyboardDevice : public HIDDevice {
|
|
public:
|
|
using Event = KeyEvent;
|
|
|
|
virtual ~KeyboardDevice() override;
|
|
|
|
// ^CharacterDevice
|
|
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
|
virtual bool can_read(const FileDescription&, size_t) const override;
|
|
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
|
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
|
|
|
// ^HIDDevice
|
|
virtual Type instrument_type() const { return Type::Keyboard; }
|
|
|
|
// ^Device
|
|
virtual mode_t required_mode() const override { return 0440; }
|
|
|
|
virtual String device_name() const override { return String::formatted("keyboard{}", minor()); }
|
|
|
|
void update_modifier(u8 modifier, bool state)
|
|
{
|
|
if (state)
|
|
m_modifiers |= modifier;
|
|
else
|
|
m_modifiers &= ~modifier;
|
|
}
|
|
|
|
protected:
|
|
KeyboardDevice();
|
|
mutable SpinLock<u8> m_queue_lock;
|
|
CircularQueue<Event, 16> m_queue;
|
|
// ^CharacterDevice
|
|
virtual const char* class_name() const override { return "KeyboardDevice"; }
|
|
|
|
u8 m_modifiers { 0 };
|
|
bool m_caps_lock_to_ctrl_pressed { false };
|
|
bool m_caps_lock_on { false };
|
|
bool m_num_lock_on { false };
|
|
bool m_has_e0_prefix { false };
|
|
bool m_both_shift_keys_pressed { false };
|
|
|
|
void key_state_changed(u8 raw, bool pressed);
|
|
};
|
|
}
|