diff --git a/examples/keyboard/english-us.json b/examples/keyboard/english-us.json
new file mode 100644
index 0000000..3786499
--- /dev/null
+++ b/examples/keyboard/english-us.json
@@ -0,0 +1,205 @@
+{
+ "info": {
+ "name": "English (US)",
+ "x": 0,
+ "y": 132
+ },
+ "layout": {
+ "!main": {
+ "keys": {
+ "`": [0, 0, 20, 20],
+ "1": [22, 0, 20, 20],
+ "2": [44, 0, 20, 20],
+ "3": [66, 0, 20, 20],
+ "4": [88, 0, 20, 20],
+ "5": [110, 0, 20, 20],
+ "6": [132, 0, 20, 20],
+ "7": [154, 0, 20, 20],
+ "8": [176, 0, 20, 20],
+ "9": [198, 0, 20, 20],
+ "0": [220, 0, 20, 20],
+ "-": [242, 0, 20, 20],
+ "=": [264, 0, 20, 20],
+ "Bksp": [286, 0, 34, 20, {"action": "backspace", "key": "B"}],
+ "Tab": [0, 22, 31, 20, {"value": "\t"}],
+ "q": [33, 22, 20, 20],
+ "w": [55, 22, 20, 20],
+ "e": [77, 22, 20, 20],
+ "r": [99, 22, 20, 20],
+ "t": [121, 22, 20, 20],
+ "y": [143, 22, 20, 20],
+ "u": [165, 22, 20, 20],
+ "i": [187, 22, 20, 20],
+ "o": [209, 22, 20, 20],
+ "p": [231, 22, 20, 20],
+ "[": [253, 22, 20, 20],
+ "]": [275, 22, 20, 20],
+ "\\": [297, 22, 23, 20],
+ "Caps": [0, 44, 38, 20, {"mode": "caps"}],
+ "a": [40, 44, 20, 20],
+ "s": [62, 44, 20, 20],
+ "d": [84, 44, 20, 20],
+ "f": [106, 44, 20, 20],
+ "g": [128, 44, 20, 20],
+ "h": [150, 44, 20, 20],
+ "j": [172, 44, 20, 20],
+ "k": [194, 44, 20, 20],
+ "l": [216, 44, 20, 20],
+ ";": [238, 44, 20, 20],
+ "'": [260, 44, 20, 20],
+ "Enter": [282, 44, 38, 20, {"action": "newline"}],
+ "Shift": [0, 66, 49, 20, {"mode": "shift", "key": "Y"}],
+ "z": [51, 66, 20, 20],
+ "x": [73, 66, 20, 20],
+ "c": [95, 66, 20, 20],
+ "v": [117, 66, 20, 20],
+ "b": [139, 66, 20, 20],
+ "n": [161, 66, 20, 20],
+ "m": [183, 66, 20, 20],
+ ",": [205, 66, 20, 20],
+ ".": [227, 66, 20, 20],
+ "/": [249, 66, 20, 20],
+ "Shift (R)": [271, 66, 49, 20, {"mode": "shift", "label": "Shift"}],
+ "Close": [0, 88, 64, 20, {"action": "exit", "key": ["START", "SELECT"]}],
+ "(=)": [66, 88, 27, 20, {"action": "layout"}],
+ " ": [95, 88, 108, 20],
+ "(!)": [205, 88, 27, 20, {"action": "phrases"}],
+ "←": [234, 88, 20, 20, {"action": "left", "key": "LEFT"}],
+ "→": [256, 88, 20, 20, {"action": "right", "key": "RIGHT"}],
+ "↓": [278, 88, 20, 20, {"action": "down", "key": "DOWN"}],
+ "↑": [300, 88, 20, 20, {"action": "up", "key": "UP"}]
+ }
+ },
+ "shift": {
+ "return": true,
+ "keys": {
+ "~": [0, 0, 20, 20],
+ "!": [22, 0, 20, 20],
+ "@": [44, 0, 20, 20],
+ "#": [66, 0, 20, 20],
+ "$": [88, 0, 20, 20],
+ "%": [110, 0, 20, 20],
+ "^": [132, 0, 20, 20],
+ "&": [154, 0, 20, 20],
+ "*": [176, 0, 20, 20],
+ "(": [198, 0, 20, 20],
+ ")": [220, 0, 20, 20],
+ "_": [242, 0, 20, 20],
+ "+": [264, 0, 20, 20],
+ "Bksp": [286, 0, 34, 20, {"action": "backspace", "key": "B"}],
+ "Tab": [0, 22, 31, 20, {"value": "\t"}],
+ "Q": [33, 22, 20, 20],
+ "W": [55, 22, 20, 20],
+ "E": [77, 22, 20, 20],
+ "R": [99, 22, 20, 20],
+ "T": [121, 22, 20, 20],
+ "Y": [143, 22, 20, 20],
+ "U": [165, 22, 20, 20],
+ "I": [187, 22, 20, 20],
+ "O": [209, 22, 20, 20],
+ "P": [231, 22, 20, 20],
+ "{": [253, 22, 20, 20],
+ "}": [275, 22, 20, 20],
+ "|": [297, 22, 23, 20],
+ "Caps": [0, 44, 38, 20, {"mode": "caps"}],
+ "A": [40, 44, 20, 20],
+ "S": [62, 44, 20, 20],
+ "D": [84, 44, 20, 20],
+ "F": [106, 44, 20, 20],
+ "G": [128, 44, 20, 20],
+ "H": [150, 44, 20, 20],
+ "J": [172, 44, 20, 20],
+ "K": [194, 44, 20, 20],
+ "L": [216, 44, 20, 20],
+ ":": [238, 44, 20, 20],
+ "\"": [260, 44, 20, 20],
+ "Enter": [282, 44, 38, 20, {"action": "newline"}],
+ "Shift": [0, 66, 49, 20, {"value": "", "active": true, "key": "Y"}],
+ "Z": [51, 66, 20, 20],
+ "X": [73, 66, 20, 20],
+ "C": [95, 66, 20, 20],
+ "V": [117, 66, 20, 20],
+ "B": [139, 66, 20, 20],
+ "N": [161, 66, 20, 20],
+ "M": [183, 66, 20, 20],
+ "<": [205, 66, 20, 20],
+ ">": [227, 66, 20, 20],
+ "?": [249, 66, 20, 20],
+ "Shift (R)": [271, 66, 49, 20, {"value": "", "active": true, "label": "Shift"}],
+ "Close": [0, 88, 64, 20, {"action": "exit", "key": ["START", "SELECT"]}],
+ "(=)": [66, 88, 27, 20, {"action": "layout"}],
+ " ": [95, 88, 108, 20],
+ "(!)": [205, 88, 27, 20, {"action": "phrases"}],
+ "←": [234, 88, 20, 20, {"action": "left", "key": "LEFT"}],
+ "→": [256, 88, 20, 20, {"action": "right", "key": "RIGHT"}],
+ "↑": [278, 88, 20, 20, {"action": "down", "key": "DOWN"}],
+ "↓": [300, 88, 20, 20, {"action": "up", "key": "UP"}]
+ }
+ },
+ "caps": {
+ "keys": {
+ "`": [0, 0, 20, 20],
+ "1": [22, 0, 20, 20],
+ "2": [44, 0, 20, 20],
+ "3": [66, 0, 20, 20],
+ "4": [88, 0, 20, 20],
+ "5": [110, 0, 20, 20],
+ "6": [132, 0, 20, 20],
+ "7": [154, 0, 20, 20],
+ "8": [176, 0, 20, 20],
+ "9": [198, 0, 20, 20],
+ "0": [220, 0, 20, 20],
+ "-": [242, 0, 20, 20],
+ "=": [264, 0, 20, 20],
+ "Bksp": [286, 0, 34, 20, {"action": "backspace", "key": "B"}],
+ "Tab": [0, 22, 31, 20, {"value": "\t"}],
+ "Q": [33, 22, 20, 20],
+ "W": [55, 22, 20, 20],
+ "E": [77, 22, 20, 20],
+ "R": [99, 22, 20, 20],
+ "T": [121, 22, 20, 20],
+ "Y": [143, 22, 20, 20],
+ "U": [165, 22, 20, 20],
+ "I": [187, 22, 20, 20],
+ "O": [209, 22, 20, 20],
+ "P": [231, 22, 20, 20],
+ "[": [253, 22, 20, 20],
+ "]": [275, 22, 20, 20],
+ "\\": [297, 22, 23, 20],
+ "Caps": [0, 44, 38, 20, {"mode": "!main", "active": true}],
+ "A": [40, 44, 20, 20],
+ "S": [62, 44, 20, 20],
+ "D": [84, 44, 20, 20],
+ "F": [106, 44, 20, 20],
+ "G": [128, 44, 20, 20],
+ "H": [150, 44, 20, 20],
+ "J": [172, 44, 20, 20],
+ "K": [194, 44, 20, 20],
+ "L": [216, 44, 20, 20],
+ ";": [238, 44, 20, 20],
+ "'": [260, 44, 20, 20],
+ "Enter": [282, 44, 38, 20, {"action": "newline"}],
+ "Shift": [0, 66, 49, 20, {"mode": "shift", "key": "Y"}],
+ "Z": [51, 66, 20, 20],
+ "X": [73, 66, 20, 20],
+ "C": [95, 66, 20, 20],
+ "V": [117, 66, 20, 20],
+ "B": [139, 66, 20, 20],
+ "N": [161, 66, 20, 20],
+ "M": [183, 66, 20, 20],
+ ",": [205, 66, 20, 20],
+ ".": [227, 66, 20, 20],
+ "/": [249, 66, 20, 20],
+ "Shift (R)": [271, 66, 49, 20, {"mode": "shift", "label": "Shift"}],
+ "Close": [0, 88, 64, 20, {"action": "exit", "key": ["START", "SELECT"]}],
+ "(=)": [66, 88, 27, 20, {"action": "layout"}],
+ " ": [95, 88, 108, 20],
+ "(!)": [205, 88, 27, 20, {"action": "phrases"}],
+ "←": [234, 88, 20, 20, {"action": "left", "key": "LEFT"}],
+ "→": [256, 88, 20, 20, {"action": "right", "key": "RIGHT"}],
+ "↑": [278, 88, 20, 20, {"action": "down", "key": "DOWN"}],
+ "↓": [300, 88, 20, 20, {"action": "up", "key": "UP"}]
+ }
+ }
+ }
+}
diff --git a/include/gui.hpp b/include/gui.hpp
index 0e9f063..14e5dbc 100644
--- a/include/gui.hpp
+++ b/include/gui.hpp
@@ -60,6 +60,11 @@ namespace Gui {
*/
void clearTextBufs(void);
+ /*
+ Updates the Text Buffer to the screen.
+ */
+ void updateTextBufs(bool top);
+
/*
Clear the screen.
*/
diff --git a/include/keyboard.hpp b/include/keyboard.hpp
new file mode 100644
index 0000000..ee92a79
--- /dev/null
+++ b/include/keyboard.hpp
@@ -0,0 +1,131 @@
+/*
+ * This file is part of Universal-Core
+ * Copyright (C) 2021 Universal-Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Additional Terms 7.b and 7.c of GPLv3 apply to this file:
+ * * Requiring preservation of specified reasonable legal notices or
+ * author attributions in that material or in the Appropriate Legal
+ * Notices displayed by works containing it.
+ * * Prohibiting misrepresentation of the origin of that material,
+ * or requiring that modified versions of such material be marked in
+ * reasonable ways as different from the original version.
+ */
+
+#ifndef _UNIVERSAL_CORE_KEYBOARD_HPP
+#define _UNIVERSAL_CORE_KEYBOARD_HPP
+
+#include "structs.hpp"
+
+#include