summaryrefslogtreecommitdiff
path: root/410kern/x86/keylayout.h
diff options
context:
space:
mode:
Diffstat (limited to '410kern/x86/keylayout.h')
-rw-r--r--410kern/x86/keylayout.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/410kern/x86/keylayout.h b/410kern/x86/keylayout.h
new file mode 100644
index 0000000..2452ecf
--- /dev/null
+++ b/410kern/x86/keylayout.h
@@ -0,0 +1,66 @@
+/**
+ * @file keylayout.h
+ * @author Andrew Spaulding (aspauldi)
+ * @brief Defines the interface and constants to be used to interract with
+ * and/or change the active keyboard layout.
+ */
+
+#ifndef __KEYLAYOUT_INTERNAL_H__
+#define __KEYLAYOUT_INTERNAL_H__
+
+/** The number of scancodes in a layer for a keyboard layout. */
+#define KL_SIZE 128
+
+/**
+ * Defines the keyboard layouts supported by the system. The active keyboard
+ * layout may be changed by call kl_set_layout().
+ *
+ * KB_LAYOUT_MIN and KB_LAYOUT_COUNT compare true to the minimum layout number
+ * and total number of keyboard layouts respectively.
+ */
+typedef enum {
+ KB_LAYOUT_MIN = 0,
+ KB_LAYOUT_QWERTY = KB_LAYOUT_MIN,
+ KB_LAYOUT_DVORAK,
+ KB_LAYOUT_COLEMAK,
+ KB_LAYOUT_COUNT
+} kb_layout_t;
+
+/**
+ * Defines the layers which can be accessed in the scancode table for the
+ * basic plain.
+ *
+ * Finding a KLE_LOWER in a layer means that the scancode decoding logic
+ * will try to use the lower layer. The requirements for that layer must
+ * still be satisfied, however. E.g., dropping from shift to lock won't use
+ * numpad keys if num lock isn't on.
+ */
+typedef enum {
+ KL_BASE = 0,
+ KL_LOCK = 1,
+ KL_SHIFT = 2,
+ KL_CTL = 3,
+ KL_EXT = 4,
+ KL_COUNT
+} kl_layer_t;
+
+/**
+ * Special values for keyboard layout layer tables.
+ *
+ * KLE_EMPTY is an alias for zero, it means the slot in the lookup table wasn't
+ * specified. KLE_ZERO is used to ask kl_get_key to return 0. KLE_LOWER is used
+ * to inform the layer processing logic that it should try the next layer down.
+ */
+enum {
+ KLE_EMPTY = 0x00,
+ KLE_ZERO = 0xFE,
+ KLE_LOWER = 0xFF,
+};
+
+/* Reads a key from the given layer of the active layout */
+unsigned char kl_get_key(kl_layer_t layer, int keycode);
+
+/* Sets the active keyboard layout */
+void kl_set_layout(kb_layout_t layout);
+
+#endif /* __KEYLAYOUT_INTERNAL_H__ */