Kernel: KeyEvent is now well known keycode
Keycodes are easier to handle as you need only one keyboard layout for keycodes. Otherwise you would need to implement keyboard layout for every keyboard driver in every language.
This commit is contained in:
		
							parent
							
								
									e4f48cbc73
								
							
						
					
					
						commit
						961ab9768a
					
				|  | @ -32,6 +32,8 @@ set(KERNEL_SOURCES | |||
| 	kernel/FS/TmpFS/FileSystem.cpp | ||||
| 	kernel/FS/TmpFS/Inode.cpp | ||||
| 	kernel/FS/VirtualFileSystem.cpp | ||||
| 	kernel/Input/KeyboardLayouts/FI.cpp | ||||
| 	kernel/Input/KeyEvent.cpp | ||||
| 	kernel/Input/PS2/Controller.cpp | ||||
| 	kernel/Input/PS2/Device.cpp | ||||
| 	kernel/Input/PS2/Keyboard.cpp | ||||
|  |  | |||
|  | @ -5,6 +5,47 @@ | |||
| namespace Kernel::Input | ||||
| { | ||||
| 
 | ||||
| 	/*
 | ||||
| 		Key Code: | ||||
| 			bits 4:0 column (from left) | ||||
| 			bits 7:5 row    (from top) | ||||
| 	*/ | ||||
| 
 | ||||
| 	#define BANAN_CONSTEVAL_STATIC_ASSERT(cond) do { int dummy = 1 / (cond); } while (false) | ||||
| 
 | ||||
| 	consteval uint8_t keycode_function(uint8_t index) | ||||
| 	{ | ||||
| 		BANAN_CONSTEVAL_STATIC_ASSERT(index <= 0b11111); | ||||
| 		return index; | ||||
| 	} | ||||
| 
 | ||||
| 	consteval uint8_t keycode_normal(uint8_t row, uint8_t col) | ||||
| 	{ | ||||
| 		BANAN_CONSTEVAL_STATIC_ASSERT(row <= 0b111 - 1); | ||||
| 		BANAN_CONSTEVAL_STATIC_ASSERT(col < 0b11111 - 8); | ||||
| 		return ((row + 1) << 5) | col; | ||||
| 	} | ||||
| 
 | ||||
| 	consteval uint8_t keycode_numpad(uint8_t row, uint8_t col) | ||||
| 	{ | ||||
| 		BANAN_CONSTEVAL_STATIC_ASSERT(row <= 0b111 - 1); | ||||
| 		BANAN_CONSTEVAL_STATIC_ASSERT(col <= 8); | ||||
| 		return ((row + 1) << 5) | (col + 0b11111 - 8); | ||||
| 	} | ||||
| 
 | ||||
| 	enum ModifierKeycode | ||||
| 	{ | ||||
| 		CapsLock	= keycode_normal(2, 0), | ||||
| 		NumLock		= keycode_numpad(0, 0), | ||||
| 		ScrollLock	= keycode_function(20), | ||||
| 		LShift		= keycode_normal(3, 0), | ||||
| 		RShift		= keycode_normal(3, 12), | ||||
| 		LCtrl		= keycode_normal(4, 0), | ||||
| 		RCtrl		= keycode_normal(4, 5), | ||||
| 		LAlt		= keycode_normal(4, 2), | ||||
| 		RAlt		= keycode_normal(4, 4), | ||||
| 	}; | ||||
| 
 | ||||
| 	enum class Key | ||||
| 	{ | ||||
| 		Invalid, None, | ||||
|  | @ -14,9 +55,9 @@ namespace Kernel::Input | |||
| 		F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, | ||||
| 		Insert, PrintScreen, Delete, Home, End, PageUp, PageDown, Enter, Space, | ||||
| 		ExclamationMark, DoubleQuote, Hashtag, Currency, Percent, Ampersand, Slash, Section, Half, | ||||
| 		OpenBracet, CloseBracet, OpenBrace, CloseBrace, OpenCurlyBrace, CloseCurlyBrace, | ||||
| 		Equals, QuestionMark, Plus, BackSlash, Acute, BackTick, TwoDots, Backspace, AtSign, Pound, Dollar, Euro, | ||||
| 		Escape, Tab, CapsLock, LeftShift, LeftCtrl, Super, Alt, AltGr, RightCtrl, RightShift, | ||||
| 		OpenParenthesis, CloseParenthesis, OpenSquareBracket, CloseSquareBracket, OpenCurlyBracket, CloseCurlyBracket, | ||||
| 		Equals, QuestionMark, Plus, BackSlash, Acute, BackTick, TwoDots, Cedilla, Backspace, AtSign, Pound, Dollar, Euro, | ||||
| 		Escape, Tab, CapsLock, LeftShift, LeftCtrl, Super, LeftAlt, RightAlt, AltGr = RightAlt, RightCtrl, RightShift, | ||||
| 		SingleQuote, Asterix, Caret, Tilde, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, | ||||
| 		Comma, Semicolon, Period, Colon, Hyphen, Underscore, NumLock, ScrollLock, LessThan, GreaterThan, Pipe, | ||||
| 		Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, | ||||
|  | @ -27,73 +68,44 @@ namespace Kernel::Input | |||
| 
 | ||||
| 	struct KeyEvent | ||||
| 	{ | ||||
| 		enum class Modifier : uint8_t | ||||
| 		enum Modifier : uint16_t | ||||
| 		{ | ||||
| 			Shift		= (1 << 0), | ||||
| 			Ctrl		= (1 << 1), | ||||
| 			Alt			= (1 << 2), | ||||
| 			AltGr		= (1 << 3), | ||||
| 			CapsLock	= (1 << 4), | ||||
| 			NumLock		= (1 << 5), | ||||
| 			ScrollLock	= (1 << 6), | ||||
| 			Released	= (1 << 7), | ||||
| 			LShift		= (1 << 0), | ||||
| 			RShift		= (1 << 1), | ||||
| 			LCtrl		= (1 << 2), | ||||
| 			RCtrl		= (1 << 3), | ||||
| 			LAlt		= (1 << 4), | ||||
| 			RAlt		= (1 << 5), | ||||
| 			CapsLock	= (1 << 6), | ||||
| 			NumLock		= (1 << 7), | ||||
| 			ScrollLock	= (1 << 8), | ||||
| 			Pressed		= (1 << 9), | ||||
| 		}; | ||||
| 
 | ||||
| 		bool shift()		const { return modifier & (uint8_t)Modifier::Shift; } | ||||
| 		bool ctrl()			const { return modifier & (uint8_t)Modifier::Ctrl; } | ||||
| 		bool alt()			const { return modifier & (uint8_t)Modifier::Alt; } | ||||
| 		bool altgr()		const { return modifier & (uint8_t)Modifier::AltGr; } | ||||
| 		bool caps_lock()	const { return modifier & (uint8_t)Modifier::CapsLock; } | ||||
| 		bool num_lock()		const { return modifier & (uint8_t)Modifier::NumLock; } | ||||
| 		bool scroll_lock()	const { return modifier & (uint8_t)Modifier::ScrollLock; } | ||||
| 		bool released()		const { return modifier & (uint8_t)Modifier::Released; } | ||||
| 		bool pressed()		const { return !released(); } | ||||
| 		bool lshift()		const { return modifier & Modifier::LShift; } | ||||
| 		bool rshift()		const { return modifier & Modifier::RShift; } | ||||
| 		bool shift()		const { return lshift() || rshift(); } | ||||
| 
 | ||||
| 		uint8_t modifier; | ||||
| 		Key key; | ||||
| 		bool lctrl()		const { return modifier & Modifier::LCtrl; } | ||||
| 		bool rctrl()		const { return modifier & Modifier::RCtrl; } | ||||
| 		bool ctrl()			const { return lctrl() || rctrl(); } | ||||
| 
 | ||||
| 		bool lalt()			const { return modifier & Modifier::LAlt; } | ||||
| 		bool ralt()			const { return modifier & Modifier::RAlt; } | ||||
| 		bool alt()			const { return lalt() || ralt(); } | ||||
| 
 | ||||
| 		bool caps_lock()	const { return modifier & Modifier::CapsLock; } | ||||
| 		bool num_lock()		const { return modifier & Modifier::NumLock; } | ||||
| 		bool scroll_lock()	const { return modifier & Modifier::ScrollLock; } | ||||
| 
 | ||||
| 		bool pressed()		const { return modifier & Modifier::Pressed; } | ||||
| 		bool released()		const { return !pressed(); } | ||||
| 
 | ||||
| 		uint16_t modifier; | ||||
| 		uint8_t keycode; | ||||
| 	}; | ||||
| 
 | ||||
| 	inline const char* key_event_to_utf8(KeyEvent event) | ||||
| 	{ | ||||
| 		static constexpr const char* utf8_lower[] = { | ||||
| 			nullptr, nullptr, | ||||
| 			"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", | ||||
| 			"å", "ä", "ö", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, " ", | ||||
| 			"!", "\"", "#", "¤", "%", "&", "/", "§", "½", | ||||
| 			"(", ")", "[", "]", "{", "}", | ||||
| 			"=", "?", "+", "\\", "´", "`", "¨", nullptr, "@", "£", "$", "€", | ||||
| 			nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			"'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, | ||||
| 			",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			"+", "-", "*", "/", nullptr, ",", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 		}; | ||||
| 		static_assert((size_t)Key::Count == sizeof(utf8_lower) / sizeof(*utf8_lower)); | ||||
| 
 | ||||
| 		static constexpr const char* utf8_upper[] = { | ||||
| 			nullptr, nullptr, | ||||
| 			"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", | ||||
| 			"Å", "Ä", "Ö", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, " ", | ||||
| 			"!", "\"", "#", "¤", "%", "&", "/", "§", "½", | ||||
| 			"(", ")", "[", "]", "{", "}", | ||||
| 			"=", "?", "+", "\\", "´", "`", "¨", nullptr, "@", "£", "$", "€", | ||||
| 			nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			"'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, | ||||
| 			",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			"+", "-", "*", "/", nullptr, ",", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 		}; | ||||
| 		static_assert((size_t)Key::Count == sizeof(utf8_upper) / sizeof(*utf8_lower)); | ||||
| 
 | ||||
| 		return (event.shift() ^ event.caps_lock()) ? utf8_upper[(uint8_t)event.key] : utf8_lower[(uint8_t)event.key]; | ||||
| 	} | ||||
| 	Key key_event_to_key(KeyEvent); | ||||
| 	const char* key_to_utf8(Key key, uint16_t modifier); | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| #pragma once | ||||
| 
 | ||||
| namespace Kernel::Input::KeyboardLayout | ||||
| { | ||||
| 	 | ||||
| 	void initialize_fi(); | ||||
| 
 | ||||
| } | ||||
|  | @ -78,13 +78,6 @@ namespace Kernel::Input::PS2 | |||
| 		KEY_ERROR_OR_BUFFER_OVERRUN2 = 0xFF, | ||||
| 	}; | ||||
| 
 | ||||
| 	enum KBScancode : uint8_t | ||||
| 	{ | ||||
| 		SET_SCANCODE_SET1 = 1, | ||||
| 		SET_SCANCODE_SET2 = 2, | ||||
| 		SET_SCANCODE_SET3 = 3, | ||||
| 	}; | ||||
| 
 | ||||
| 	enum KBLeds : uint8_t | ||||
| 	{ | ||||
| 		SCROLL_LOCK	= (1 << 0), | ||||
|  |  | |||
|  | @ -1,5 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <BAN/Array.h> | ||||
| #include <BAN/CircularQueue.h> | ||||
| #include <kernel/Input/KeyEvent.h> | ||||
| #include <kernel/Input/PS2/Device.h> | ||||
| #include <kernel/Input/PS2/Keymap.h> | ||||
|  | @ -14,7 +16,7 @@ namespace Kernel::Input | |||
| 		enum Command : uint8_t | ||||
| 		{ | ||||
| 			SET_LEDS = 0xED, | ||||
| 			SCANCODE = 0xF0 | ||||
| 			CONFIG_SCANCODE_SET = 0xF0 | ||||
| 		}; | ||||
| 
 | ||||
| 	public: | ||||
|  | @ -29,12 +31,14 @@ namespace Kernel::Input | |||
| 		void update_leds(); | ||||
| 
 | ||||
| 	private: | ||||
| 		uint8_t m_byte_buffer[10]; | ||||
| 		BAN::Array<uint8_t, 3> m_byte_buffer; | ||||
| 		uint8_t m_byte_index { 0 }; | ||||
| 
 | ||||
| 		uint8_t m_modifiers { 0 }; | ||||
| 		uint8_t m_scancode_set { 0xFF }; | ||||
| 
 | ||||
| 		BAN::CircularQueue<KeyEvent, 10> m_event_queue; | ||||
| 		uint16_t m_modifiers { 0 }; | ||||
| 
 | ||||
| 		BAN::CircularQueue<KeyEvent, 50> m_event_queue; | ||||
| 
 | ||||
| 		PS2Keymap m_keymap; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <BAN/Vector.h> | ||||
| #include <kernel/Input/KeyEvent.h> | ||||
| #include <BAN/Array.h> | ||||
| #include <BAN/Optional.h> | ||||
| 
 | ||||
| namespace Kernel::Input | ||||
| { | ||||
|  | @ -9,15 +9,18 @@ namespace Kernel::Input | |||
| 	class PS2Keymap | ||||
| 	{ | ||||
| 	public: | ||||
| 		PS2Keymap(); | ||||
| 		void initialize(uint8_t scancode_set); | ||||
| 
 | ||||
| 		Key key_for_scancode_and_modifiers(uint32_t, uint8_t); | ||||
| 		BAN::Optional<uint8_t> get_keycode(uint8_t scancode, bool extended) const; | ||||
| 
 | ||||
| 	private: | ||||
| 		BAN::Vector<Key> m_normal_keymap; | ||||
| 		BAN::Vector<Key> m_shift_keymap; | ||||
| 		BAN::Vector<Key> m_altgr_keymap; | ||||
| 		BAN::Vector<Key> m_extended_keymap; | ||||
| 		void initialize_scancode_set1(); | ||||
| 		void initialize_scancode_set2(); | ||||
| 		void initialize_scancode_set3(); | ||||
| 
 | ||||
| 	private: | ||||
| 		BAN::Array<uint8_t, 0xFF> m_scancode_to_keycode_normal; | ||||
| 		BAN::Array<uint8_t, 0xFF> m_scancode_to_keycode_extended; | ||||
| 	}; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,64 @@ | |||
| #include <BAN/Array.h> | ||||
| #include <kernel/Input/KeyEvent.h> | ||||
| 
 | ||||
| namespace Kernel::Input | ||||
| { | ||||
| 
 | ||||
| 	BAN::Array<Key, 0xFF> g_keycode_to_key_normal; | ||||
| 	BAN::Array<Key, 0xFF> g_keycode_to_key_shift; | ||||
| 	BAN::Array<Key, 0xFF> g_keycode_to_key_altgr; | ||||
| 
 | ||||
| 	Key key_event_to_key(KeyEvent event) | ||||
| 	{ | ||||
| 		if (event.shift()) | ||||
| 			return g_keycode_to_key_shift[event.keycode]; | ||||
| 		if (event.ralt()) | ||||
| 			return g_keycode_to_key_altgr[event.keycode]; | ||||
| 		return g_keycode_to_key_normal[event.keycode]; | ||||
| 	} | ||||
| 
 | ||||
| 	const char* key_to_utf8(Key key, uint16_t modifier) | ||||
| 	{ | ||||
| 		static constexpr const char* utf8_lower[] = { | ||||
| 			nullptr, nullptr, | ||||
| 			"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", | ||||
| 			"å", "ä", "ö", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, " ", | ||||
| 			"!", "\"", "#", "¤", "%", "&", "/", "§", "½", | ||||
| 			"(", ")", "[", "]", "{", "}", | ||||
| 			"=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", | ||||
| 			nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			"'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, | ||||
| 			",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			"+", "-", "*", "/", nullptr, ",", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 		}; | ||||
| 		static_assert((size_t)Key::Count == sizeof(utf8_lower) / sizeof(*utf8_lower)); | ||||
| 
 | ||||
| 		static constexpr const char* utf8_upper[] = { | ||||
| 			nullptr, nullptr, | ||||
| 			"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", | ||||
| 			"Å", "Ä", "Ö", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, " ", | ||||
| 			"!", "\"", "#", "¤", "%", "&", "/", "§", "½", | ||||
| 			"(", ")", "[", "]", "{", "}", | ||||
| 			"=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", | ||||
| 			nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 			"'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, | ||||
| 			",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", | ||||
| 			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", | ||||
| 			"+", "-", "*", "/", nullptr, ",", | ||||
| 			nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| 		}; | ||||
| 		static_assert((size_t)Key::Count == sizeof(utf8_upper) / sizeof(*utf8_lower)); | ||||
| 
 | ||||
| 		KeyEvent event { .modifier = modifier, .keycode = 0x00 }; | ||||
| 		return (event.shift() ^ event.caps_lock()) ? utf8_upper[static_cast<uint8_t>(key)] : utf8_lower[static_cast<uint8_t>(key)]; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,363 @@ | |||
| #include <BAN/Array.h> | ||||
| #include <kernel/Input/KeyEvent.h> | ||||
| 
 | ||||
| namespace Kernel::Input | ||||
| { | ||||
| 
 | ||||
| 	extern BAN::Array<Key, 0xFF> g_keycode_to_key_normal; | ||||
| 	extern BAN::Array<Key, 0xFF> g_keycode_to_key_shift; | ||||
| 	extern BAN::Array<Key, 0xFF> g_keycode_to_key_altgr; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| namespace Kernel::Input::KeyboardLayout | ||||
| { | ||||
| 	 | ||||
| 	static void initialize_fi_normal(); | ||||
| 	static void initialize_fi_shift(); | ||||
| 	static void initialize_fi_altgr(); | ||||
| 
 | ||||
| 	void initialize_fi() | ||||
| 	{ | ||||
| 		for (auto& key : g_keycode_to_key_normal) | ||||
| 			key = Key::None; | ||||
| 		for (auto& key : g_keycode_to_key_shift) | ||||
| 			key = Key::None; | ||||
| 		for (auto& key : g_keycode_to_key_altgr) | ||||
| 			key = Key::None; | ||||
| 		initialize_fi_normal(); | ||||
| 		initialize_fi_shift(); | ||||
| 		initialize_fi_altgr(); | ||||
| 	} | ||||
| 
 | ||||
| 	static void initialize_fi_normal() | ||||
| 	{ | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  0)] = Key::Section; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  1)] = Key::_1; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  2)] = Key::_2; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  3)] = Key::_3; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  4)] = Key::_4; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  5)] = Key::_5; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  6)] = Key::_6; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  7)] = Key::_7; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  8)] = Key::_8; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0,  9)] = Key::_9; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0, 10)] = Key::_0; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0, 11)] = Key::Plus; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0, 12)] = Key::Acute; | ||||
| 		g_keycode_to_key_normal[keycode_normal(0, 13)] = Key::Backspace; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  0)] = Key::Tab; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  1)] = Key::Q; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  2)] = Key::W; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  3)] = Key::E; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  4)] = Key::R; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  5)] = Key::T; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  6)] = Key::Y; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  7)] = Key::U; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  8)] = Key::I; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1,  9)] = Key::O; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1, 10)] = Key::P; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1, 11)] = Key::A_Ring; | ||||
| 		g_keycode_to_key_normal[keycode_normal(1, 12)] = Key::TwoDots; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  0)] = Key::CapsLock; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  1)] = Key::A; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  2)] = Key::S; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  3)] = Key::D; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  4)] = Key::F; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  5)] = Key::G; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  6)] = Key::H; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  7)] = Key::J; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  8)] = Key::K; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2,  9)] = Key::L; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2, 10)] = Key::O_Umlaut; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2, 11)] = Key::A_Umlaut; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2, 12)] = Key::SingleQuote; | ||||
| 		g_keycode_to_key_normal[keycode_normal(2, 13)] = Key::Enter; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  0)] = Key::LeftShift; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  1)] = Key::LessThan; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  2)] = Key::Z; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  3)] = Key::X; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  4)] = Key::C; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  5)] = Key::V; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  6)] = Key::B; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  7)] = Key::N; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  8)] = Key::M; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3,  9)] = Key::Comma; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3, 10)] = Key::Period; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3, 11)] = Key::Hyphen; | ||||
| 		g_keycode_to_key_normal[keycode_normal(3, 12)] = Key::RightShift; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  0)] = Key::LeftCtrl; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  1)] = Key::Super; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  2)] = Key::LeftAlt; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  3)] = Key::Space; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  4)] = Key::RightAlt; | ||||
| 		g_keycode_to_key_normal[keycode_normal(4,  5)] = Key::RightCtrl; | ||||
| 
 | ||||
| 		g_keycode_to_key_normal[keycode_numpad(0, 0)] = Key::NumLock; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(0, 1)] = Key::NumpadDivide; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(0, 2)] = Key::NumpadMultiply; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(0, 3)] = Key::NumpadMinus; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(1, 0)] = Key::Numpad7; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(1, 1)] = Key::Numpad8; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(1, 2)] = Key::Numpad9; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(1, 3)] = Key::NumpadPlus; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(2, 0)] = Key::Numpad4; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(2, 1)] = Key::Numpad5; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(2, 2)] = Key::Numpad6; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(3, 0)] = Key::Numpad1; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(3, 1)] = Key::Numpad2; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(3, 2)] = Key::Numpad3; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(3, 3)] = Key::NumpadEnter; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(4, 0)] = Key::Numpad0; | ||||
| 		g_keycode_to_key_normal[keycode_numpad(4, 1)] = Key::NumpadDecimal; | ||||
| 
 | ||||
| 		g_keycode_to_key_normal[keycode_function( 0)] = Key::Escape; | ||||
| 		g_keycode_to_key_normal[keycode_function( 1)] = Key::F1; | ||||
| 		g_keycode_to_key_normal[keycode_function( 2)] = Key::F2; | ||||
| 		g_keycode_to_key_normal[keycode_function( 3)] = Key::F3; | ||||
| 		g_keycode_to_key_normal[keycode_function( 4)] = Key::F4; | ||||
| 		g_keycode_to_key_normal[keycode_function( 5)] = Key::F5; | ||||
| 		g_keycode_to_key_normal[keycode_function( 6)] = Key::F6; | ||||
| 		g_keycode_to_key_normal[keycode_function( 7)] = Key::F7; | ||||
| 		g_keycode_to_key_normal[keycode_function( 8)] = Key::F8; | ||||
| 		g_keycode_to_key_normal[keycode_function( 9)] = Key::F9; | ||||
| 		g_keycode_to_key_normal[keycode_function(10)] = Key::F10; | ||||
| 		g_keycode_to_key_normal[keycode_function(11)] = Key::F11; | ||||
| 		g_keycode_to_key_normal[keycode_function(12)] = Key::F12; | ||||
| 		g_keycode_to_key_normal[keycode_function(13)] = Key::Insert; | ||||
| 		g_keycode_to_key_normal[keycode_function(14)] = Key::PrintScreen; | ||||
| 		g_keycode_to_key_normal[keycode_function(15)] = Key::Delete; | ||||
| 		g_keycode_to_key_normal[keycode_function(16)] = Key::Home; | ||||
| 		g_keycode_to_key_normal[keycode_function(17)] = Key::End; | ||||
| 		g_keycode_to_key_normal[keycode_function(18)] = Key::PageUp; | ||||
| 		g_keycode_to_key_normal[keycode_function(19)] = Key::PageDown; | ||||
| 		g_keycode_to_key_normal[keycode_function(20)] = Key::ScrollLock; | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		g_keycode_to_key_normal[keycode_normal(5, 0)] = Key::ArrowUp; | ||||
| 		g_keycode_to_key_normal[keycode_normal(5, 1)] = Key::ArrowLeft; | ||||
| 		g_keycode_to_key_normal[keycode_normal(5, 2)] = Key::ArrowDown; | ||||
| 		g_keycode_to_key_normal[keycode_normal(5, 3)] = Key::ArrowRight; | ||||
| 	} | ||||
| 
 | ||||
| 	static void initialize_fi_shift() | ||||
| 	{ | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  0)] = Key::Half; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  1)] = Key::ExclamationMark; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  2)] = Key::DoubleQuote; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  3)] = Key::Hashtag; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  4)] = Key::Currency; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  5)] = Key::Percent; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  6)] = Key::Ampersand; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  7)] = Key::Slash; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  8)] = Key::OpenParenthesis; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0,  9)] = Key::CloseParenthesis; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0, 10)] = Key::Equals; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0, 11)] = Key::QuestionMark; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0, 12)] = Key::BackTick; | ||||
| 		g_keycode_to_key_shift[keycode_normal(0, 13)] = Key::Backspace; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  0)] = Key::Tab; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  1)] = Key::Q; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  2)] = Key::W; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  3)] = Key::E; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  4)] = Key::R; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  5)] = Key::T; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  6)] = Key::Y; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  7)] = Key::U; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  8)] = Key::I; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1,  9)] = Key::O; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1, 10)] = Key::P; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1, 11)] = Key::A_Ring; | ||||
| 		g_keycode_to_key_shift[keycode_normal(1, 12)] = Key::Caret; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  0)] = Key::CapsLock; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  1)] = Key::A; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  2)] = Key::S; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  3)] = Key::D; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  4)] = Key::F; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  5)] = Key::G; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  6)] = Key::H; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  7)] = Key::J; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  8)] = Key::K; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2,  9)] = Key::L; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2, 10)] = Key::O_Umlaut; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2, 11)] = Key::A_Umlaut; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2, 12)] = Key::Asterix; | ||||
| 		g_keycode_to_key_shift[keycode_normal(2, 13)] = Key::Enter; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  0)] = Key::LeftShift; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  1)] = Key::GreaterThan; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  2)] = Key::Z; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  3)] = Key::X; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  4)] = Key::C; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  5)] = Key::V; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  6)] = Key::B; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  7)] = Key::N; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  8)] = Key::M; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3,  9)] = Key::Semicolon; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3, 10)] = Key::Colon; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3, 11)] = Key::Underscore; | ||||
| 		g_keycode_to_key_shift[keycode_normal(3, 12)] = Key::RightShift; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  0)] = Key::LeftCtrl; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  1)] = Key::Super; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  2)] = Key::LeftAlt; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  3)] = Key::Space; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  4)] = Key::RightAlt; | ||||
| 		g_keycode_to_key_shift[keycode_normal(4,  5)] = Key::RightCtrl; | ||||
| 
 | ||||
| 		g_keycode_to_key_shift[keycode_numpad(0, 0)] = Key::NumLock; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(0, 1)] = Key::NumpadDivide; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(0, 2)] = Key::NumpadMultiply; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(0, 3)] = Key::NumpadMinus; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(1, 0)] = Key::Numpad7; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(1, 1)] = Key::Numpad8; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(1, 2)] = Key::Numpad9; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(1, 3)] = Key::NumpadPlus; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(2, 0)] = Key::Numpad4; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(2, 1)] = Key::Numpad5; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(2, 2)] = Key::Numpad6; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(3, 0)] = Key::Numpad1; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(3, 1)] = Key::Numpad2; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(3, 2)] = Key::Numpad3; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(3, 3)] = Key::NumpadEnter; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(4, 0)] = Key::Numpad0; | ||||
| 		g_keycode_to_key_shift[keycode_numpad(4, 1)] = Key::NumpadDecimal; | ||||
| 
 | ||||
| 		g_keycode_to_key_shift[keycode_function( 0)] = Key::Escape; | ||||
| 		g_keycode_to_key_shift[keycode_function( 1)] = Key::F1; | ||||
| 		g_keycode_to_key_shift[keycode_function( 2)] = Key::F2; | ||||
| 		g_keycode_to_key_shift[keycode_function( 3)] = Key::F3; | ||||
| 		g_keycode_to_key_shift[keycode_function( 4)] = Key::F4; | ||||
| 		g_keycode_to_key_shift[keycode_function( 5)] = Key::F5; | ||||
| 		g_keycode_to_key_shift[keycode_function( 6)] = Key::F6; | ||||
| 		g_keycode_to_key_shift[keycode_function( 7)] = Key::F7; | ||||
| 		g_keycode_to_key_shift[keycode_function( 8)] = Key::F8; | ||||
| 		g_keycode_to_key_shift[keycode_function( 9)] = Key::F9; | ||||
| 		g_keycode_to_key_shift[keycode_function(10)] = Key::F10; | ||||
| 		g_keycode_to_key_shift[keycode_function(11)] = Key::F11; | ||||
| 		g_keycode_to_key_shift[keycode_function(12)] = Key::F12; | ||||
| 		g_keycode_to_key_shift[keycode_function(13)] = Key::Insert; | ||||
| 		g_keycode_to_key_shift[keycode_function(14)] = Key::PrintScreen; | ||||
| 		g_keycode_to_key_shift[keycode_function(15)] = Key::Delete; | ||||
| 		g_keycode_to_key_shift[keycode_function(16)] = Key::Home; | ||||
| 		g_keycode_to_key_shift[keycode_function(17)] = Key::End; | ||||
| 		g_keycode_to_key_shift[keycode_function(18)] = Key::PageUp; | ||||
| 		g_keycode_to_key_shift[keycode_function(19)] = Key::PageDown; | ||||
| 		g_keycode_to_key_shift[keycode_function(20)] = Key::ScrollLock; | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		g_keycode_to_key_shift[keycode_normal(5, 0)] = Key::ArrowUp; | ||||
| 		g_keycode_to_key_shift[keycode_normal(5, 1)] = Key::ArrowLeft; | ||||
| 		g_keycode_to_key_shift[keycode_normal(5, 2)] = Key::ArrowDown; | ||||
| 		g_keycode_to_key_shift[keycode_normal(5, 3)] = Key::ArrowRight; | ||||
| 	} | ||||
| 
 | ||||
| 	static void initialize_fi_altgr() | ||||
| 	{ | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  0)] = Key::Section; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  1)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  2)] = Key::AtSign; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  3)] = Key::Pound; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  4)] = Key::Dollar; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  5)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  6)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  7)] = Key::OpenCurlyBracket; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  8)] = Key::OpenSquareBracket; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0,  9)] = Key::CloseSquareBracket; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0, 10)] = Key::CloseCurlyBracket; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0, 11)] = Key::BackSlash; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0, 12)] = Key::Cedilla; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(0, 13)] = Key::Backspace; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  0)] = Key::Tab; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  1)] = Key::Q; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  2)] = Key::W; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  3)] = Key::Euro; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  4)] = Key::R; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  5)] = Key::T; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  6)] = Key::Y; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  7)] = Key::U; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  8)] = Key::I; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1,  9)] = Key::O; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1, 10)] = Key::P; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1, 11)] = Key::A_Ring; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(1, 12)] = Key::Tilde; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  0)] = Key::CapsLock; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  1)] = Key::A; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  2)] = Key::S; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  3)] = Key::D; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  4)] = Key::F; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  5)] = Key::G; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  6)] = Key::H; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  7)] = Key::J; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  8)] = Key::K; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2,  9)] = Key::L; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2, 10)] = Key::O_Umlaut; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2, 11)] = Key::A_Umlaut; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2, 12)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(2, 13)] = Key::Enter; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  0)] = Key::LeftShift; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  1)] = Key::Pipe; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  2)] = Key::Z; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  3)] = Key::X; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  4)] = Key::C; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  5)] = Key::V; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  6)] = Key::B; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  7)] = Key::N; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  8)] = Key::M; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3,  9)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3, 10)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3, 11)] = Key::None; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(3, 12)] = Key::RightShift; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  0)] = Key::LeftCtrl; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  1)] = Key::Super; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  2)] = Key::LeftAlt; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  3)] = Key::Space; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  4)] = Key::RightAlt; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(4,  5)] = Key::RightCtrl; | ||||
| 
 | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(0, 0)] = Key::NumLock; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(0, 1)] = Key::NumpadDivide; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(0, 2)] = Key::NumpadMultiply; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(0, 3)] = Key::NumpadMinus; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(1, 0)] = Key::Numpad7; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(1, 1)] = Key::Numpad8; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(1, 2)] = Key::Numpad9; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(1, 3)] = Key::NumpadPlus; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(2, 0)] = Key::Numpad4; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(2, 1)] = Key::Numpad5; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(2, 2)] = Key::Numpad6; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(3, 0)] = Key::Numpad1; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(3, 1)] = Key::Numpad2; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(3, 2)] = Key::Numpad3; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(3, 3)] = Key::NumpadEnter; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(4, 0)] = Key::Numpad0; | ||||
| 		g_keycode_to_key_altgr[keycode_numpad(4, 1)] = Key::NumpadDecimal; | ||||
| 
 | ||||
| 		g_keycode_to_key_altgr[keycode_function( 0)] = Key::Escape; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 1)] = Key::F1; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 2)] = Key::F2; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 3)] = Key::F3; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 4)] = Key::F4; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 5)] = Key::F5; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 6)] = Key::F6; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 7)] = Key::F7; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 8)] = Key::F8; | ||||
| 		g_keycode_to_key_altgr[keycode_function( 9)] = Key::F9; | ||||
| 		g_keycode_to_key_altgr[keycode_function(10)] = Key::F10; | ||||
| 		g_keycode_to_key_altgr[keycode_function(11)] = Key::F11; | ||||
| 		g_keycode_to_key_altgr[keycode_function(12)] = Key::F12; | ||||
| 		g_keycode_to_key_altgr[keycode_function(13)] = Key::Insert; | ||||
| 		g_keycode_to_key_altgr[keycode_function(14)] = Key::PrintScreen; | ||||
| 		g_keycode_to_key_altgr[keycode_function(15)] = Key::Delete; | ||||
| 		g_keycode_to_key_altgr[keycode_function(16)] = Key::Home; | ||||
| 		g_keycode_to_key_altgr[keycode_function(17)] = Key::End; | ||||
| 		g_keycode_to_key_altgr[keycode_function(18)] = Key::PageUp; | ||||
| 		g_keycode_to_key_altgr[keycode_function(19)] = Key::PageDown; | ||||
| 		g_keycode_to_key_altgr[keycode_function(20)] = Key::ScrollLock; | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		g_keycode_to_key_altgr[keycode_normal(5, 0)] = Key::ArrowUp; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(5, 1)] = Key::ArrowLeft; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(5, 2)] = Key::ArrowDown; | ||||
| 		g_keycode_to_key_altgr[keycode_normal(5, 3)] = Key::ArrowRight; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -25,9 +25,24 @@ namespace Kernel::Input | |||
| 
 | ||||
| 	void PS2Keyboard::send_initialize() | ||||
| 	{ | ||||
| 		constexpr uint8_t wanted_scancode_set = 3; | ||||
| 		append_command_queue(Command::SET_LEDS, 0x00, 0); | ||||
| 		append_command_queue(Command::SCANCODE, PS2::KBScancode::SET_SCANCODE_SET2, 0); | ||||
| 		append_command_queue(PS2::DeviceCommand::ENABLE_SCANNING, 0); | ||||
| 		append_command_queue(Command::CONFIG_SCANCODE_SET, wanted_scancode_set, 0); | ||||
| 		append_command_queue(Command::CONFIG_SCANCODE_SET, 0, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	void PS2Keyboard::command_timedout(uint8_t* command_data, uint8_t command_size) | ||||
| 	{ | ||||
| 		if (command_size == 0) | ||||
| 			return; | ||||
| 
 | ||||
| 		if (command_data[0] == Command::CONFIG_SCANCODE_SET && m_scancode_set >= 0xFE) | ||||
| 		{ | ||||
| 			dwarnln("Could not detect scancode set, assuming 1"); | ||||
| 			m_scancode_set = 1; | ||||
| 			m_keymap.initialize(m_scancode_set); | ||||
| 			append_command_queue(PS2::DeviceCommand::ENABLE_SCANNING, 0); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void PS2Keyboard::handle_byte(uint8_t byte) | ||||
|  | @ -38,69 +53,93 @@ namespace Kernel::Input | |||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_scancode_set == 0xFF) | ||||
| 		{ | ||||
| 			append_command_queue(Command::CONFIG_SCANCODE_SET, 0, 1); | ||||
| 			m_scancode_set = 0xFE; | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_scancode_set == 0xFE) | ||||
| 		{ | ||||
| 			if (1 <= byte && byte <= 3) | ||||
| 			{ | ||||
| 				m_scancode_set = byte; | ||||
| 				dprintln("Using scancode set {}", m_scancode_set); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				dwarnln("Could not detect scancode set, assuming 1"); | ||||
| 				m_scancode_set = 1; | ||||
| 			} | ||||
| 			m_keymap.initialize(m_scancode_set); | ||||
| 			append_command_queue(PS2::DeviceCommand::ENABLE_SCANNING, 0); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_byte_index >= 3) | ||||
| 		{ | ||||
| 			dwarnln("PS/2 corrupted key packet"); | ||||
| 			m_byte_index = 0; | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		m_byte_buffer[m_byte_index++] = byte; | ||||
| 		if (byte == 0xE0 || byte == 0xF0) | ||||
| 		if (byte == 0xE0) | ||||
| 			return; | ||||
| 		if ((m_scancode_set == 2 || m_scancode_set == 3) && byte == 0xF0) | ||||
| 			return; | ||||
| 
 | ||||
| 		uint32_t scancode = 0; | ||||
| 		bool extended = false; | ||||
| 		bool released = false; | ||||
| 
 | ||||
| 		for (uint8_t i = 0; i < m_byte_index; i++) | ||||
| 		uint8_t index = 0; | ||||
| 		// in all scancode sets, extended scancode is indicated by byte 0xE0
 | ||||
| 		if (index < m_byte_index && m_byte_buffer[index] == 0xE0) | ||||
| 		{ | ||||
| 			if (m_byte_buffer[i] == 0xE0) | ||||
| 				extended = true; | ||||
| 			else if (m_byte_buffer[i] == 0xF0) | ||||
| 				released = true; | ||||
| 			else | ||||
| 				scancode = (scancode << 8) | m_byte_buffer[i]; | ||||
| 			extended = true; | ||||
| 			index++; | ||||
| 		} | ||||
| 		// in scancode set 1, released key is indicated by bit 7 set
 | ||||
| 		if (m_scancode_set == 1 && (m_byte_buffer[index] & 0x80)) | ||||
| 		{ | ||||
| 			released = true; | ||||
| 			m_byte_buffer[index] &= 0x7F; | ||||
| 		} | ||||
| 		// in scancode set 2 and 3, released key is indicated by byte 0xF0
 | ||||
| 		if ((m_scancode_set == 2 || m_scancode_set == 3) && m_byte_buffer[index] == 0xF0) | ||||
| 		{ | ||||
| 			released = true; | ||||
| 			index++; | ||||
| 		} | ||||
| 
 | ||||
| 		if (extended) | ||||
| 			scancode |= 0x80000000; | ||||
| 
 | ||||
| 		bool corrupted = (index + 1 != m_byte_index); | ||||
| 		m_byte_index = 0; | ||||
| 
 | ||||
| 		Key key = m_keymap.key_for_scancode_and_modifiers(scancode, m_modifiers); | ||||
| 
 | ||||
| 		if (key == Key::None) | ||||
| 			return; | ||||
| 
 | ||||
| 		if (key == Input::Key::Invalid) | ||||
| 		if (corrupted) | ||||
| 		{ | ||||
| 			dprintln("unknown key for scancode {2H} {}", scancode & 0x7FFFFFFF, extended ? 'E' : ' '); | ||||
| 			dwarnln("PS/2 corrupted key packet"); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		uint8_t modifier_mask = 0; | ||||
| 		uint8_t toggle_mask = 0; | ||||
| 		switch (key) | ||||
| 		auto keycode = m_keymap.get_keycode(m_byte_buffer[index], extended); | ||||
| 		if (!keycode.has_value()) | ||||
| 			return; | ||||
| 
 | ||||
| 		uint16_t modifier_mask = 0; | ||||
| 		uint16_t toggle_mask = 0; | ||||
| 		switch (keycode.value()) | ||||
| 		{ | ||||
| 			case Input::Key::LeftShift: | ||||
| 			case Input::Key::RightShift: | ||||
| 				modifier_mask = (uint8_t)Input::KeyEvent::Modifier::Shift; | ||||
| 				break; | ||||
| 			case Input::Key::LeftCtrl: | ||||
| 			case Input::Key::RightCtrl: | ||||
| 				modifier_mask = (uint8_t)Input::KeyEvent::Modifier::Ctrl; | ||||
| 				break; | ||||
| 			case Input::Key::Alt: | ||||
| 				modifier_mask = (uint8_t)Input::KeyEvent::Modifier::Alt; | ||||
| 				break; | ||||
| 			case Input::Key::AltGr: | ||||
| 				modifier_mask = (uint8_t)Input::KeyEvent::Modifier::AltGr; | ||||
| 				break;; | ||||
| 			case Input::Key::ScrollLock: | ||||
| 				toggle_mask = (uint8_t)Input::KeyEvent::Modifier::ScrollLock; | ||||
| 				break; | ||||
| 			case Input::Key::NumLock: | ||||
| 				toggle_mask = (uint8_t)Input::KeyEvent::Modifier::NumLock; | ||||
| 				break; | ||||
| 			case Input::Key::CapsLock: | ||||
| 				toggle_mask = (uint8_t)Input::KeyEvent::Modifier::CapsLock; | ||||
| 				break; | ||||
| 			default: | ||||
| 				break; | ||||
| 			case ModifierKeycode::LShift:	modifier_mask = KeyEvent::Modifier::LShift;	break; | ||||
| 			case ModifierKeycode::RShift:	modifier_mask = KeyEvent::Modifier::RShift;	break; | ||||
| 			case ModifierKeycode::LCtrl:	modifier_mask = KeyEvent::Modifier::LCtrl;	break; | ||||
| 			case ModifierKeycode::RCtrl:	modifier_mask = KeyEvent::Modifier::RCtrl;	break; | ||||
| 			case ModifierKeycode::LAlt:		modifier_mask = KeyEvent::Modifier::LAlt;	break; | ||||
| 			case ModifierKeycode::RAlt:		modifier_mask = KeyEvent::Modifier::RAlt;	break; | ||||
| 
 | ||||
| 			case ModifierKeycode::ScrollLock:	toggle_mask = KeyEvent::Modifier::ScrollLock;	break; | ||||
| 			case ModifierKeycode::NumLock:		toggle_mask = KeyEvent::Modifier::NumLock;		break; | ||||
| 			case ModifierKeycode::CapsLock:		toggle_mask = KeyEvent::Modifier::CapsLock;		break; | ||||
| 		} | ||||
| 
 | ||||
| 		if (modifier_mask) | ||||
|  | @ -111,15 +150,15 @@ namespace Kernel::Input | |||
| 				m_modifiers |= modifier_mask; | ||||
| 		} | ||||
| 
 | ||||
| 		if (toggle_mask && !released) | ||||
| 		if (toggle_mask) | ||||
| 		{ | ||||
| 			m_modifiers ^= toggle_mask; | ||||
| 			update_leds(); | ||||
| 		} | ||||
| 
 | ||||
| 		Input::KeyEvent event; | ||||
| 		event.modifier = m_modifiers | (released ? (uint8_t)Input::KeyEvent::Modifier::Released : 0); | ||||
| 		event.key = key; | ||||
| 		KeyEvent event; | ||||
| 		event.modifier = m_modifiers | (released ? 0 : KeyEvent::Modifier::Pressed); | ||||
| 		event.keycode = keycode.value(); | ||||
| 
 | ||||
| 		if (m_event_queue.full()) | ||||
| 		{ | ||||
|  | @ -134,11 +173,11 @@ namespace Kernel::Input | |||
| 	void PS2Keyboard::update_leds() | ||||
| 	{ | ||||
| 		uint8_t new_leds = 0; | ||||
| 		if (m_modifiers & (uint8_t)Input::KeyEvent::Modifier::ScrollLock) | ||||
| 		if (m_modifiers & +Input::KeyEvent::Modifier::ScrollLock) | ||||
| 			new_leds |= PS2::KBLeds::SCROLL_LOCK; | ||||
| 		if (m_modifiers & (uint8_t)Input::KeyEvent::Modifier::NumLock) | ||||
| 		if (m_modifiers & +Input::KeyEvent::Modifier::NumLock) | ||||
| 			new_leds |= PS2::KBLeds::NUM_LOCK; | ||||
| 		if (m_modifiers & (uint8_t)Input::KeyEvent::Modifier::CapsLock) | ||||
| 		if (m_modifiers & +Input::KeyEvent::Modifier::CapsLock) | ||||
| 			new_leds |= PS2::KBLeds::CAPS_LOCK; | ||||
| 		append_command_queue(Command::SET_LEDS, new_leds, 0); | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,360 +1,361 @@ | |||
| #include <kernel/Input/KeyEvent.h> | ||||
| #include <kernel/Input/PS2/Keymap.h> | ||||
| 
 | ||||
| namespace Kernel::Input | ||||
| { | ||||
| 
 | ||||
| 	PS2Keymap::PS2Keymap() | ||||
| 	void PS2Keymap::initialize(uint8_t scancode_set) | ||||
| 	{ | ||||
| 		MUST(m_normal_keymap.resize(0xFF, Key::Invalid)); | ||||
| 		m_normal_keymap[0x01] = Key::F9; | ||||
| 		m_normal_keymap[0x03] = Key::F5; | ||||
| 		m_normal_keymap[0x04] = Key::F3; | ||||
| 		m_normal_keymap[0x05] = Key::F1; | ||||
| 		m_normal_keymap[0x06] = Key::F2; | ||||
| 		m_normal_keymap[0x07] = Key::F11; | ||||
| 		m_normal_keymap[0x09] = Key::F10; | ||||
| 		m_normal_keymap[0x0A] = Key::F8; | ||||
| 		m_normal_keymap[0x0B] = Key::F6; | ||||
| 		m_normal_keymap[0x0C] = Key::F4; | ||||
| 		m_normal_keymap[0x0D] = Key::Tab; | ||||
| 		m_normal_keymap[0x0E] = Key::Section; | ||||
| 		m_normal_keymap[0x11] = Key::Alt; | ||||
| 		m_normal_keymap[0x12] = Key::LeftShift; | ||||
| 		m_normal_keymap[0x14] = Key::LeftCtrl; | ||||
| 		m_normal_keymap[0x15] = Key::Q; | ||||
| 		m_normal_keymap[0x16] = Key::_1; | ||||
| 		m_normal_keymap[0x1A] = Key::Z; | ||||
| 		m_normal_keymap[0x1B] = Key::S; | ||||
| 		m_normal_keymap[0x1C] = Key::A; | ||||
| 		m_normal_keymap[0x1D] = Key::W; | ||||
| 		m_normal_keymap[0x1E] = Key::_2; | ||||
| 		m_normal_keymap[0x21] = Key::C; | ||||
| 		m_normal_keymap[0x22] = Key::X; | ||||
| 		m_normal_keymap[0x23] = Key::D; | ||||
| 		m_normal_keymap[0x24] = Key::E; | ||||
| 		m_normal_keymap[0x25] = Key::_4; | ||||
| 		m_normal_keymap[0x26] = Key::_3; | ||||
| 		m_normal_keymap[0x29] = Key::Space; | ||||
| 		m_normal_keymap[0x2A] = Key::V; | ||||
| 		m_normal_keymap[0x2B] = Key::F; | ||||
| 		m_normal_keymap[0x2C] = Key::T; | ||||
| 		m_normal_keymap[0x2D] = Key::R; | ||||
| 		m_normal_keymap[0x2E] = Key::_5; | ||||
| 		m_normal_keymap[0x31] = Key::N; | ||||
| 		m_normal_keymap[0x32] = Key::B; | ||||
| 		m_normal_keymap[0x33] = Key::H; | ||||
| 		m_normal_keymap[0x34] = Key::G; | ||||
| 		m_normal_keymap[0x35] = Key::Y; | ||||
| 		m_normal_keymap[0x36] = Key::_6; | ||||
| 		m_normal_keymap[0x3A] = Key::M; | ||||
| 		m_normal_keymap[0x3B] = Key::J; | ||||
| 		m_normal_keymap[0x3C] = Key::U; | ||||
| 		m_normal_keymap[0x3D] = Key::_7; | ||||
| 		m_normal_keymap[0x3E] = Key::_8; | ||||
| 		m_normal_keymap[0x41] = Key::Comma; | ||||
| 		m_normal_keymap[0x42] = Key::K; | ||||
| 		m_normal_keymap[0x43] = Key::I; | ||||
| 		m_normal_keymap[0x44] = Key::O; | ||||
| 		m_normal_keymap[0x45] = Key::_0; | ||||
| 		m_normal_keymap[0x46] = Key::_9; | ||||
| 		m_normal_keymap[0x49] = Key::Period; | ||||
| 		m_normal_keymap[0x4A] = Key::Hyphen; | ||||
| 		m_normal_keymap[0x4B] = Key::L; | ||||
| 		m_normal_keymap[0x4C] = Key::O_Umlaut; | ||||
| 		m_normal_keymap[0x4D] = Key::P; | ||||
| 		m_normal_keymap[0x4E] = Key::Plus; | ||||
| 		m_normal_keymap[0x52] = Key::A_Umlaut; | ||||
| 		m_normal_keymap[0x54] = Key::A_Ring; | ||||
| 		m_normal_keymap[0x55] = Key::Acute; | ||||
| 		m_normal_keymap[0x58] = Key::CapsLock; | ||||
| 		m_normal_keymap[0x59] = Key::RightShift; | ||||
| 		m_normal_keymap[0x59] = Key::RightShift; | ||||
| 		m_normal_keymap[0x5A] = Key::Enter; | ||||
| 		m_normal_keymap[0x5B] = Key::TwoDots; | ||||
| 		m_normal_keymap[0x5D] = Key::SingleQuote; | ||||
| 		m_normal_keymap[0x61] = Key::LessThan; | ||||
| 		m_normal_keymap[0x66] = Key::Backspace; | ||||
| 		m_normal_keymap[0x69] = Key::Numpad1; | ||||
| 		m_normal_keymap[0x6B] = Key::Numpad4; | ||||
| 		m_normal_keymap[0x6C] = Key::Numpad7; | ||||
| 		m_normal_keymap[0x70] = Key::Numpad0; | ||||
| 		m_normal_keymap[0x71] = Key::NumpadDecimal; | ||||
| 		m_normal_keymap[0x72] = Key::Numpad2; | ||||
| 		m_normal_keymap[0x73] = Key::Numpad5; | ||||
| 		m_normal_keymap[0x74] = Key::Numpad6; | ||||
| 		m_normal_keymap[0x75] = Key::Numpad8; | ||||
| 		m_normal_keymap[0x76] = Key::Escape; | ||||
| 		m_normal_keymap[0x77] = Key::NumLock; | ||||
| 		m_normal_keymap[0x78] = Key::F11; | ||||
| 		m_normal_keymap[0x79] = Key::NumpadPlus; | ||||
| 		m_normal_keymap[0x7A] = Key::Numpad3; | ||||
| 		m_normal_keymap[0x7B] = Key::NumpadMinus; | ||||
| 		m_normal_keymap[0x7C] = Key::NumpadMultiply; | ||||
| 		m_normal_keymap[0x7D] = Key::Numpad9; | ||||
| 		m_normal_keymap[0x83] = Key::F7; | ||||
| 
 | ||||
| 		MUST(m_shift_keymap.resize(0xFF, Key::Invalid)); | ||||
| 		m_shift_keymap[0x01] = Key::F9; | ||||
| 		m_shift_keymap[0x03] = Key::F5; | ||||
| 		m_shift_keymap[0x04] = Key::F3; | ||||
| 		m_shift_keymap[0x05] = Key::F1; | ||||
| 		m_shift_keymap[0x06] = Key::F2; | ||||
| 		m_shift_keymap[0x07] = Key::F11; | ||||
| 		m_shift_keymap[0x09] = Key::F10; | ||||
| 		m_shift_keymap[0x0A] = Key::F8; | ||||
| 		m_shift_keymap[0x0B] = Key::F6; | ||||
| 		m_shift_keymap[0x0C] = Key::F4; | ||||
| 		m_shift_keymap[0x0D] = Key::Tab; | ||||
| 		m_shift_keymap[0x0E] = Key::Half; | ||||
| 		m_shift_keymap[0x11] = Key::Alt; | ||||
| 		m_shift_keymap[0x12] = Key::LeftShift; | ||||
| 		m_shift_keymap[0x14] = Key::LeftCtrl; | ||||
| 		m_shift_keymap[0x15] = Key::Q; | ||||
| 		m_shift_keymap[0x16] = Key::ExclamationMark; | ||||
| 		m_shift_keymap[0x1A] = Key::Z; | ||||
| 		m_shift_keymap[0x1B] = Key::S; | ||||
| 		m_shift_keymap[0x1C] = Key::A; | ||||
| 		m_shift_keymap[0x1D] = Key::W; | ||||
| 		m_shift_keymap[0x1E] = Key::DoubleQuote; | ||||
| 		m_shift_keymap[0x21] = Key::C; | ||||
| 		m_shift_keymap[0x22] = Key::X; | ||||
| 		m_shift_keymap[0x23] = Key::D; | ||||
| 		m_shift_keymap[0x24] = Key::E; | ||||
| 		m_shift_keymap[0x25] = Key::Currency; | ||||
| 		m_shift_keymap[0x26] = Key::Hashtag; | ||||
| 		m_shift_keymap[0x29] = Key::Space; | ||||
| 		m_shift_keymap[0x2A] = Key::V; | ||||
| 		m_shift_keymap[0x2B] = Key::F; | ||||
| 		m_shift_keymap[0x2C] = Key::T; | ||||
| 		m_shift_keymap[0x2D] = Key::R; | ||||
| 		m_shift_keymap[0x2E] = Key::Percent; | ||||
| 		m_shift_keymap[0x31] = Key::N; | ||||
| 		m_shift_keymap[0x32] = Key::B; | ||||
| 		m_shift_keymap[0x33] = Key::H; | ||||
| 		m_shift_keymap[0x34] = Key::G; | ||||
| 		m_shift_keymap[0x35] = Key::Y; | ||||
| 		m_shift_keymap[0x36] = Key::Ampersand; | ||||
| 		m_shift_keymap[0x3A] = Key::M; | ||||
| 		m_shift_keymap[0x3B] = Key::J; | ||||
| 		m_shift_keymap[0x3C] = Key::U; | ||||
| 		m_shift_keymap[0x3D] = Key::Slash; | ||||
| 		m_shift_keymap[0x3E] = Key::OpenBracet; | ||||
| 		m_shift_keymap[0x41] = Key::Semicolon; | ||||
| 		m_shift_keymap[0x42] = Key::K; | ||||
| 		m_shift_keymap[0x43] = Key::I; | ||||
| 		m_shift_keymap[0x44] = Key::O; | ||||
| 		m_shift_keymap[0x45] = Key::Equals; | ||||
| 		m_shift_keymap[0x46] = Key::CloseBracet; | ||||
| 		m_shift_keymap[0x49] = Key::Colon; | ||||
| 		m_shift_keymap[0x4A] = Key::Underscore; | ||||
| 		m_shift_keymap[0x4B] = Key::L; | ||||
| 		m_shift_keymap[0x4C] = Key::O_Umlaut; | ||||
| 		m_shift_keymap[0x4D] = Key::P; | ||||
| 		m_shift_keymap[0x4E] = Key::QuestionMark; | ||||
| 		m_shift_keymap[0x52] = Key::A_Umlaut; | ||||
| 		m_shift_keymap[0x54] = Key::A_Ring; | ||||
| 		m_shift_keymap[0x55] = Key::BackTick; | ||||
| 		m_shift_keymap[0x58] = Key::CapsLock; | ||||
| 		m_shift_keymap[0x59] = Key::RightShift; | ||||
| 		m_shift_keymap[0x59] = Key::RightShift; | ||||
| 		m_shift_keymap[0x5A] = Key::Enter; | ||||
| 		m_shift_keymap[0x5B] = Key::Caret; | ||||
| 		m_shift_keymap[0x5D] = Key::Asterix; | ||||
| 		m_shift_keymap[0x61] = Key::GreaterThan; | ||||
| 		m_shift_keymap[0x66] = Key::Backspace; | ||||
| 		m_shift_keymap[0x69] = Key::Numpad1; | ||||
| 		m_shift_keymap[0x6B] = Key::Numpad4; | ||||
| 		m_shift_keymap[0x6C] = Key::Numpad7; | ||||
| 		m_shift_keymap[0x70] = Key::Numpad0; | ||||
| 		m_shift_keymap[0x71] = Key::NumpadDecimal; | ||||
| 		m_shift_keymap[0x72] = Key::Numpad2; | ||||
| 		m_shift_keymap[0x73] = Key::Numpad5; | ||||
| 		m_shift_keymap[0x74] = Key::Numpad6; | ||||
| 		m_shift_keymap[0x75] = Key::Numpad8; | ||||
| 		m_shift_keymap[0x76] = Key::Escape; | ||||
| 		m_shift_keymap[0x77] = Key::NumLock; | ||||
| 		m_shift_keymap[0x78] = Key::F11; | ||||
| 		m_shift_keymap[0x79] = Key::NumpadPlus; | ||||
| 		m_shift_keymap[0x7A] = Key::Numpad3; | ||||
| 		m_shift_keymap[0x7B] = Key::NumpadMinus; | ||||
| 		m_shift_keymap[0x7C] = Key::NumpadMultiply; | ||||
| 		m_shift_keymap[0x7D] = Key::Numpad9; | ||||
| 		m_shift_keymap[0x83] = Key::F7; | ||||
| 
 | ||||
| 		MUST(m_altgr_keymap.resize(0xFF, Key::Invalid)); | ||||
| 		m_altgr_keymap[0x01] = Key::F9; | ||||
| 		m_altgr_keymap[0x03] = Key::F5; | ||||
| 		m_altgr_keymap[0x04] = Key::F3; | ||||
| 		m_altgr_keymap[0x05] = Key::F1; | ||||
| 		m_altgr_keymap[0x06] = Key::F2; | ||||
| 		m_altgr_keymap[0x07] = Key::F11; | ||||
| 		m_altgr_keymap[0x09] = Key::F10; | ||||
| 		m_altgr_keymap[0x0A] = Key::F8; | ||||
| 		m_altgr_keymap[0x0B] = Key::F6; | ||||
| 		m_altgr_keymap[0x0C] = Key::F4; | ||||
| 		m_altgr_keymap[0x0D] = Key::Tab; | ||||
| 		m_altgr_keymap[0x0E] = Key::None; | ||||
| 		m_altgr_keymap[0x11] = Key::Alt; | ||||
| 		m_altgr_keymap[0x12] = Key::LeftShift; | ||||
| 		m_altgr_keymap[0x14] = Key::LeftCtrl; | ||||
| 		m_altgr_keymap[0x15] = Key::Q; | ||||
| 		m_altgr_keymap[0x16] = Key::None; | ||||
| 		m_altgr_keymap[0x1A] = Key::Z; | ||||
| 		m_altgr_keymap[0x1B] = Key::S; | ||||
| 		m_altgr_keymap[0x1C] = Key::A; | ||||
| 		m_altgr_keymap[0x1D] = Key::W; | ||||
| 		m_altgr_keymap[0x1E] = Key::AtSign; | ||||
| 		m_altgr_keymap[0x21] = Key::C; | ||||
| 		m_altgr_keymap[0x22] = Key::X; | ||||
| 		m_altgr_keymap[0x23] = Key::D; | ||||
| 		m_altgr_keymap[0x24] = Key::Euro; | ||||
| 		m_altgr_keymap[0x25] = Key::Dollar; | ||||
| 		m_altgr_keymap[0x26] = Key::Pound; | ||||
| 		m_altgr_keymap[0x29] = Key::Space; | ||||
| 		m_altgr_keymap[0x2A] = Key::V; | ||||
| 		m_altgr_keymap[0x2B] = Key::F; | ||||
| 		m_altgr_keymap[0x2C] = Key::T; | ||||
| 		m_altgr_keymap[0x2D] = Key::R; | ||||
| 		m_altgr_keymap[0x2E] = Key::None; | ||||
| 		m_altgr_keymap[0x31] = Key::N; | ||||
| 		m_altgr_keymap[0x32] = Key::B; | ||||
| 		m_altgr_keymap[0x33] = Key::H; | ||||
| 		m_altgr_keymap[0x34] = Key::G; | ||||
| 		m_altgr_keymap[0x35] = Key::Y; | ||||
| 		m_altgr_keymap[0x36] = Key::None; | ||||
| 		m_altgr_keymap[0x3A] = Key::M; | ||||
| 		m_altgr_keymap[0x3B] = Key::J; | ||||
| 		m_altgr_keymap[0x3C] = Key::U; | ||||
| 		m_altgr_keymap[0x3D] = Key::OpenCurlyBrace; | ||||
| 		m_altgr_keymap[0x3E] = Key::OpenBrace; | ||||
| 		m_altgr_keymap[0x41] = Key::None; | ||||
| 		m_altgr_keymap[0x42] = Key::K; | ||||
| 		m_altgr_keymap[0x43] = Key::I; | ||||
| 		m_altgr_keymap[0x44] = Key::O; | ||||
| 		m_altgr_keymap[0x45] = Key::CloseCurlyBrace; | ||||
| 		m_altgr_keymap[0x46] = Key::CloseBrace; | ||||
| 		m_altgr_keymap[0x49] = Key::None; | ||||
| 		m_altgr_keymap[0x4A] = Key::None; | ||||
| 		m_altgr_keymap[0x4B] = Key::L; | ||||
| 		m_altgr_keymap[0x4C] = Key::O_Umlaut; | ||||
| 		m_altgr_keymap[0x4D] = Key::P; | ||||
| 		m_altgr_keymap[0x4E] = Key::BackSlash; | ||||
| 		m_altgr_keymap[0x52] = Key::A_Umlaut; | ||||
| 		m_altgr_keymap[0x54] = Key::A_Ring; | ||||
| 		m_altgr_keymap[0x55] = Key::None; | ||||
| 		m_altgr_keymap[0x58] = Key::CapsLock; | ||||
| 		m_altgr_keymap[0x59] = Key::RightShift; | ||||
| 		m_altgr_keymap[0x59] = Key::RightShift; | ||||
| 		m_altgr_keymap[0x5A] = Key::Enter; | ||||
| 		m_altgr_keymap[0x5B] = Key::Tilde; | ||||
| 		m_altgr_keymap[0x5D] = Key::None; | ||||
| 		m_altgr_keymap[0x61] = Key::Pipe; | ||||
| 		m_altgr_keymap[0x66] = Key::Backspace; | ||||
| 		m_altgr_keymap[0x69] = Key::Numpad1; | ||||
| 		m_altgr_keymap[0x6B] = Key::Numpad4; | ||||
| 		m_altgr_keymap[0x6C] = Key::Numpad7; | ||||
| 		m_altgr_keymap[0x70] = Key::Numpad0; | ||||
| 		m_altgr_keymap[0x71] = Key::NumpadDecimal; | ||||
| 		m_altgr_keymap[0x72] = Key::Numpad2; | ||||
| 		m_altgr_keymap[0x73] = Key::Numpad5; | ||||
| 		m_altgr_keymap[0x74] = Key::Numpad6; | ||||
| 		m_altgr_keymap[0x75] = Key::Numpad8; | ||||
| 		m_altgr_keymap[0x76] = Key::Escape; | ||||
| 		m_altgr_keymap[0x77] = Key::NumLock; | ||||
| 		m_altgr_keymap[0x78] = Key::F11; | ||||
| 		m_altgr_keymap[0x79] = Key::NumpadPlus; | ||||
| 		m_altgr_keymap[0x7A] = Key::Numpad3; | ||||
| 		m_altgr_keymap[0x7B] = Key::NumpadMinus; | ||||
| 		m_altgr_keymap[0x7C] = Key::NumpadMultiply; | ||||
| 		m_altgr_keymap[0x7D] = Key::Numpad9; | ||||
| 		m_altgr_keymap[0x83] = Key::F7; | ||||
| 
 | ||||
| 		MUST(m_extended_keymap.resize(0xFF, Key::Invalid)); | ||||
| 		m_extended_keymap[0x11] = Key::AltGr; | ||||
| 		m_extended_keymap[0x14] = Key::RightCtrl; | ||||
| 		m_extended_keymap[0x15] = Key::MediaPrevious; | ||||
| 		m_extended_keymap[0x1F] = Key::Super; | ||||
| 		m_extended_keymap[0x21] = Key::VolumeUp; | ||||
| 		m_extended_keymap[0x23] = Key::VolumeMute; | ||||
| 		m_extended_keymap[0x2B] = Key::Calculator; | ||||
| 		m_extended_keymap[0x32] = Key::VolumeDown; | ||||
| 		m_extended_keymap[0x34] = Key::MediaPlayPause; | ||||
| 		m_extended_keymap[0x3B] = Key::MediaStop; | ||||
| 		m_extended_keymap[0x4A] = Key::NumpadDivide; | ||||
| 		m_extended_keymap[0x4D] = Key::MediaNext; | ||||
| 		m_extended_keymap[0x5A] = Key::NumpadEnter; | ||||
| 		m_extended_keymap[0x69] = Key::End; | ||||
| 		m_extended_keymap[0x6B] = Key::ArrowLeft; | ||||
| 		m_extended_keymap[0x6C] = Key::Home; | ||||
| 		m_extended_keymap[0x70] = Key::Insert; | ||||
| 		m_extended_keymap[0x71] = Key::Delete; | ||||
| 		m_extended_keymap[0x72] = Key::ArrowDown; | ||||
| 		m_extended_keymap[0x74] = Key::ArrowRight; | ||||
| 		m_extended_keymap[0x75] = Key::ArrowUp; | ||||
| 		m_extended_keymap[0x7A] = Key::PageUp; | ||||
| 		m_extended_keymap[0x7D] = Key::PageDown; | ||||
| 		memset(m_scancode_to_keycode_normal.data(),   0xFF, m_scancode_to_keycode_normal.size()); | ||||
| 		memset(m_scancode_to_keycode_extended.data(), 0xFF, m_scancode_to_keycode_extended.size()); | ||||
| 		if (scancode_set == 1) | ||||
| 			return initialize_scancode_set1(); | ||||
| 		if (scancode_set == 2) | ||||
| 			return initialize_scancode_set2(); | ||||
| 		if (scancode_set == 3) | ||||
| 			return initialize_scancode_set3(); | ||||
| 		ASSERT_NOT_REACHED(); | ||||
| 	} | ||||
| 
 | ||||
| 	Key PS2Keymap::key_for_scancode_and_modifiers(uint32_t scancode, uint8_t modifiers) | ||||
| 	BAN::Optional<uint8_t> PS2Keymap::get_keycode(uint8_t scancode, bool extended) const | ||||
| 	{ | ||||
| 		bool extended = scancode & 0x80000000; | ||||
| 		scancode &= 0x7FFFFFFF; | ||||
| 
 | ||||
| 		KeyEvent dummy; | ||||
| 		dummy.modifier = modifiers; | ||||
| 		auto& keymap =	extended      ? m_extended_keymap : | ||||
| 						dummy.shift() ? m_shift_keymap : | ||||
| 						dummy.altgr() ? m_altgr_keymap : | ||||
| 										m_normal_keymap; | ||||
| 
 | ||||
| 		if (scancode >= keymap.size()) | ||||
| 			return Key::Invalid; | ||||
| 
 | ||||
| 		Key key = keymap[scancode]; | ||||
| 
 | ||||
| 		if (!dummy.num_lock() || dummy.shift() || dummy.ctrl() || dummy.alt()) | ||||
| 		uint8_t keycode = extended ? m_scancode_to_keycode_extended[scancode] : m_scancode_to_keycode_normal[scancode]; | ||||
| 		if (keycode == 0xFF) | ||||
| 		{ | ||||
| 			switch (key) | ||||
| 			{ | ||||
| 				case Key::Numpad0: | ||||
| 					key = Key::Insert; | ||||
| 					break; | ||||
| 				case Key::Numpad1: | ||||
| 					key = Key::End; | ||||
| 					break; | ||||
| 				case Key::Numpad2: | ||||
| 					key = Key::ArrowDown; | ||||
| 					break; | ||||
| 				case Key::Numpad3: | ||||
| 					key = Key::PageDown; | ||||
| 					break; | ||||
| 				case Key::Numpad4: | ||||
| 					key = Key::ArrowLeft; | ||||
| 					break; | ||||
| 				case Key::Numpad5: | ||||
| 					key = Key::None; | ||||
| 					break; | ||||
| 				case Key::Numpad6: | ||||
| 					key = Key::ArrowRight; | ||||
| 					break; | ||||
| 				case Key::Numpad7: | ||||
| 					key = Key::Home; | ||||
| 					break; | ||||
| 				case Key::Numpad8: | ||||
| 					key = Key::ArrowUp; | ||||
| 					break; | ||||
| 				case Key::Numpad9: | ||||
| 					key = Key::PageUp; | ||||
| 					break; | ||||
| 				case Key::NumpadDecimal: | ||||
| 					key = Key::Delete; | ||||
| 					break; | ||||
| 				default: | ||||
| 					break; | ||||
| 			} | ||||
| 			dprintln("unknown {2H} {}", scancode, extended ? 'E' : ' '); | ||||
| 			return {}; | ||||
| 		} | ||||
| 		return keycode; | ||||
| 	} | ||||
| 
 | ||||
| 		return key; | ||||
| 	void PS2Keymap::initialize_scancode_set1() | ||||
| 	{ | ||||
| 		m_scancode_to_keycode_normal[0x29]   = keycode_normal(0,  0); | ||||
| 		m_scancode_to_keycode_normal[0x02]   = keycode_normal(0,  1); | ||||
| 		m_scancode_to_keycode_normal[0x03]   = keycode_normal(0,  2); | ||||
| 		m_scancode_to_keycode_normal[0x04]   = keycode_normal(0,  3); | ||||
| 		m_scancode_to_keycode_normal[0x05]   = keycode_normal(0,  4); | ||||
| 		m_scancode_to_keycode_normal[0x06]   = keycode_normal(0,  5); | ||||
| 		m_scancode_to_keycode_normal[0x07]   = keycode_normal(0,  6); | ||||
| 		m_scancode_to_keycode_normal[0x08]   = keycode_normal(0,  7); | ||||
| 		m_scancode_to_keycode_normal[0x09]   = keycode_normal(0,  8); | ||||
| 		m_scancode_to_keycode_normal[0x0A]   = keycode_normal(0,  9); | ||||
| 		m_scancode_to_keycode_normal[0x0B]   = keycode_normal(0, 10); | ||||
| 		m_scancode_to_keycode_normal[0x0C]   = keycode_normal(0, 11); | ||||
| 		m_scancode_to_keycode_normal[0x0D]   = keycode_normal(0, 12); | ||||
| 		m_scancode_to_keycode_normal[0x0E]   = keycode_normal(0, 13); | ||||
| 		m_scancode_to_keycode_normal[0x0F]   = keycode_normal(1,  0); | ||||
| 		m_scancode_to_keycode_normal[0x10]   = keycode_normal(1,  1); | ||||
| 		m_scancode_to_keycode_normal[0x11]   = keycode_normal(1,  2); | ||||
| 		m_scancode_to_keycode_normal[0x12]   = keycode_normal(1,  3); | ||||
| 		m_scancode_to_keycode_normal[0x13]   = keycode_normal(1,  4); | ||||
| 		m_scancode_to_keycode_normal[0x14]   = keycode_normal(1,  5); | ||||
| 		m_scancode_to_keycode_normal[0x15]   = keycode_normal(1,  6); | ||||
| 		m_scancode_to_keycode_normal[0x16]   = keycode_normal(1,  7); | ||||
| 		m_scancode_to_keycode_normal[0x17]   = keycode_normal(1,  8); | ||||
| 		m_scancode_to_keycode_normal[0x18]   = keycode_normal(1,  9); | ||||
| 		m_scancode_to_keycode_normal[0x19]   = keycode_normal(1, 10); | ||||
| 		m_scancode_to_keycode_normal[0x1A]   = keycode_normal(1, 11); | ||||
| 		m_scancode_to_keycode_normal[0x1B]   = keycode_normal(1, 12); | ||||
| 		m_scancode_to_keycode_normal[0x3A]   = keycode_normal(2,  0); | ||||
| 		m_scancode_to_keycode_normal[0x1E]   = keycode_normal(2,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1F]   = keycode_normal(2,  2); | ||||
| 		m_scancode_to_keycode_normal[0x20]   = keycode_normal(2,  3); | ||||
| 		m_scancode_to_keycode_normal[0x21]   = keycode_normal(2,  4); | ||||
| 		m_scancode_to_keycode_normal[0x22]   = keycode_normal(2,  5); | ||||
| 		m_scancode_to_keycode_normal[0x23]   = keycode_normal(2,  6); | ||||
| 		m_scancode_to_keycode_normal[0x24]   = keycode_normal(2,  7); | ||||
| 		m_scancode_to_keycode_normal[0x25]   = keycode_normal(2,  8); | ||||
| 		m_scancode_to_keycode_normal[0x26]   = keycode_normal(2,  9); | ||||
| 		m_scancode_to_keycode_normal[0x27]   = keycode_normal(2, 10); | ||||
| 		m_scancode_to_keycode_normal[0x28]   = keycode_normal(2, 11); | ||||
| 		m_scancode_to_keycode_normal[0x2B]   = keycode_normal(2, 12); | ||||
| 		m_scancode_to_keycode_normal[0x1C]   = keycode_normal(2, 13); | ||||
| 		m_scancode_to_keycode_normal[0x2A]   = keycode_normal(3,  0); | ||||
| 		m_scancode_to_keycode_normal[0x56]   = keycode_normal(3,  1); | ||||
| 		m_scancode_to_keycode_normal[0x2C]   = keycode_normal(3,  2); | ||||
| 		m_scancode_to_keycode_normal[0x2D]   = keycode_normal(3,  3); | ||||
| 		m_scancode_to_keycode_normal[0x2E]   = keycode_normal(3,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2F]   = keycode_normal(3,  5); | ||||
| 		m_scancode_to_keycode_normal[0x30]   = keycode_normal(3,  6); | ||||
| 		m_scancode_to_keycode_normal[0x31]   = keycode_normal(3,  7); | ||||
| 		m_scancode_to_keycode_normal[0x32]   = keycode_normal(3,  8); | ||||
| 		m_scancode_to_keycode_normal[0x33]   = keycode_normal(3,  9); | ||||
| 		m_scancode_to_keycode_normal[0x34]   = keycode_normal(3, 10); | ||||
| 		m_scancode_to_keycode_normal[0x35]   = keycode_normal(3, 11); | ||||
| 		m_scancode_to_keycode_normal[0x36]   = keycode_normal(3, 12); | ||||
| 		m_scancode_to_keycode_normal[0x1D]   = keycode_normal(4,  0); | ||||
| 		m_scancode_to_keycode_extended[0x5B] = keycode_normal(4,  1); | ||||
| 		m_scancode_to_keycode_normal[0x38]   = keycode_normal(4,  2); | ||||
| 		m_scancode_to_keycode_normal[0x39]   = keycode_normal(4,  3); | ||||
| 		m_scancode_to_keycode_extended[0x38] = keycode_normal(4,  4); | ||||
| 		m_scancode_to_keycode_extended[0x1D] = keycode_normal(4,  5); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x45]   = keycode_numpad(0, 0); | ||||
| 		m_scancode_to_keycode_extended[0x35] = keycode_numpad(0, 1); | ||||
| 		m_scancode_to_keycode_normal[0x37]   = keycode_numpad(0, 2); | ||||
| 		m_scancode_to_keycode_normal[0x4A]   = keycode_numpad(0, 3); | ||||
| 		m_scancode_to_keycode_normal[0x47]   = keycode_numpad(1, 0); | ||||
| 		m_scancode_to_keycode_normal[0x48]   = keycode_numpad(1, 1); | ||||
| 		m_scancode_to_keycode_normal[0x49]   = keycode_numpad(1, 2); | ||||
| 		m_scancode_to_keycode_normal[0x4E]   = keycode_numpad(1, 3); | ||||
| 		m_scancode_to_keycode_normal[0x4B]   = keycode_numpad(2, 0); | ||||
| 		m_scancode_to_keycode_normal[0x4C]   = keycode_numpad(2, 1); | ||||
| 		m_scancode_to_keycode_normal[0x4D]   = keycode_numpad(2, 2); | ||||
| 		m_scancode_to_keycode_normal[0x4F]   = keycode_numpad(3, 0); | ||||
| 		m_scancode_to_keycode_normal[0x50]   = keycode_numpad(3, 1); | ||||
| 		m_scancode_to_keycode_normal[0x51]   = keycode_numpad(3, 2); | ||||
| 		m_scancode_to_keycode_extended[0x1C] = keycode_numpad(3, 3); | ||||
| 		m_scancode_to_keycode_normal[0x52]   = keycode_numpad(4, 0); | ||||
| 		m_scancode_to_keycode_normal[0x53]   = keycode_numpad(4, 1); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x01]   = keycode_function( 0); | ||||
| 		m_scancode_to_keycode_normal[0x3B]   = keycode_function( 1); | ||||
| 		m_scancode_to_keycode_normal[0x3C]   = keycode_function( 2); | ||||
| 		m_scancode_to_keycode_normal[0x3D]   = keycode_function( 3); | ||||
| 		m_scancode_to_keycode_normal[0x3E]   = keycode_function( 4); | ||||
| 		m_scancode_to_keycode_normal[0x3F]   = keycode_function( 5); | ||||
| 		m_scancode_to_keycode_normal[0x40]   = keycode_function( 6); | ||||
| 		m_scancode_to_keycode_normal[0x41]   = keycode_function( 7); | ||||
| 		m_scancode_to_keycode_normal[0x42]   = keycode_function( 8); | ||||
| 		m_scancode_to_keycode_normal[0x43]   = keycode_function( 9); | ||||
| 		m_scancode_to_keycode_normal[0x44]   = keycode_function(10); | ||||
| 		m_scancode_to_keycode_normal[0x57]   = keycode_function(11); | ||||
| 		m_scancode_to_keycode_normal[0x58]   = keycode_function(12); | ||||
| 		m_scancode_to_keycode_extended[0x52] = keycode_function(13); | ||||
| 		//m_scancode_to_keycode_normal[0x]   = keycode_function(14);
 | ||||
| 		m_scancode_to_keycode_extended[0x53] = keycode_function(15); | ||||
| 		m_scancode_to_keycode_extended[0x47] = keycode_function(16); | ||||
| 		m_scancode_to_keycode_extended[0x4F] = keycode_function(17); | ||||
| 		m_scancode_to_keycode_extended[0x49] = keycode_function(18); | ||||
| 		m_scancode_to_keycode_extended[0x51] = keycode_function(19); | ||||
| 		m_scancode_to_keycode_normal[0x46]   = keycode_function(20); | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		m_scancode_to_keycode_extended[0x48] = keycode_normal(5, 0); | ||||
| 		m_scancode_to_keycode_extended[0x4B] = keycode_normal(5, 1); | ||||
| 		m_scancode_to_keycode_extended[0x50] = keycode_normal(5, 2); | ||||
| 		m_scancode_to_keycode_extended[0x4D] = keycode_normal(5, 3); | ||||
| 	} | ||||
| 
 | ||||
| 	void PS2Keymap::initialize_scancode_set2() | ||||
| 	{ | ||||
| 		m_scancode_to_keycode_normal[0x0E]   = keycode_normal(0,  0); | ||||
| 		m_scancode_to_keycode_normal[0x16]   = keycode_normal(0,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1E]   = keycode_normal(0,  2); | ||||
| 		m_scancode_to_keycode_normal[0x26]   = keycode_normal(0,  3); | ||||
| 		m_scancode_to_keycode_normal[0x25]   = keycode_normal(0,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2E]   = keycode_normal(0,  5); | ||||
| 		m_scancode_to_keycode_normal[0x36]   = keycode_normal(0,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3D]   = keycode_normal(0,  7); | ||||
| 		m_scancode_to_keycode_normal[0x3E]   = keycode_normal(0,  8); | ||||
| 		m_scancode_to_keycode_normal[0x46]   = keycode_normal(0,  9); | ||||
| 		m_scancode_to_keycode_normal[0x45]   = keycode_normal(0, 10); | ||||
| 		m_scancode_to_keycode_normal[0x4E]   = keycode_normal(0, 11); | ||||
| 		m_scancode_to_keycode_normal[0x55]   = keycode_normal(0, 12); | ||||
| 		m_scancode_to_keycode_normal[0x66]   = keycode_normal(0, 13); | ||||
| 		m_scancode_to_keycode_normal[0x0D]   = keycode_normal(1,  0); | ||||
| 		m_scancode_to_keycode_normal[0x15]   = keycode_normal(1,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1D]   = keycode_normal(1,  2); | ||||
| 		m_scancode_to_keycode_normal[0x24]   = keycode_normal(1,  3); | ||||
| 		m_scancode_to_keycode_normal[0x2D]   = keycode_normal(1,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2C]   = keycode_normal(1,  5); | ||||
| 		m_scancode_to_keycode_normal[0x35]   = keycode_normal(1,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3C]   = keycode_normal(1,  7); | ||||
| 		m_scancode_to_keycode_normal[0x43]   = keycode_normal(1,  8); | ||||
| 		m_scancode_to_keycode_normal[0x44]   = keycode_normal(1,  9); | ||||
| 		m_scancode_to_keycode_normal[0x4D]   = keycode_normal(1, 10); | ||||
| 		m_scancode_to_keycode_normal[0x54]   = keycode_normal(1, 11); | ||||
| 		m_scancode_to_keycode_normal[0x5B]   = keycode_normal(1, 12); | ||||
| 		m_scancode_to_keycode_normal[0x58]   = keycode_normal(2,  0); | ||||
| 		m_scancode_to_keycode_normal[0x1C]   = keycode_normal(2,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1B]   = keycode_normal(2,  2); | ||||
| 		m_scancode_to_keycode_normal[0x23]   = keycode_normal(2,  3); | ||||
| 		m_scancode_to_keycode_normal[0x2B]   = keycode_normal(2,  4); | ||||
| 		m_scancode_to_keycode_normal[0x34]   = keycode_normal(2,  5); | ||||
| 		m_scancode_to_keycode_normal[0x33]   = keycode_normal(2,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3B]   = keycode_normal(2,  7); | ||||
| 		m_scancode_to_keycode_normal[0x42]   = keycode_normal(2,  8); | ||||
| 		m_scancode_to_keycode_normal[0x4B]   = keycode_normal(2,  9); | ||||
| 		m_scancode_to_keycode_normal[0x4C]   = keycode_normal(2, 10); | ||||
| 		m_scancode_to_keycode_normal[0x52]   = keycode_normal(2, 11); | ||||
| 		m_scancode_to_keycode_normal[0x5D]   = keycode_normal(2, 12); | ||||
| 		m_scancode_to_keycode_normal[0x5A]   = keycode_normal(2, 13); | ||||
| 		m_scancode_to_keycode_normal[0x12]   = keycode_normal(3,  0); | ||||
| 		m_scancode_to_keycode_normal[0x61]   = keycode_normal(3,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1A]   = keycode_normal(3,  2); | ||||
| 		m_scancode_to_keycode_normal[0x22]   = keycode_normal(3,  3); | ||||
| 		m_scancode_to_keycode_normal[0x21]   = keycode_normal(3,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2A]   = keycode_normal(3,  5); | ||||
| 		m_scancode_to_keycode_normal[0x32]   = keycode_normal(3,  6); | ||||
| 		m_scancode_to_keycode_normal[0x31]   = keycode_normal(3,  7); | ||||
| 		m_scancode_to_keycode_normal[0x3A]   = keycode_normal(3,  8); | ||||
| 		m_scancode_to_keycode_normal[0x41]   = keycode_normal(3,  9); | ||||
| 		m_scancode_to_keycode_normal[0x49]   = keycode_normal(3, 10); | ||||
| 		m_scancode_to_keycode_normal[0x4A]   = keycode_normal(3, 11); | ||||
| 		m_scancode_to_keycode_normal[0x59]   = keycode_normal(3, 12); | ||||
| 		m_scancode_to_keycode_normal[0x14]   = keycode_normal(4,  1); | ||||
| 		m_scancode_to_keycode_extended[0x1F] = keycode_normal(4,  2); | ||||
| 		m_scancode_to_keycode_normal[0x11]   = keycode_normal(4,  3); | ||||
| 		m_scancode_to_keycode_normal[0x29]   = keycode_normal(4,  4); | ||||
| 		m_scancode_to_keycode_extended[0x11] = keycode_normal(4,  5); | ||||
| 		m_scancode_to_keycode_extended[0x14] = keycode_normal(4,  6); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x77]   = keycode_numpad(0, 0); | ||||
| 		m_scancode_to_keycode_extended[0x4A] = keycode_numpad(0, 1); | ||||
| 		m_scancode_to_keycode_normal[0x7C]   = keycode_numpad(0, 2); | ||||
| 		m_scancode_to_keycode_normal[0x7B]   = keycode_numpad(0, 3); | ||||
| 		m_scancode_to_keycode_normal[0x6C]   = keycode_numpad(1, 0); | ||||
| 		m_scancode_to_keycode_normal[0x75]   = keycode_numpad(1, 1); | ||||
| 		m_scancode_to_keycode_normal[0x7D]   = keycode_numpad(1, 2); | ||||
| 		m_scancode_to_keycode_normal[0x79]   = keycode_numpad(1, 3); | ||||
| 		m_scancode_to_keycode_normal[0x6B]   = keycode_numpad(2, 0); | ||||
| 		m_scancode_to_keycode_normal[0x73]   = keycode_numpad(2, 1); | ||||
| 		m_scancode_to_keycode_normal[0x74]   = keycode_numpad(2, 2); | ||||
| 		m_scancode_to_keycode_normal[0x69]   = keycode_numpad(3, 0); | ||||
| 		m_scancode_to_keycode_normal[0x72]   = keycode_numpad(3, 1); | ||||
| 		m_scancode_to_keycode_normal[0x7A]   = keycode_numpad(3, 2); | ||||
| 		m_scancode_to_keycode_extended[0x5A] = keycode_numpad(3, 3); | ||||
| 		m_scancode_to_keycode_normal[0x70]   = keycode_numpad(4, 0); | ||||
| 		m_scancode_to_keycode_normal[0x71]   = keycode_numpad(4, 1); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x76]   = keycode_function( 0); | ||||
| 		m_scancode_to_keycode_normal[0x05]   = keycode_function( 1); | ||||
| 		m_scancode_to_keycode_normal[0x06]   = keycode_function( 2); | ||||
| 		m_scancode_to_keycode_normal[0x04]   = keycode_function( 3); | ||||
| 		m_scancode_to_keycode_normal[0x0C]   = keycode_function( 4); | ||||
| 		m_scancode_to_keycode_normal[0x03]   = keycode_function( 5); | ||||
| 		m_scancode_to_keycode_normal[0x0B]   = keycode_function( 6); | ||||
| 		m_scancode_to_keycode_normal[0x83]   = keycode_function( 7); | ||||
| 		m_scancode_to_keycode_normal[0x0A]   = keycode_function( 8); | ||||
| 		m_scancode_to_keycode_normal[0x01]   = keycode_function( 9); | ||||
| 		m_scancode_to_keycode_normal[0x09]   = keycode_function(10); | ||||
| 		m_scancode_to_keycode_normal[0x78]   = keycode_function(11); | ||||
| 		m_scancode_to_keycode_normal[0x07]   = keycode_function(12); | ||||
| 		m_scancode_to_keycode_extended[0x70] = keycode_function(13); | ||||
| 		//m_scancode_to_keycode_normal[0x]   = keycode_function(14);
 | ||||
| 		m_scancode_to_keycode_extended[0x71] = keycode_function(15); | ||||
| 		m_scancode_to_keycode_extended[0x6C] = keycode_function(16); | ||||
| 		m_scancode_to_keycode_extended[0x69] = keycode_function(17); | ||||
| 		m_scancode_to_keycode_extended[0x7D] = keycode_function(18); | ||||
| 		m_scancode_to_keycode_extended[0x7A] = keycode_function(19); | ||||
| 		m_scancode_to_keycode_normal[0x7E]   = keycode_function(20); | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		m_scancode_to_keycode_extended[0x75] = keycode_normal(5, 0); | ||||
| 		m_scancode_to_keycode_extended[0x6B] = keycode_normal(5, 1); | ||||
| 		m_scancode_to_keycode_extended[0x72] = keycode_normal(5, 2); | ||||
| 		m_scancode_to_keycode_extended[0x74] = keycode_normal(5, 3); | ||||
| 	} | ||||
| 
 | ||||
| 	void PS2Keymap::initialize_scancode_set3() | ||||
| 	{ | ||||
| 		m_scancode_to_keycode_normal[0x0E]   = keycode_normal(0,  0); | ||||
| 		m_scancode_to_keycode_normal[0x16]   = keycode_normal(0,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1E]   = keycode_normal(0,  2); | ||||
| 		m_scancode_to_keycode_normal[0x26]   = keycode_normal(0,  3); | ||||
| 		m_scancode_to_keycode_normal[0x25]   = keycode_normal(0,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2E]   = keycode_normal(0,  5); | ||||
| 		m_scancode_to_keycode_normal[0x36]   = keycode_normal(0,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3D]   = keycode_normal(0,  7); | ||||
| 		m_scancode_to_keycode_normal[0x3E]   = keycode_normal(0,  8); | ||||
| 		m_scancode_to_keycode_normal[0x46]   = keycode_normal(0,  9); | ||||
| 		m_scancode_to_keycode_normal[0x45]   = keycode_normal(0, 10); | ||||
| 		m_scancode_to_keycode_normal[0x4E]   = keycode_normal(0, 11); | ||||
| 		m_scancode_to_keycode_normal[0x55]   = keycode_normal(0, 12); | ||||
| 		m_scancode_to_keycode_normal[0x66]   = keycode_normal(0, 13); | ||||
| 		m_scancode_to_keycode_normal[0x0D]   = keycode_normal(1,  0); | ||||
| 		m_scancode_to_keycode_normal[0x15]   = keycode_normal(1,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1D]   = keycode_normal(1,  2); | ||||
| 		m_scancode_to_keycode_normal[0x24]   = keycode_normal(1,  3); | ||||
| 		m_scancode_to_keycode_normal[0x2D]   = keycode_normal(1,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2C]   = keycode_normal(1,  5); | ||||
| 		m_scancode_to_keycode_normal[0x35]   = keycode_normal(1,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3C]   = keycode_normal(1,  7); | ||||
| 		m_scancode_to_keycode_normal[0x43]   = keycode_normal(1,  8); | ||||
| 		m_scancode_to_keycode_normal[0x44]   = keycode_normal(1,  9); | ||||
| 		m_scancode_to_keycode_normal[0x4D]   = keycode_normal(1, 10); | ||||
| 		m_scancode_to_keycode_normal[0x54]   = keycode_normal(1, 11); | ||||
| 		m_scancode_to_keycode_normal[0x5B]   = keycode_normal(1, 12); | ||||
| 		m_scancode_to_keycode_normal[0x14]   = keycode_normal(2,  0); | ||||
| 		m_scancode_to_keycode_normal[0x1C]   = keycode_normal(2,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1B]   = keycode_normal(2,  2); | ||||
| 		m_scancode_to_keycode_normal[0x23]   = keycode_normal(2,  3); | ||||
| 		m_scancode_to_keycode_normal[0x2B]   = keycode_normal(2,  4); | ||||
| 		m_scancode_to_keycode_normal[0x34]   = keycode_normal(2,  5); | ||||
| 		m_scancode_to_keycode_normal[0x33]   = keycode_normal(2,  6); | ||||
| 		m_scancode_to_keycode_normal[0x3B]   = keycode_normal(2,  7); | ||||
| 		m_scancode_to_keycode_normal[0x42]   = keycode_normal(2,  8); | ||||
| 		m_scancode_to_keycode_normal[0x4B]   = keycode_normal(2,  9); | ||||
| 		m_scancode_to_keycode_normal[0x4C]   = keycode_normal(2, 10); | ||||
| 		m_scancode_to_keycode_normal[0x52]   = keycode_normal(2, 11); | ||||
| 		m_scancode_to_keycode_normal[0x5C]   = keycode_normal(2, 12); | ||||
| 		m_scancode_to_keycode_normal[0x5A]   = keycode_normal(2, 13); | ||||
| 		m_scancode_to_keycode_normal[0x12]   = keycode_normal(3,  0); | ||||
| 		m_scancode_to_keycode_normal[0x13]   = keycode_normal(3,  1); | ||||
| 		m_scancode_to_keycode_normal[0x1A]   = keycode_normal(3,  2); | ||||
| 		m_scancode_to_keycode_normal[0x22]   = keycode_normal(3,  3); | ||||
| 		m_scancode_to_keycode_normal[0x21]   = keycode_normal(3,  4); | ||||
| 		m_scancode_to_keycode_normal[0x2A]   = keycode_normal(3,  5); | ||||
| 		m_scancode_to_keycode_normal[0x32]   = keycode_normal(3,  6); | ||||
| 		m_scancode_to_keycode_normal[0x31]   = keycode_normal(3,  7); | ||||
| 		m_scancode_to_keycode_normal[0x3A]   = keycode_normal(3,  8); | ||||
| 		m_scancode_to_keycode_normal[0x41]   = keycode_normal(3,  9); | ||||
| 		m_scancode_to_keycode_normal[0x49]   = keycode_normal(3, 10); | ||||
| 		m_scancode_to_keycode_normal[0x4A]   = keycode_normal(3, 11); | ||||
| 		m_scancode_to_keycode_normal[0x59]   = keycode_normal(3, 12); | ||||
| 		m_scancode_to_keycode_normal[0x11]   = keycode_normal(4,  0); | ||||
| 		m_scancode_to_keycode_normal[0x8B]   = keycode_normal(4,  1); | ||||
| 		m_scancode_to_keycode_normal[0x19]   = keycode_normal(4,  2); | ||||
| 		m_scancode_to_keycode_normal[0x29]   = keycode_normal(4,  3); | ||||
| 		m_scancode_to_keycode_normal[0x39]   = keycode_normal(4,  4); | ||||
| 		m_scancode_to_keycode_normal[0x58]   = keycode_normal(4,  5); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x76] = keycode_numpad(0, 0); | ||||
| 		//m_scancode_to_keycode_normal[0x] = keycode_numpad(0, 1);
 | ||||
| 		m_scancode_to_keycode_normal[0x7E] = keycode_numpad(0, 2); | ||||
| 		//m_scancode_to_keycode_normal[0x] = keycode_numpad(0, 3);
 | ||||
| 		m_scancode_to_keycode_normal[0x6C] = keycode_numpad(1, 1); | ||||
| 		m_scancode_to_keycode_normal[0x75] = keycode_numpad(1, 2); | ||||
| 		m_scancode_to_keycode_normal[0x7D] = keycode_numpad(1, 3); | ||||
| 		m_scancode_to_keycode_normal[0x7C] = keycode_numpad(1, 4); | ||||
| 		m_scancode_to_keycode_normal[0x6B] = keycode_numpad(2, 1); | ||||
| 		m_scancode_to_keycode_normal[0x73] = keycode_numpad(2, 2); | ||||
| 		m_scancode_to_keycode_normal[0x74] = keycode_numpad(2, 3); | ||||
| 		m_scancode_to_keycode_normal[0x69] = keycode_numpad(3, 1); | ||||
| 		m_scancode_to_keycode_normal[0x72] = keycode_numpad(3, 2); | ||||
| 		m_scancode_to_keycode_normal[0x7A] = keycode_numpad(3, 3); | ||||
| 		m_scancode_to_keycode_normal[0x79] = keycode_numpad(3, 4); | ||||
| 		m_scancode_to_keycode_normal[0x70] = keycode_numpad(4, 1); | ||||
| 		m_scancode_to_keycode_normal[0x71] = keycode_numpad(4, 2); | ||||
| 
 | ||||
| 		m_scancode_to_keycode_normal[0x08] = keycode_function(0); | ||||
| 		m_scancode_to_keycode_normal[0x07] = keycode_function(1); | ||||
| 		m_scancode_to_keycode_normal[0x0F] = keycode_function(2); | ||||
| 		m_scancode_to_keycode_normal[0x17] = keycode_function(3); | ||||
| 		m_scancode_to_keycode_normal[0x1F] = keycode_function(4); | ||||
| 		m_scancode_to_keycode_normal[0x27] = keycode_function(5); | ||||
| 		m_scancode_to_keycode_normal[0x2F] = keycode_function(6); | ||||
| 		m_scancode_to_keycode_normal[0x37] = keycode_function(7); | ||||
| 		m_scancode_to_keycode_normal[0x3F] = keycode_function(8); | ||||
| 		m_scancode_to_keycode_normal[0x47] = keycode_function(9); | ||||
| 		m_scancode_to_keycode_normal[0x4F] = keycode_function(10); | ||||
| 		m_scancode_to_keycode_normal[0x56] = keycode_function(11); | ||||
| 		m_scancode_to_keycode_normal[0x5E] = keycode_function(12); | ||||
| 		m_scancode_to_keycode_normal[0x67] = keycode_function(13); | ||||
| 		m_scancode_to_keycode_normal[0x57] = keycode_function(14); | ||||
| 		m_scancode_to_keycode_normal[0x64] = keycode_function(15); | ||||
| 		m_scancode_to_keycode_normal[0x6E] = keycode_function(16); | ||||
| 		m_scancode_to_keycode_normal[0x65] = keycode_function(17); | ||||
| 		m_scancode_to_keycode_normal[0x6F] = keycode_function(18); | ||||
| 		m_scancode_to_keycode_normal[0x6D] = keycode_function(19); | ||||
| 		m_scancode_to_keycode_normal[0x5F] = keycode_function(20); | ||||
| 
 | ||||
| 		// Arrow keys
 | ||||
| 		m_scancode_to_keycode_normal[0x63] = keycode_normal(5, 0); | ||||
| 		m_scancode_to_keycode_normal[0x61] = keycode_normal(5, 1); | ||||
| 		m_scancode_to_keycode_normal[0x60] = keycode_normal(5, 2); | ||||
| 		m_scancode_to_keycode_normal[0x6A] = keycode_normal(5, 3); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -127,12 +127,13 @@ namespace Kernel | |||
| 		if (event.released()) | ||||
| 			return; | ||||
| 
 | ||||
| 		const char* ansi_c_str = Input::key_event_to_utf8(event); | ||||
| 		Input::Key key = Input::key_event_to_key(event); | ||||
| 		const char* ansi_c_str = Input::key_to_utf8(key, event.modifier); | ||||
| 
 | ||||
| 		if (event.ctrl()) | ||||
| 		{ | ||||
| 			ansi_c_str = nullptr; | ||||
| 			switch (event.key) | ||||
| 			switch (key) | ||||
| 			{ | ||||
| 				case Input::Key::A: ansi_c_str = "\x01"; break; | ||||
| 				case Input::Key::B: ansi_c_str = "\x02"; break; | ||||
|  | @ -165,7 +166,7 @@ namespace Kernel | |||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			switch (event.key) | ||||
| 			switch (key) | ||||
| 			{ | ||||
| 				case Input::Key::Enter: | ||||
| 				case Input::Key::NumpadEnter: | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ | |||
| #include <kernel/FS/VirtualFileSystem.h> | ||||
| #include <kernel/GDT.h> | ||||
| #include <kernel/IDT.h> | ||||
| #include <kernel/Input/KeyboardLayouts/FI.h> | ||||
| #include <kernel/Input/PS2/Controller.h> | ||||
| #include <kernel/InterruptController.h> | ||||
| #include <kernel/kprint.h> | ||||
|  | @ -182,6 +183,7 @@ static void init2(void*) | |||
| 	VirtualFileSystem::initialize(cmdline.root); | ||||
| 	dprintln("VFS initialized"); | ||||
| 
 | ||||
| 	Input::KeyboardLayout::initialize_fi(); | ||||
| 	if (auto res = PS2Controller::initialize(); res.is_error()) | ||||
| 		dprintln("{}", res.error()); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue