mirror of
https://github.com/RGBCube/serenity
synced 2025-07-15 03:27:35 +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 ```
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Atomic.h>
|
|
#include <AK/CircularQueue.h>
|
|
#include <AK/NonnullRefPtrVector.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <AK/Time.h>
|
|
#include <AK/Types.h>
|
|
#include <Kernel/API/KeyCode.h>
|
|
#include <Kernel/API/MousePacket.h>
|
|
#include <Kernel/KResult.h>
|
|
#include <Kernel/SpinLock.h>
|
|
#include <Kernel/UnixTypes.h>
|
|
#include <LibKeyboard/CharacterMap.h>
|
|
|
|
namespace Kernel {
|
|
|
|
extern Atomic<bool> g_caps_lock_remapped_to_ctrl;
|
|
|
|
class HIDDevice;
|
|
class I8042Controller;
|
|
class MouseDevice;
|
|
class KeyboardDevice;
|
|
class KeyboardClient;
|
|
class HIDManagement {
|
|
friend class KeyboardDevice;
|
|
friend class MouseDevice;
|
|
AK_MAKE_ETERNAL;
|
|
|
|
public:
|
|
HIDManagement();
|
|
static void initialize();
|
|
static HIDManagement& the();
|
|
|
|
void enumerate();
|
|
|
|
const String& keymap_name() const { return m_character_map.character_map_name(); }
|
|
const Keyboard::CharacterMapData& character_maps() const { return m_character_map.character_map_data(); }
|
|
const Keyboard::CharacterMap& character_map() const { return m_character_map; }
|
|
void set_client(KeyboardClient* client) { m_client = client; }
|
|
void set_maps(const Keyboard::CharacterMapData& character_map, const String& character_map_name);
|
|
|
|
private:
|
|
size_t generate_minor_device_number_for_mouse();
|
|
size_t generate_minor_device_number_for_keyboard();
|
|
|
|
size_t m_mouse_minor_number { 0 };
|
|
size_t m_keyboard_minor_number { 0 };
|
|
Keyboard::CharacterMap m_character_map;
|
|
KeyboardClient* m_client { nullptr };
|
|
RefPtr<I8042Controller> m_i8042_controller;
|
|
NonnullRefPtrVector<HIDDevice> m_hid_devices;
|
|
};
|
|
|
|
class KeyboardClient {
|
|
public:
|
|
virtual ~KeyboardClient();
|
|
virtual void on_key_pressed(KeyEvent) = 0;
|
|
};
|
|
|
|
}
|