From 257ceaa170155ff0dab7ed4d56a6cf5860ff95c4 Mon Sep 17 00:00:00 2001 From: nakst <> Date: Tue, 12 Oct 2021 15:35:32 +0100 Subject: [PATCH] keyboard layout support --- LICENSE.md | 3 +- desktop/api.cpp | 3 + desktop/desktop.cpp | 4 +- desktop/gui.cpp | 29 ++- desktop/list_view.cpp | 57 ++++- desktop/os.header | 5 +- desktop/prefix.h | 1 + desktop/settings.cpp | 107 +++++++- desktop/text.cpp | 136 ++++------ kernel/windows.cpp | 3 +- res/Keyboard Layouts/License.txt | 193 +++++++++++++++ res/Keyboard Layouts/af.dat | Bin 0 -> 4618 bytes res/Keyboard Layouts/al.dat | Bin 0 -> 4616 bytes res/Keyboard Layouts/am.dat | Bin 0 -> 4778 bytes res/Keyboard Layouts/at.dat | Bin 0 -> 4672 bytes res/Keyboard Layouts/au.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/az.dat | Bin 0 -> 4625 bytes res/Keyboard Layouts/bd.dat | Bin 0 -> 4673 bytes res/Keyboard Layouts/be.dat | Bin 0 -> 4641 bytes res/Keyboard Layouts/bg.dat | Bin 0 -> 4770 bytes res/Keyboard Layouts/br.dat | Bin 0 -> 4651 bytes res/Keyboard Layouts/bt.dat | Bin 0 -> 4879 bytes res/Keyboard Layouts/bw.dat | Bin 0 -> 4600 bytes res/Keyboard Layouts/by.dat | Bin 0 -> 4725 bytes res/Keyboard Layouts/ca.dat | Bin 0 -> 4551 bytes res/Keyboard Layouts/cd.dat | Bin 0 -> 4498 bytes res/Keyboard Layouts/ch.dat | Bin 0 -> 4645 bytes res/Keyboard Layouts/cm.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/cn.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/cz.dat | Bin 0 -> 4610 bytes res/Keyboard Layouts/de.dat | Bin 0 -> 4672 bytes res/Keyboard Layouts/dk.dat | Bin 0 -> 4637 bytes res/Keyboard Layouts/dz.dat | Bin 0 -> 4797 bytes res/Keyboard Layouts/ee.dat | Bin 0 -> 4656 bytes res/Keyboard Layouts/es.dat | Bin 0 -> 4647 bytes res/Keyboard Layouts/et.dat | Bin 0 -> 4845 bytes res/Keyboard Layouts/extract_keymaps.c | 329 +++++++++++++++++++++++++ res/Keyboard Layouts/fi.dat | Bin 0 -> 4604 bytes res/Keyboard Layouts/fo.dat | Bin 0 -> 4651 bytes res/Keyboard Layouts/fr.dat | Bin 0 -> 4644 bytes res/Keyboard Layouts/gb.dat | Bin 0 -> 4637 bytes res/Keyboard Layouts/ge.dat | Bin 0 -> 4691 bytes res/Keyboard Layouts/gh.dat | Bin 0 -> 4596 bytes res/Keyboard Layouts/gr.dat | Bin 0 -> 4669 bytes res/Keyboard Layouts/hr.dat | Bin 0 -> 4624 bytes res/Keyboard Layouts/hu.dat | Bin 0 -> 4642 bytes res/Keyboard Layouts/id.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/ie.dat | Bin 0 -> 4657 bytes res/Keyboard Layouts/il.dat | Bin 0 -> 4549 bytes res/Keyboard Layouts/in.dat | Bin 0 -> 4717 bytes res/Keyboard Layouts/index.ini | 89 +++++++ res/Keyboard Layouts/iq.dat | Bin 0 -> 4620 bytes res/Keyboard Layouts/ir.dat | Bin 0 -> 4608 bytes res/Keyboard Layouts/is.dat | Bin 0 -> 4647 bytes res/Keyboard Layouts/it.dat | Bin 0 -> 4657 bytes res/Keyboard Layouts/jp.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/jv.dat | Bin 0 -> 4958 bytes res/Keyboard Layouts/ke.dat | Bin 0 -> 4600 bytes res/Keyboard Layouts/kg.dat | Bin 0 -> 4741 bytes res/Keyboard Layouts/kh.dat | Bin 0 -> 4849 bytes res/Keyboard Layouts/kr.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/kz.dat | Bin 0 -> 4741 bytes res/Keyboard Layouts/la.dat | Bin 0 -> 4905 bytes res/Keyboard Layouts/lk.dat | Bin 0 -> 4716 bytes res/Keyboard Layouts/lt.dat | Bin 0 -> 4649 bytes res/Keyboard Layouts/lv.dat | Bin 0 -> 4660 bytes res/Keyboard Layouts/md.dat | Bin 0 -> 4571 bytes res/Keyboard Layouts/me.dat | Bin 0 -> 4630 bytes res/Keyboard Layouts/mk.dat | Bin 0 -> 4721 bytes res/Keyboard Layouts/ml.dat | Bin 0 -> 4646 bytes res/Keyboard Layouts/mm.dat | Bin 0 -> 4755 bytes res/Keyboard Layouts/mn.dat | Bin 0 -> 4625 bytes res/Keyboard Layouts/mt.dat | Bin 0 -> 4645 bytes res/Keyboard Layouts/mv.dat | Bin 0 -> 4704 bytes res/Keyboard Layouts/my.dat | Bin 0 -> 4673 bytes res/Keyboard Layouts/ng.dat | Bin 0 -> 4596 bytes res/Keyboard Layouts/nl.dat | Bin 0 -> 4643 bytes res/Keyboard Layouts/no.dat | Bin 0 -> 4654 bytes res/Keyboard Layouts/np.dat | Bin 0 -> 4909 bytes res/Keyboard Layouts/ph.dat | Bin 0 -> 4618 bytes res/Keyboard Layouts/pk.dat | Bin 0 -> 4688 bytes res/Keyboard Layouts/pl.dat | Bin 0 -> 4668 bytes res/Keyboard Layouts/pt.dat | Bin 0 -> 4634 bytes res/Keyboard Layouts/ro.dat | Bin 0 -> 4571 bytes res/Keyboard Layouts/rs.dat | Bin 0 -> 4649 bytes res/Keyboard Layouts/ru.dat | Bin 0 -> 4729 bytes res/Keyboard Layouts/se.dat | Bin 0 -> 4654 bytes res/Keyboard Layouts/si.dat | Bin 0 -> 4634 bytes res/Keyboard Layouts/sk.dat | Bin 0 -> 4616 bytes res/Keyboard Layouts/sn.dat | Bin 0 -> 4669 bytes res/Keyboard Layouts/sy.dat | Bin 0 -> 4620 bytes res/Keyboard Layouts/tg.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/th.dat | Bin 0 -> 4925 bytes res/Keyboard Layouts/tj.dat | Bin 0 -> 4727 bytes res/Keyboard Layouts/tr.dat | Bin 0 -> 4591 bytes res/Keyboard Layouts/tw.dat | Bin 0 -> 4621 bytes res/Keyboard Layouts/tz.dat | Bin 0 -> 4661 bytes res/Keyboard Layouts/ua.dat | Bin 0 -> 4732 bytes res/Keyboard Layouts/us.dat | Bin 0 -> 4593 bytes res/Keyboard Layouts/uz.dat | Bin 0 -> 4737 bytes res/Keyboard Layouts/vn.dat | Bin 0 -> 4620 bytes res/Keyboard Layouts/za.dat | Bin 0 -> 4636 bytes res/Theme Source.dat | Bin 513504 -> 515268 bytes res/Theme.dat | Bin 28956 -> 28956 bytes shared/strings.cpp | 1 + util/build_core.c | 17 ++ util/designer2.cpp | 1 + 107 files changed, 861 insertions(+), 117 deletions(-) create mode 100644 res/Keyboard Layouts/License.txt create mode 100644 res/Keyboard Layouts/af.dat create mode 100644 res/Keyboard Layouts/al.dat create mode 100644 res/Keyboard Layouts/am.dat create mode 100644 res/Keyboard Layouts/at.dat create mode 100644 res/Keyboard Layouts/au.dat create mode 100644 res/Keyboard Layouts/az.dat create mode 100644 res/Keyboard Layouts/bd.dat create mode 100644 res/Keyboard Layouts/be.dat create mode 100644 res/Keyboard Layouts/bg.dat create mode 100644 res/Keyboard Layouts/br.dat create mode 100644 res/Keyboard Layouts/bt.dat create mode 100644 res/Keyboard Layouts/bw.dat create mode 100644 res/Keyboard Layouts/by.dat create mode 100644 res/Keyboard Layouts/ca.dat create mode 100644 res/Keyboard Layouts/cd.dat create mode 100644 res/Keyboard Layouts/ch.dat create mode 100644 res/Keyboard Layouts/cm.dat create mode 100644 res/Keyboard Layouts/cn.dat create mode 100644 res/Keyboard Layouts/cz.dat create mode 100644 res/Keyboard Layouts/de.dat create mode 100644 res/Keyboard Layouts/dk.dat create mode 100644 res/Keyboard Layouts/dz.dat create mode 100644 res/Keyboard Layouts/ee.dat create mode 100644 res/Keyboard Layouts/es.dat create mode 100644 res/Keyboard Layouts/et.dat create mode 100644 res/Keyboard Layouts/extract_keymaps.c create mode 100644 res/Keyboard Layouts/fi.dat create mode 100644 res/Keyboard Layouts/fo.dat create mode 100644 res/Keyboard Layouts/fr.dat create mode 100644 res/Keyboard Layouts/gb.dat create mode 100644 res/Keyboard Layouts/ge.dat create mode 100644 res/Keyboard Layouts/gh.dat create mode 100644 res/Keyboard Layouts/gr.dat create mode 100644 res/Keyboard Layouts/hr.dat create mode 100644 res/Keyboard Layouts/hu.dat create mode 100644 res/Keyboard Layouts/id.dat create mode 100644 res/Keyboard Layouts/ie.dat create mode 100644 res/Keyboard Layouts/il.dat create mode 100644 res/Keyboard Layouts/in.dat create mode 100644 res/Keyboard Layouts/index.ini create mode 100644 res/Keyboard Layouts/iq.dat create mode 100644 res/Keyboard Layouts/ir.dat create mode 100644 res/Keyboard Layouts/is.dat create mode 100644 res/Keyboard Layouts/it.dat create mode 100644 res/Keyboard Layouts/jp.dat create mode 100644 res/Keyboard Layouts/jv.dat create mode 100644 res/Keyboard Layouts/ke.dat create mode 100644 res/Keyboard Layouts/kg.dat create mode 100644 res/Keyboard Layouts/kh.dat create mode 100644 res/Keyboard Layouts/kr.dat create mode 100644 res/Keyboard Layouts/kz.dat create mode 100644 res/Keyboard Layouts/la.dat create mode 100644 res/Keyboard Layouts/lk.dat create mode 100644 res/Keyboard Layouts/lt.dat create mode 100644 res/Keyboard Layouts/lv.dat create mode 100644 res/Keyboard Layouts/md.dat create mode 100644 res/Keyboard Layouts/me.dat create mode 100644 res/Keyboard Layouts/mk.dat create mode 100644 res/Keyboard Layouts/ml.dat create mode 100644 res/Keyboard Layouts/mm.dat create mode 100644 res/Keyboard Layouts/mn.dat create mode 100644 res/Keyboard Layouts/mt.dat create mode 100644 res/Keyboard Layouts/mv.dat create mode 100644 res/Keyboard Layouts/my.dat create mode 100644 res/Keyboard Layouts/ng.dat create mode 100644 res/Keyboard Layouts/nl.dat create mode 100644 res/Keyboard Layouts/no.dat create mode 100644 res/Keyboard Layouts/np.dat create mode 100644 res/Keyboard Layouts/ph.dat create mode 100644 res/Keyboard Layouts/pk.dat create mode 100644 res/Keyboard Layouts/pl.dat create mode 100644 res/Keyboard Layouts/pt.dat create mode 100644 res/Keyboard Layouts/ro.dat create mode 100644 res/Keyboard Layouts/rs.dat create mode 100644 res/Keyboard Layouts/ru.dat create mode 100644 res/Keyboard Layouts/se.dat create mode 100644 res/Keyboard Layouts/si.dat create mode 100644 res/Keyboard Layouts/sk.dat create mode 100644 res/Keyboard Layouts/sn.dat create mode 100644 res/Keyboard Layouts/sy.dat create mode 100644 res/Keyboard Layouts/tg.dat create mode 100644 res/Keyboard Layouts/th.dat create mode 100644 res/Keyboard Layouts/tj.dat create mode 100644 res/Keyboard Layouts/tr.dat create mode 100644 res/Keyboard Layouts/tw.dat create mode 100644 res/Keyboard Layouts/tz.dat create mode 100644 res/Keyboard Layouts/ua.dat create mode 100644 res/Keyboard Layouts/us.dat create mode 100644 res/Keyboard Layouts/uz.dat create mode 100644 res/Keyboard Layouts/vn.dat create mode 100644 res/Keyboard Layouts/za.dat diff --git a/LICENSE.md b/LICENSE.md index 3ae1225..e73c4eb 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -28,6 +28,7 @@ They licenses may be found in the following files: - shared/stb_image.h, shared/stb_sprintf.h, shared/stb_ds.h and util/stb_truetype.h - res/Fonts/Hack License.txt, res/Fonts/Inter License.txt - res/Icons/elementary Icons License.txt - - res/Media/Licenses.txt + - res/Sample Images/Licenses.txt + - res/Keyboard Layouts/License.txt - Ported applications have their licenses in their respective folders. Please tell me if I've forgotten something! diff --git a/desktop/api.cpp b/desktop/api.cpp index e401d4c..2ebf0e1 100644 --- a/desktop/api.cpp +++ b/desktop/api.cpp @@ -156,6 +156,9 @@ struct { Array<Work> workQueue; Array<EsHandle> workThreads; volatile bool workFinish; + + const uint16_t *keyboardLayout; + uint16_t keyboardLayoutIdentifier; } api; ptrdiff_t tlsStorageOffset; diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index acabb23..ae556e3 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -606,7 +606,7 @@ int ProcessGlobalKeyboardShortcuts(EsElement *, EsMessage *message) { // Do not process global keyboard shortcuts if the installer is running. } else if (message->type == ES_MSG_KEY_DOWN) { bool ctrlOnly = message->keyboard.modifiers == ES_MODIFIER_CTRL; - int scancode = message->keyboard.scancode; + int scancode = ScancodeMapToLabel(message->keyboard.scancode); if (ctrlOnly && scancode == ES_SCANCODE_N && !message->keyboard.repeat) { ApplicationInstanceCreate(APPLICATION_ID_DESKTOP_BLANK_TAB, nullptr, nullptr); @@ -651,7 +651,7 @@ int ContainerWindowMessage(EsElement *element, EsMessage *message) { container->taskBarButton->MaybeRefreshStyle(); } else if (message->type == ES_MSG_KEY_DOWN) { bool ctrlOnly = message->keyboard.modifiers == ES_MODIFIER_CTRL; - int scancode = message->keyboard.scancode; + int scancode = ScancodeMapToLabel(message->keyboard.scancode); if (((message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == ES_MODIFIER_CTRL) && message->keyboard.scancode == ES_SCANCODE_TAB) { int tab = -1; diff --git a/desktop/gui.cpp b/desktop/gui.cpp index 227b299..bdc93fb 100644 --- a/desktop/gui.cpp +++ b/desktop/gui.cpp @@ -343,7 +343,7 @@ struct ScrollPane { void Setup(EsElement *parent, uint8_t xMode, uint8_t yMode, uint16_t flags); void SetPosition(int axis, double newPosition, bool sendMovedMessage = true); void Refresh(); - void ReceivedMessage(EsMessage *message); + int ReceivedMessage(EsMessage *message); inline void SetX(double scrollX, bool sendMovedMessage = true) { SetPosition(0, scrollX, sendMovedMessage); } inline void SetY(double scrollY, bool sendMovedMessage = true) { SetPosition(1, scrollY, sendMovedMessage); } @@ -2840,7 +2840,7 @@ void ScrollPane::Setup(EsElement *_parent, uint8_t _xMode, uint8_t _yMode, uint1 } } -void ScrollPane::ReceivedMessage(EsMessage *message) { +int ScrollPane::ReceivedMessage(EsMessage *message) { if (message->type == ES_MSG_LAYOUT) { Refresh(); } else if (message->type == ES_MSG_MOUSE_LEFT_DRAG || message->type == ES_MSG_MOUSE_RIGHT_DRAG || message->type == ES_MSG_MOUSE_MIDDLE_DRAG) { @@ -2884,7 +2884,11 @@ void ScrollPane::ReceivedMessage(EsMessage *message) { } else if (message->type == ES_MSG_SCROLL_WHEEL) { SetPosition(0, position[0] + 60 * message->scrollWheel.dx / ES_SCROLL_WHEEL_NOTCH, true); SetPosition(1, position[1] - 60 * message->scrollWheel.dy / ES_SCROLL_WHEEL_NOTCH, true); + if (message->scrollWheel.dx && mode[0]) return ES_HANDLED; + if (message->scrollWheel.dy && mode[1]) return ES_HANDLED; } + + return 0; } void ScrollPane::SetPosition(int axis, double newScroll, bool sendMovedMessage) { @@ -2990,7 +2994,7 @@ struct EsScrollView : EsElement { ScrollPane scroll; }; void EsScrollViewSetup(EsScrollView *view, uint8_t xMode, uint8_t yMode, uint16_t flags) { view->scroll.Setup(view, xMode, yMode, flags); } void EsScrollViewSetPosition(EsScrollView *view, int axis, double newPosition, bool notify) { view->scroll.SetPosition(axis, newPosition, notify); } void EsScrollViewRefresh(EsScrollView *view) { view->scroll.Refresh(); } -void EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message) { view->scroll.ReceivedMessage(message); } +int EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message) { return view->scroll.ReceivedMessage(message); } int64_t EsScrollViewGetPosition(EsScrollView *view, int axis) { return view->scroll.position[axis]; } int64_t EsScrollViewGetLimit(EsScrollView *view, int axis) { return view->scroll.limit[axis]; } void EsScrollViewSetFixedViewport(EsScrollView *view, int axis, int32_t value) { view->scroll.fixedViewport[axis] = value; } @@ -3048,7 +3052,8 @@ int ProcessPanelMessage(EsElement *element, EsMessage *message) { EsPanel *panel = (EsPanel *) element; EsRectangle bounds = panel->GetBounds(); - panel->scroll.ReceivedMessage(message); + int response = panel->scroll.ReceivedMessage(message); + if (response) return response; if (message->type == ES_MSG_LAYOUT) { if (panel->flags & ES_PANEL_TABLE) { @@ -3748,7 +3753,8 @@ EsElement *CanvasPaneGetCanvas(EsElement *element) { int ProcessCanvasPaneMessage(EsElement *element, EsMessage *message) { EsCanvasPane *pane = (EsCanvasPane *) element; - pane->scroll.ReceivedMessage(message); + int response = pane->scroll.ReceivedMessage(message); + if (response) return response; if (message->type == ES_MSG_LAYOUT) { EsElement *canvas = CanvasPaneGetCanvas(element); @@ -6879,9 +6885,10 @@ void AccessKeyModeHandleKeyPress(EsMessage *message) { EsWindow *window = gui.accessKeys.window; - int ic, isc; - ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, false, false); - ic = EsCRTtoupper(ic); + const char *inputString = KeyboardLayoutLookup(message->keyboard.scancode, + message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, + false, false); + int ic = EsCRTtoupper(inputString ? *inputString : 0); bool keepAccessKeyModeActive = false; bool regatherKeys = false; @@ -6945,7 +6952,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) { if (message->keyboard.scancode == ES_SCANCODE_LEFT_SHIFT ) gui.leftModifiers &= ~ES_MODIFIER_SHIFT; if (message->keyboard.scancode == ES_SCANCODE_LEFT_FLAG ) gui.leftModifiers &= ~ES_MODIFIER_FLAG; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_CTRL ) gui.rightModifiers &= ~ES_MODIFIER_CTRL; - if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT ) gui.rightModifiers &= ~ES_MODIFIER_ALT; + if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT ) gui.rightModifiers &= ~ES_MODIFIER_ALT_GR; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_SHIFT) gui.rightModifiers &= ~ES_MODIFIER_SHIFT; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_FLAG ) gui.rightModifiers &= ~ES_MODIFIER_FLAG; @@ -6973,7 +6980,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) { if (message->keyboard.scancode == ES_SCANCODE_LEFT_SHIFT ) gui.leftModifiers |= ES_MODIFIER_SHIFT; if (message->keyboard.scancode == ES_SCANCODE_LEFT_FLAG ) gui.leftModifiers |= ES_MODIFIER_FLAG; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_CTRL ) gui.rightModifiers |= ES_MODIFIER_CTRL; - if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT ) gui.rightModifiers |= ES_MODIFIER_ALT; + if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT ) gui.rightModifiers |= ES_MODIFIER_ALT_GR; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_SHIFT) gui.rightModifiers |= ES_MODIFIER_SHIFT; if (message->keyboard.scancode == ES_SCANCODE_RIGHT_FLAG ) gui.rightModifiers |= ES_MODIFIER_FLAG; @@ -7065,7 +7072,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) { // TODO Sort out what commands can be used from within dialogs and menus. if (!gui.keyboardShortcutNames.itemCount) UIInitialiseKeyboardShortcutNamesTable(); - const char *shortcutName = (const char *) HashTableGetShort(&gui.keyboardShortcutNames, message->keyboard.scancode); + const char *shortcutName = (const char *) HashTableGetShort(&gui.keyboardShortcutNames, ScancodeMapToLabel(message->keyboard.scancode)); if (shortcutName && window->instance && window->instance->_private) { APIInstance *instance = (APIInstance *) window->instance->_private; diff --git a/desktop/list_view.cpp b/desktop/list_view.cpp index 6a84a19..26701e4 100644 --- a/desktop/list_view.cpp +++ b/desktop/list_view.cpp @@ -95,6 +95,11 @@ struct EsListView : EsElement { int maximumItemsPerBand; + EsListViewIndex ensureVisibleGroupIndex; + EsListViewIndex ensureVisibleIndex; + uint8_t ensureVisibleAlign; + bool ensureVisibleQueued; + // Fixed item storage: Array<ListViewFixedItem> fixedItems; ptrdiff_t fixedItemSelection; @@ -300,7 +305,15 @@ struct EsListView : EsElement { *_itemSize = itemSize; } - void EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, bool alignTop) { + void EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, uint8_t align) { + ensureVisibleQueued = true; + ensureVisibleGroupIndex = groupIndex; + ensureVisibleIndex = index; + ensureVisibleAlign = align; + EsElementRelayout(this); + } + + void _EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, uint8_t align) { EsRectangle contentBounds = GetListBounds(); int64_t startInset = flags & ES_LIST_VIEW_HORIZONTAL ? style->insets.l : style->insets.t, @@ -314,12 +327,18 @@ struct EsListView : EsElement { return; } - if (alignTop) { + if (align == 1) { if (flags & ES_LIST_VIEW_HORIZONTAL) { scroll.SetX(scroll.position[0] + position - startInset); } else { scroll.SetY(scroll.position[1] + position - startInset); } + } else if (align == 2) { + if (flags & ES_LIST_VIEW_HORIZONTAL) { + scroll.SetX(scroll.position[0] + position + itemSize / 2 - contentSize / 2); + } else { + scroll.SetY(scroll.position[1] + position + itemSize / 2 - contentSize / 2); + } } else { if (flags & ES_LIST_VIEW_HORIZONTAL) { scroll.SetX(scroll.position[0] + position + itemSize - contentSize + endInset); @@ -1491,15 +1510,15 @@ struct EsListView : EsElement { } StartAnimating(); - searchBufferLastKeyTime = currentTime; - int ic, isc; - ConvertScancodeToCharacter(scancode, &ic, &isc, false, false); - int character = shift ? isc : ic; - if (character != -1 && searchBufferBytes + 4 < sizeof(searchBuffer)) { - utf8_encode(character, searchBuffer + searchBufferBytes); + const char *inputString = KeyboardLayoutLookup(scancode, shift, false, false, false); + size_t inputStringBytes = EsCStringLength(inputString); + + if (inputString && searchBufferBytes + inputStringBytes < sizeof(searchBuffer)) { + searchBufferLastKeyTime = currentTime; + EsMemoryCopy(searchBuffer + searchBufferBytes, inputString, inputStringBytes); size_t previousSearchBufferBytes = searchBufferBytes; - searchBufferBytes += utf8_length_char(searchBuffer + searchBufferBytes); + searchBufferBytes += inputStringBytes; if (!Search()) searchBufferBytes = previousSearchBufferBytes; return true; } @@ -1574,7 +1593,8 @@ struct EsListView : EsElement { } int ProcessMessage(EsMessage *message) { - scroll.ReceivedMessage(message); + int response = scroll.ReceivedMessage(message); + if (response) return response; if (message->type == ES_MSG_GET_WIDTH || message->type == ES_MSG_GET_HEIGHT) { if (flags & ES_LIST_VIEW_HORIZONTAL) { @@ -1590,6 +1610,13 @@ struct EsListView : EsElement { } else if (message->type == ES_MSG_LAYOUT) { firstLayout = true; Wrap(message->layout.sizeChanged); + + if (ensureVisibleQueued) { + ensureVisibleQueued = false; + _EnsureItemVisible(ensureVisibleGroupIndex, ensureVisibleIndex, ensureVisibleAlign); + // TODO _EnsureItemVisible may call Populate; if this happens, we don't need to call it below. + } + Populate(); if (columnHeader) { @@ -2432,7 +2459,15 @@ bool EsListViewFixedItemSelect(EsListView *view, EsGeneric data) { EsMessageMutexCheck(); EsListViewIndex index; bool found = EsListViewFixedItemFindIndex(view, data, &index); - if (found) EsListViewSelect(view, 0, index); + + if (found) { + EsListViewSelect(view, 0, index); + + // TODO Maybe you should have to separately call EsListViewFocusItem to get this behaviour. + EsListViewFocusItem(view, 0, index); + view->EnsureItemVisible(0, index, 2 /* center */); + } + return found; } diff --git a/desktop/os.header b/desktop/os.header index bf8d5fa..5f5e955 100644 --- a/desktop/os.header +++ b/desktop/os.header @@ -707,6 +707,7 @@ define ES_MODIFIER_CTRL (1 << 0) define ES_MODIFIER_SHIFT (1 << 1) define ES_MODIFIER_ALT (1 << 2) define ES_MODIFIER_FLAG (1 << 3) +define ES_MODIFIER_ALT_GR (1 << 4) define ES_PROCESS_CREATE_PAUSED (1 << 0) @@ -1556,7 +1557,7 @@ struct EsMessageMouseButton { }; struct EsMessageKeyboard { - uint32_t scancode; + uint16_t scancode; uint8_t modifiers; bool repeat, numpad, numlock, single; }; @@ -2419,7 +2420,7 @@ function EsRectangle EsElementGetScreenBounds(EsElement *element, bool client = function EsElement *EsCustomElementCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL); function EsScrollView *EsCustomScrollViewCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL); -function void EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message); // You *must* call this *before* handling any messages. +function int EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message); // You *must* call this *before* handling any messages. If this returns non-zero, immediately return that value from your message handler. function void EsScrollViewSetup(EsScrollView *view, uint8_t xMode, uint8_t yMode, uint16_t flags); function void EsScrollViewSetPosition(EsScrollView *view, int axis, double newPosition, bool sendMovedMessage = true); function void EsScrollViewRefresh(EsScrollView *view); diff --git a/desktop/prefix.h b/desktop/prefix.h index a01a35d..c6265a0 100644 --- a/desktop/prefix.h +++ b/desktop/prefix.h @@ -289,6 +289,7 @@ struct GlobalData { volatile float animationTimeMultiplier; volatile uint64_t schedulerTimeMs; volatile uint64_t schedulerTimeOffset; + volatile uint16_t keyboardLayout; }; #ifdef KERNEL diff --git a/desktop/settings.cpp b/desktop/settings.cpp index 53e4c46..80b17c7 100644 --- a/desktop/settings.cpp +++ b/desktop/settings.cpp @@ -17,9 +17,11 @@ struct SettingsControl { #define SETTINGS_CONTROL_CHECKBOX (1) #define SETTINGS_CONTROL_NUMBER (2) #define SETTINGS_CONTROL_SLIDER (3) +#define SETTINGS_CONTROL_CHOICE_LIST (4) uint8_t type; bool originalValueBool; int32_t originalValueInt; + EsGeneric originalValueData; int32_t minimumValue, maximumValue; uint32_t steps; double dragSpeed, dragValue, discreteStep; @@ -193,6 +195,7 @@ void SettingsLoadDefaults() { SettingsPutValue("general", "use_smart_quotes", EsLiteral("1"), nullptr, nullptr, true, false); SettingsPutValue("general", "enable_hover_state", EsLiteral("1"), nullptr, nullptr, true, false); SettingsPutValue("general", "enable_animations", EsLiteral("1"), nullptr, nullptr, true, false); + SettingsPutValue("general", "keyboard_layout", EsLiteral("us"), nullptr, nullptr, true, false); SettingsPutValue("paths", "default_user_documents", EsLiteral("0:/"), nullptr, nullptr, true, false); } @@ -204,6 +207,11 @@ void SettingsUpdateGlobalAndWindowManager() { api.global->enableHoverState = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_hover_state")); api.global->animationTimeMultiplier = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_animations")) ? 1.0f : 0.0f; + size_t keyboardLayoutBytes; + char *keyboardLayout = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("keyboard_layout"), &keyboardLayoutBytes); + api.global->keyboardLayout = keyboardLayout && keyboardLayoutBytes == 2 ? (keyboardLayout[0] | ((uint16_t) keyboardLayout[1] << 8)) : 1; + EsHeapFree(keyboardLayout); + { float newUIScale = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("ui_scale")) * 0.01f; bool changed = api.global->uiScale != newUIScale && api.global->uiScale; @@ -289,6 +297,8 @@ void SettingsUndoButton(EsInstance *_instance, EsElement *, EsCommand *) { SettingsNumberBoxSetValue(control->element, control->originalValueInt); } else if (control->type == SETTINGS_CONTROL_SLIDER) { EsSliderSetValue((EsSlider *) control->element, LinearMap(control->minimumValue, control->maximumValue, 0, 1, control->originalValueInt), true); + } else if (control->type == SETTINGS_CONTROL_CHOICE_LIST) { + EsListViewFixedItemSelect((EsListView *) control->element, control->originalValueData); } } @@ -496,6 +506,65 @@ void SettingsAddSlider(EsElement *table, const char *string, ptrdiff_t stringByt instance->controls.Add(control); } +int SettingsChoiceListMessage(EsElement *element, EsMessage *message) { + EsListView *list = (EsListView *) element; + SettingsInstance *instance = (SettingsInstance *) list->instance; + SettingsControl *control = (SettingsControl *) list->userData.p; + + if (message->type == ES_MSG_LIST_VIEW_SELECT) { + EsGeneric _newValue; + + if (EsListViewFixedItemGetSelected(((EsListView *) element), &_newValue)) { + EsMutexAcquire(&api.systemConfigurationMutex); + + const char *newValue = (const char *) _newValue.p; + size_t newValueBytes = 0; + while (newValue[newValueBytes] && newValue[newValueBytes] != '=') newValueBytes++; + + char *value = (char *) EsHeapAllocate(newValueBytes, false), *_oldValue; + EsMemoryCopy(value, newValue, newValueBytes); + size_t _oldValueBytes; + bool changed = true; + + if (SettingsPutValue(control->cConfigurationSection, control->cConfigurationKey, value, newValueBytes, + &_oldValue, &_oldValueBytes, false, true)) { + changed = _oldValueBytes != newValueBytes || EsMemoryCompare(_oldValue, newValue, newValueBytes); + EsHeapFree(_oldValue); + } + + EsMutexRelease(&api.systemConfigurationMutex); + + if (changed) { + SettingsUpdateGlobalAndWindowManager(); + EsElementSetDisabled(instance->undoButton, false); + desktop.configurationModified = true; + } + } + } + + return 0; +} + +EsListView *SettingsAddChoiceList(EsElement *table, const char *string, ptrdiff_t stringBytes, char accessKey, + const char *cConfigurationSection, const char *cConfigurationKey) { + SettingsInstance *instance = (SettingsInstance *) table->instance; + + SettingsControl *control = (SettingsControl *) EsHeapAllocate(sizeof(SettingsControl), true); + control->type = SETTINGS_CONTROL_CHOICE_LIST; + control->cConfigurationSection = cConfigurationSection; + control->cConfigurationKey = cConfigurationKey; + + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_V_TOP, 0, string, stringBytes); + EsListView *list = EsListViewCreate(table, ES_CELL_H_EXPAND | ES_CELL_H_PUSH | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS, ES_STYLE_LIST_CHOICE_BORDERED); + list->accessKey = accessKey; + list->userData = control; + list->messageUser = SettingsChoiceListMessage; + + control->element = list; + instance->controls.Add(control); + return list; +} + int SettingsDoubleClickTestMessage(EsElement *element, EsMessage *message) { if (message->type == ES_MSG_MOUSE_LEFT_DOWN) { if (message->mouseDown.clickChainCount >= 2) { @@ -562,15 +631,44 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2); SettingsAddTitle(container, page); + EsPanel *table; + EsTextbox *textbox; + + table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE); + EsPanelSetBands(table, 2); + + EsListView *list = SettingsAddChoiceList(table, INTERFACE_STRING(DesktopSettingsKeyboardLayout), 'L', "general", "keyboard_layout"); + + EsINIState s = {}; + s.buffer = (char *) EsBundleFind(&bundleDesktop, EsLiteral("Keyboard Layouts.ini"), &s.bytes); + void *activeKeyboardLayout = nullptr; + + while (EsINIParse(&s)) { + if (s.key[0] != ';') { + EsListViewFixedItemInsert(list, s.value, s.valueBytes, s.key); + EsAssert(s.keyBytes == 2); + + if (s.key[0] + ((uint16_t) s.key[1] << 8) == api.global->keyboardLayout) { + activeKeyboardLayout = s.key; + ((SettingsControl *) list->userData.p)->originalValueData = activeKeyboardLayout; + } + } + } + + EsListViewFixedItemSelect(list, activeKeyboardLayout); + + table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup); + SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes"); + + EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR); + EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE); EsIconDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, ES_ICON_DIALOG_WARNING); EsTextDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, "Work in progress" ELLIPSIS); - EsPanel *table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE); + table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE); EsPanelSetBands(table, 2); - EsTextbox *textbox; - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'D'; @@ -593,9 +691,6 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction)); EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5); EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T'; - - table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup); - SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes"); } void SettingsPageDisplay(EsElement *element, SettingsPage *page) { diff --git a/desktop/text.cpp b/desktop/text.cpp index 6e741ee..8b4b27b 100644 --- a/desktop/text.cpp +++ b/desktop/text.cpp @@ -2970,7 +2970,37 @@ void TextboxBufferResize(void **array, uintptr_t *allocated, uintptr_t needed, u *array = newArray; } -bool IsScancodeNonTypeable(unsigned scancode) { +void KeyboardLayoutLoad() { + if (api.keyboardLayoutIdentifier != api.global->keyboardLayout) { + char buffer[64]; + api.keyboardLayoutIdentifier = api.global->keyboardLayout; + api.keyboardLayout = (const uint16_t *) EsBundleFind(&bundleDesktop, buffer, EsStringFormat(buffer, sizeof(buffer), "Keyboard Layouts/%c%c.dat", + (uint8_t) api.keyboardLayoutIdentifier, (uint8_t) (api.keyboardLayoutIdentifier >> 8))); + + if (!api.keyboardLayout) { + // Fallback to the US layout if the specifier layout was not found. + api.keyboardLayout = (const uint16_t *) EsBundleFind(&bundleDesktop, buffer, EsStringFormat(buffer, sizeof(buffer), "Keyboard Layouts/us.dat")); + } + } +} + +const char *KeyboardLayoutLookup(uint32_t scancode, bool isShiftHeld, bool isAltGrHeld, bool enableTabs, bool enableNewline) { + KeyboardLayoutLoad(); + if (scancode >= 0x200) return nullptr; + if (scancode == ES_SCANCODE_ENTER || scancode == ES_SCANCODE_NUM_ENTER) return enableNewline ? "\n" : nullptr; + if (scancode == ES_SCANCODE_TAB) return enableTabs ? "\t" : nullptr; + if (scancode == ES_SCANCODE_BACKSPACE || scancode == ES_SCANCODE_DELETE) return nullptr; + uint16_t offset = api.keyboardLayout[scancode + (isShiftHeld ? 0x200 : 0) + (isAltGrHeld ? 0x400 : 0)]; + return offset ? ((char *) api.keyboardLayout + 0x1000 + offset) : nullptr; +} + +uint32_t ScancodeMapToLabel(uint32_t scancode) { + KeyboardLayoutLoad(); + // TODO. + return scancode; +} + +bool ScancodeIsNonTypeable(uint32_t scancode) { switch (scancode) { case ES_SCANCODE_CAPS_LOCK: case ES_SCANCODE_SCROLL_LOCK: @@ -3025,73 +3055,14 @@ bool IsScancodeNonTypeable(unsigned scancode) { } } -void ConvertScancodeToCharacter(unsigned scancode, int *_ic, int *_isc, bool enableTabs, bool enableNewline) { - int ic = -1, isc = -1; - - switch (scancode) { - case ES_SCANCODE_A: ic = 'a'; isc = 'A'; break; - case ES_SCANCODE_B: ic = 'b'; isc = 'B'; break; - case ES_SCANCODE_C: ic = 'c'; isc = 'C'; break; - case ES_SCANCODE_D: ic = 'd'; isc = 'D'; break; - case ES_SCANCODE_E: ic = 'e'; isc = 'E'; break; - case ES_SCANCODE_F: ic = 'f'; isc = 'F'; break; - case ES_SCANCODE_G: ic = 'g'; isc = 'G'; break; - case ES_SCANCODE_H: ic = 'h'; isc = 'H'; break; - case ES_SCANCODE_I: ic = 'i'; isc = 'I'; break; - case ES_SCANCODE_J: ic = 'j'; isc = 'J'; break; - case ES_SCANCODE_K: ic = 'k'; isc = 'K'; break; - case ES_SCANCODE_L: ic = 'l'; isc = 'L'; break; - case ES_SCANCODE_M: ic = 'm'; isc = 'M'; break; - case ES_SCANCODE_N: ic = 'n'; isc = 'N'; break; - case ES_SCANCODE_O: ic = 'o'; isc = 'O'; break; - case ES_SCANCODE_P: ic = 'p'; isc = 'P'; break; - case ES_SCANCODE_Q: ic = 'q'; isc = 'Q'; break; - case ES_SCANCODE_R: ic = 'r'; isc = 'R'; break; - case ES_SCANCODE_S: ic = 's'; isc = 'S'; break; - case ES_SCANCODE_T: ic = 't'; isc = 'T'; break; - case ES_SCANCODE_U: ic = 'u'; isc = 'U'; break; - case ES_SCANCODE_V: ic = 'v'; isc = 'V'; break; - case ES_SCANCODE_W: ic = 'w'; isc = 'W'; break; - case ES_SCANCODE_X: ic = 'x'; isc = 'X'; break; - case ES_SCANCODE_Y: ic = 'y'; isc = 'Y'; break; - case ES_SCANCODE_Z: ic = 'z'; isc = 'Z'; break; - case ES_SCANCODE_0: ic = '0'; isc = ')'; break; - case ES_SCANCODE_1: ic = '1'; isc = '!'; break; - case ES_SCANCODE_2: ic = '2'; isc = '@'; break; - case ES_SCANCODE_3: ic = '3'; isc = '#'; break; - case ES_SCANCODE_4: ic = '4'; isc = '$'; break; - case ES_SCANCODE_5: ic = '5'; isc = '%'; break; - case ES_SCANCODE_6: ic = '6'; isc = '^'; break; - case ES_SCANCODE_7: ic = '7'; isc = '&'; break; - case ES_SCANCODE_8: ic = '8'; isc = '*'; break; - case ES_SCANCODE_9: ic = '9'; isc = '('; break; - case ES_SCANCODE_SLASH: ic = '/'; isc = '?'; break; - case ES_SCANCODE_PUNCTUATION_1: ic = '\\'; isc = '|'; break; - case ES_SCANCODE_LEFT_BRACE: ic = '['; isc = '{'; break; - case ES_SCANCODE_RIGHT_BRACE: ic = ']'; isc = '}'; break; - case ES_SCANCODE_EQUALS: ic = '='; isc = '+'; break; - case ES_SCANCODE_PUNCTUATION_5: ic = '`'; isc = '~'; break; - case ES_SCANCODE_HYPHEN: ic = '-'; isc = '_'; break; - case ES_SCANCODE_PUNCTUATION_3: ic = ';'; isc = ':'; break; - case ES_SCANCODE_PUNCTUATION_4: ic = '\''; isc = '"'; break; - case ES_SCANCODE_COMMA: ic = ','; isc = '<'; break; - case ES_SCANCODE_PERIOD: ic = '.'; isc = '>'; break; - case ES_SCANCODE_SPACE: ic = ' '; isc = ' '; break; - case ES_SCANCODE_ENTER: if (enableNewline) { ic = '\n'; isc = '\n'; } break; - case ES_SCANCODE_TAB: if (enableTabs) { ic = '\t'; isc = '\t'; } break; - } - - *_ic = ic, *_isc = isc; -} - size_t EsMessageGetInputText(EsMessage *message, char *buffer) { - int ic, isc; - ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, true); - - if (message->keyboard.modifiers & ES_MODIFIER_SHIFT) ic = isc; - if (ic == -1) return 0; - - return utf8_encode(ic, buffer); + const char *string = KeyboardLayoutLookup(message->keyboard.scancode, + message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, + true, true); + size_t bytes = string ? EsCStringLength(string) : 0; + EsAssert(bytes < 64); + EsMemoryCopy(buffer, string, bytes); + return bytes; } enum CharacterType { @@ -4318,9 +4289,9 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) { if (response != 0 && message->type != ES_MSG_DESTROY) return response; } - textbox->scroll.ReceivedMessage(message); - - int response = ES_HANDLED; + int response = textbox->scroll.ReceivedMessage(message); + if (response) return response; + response = ES_HANDLED; if (message->type == ES_MSG_PAINT) { EsPainter *painter = message->painter; @@ -4418,11 +4389,11 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) { EsHeapFree(textbox->activeLine); EsHeapFree(textbox->data); EsHeapFree(textbox->editStartContent); - } else if (message->type == ES_MSG_KEY_TYPED && !IsScancodeNonTypeable(message->keyboard.scancode)) { + } else if (message->type == ES_MSG_KEY_TYPED && !ScancodeIsNonTypeable(message->keyboard.scancode)) { bool verticalMotion = false; bool ctrl = message->keyboard.modifiers & ES_MODIFIER_CTRL; - if (message->keyboard.modifiers & ~(ES_MODIFIER_CTRL | ES_MODIFIER_ALT | ES_MODIFIER_SHIFT)) { + if (message->keyboard.modifiers & ~(ES_MODIFIER_CTRL | ES_MODIFIER_ALT | ES_MODIFIER_SHIFT | ES_MODIFIER_ALT_GR)) { // Unused modifier. return 0; } @@ -4498,27 +4469,26 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) { EsTextboxStartEdit(textbox); } - int ic, isc; - ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, textbox->flags & ES_TEXTBOX_MULTILINE); - int character = (message->keyboard.modifiers & ES_MODIFIER_SHIFT) ? isc : ic; + const char *inputString = KeyboardLayoutLookup(message->keyboard.scancode, + message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, + true, textbox->flags & ES_TEXTBOX_MULTILINE); - if (ic != -1 && (message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == 0) { + if (inputString && (message->keyboard.modifiers & ~(ES_MODIFIER_SHIFT | ES_MODIFIER_ALT_GR)) == 0) { if (textbox->smartQuotes && api.global->useSmartQuotes) { DocumentLine *currentLine = &textbox->lines[textbox->carets[0].line]; const char *buffer = currentLine->GetBuffer(textbox); bool left = !textbox->carets[0].byte || buffer[textbox->carets[0].byte - 1] == ' '; - if (character == '"') { - character = left ? 0x201C : 0x201D; - } else if (character == '\'') { - character = left ? 0x2018 : 0x2019; + if (inputString[0] == '"' && inputString[1] == 0) { + inputString = left ? "\u201C" : "\u201D"; + } else if (inputString[0] == '\'' && inputString[1] == 0) { + inputString = left ? "\u2018" : "\u2019"; } } - char buffer[4]; - EsTextboxInsert(textbox, buffer, utf8_encode(character, buffer)); + EsTextboxInsert(textbox, inputString, -1); - if (buffer[0] == '\n' && textbox->carets[0].line) { + if (inputString[0] == '\n' && inputString[1] == 0 && textbox->carets[0].line) { // Copy the indentation from the previous line. DocumentLine *previousLine = &textbox->lines[textbox->carets[0].line - 1]; diff --git a/kernel/windows.cpp b/kernel/windows.cpp index a126058..d42f3ff 100644 --- a/kernel/windows.cpp +++ b/kernel/windows.cpp @@ -321,7 +321,8 @@ void WindowManager::PressKey(unsigned scancode) { if (scancode == ES_SCANCODE_RIGHT_FLAG) flag2 = true; if (scancode == (ES_SCANCODE_RIGHT_FLAG | K_SCANCODE_KEY_RELEASED)) flag2 = false; - modifiers = ((alt | alt2) ? ES_MODIFIER_ALT : 0) + modifiers = (alt ? ES_MODIFIER_ALT : 0) + | (alt2 ? ES_MODIFIER_ALT_GR : 0) | ((ctrl | ctrl2) ? ES_MODIFIER_CTRL : 0) | ((shift | shift2) ? ES_MODIFIER_SHIFT : 0) | ((flag | flag2) ? ES_MODIFIER_FLAG : 0); diff --git a/res/Keyboard Layouts/License.txt b/res/Keyboard Layouts/License.txt new file mode 100644 index 0000000..8c16795 --- /dev/null +++ b/res/Keyboard Layouts/License.txt @@ -0,0 +1,193 @@ +Extracted from the XKB data by nakst. +License of the XKB data (MIT) follows: + +Copyright 1996 by Joseph Moss +Copyright (C) 2002-2007 Free Software Foundation, Inc. +Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004 +Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru> +Copyright (C) 2006 Erdal Ronahî + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of the copyright holder(s) not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. The copyright holder(s) makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + +Copyright (c) 1996 Digital Equipment Corporation + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the Digital Equipment +Corporation shall not be used in advertising or otherwise to promote +the sale, use or other dealings in this Software without prior written +authorization from Digital Equipment Corporation. + + +Copyright 1996, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 2004-2005 Sun Microsystems, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc. + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting +documentation, and that the name of Silicon Graphics not be +used in advertising or publicity pertaining to distribution +of the software without specific prior written permission. +Silicon Graphics makes no representation about the suitability +of this software for any purpose. It is provided "as is" +without any express or implied warranty. + +SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON +GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +Copyright (c) 1996 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + + +Copyright (C) 2004, 2006 Ævar Arnfjörð Bjarmason <avarab@gmail.com> + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization of +the copyright holder. + + +Copyright (C) 1999, 2000 by Anton Zinoviev <anton@lml.bas.bg> + +This software may be used, modified, copied, distributed, and sold, +in both source and binary form provided that the above copyright +and these terms are retained. Under no circumstances is the author +responsible for the proper functioning of this software, nor does +the author assume any responsibility for damages incurred with its +use. + +Permission is granted to anyone to use, distribute and modify +this file in any way, provided that the above copyright notice +is left intact and the author of the modification summarizes +the changes in this header. + +This file is distributed without any expressed or implied warranty. diff --git a/res/Keyboard Layouts/af.dat b/res/Keyboard Layouts/af.dat new file mode 100644 index 0000000000000000000000000000000000000000..ed1b0bdff4d78a3fce63c1bbe80cb12b6522b6c8 GIT binary patch literal 4618 zcmeI0duUf>7{@<fWjM2>D3Y{bWtz=&M2VQCg&-v&B~qYeQX(dTe@GN~+q~@7<}Nnf z9A)$FHr=IN+%hj4g<2F9#rvKkf<wfzCWTZ8Qjb4>KUfFm_J8Ma-t(UKdA{d)zV8>_ zKhAd_x2}2Qu!aRp<~0`b2G6mCw^>FWn|YpDOyEgg;c1>>JrjAKsl3Y&(nx0nBe{qB z7{zEFVy=~Yl<{mMgGZRnORToYJFH|Cg%neg>^IO<69Ifg85QiHIucJUs}e7JQp<Rb z6^IoWgaWg43)IVlx?k7$p1-)x4K9F&DotaRp^IGNYkuT+9OrpJ-*T@)?p7`JG|)^N z9US8Xr|9Na4szB?X6Xw~bD3WlX&r`XxbD<=O;BdC-$2x6MsU+LNl$5trbXhZI#Uzz z7y8MjQ1Kiq5G&AEflJ8~Q?8ThRHas_S|6)Mo3vL4RI4x5tz6}6g;uLV?`eZR*Gjc( zjau}g=4h_w>1EB=0==q*TC7sd)-o;E4|+>WRj6V$TZhAHu;&?lrEdm#LVF^(^ZHId z$?04qp4v;0h+pg{n?l8NtU#<lUj>E@>AM=-`_<c=vOn~*eoN-B+y*yLr=byE|LB_j z)Ze<%PtEIzcv|GEfx5)`Sb_hy0%Hi92%8B%C2S#VC2S*XCp=2nLD<M7a{|&Cj%&lU z;_C1l@j19oTn9c6cLaABS5J`3UAPvU6)M6V#BatOz}4b&@mmNE5j4<~UCisaqqufl zGp-5Oh-<(f$LE{*kVPgL)^sAzTDdIlV1p6pYGMoz<LmKt^j3a=ucdnjuE@}jn>FFH z?SpiDIlc&Aj5kCHz7)R|UuJH`BG#F^Vf^;u_Tvk2`*3@3yK#s3j5@P5T($lAti^A_ zZzHJ0HyT;1_93o@8AiwLvTip+H`&dIvRh&<$yjqf#<AGkkDlz^Hn!R*;mxFiw$E02 zHr8{s<+zO#^j2-RQH8JIG4o1-9D*%YHrPpMTPPqbC1}St;g1p6-N|%<I%X1<6O<8b nCorb@1O@mGo*>L4EHI8;pCl-*jZ#cVRAkZ2M80ePe*ymjWH=w; literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/al.dat b/res/Keyboard Layouts/al.dat new file mode 100644 index 0000000000000000000000000000000000000000..00efdc820af7424ab345cb112b56b29e56aaf9ec GIT binary patch literal 4616 zcmeI0`EL|;7{)(OMN)|pCBzURrV4VFB8OlFs})4Kwa8&D2qIvMT*^&>P%Vu%ghGQz zxB`W)wSd+rHb5$w*(DkUB1eb^7?u#ChA74}D)F7|4p}A;`v=Tqzx#dPci!_!=7;ww zrt!(9fbl%cy*xrL1IgrZo?r-*m`E1)b2lC6Pe;0vPX=S@%rm6XjOL`%f?H|H?X;pb z{Vd&Gw4;bSX+tj_AkQqr7|Bz-z>7>v*89I}QNUpyFYz+7cqL%>)j0`aiLZuth(L%y z6A<_->9dcoIK_UpagYWMQG-L2!<^w8YT3gkwo^|P5l*v(6YSzkR`MF9l<@}TtY!^s zspLaeu+ef}WIY>rj}JIz+NXTZ5x(Ob=bO-z=ki;??=lzoo*(%sVE5Ha3E>Z44et<v z5P>Ejuvm>wS<2TK^-&A;Q?~l6o!N7gtBER5hT5ySTB@h+P#cX`y7JUoqjV)Te=<*| z{vl1xG(DkrR2L05X^;kMh$d@F(knIa`ttmM=Uh!yp=M}y!0t!SOxPFR;H~c!-XQ`Z z0;vexoYtrv(s`ZLVeQms`a;L_k$p+Wby62~LG?PIt$IhUYE`Fm+OBW4S6`dQa+Ro5 zWhys$jVkq)8dR*!rv0Lg_MiHk)(^TAu%*7gR#vhv-}<k9*01_qf8QX(p9%X-fha#Z zyh8*+1g?ibTYB1--kUzQsrR+*{Xw#A+wX2nKsvWDmxWBVoqHZjm`@?InS&eQQEp>0 zuO`;{>9&{`F~gQ~x0dIOMVP>17BPhdw(rkkrZEXw^f2Ba!?Jc`fQ9xj#$bh2aO!Bw zJw`dSH*(=VBN{w<p)*~0-W=0;nsG)#<QdVB&lsa3Mj3_RmeI*F<T9E;3^s=1NroD` zFdVm>r4+M_XN|@fXavP$MmdZy%Hkm-H2mT@!Q#t}-|*%vu+VtPZk&C@BE(l!*r~L$ z4!0h+0rz9v4HoQH6J1NR!Uml{G(xPz`*pzGhGWq?acXf6;OsDnmRd7T#0Ji}TE940 zKVG^Cr^*t<OE=ruLj3g|9xTrLIG<Q&M{9_!Z0u|=v1*)M)|53+hx<0}R<EN~UJ<tf k=UrlN60J56EyTL<3OhA6U?;DU{oVjJh7W~PeQhuQ0UChv_W%F@ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/am.dat b/res/Keyboard Layouts/am.dat new file mode 100644 index 0000000000000000000000000000000000000000..977f1f6bd58213df38cd9e9988028fb7e6829d2e GIT binary patch literal 4778 zcmeI0ZD?0z7{-6sO_EuLWF+ZeF&dgL*}GZkuoT6x#L(W~BvC3WQIcfUHr>?uu50L; zS~@p#tu~j_*=+C!NfM*t+{ZAA-Y6=hLJ~uY9=H8t9UA)459fS1_j&H;I`@4&KX^Vo z&rUj@dnuui>5Sw79_BH|@+40&n`M+Tj`3W>4NT)^Zs%2o^Afl6B1SKIb1{ACM}Gz| zkQ}Cja`_CVl3enb$Ykb+%+t)}1y-<{bzS|=7HSfLH>hAERcuM*v%~6+kJ{`ojVXbY zz&Q|@rcTi*hACfv^EuK5x==sTM}5^#*XvsS%yB;B3r_PD-!nu`p1vVh4K&isURpUo zI~fl0At$NllTfliA8~}=I6+S6&|g>RO5LPUx~;3<*{t1@&`s7DjniG4l*ni6Oz6l@ z?O`^nN@GeOCD5I~UtK$<Mo0Cjc4>(k)Tm}{P>WjCrZ06&mD;3Nv{ZE}*IGp?*2h|< z!@6G&=}|qQnVO|JdREVCp0;Va7O7CbXn_{0T3dA}bZA#b2lchS(+}skL;p<Z{?Jc4 zu3vQ`k<YH>_m2GO9%i$uG^PYn0^JGJS?6eq71<)Y&qmk`d(a-SJM3|rX|t@%7F&Vc zX@l)Ln`$@OXnWa)+Csa<7MNKt>us0VrFNNJZUbzf<=EYZ<%gOTmTP%7!6w<fFq&h} z*mJhrR@$1be%(F%-}m-}ZmX@gO513g6Z!1FRUP>qJ<MiRX-o;E1iBL#L|le95toN! zeY_ms!nZ{=`0L@sAD7~F`0jAXzX)$8UW{+U58&_N`-n^Mck!M0TlhP~#o;2r-^V|| zx8pnTH}Mv{9&g7R@%_X__+~OevkMPRTJb%2E&ev~61)N5i?=b9s~EvB3PQn=^a(c( zW5_fy2(QG8gTD%{4)5A<(GV}is~Cd6Mil-n306J0+(5J&UxkON%kcF??L_;CT8V<Y zb!UvOz*iGB6YU{t!pn$)tu=VCSdOp7tI5<8?I#M04O~izT8P^43Zg(D^j-O{(Eu;u S^!$Zdn6!GnLe13v*XcjjJ&7p* literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/at.dat b/res/Keyboard Layouts/at.dat new file mode 100644 index 0000000000000000000000000000000000000000..e34763cafa9ce8e7a2d62be87e55b851d59e151c GIT binary patch literal 4672 zcmeI0`)^cL5XV2?i$Osuii*Jov4|iR1O&8LTWb|XP!z4Ah^Q!tprD|DRkQ_K6@0XS zP_V30%a%uDDGd}_pyAwIqtOtehNw}4t0BHZj8Q{EG)}kOhOQ6#2i%*?otbmy%*_4X zoFC?!Ps@|RB<|vB(#R%<T++Fo8yLeBCNr2J^yVV2;$jAJH+{%s0Jr0D3Y|HPu5{xJ z&ZGzDaD}DoMJhAsY1S}CaGU9|++yzsn99SZJMzp=3YyDwX7U(MB&{dh*>PiG!VPqQ zK!8985IEKvQ^#j~N<HQ5rjfmbX<|P<U-AW;*g_d0cJMZp9AX_GQ^7%AppYdL^AgK= zh1V!y1+^?<wdFj*DtlK`!vWJ#-seNU<}k6=dM8uAB?bJ#cYM!}98FqJxIf2@KN4=B z0|WvDI)K1hwFKpAj%H|#`f8lUYl24DdY&d~f#xYgnd+_n8m)mEs#)rzX&R)d`V-Vi zoz+F%)Lm!kY@Mqd9jBL4^`g#;XU^7?)(Vr9uSF_s^-k8>8%c4cD$>hZuGf>+6M0^Z zudn%!-9%KN0|WvDPDCKfYw><kPp`Z8t3J~2I;P|L%5KtM!n?pb-#e^t^_~vus6Nr> z>fwE$)4fAF)eC8ZHfoc$sz!CHSEKgn2bC*gX9s)x<9G2$+l}nxrFs3l0j>2;?BU<+ zQAu$ly>xGgH_RKJwBG(~=Kt=tj}5#4fdGM2o6#?4xXtM!ZFaws3`Q{&|1BHqyYM6n zn8sY5BA=&ulsPtj`+JNVNZ~=|*(^VuM{Lrc$t;`9{hj!g#u7ZkLLOqi&HA%>oIzY> z{K2JMXzz667gCH%=xUQg7OvK4f;9T#s_19TLVw%2#Q23QuCd}1n8;}381jslxRaZ> z)p!KI+!Cd5EqBDpi5rcc7|S?r#$S!U6t~S-iF=HnxXzf2T*e#ckZGL7{cY8=ldHSk zxb3()+#cLsTs6;fFZbC9GdceKIYbu|TU?FXNwkVsaf!)FlNI>8@b~e&W%R>DoA9?0 zDJ8m`NEMM?@pA>+i50BHHR877D$EI)l$)%_?ZDNW6*gJf*5GshXmA6uqBn8x;400s zvqkGoEYH%4W&rJzU6ZwXU^CIemQLR#8pdt3CQFIb;+Nrva5c@17V}L*2)_ikh3GOO lVZ*%nSV5ghgNebh+0;6dG85~)0e=mCbEm7?x@`9g{|33Y7x(}G literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/au.dat b/res/Keyboard Layouts/au.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/az.dat b/res/Keyboard Layouts/az.dat new file mode 100644 index 0000000000000000000000000000000000000000..4fc4bd94c844d237378dac9ae1ac7ad7fcb3361c GIT binary patch literal 4625 zcmeI0YiN&g6vsc`xio8*w4_aI?w4Wa&Rm-N{XWKM?#!JT=C+i3Vo8g&W=V68g(1?~ z|8F5llDpO{t%bCZByrmIh^J)lym_7%&w0-Io!>d<`PO;y{cfZBi6x0d2GWu^1~ZgS z3}+;xna3QWi6Mg4^rtOR%p#KMv}YOt)TKUw1QARKjc80LeXLv<%~(kjn$nG)#9L%6 z6PU~b7PGXb-@nWjS3(-gSxpM-U2(@vt@=oJT+ez4cnH)2fqJS=Dx{1O{G6be+uS9e zd)(&%<-Fk%1svlPMV#S0r5xuK=Xk+RcC(lLWN?r}WOA4+ZnB+REBTRZa=6NMo|*TM zM?9f|cYLUB_s_R#=5i9hQ^{w(@XZOh?AI#4j_Z~y$#XpfJOutgU{B4)4Avse({M#; zq(*D3dT6{RYO<CpS-sRpZPZCa6|HVspmv(07$qr4!3t3$HCCvasHwu#OmPZS3$@aE zMJQ6S8lYL$Azlee)N-v-N-Z~ZhbwQJQkAAnN_WMbpV?9s-}RSMC(E-Q0v-atBM=f$ z?cLT}mFu3)>%Jc7p|0tX9_y(-=)G>}rcNtgcXd%$RH3taqsuDOer4#OGIdy4%2tkY zbxg(Dr<1mY-*jAgDwI#9<~`R-m8epm^re;?8dNivGi&{TullYZs_Tk7=c<Ya|K-%l z@~nq|hrsU$gd4Z-YCOF=J&ddOqPH>lF2?@*8?SF*jN5m^X!{!0l13`YM(bDME5Lu0 zh9(T8FrS4iGFrdHi2XAB`P@0eY-X~N4JI9|V=gO<xcg3U>nNS+K%|w9qMzN4HrXKE z+7#szPIFrDdPg3yrZV(36`}*}Okqf})IcWU%Qit`5>rfeh{u0{@unvDGV$kFnK;uG zhA_<3iV=)5y<&{17R3kHYV~K3U{c0Z1~JYA2;VMl<<Rlh3<KOV{0AI1yJz?hI27gm GImA!A(&07$ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/bd.dat b/res/Keyboard Layouts/bd.dat new file mode 100644 index 0000000000000000000000000000000000000000..7fb05e23e35f4859d3397d5fa6b7c15ae7abb002 GIT binary patch literal 4673 zcmeI0{ZCF|7{|ZYvqfn!45N9eC`sitQz>I(V`F1uBxM*jhOL>ABuP?fBuOQ`oRcKI zNhN8GVHk#Cn1^8)#)dI#^F2?Uvz*rI4>)a~u9y3|ulu^c&(1G*E872}k&8@hL@+jE z8)C2sI}wX`6r%u3unbcWhIN>O1;|DaGB6LRu%Qq7p+5#;C`MouJmHPiY!`q@sKf+J z#7e9}3NwjFLNZEGhVqW{dNR$Xf<{!J8nvi5<@K=6;k4+XWi16P1$v>tc4;pfAPZ%# z43m#=m(k)SZSWC436!O>SVWxUHNIf5e8(Tmmv;!4p9ql~xP{xei+gy0hj@%9cm_AQ zj#q3MCC~8^F5)UPdBRkgE;D4gtdNL~^LiR>i>YptM9LajD;rFCz0Z0_erq?YdX;4@ z1uO+REAYGHi>ai2A@!n2leEY+DU+LWNA4TnQz5-tBYH~jk?fFN5+@0gBq@^aSUV~e z5+nIiAnzqha*TTYM0=NvzGAjNOqJi{t$dJA^3{~r_kDKce|58}S6S9lz*3;I0%5lH z$c=WKZ3zDl@5pHRk%r%w-asSrFg&1*-<%k+tL?8iG4eAqolon%A8gtmWb?K8+X8LV zOnJTIWJf-<n^nEavX%mt0-Y6bhh0@kDLG5Z$T?C@&XWpqfhh3DEI7jjcI6~tPB}wZ zubd`1B$qUh6Rgig1R~)^Z$H_`>{X(5O`~ll$4N0!5CR`W^QFM9uueTp4$`kAoJy%D z6?{twKp@`~#&8ZlgtBuW-yZgIrq(LB!vnM7g|QgN2MBMLjfXFySm?~n32dm1SV(v^ zrGT6wc_g1?b3G5cvBxp4HoUeYo+}ifL>ut{$s#30<r9e~;`lgXSG238l4SbTq=;N1 zbsR7Z;l{XO=5g(6Ew^1Hb)<%Ho64IOYezTWO?)azYu8)l;A$e<UeN|rsE=}pP$QKZ zm1sjHk;{zJX|;hGX^)X3q{$c~w(A($)HRw)YLVminl>qfH&UyJ_7i8445LY_@_(0q D)ptP$ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/be.dat b/res/Keyboard Layouts/be.dat new file mode 100644 index 0000000000000000000000000000000000000000..11bfb53103d6e96c857ca30c45c951ddba319a1b GIT binary patch literal 4641 zcmeI0`)^cb5Qd-k0I621RRqO~2m*oyxhi0_mYWEQf+&hskqU^4f?Nay<Yr3%FO-G= z3KffPX|1GyVC7QvJG)}kG$A2G4N<dELx>teNHA)Gv)gXdoY<5<;A}GA%r|Fl`<|R1 z=3P$xFNded=PqtyD8m^^KSnW{dznfB1GtqN>B*gB(}ySN#$)v6Q9N3c#>HGh2AQ;_ z9oI0#%5|bMFOo$^vj_38onv``2bs<co~v)y;<+Rcv5=X}W)3e0{Hg1_r15I%8tM>% z5P=Io;NOOr8cy&Xhj^b_KF6_(C|~jwKl3Bi>|r|*4zQCdexQuwRC0_$R<nk6yun)( zQ^H0zv7c3xTFp~zVXNtnIcn$Ed`lg1e&M%<el4lL0s&_^$?yEhnSeiaJ)JcEPF+JC zA`l{Q0SK&7eb5Na)HIDz7md|8P0&E|Pt+tkXKS!>)KT3vN<GzAGt@~1>ZQq&TB(iF zl&%b2t}E15?KDj1>7Xnv(AAcktGtH#kZ;zU##>9H6$T<#XucL{v6cn=sX9xO{?*Mq zO+|$|L?A?<DFWAf^|#~tM`v|H2lbQU`c>c9mvmC6B=5ZHbX5CPtMB!Nj_90fbVgB~ z)|)EUMs3#HDpi>xs?<k1rq{LCaxe9&1K;8wYVD;pbZa`n|J&CFBHMfE-eq2<cU8cj z%Dyt`zpk05si;tg2!seUMIejr_!V@q#lHux9Dk=R@4o5nw($4nB3tjL@Cwsx^`6Hf z=JPDGY!UBjEB{N(HF{t=&m`CS=WRiM0sm9n9^5__u#l&1TQ4vspcgsZZtTI$++ZcM zxx<qCkj^smx!pz-^rOF#3<Hg3xXlQI!A2tV#Z@!e+7C6ZVWe>f4>8G@gwe($jI%l! zjAsHPxZ7BYdl+Lp#eK#xbi?h%?cfpPCWbSSVcc(w#x2$>yRmm}u=f)3jNEXCaEFcB zSj^)lON|Oi{PR3wD~YeH!tEzkPP}NnNr}k@VkP*s7W{<O^CS50;#U(bCbo`fInkO# zrnAHkaR+f_#FuY1*=A_CPa22G4-VtrBVPDU;y-jX!!ioDnUoTLtt^3*Vd6fs$?7VI ztw>aLyNE?_AJ|C6M0XS0fM1%Js3`d^*W)UQttA?<x17kRGVF746*kIdlPw02JAl6l IzuBSw15NG%ivR!s literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/bg.dat b/res/Keyboard Layouts/bg.dat new file mode 100644 index 0000000000000000000000000000000000000000..285ace10e8915cb20f9e78dbf8eb750cd13e8aae GIT binary patch literal 4770 zcmeI0{cBfs6vtoZV6m+1Nitl<e8|##SZdlTTZxqziIG%TBV+U+_JCm+mUZXWY;AMy z!Rd5!Q`^>bbIn?&X4bbT3ZwHWii$$IAyFYng-{6f`99TmUmE%c+%NZgKj-uQoclTN z&kODk=Qfl4&EaXDWFBL=odw*<G!}6Wi+Pr3xQ1)FjPcyU1g7#7c|67>mZA*dOmY~? zISk``E@U`2`Rzt>DHUAIC0x&qJmi%kmQc*|lu(u|cgp*wtc(WMQb{#+S$cX}lL$7a zr_mS@hzOhpftw|n^b;dxxE$jnj`KSw_=-O{$=~G3DEWr(c#lu`g-`i{5%K{Sh%rpI zv4eIx>0%c>^wLK^M``7d-*SrV;{Znp8R{#joFO?fR>sSORJ~JKo1K+cAd@6trpc@< zJ-yG2gkCtvYC0<#BLWeDOajMJZ%n;>DDO&>tdM4DmF-e0?b0RPa#%i=a;cEVWu-LA zDhcF$SuO`<wd|K$WuDBJ1+q{U$-Q#FJRlEBt<06BvP`~}VtGWWq(=7o3ca#N`sFkE zT)sTbH}vPMyrc59d@o1j$1FX4mLC%OuY;_nv!XE~5D~~E(5lJVTwSTlb-s?%J9MGm zrPK9pU93gAT36{zEznVVh2EwUHD6cgXnjH_>oWaK{*V*$mz)%Ii00_odY;bF<C5$5 ztkjEigx;Wq`lz2R(PDjA11;6^RJ}|O{}*q`%G;<Fx=z>YhAch(Y+XWc8Duq`6^#*r zh(IQRT(0)L{&Z&eE`KJoe5YSPK9iZ^`}(tdm+wlke(WvWOSlSbKduCO1KW!$_x=63 zxGG!?_8RsM_9pf^ZVh%2+k?H0Tg#P%!B*TlY#;7rTs5u?_ab%(7hnglJ|>dqi(Z9m z@jFiSUld+oHnBc(8BL+r$8fn9uJcP_P)}Ia$T-3^-QJ|D#CBjCuua&jSQoY#+lDn@ z8?g>zopF;bSTD97+ln<}_1JdIi*;Bt*6F`&gn<usV@=pjtOt7qYsXr#Hf#%4`>#o> z&Ndlm7zS;gVp!GXqXz%);Bb(D83wf}oMF%u2O1~Pk^&m*!e0Y{R^t4LGJu9<-fRZZ z`-ts|19d$(A7lWH`2(bY#@Z4@pUd_d2O9S}#(UlQpVtx}CdtORCfSC8XX>qZ7}Y7b nDZc~Yn)l!hX24At&Y)XF%)8o+>&6X)8#kPSn=%~h80h#P_i}I8 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/br.dat b/res/Keyboard Layouts/br.dat new file mode 100644 index 0000000000000000000000000000000000000000..b5c938d8b0a82f880e2de2cb8ebe1357fe92de79 GIT binary patch literal 4651 zcmeI0|7(?H7{))>i^&`+!!pyUtkktMx3V<Tw3TI<rfE%0GcC(9HCv{(bZN4dERjva zX3SYyXSQT)x^jM(=RHS}5Dn=&qE1kRz95Dm6?LDpO+4=px<BB3;eMaze%|}J@9SJ} zez>jznw~*S;%SC(8xJs?T<+vy9$_R?d6sPMq9?r>OeTHFBZKi|F%FM5v?Ya9+S8FV zI&l;CTDxv^=Vfl@7TXWtNqawTF`8*i=LOrf=2;jh%4a68Fq`>-^Okf@Vzam<4cCx? zkbzb(aG|-ThNFDTHa?-AZ)o6icCm+j9OpYCY+)T0)KbYNj!@2FKIIVavYZtZQEWX{ zQo<@$vz4WMWcdk7Sz~K8F?%1d@cEt}`Pp`@d43NRo#$6ha+-62^Op2XV)JK98m=J& zAp@;oV6~cxay3u0G*Ue@N@Fxm*>*lbd0L=+4bVV!Rfa~Wm-=e9(lt|=nxRWv<{$pU z(+x^ds@kighU+gntBaN>O`SAYLp3ciVX~&!x~O^D^?{WHDvMR1LM>BK;5@n0s%w5t zt_`!0fslbLuZe?S)W-W)r?gjRbXMne#QsUY=?|rPDc&(1*G?VK3HdrKyxsa+2X$F% zwNC3*p^e(Ch^keiI{l<F?XbI@y?T59U~$O;F6g2<cxlbkuFre#KxKw^qu0gj>h%nq zCwI!c=GWxfFbf$78A#`D)9Ck@ZXd`X?lX;lzp4HH3^QHdj(irIl7Ex8C}3eieZOIj zKnGLt3wViHrpRCAHRdoEzlz&U;J?G$Ce#=4BCj*gOoVKPnq`n-4g2vNId(P2?1E+1 z-qn%Lt>n_noP|CKXCaF_%pvG!lgFDI@hB5`#@vTIMw!>}6ie*#L*`M$U5UrcQFy`} zg)#Uam}ODO6ecr*iDp`iHNzopVGOx4cPS4B=enJ^ZMf~Y&A3gtt=4_2!7ntBt}5}< zbL^I@#nlk2qOrKtVy(p*{097exO!Z*we=(T8}Vz2mJ$1qXcf^0Vk=A=SyQ(Q_Z4n8 z?n@e%S6FN?UfkEX9aqrVi~uR_Gu&RB&DcZZ`xUq?wp7wsWI*c@nD!gOtMEl|Ul_D9 zqILM?_?66vBP)*o6u&f%Ggd-0VjRcb<N0P_agGwO$_>_fqs?IXALCzzY=1Jc{{g$z B1VsP< literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/bt.dat b/res/Keyboard Layouts/bt.dat new file mode 100644 index 0000000000000000000000000000000000000000..95d9e2461a29fe31abaac58221c600f2963d562f GIT binary patch literal 4879 zcmeI0`)gKp9LL|Ew<bE8kb;4Nm6q1LEH9;{rgWpi!lcAX?LtX~MN(2y(v~h=+uD|z zE-#zSwb@*{bh+vGd>v0>Wny7cQi4x6Dk@4!x?s`!oaZ?(9~$}xoCjX#dp+OJ`}6*s z=a=s>WPT50D>mZ^T!W|Z44%VG6k!=wU?;X?7VgHCxE2d=BW^<zu0|bh!FmwAkcYnL zhXELf!5D&Jn6Kl;Vm$Vv0HZMv4`8ik%29<?Xoo{*CfpgHM{{-@!9E<oK^)GRkB5h% z&gbzkX%hz$2hPHQU6$E&gOysb-D-pEcDvK=vO=3{_uE5OZ51}oCRl&Fz;3poHo{8m zd|P6}ZLxicZ}9_u#tEFnU-$=R=h$_29OvoGdh28PHp!;iB8?ug$84dkwi?@zjdvz# zJ974IvrX1ujn<MgAD^=&ns4i7HQtr9i35oPT^)FwnNcrZ&&lk|wDscv4&?7Pm_s;> z(|HsBv{QD}zOg)hZ@=0!9<z!3$;Q)}w@yphKHG2a+W|XhhpZ=e+Y$TJX7gh^Y#=#S z5ehhxqd9{!c}F&0R}KHye>7*`e9qz=&f|kQ^YOd)Me_@~S&erkZQ?-UKvxIO?U5O^ z@N0g-HdeBO0Xw;d??(TnANd{Eu~z++Y>j4)>-m}Zgimr2pXOpd%Ox!4QkHNzo4Jq` zTK$8iEMq+z`H@EN@dJLyUwDGQX>>Nf-dSDo-kv>9@^79ZbLQjqf1`8rx>=2PC2itB z;y_mi1|jV>iPuHF*en{v8=_G(i7lc|tP&OIjXp>RMWR@|AeM=@#ZIwXI8h>A6w5^^ z^7X6~Riav~6gn+fEnXFCMU8k(tW%UywHw4nQ7aTZkjg+R1E~z8GLXVR3WFxyG^AY_ zMqxyxFCT@vm3SUgkZMJkp5!^naiN?QV!QfkUAvHEC%G=r{9d)yN-ymt(@Um*MM$Ps zvOY|5kI+sp*<P~!8c`D_=Oxlhq?br9fnEZ=Z1fW8Wucda{!P)W7%!=95pRiYI<Zx4 zh%EFwgf#hg#4gdU<SxvnR;@^<r8Y)4E#q|8a)oYZCSW42!sXgJB~u}<6n*Gp7-p%$ z%3BwDyI#m!CvROX?!nxsIuaF>iE{BWzAEYvs-=^Nz^m=ht<P}vw_=V)s-F*M!*gX) z5T+KM(14M;^(l-hQl6Dvl`H!qOv6xIj7#)#v962?a49asy(*u)59El~N9E+L(`VuI zS-3FN-pFSq;gy6}5`H66%}A*xt__oP`IHVqS3}XEd#a{arM=d@D(sb<Z^L9=a7|Uj MR9#kG<>~7F11am<y8r+H literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/bw.dat b/res/Keyboard Layouts/bw.dat new file mode 100644 index 0000000000000000000000000000000000000000..805cb06fea78a0d8e124fd27c4f6824ba9f93235 GIT binary patch literal 4600 zcmeI0XKYVl6vls#h?N!*yY}7`wOg}BZHl657e!H2)vT%#D<UEyB2pvLh%_Q1B4R~w z?Y;Mk_#o0mM8xS||I`g>`F!t}^PY2`d(L~F<bHUbWPUvD7{zcpQHwCT(2XYapeMbF zA)02ipc-}PKs_1}MGYcpzz_;im?9LT1Ob$!G-W7D8*5jYDomw36=_Lp23aM7ehgq7 z6PT1cFTarJ0wfSi95a~hs{7M;-yzALdeLLRW1s*GWanZIaf@plVFyP!#&Py>f|H!) z9(UMJCfnG_VRo^H8*Jwa8C+r+DWsA{I%`<VdN#6&ES9j<dcI&YTR6Z$E?Rb$bDZY^ zk9bmmJLNz=x^N$O#w*_N-c|Rf?|g?({?v;e10DkfU?5pPKp`5X;cBny>Znk4Rzr1F zcZDlP(Q2%w3Q|qARc+N*l&UIHbu~m^_{uj>Ar)3p6<2^tsg*ucL6tOBWmHbh6|6xv zp_d}mU*j}ElXB<fceO+pE<v%1(+tga)%|_qef6Zjy!E5J=rQ0ike7k%+&|`^ZtAKI zX`2q~h>j{l$8=mLbXT{vNBguz+m)pq+NJB-s>|9bN6VC=RHZ51daTh}U#A0FqRn=C zt_|9x{mRq@%TDTy&gs4$>ah=%_XdAHe{|tK=&4@nwcfkx{;%Kq>Yx7d){pX{$AHH` zUIu~)HkIDWbb5$s_qMd7y{Y}Cgqp4|&KwpnnFQvskoinwmg(=&j3JQm%rz|^%M?@k zaZER5-jVvI@S{m4iHRhd){keV`3TKuZmvNM>)F`+g+R+nm~sf^R2D(hG_#?$SqpW| zXvi@a8qkoj1}w&4Mi6c$LnI>^Mjr;6k+8_bMIc=n>N6*LnLQCfU$YiEm~F9?#b#kd z(cNr}Ze}+0w_#y){y93#J^I()&I()HNyk}*vkqtFe=P6p#!10hp3nY^-Iw^ae?6QG WoUDJ|J!kT2oYZ{QKehMw(cb}+naoQ7 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/by.dat b/res/Keyboard Layouts/by.dat new file mode 100644 index 0000000000000000000000000000000000000000..cd1edd5b620fab2b6358a767329684259a44c81c GIT binary patch literal 4725 zcmeI0Z)nz46vsc`!!Q*sv6A6R{FB-I(@a~Mnpw)okc^QrGBdF<Lox<}U}al#jnw7L zrmmLS@=q+ar8d-NHKal+&b1Jvv`|XKLMjA7kS@>m#QfFJcfR>OZ_d5vet-9So)6p? z=hV^mo6I5>GL>7H#&n7q%?wJI$r2WG7kAT-Arvu`k(4rk1&m-mMh;!*N_Tp2ExqW? z4cr&6>&s14(T7|na4+*><_YHT6faXoMZ4eSLTy5@no3@01*;PI?6x|ySeM<VF(r@^ zxB>!W)F%3c-s+*>_=3~?&RLwlILCQ%b)&xL2>Ut6NxtG+uG0a!=@4DCflV~9l@DlS zJ3DD&7ssh*Z@hA__R!2xej+D2T;L*7p89D(yWizX8=cS<Xpn{|Un3Iv>^;LW`NB?4 zv#K<v1X2PW2^?vEF-z5?MlI8ms?u^*YoThiMr+lq-73{0J*K%T*E3q69h#+Wny<~8 zpoyBK`!z*HdO#2AAw8^@G)|AIL<d!@N3>W=)DRu&RIiQNrxtyFg)j7QLie3o^`*Yn zH;H`qzZ}Zsf9T{it4d=^ASKX|K&iFu`r0%rvi^2KgX~tzx9&FF3T%`W+jQ$`z3iMW z>SmK&V^i(CCR>h8vLAI!KkKA^)hV5hFYk>0P_7---*G+L&gxHHZ+&cHbSSj3Hr{4f ziOp>H>sZ78t)EZmp0imt$L89ziG23kr!)B%Iyud%(wGuR33Mco#~qA{-Ts{v#y)=x zV`HyBGIsa(#J;{8zL!u*copA=@4;K}U4$yayLdBUSsV)VBvcTV;~(Q6;hzy+!4Kg3 z@!j|*gq4IE9w)p(c#Tkoe@dt&loM9qO@wN0k8_3o(Q_CD@w$RIPgolLTbsy>qlST; zsHkN;gBcfx2}8M!d}c>!SA0Fb1#iIX@VD@K{7rltUX8ECH)o3T_wh!2HNFbpfN#WO z?Qi32@LGI3UKSmFC%zTmgujDV;_u-f;x+gVhW}gKi^<|HC3m8{<*Ks#PkBjpSC3rl ImP^t718K2Dz5oCK literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ca.dat b/res/Keyboard Layouts/ca.dat new file mode 100644 index 0000000000000000000000000000000000000000..9300409adddd6396248ba13c33dde16e1043631a GIT binary patch literal 4551 zcmeI0`D@Q{9LFC|B;-o&xo<O@YwmOIb7phQnQP2#nA?)1r6nybNseKySu<<onB$Ek zNs^KzB|k_?N=hj&pY5BkkFVwr_<ZW~K3?zF=lOcSpY^WK^O;HIGk_FkGMG*bWjG^= zVKfPhV;*yer4Q}s!a%wa%`7@FgC0zy2DPY79qLh^hBT%LP3dQFt!cw@n$yyQo?`6; zdnYlUg)H`B)i)WwlnpFpC97EHi-)G^-e7BJ8uS4J0R#WRz^AI5A|CUQ5{^?!8Rg`2 zm22GKDNi_00mnE&F(*00Bl38_DekeGy=1YU103WK*&HT^LUxjCn6Eg(Q4jmBwH5Z> z<{8g<;l-+NKKN4J^OD!R;hirYn!fc0A4Aii4;Tm-_zwnlsWK^EbCs+iYO7%yp;79t zF&eA!TA)<*RE%1wy#}eHx@xwfl%&o|)EB<;jqm&b)l_ZORekl>XPT*n($q*z6sNwL zZWShKvZiXWmR41(eq))w%nYqiy4GrwFCIc#@5OigV>Of&^Z^3_1K|wZueve0DpsNL zbWq22LML@Zr*ua7wp!w4?AIY3Q?_zcqys9@VV#e7*N$qhvLdd8SFL`0$A@uKr7Bao zuKVI4q^n-s{bMzh74!iE0R!O-MA6qYdw&KHZ~A_aIRHaU?e}Jc>H4~CX1l5G47S=| z{Wj9s$R-+?65qlK(oBu7W({jilMkb_xdyw~VY)w)Wo%%*IS8@bD>TEPgTeK}71@_@ z<`rZawksuyj%GH*nXS;3QJ%5TgPtt0%sM17m+@vaq>##NCX;B^L<7c<Y=*=HCYqHn zg{fvh3}ug574yxc7;82~g4q(&>He#1_V2Pc{AI27Xk0$-EbbicBJKk2GOi4F6IX$| z74hh<0C$B2EQ(0LJ`+O=O%8=q;L33&xMJIjJ6*}aCI4prK5L|NhMzFH66wO9NIwBg CskpQN literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/cd.dat b/res/Keyboard Layouts/cd.dat new file mode 100644 index 0000000000000000000000000000000000000000..354ac14bb0863f10b29ed3d602b39c146a6c0038 GIT binary patch literal 4498 zcmeI0`%jN?6vto3Wnr<_)@Cjv5edmPDz{vdTq|;qM5J7bR4OH*XlZhrHM1B-%oZ~< z-|xQJm#^8(%*@Q1nVFfH`N7PbzCAVHhgE;T^Zar?@AI7ZInU?4JwKdxA<fSe*0Y)! z3}q&>nM)|q#1Km|8yL%Y0tjLn!Gy4uA*^I1E9gWQyy$^9z3{;oKYA0P?FQgaI(_NS zL?)A<nMEuijuf`A)tJ{_$TJmWlg18qvB#8eftl_@ehajsrGTYC2Nd{i)ZF7OuX(^l z9%9GAbspj535~p?j$71F%Y80$jW=B26<2sk38fsNjAK+#NfjqK#a)UyuRT9=hI8De zo)?Oq@{H%a=K~)*@J&r6KTUN%_{0~!^4*kgf#2MRUoFszmI9Un9Z(=qJc|MiJi>_6 zBvL~39AMxeBQ~)*OIPud9^x&%#7BI^PkPG)5g8!<GEe$QKN%zAB-~(xxntB{e9y_A zDBe`JMCM40#L6O5-jlVw&9|Pl7P1tu6gY1BV^R&A(VE{YyY!r5;I!8K|Fz4K)sn0= zd9qfL+Nu42hvw{26ZeqhNTC$TK~vtdM|qoXJ!>swDPSqkmq1*FxC$6X4tcueyAI$g z!&Ry)ek9%KuExMVwE=drn`|<5g-<5~=UIl+)4h>zWRq_8n@QE(ew%LT&MMY1NEh|J zY8_;e#CApyu10{rQU+?*U{)zLM2&-donX7EPC+PR)MXf_KEnj{48oYiX!RL_b^LS^ znWgT*GW8qcn8!l(5*jL4qa7Br)NNMGQM)3V`D#}zprM5Q+CG8hL=mrkMl4eqrNf4{ z4$n0Y4^U&nc2zx%2&Sk9V!MZ{TvJ1^SG(_Tuf=hK$A@uV#(qaf57rK@B64vY#dV3s pg45dER^z^!>0-7z?Dg8kUV@_%XE6=c*iR|naYQ+d1vmaB{Q;Aor3L^1 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ch.dat b/res/Keyboard Layouts/ch.dat new file mode 100644 index 0000000000000000000000000000000000000000..76f044ac99abe1bd17199f09113f68878a97b6c9 GIT binary patch literal 4645 zcmeI0|7%ut6vtoh%San7%S^@;ThlD7rB*9zep_mmWto=cm&`I(T3Tu?zl}9*Vwy5% zU$o}3WzXCi<|tj}Z1}m)Ls2l043P@y38@gN2$3SBbD!<8bxGPEa4($aeEFPnKIgt4 z?hog^oc5=H=}hGoaw%j4qqv$P#xRaq%;Z|Gqc3^f%mA+9A^LGY1DT9R2ItY8OfKL; zE}|#BxWU?Glf#qrHfxB<B$M$>U?Q`5jK|IE%2N_bT1+wXd75WK@wB@zWh_m*k&Y0E z5a<E|e{|%0$WgwgnQHd2p992b<sd%a@eMm^U<)<uVLLlG!kc_WEr%$hoYhpYmUX<s zMk=YIiBev-o<H)c{WkIeZKe}^&X*kHdw%G+@Bh@PP{MB<=VwmvODLXpPo|91X*bdl z0ucgTKwyK~lZv!J#Tu{6G(i(JNkc6@MN_pzi&UUt%29uf)j;KIp89Hz25Gj=fIMZW zn=+N99_p!H8l}JJt!%AG^)1v0%}QC*G{baB%I?Bgyd27`&@z>(Oshljbg%MMeEm62 z(^-*@5Qq@yj6j~(?j6+`oz^k6Dyif8Np1EeozO{Tc%FAihqX@!^{wLiLVv17r}UYA zSCwAVR#mG;wTh`hyVRs3s#LSp_V7LmeT%=Uo0r*fTjvS>+wK?2%<;0ki@i&{>`**i zeQ7G5dydm|R-_{YA_O`k(1)R1Z(I9~6mXMm_`{3?7{Zmd)t}EIUSKYZd5+~g&pe*7 z?b~l5i$_^vi+nLp*qT3|r)(|v_u}us)fq#ujHS$>#CH9KEJ$$&`Nk&XlFu~^x8lLZ z7nB*t;F{=Tp*%bE>$t)gg~7%y3`(&N-MNnkjeVGGOv7{@;7;x}9>L$q<<_8xDU9WI zBNgs2TH!A4#;?cUj@ylUmuW^&j4>+XHtsRXp^#g7<m~k$!`H85H2rZcxC6LGR^n=T z*fyBp?MIVXMRHXmZZC;Cl4~kWHk(wD*o^-vGb}X=KZgG{{%+!%NUSGbNBrZUaz)Uv z6!$)Ef6zAhVztRO1I6vZHJ_bnW_Tv|4#|qQf>#+}h80z8GpQl@Qf+`)@RqGMU|T(j za)Ze2A`!#AXM=4b-bA7bzb2S#P4IX4mAD2H>xjn;U@NephBFdZZ^LXc*=jJkPw?Ns M|7Ru_`}a_P1GV@BKmY&$ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/cm.dat b/res/Keyboard Layouts/cm.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/cn.dat b/res/Keyboard Layouts/cn.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/cz.dat b/res/Keyboard Layouts/cz.dat new file mode 100644 index 0000000000000000000000000000000000000000..d5ef361159f3c69e15161182ce22e103d1f0efc3 GIT binary patch literal 4610 zcmeI0`EM6h6vaP>5UmY0L=0g|1i@B8D1s;=)*@0Cp~}8ki-2shgMdImr~zdQ1vI4) zB#qFfK!IYAEz~gc9Svb|4<W=5Due)vVnT?K#rvIhNSQ$BA25@=ci+43-h1Ah<o$3@ zE|p(8Bgy7<o*{!C^rAhz$>c4@@E#p_k*8?IYqaJ$-X(=BQW-`qYV$COBvF@o)Tbd$ zNV9UyXwFogu+>X+_RIHUAVV0(`%J8ad*Hkv6fu{{Oy>hW4EclYEPt^u*hV&DAYz~f z4E$Rav!7G^$|1hw8xG@AipO^x;WtjRlQK53g@Y8cjgu7eGbQ}UCoE+-D_O;A*77;| z6tI`YY_yse*kJQl?BRQ}M>%fu8P4*%*_wRULP1wK&qXftSI8f1|MVBvgKcCZ1|kM( zz`$Zv2Bm4VMyRWrC__EeOKsF!nd+<Y8mo5dpayEHbTwB?jZz~GSF*Bn3sg(B^^g*j zs5*L7b=6rncwF^0LyuYIj_RagW(R1HhG>E&X-XB|gRZtH6gOYfG*h!RFXRvE%<=sn z-{&-lifqI{#6WchZdbjS-8!vbv`=evP~|$TLi5M;t<LI<Hmg`G^qKZ3UmJB&tMrrB z>xX;3wO#sD%k1P2|8%QLb;4gA(J`IVg?r{yzfZ9KFBExQmvlvc>srVk#Q)>_Z{FuL zh>C2)K*T_G1{zymAKQReNNgou0bV)oA>2aTQrr?=A%RDj#%xCW?e|<}GM*{c-n$1( zD@bAlGfW{E!&tw&pJ4sHw-cwBmziU|`Y2|Zt}vNNJWCr>4_eaH=2oU3B$<Mc$VUd? zl+oB^g?1)6Ja1CN3nn&nG~uAFNe&70WiZ|7#{iQX2GWx^O_E6EX-n@yf0HXR=<drE zZ<t*1qzMlx3^k#lD}zj|$fOUi(uv`BU~|H-%}6(`qJ=?alWbx0m~VHB|8f>NROD{Q z`5Ld7iY0kA*4kKuyAQXVw|U2kEg-g<Sf0O&>mpt*-Xg1)Vk$`%&MqsSY!LCX*(Qag z8AL!qYWOY*oG6KBcf;9%SA?_0;H-KX?mFBraQEWoTavpZ&aaz?vlVX{u_A-8G<TET cCdUVHN~l=4&PIW8;2emjS#kjE6y1&dKa*hWeE<Le literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/de.dat b/res/Keyboard Layouts/de.dat new file mode 100644 index 0000000000000000000000000000000000000000..e34763cafa9ce8e7a2d62be87e55b851d59e151c GIT binary patch literal 4672 zcmeI0`)^cL5XV2?i$Osuii*Jov4|iR1O&8LTWb|XP!z4Ah^Q!tprD|DRkQ_K6@0XS zP_V30%a%uDDGd}_pyAwIqtOtehNw}4t0BHZj8Q{EG)}kOhOQ6#2i%*?otbmy%*_4X zoFC?!Ps@|RB<|vB(#R%<T++Fo8yLeBCNr2J^yVV2;$jAJH+{%s0Jr0D3Y|HPu5{xJ z&ZGzDaD}DoMJhAsY1S}CaGU9|++yzsn99SZJMzp=3YyDwX7U(MB&{dh*>PiG!VPqQ zK!8985IEKvQ^#j~N<HQ5rjfmbX<|P<U-AW;*g_d0cJMZp9AX_GQ^7%AppYdL^AgK= zh1V!y1+^?<wdFj*DtlK`!vWJ#-seNU<}k6=dM8uAB?bJ#cYM!}98FqJxIf2@KN4=B z0|WvDI)K1hwFKpAj%H|#`f8lUYl24DdY&d~f#xYgnd+_n8m)mEs#)rzX&R)d`V-Vi zoz+F%)Lm!kY@Mqd9jBL4^`g#;XU^7?)(Vr9uSF_s^-k8>8%c4cD$>hZuGf>+6M0^Z zudn%!-9%KN0|WvDPDCKfYw><kPp`Z8t3J~2I;P|L%5KtM!n?pb-#e^t^_~vus6Nr> z>fwE$)4fAF)eC8ZHfoc$sz!CHSEKgn2bC*gX9s)x<9G2$+l}nxrFs3l0j>2;?BU<+ zQAu$ly>xGgH_RKJwBG(~=Kt=tj}5#4fdGM2o6#?4xXtM!ZFaws3`Q{&|1BHqyYM6n zn8sY5BA=&ulsPtj`+JNVNZ~=|*(^VuM{Lrc$t;`9{hj!g#u7ZkLLOqi&HA%>oIzY> z{K2JMXzz667gCH%=xUQg7OvK4f;9T#s_19TLVw%2#Q23QuCd}1n8;}381jslxRaZ> z)p!KI+!Cd5EqBDpi5rcc7|S?r#$S!U6t~S-iF=HnxXzf2T*e#ckZGL7{cY8=ldHSk zxb3()+#cLsTs6;fFZbC9GdceKIYbu|TU?FXNwkVsaf!)FlNI>8@b~e&W%R>DoA9?0 zDJ8m`NEMM?@pA>+i50BHHR877D$EI)l$)%_?ZDNW6*gJf*5GshXmA6uqBn8x;400s zvqkGoEYH%4W&rJzU6ZwXU^CIemQLR#8pdt3CQFIb;+Nrva5c@17V}L*2)_ikh3GOO lVZ*%nSV5ghgNebh+0;6dG85~)0e=mCbEm7?x@`9g{|33Y7x(}G literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/dk.dat b/res/Keyboard Layouts/dk.dat new file mode 100644 index 0000000000000000000000000000000000000000..923462befe68bb3cff9af4914f7bbf768b1acda0 GIT binary patch literal 4637 zcmeI0`EOKJ6vsc`r)Uu?h^A=@A)ultVnIZdeGvgs6hzU=rYI-~BKw-Mq{UPsrMOgO z(MrqKAhm%~wubv=NJt18Levm7WHf}RA#sgHV?1wW9w}pL`Ukw5oVoX$d+xd4`M%sA z&UY!P(Tf6}<bFERm;Mao4hA!nVN7BIcXAi)xryG~LKmK*1LL@rv3Oj`Rb+7u*K!?g zXv>ZCv~s!R@gh04>TdR!*>E1>5vK4Q&zskru`nZPF4LI7%go7$hwkj;VsYq3bHqTz zKr<NlJ)Kj-=bUCAo2a9nLsW5u299x-FWJE^%Gp9KAFz!xyvJu$aEd}!v4$dEql9(5 zK`CW?%nIJNn&0uJ{Z^ZuH1j#m3BKYR&Y9Po@pDGfMG~Cn0zYQNL-+gS;@8lP=7@oa zfo3qUR;i?cnyx7trcN56Q5vnD79XQ=nx&cQtv+h6&KjaF%GXqN&_s1rf&Stj&=qQ- zEVWX$TI+iC*PrAnPYZN|a?-U^H;gxL&SjDRgSRFlvrzN2NK3RLBOcaRmW&rQu^VPZ zbHqTzKw}2-yp(rFf9p4$RlUB}Ien`W_L9!)f;<oJq&`)x4(kgwD6T)WU%$xdC#}<Z zmFX>&>wRrig(|f}r&XdFJA1XaTYHkP@nZT-{*ay<-`?~(Cygu2XzR7`T6(R#HW~47 zKRX%EZDKdfisp!ch=Ilow4(=iTi1RMy|~vp{QFD;=uTJb>Ra+Ei+F*#%x4J;c!^i6 z`}Qlz=2_-hBR`Gl*5=P(rnTjM75)L-5pH8Ci<!zo>-A?dE2$lHGc}<j-K=UqJDhKN zL7{03u7-AWGFjnf+%`I!qL6Ru!tF`*A&W7LH}zqxDGg8a1S5IWbOgW1jt}N>9^gTf z6h@e+Fp7uqi}A~G+wGPDQzwR+jxmJMrZ@DZ50fw5Js|UL_aTFDADO6OxLqa7c!r7A zz8J9O$^Soy_-YcXt8shqkCG@ZHQQ)bMtoxs$;R!%--^GN*aqUS6WdPgKyb<(#qGu& z!tErna+BF+qr>gP)m;KK;Xi=tai8F7affjgB#JiU*M)WV;u>&O2JF;M;;Vv$0M?cO zd7^j&u^QrKfp4G=25k7H0lIhzu`1&>II$o99s2|WQlQEW)Vs!$Wrv@~RbLM2UqGG# A`v3p{ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/dz.dat b/res/Keyboard Layouts/dz.dat new file mode 100644 index 0000000000000000000000000000000000000000..63502e8d48480c1ad1cb862c6f98d9a80b059283 GIT binary patch literal 4797 zcmeI0`ES)l6vaPxf?5zT8dM^v#j;od%PLwF5U^^s3ZhjMP!vQ!76Cz7pDcZ?ETt_i zP%73^3Suo-1xitg-zgwb6B4($Mf=pK2{FWwNYtpOudSg?3H|}^C3ogKGiUB{zVG|P zJxi(oB{PAC8A5l4F`SX~A%#0g<#8UP9|O3CYq^>0xSnxz<so{Jj-wS9(3%Tr$3<L1 z2QKGExx0#Zp5_WV>-h%m*LXMgFq%m`$y4>=&N(h@hM3PZW-^<3&Gs9YbD|H68<(*; z#z2gL|G_{<s|W4pD?aBSCA`BS-lH7PVUF@G-%!CGwo=Lg%Gkvh6!R%N`Ir@~B1{&m zSxYuK<dM%_UZ6-WPq2|f&6OP2c#IGDh+4kq$NF&R96L1R)d*~FKXZz|X=|9XR(6^{ z_={gT$#0x*an>e^zpUA<#@n$u#z2gLmKgY<;ftAI*_LIKZHP^^88+KS**sfd3$4KN zY>cJbARBHIEydDojU`)#rP>PJywa|=E|y^3tcN99PwQ>ttdsS(fmUis)>nwJQU6Oc zhHSGH*~`&&OPMs?`>q-8Yb&uz3+zj)vG?sm+h^7Gu9ev?tFYttiG3EuN1EMg>NB>A zF%V;*DFfB6em%fVaTDEOcc~ldMz|E$-KDxTH_FX&(_NzL<=VTBZjkHj65J$ru^aE= z-B{iHMc>;AJ87rvwEb!Sm~;KyPu5l^%iMXcwdSO#|1mCI^IW&UEsCz2=Frk=-&t^# zuF!3DC2pO|bp>v@%WyBcGPlcBMDbN;xz$pH*j|i*7z3Tu@%vZR-uF<0-y6S^NAWxG z#UyeIaq8|TvXIHlQRn?U&oY%+>cYFK<9~*^(T;wKdirThSI0jCe}JG;D!~Gt;|b<V zJ(ww_U@*ya(Qdo~^puLwjwIT!O#Xv6=tN%$4E-fB43t<fNCLu55+8y+LdJ2cG>O}| zPa48l9^g*yWfZ|SIT+0ti4-Z^9u+C>lE9EgH-a|__VS?Qi4l?~hD&r9D#0R&U<Z-a zs}#T9eIzrtAzaUf;C%!eBDayu{4+CKN&<^`gvAm;#z`O<#(0)QN%3XWR_75}UQX?S zEwb0~hwumS6&%}we+yqFf4)>l+o-KtOC+?3qdWAt9sf3dH-|&`eFS3cHG+fGtmW7? zA{luE<plDz5x<|{6?J9t+Afgg$Tlj+T+Qoc8)UiSDUz{Srff1c$@0Z`B&$@>e?PMp zpQRLZBP3iX2cJn~WeGlv4+&me_bTG>87eE6phRgG%E~!hg;zc6II<qU0l%rPs+Bqt zq-u>^6>?NuRF&e3@Y&QT^8&mQ3Khv-qGk<8>JqI>UWtdwqOYQk=(<9JVj^MH7S?fC gwS`qzSn#l*VL1sa+pww%3m)37M7JycfB&6-0g5<fv;Y7A literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ee.dat b/res/Keyboard Layouts/ee.dat new file mode 100644 index 0000000000000000000000000000000000000000..1d81f07788d6a8e1f227e9049079711fffcf3a91 GIT binary patch literal 4656 zcmeI0{ZEx;7{@=~r*dSPWmzWXC^b_<%gVF}(JYIyEY0#I$}%k~Dl*?4p<-okU`9~j zkm!(%nYtiS(RM%QX*C<GR?Ss&?$lg0SDSOSYQ0?Nz+rgG#UJq8+jU>}ecjjF^WB~w zuJ3Z%*EnV~lPogGCWlFkU^3TnJ$cOKB1SQg^SP2CT*#daVg?s*8y+XpgEV^5i&Hs` zzMRQeOV^(PJiu9Yx|mCuW;&Otw%^0O%s1VgwK&D8kOk!PFps6!lh=a8VQKOj>JWht zfo>r1ONY-pe933DP{mGmvxf-p<B0MV`+187D%eCbHPrDruki`Bv{6JcYbfCv*7H0s zQpyH)u!?fa`5hZ=Z{%%0HvIt~+5Qa&IB2>%>qv^zPsBLH_Z&{KC$B#y4o8#MP=^SF z2y_F1GPOHRRDl+1iZYa|shXxSW}mK^TBJga)p(_Ah$d^8Mk!zCYQ9Ejp8nu3&<Q$8 zX*xx{)kmjmf_~#{oueY1p?;PlOL>V3vouFbv`i~H>iu79FQoWAt5qu28a<t2Pv$8} z*k3x%Ytk#!Ap#)+T@lFi+HVKd!~0u@6zB&X*3bIF{-h&1s$O1CZ@<3QUVW%<wNIbQ z^PK)vn|@chDpjo-)heO}ZPgAn>3}w>)nW&DE!uU=-}tNgczwNo9re2Q@L%WQDSkt} z{@y@ukT*ERo{Y^%*he1cHR%=V5P=YZt_Y-a31e(Zzl_UmcE5sgjJK(Mq)qiF^EgYm zpF$R~j3;@JM{WA{cjGtFn|VB8v-|=U+N7V)LpGWF&G>Z;V>wH?kHt3Y7w|}eJIFLP zA%jfInq`rrjV~zTYTS0xInQW?!MHkx8ly1U*oEQtGQq0f${k#59K#G|aXU9~i}474 z75*!hVItEL?8Fq~Cvv%woAAr=*IJd?#!g&gJjNt$Hpby9V=V6Oteu@&+r38)?hPX~ zTq~}T70lr-8(-!cQ4#<A9D>!vRyX3B3F?WhD>Zr9WCMN+{vKStrSu~NoAI|1EhBi2 zXg$%Ecwk;Ur6mr`Zx^nX*i%&|)rN{|G9a>9+1c94f3>!mSjp?{&BaPAuB6&z6S1|m zaopTC++Kq^jkYZW#qsQJD?tSJrnOf_bUS_p{-$_)>j-M_OK}YZ>xo7T=XgXTL96xP bwpdRUCY6Sm+ll`w{=4j}>}<_Nj_vIqhoTAO literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/es.dat b/res/Keyboard Layouts/es.dat new file mode 100644 index 0000000000000000000000000000000000000000..b6afe2acd0e5ee3ee9d509b0178f19a39860642e GIT binary patch literal 4647 zcmeI0{cjaj5Qd+3C5=@oA|fgn%ZI2`K~V&;RzMU*5d^IjD~cj0C<r3ov=(epFr)<| zAQS|o*Gd(tsRa=m&)%Dmkf0%I2vI|>hNvMVeut>h*;`iYMw0sn>`7*4&YYP!v+rhq zn0EoKYart(<_3ClBR4UWE4i6l7{LTe>BrSv%q3jUr4&#?ckbbG#^TYA98Tv9+H)3X za}MV+z{+*yA|B^F&NurSM%(jtlRJ5sN0?+*Hfv5KXcm*1%9A`D@rT>#8Dn0!jdhGb zj6fC${CYCxT|Va^&1_;fd)P}oEqsK}VGgmKw^+|+n%GK$PpRb-wsC-RDp*PtFR+}K zSV=XjXk;<#tmZeo%qymMu-~33lYM-_R~#`boAqNP=s0PP@-4?A{&4$!#`rnh#yUnI zMj#6WR;V?oNYgY)!_`eAG*Y9~*ZgBNPBS$_{WU;cl&_)csXm&b3p7!^H9^1gCx0QG zrX1z!Oy#MA3Uz``>a6+dXcY!&uu4rAt3=~X&o;?!EsI1h)m$yqVpT-^VYTv%|HV_B zhEcJO5r`3Ji$E{0b$3{JCv-$D`dUZzoj$fd>6nfy$7|;u)Mwf)r!SS#e*K{j^qcnS z7gcMu*63Aj&}({KZ>T{#bVw`JY`Go1chuD8Z~Q?&Dc5U%^0u}e{J)(aiR|We@H%;& zy$d7$FuO~}-{TagVN|SR1Y!i*BGA=l`~EhiUu%>5bqr*XP5D>ZobNW<V4urO=JFV` zn9Y2i<q2lk0A4^I6M4o)`N>SNL4PXKY%up5aqr_NSin3UWsc4I(|L+3=xba;AM)*4 zK%u4fGrpkQSO(W<L_v3Y;F{@W>_Trlxy*QlfPZi;cKhAjXB5O(BOC7LUZW63GsX(# z896bI;oNHE#BGe^4kH%)8r+-s%Z$S)G2Wt>Vcf+iV>1Tx&_8z<Mekn35TiTFaC>nL zEaU+mwBe;R^WH;9Eg`+60rwuM1nH`3lhr1x@OR;Vm<i6qufyMjzmsGQsTCv>BzFaw zWmc}#in;B$J-98TpW9$kYmm66;Dtj#7Dbyf+|!loaa#?ObfqO#)|zZ2{rr{yF}E|o zrp$UgP*18NDDB=RRfpSV&DD@>#9xcQ(aQQ&xCDN608MH+$vQ*WGJ?hmDZ<rTLu*ae S8CJoUTZ8{^U#{-Ijr|P_-ve&| literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/et.dat b/res/Keyboard Layouts/et.dat new file mode 100644 index 0000000000000000000000000000000000000000..e5556fd58d71a7c28fd98a60d969520799fc5883 GIT binary patch literal 4845 zcmeI0eP~T_7{|ZQqh<(2O;L!fj4@&%o0mceA%s}o8ciWDO--(%&V8$?sVmB5vt2g! zioJzK5vvi45!s4ZA&Np?zUSO~b)C8KCv{GJ&hvY|zwhrk&w1+nbD9ypHX?`swqgpl zV;6F<5P5LnAVMg@5-i7fWMVUBVjhko9R-+;d?*so6MfJRNf?O17=~o5XSp#*Lp@S3 z8mq9@DsRBYScVGJgdg|E`%RnUI%?5~%V@Ic(e$ddxD`#E=uE(wz+X&Yr-V%-7#B;b zbYmPR6QwWXWNUAw^p^qhowkwEU3$qfstd?mxr<h`;R)LD9Ix;i@9+V`r3GK<T_>OL z1%qUW%%V3#W>~d=HIewI*0$MvIg%wCWRq;M>CrmbmcAp-Zq(&OX9CUyVka<D!`UNA z(mvWD74kwl<&9jI_wrFb%U~U-H>FuZQX@~LR<24vEt8(wC<&S?dE%0TVu(-jr9c95 zTpr3EDUxDI)1aJ^J96LpBEO09Im0wrQzFlc?csOpOq*|tj?wWtK_}Vt=-G5jpB`s7 z>T;qp0cQfS6X=Y5F~=BhXrb<9EYVUu#8__awWwSDx|{10x=#=2ZLY47D>_H#>mpsM zD|EGH=?2Z#96hSDbSHNo=r-M<hxLdyFss%}yqnj(NDOE3?=Nh=4sF#oeXP%HdbGk5 zOMe+>H|lbtGXZA;u@e}CcK;c2mXwk*a*muQ<)ngCk_MzA1BvK?cDD=dUITCIc+Lnh zr^g#&et}eyYWnjDeZCNSQz@a-beYu*s>CpNiH8*o=KfQpn4SQ&Agk6=CvL7itY%R6 z7m^}U!oLec+0iIWW&N@I3$dTwHC4iVoho9sP(v<|i{uhvF@GJYCymJB;Y60tXM1eR z7i7Fhst8Z|OpPZzF6#x%CfSIWijR#LY{+BQJ4sHX!^PZd?wi%9yXp4?FzsiXnO)ob SpQoPJ^>zNmsW%n>+UE~ph`l`k literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/extract_keymaps.c b/res/Keyboard Layouts/extract_keymaps.c new file mode 100644 index 0000000..9839ffd --- /dev/null +++ b/res/Keyboard Layouts/extract_keymaps.c @@ -0,0 +1,329 @@ +#include <X11/Xlib.h> +#include <assert.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +// It looks like ES_SCANCODE_PUNCTUATION_1 and ES_SCANCODE_PUNCTUATION_2 are mutually exclusive +// (_1 only on US keyboards, and _2 on everything else), +// and X11 merges them into key code 0x33. + +#define ES_SCANCODE_A (0x04) +#define ES_SCANCODE_B (0x05) +#define ES_SCANCODE_C (0x06) +#define ES_SCANCODE_D (0x07) +#define ES_SCANCODE_E (0x08) +#define ES_SCANCODE_F (0x09) +#define ES_SCANCODE_G (0x0A) +#define ES_SCANCODE_H (0x0B) +#define ES_SCANCODE_I (0x0C) +#define ES_SCANCODE_J (0x0D) +#define ES_SCANCODE_K (0x0E) +#define ES_SCANCODE_L (0x0F) +#define ES_SCANCODE_M (0x10) +#define ES_SCANCODE_N (0x11) +#define ES_SCANCODE_O (0x12) +#define ES_SCANCODE_P (0x13) +#define ES_SCANCODE_Q (0x14) +#define ES_SCANCODE_R (0x15) +#define ES_SCANCODE_S (0x16) +#define ES_SCANCODE_T (0x17) +#define ES_SCANCODE_U (0x18) +#define ES_SCANCODE_V (0x19) +#define ES_SCANCODE_W (0x1A) +#define ES_SCANCODE_X (0x1B) +#define ES_SCANCODE_Y (0x1C) +#define ES_SCANCODE_Z (0x1D) + +#define ES_SCANCODE_1 (0x1E) +#define ES_SCANCODE_2 (0x1F) +#define ES_SCANCODE_3 (0x20) +#define ES_SCANCODE_4 (0x21) +#define ES_SCANCODE_5 (0x22) +#define ES_SCANCODE_6 (0x23) +#define ES_SCANCODE_7 (0x24) +#define ES_SCANCODE_8 (0x25) +#define ES_SCANCODE_9 (0x26) +#define ES_SCANCODE_0 (0x27) + +#define ES_SCANCODE_ENTER (0x28) +#define ES_SCANCODE_ESCAPE (0x29) +#define ES_SCANCODE_BACKSPACE (0x2A) +#define ES_SCANCODE_TAB (0x2B) +#define ES_SCANCODE_SPACE (0x2C) + +#define ES_SCANCODE_HYPHEN (0x2D) +#define ES_SCANCODE_EQUALS (0x2E) +#define ES_SCANCODE_LEFT_BRACE (0x2F) +#define ES_SCANCODE_RIGHT_BRACE (0x30) +#define ES_SCANCODE_COMMA (0x36) +#define ES_SCANCODE_PERIOD (0x37) +#define ES_SCANCODE_SLASH (0x38) +#define ES_SCANCODE_PUNCTUATION_1 (0x31) // On US keyboard, \| +#define ES_SCANCODE_PUNCTUATION_2 (0x32) // Not on US keyboard +#define ES_SCANCODE_PUNCTUATION_3 (0x33) // On US keyboard, ;: +#define ES_SCANCODE_PUNCTUATION_4 (0x34) // On US keyboard, '" +#define ES_SCANCODE_PUNCTUATION_5 (0x35) // On US keyboard, `~ +#define ES_SCANCODE_PUNCTUATION_6 (0x64) // Not on US keyboard + +#define ES_SCANCODE_F1 (0x3A) +#define ES_SCANCODE_F2 (0x3B) +#define ES_SCANCODE_F3 (0x3C) +#define ES_SCANCODE_F4 (0x3D) +#define ES_SCANCODE_F5 (0x3E) +#define ES_SCANCODE_F6 (0x3F) +#define ES_SCANCODE_F7 (0x40) +#define ES_SCANCODE_F8 (0x41) +#define ES_SCANCODE_F9 (0x42) +#define ES_SCANCODE_F10 (0x43) +#define ES_SCANCODE_F11 (0x44) +#define ES_SCANCODE_F12 (0x45) +#define ES_SCANCODE_F13 (0x68) +#define ES_SCANCODE_F14 (0x69) +#define ES_SCANCODE_F15 (0x6A) +#define ES_SCANCODE_F16 (0x6B) +#define ES_SCANCODE_F17 (0x6C) +#define ES_SCANCODE_F18 (0x6D) +#define ES_SCANCODE_F19 (0x6E) +#define ES_SCANCODE_F20 (0x6F) +#define ES_SCANCODE_F21 (0x70) +#define ES_SCANCODE_F22 (0x71) +#define ES_SCANCODE_F23 (0x72) +#define ES_SCANCODE_F24 (0x73) + +#define ES_SCANCODE_CAPS_LOCK (0x39) +#define ES_SCANCODE_PRINT_SCREEN (0x46) +#define ES_SCANCODE_SCROLL_LOCK (0x47) +#define ES_SCANCODE_PAUSE (0x48) +#define ES_SCANCODE_INSERT (0x49) +#define ES_SCANCODE_HOME (0x4A) +#define ES_SCANCODE_PAGE_UP (0x4B) +#define ES_SCANCODE_DELETE (0x4C) +#define ES_SCANCODE_END (0x4D) +#define ES_SCANCODE_PAGE_DOWN (0x4E) +#define ES_SCANCODE_RIGHT_ARROW (0x4F) +#define ES_SCANCODE_LEFT_ARROW (0x50) +#define ES_SCANCODE_DOWN_ARROW (0x51) +#define ES_SCANCODE_UP_ARROW (0x52) +#define ES_SCANCODE_NUM_LOCK (0x53) +#define ES_SCANCODE_CONTEXT_MENU (0x65) +#define ES_SCANCODE_SYSTEM_REQUEST (0x9A) + +#define ES_SCANCODE_ACTION_EXECUTE (0x74) +#define ES_SCANCODE_ACTION_HELP (0x75) +#define ES_SCANCODE_ACTION_MENU (0x76) +#define ES_SCANCODE_ACTION_SELECT (0x77) +#define ES_SCANCODE_ACTION_STOP (0x78) +#define ES_SCANCODE_ACTION_AGAIN (0x79) +#define ES_SCANCODE_ACTION_UNDO (0x7A) +#define ES_SCANCODE_ACTION_CUT (0x7B) +#define ES_SCANCODE_ACTION_COPY (0x7C) +#define ES_SCANCODE_ACTION_PASTE (0x7D) +#define ES_SCANCODE_ACTION_FIND (0x7E) +#define ES_SCANCODE_ACTION_CANCEL (0x9B) +#define ES_SCANCODE_ACTION_CLEAR (0x9C) +#define ES_SCANCODE_ACTION_PRIOR (0x9D) +#define ES_SCANCODE_ACTION_RETURN (0x9E) +#define ES_SCANCODE_ACTION_SEPARATOR (0x9F) + +#define ES_SCANCODE_MM_MUTE (0x7F) +#define ES_SCANCODE_MM_LOUDER (0x80) +#define ES_SCANCODE_MM_QUIETER (0x81) +#define ES_SCANCODE_MM_NEXT (0x103) +#define ES_SCANCODE_MM_PREVIOUS (0x104) +#define ES_SCANCODE_MM_STOP (0x105) +#define ES_SCANCODE_MM_PAUSE (0x106) +#define ES_SCANCODE_MM_SELECT (0x107) +#define ES_SCANCODE_MM_EMAIL (0x108) +#define ES_SCANCODE_MM_CALC (0x109) +#define ES_SCANCODE_MM_FILES (0x10A) + +#define ES_SCANCODE_INTERNATIONAL_1 (0x87) +#define ES_SCANCODE_INTERNATIONAL_2 (0x88) +#define ES_SCANCODE_INTERNATIONAL_3 (0x89) +#define ES_SCANCODE_INTERNATIONAL_4 (0x8A) +#define ES_SCANCODE_INTERNATIONAL_5 (0x8B) +#define ES_SCANCODE_INTERNATIONAL_6 (0x8C) +#define ES_SCANCODE_INTERNATIONAL_7 (0x8D) +#define ES_SCANCODE_INTERNATIONAL_8 (0x8E) +#define ES_SCANCODE_INTERNATIONAL_9 (0x8F) + +#define ES_SCANCODE_HANGUL_ENGLISH_TOGGLE (0x90) +#define ES_SCANCODE_HANJA_CONVERSION (0x91) +#define ES_SCANCODE_KATAKANA (0x92) +#define ES_SCANCODE_HIRAGANA (0x93) +#define ES_SCANCODE_HANKAKU_ZENKAKU_TOGGLE (0x94) +#define ES_SCANCODE_ALTERNATE_ERASE (0x99) + +#define ES_SCANCODE_THOUSANDS_SEPARATOR (0xB2) +#define ES_SCANCODE_DECIMAL_SEPARATOR (0xB3) +#define ES_SCANCODE_CURRENCY_UNIT (0xB4) +#define ES_SCANCODE_CURRENCY_SUBUNIT (0xB5) + +#define ES_SCANCODE_NUM_DIVIDE (0x54) +#define ES_SCANCODE_NUM_MULTIPLY (0x55) +#define ES_SCANCODE_NUM_SUBTRACT (0x56) +#define ES_SCANCODE_NUM_ADD (0x57) +#define ES_SCANCODE_NUM_ENTER (0x58) +#define ES_SCANCODE_NUM_1 (0x59) +#define ES_SCANCODE_NUM_2 (0x5A) +#define ES_SCANCODE_NUM_3 (0x5B) +#define ES_SCANCODE_NUM_4 (0x5C) +#define ES_SCANCODE_NUM_5 (0x5D) +#define ES_SCANCODE_NUM_6 (0x5E) +#define ES_SCANCODE_NUM_7 (0x5F) +#define ES_SCANCODE_NUM_8 (0x60) +#define ES_SCANCODE_NUM_9 (0x61) +#define ES_SCANCODE_NUM_0 (0x62) +#define ES_SCANCODE_NUM_POINT (0x63) +#define ES_SCANCODE_NUM_EQUALS (0x67) +#define ES_SCANCODE_NUM_COMMA (0x82) +#define ES_SCANCODE_NUM_00 (0xB0) +#define ES_SCANCODE_NUM_000 (0xB1) +#define ES_SCANCODE_NUM_LEFT_PAREN (0xB6) +#define ES_SCANCODE_NUM_RIGHT_PAREN (0xB7) +#define ES_SCANCODE_NUM_LEFT_BRACE (0xB8) +#define ES_SCANCODE_NUM_RIGHT_BRACE (0xB9) +#define ES_SCANCODE_NUM_TAB (0xBA) +#define ES_SCANCODE_NUM_BACKSPACE (0xBB) +#define ES_SCANCODE_NUM_A (0xBC) +#define ES_SCANCODE_NUM_B (0xBD) +#define ES_SCANCODE_NUM_C (0xBE) +#define ES_SCANCODE_NUM_D (0xBF) +#define ES_SCANCODE_NUM_E (0xC0) +#define ES_SCANCODE_NUM_F (0xC1) +#define ES_SCANCODE_NUM_XOR (0xC2) +#define ES_SCANCODE_NUM_CARET (0xC3) +#define ES_SCANCODE_NUM_PERCENT (0xC4) +#define ES_SCANCODE_NUM_LESS_THAN (0xC5) +#define ES_SCANCODE_NUM_GREATER_THAN (0xC6) +#define ES_SCANCODE_NUM_AMPERSAND (0xC7) +#define ES_SCANCODE_NUM_DOUBLE_AMPERSAND (0xC8) +#define ES_SCANCODE_NUM_BAR (0xC9) +#define ES_SCANCODE_NUM_DOUBLE_BAR (0xCA) +#define ES_SCANCODE_NUM_COLON (0xCB) +#define ES_SCANCODE_NUM_HASH (0xCC) +#define ES_SCANCODE_NUM_SPACE (0xCD) +#define ES_SCANCODE_NUM_AT (0xCE) +#define ES_SCANCODE_NUM_EXCLAMATION_MARK (0xCF) +#define ES_SCANCODE_NUM_MEMORY_STORE (0xD0) +#define ES_SCANCODE_NUM_MEMORY_RECALL (0xD1) +#define ES_SCANCODE_NUM_MEMORY_CLEAR (0xD2) +#define ES_SCANCODE_NUM_MEMORY_ADD (0xD3) +#define ES_SCANCODE_NUM_MEMORY_SUBTRACT (0xD4) +#define ES_SCANCODE_NUM_MEMORY_MULTIPLY (0xD5) +#define ES_SCANCODE_NUM_MEMORY_DIVIDE (0xD6) +#define ES_SCANCODE_NUM_NEGATE (0xD7) +#define ES_SCANCODE_NUM_CLEAR_ALL (0xD8) +#define ES_SCANCODE_NUM_CLEAR (0xD9) +#define ES_SCANCODE_NUM_BINARY (0xDA) +#define ES_SCANCODE_NUM_OCTAL (0xDB) +#define ES_SCANCODE_NUM_DECIMAL (0xDC) +#define ES_SCANCODE_NUM_HEXADECIMAL (0xDD) + +#define ES_SCANCODE_LEFT_CTRL (0xE0) +#define ES_SCANCODE_LEFT_SHIFT (0xE1) +#define ES_SCANCODE_LEFT_ALT (0xE2) +#define ES_SCANCODE_LEFT_FLAG (0xE3) +#define ES_SCANCODE_RIGHT_CTRL (0xE4) +#define ES_SCANCODE_RIGHT_SHIFT (0xE5) +#define ES_SCANCODE_RIGHT_ALT (0xE6) +#define ES_SCANCODE_RIGHT_FLAG (0xE7) + +#define ES_SCANCODE_ACPI_POWER (0x100) +#define ES_SCANCODE_ACPI_SLEEP (0x101) +#define ES_SCANCODE_ACPI_WAKE (0x102) + +#define ES_SCANCODE_WWW_SEARCH (0x10B) +#define ES_SCANCODE_WWW_HOME (0x10C) +#define ES_SCANCODE_WWW_BACK (0x10D) +#define ES_SCANCODE_WWW_FORWARD (0x10E) +#define ES_SCANCODE_WWW_STOP (0x10F) +#define ES_SCANCODE_WWW_REFRESH (0x110) +#define ES_SCANCODE_WWW_STARRED (0x111) + +uint32_t remap[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, ES_SCANCODE_ESCAPE, ES_SCANCODE_1, ES_SCANCODE_2, ES_SCANCODE_3, ES_SCANCODE_4, ES_SCANCODE_5, ES_SCANCODE_6, + ES_SCANCODE_7, ES_SCANCODE_8, ES_SCANCODE_9, ES_SCANCODE_0, ES_SCANCODE_HYPHEN, ES_SCANCODE_EQUALS, ES_SCANCODE_BACKSPACE, ES_SCANCODE_TAB, + ES_SCANCODE_Q, ES_SCANCODE_W, ES_SCANCODE_E, ES_SCANCODE_R, ES_SCANCODE_T, ES_SCANCODE_Y, ES_SCANCODE_U, ES_SCANCODE_I, + ES_SCANCODE_O, ES_SCANCODE_P, ES_SCANCODE_LEFT_BRACE, ES_SCANCODE_RIGHT_BRACE, ES_SCANCODE_ENTER, ES_SCANCODE_LEFT_CTRL, ES_SCANCODE_A, ES_SCANCODE_S, + ES_SCANCODE_D, ES_SCANCODE_F, ES_SCANCODE_G, ES_SCANCODE_H, ES_SCANCODE_J, ES_SCANCODE_K, ES_SCANCODE_L, ES_SCANCODE_PUNCTUATION_3, + ES_SCANCODE_PUNCTUATION_4, ES_SCANCODE_PUNCTUATION_5, ES_SCANCODE_LEFT_SHIFT, ES_SCANCODE_PUNCTUATION_1, ES_SCANCODE_Z, ES_SCANCODE_X, ES_SCANCODE_C, ES_SCANCODE_V, + ES_SCANCODE_B, ES_SCANCODE_N, ES_SCANCODE_M, ES_SCANCODE_COMMA, ES_SCANCODE_PERIOD, ES_SCANCODE_SLASH, ES_SCANCODE_RIGHT_SHIFT, ES_SCANCODE_NUM_MULTIPLY, + ES_SCANCODE_LEFT_ALT, ES_SCANCODE_SPACE, ES_SCANCODE_CAPS_LOCK, ES_SCANCODE_F1, ES_SCANCODE_F2, ES_SCANCODE_F3, ES_SCANCODE_F4, ES_SCANCODE_F5, + ES_SCANCODE_F6, ES_SCANCODE_F7, ES_SCANCODE_F8, ES_SCANCODE_F9, ES_SCANCODE_F10, ES_SCANCODE_NUM_LOCK, ES_SCANCODE_SCROLL_LOCK, ES_SCANCODE_NUM_7, + ES_SCANCODE_NUM_8, ES_SCANCODE_NUM_9, ES_SCANCODE_NUM_SUBTRACT, ES_SCANCODE_NUM_4, ES_SCANCODE_NUM_5, ES_SCANCODE_NUM_6, ES_SCANCODE_NUM_ADD, ES_SCANCODE_NUM_1, + ES_SCANCODE_NUM_2, ES_SCANCODE_NUM_3, ES_SCANCODE_NUM_0, ES_SCANCODE_NUM_POINT, 0, 0, ES_SCANCODE_PUNCTUATION_6, ES_SCANCODE_F11, + ES_SCANCODE_F12, 0, ES_SCANCODE_KATAKANA, ES_SCANCODE_HIRAGANA, 0, 0, 0, 0, + ES_SCANCODE_NUM_ENTER, ES_SCANCODE_RIGHT_CTRL, ES_SCANCODE_NUM_DIVIDE, ES_SCANCODE_PRINT_SCREEN, ES_SCANCODE_RIGHT_ALT, 0, ES_SCANCODE_HOME, ES_SCANCODE_UP_ARROW, + ES_SCANCODE_PAGE_UP, ES_SCANCODE_LEFT_ARROW, ES_SCANCODE_RIGHT_ARROW, ES_SCANCODE_END, ES_SCANCODE_DOWN_ARROW, ES_SCANCODE_PAGE_DOWN, ES_SCANCODE_INSERT, ES_SCANCODE_DELETE, + 0, ES_SCANCODE_MM_MUTE, ES_SCANCODE_MM_QUIETER, ES_SCANCODE_MM_LOUDER, ES_SCANCODE_ACPI_POWER, ES_SCANCODE_NUM_EQUALS, 0, ES_SCANCODE_PAUSE, +}; + +int main(int argc, char **argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s <layout>\n", argv[0]); + return 1; + } + + FILE *f = popen("setxkbmap -query | grep layout", "r"); + char oldLayout[64] = {}; + fread(oldLayout, 1, sizeof(oldLayout) - 1, f); + pclose(f); + + char setLayout[128]; + snprintf(setLayout, sizeof(setLayout), "setxkbmap %s", argv[1]); + system(setLayout); + + Display *display = XOpenDisplay(NULL); + XIM xim = XOpenIM(display, 0, 0, 0); + XSetLocaleModifiers(""); + XSetWindowAttributes attributes = {}; + Window window = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 800, 600, 0, 0, + InputOutput, CopyFromParent, CWOverrideRedirect, &attributes); + XIC xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, window, XNFocusWindow, window, NULL); + + uint16_t table[512 * 4] = {}; + char stringBuffer[65536] = {}; + size_t stringBufferPosition = 0; + + for (uintptr_t state = 0; state < 4; state++) { + for (uintptr_t i = 0; i < 0x80; i++) { + XEvent event = {}; + event.xkey.type = KeyPress; + event.xkey.display = display; + event.xkey.window = window; + event.xkey.state = state == 0 ? 0x00 : state == 1 ? 0x01 /* shift */ : state == 2 ? 0x80 /* alt gr */ : state == 3 ? 0x81 : 0; + event.xkey.keycode = i; + char text[32]; + KeySym symbol = NoSymbol; + Status status; + size_t textBytes = Xutf8LookupString(xic, &event.xkey, text, sizeof(text) - 1, &symbol, &status); + uint16_t offset = 0; + + if (textBytes) { + offset = stringBufferPosition; + assert(stringBufferPosition + textBytes + 1 < sizeof(stringBuffer)); + memcpy(stringBuffer + stringBufferPosition, text, textBytes); + stringBuffer[stringBufferPosition + textBytes] = 0; + stringBufferPosition += textBytes + 1; + } + + table[remap[i] + state * 512] = offset; + + if (remap[i] == ES_SCANCODE_PUNCTUATION_1) { + table[ES_SCANCODE_PUNCTUATION_2 + state * 512] = offset; + } + } + } + + snprintf(setLayout, sizeof(setLayout), "setxkbmap %s", oldLayout + 7); + system(setLayout); + + fwrite(table, 1, sizeof(table), stdout); + fwrite(stringBuffer, 1, stringBufferPosition, stdout); + + return 0; +} diff --git a/res/Keyboard Layouts/fi.dat b/res/Keyboard Layouts/fi.dat new file mode 100644 index 0000000000000000000000000000000000000000..ce811d22324f0d96abd618106144419956cf68ac GIT binary patch literal 4604 zcmeI0`)k&96vtn05iwB_5fL|HX=;|XdA~MqS(arvGiz#PI!#SY%WLyiEyfI$&2$c( znRAJawjsJw*6{oB8Qu`nydWa=AR$AHq6;E|$M2r!;qgnx{($d?=RBWt&gXp2`J6X= ze>m?|G_C<;^EyLFV;Ijcf+rcp7{>Az)9A(1q|${!JkArm!K1uJcd}?kb6U`nR<x!q z?PyO2`dPY8bml!enwDYms>$=b$jiLLyUa4HDQj6EXbH2K$NPK`@W;)CzOo{2hI@!W zh(Hq%_$L-q%|*^}kR8<U14k&QmO74dh0E+?KgE=CfUhXyXG%EB*PLN3>-m&C@+sg8 zHnN#QDp}1|%XytG_FrLg+Qd=M39fRDU(9OC`ZEx8izvTwgPQ?=+-&fbzv5=NhX{lS zGy#E?Y7FY5$(pD^O4U#eSEhPuq(<9Wwx+0;?VXgS{_3J0nxxK}pl%v(-aFg{HB$?< zQfswUJEiM39n?{C)IOH^e*Uo<XV!F+8A;y%d*0GO++yWuuI6h|z#q@C!1phI$Z0$( z+(QIH1d<WB9s6Pq=z@OIVY6ygr=zNn^G~kmlD;!-m-gt8_G-V*Yq!p5pH69w)+<l> z+MrDqQKT=mP1VZPPP4A7#J}HIE286OT}$#Lzu~|1zXP#<D5@K3(C-0%{O(QP|L;Ri z<5A%rA`l{wj6e!~=xbAZe+DqnCj7z10c7x$P4$nknC0ZKgpXLsQs%PArf;{GHq78d z8{}s*$Hx45%(t=J9m192eM1jcv4WW_vsr&33w-XNx3LLn^tP<S?Q**D1#69C@Ty7S zF{2f_;+4_O7=?6W7kc{aLrW$y#n^`|V;bIMGB5Co@dz%@u8(38&+?p63ge7a7|%<% zt+>zdYOPAPu@hsA#~957;~R!Cl(!SLGlR89;_Wd;Bf752q=b)|%5<AvrX_lheo|rG zyC41bk5v;XvJ@w_<96Yy673)R9%sLDP8Q;}#afSSz&mJZx0@6to{$@Sg16hwcj6tv z`_{A_CZz^aCSDa@ojv3}3|Y8RAB9{Zg_fay6TcoV#cfWY;EHjdQ(uEu6Kg+GV5zp4 R6kGA=x=J5?ul&LK_W+@7>CXTF literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/fo.dat b/res/Keyboard Layouts/fo.dat new file mode 100644 index 0000000000000000000000000000000000000000..3d74e191b6274766dc990cab2b13ad638797f195 GIT binary patch literal 4651 zcmeI0`)^fM5QV>WLK;DeiYQ`9Q?Wd>3ZkN*QmcUSP!t7Gv_VBtRK!|EE1*zqeGmer zDl}3nVB1uRg_=sS7IdF`H6%n5HAD>|dPCF@HH2tFd<5s*hnAxa`~l}C`^=u%vu9S; z&HiE55>mg>6mthxkw+m#T+8{4=Q<{G53{*|;S6LDSCG#z?j)C)3}FTyJ;>rDdeNIc zoJwE%aha7ni?ex{Gi`SfmvF1u$=t}z%;A0>NVPlew=9(LB=eZh0!l;ij9Zf2EXuf% zjTnd+H~|L!Oy_K4A79Zy9i8mtW18@Z^C{o5pG|D$4c4=rjWqHNwd|#yFDd5*DtU?J ztY9ToRP!2bETzV39%PMuTWIBTv%A>M9ugej`*gqKnIoZuU-^-r_=Urvc*Z@H-29$# zBO5UgF>nG5R4J7-LGv|NQ#4dlHBHks#^N(IOQkB&SQTlI3N%r}HA?f8uQ?j2yCwBd zmU`-B_0efMU1zAj#_1@z%G0wNpn>VysSd^FEmYYtvF-t`2<5%3#agE4^<pTVsZf!O zuk7YDlNH&Bfrx>w3=H#9-hO3yM|D8He$YYvtS{^(9nxX-_Ii1H^|d<niN4b=?UCnw zq`$OVf9Q49Xr1b`LG@}<vs%=ueR@?LcDJ9`ruO7(Jd%Esza{M{>3&@?{NFx5l$YoA z_4<1QyxdScb2ld$AJWZfCM&WL0}%sV8OUKI7u%G6DWhz5znsyGv8lblruv?g@RUvL zkMjg&1oQU-9>cH4-$J(O0;Sx?T$|?~<RP2(AHi?HZ^v~qlxKL_hW&-y%cC~52lBy% zCMe|Dx4<NZY(|)5@El`tTgl-ZQx?v}z0F_~6-JoAaGsr9Z2+d3%rJplm~O(v3?^}t zNeF%g{wk|*jmZjuKykfE6qA|44fvJ#YjKU%Xco6Kj@wMdm}<Jim8M(F{-=FmxV>9X z5pJVN8wTCgv&aOFVwMEh7AILKB3@3Syczc{{tgnAt87)<T1~t<h-Bm5!LJK=iB%C_ zPOOnwdvMF`z-_{H;F?G*U1zJ-7;$a5ZMe;b$-R~2<gWjK+Ky|*y@&e{w}C`OExuhz z)!KsFiEA)$pEVI*79<4F-VD$uDyxWXCB8cF4cG?(BgU8^jK4yx!6*)HypO-e{)xgA Uu(bxP#<&WyTmD7mnvaF`H~Ntbr2qf` literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/fr.dat b/res/Keyboard Layouts/fr.dat new file mode 100644 index 0000000000000000000000000000000000000000..6f2ec91a2a05b0171c25199b4490fbeb4f418457 GIT binary patch literal 4644 zcmeI0|4&wR6vtohtEFUQnT;7)n3QIjSy^eOL`IpGU&^vH%hD_=Dl$z)4Go>K3Std4 zBqHRCF+(;&v|@ek^Q>B5++1IrtLC0s&ADo>Hs@-s!-dD_mXkl=KHK@6FZX=TIrshS z{&3!_==_ai9``VT3&|pzNnAz_H**UQa6gxGCFe7o@r>Y7=90;5F5yl*dees#`jJY1 z1~8B`uCa3GlEGt~%{gXY#T|A|<u+!pfQNXvv)u{L<)Mrv<dVmeEDpt!Zhl}CB;80y z2t)|<0D(Wca$4EXSL~*m_h{z>8u5wqA>Z*0+i9Yb8rrC38~do@3+ma+T8dcD28wx+ zmno%;S81V;3afdLayFZ8W{;g8^9i4EfCN8u^*fO|5=!`upE$(N91g{k?yrGyH0ee< zLLfq*2M83aGij3Yv`CXRR8uugGd0HIvozbze2vw34c0K_XoN;9R~cHMk(w{mODCz1 zQq)hW>aR0&rn2=HgOsjiI!kGGdty+3j-B&N76)Dr#$tUabFG$Yg;uIC6i?P#9mF>r z=V>x4(h&j?0^Jc9;&pmo3-74D)w?>N@AacTwJ+(Q4%yk;+oQc|RlD}f=_CEAT{@z; zepiXgRIbgcP?c&_uSUJCFZGgI?AB>sbGL8t7qbuRWG|(wTlWe6-yR&w9ORwqo$d|r z(n9g%?SVo3yyHAgW<@$eAVQ!!0_nE#`wh0<53>b-Bz`^j;n(3;aS_+i*S7olEN3D4 zws|k(86M#Y+rl$#<9~{$gN=TX?ew`kY8(IK_-(jmV+oe>EDy58*n>P{3a(`wLoAwM z4K6koA(c^_!fLDUc970!BN(nQieZeA1y>t^FxJQi*JPP}x!yR58<}Yw!rjbbGSirj zd(#Tc;C3S^a=0lVDW({~a4Q$E3fID2#!lQ|>_oP44ik;97=^1l)_g*^xofjqLs`Kb z3XJNQYcxm}_p&m0b-xz(7Kt^DxOa%xkyuw^QfBfB{!aY&aWz&j3;%WeCSs+;i;2|{ z+ev&)$1JWfFm~grNjz6!vc(W_t;gmm_|H6VkSKbs<0UiAup32NOe#q{U)_P0;o{nD zHh-PrXhq$2;x^<~8>y7o4*ZSyl~(ifhK{%POK{tWzd)?k{^ocgZdWi;p%Fc<!KT@0 SvdM7r%klpi%GLgRs=opAG6P5e literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/gb.dat b/res/Keyboard Layouts/gb.dat new file mode 100644 index 0000000000000000000000000000000000000000..bafd43835453dfe8b6deb284e073c8f03ea8b20d GIT binary patch literal 4637 zcmeI0`)^fM5QV>WB1(}eq9Rfsh$x6!1r-6I76g$hih@{0QAAKctAM;)wO|`k#k5GE z3KT7RE47kR1#5*$_PJLL2|h#A5H(z1A%u`<)P#`W+}j?lN74QP=OmNaGka$5*(*6e zthJbyZxDAek)iY=hg?Q*2_w0l8<@=9WOF&^(3>G#NI&xF$prdx8y?4TJRRvoXHKFE zT{(?`c3cn6;vu@xodI0QILqX56E|}o_wzvOegEg?hYIE}otZq$W1)Ny7Ni#ogD~<D z0uci3K;ZY*nz#6Z&uOHJCbrYeYwW}kXD?q-OC2xr65FUI#va!3DX;J`Pg2Y>N?A@B z&+;7QtfYY=D(%c4SjB2KQ_pUT-seMh@ipJFuN^a`N`48|9pXEFVm}8%`5-)yUi=z_ zk&h6F5NHPiC2A?k(KJogNcGZa<!P)2Sbm(wYnEncpa$z~_119pQMRV&Tuo9x<?9GX z@zg;X>a3G>icZz(8mhybsVvRa8LcM=Lrk=|Ae0OC{^^TDl|`DZd0L<)p?uJ}D4kz+ zjNPCr@(}_N0&NlK;k87c={FtHmul2reWQK)!2YD~^`nmHuy$#;8q}mc+96**YpV`w zrw*u0D^#IXTBEhvppB|gtv=Cm)m!fg-W#ERalekrYrU=Q1pmJ77OL#(b?`F06TL2> ze9)bl&UZh?Zcr8Z2!RNJwg_a=-&pz;#?!Ad?tV3c7;J3+Qid6?&tNtSn8q9)XA$$5 z!K22%Cvgv%Oku8Z`RP1pOn)Y`jG13UA7l9EvzUcUWxjF!0v<6PA)CugHRx$)UTj)I zrbV5MISj*XA&c`&aBv$<Te!fKhLpO{my5X9Dm!v3cQDFSh6&us?Tq0TQxcXKyU1iX z<J0QIXwxV1xY4wQA>`ufc)~=Ce6BMgV}!{KV@=M;;o3hhFAQJq-oZ8C-XyuS4z~l> zY!{@SS7d{xo}Wu%slDHABT+-LwA}1@vz7Rb_|0~lAH&~(Ur)S(#52Teh&QHs3UROF z-o;gud}^K9dIQ64#l8I>)4WWwWNiu!x7}9ORkGf!isaMPDX?5U?mZjpqfI1=4H>tY zL=5+;4OBsV3w|YjRcfYETn&CXu9id@@tEOi4TWhm+$I~Q((DBT$Ti`w!T)O}7yCOz Fe*lPL{;2=} literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ge.dat b/res/Keyboard Layouts/ge.dat new file mode 100644 index 0000000000000000000000000000000000000000..8e3bac35c249914a80c946f4192aba351477b840 GIT binary patch literal 4691 zcmeI0?N3i(9LBHf_LMvf^IV?tSX4+zLU{^FHZ_KL;f0wOW?q<wv@$QeXjBrCkRAv{ zh??1NX4cG_nR(%be$33w%*@QpT<82csk62G0q3`U&iB5r^F81DzOUcTi}S5R;Fp5q z$iW6o!A5Msb}YaS?8I*5BM*y^gt3S~8lo^4#}I}r%*Fv2^h9q2AsGEJ5Q8uTL$O-r zMk5rZ7><!xfn@BLvIl#y4@D@(*|zn%3)fu<)hIz3E}_z;JJWJ|aMPK3(R09a;6EHl zU?Ax$LOGm2@CrZi3%~Ime_+^?<2jZe@DVL|jc<4ZKSuKfhVm^2@h%$h08My^NATe> zp5Q6IpdQavGJ?%`hEMp6fm)$AgBZ*(PU4id^}5?yoGUMu(>Q}sjB)8sotd^C-^E=g z%Zr`^o&y~n_|x{r6!RsYvyA&#&MMaM7;9P22EO5I9%mkRb3aRXfH`d89yT+JPng7I zOlAtxxPckm#4XHZ5tnc$ckwf~a|iQT$j4fti4XaRZ~2ZN{__p}<;wfPPyE8K{O;17 zvwXAl-(B2wvb^Xy;5pFIfi&aH=4mv!eP*dsO}L4ZGQx~9{S+sd!Dg7^06Qzjz6PG| zVUK&6K4zSu>8n|St%R5{W|l_NO{9so6=${XVu~v}*~FX0Cef^L=}w)cww~I>T_?+n zo&%l(9UTb4EPczzU=CvSZ9fn55r>(GM1sES`=T}Xil`BVqD)*8mEy7}7UxANHe)LW zXmmnc6a}JO<cnHyQ=AcJ5s#_xXP2tS(3)E$ZiuVmlsG9$#5v4Rry*J$hw<9Uboj2R zc(mFKN3<<p9YQbxOE3|WFd3QZSVUkN!m&-6L0GTnuVcBc72-5DAswr*PQ8nRIIJ>> zQme2`or#s|O|<4-z#62e+YzQ+mEe$+YwCcs=2jy^U5`|(#X|Kz7XRBzqkAub^H@*& zj~2n7QzIXJmGITtPWrP8Rk^_BW*w|^TV6H@%gbA$vzHH~I9}e>_`bL!?upJ`W=XNU ztVgx3w}s_olQ?I2=WEocvHb*x+y}_C?Q^WNOiS-zSimmFq%5_5EQ^w4O#9zc(YfMZ D$8I4I literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/gh.dat b/res/Keyboard Layouts/gh.dat new file mode 100644 index 0000000000000000000000000000000000000000..b3d9f389cec8546117ff5acd2f63feb311a480e6 GIT binary patch literal 4596 zcmeI0XKasQ6vcl>M5<8{kwy?HiYjVTRYmQpT@<w`s#fhCGxpwl@4fe^z4zWLA|fIp z5)pCz+rRK8qMv+v-!J#Q_c^)uxhHu(oHLk|FO(KEC7irOP?<=IP>mYYqBU`ZP@LQZ z5=H@ni6wv-f@nlK(vtxne91&+vXGT*l(lv_$VC_Y$xca1)4(cGL{pEpw5Mb0ynluM z4nPv|B#=liN8OwD@caz)rfzf@a2ZGg17A`xd$`L@4zP?v9N`!nIKfFy^N{;&Vhf8{ z!9G^8j@vBZI%~Mf2u3oRu}okRQ<%mKX0eN5EU=!hnZrD`v4hK&o#i|idCXIur{PXN zA)g$$54_|JZ+Y*id((HGpU>XZjV=Q&18HEOuTnrI6{7|!t6U0In8H;+5vr_6#j2@- z6s+vZt<nlmpc*NM>M5_H^^NbKbV{!b@{zAHDYJ^}E7|0)_R6BHDxwfY*@SAUp;~I8 zIJHil_pht<a^MoxRvi_u1V`Q5r;Dea^p{gF%8f1qE(5<a@G<qpY}GYg(oW6SZtc~6 zt<*ss)=}Nk4XxH%&DKI~*J3T#70uNJE!8;<(hv>P2#wMhjnjBd)MRbe0L`?XPc&82 zwO$)_#<Jr|)+yc5Jv~U{3w`gvz11T<(+j<E)V;gB^3*^4<<yIEqsxHH!0!y?q=c#T zQl`_(n07BmDCJG<7p0=<`i%5u0G&vpFN5euS9+TMZb>WrXh$E@^6_*wrJq1IQ|1*Y zXbL}$!3?AW{Y~rlpu719Arv#$Ai#PSHh;m-GG9{;6-nMfPV$)9kdGIm_K@GKhM)FA z5QS)CP#+r7jOu1H#L%23)TX{!2}4X?_)&$%9($su85B{}F>@izjEmt6H4`J2s%B(F mn%z*>#zj!+*YF7E@RZF1|I6k>ox@W$PhR;S7EfOL=kOo#AHhxl literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/gr.dat b/res/Keyboard Layouts/gr.dat new file mode 100644 index 0000000000000000000000000000000000000000..b9cecbdadce8a904cf7a63608360fb67a7387dfd GIT binary patch literal 4669 zcmeI0|7(?X6vtoZNo>k8Ga2GCW@~<JxwO<)R#FrdVkiaD$`AxWkfJCmmtU4Qjj(-b zE;r{kmeZl>zS!n=_az>XqPXWH6&0csH;SStq%RajbnbKS9k(Zk{Q=K~`<&0`eBPgP z&V5~;AI_;I{aMKtHgO-tJisa*VliuZgmpZ_Q{2LGu4NAQFrP(irihK)zy>@fFp)ea zlg|{UGL7lnY2jva4cjPS2Dh<-CxQeOJkE1G&x`4FmwfIGDPE<L9aOP9<j-z*1&iwJ zHnI_ch`|3KP$Fs3Cy4yXS^7B7mwd%(zTrE5;BuKD@ADzu4DcC4`20;Tzcb3OG_ap0 znrWepb`EivPClZZ6Bcrs9OZ44GyEJR_=yWlmVB9#$#<#JW`}gMWU5S;0x1mnvvFnw z{^D^?v#Q8O1R?^t1pLe!^Q1IOgFGt_%L`H|+hwCvNlf-gyR^zC*(|GNojffSvOyYU zjnv6{skWO7q*Tgei7b<HSs^RsZrLL9<Uv^_U2?D7AH?39$?%$VNT(dj>~d?k*m@+S z8<gYHBPZol$e+F27x>>D=QOK|Y(yX;kV~N4OYeRQ-kiVE?~iwx_q|N?CVBbZEN`aw zqg*im7xITB<y%{wlLGH+x!QYAK9Gc*3GRGs&rj|9i=39TX6IVm&x4bzG8wKkTjUjI zcDXfNY`rw3TkMs1^Sy;$S;(KgTN?P6k8_$;MK&T35y&M_$W7MkFX3kE@|UvAI{jNI zqtyELJSJKH?slT@;CA3%#_d8+p#$hBZaa_i7+0X(xGMA{E{67^{pbifh{l;~y?+JT zhkFIL8@C7TL5I;H8z0<gql5(%S*nHjM=j7In<H$qynZ)@%;qi|MO;sbjSc3QZk~-E z)|)bqa<m<-N88Z1&_n2(=zg>XZMEq_WvZl_K=TILf!3i7=s~m*ZQ?p!Vk^22J&Ybf zJJDLS89l)5++ov;v6AB9lKf%(cKjidJCEVIa1FLPVYvLRRLyB%em|}$Q256KWVN^& z67c|8+Ze87tPWR?v&8)*hHx#oo`6<jm}IOLzZ16)S53me##4a&cn+|w|0!+&zX!h; ze+2is;Yy)$jkxX<C1+Jw93yXeTE_?_V>P$~DL&3_9mEX;blj+wV43Z2AH;r84wR06 G=lut#qbWiF literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/hr.dat b/res/Keyboard Layouts/hr.dat new file mode 100644 index 0000000000000000000000000000000000000000..f64a0bbf77fe4397c3531fe8905faa7ae92c9e54 GIT binary patch literal 4624 zcmeI0`)?Fg6vsc`ilm5D@j+CGqJTw<JQPI~YgMcuZ>^vRs0d<35di_A6m7_&h@=Gq ztwO=3Y@w2d8k7dK(b*XyE|G+2L=90()DS|58ln*t&g^!mj6wSc%*~#;_dMp_@BL2p zhx1)Tdfd+AJVq|plE*y^q9^$b<^i7KNqW(TtLVl+uHyzK(1l0o!B{eALt8RAkMp^J zi@2Cexy`n_lFmF&M=s|kZlS;;!x+hfOkpa8&FB5!v>;S4mubAfi@X$y2kxxYVqxG$ zbHqTzKr0wH*<7=O@A#HRs`wZOmo4n#Q$FJ$KTyY3Dyil};?#104SdZezG5*kUSlcC zSWYP`SjB1@C}FMbd4zJ_;yvEy3-k7{mwo)m&m3w6Ccor(sP1<TbCh2=7K#V%Z>hy! zfg8;c0}%tQU?8S+(Ev@=B<1Nc4N|@aE8F5jHA2%=s2ufD2VJ3o>a4DsqDwSUS8JTw zSWR2AOtbc8{^+j^W$8lAPWgS+Ph(T7(JIh%&1kMl*Z$YDBve_fnVO?{DhkDeJ?5w4 zi_ek`s-ih!AY$O33}j`by<Ix2pR`A{+N*u~QakORv|r!osE(*npQu`O+O2wR*CEyD zptk9It9Zj~xmlUnDy>n4T)nO;^ZwLYt+%;l9MG>ic1ENn_wQA^W?Vt$+>AeTLVxR= zP&~+6Gh(Ct*|Mk0qD90SxJo#<;_`pxvSPW@K;TmL@5y8Uc&tgmlp{q|hz+GjGG z`PO+CS_eJ@?;YGSvP>74#blngp8gr0weI{m+&6KT@C05XFEh`igE>rMx=8^&O+vWQ zq=PQ@%rO}ui{2(0EaFa_dOC59sSaIDU+8Z7LT^(RuD8TpR-VadQyK0v<)DCZJj@VN z5k}!{z%8{c?&cxWDe}2LrBe(wjlo@p8>1NSBNHed;a<j=lre(g+<`A|1n1|5&o5>o z&Q=5NUwJ%5G?i?@`2eqmrdX-jO0yLt8b~yf*iK@N?U0Dm^h%}KI@3)i;MU-k_`k$@ z9DBRkGUa9!I924afQ2|UcJ<uTFp9!3l1oUIlYE<Gg?)hJI-E^74F>A-&3Lb-LDk{K zaW)#BGTeF+<s>S7Ffp8+IPc=r;w{CE8<X~m4<sGlY`4qyG3@Zs+Z_TjocNhAP5}!; B`nv!C literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/hu.dat b/res/Keyboard Layouts/hu.dat new file mode 100644 index 0000000000000000000000000000000000000000..a95f048c4317246c730e004107883d6a88abce60 GIT binary patch literal 4642 zcmeI0|8G=P5XC>|1xXbvB9cZM#3~{RS``(=ei5{ah*r@mB4`x>5djeav0^P45EQal zQ(L4(ky0vD+f=?-iN<&PqGp3%LPA19LZ}*|MhziEjm9{;-9`4rM*e{JlDl(f-pt%{ z&*uFwXBpj3A&>G9qq&HiDB)J}xsBVogXuiRm5d;diz((3E~A_ananUI;n9oUWN{j& za|UN}7H4yVwHwGFo+5{HxrXbw-y)?<pp3_Pf+thw{hz4}B~&nnr+J3Op?KO|nA}vQ z-N;4^L=2n+16k@$`jo?bOF%Q9@da_(*~3?S!%zIcc6QRpRvay~@jXo(;(ZSCGOKu% zHN<$0*QueFb$r5d-m#X)sOK#{WH$%Q+si)o^E1D4<Rma9QhKFu9Z%O$e&Y}RJ|4*2 z{F!unhpRG^A}?YfVjzQoS5jY0v1Vz8N|dXy8mI9Zu2M}<ndWM?@-;#^I!|Mir=gmu zb2LqZHC5SG+c#C;FJ%kWNBuQGi<ACHjZ(SoCTfzVXrAV4K`Ji;#D6#|LV3%yNEKS5 zs!%*#TA7Tm?BQ)XE3y#-5d$YOFv#on_UJDi(_Xb}pZ4p3d>vGmzLV$S1^Qeq+ODs) zOCRfZwd$xo(h>XCVz#PPqdK$ewLu#d*BWg#FWYO>7PH;YVg0CIbc&aiIxQXV+2)2a zbG$xYU$37xAQVq`=%0)a?BQ)XE3y#-5d$YOkZaTZRW{#WZL|8djI??EdfX1&Zd|*K z_NOwBMNCVM-p{dsnas7(K3I$EAe%>+Z}Px&W+X@ZSvK6eX58CcLC|KC`m;=Bq3H^9 zn9Xo5H|^k3&bQxTxE8C<H{qa?Li{#zO<lOa;(4Y&<XdQ{DGja$w;oq*DDE~9p~NJF zdrfpGGhw2Xy9i>qb=GAx_i!_}m}D`QaVA-e$F0Ow;WrVq@&FS}(72B=+-YJ)F{60+ zUl6OqAYL#Dq&#`+$vlsH34aGc6J0M>)3tOPZnbS2Y}Mm-;@+@ww~5ZRbjEm)DRed^ zE*2~$sA4c~1O7JrO%$16GK3qcU<m~#kQ5n$G!X@12=NufYw=r&ze&6f{{!On_*?LI z8Llsz6Rk_|-y_(J-$>VT`zKm(wYY`^8bfRtV)*Y8tfF&s0`ibVjlYpY9SsRU1$MsQ XY?r9DRcEyL9f_;hh0>UcGBN!FjF$lf literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/id.dat b/res/Keyboard Layouts/id.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ie.dat b/res/Keyboard Layouts/ie.dat new file mode 100644 index 0000000000000000000000000000000000000000..36443bc9c72f59fad17e0311a4ab523bc0296793 GIT binary patch literal 4657 zcmeI0|4&wR6vtoZRt{NDW96KaaztvRMp>3dNk(O+X<3wJSy`q<MQNs{m0+e}*$m9+ znbIQ~DG?zW3K6-_73XTrRddx`HJ{eEx#m`Lx@xocbAdMQmhcDMXV3Y3&N-iR&*$9t zc7J%km(cMW!wl}?8nVe}90iQv2F5di`?!}}E@cpd$zv$Pm`)aj<ZwG4r_+Zt(m9i} z$lz@Hai!V~<Xj%1KLfaoQQW4?L~daU5AYzfJMZghTNo;s&m4+)oTozhuCO?87I%fw z9w87R&<g~Pch>CWYrbMPRkYAb8(Z0fV=ssJmRjnFlc0%eYB<OSzF-RnSVk!?vXYls z&8xh|TFPnUc`DWOC)Tl^dK&m#(LVO`Dc|t}hkG$os^rg5-BEtz7k=aSP`)cX5;(`Y z!f1~Wh!E%n0&iGH(FB_(Z;B1Esa7a&lugq*!xm^AZF!b$IX20L+epPwY`Ios|8SDi ztdFHD7n5b!IX2$@VvuFo3hQqJE#C@ku1;p!ESqhMY^f~^p6_|E*F$w{Y`LwnGJ7SI z@7}56l&9TmqbNckLLk@cz~EPXIWh03?eF}8zOg^-n4JisLt5MIGdp4j>|l`T>wRfw zcyZfk3EONnR%`XvXie5^KU<~wsyWYVwLSK|CC$?ff7?mrGQ57?fX@4RLVj4NZm5^( zWqH}&;84DMpAn}#?Oq#25dskcnT!-mzg#^13UT+*jNvM={fikZUf-8_EaGA2vw&xL zhDUi){QDke5@Qxmi_6bpu9$uikBOOI&4pt47qEoIJj6nA{bHVwj*!bGQVp`ybGWpG zn4)wshq1WrWOBX)2e(<;!VoD9DRm)-i@0BvX-s7rH%etF<ZkZdW^R>|uvF|K#&z5g zs1r9ypP0xbX$yIb!`1PEM2zWNFCn8qa>HcF8TnlM-{sGRFL#?ruBgUsBe}c|_b#pp zSBq;QSyDl=ED>PPUV*<2SC8L@dk4P-|9$)&s)@@s$ST#?--Q1*egpf;Qw{fS$L-Wn z4So$y|MwI$<G+d9iu*v#x5(6Om&S960Gtpst{K;e+kvarvk6%P$<o!@HS#W;qLOtf z6w_!g$1e*C{3_gs_;LI-_<Dzujk32=^ObVAr3!y7t`+w&u1yD;c_r>6d3xotmvFn~ NR>|VHPyT1He*xCt5~~0J literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/il.dat b/res/Keyboard Layouts/il.dat new file mode 100644 index 0000000000000000000000000000000000000000..b962e397ac98c429a75474c504f3cab634423039 GIT binary patch literal 4549 zcmeI0duWbv6vsbjNh2h;+#6%=_xlVp_xt@a_e3O0DJ6585MpL#Hs(4rbDa%yoAr_; zNz!v9NlTI>Ns=VTYtP&3$wK~p-a60uJ>T>Fo!@!C_5AVsrt|X`&vKS9l;(_JG~?*P zM5ZvEm8_sUy=Y2H2GN?1EF+3Vv||AgRH8DGRHYg<s7WpA(BIlMq%j+*M}1<6W4<9X znZrC*k;J<4^Zt}lJ%k->U=v%|?!n#Ht-(c_`|4+30bhZ?P@ty#Bt76gZ+S#9k8yZH zfTuj;IUo7JZSGLSRUUGkQr>ZiH<a+2EDmsx!yF}tT=K~0H22xZ1#9_@vz+HH_jqM* zFDT<BpZLs|znJL<rCRx1E<IAdf<#DV5AN101@RgcR9%*zeFc04!WB4D{>3C(PO?a_ zm@D(`xzJ*<tg|PKl{gt9vur)eVt}lY;XxegN&{&kQ4%dN(ndPSG^s7UC00_Ti*%O> zGFes{bEzzs6_PBQWn1~a@ELx$&i3#!Wrw6nnq+uzcW-(SKU6{0W%=1xz*it#fk5bs z$q%i<>;JmWlN`ylPUrr!TZw1?RXHOCQYgh9+@0@Y5HGEu>azUoE8r^-u0SKZ>35}@ z-SK<S)9(4b=|g8a(9iDmRp>-3^aPrR?n3vW>F6Oe8_i+1-Ri5OC($%?H@Y7^ie{o2 z=m9hfJw|)_G7H^{9zj#lJ?LTdAexKjqsProXiJnG*UpTB>ULaJGYI+-D4-F|h$osB z<~z(G#%OKKeVA*+NG33iA?8m^Ceb{K5$0BmXAP^Z!9XT4*j$WZ3}+;x%*lu~M`Nw| z4l~Tl7{pW(7|R%QDdHFqI=a92=(6O~lqKgAIFEA*=LWYjC|keNA_b?!Qd&?QO-481 z6yp@4M!kY_8Rr7dO>5{Fa2+i`4Jfib*%tQCi_k)xYdDv13UDqOnrV^6t;?Z-lDq>& N8lam)^+4{ggzwP`*`5FZ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/in.dat b/res/Keyboard Layouts/in.dat new file mode 100644 index 0000000000000000000000000000000000000000..19d4f10dc7ee35915642c13748367397d92a0e5c GIT binary patch literal 4717 zcmeI0{ZCF|7{|ZYJ*-#^!(v`Srjn4?kuofXVKJ<zVKFu~Ha40lh2AKXlvK`nRC*yv zEU{+I{9w%(8zXPSFow;`FyC|Psh&gQ4>-^EIoEw(_sex%-}9VbuG?t-MWY0T*o0}= zf^FD=Mc9QnB%%`KSc2skj}UCYEX;=klaYrxI1Ys_=!)*>g}&&IK^Te=Sj+3iU>vT& z7o!k?C}h%;gfwKJ8a24w67OH;mSw|D)S({Nal_(wP8-ZYqjPFoTLD{v|4<-Dnm75$ zW?3hJA~H#)O0e{inG!1VWV>t?PZ=oR&{+b+U3$t!`H3~+A(3(q5AYaI@C+~T60h+F z@8BbM@r73&koWimFY%UeMp!6evP^bLti-p(`&VjNmVJk1pCn7Fq+9&Xdk&iZ><(6) zyKHMKU@OpG0XNk)dv1O`jpnnS&pWMOQv*kJt+VD6O_DE#qKQL_q(n-kT+T|R+>$)G zEVc4ks-#+O^2{T0pFEUT@>V`rZfT3|I_lIeFLOnGl&|t#esysEhw1NPJ>`0-J+l?C z6>w2t!yjMF1bU{J-XNDXzjm{^=Ga5^P(4*|)lYe<0cxNcth`j9>ZW|Sx>OBQ-YS5j zP;>7LHJf&UT5Qf-Quym6+Olu83R5doxQep)orhPN{`DQKI(OODR=`%Ey#fQ!q@N~5 zq?nYDGo+N1k#bT&9PsBe9&T`_O(FZyq}9>xCUG3|gm#H!5eLa71*8@p+>uQ7kyLuF z((a*UEbS~gN;Gnuoa9;(IY1IQH*RJQ8uQaGkV;a+&cbNg3icR=FfTuLEj$pwUPLT{ zP=5|AN@E~B0mCpH-dM%PgfB+IhyHky%rcs^BjgY<!WhLctX4*{$uUA%v=gL|<QYY1 zhsi;bKv;~%BsGeqog<k<CpjdaWRP@{MvP)lkz!Is&Xa0#kvXz({bXw))2)S!WiKU= z-IocNh)L|cOksD$pGWq#ya`^bQ#YMq^;{!Ko$2aKU(aCgC4!bo>nv5L(z;HSeDQR5 zim6(RHJBGdsMyoEOD>v4@?gH9m|j3mm`WIbfILF2^mMk0VrUI5uOQeAkZJ~~ceqCQ E4Wh7DcmMzZ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/index.ini b/res/Keyboard Layouts/index.ini new file mode 100644 index 0000000..792ef43 --- /dev/null +++ b/res/Keyboard Layouts/index.ini @@ -0,0 +1,89 @@ +af=Afghani +al=Albanian +et=Amharic +sy=Arabic (Syria) +am=Armenian +az=Azerbaijani +ml=Bambara +bd=Bangla +by=Belarusian +be=Belgian +dz=Berber (Algeria, Latin) +bg=Bulgarian +mm=Burmese +cn=Chinese +hr=Croatian +cz=Czech +dk=Danish +mv=Dhivehi +nl=Dutch +bt=Dzongkha +au=English (Australian) +cm=English (Cameroon) +gh=English (Ghana) +ng=English (Nigeria) +za=English (South Africa) +gb=English (UK) +us=English (US) +ee=Estonian +fo=Faroese +ph=Filipino +fi=Finnish +ca=French (Canada) +cd=French (Democratic Republic of the Congo) +tg=French (Togo) +fr=French +ge=Georgian +at=German (Austria) +ch=German (Switzerland) +de=German +gr=Greek +il=Hebrew +hu=Hungarian +is=Icelandic +in=Indian +jv=Indonesian (Javanese) +id=Indonesian (Latin) +iq=Iraqi +ie=Irish +it=Italian +jp=Japanese +kz=Kazakh +kh=Khmer (Cambodia) +kr=Korean +kg=Kyrgyz +la=Lao +lv=Latvian +lt=Lithuanian +mk=Macedonian +my=Malay (Jawi, Arabic Keyboard) +mt=Maltese +md=Moldavian +mn=Mongolian +me=Montenegrin +np=Nepali +no=Norwegian +ir=Persian +pl=Polish +br=Portuguese (Brazil) +pt=Portuguese +ro=Romanian +ru=Russian +rs=Serbian +lk=Sinhala (phonetic) +sk=Slovak +si=Slovenian +es=Spanish +ke=Swahili (Kenya) +tz=Swahili (Tanzania) +se=Swedish +tw=Taiwanese +tj=Tajik +th=Thai +bw=Tswana +tr=Turkish +ua=Ukrainian +pk=Urdu (Pakistan) +uz=Uzbek +vn=Vietnamese +sn=Wolof diff --git a/res/Keyboard Layouts/iq.dat b/res/Keyboard Layouts/iq.dat new file mode 100644 index 0000000000000000000000000000000000000000..a84fd573725db75bf37f52b74a407b13aa424f87 GIT binary patch literal 4620 zcmeI0`HPKF7{@=)WE)#Zl6~Kou`k&|L_|c%F0w>Kl>IUcml<Q<HH+)c&Wvr$jHo+_ zq9n>Wm!wOGB2kjW<GM4=eXW1M`_}V5=RD_ozRz>Mb$&R{DSmz<S;Gp((uVO&WHP;& z$~0!Mk#+QC0L^I6XgU$cDq6CPt}G#jN>rg5)u~Bs>QImR3|G2FG+{RlXviRjvPdJd zna2V=#FG%o_b+$M0XT%0B$7Gch?h<Gg$F0frmlAta25Cu1$xR)&{Jwjth^w=D_--K zd%Wi(pQtZ&<pB@5$_<`zi@Vg2>r|0DRFZUj_{k)jT+Wiuc`ovVREm|dxm@N7K^}u< z_{<l+(m)zYqe#AgmDbIH>m*I3rL>j~j(8bQ+i*PY536M;*SiY13RG0U_sfl0tdXVR z=<@JCp#oxVWE`*FBmHEc43=RsLPp6L87C8Dk}Q-yGE-*DL75`cWWM4ysI8RMvR1s3 zD9I6qiZ%Rhoa(@xl>Ks8j>>UIJbG{XUst2C?#xxdRUkGdT7&D68+147Cf%1pDGf(% z>%T<a$xV4vj>sw>!4t`lOFI87c~T$`<&nG$uRfLMVgI25Hac_ktg@pniTNa7<g0x9 z>;9^aUD2HG%vHcuAX<UO^q{A{_IuMu-}(LMuW$W0eccb%cYQ48GUgH{2fG!!1yhVE z!tTJF#pGdfG3Tg-xrn)d-G#}-Zo_0?vat!+?bvusAtqlt3C52}!}u@-yelcedNEnp zotX2OE81FUp=mp_K?%ESOJTE?5GbIrb{mG#TKf`hnMFH=b)<v#6FO^sb`N$pHW{0! zj769;%%QZ9(j%A?+ItwHRCX^miJ44Sgcfod>%k;yhJm!g?jz*!vkALj8y)KvqK8e_ zPDdBIVN%L#3izEx*)(iAR_T1$Ggv=11FOf^6QwHY0Ycu?u!KP$!Gs@$T*DS%a|oUz zl%lX~b(sW82&laI*j$1~v3cc59WsPG`O2#Wdv_{tXp3JhLoHJ+OIMW6lcScawnr@) Xb5hfWJV_X@I?d`SRx46V{C$$|Jpvdq literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ir.dat b/res/Keyboard Layouts/ir.dat new file mode 100644 index 0000000000000000000000000000000000000000..e7f7166a656f3e8c24b573d283bd9d796deebeaf GIT binary patch literal 4608 zcmeI0duWzr7{-5>QOra^lB85JH4n}6DKlG<B1mRPiKv-Iq=bc_6j3_oX-?fiXCBHT zbvd_hbEoF!(j0z6JRliT@jTxvQbR;SG^vmZp?jbE#(HHa`0x9|&3!-jb04nfg7=?m zKexXbtmYG5XE?K&%Y2?^A#byY4XoouCNr2(%w#MR$t0bRc!m$?#Dk>Kg>H1G2R(V5 zK1{c90~p9Q`qGc7Ok=ra-sL@(vWYwjTKC<}?F|)t$yT<rlii_w>iAhQC`uh8A2ARy za1RVj)$O8dJfX+*C+E4zKiuM1&;xo%1Jz%bxXf98;s%b3^wv2ZRlp;PQBEZ_)X~6E z8aYlAS1I9)jU25LoZ<?<(cLz5Ru^^C5T$Ea>%O}|dnr_xp^+M|37Qnjr{+vd=BIRU zo2rU@#6ZMAdj?Lo{V_!r<+PqQYnes)DpX7d^r1f1(zd!iZPCkmMXze6Uehei)*Q{( zTguinEz$d`(>q$MOs&xuR=-2L^tmcjrJA<x_9*U*PlW1@t5yv<qQ+1@)%jgAf3kzy zR8{071|kO9GjQuZ{+RFegU;(m{Vb=1F6g3u(IuT#v(3D6A9Gvq{T=H6OP6(3*Yrmy zpL)yh$^5?^+@`7`A2ARy(4K)_1l0sJ1m6(U5*#9^Bd8}hOwd43#V}I>(&&t<!yUqv z;n(0-<G#f;;5XnZa0hYaB(mv>tHs%%TwDo$9qs@whR?>YCs9hGlIE;D-oPEk)#GY# z)wn8LCH@#b$Ha#bJWXF)n$9E}H-d**WdP#U^x{c;IlheR^+)kBns(xHt$K(_6F$ot z((r}&TznpWGrj=71)q=KYHG$jR+_qD_`b#!<2T{<<BD+maHYhL5HB-f!|kT2o)!4D z_-!P1;j0X<4g3_hmkdMXzOscasTP14VSo!wDCuwF$5Xs%0!VY#KC^tY0v6DmQ<$VN z-ZJu_S%q1-S<I}=Ci#u{YOdEFGi&5I(@rw&#$K?)oV{qfxnhPgh!+e)d`}X>iZFyx ejAo3fG~*a=3e5zbWu&d`nnYchY>5~Dzvn-dvlbWt literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/is.dat b/res/Keyboard Layouts/is.dat new file mode 100644 index 0000000000000000000000000000000000000000..dcc8447f1aa723c5f2ac0affb27efb33fee42cbf GIT binary patch literal 4647 zcmeI0|C7~Y6vtohk7lQBwxn;UOkYJMgp#sbQYev1B-Rp<Bw5N@Nv(EEF|{&Ts*9Cd zt+mriZL6~5`P@4UCZ;LVG?-jWgJ}$=@nx8C?q~OAeQ4T0;B#lrJ<oHV^PF>@_nrI0 z`&~@qXE?Vol|1?|iqVW=5La;x<H_e%E?_V{IGf8khk@KoFQ(9+NqDp(i`KLuhjz55 z1DzOV<+^bev*^N^T+C1=T4X}dq<}lQtFhflzZZlu3b}{b%wb+Ap4rX~7DbtD<Rb(k z1X_T=v8J5u?B`SJiLr}4G_aZX@JVuz�oBmw1IbDv7g?_3ULMAM+$jc#2Y%@iZ%W zmQ|FqjVGwEnqRYqwbW3{hqik^=yHh9`Le0s$=pw&grj`Lw;bVzP&~8!E?E4M*+xD> zAVQ!82t1?4q>-AVnHsAe8m9@GsKFMWtf?y0JPpw>byXjYRzD5WEOplm^;d!Z;4jcA z%2Kv+)K2ZyLAm;kE;>WS>J(HSp?vex%%+>o4`MACi{+urr7F@wEmBD+o~gAsh_5)o zX(lW35dskc%@OG9HSP`x?{^(mgTB!beXmdKpLA3|D$8r-?b89(%jpXx^^yM6ZvCnc zbWG)XUKLuWm?{-lm1<P0gIc9JyL+1VcIdzOv$DOMrf$tA`2Tg!P-b`URIj7g+3OmL zXKtS!#CxCMG?Nwi2!RNJ<_L5%Zhw*S^h+3GT>Vnx@0W2Q{tgoWT9eH~JjzT8d4$K9 z&wV^-1l-?hIzU_F@(**jvGRM3>(AzX<K}+c<bh&}jN~t126K6U^Ee;>T?Ww83Jx>{ zp{=P2ZHzhO;%ZGO=tXan9QvBL(9aIeHCZ7Se=P;pe3B^*W0}m2fif}9bc7r5S2NN| zTwwyl7!xS24kU_eO<wTJtjBbwaV0mIesMk5F@oXvvE!}t!mV9B?k(Il+-}?+Ts4oI z){$@g<+kAIqezyJDyhcpAi0TD*=n;jX3yd8Oh0OoRkSDjFOymvBT-IrC5cTWcBU`h zo-TL??hV{7T&1O~H``#Kxb3*Q<6|xS&seXLDqV+r4Y$!&cB^!QS&Y=u$~0zfE3Ux? z+`EP3l5}NPLo$wg-6kt1QHx)ZezuKPhO@D)ud5=tf<)XfPG5P`eug~U7CWmjd(qHx Q@8G|H|Ib)1{_nZ|27Z$UKmY&$ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/it.dat b/res/Keyboard Layouts/it.dat new file mode 100644 index 0000000000000000000000000000000000000000..4b36e8ee21c9240e3c6f0d3df6ef232a6c2a1252 GIT binary patch literal 4657 zcmeI0`)^cL5XV2?8+_2XrV-Pi6`@!wQUpa&QCo{5h=`&fih?MLSVd6~5wU_58UiYm z#+0VEJQ}*zR-rUPDKB&Gt|4kL8jTv_Yt;}nL=Ewg5FfL*T~lu)^bfe3oI7Xce9z46 z_vZdE-z9YZu3!dtQOr4%a1EomfH7Rp4cy1Q4C5mDb1qkL9)(ONkExu`?RfO!L{27) zQ#h4uPUCbgw{*Gm;}LS`%f(#EWQ*L$&D_c?W>eZ#?|5c$2(XZcnakrW2*oq*{9sd- zaU&Zs5HZjL2LA5Cbnqny*-Ha&;Yjd0Z?m6w_=d09LM!Xp%x>Z|^En&&j3z!|85OKx z6)&=yN~(C7YT7BM&T<~6hFaR#&PV3G$NPN9cO2sT9`uxk91Y=q=SP0x7k&-JGwzXK z^Jm75Y{WpsKo1zGRVQeI7HOU)sZdiiRnt^t@fn(_r7F`XjaGq%X`+T}q!wt9=4yoI zsFzMsmSW0QALXd8&eT~NFHZxNuN69512k6Sg8Z{ITcx&pzN^~t8><c>t5l(tdO?+; zcqY?JLA>S|rx{daBL*S{x-&4;>-4@=Z_o37P*R8WvySLv`;vasAIkP(-lsaKecG=> zdRHIl1kVZYfd0~k;A?A8T+P~|HtjG!rF!i#o9lJh^9y|yVA3^?s*lym>8jVghyU9T z4&e&CGrWFYe=k22&)m%m;zN#cnn6W2VjyCmI|I2k+Yh%n{SrpltbUoz?<2X;=6t`! z2K(MNa4)p6eI8G+$VTr{8^IsLf7MignCSxZxt|AYrhkx!Y&xHVzYTu_)9`olG*6jy z@FX*N)TDqR3^hSvFazvaXfi^~B!w)NP=sqWwIGjyxCZh~VkoeaK_)H~aW!{a2e+8a zaGgm9lTC8Cjd3O;OvG=pR53;|$#jY_j16>(@uo5Oaokp(!Ns|gJGho9CS}~j1g<14 zZ)EBhhwHnYxNW#L+-}?+Tnmd$3z<$C_wZ~$LkY=pQsphU?Ih!*D%RMlvb7e!9e-~C zkKs4sugBj?qLSn)5^)mk>6;}ct5{aojN66VL~7|Pw(9U(ac|;w{M(u#Lfp8Gq?Xs( zvK!0mY}J!mwkge<+h?sEXd?MsI;DGqWFu~~^;Ais6@MLmz5S0eOXydmDe>3fUL(1Z iM5EE1zSU^2q8Qg?y{xlUgI|g3z^}&d*3z#3w)78Z{tR0H literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/jp.dat b/res/Keyboard Layouts/jp.dat new file mode 100644 index 0000000000000000000000000000000000000000..02b807f339e9460079addd43ba8ee74a5e81cd33 GIT binary patch literal 4593 zcmeI0TS!(>5QV=b5hf)fA(A3?FD<*7nVFg0%*<|PR%T{*Gc!xOm`OxPh(w5lgosE* zgoH#$L_|qML_|c0h)8sUZV(YfL^S;Vf5;)xr+PW(VP?<l*|YXua2{qIr}v8|n@kcJ zLlViPFone|C6ydD5yNyM7)JsVh$4$f)-s9J_%Vc`_!Gcz0tq6Rk;GZMQG~OL5JH(r zEE$$bBi(E+dF1!P4QR_86(#Io4+RuE^1iUpvpDJtUGFmBGB5}RzIkhI@SLZ#(ZDTk zbB8P3<sR*H@Peycqn<`?(!?d6agir9^O#Cbahfw!ah7UoILCQfso;Y3d`T^Jv~ZnA z7Cqph*-pCX_TmlXzBmd#(Zeg=@WGMyh3`CzufEXrE(0zDgJ7UUy+zZtTIq__D8(sW z2^yzFB`H~%TB`|~q!5K`rXn;(846XJB9*Ei{NxwNPeU|R{tD1=#ppZ18mU|bDo9b9 zqNRqAqQz#jl&wu(yn(J(<fto9j`EbRJ&wGu&kj$%xSw5LmFrywTn73w@Y(yvT+?Gc z)OFRVRX21~jcU^^-PTh*QInc=UKiA&dNt^gYV|-D)vhBtrgBxNQm1rUXH=!Lx~fv0 zv!0!*R*f#{itbr-M|aIW({sJ>;`P15-`4LPb#K+7E_Lg*Bkw!g<H>*QXV+KddY1v0 zfxZlcF~g?xSvIH7w%L6S@yxYpf2z&u{tV+FN7zXThdD+mdpTh9cQTt9!8Q)rM81pN zo~e8vh0HU3U<=1N%67_Z&M#uWsR%JlGtD5<I!2qikYgvOnO;!IeD1dr#%L29#+tM+ z-lT<zCMrzkq-~uv@HK2;i3tsvY-BylS!IGl9_7|xA?rNi#4?j7(pX{ALbO3tm{5_; iB9kXlOmbLhU`Z_a1D(WHC-lF2_lf`a?)#UW5C09iN4oU@ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/jv.dat b/res/Keyboard Layouts/jv.dat new file mode 100644 index 0000000000000000000000000000000000000000..3d4efc732b1d37c50230cd1d3258444be88b8e9b GIT binary patch literal 4958 zcmeI0eQ4EH9LAsLIjE^jP|#j9v$9t+t;}9+k)ffY)Syv=1__y1RFssM_`0^~R<mYq zIdkbcTefnmX=<}fOe`!6EQ}Ho6>?-?U|?YQ+<SN9a&y?f!SBN7eqYY_obUHMm;28- zh|K3nw4w>m;vT$!m+&$k!Xhj~1v=1%hw&)J<32ovNtlin+=)g^K?8)|=!XFqgdw;D z!*K<!#uGm7W{krgT#p;^7#>HRGgYWTEw-W)J2UOh`+Xp<Vn23cFTTdNdHHO(FYWx0 z4HKIvkSOpU6li6psE~^}kCQo=Q#pf0ypF{zVJRzF#?icq1-zIOc`2{r0uJO{Ue4!u z2#0YD$8iEDaSEq#2IK_(g#JFWp1s(IxAG1??Pw-vaW<>DlB>G=oo}?3yt*c?<{GZ$ z`n-JhoOS8^#vWF)Rf$a$NEFCbpj?^gLY1gUm+1tr)HNC<YK(5tZJMc4^-^CQ<4F$H zDV|}mj&p`ibE?|8ncKL7U+_zQ#c%i>zvp0W;$a@)T>Z#HEYLtrc89xEsEL}TIeMnM zU+xU&@|Wh-E!6XRQS-DQFQ45zKb<e@VKrNo*hGOufm{VjLMHlMW5c!KPwm!U`dbPI z)jRYH1H$cLT=-ePs8f6OhxX}!ZU{RyGVIrgP^B8xs!k1RRFhiNsy6+m<=XCl;RB&V zTXa;vYM46=3PZw0;qGv6xWBt!?hNPhi}UJ=!lW=IObZX@<+FRIr}K~Wu$rw(Y@$G- zK&}Eq(bc@tyl&nwwPuxh)2udirry+`E52$faRK_;rs5Axr+MErnvG_w*<!YvcfD`9 zsX~FHPffd7Z`K-jj2{_yiLaRtTv=|r+4gO-$iAnEZy8S%*O+G0WZv_7g{ic^#4ima zFdC!$YEghOevw#+3E0(+)YV=wKD>FUS!T+-;d8UYeC&9!S%OkWD}1r8*k-Ctm1#Ba zn9s~M^NHy&(R)^y>h!gIYTRTt7>^w-Vsy7?(V~To79dvmX{4)poxN0l_l%Y`TH@GX eT1;v!bz#pN%Tf5xm3GB{-zoXIEYknu=Q<1Io)1O< literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ke.dat b/res/Keyboard Layouts/ke.dat new file mode 100644 index 0000000000000000000000000000000000000000..805cb06fea78a0d8e124fd27c4f6824ba9f93235 GIT binary patch literal 4600 zcmeI0XKYVl6vls#h?N!*yY}7`wOg}BZHl657e!H2)vT%#D<UEyB2pvLh%_Q1B4R~w z?Y;Mk_#o0mM8xS||I`g>`F!t}^PY2`d(L~F<bHUbWPUvD7{zcpQHwCT(2XYapeMbF zA)02ipc-}PKs_1}MGYcpzz_;im?9LT1Ob$!G-W7D8*5jYDomw36=_Lp23aM7ehgq7 z6PT1cFTarJ0wfSi95a~hs{7M;-yzALdeLLRW1s*GWanZIaf@plVFyP!#&Py>f|H!) z9(UMJCfnG_VRo^H8*Jwa8C+r+DWsA{I%`<VdN#6&ES9j<dcI&YTR6Z$E?Rb$bDZY^ zk9bmmJLNz=x^N$O#w*_N-c|Rf?|g?({?v;e10DkfU?5pPKp`5X;cBny>Znk4Rzr1F zcZDlP(Q2%w3Q|qARc+N*l&UIHbu~m^_{uj>Ar)3p6<2^tsg*ucL6tOBWmHbh6|6xv zp_d}mU*j}ElXB<fceO+pE<v%1(+tga)%|_qef6Zjy!E5J=rQ0ike7k%+&|`^ZtAKI zX`2q~h>j{l$8=mLbXT{vNBguz+m)pq+NJB-s>|9bN6VC=RHZ51daTh}U#A0FqRn=C zt_|9x{mRq@%TDTy&gs4$>ah=%_XdAHe{|tK=&4@nwcfkx{;%Kq>Yx7d){pX{$AHH` zUIu~)HkIDWbb5$s_qMd7y{Y}Cgqp4|&KwpnnFQvskoinwmg(=&j3JQm%rz|^%M?@k zaZER5-jVvI@S{m4iHRhd){keV`3TKuZmvNM>)F`+g+R+nm~sf^R2D(hG_#?$SqpW| zXvi@a8qkoj1}w&4Mi6c$LnI>^Mjr;6k+8_bMIc=n>N6*LnLQCfU$YiEm~F9?#b#kd z(cNr}Ze}+0w_#y){y93#J^I()&I()HNyk}*vkqtFe=P6p#!10hp3nY^-Iw^ae?6QG WoUDJ|J!kT2oYZ{QKehMw(cb}+naoQ7 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/kg.dat b/res/Keyboard Layouts/kg.dat new file mode 100644 index 0000000000000000000000000000000000000000..36faec0739394b45a05af2783fd2d3b069b8b097 GIT binary patch literal 4741 zcmeI0eP~x@6vsc`Q;C{diM_65W?4&ZsV%LcVhk&>5-TwbD@l^XO6*mv=6q?XEoW=i zQd5`H<;$A3)HFpA1gSXBZy^OzVTcq+g;YpUJ#4$MZVmm@KkkLgdCvEI?>Xmw;rZj7 zRkS{%d68L+r62b)o(CvmB9oZRE6iaS#pF}KT?}9_&(W8sDP#u5xpbm4UFk*-E~F>D zD2eH=q&G{rgv%MhD4vMOqddmrl(B&FwtA;CH7P<hi>P2JRVh4im$e*LByMIi1u_NB zK!K5JB^~Dq_0kCr@-rv-jl-PcPyQxfSLthxu#ZFh$mcY3sSa?FoF1xW9qZZ1W*TT@ z8%=EI7;D%YQx4QlcJnPqIX_k~ou|&~t9~kIt9QEAic`Fy>aRi#Qc(&|@(gLghj$Q7 zSeeZf$P{R=z;|sord+$!qzX+_rK+@C&#Oi&wOaeMN3->krf9kr>q$MM9h$1GnyChr zXteIs7>(6E8mIBPUlX)Yw`;N<(HEMiNh;MmZHg6YRi}C#&_NwK!y9@e#rsO1$(7UL z6rTLcmo4}=9YhmWW-|pc1==f6X02X<J!BKC(7M=QE3#pBnHAdz8)Z}MVav1Lc8+zk z0d|31Y!6x|yU%*sI6J1}`avi3lYY@j{i@$}O4r%<Qq1|3{h`0q$F8xvqgP^g*ch8? z(`<TMz4kr)-}&VfZ??^_nKsK_Na4x1&$i&D9YhmWW-|pc1==f+$DlaV58>uG@!!JG zIP2faO*Ge&tBsR=7knpSAz>c=3EqT%if<#76JEo&6BZB_(VZ}#uo&Npe~9lTl;V5v zUHC`%$As4jmE;--ZxCK3%*A)(I|yZjC3qvDf*ZMkd<N1#ZWg-7w`<%y3}=5MdGz6G zj?S-+ONeW^jggUfeOyK~Zy>iew&?HRb$BgagTIBZ#NWg>;Pv=&d>#HlOz7|98}ViM zQv5x9HNFae7q7yr@y+;La$E2Qd_BGfUxB}kuf;dvmH3vp`bZj_lWy>AQ}90xo^1;5 Julu)z{{S<-SiArL literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/kh.dat b/res/Keyboard Layouts/kh.dat new file mode 100644 index 0000000000000000000000000000000000000000..7c10e7d6482b6e3f361102a7cebaec582c75e47a GIT binary patch literal 4849 zcmeI0?Q2y>5XPSwilkzTh={02Dk|}<DXl128;b=61qB5~X@v?Fg$flaC^eX<sfkI9 zF{ZbA^{yJtSYwSQw$a8m<@(m5t%{0@w)KV}MS}Rj4<bc;_T-+B9t`>ioD07@yL0C3 z%s#W{%ic!UZ#f!Jhc8foFR=#eFb_r8gi<u45eu*wlQ12hV+Q8HFa-{?kc6TS`r=It zz#t64aE!oce8%P8#YCLLSiFrTSc(Ka71)LyXhAF5viV+SZbSmE;tYPrMO=>f!|5Nv z;AS|DZLC17z$++FCtX34WUZ`{0_i8yWroa>T$v;DWPub*p^TI~c}@Du6d5SPWVPhT zN*OFG<Zs+V2kzqmI`IgP@dQsXQSL&yX0`kW$ar~2mT|UNmdH{mkus^w=6hLbE)tiN zDyflL*%|SN>m&mIzFwY&QL&8`h!yCmz*r4u{esc0>=)EQ`!qZLS32d2+~w?E;JKdl zACe<-RGQ?3oRrh@tEA<uJdt|2B!9|aJukn>BY7-+x$ZMj?W6s5fDY`=7v_Dj9UX}q zp@VdY4%6I-KYV+5;Lq#jX&4pTSb<o9o(eq7elg{GLEE%OKh=aL)#+-jQ_}{$tQU2y z7V08hrd7H^SLqr3L|b*GwrIY-r<3)4ou(h@Or5QBb-tGA1YOwu6&7nrFmBXl+G~2V z`$^9lUNn9XiM+3O^e_EKJ0kw@-Av%`?B!_~728;WSb?4j3`NH6Bl}4mIY17QdSc`d z`Ht*GCPja$2|0M3_G@yA{$ko)q>Ah$t)zwiO|-SNMYM<U2LFE~j%*>@h>zf^Zab}y zN|IkVFGsq8!=t2}_yi?nH`zgI$hQnTO*nU3c+t>aRE`N4hp9}I&nt=b_yFnS7>c(T zkl?*U#w9U||CNNfT@~^$hPHx%Ib5)m{KWYN+9RZz{7jf6b&`HxK!UUp^Sf~zxs9Av z5WfSj-)7n};#cvS`rVWv?Iro1FnP+q!Z7C-|AuVkm{K~%xLQo(UUGw-6hwE@UQ~e( z8B~ptXy3pZ9o2Tb_`+8x<c&?nZSCreqfl-Smu@6pNOmyAZl;ctV}#vIH3uDGlw%RD zlmb@bWBOAV&s&>(uDUlUV_me2jN>w{i8PZF<OjmmI^T3Jl|K~6yr{<J8f7p_V?0{M zqh&lo#$t>|%UGDP7&}ZFd_l%-8I>~j-dMh|Tw^|CK4U&(K4U&(K4U&(K4U&(>x>E- U+htVND7>|C6aGx3>;J!p=h+>?kN^Mx literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/kr.dat b/res/Keyboard Layouts/kr.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/kz.dat b/res/Keyboard Layouts/kz.dat new file mode 100644 index 0000000000000000000000000000000000000000..4385c2583750a7781251bd724c7e00adf4e3306b GIT binary patch literal 4741 zcmeI0YiO2b7{`DAtJ6x9jFI6mW>%)D8CIgU?0}VI=kxh|6w4CBN<6H2NYk3j*_>u> z&E}!anWjz6SQJG?*Yms~6;d!N3PF&fD2lpy_df9U<gzb*d!8@XeP72vzlZzF)kN2K zIWw5XwG8D3Zss=5<xcM5eyW(wST1BB!?}tPjN%yvGnI3A0^@Lw;uv~zEXPqwANq1x zXg7dUsG%R_jN?)!2hT%H<Wc6afJKFQ2Q#Zv2`i~)Da)u&`IBp1{?M3QGn)~}2>cHM z<JFb)6DR9L{YH*I_zP1fN2o+SG*|=m9Y63XyZMDL`G)>-%Cv_Qw2lq5vWYEhqn#b> zqJ#Z3^Koc7Qt$I2d)deFVL~tUR;h++xJDG_9ZcG|RNe(TTcb2aV^jX5PetB;NjK3X zE3+Aaj6gAg?+Y)cM(=5->NG_wv`P)CRFj&uULWZL&Cz^K(vzyyQ<|xFHCgSNuC1Z+ z3SF)1bYs59ExKKIsag~CuqNtr-Kz(*P>b`i7PV=!KGA1|X~hZ-eC|wTeyv!$^@aAN z{7Lm!dH=WFM3bz{W&|<<#RMv?>o&~pu$$~G>t!Qtv{hI?JKrv{i|szU+sbW#l~`{( z(@L$c-D*ATdh27?gv!0zr~Udl|LT6#@A^|i>_;6LB99q%n4M~a^8Lr#1iR86v_}fl ziWMCAJR_C)v`w<dZHi4x`IG9YdH<|#qDfX}GXfcbVghBHM6Qmgmbj6)h9L|iZY6Fb zt|zyacsnH=jlWGam*`o%9p8fQ#NQ;EPxKtVm1qvpg0KdNs)!cioA8bJE}~iZJNR~d zGyWFQB2EjNh3EyMc|^1E9r!k)N}}iSHloFJR@H{(LU~w1oE{bsJvk#R7iLmHM;m4I zC-*Wwm$-p=31b*d+(NvOcsaRd;`X4^>+m&rBfcD8im$|L@Me51z6@`|*M+YB8onN1 zg1?Bb!e7N-!Rzst@LK#028F@iiocGp##i8BZUepnuf|)#Iwa9}URq-@$wNmms{SvC biMZ+i5?6%pP@(hiTe~NhNb6YhPi=n#v72j% literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/la.dat b/res/Keyboard Layouts/la.dat new file mode 100644 index 0000000000000000000000000000000000000000..f4b6651cbb202844bd2e8ae4580605c871cafad1 GIT binary patch literal 4905 zcmeI0d#sOj9LL}9_fszEpd^aiI-!t;T*@V+(YmW9%O$lKHd-}V&Ya^C2WL4PLXJYw z$mKY4dsKF6ZehAn89R<)+O%m?E46z6e!uhM*N-#(%bsU@J)h6_^Zk6jpUbo7pYIPy zJj3uYKEP;n#cOy2<M0%+F$q(#9&7O|`lCI1U?d*GWB3U7;e9-eg%B#?I#kDvxEZ&i z0h*vGUiNWq&<@*i7w*PD48c5GW?&`?unAkSEs^fB@9)w)_Tx+J#BS_MvnQ8(;>v;K zGLq2*q6z$u3FI^3)QKbbBD=8;yR#>Iu^IdDQ9jOBIf^aVnl)IDU3eRB=TO$-3v9>% zJdC3_j#D^|GdPPs@HfZ~JcJCNIiA<DD%<j2KIhew?8|33hGY3=dA`e)mY3$2%Pi(_ zBB!L;ljls1+uyEWH|Z70Xadm$QYSD{iPc|xKpl0BzF`$zubMi+n^afz)msnhXa2(7 zJV59tma((;v7L_a9?j(fF5(g{;|i|kI&R<={>cJv=T7$5XDs2b{EaQ0p^-AxT#x7p zJzbtJwT4US!_xd-Qa?Sfff|x#PsR?8+lN=MoAiogG=XRWsS{`#BvyO%kABy;TB+}K zP(LcvVI9>mRStsSbA6$uTBEO3q>VbK<vOckozW|LU1OD{98FfP@|3SR`bwj;*neTI zV7>~qL%Vd^tK&MUQ>qqZ1U1U@rPgpMy-Av1gW!gsc2Fm%pJq?S-V(QGR<N7&iexl_ zXacDdsE5)mOU!#H4JTO6HJi+4Gs(;`Q%!7dntk$61y!ww)?@p{W|3KI)|*evQZwJ= znFZ!UWcXcVR+=1B;OK0VYhtIbGb_w;GX-VYjtm!CkMXYcSj;N3!E7||n8mhFv@G;Z zLnE|83v_m#*1nM#k1i-Ff?Eso%`7w9#FEZ%z*bAQ6}r{X2Zi&D%Z;~|Xl$mviZRGX zUTA8y^;lD%I#pJAL-+fNqouDyO2gP_rlT>s;SMKHG*F1L39HcDF>6dp`Qcj_j7;2l ZzVNOW6@JxxlW`Zdc7=SCl4bv`{9il|<KqAT literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/lk.dat b/res/Keyboard Layouts/lk.dat new file mode 100644 index 0000000000000000000000000000000000000000..2b778d6c1d8af1f388a110ac6d7ce35cc6922ec6 GIT binary patch literal 4716 zcmeHL`)f~O9Dbgc7$Jn_KKHqA?$^yF(pp;5T8vqUh1_qs&1J5e>#Sinx4B<td=J)I zCP|VcNm>m_evp(q;rX6@Pko&Xf57?H^FE*V^FHtUe$I3H{%}6$QT2<(R-|GgIwJvz zn1&&kf!Uag-AG3iMxhP5Ar8GT0GrSrtI-E5U{Dja5Q4g>hX!bf#%O{V9oGV_kb`Cj z#aN8PGG!KE5tbkmS;!9D_b)o_5)|Sf@=$<duDmlnVh3lPsmGoJo&*2kKmw~o-w?^3 ztiea9%{r{l*J#A1Y|g>#&o_97dw7DMsK86fAD}Crp%aU71s1NM1f?j$4cx>nd_fWJ zN;8JHaR(pp2_1ApYqn)O4req+2JZV;X%k(#IF9Bx#&EnV@0=5B=i{qcbyOaE4tNd( zJMb>>kIA?B1lRKnFR++<Xt9K4%HHLEjVqbPquj;}#cOOWFoj7>=5)^FET(V{=W#xB zIhjkjoE2Qi#XP`6yd(8Z-r{ZE=R-aY><zBrPw^X<?lqtC8DH>~EAQ-mY3JWov+Afk z_8jmW2zDUFRL%O>JivsSA&R0*M~$P*Sd9}*xW<M8(8`2~o7ge%k)QdM-}!?u#?&;m zOo)jv@7cg!uWRa=9;TOx(=5isn(={M!M9f*&vdDiO}t4klT4B;@0^fm=Vw*3>Zm;S z9Pk_ncAzC9^)25Q{m@_E_5(2pgAswA7_RU7I;iwz2wQ|bLWyurxGwAvwh5WSWlY8t z)K`>-N^7I|f_SqyN4!aVL^vpvVko+(yO5~(m{2SfNRuk|2}QzH^iZFnxB3lXs-ruG z>Ezz(F|1Qf<wa<Tb{K&U=!j03s&+*;grh5xBn;8!ox)aOuMXWVJ|Ez8#s2wz;R;q^ zja{xvwAL$gQH_d9U#{RU{-|(BD`{$iw8vUCJ1Tw0g|ot8!4l30*Hl^*qE$h8fn8~o zyVAc}Yh~+>-NFH#<+t{PV%cf=YtL~k^*@ERL93_4s>+uy&J!03yA<aKSt^~azl`Up z8LI1fYPwz6YIk9OvCz7tL-e*S|NA;A&Jy+sxsGj?uJxT3l=W%V=YNReAhYsxwg1hP I7yf?lFA82lPyhe` literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/lt.dat b/res/Keyboard Layouts/lt.dat new file mode 100644 index 0000000000000000000000000000000000000000..d8c0257b63148d8b7cac1f9628bbf769ce250ac7 GIT binary patch literal 4649 zcmeI0{cDzG6vsc`8?4pPuq;bu*jm%le9JVosjF65nVPLEQ?o3~GOeZNTRF>#spVR= zt(q;XXF7*E-)&6mexX7#Dx^ZBnq)|ZNQH>>a`tSuJ-cb-A8<c#aoyLs&N<JQFI+#I z&oY{Rc}(RYM$ntv7|AFGF@~|^^Ei(&gdBR%mz%kofjrDrOy(LU;n0RO(rHI~I?$0$ zWN?GE>&6w#B9knJk;?>&+{3+$XF4-@s`>x^Z(9;cD5QWn%;ot=JUq@%ek=`-@g6%6 zJ8%XLoTsLwz5L1%zF-?)@-_R}!#8}#0giKwkMXEw2cNTxdVXOGKU2p~yi75#QOcWC zP|15FSj%UuV57A>MKv`9e8M3+9prm{<Tw7{#2IL6Oi6Fn6{er9ll;lww28#SdnMy- zTe%Ih;yrdCb|BS(isl!SuZ5be@fxU!nye`rVezS&rWaJGks7Uj8lrI;syxkAe-$WK zGu1&C>0)(K7iFlcGL@xljn(<;r9N7&?&{g%HBPrvQHw~bj_7xJB=dDG(@MRfl1MzP zD^AAWYUMV}iuc%o*nw0BvYn>WK{?JT9g?TRI-;Zc%3jhj9aoxjma|{qs$PM9(5Kp` zzx0t#YOhXcjow#6YgMfpZO|rd)>a)*rRuEq0%yB+wRnxcE8S_={BNlW{`)&Kl9}PO zcP?}~I$a|1u=<i@Jgb%4Fe~0;2Vw_O9q5d|1b-!dIesbrMuK+<wh*kRVbN+^Z`-sV z?6xug92?!|*zo@}&)66~%do%<X4+6cfwqPN3Yfwph7cZQnjwQH3>kFe0q$oW&l*;k z&4WB?<9|<j8DO}QuGX}NH7~K+-kfVgeGYCdrsYNa75HWNZ{Tkrs3h1-P)&Cu3X=%x zO~)9633=SfU4|6$4Oom~H1k<#opKFW+{jIaDQ@9b!x*<S*dWAnEZ{!I8JM`6>$$_= z#&rxeFmYPN;+m+6zVtKF(cc)y0OK9k8Vl)@6q}Q@VK~8J8m!9QPEbWd(JEUdwqC{C ziMQLjc?rCC@HXKW6D-HC!r$3g<!;4Yk6VYkCTVTMq6+iH-G;m4w4Mb~HJ37+%Z#O5 z&P1{;t<ej2kNKCzzI6nJ=7wulC2&755ykkmcx8C28+8=nR^hF}ttNO0KVc25z^zGo Z;I1<fWwy%A7WYHEQoMh4xQUiR{s9?e2_*mk literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/lv.dat b/res/Keyboard Layouts/lv.dat new file mode 100644 index 0000000000000000000000000000000000000000..2e4de2d05877dac49654fb644201e902852d1a40 GIT binary patch literal 4660 zcmeI0`EOKZ6o#Mox_}Ku5yhp5Wf7=Y7E!DqwSpp65z#83pojumu?lFdwcvo%wGF|d zg_Ks?MvSdn1)Y#u8gB0mA&na17By}|+(Qge<B||Pb34=2Q9}QKJIT%Woik_7IrmBC zhxaX|>yyKc+`vT)BbPj;aSoR<gPGjS0>(0)A&g)$BRQLSWKzIruEpVKj-@YY^rJr~ za3Uu$$=aRHVD4ZLr*bamagAm2xr(b<#A0qw%sbLioKmoor4+K9dsFhsuqe2cB*X9w z34{cCLEyJU&2~OyA5m)ANh@u<NISdf;1fRPC7Rj7bG%7CFYrD!yhkJN@Gxt6gmNC^ z37(>o4Q!-^)l^&0{Z#P`ukae37WwR9FQ4%_U-n|Bc*(((x&wU8H+;uWDfwjhLvZ;e z8HQ&_ASBQW0u|~i%F}W!(+myQOyz5q#%s3bs6Z=Jq=}lOGc{7vm8EPIYN(cIj27!J z4uOtRAEhZ>$7_HFDp!Ayp)*vflXZ%6G)0SS!d%VQLOWNfI5F=?t394lw_YVG(;BTy z$tU|ng8Y+*`8HV<o*{vdKu-b_oUZ6A^>g|--)gtM*N-}&clEOl>Q@bL`aApdf!gG0 zzxJq8X->P2arVk_HfobLt44Kd&^9&cRki2~ZBVQI3x_y66xB!iRDWCayZ+Q64Ri)M zrzPg~+~NQ3*(r5d&R{3g8Rm>i$tQn1BFK+B%(uy^@C*rr1bPz4V1lXiiKf%fH|>4_ zIb3LJKbxth>yKjv53q!l+{c65&z;<3`uipplFqHHGA+N9Wv28CxyzLK6h@iCUqC4( z+(xl!{UYu*A7L!x%r(fgo@2~kNVh1>l*3fq7BU!09>dLAILnNNxVbQzEN-#FzRY1R zmzl{>z<jRf3TB&;@Q{g%bS~k#z?`_;?1_A?G;3k9*%oUkGYexL)6K@1W@f`I8<xw( z-J^3;N4q<5-@x5YY~9PaZMeIvfBfZE+e^eERowu*D*WmIf!~bRj9+OK+-BTXYw4}U zuMbFgjR6WTiubm`h()&I?l2<$E(79K21NWv4T&4=L8R<IYt<7gufc7^ZLr%`dur{e zBeuRF&dhxsx81sLN-*-C#(y@T<Tv3p;a3=_`0!YyHojj3|M>uy*AVdX-ok4&VzEe_ gG3(rn-)7XjiU6BmZrnPm>4?&~r5l~Q?cYoO14}Ib)Bpeg literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/md.dat b/res/Keyboard Layouts/md.dat new file mode 100644 index 0000000000000000000000000000000000000000..d50029394f30513cb8c72e1821fb043009d0a645 GIT binary patch literal 4571 zcmeI0`EQMR7{xyak!qB&L}X0tOHm!$&?#lCrS`o{84Mjur}o_#t%%q)jaVABZ>c4X zh|q|*w@oWz3kDGpors8tA4DV~;<@j=#eLm`Kj6K|d*APKp5=SbliVN9Sx)eizy!w9 zou>5QH+mCCU-~nENu&`^dm7T5L|W2@R2nmySVmHbDpVzkXsT0#AE-@Ty4biM`H30S zqdpz!%y2_e7|c*6GnHwf`@Z#B>?)W~I<v@Nt_!aSGo8cIiqLy|8}K&p9UFKXsyV}5 zZgGx1oTrG39OV+1@$-Ot9H)R??By)`Im~VHxWPfL@h@4dVJ+)e&qg-0l^hEBhaEQa ze{$K*NltUsq7q8E!b2YM_&a`6pyaiy?iEjX$}?WN@L>3y7tY~L#H<H;8}K#|c>{A5 z#9L^vlGRpK6|eT{s5<JbE=tgF4OKnW7m8M_s;ib#R9XF0Q+-06;d7hm9q;)-nv-py zM(Sm!Zc0*5jno*WM(hfo5r{Hebu%<UlQdcBE<D&dRnr_iGh+7Z=^o;3z}rAz1NTG! znC&`mr#yS|wND4MMTc}m$8=Fe$}x16)@rBLX_L+=OJ}t~XF{Ffd(71Wt+b3^i?qzC zD75baoz!V3y5xL^_e6^Bxaw}|vPx8{>n=Rldqr0r{J)6VNb^0++km$LXg~*3>77ic z|6<y`D+&B+YQG&xrt7OQk0nfJJ_}jKB4#qj^!M*fB!($0FfE_XU#9eDG24`RH(Hs( zPh&Yt`IE(_^)va~e1v#@HrJrB&1`Gg7>lA!IV9mLw9A{A+0e|ag%)Ns1k8n4TJwh$ zMlphM^fQxTG~*e=K!%x-u)@Se480iTm=nonPoyx&tc66gEmpD8ER0n8n2pif%!VOm zX7r%vr>o;F@47s|(0>5`Udppi7|XIeho=9O@$?;~e09D(d#tN?4Q0D1&iR6GNp=`v z-|<h3eFgZ6zTh19^~L3@a|86F@MrVnLcXyq+wIWwZ!w;BUp8esDc)udOa;l3tT2`p N96$4m!*?W{;73G0#)$v` literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/me.dat b/res/Keyboard Layouts/me.dat new file mode 100644 index 0000000000000000000000000000000000000000..b3c38ff4a68a4f41c0232ab034d0fa34ca8515e5 GIT binary patch literal 4630 zcmeI0|7(?X6vtoh%NWzNEJG?Qw5*k1TA5a6u9da2EGsR`)GRYIGqYu@=9~?=mYFym zwmDlW<LYe4EV8+B$n!;{8%80BeL=b*6(S-PLeZD=-0hLwhot=h&*eV%^EvNx&gY!Z z`||v7-c@vdZsrLdr<ltq;dbs|IHlapJ<R4wuHjlPWeB%$B}19PARgl?rjj6!d<y7I zAI_#9=W#wa*>M+fF$);L1&m}gQw*8NBpzZ8bD7sw@BfyHNI*IBS;!(5NAS=r%Wf(| zGhSl`Vg`D^z&~9v?Hu7-I@rQq96Vas$9_KNM}A-jtu)faXQbH9_iW-Y+c?B>lDx@E zR<W8jtfiLqv{B7QJM%boY~Vva=Ac<$@Fib!l%M#e2R#KLe@5a?af}n3<o5_3n!jc@ ze}!he#tg&^^nigXbp{n_x~6Kh`e=;CYMd@HyhP(QOEWcCLsX!C8ma!eP}9^~lQlq- zx-xT%j8H;(%GZLdw@^bhF}o|(1kKhQ&Hc};+%p2JA`(}w`C6z&S{%W{%(5(Ac?NG7 z6|XS^F$3Kh=%47c_UpKQ)&aHXD;?A!?XfrM8-1sfI-$LCl~SwH`bfKVOwBr~UCL;= zl6p&TYqe@rtM#f^gZ8OfO~G53Xw>GMxABO6(<%LtgLUsDcYjV-Um<!{;%_Aqd5K;T zJoM*h@pI4M4Wr^UW*}yuI|Bo`&ZhM18D*3D4cut+`xu+{3mIl}eJ`80%WZ0ZiI;iZ zChvJRfxn2q8Lx)ErVEtuG|$*f|18hhbpAZvJ9sOYh2OzzylT?HD?G&uCIt*P31Ngu z2ZQW)n8^rzDKgQZig7qQ8OUH$9WFP0;R@3iicDF!+8no9cmWTZ%5bMC2UD2F!%Q$0 z;Q{<jcx&v4+n8)RMJab>b&7jUWAIktC0UBU#{`N;8P6joW!%qwj3tma!urM0`oT@7 zvxH1_3(hY5t@!O^lI!eQi`$0Vf%^&WyO!ss@Egc1+h}6R3_Odh4!-XDIF{RFo;rK# zakfxG1(i5k?Y_l^)t;`uBwBwd=@rZ*U5C?3y1^Js*V|u^eh+6GPMh&?pc(&-&i;1b zTMxUfw;H^ixOKRVL1Rh$4LBd*Y{y@TmohFbCFttYEZl6z76uKq2RE_%WR|Tv-I9~a G?df0g!TiDi literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/mk.dat b/res/Keyboard Layouts/mk.dat new file mode 100644 index 0000000000000000000000000000000000000000..df755b0bdc1673a855495dac2f4469e3927ff2cc GIT binary patch literal 4721 zcmeI0eP~cs7{-6kn^+E4VkX0tHBy(Z*=&A)tdfy2QbwjS(uR^D83REO#P7MBS((kX zT63BoQ$tGUXWF!sim33tQV|6rDxx73f*=UeaodG;ap<4^aWCBSp7WgNp7*&AoIl>T zj<%<m`BYFsKPFPjWD1!|8Pi$F0){h+zT`52K@>2L9OjbG9E>h><vud#&i(YDC%qUS zj_bq2RMDF(#_|la15(bcFfL{(%iGf3cC1M-)>6qTR`YHGkC$s&C$;f1jj02v19#xS zFtw4+&{N%Yfv>s5W&YtLSGdYGvh<Kn@hgWp!8yL;Cmv7>-Sh)p)j%VgX<`STv5U{y zO*5yd=TJEEaqZ&(zw;;egbdfYft0OB^k{p&+esUe;N>ev{gtb{1RkF=uoW-tWH)A| zF?AqyprZpP+i%Pw?NXCgXu7IYtu>mf_q0yy)vPa6p?R9BaxK*?&CyPkX^UoSlSXT- ziuA0;t60zL1(oPUE!0T8q?gsANh;NREzpLLp-%N-+^>WB@(yq4j|txQI-+CxM&Bmz z_+L)6;y-t?8?(}wI*>Zh(SZtUTV+{^6<c4srX1^MxpuD&vV1GBQk!TQmT6aXUD<X+ zU2K9~)pI5*vS0L@{?KWi(OI3>1zpr%>TRd=Z@7i8*k%2#9`>M(2^k7)xQ(*OHpQm3 z=j*89R`WL!yw|PFW>~qsmcZk0XSU*RcCs6@(wI7sI?&O9Y=-c3sP>04EY$fU7#V8) zf>7O$3w3=rqK}E{@%=>0h*l8Q5>?`d@T2%KqH3ZVGV$F+%kh0gEAhQVRYV`*hw&ps ztB4x#1NcFrjYMzZ&G;U?1^<dC8O&3msqk1xm=~G_nPHU?ngruGzK874XE?j8F}w|- zE76}<84##XFfeoz@`5^FjlYf8;+yczcon_{4~ZM`jrb0{@}{=;@lWyf_*T3I--cJ? z;h#Rix8v`y1pg4P!`I?X_y_npd;{LV7)FQoMXatUsqU`vZBbI$UFF;HrvJ<P570nA A>;M1& literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ml.dat b/res/Keyboard Layouts/ml.dat new file mode 100644 index 0000000000000000000000000000000000000000..f6bb06cabf45539d259a689e05d7706643764938 GIT binary patch literal 4646 zcmeI0|4&wR6vtohTTYCTWtKDgf?<|rX=P<vgqo&V7G+tcWoed{mS&oY8W}ia6-W&; zV2Jbpjv2BMl0)m>=hB`vtCe%EnyY7Su5WYITHjXdc;PX+<>U{z&vriN%RQfS&hx&z zKb-d(I)9^ifEna4gj~jP6C;?&ByQnhW^*MYxqyqgo=do#nGEJ$hH(!LC)1lgq?18k z`q7^OjIwg)k;N07%{gXY!!$c@Wh!~hWgd@pwmaduGL*551uWtzmWJXfcS&I6r`$+K z2t)|<0D(Wca$5O}{p_NKcJ}Zdjd=LH&q2OmJ55wkOB*q^ae!*}QO_r=qmcD%pqQ6< zg;L6RjTQ>1u$o^}&Sulid}L>W57^6>BstX8??mdCP{L0f=3Bn!hfqA_9tn)!Qf{Op z1R?}_fIzW2lg4YI=4q0$HAPdEr;!$)rs;Mr)+mk9xf-Gg8mbYRuPn{cFwGV^Nxjrt zeUz>Y_0{P*Lu2(91C^;2I#UDec1}=#hMluamIhuA#$tUabDfrJl~$`D6i?M!8^kvp z=V>Y{(h&j?0^JeFb~?QSlJmO`s$E~{kPd6FeM#TwJ3D(hAL~=K>Ro*<PYM00cl4_| z^s`D-rgCjog{oDndNt}T?bpj{v0JA(&E3AmBWC}oG$*~QTlWe6-#$N-ndzMB^mF<< z14HrD?X!aTpyNDEWkotdAVQ!!0-3h)dkwbUUt|mZWq9>Gh*yVK%}{P2&9?i8Sji(S zvCVr0&oG}SZ3`c48~<XS4mSEnZKq$r<F@fH#B0NCHkM#H&oYN)#vUv(reF-C8D!Bc zYjCNt2pJ6L6xLdOcL$kVVFbffMloD%WWlvYAY5nUgWF`8X^b^aVgh#>hj1TvGnw1D z19z(x$m1>}DJF7rKvGOGg5fqUWDRZ$(~X@NZ|uZ4;~Z`@zG66T-Ld95;pT3e-O6Sa z_mgi_$4sL^a+$^I;IDfz{M{tpz<nFPj$~1ZNtww;yq$Qvaciw!F8&t0CgP<eUL{^f zd?)_%_{F%5M-6uuZVk!jDoiR#G~>1&n<xK2^K2nmXbra-#>qmvQdntHMe>E3qi7i} z?jD=XE5dK5qXc(5ehl|b8>*D}4!lixRaW%F2K;I~OV~z75%HM4XTJdd#bBrcV|v^M Wn`e{B>vUA&mE-+0mK*!`Tz><>{RP?p literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/mm.dat b/res/Keyboard Layouts/mm.dat new file mode 100644 index 0000000000000000000000000000000000000000..a0a7410cf40e6d73efc445022d9eec84e675f60b GIT binary patch literal 4755 zcmeI0{ZCeP7{;&bo;q~d(pk-%B`O+`l9G{<kfNfIkr5gy8Yvnn85tTWdLB_kK{QP* zGBPtXGE(Lck;pOEoO8akYSpTRt7a{GPpwt!dLB3p&&K2rIM4QZ?(=;)_kDk_v+pn0 zNwoatq7oHYh*5Y7&)``+faP$o8r7)6Lzs%;h{xj?i~Fz(ccB~;unmST=!R?26F1-{ z+>HJhgvXR_DDFT#Zo}=Ej#=2OnPQZp3^h22+SYnk3&%Yhj-d_>Xhf4|-W?tdJ)Cfd ze)JXa73hEh+u5=yiaE?;49Qr=F@e`Jkx5Ku9&_27efcLkGn!r5gW3ECne5ICp2bJ_ z6knhj-{3o3z)$!Ekvxq{O1Xx=;SYo}g6XP|!c?X)p9KuG*1KA3TRi(VvXE=JjvGAl zZl03R{ML3>-Cch474Q{kt3WSn8GXRt`7=Le13%$s{G9LeOMb<3yv&O{&J(O-BR}L( z9^<d9=Z|dS58S~D?&L1+W+nHsiu+j2Gc4yp*3xW0Yj~2U_`UAr*Zh{}`4|7@za6}x z*R}TL_Ii!MI$0O%=9zcb!$R{t+gWvY`O#OvSD>u|n_6$oWLsnlY>LHNs-@X98)NA< z!!m5K<yxYRw-_5~DHdl5mSZC<+eX`b>ur6kuiawdHozimuti#wCEJZQOgRf|h(%kH zO|mSFW?QDsu{>L9`5nBWrJjAow#-&qz=}Nc?pX>$^JVR<y1V@7E8r{8R)Icf4g|z1 zQ7Bf6HKItY6~$tma4-a;5r(d4cC_Yf5-*6C#A{-!aD?7>Dui-4uZlO(UH=Ef5%IRD z7jKC}qCvbP_KP|URvqOHY}9C*cwVSCXNP!EtQY&_Dhx%m+=YJXC<^x|f3#ePmFlkP z0CXH@gHmi(EK%Gd)Mg;q-phLFRzza9UJKJ$M{`~guWP+bakpZr;v0&};k+k;t?Ut1 zp<`^<Q=_OBhsC?1R@8`KMOAZF$p&e5lrIo$UlKaOoRZerDawW9bSky3;{-~O@c&Wb zy+;`)*ChsbVuT!*Slo?~@>Sfgkc*|r!qf6<@{xyZERt_C0~tz@iN%<Ud6+N1<_Rp2 zrxPb-AH_^OCtqg{mdK-d5;-0nmwStc<6aEFKt#yG8FYnmQ!owVWePovbfjStQt%*_ xp+E`7AQj_e4JBcsjG|=RFFUC}R>(@4jz^Fv8)>YJrOEne@omoCRC#6X{{ZcpLg4@a literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/mn.dat b/res/Keyboard Layouts/mn.dat new file mode 100644 index 0000000000000000000000000000000000000000..4f7b00a3d57cd922c6e150e61d6e4d5eb6f90fe2 GIT binary patch literal 4625 zcmeI0e`uCf6vsc`B}2`LSO}t+S*FfxnVO}U6jCHgAtYjECQ?}-2!>IM-gIeeEnRc2 z<<vFX+}wPdKj!?kl4lf>6z5JsDx`R&A5=(DQ4~`5eYQv59$4D{&jXk9+;h)8=X*bJ z|F~y6J>Pw-Wi|7-i3eH0!%SllkFb;%d7e9%$!I3<05@|RYq)_`6!8ps^dq1C3}g_4 z8NyJmWsXlbl2Mc~jN#nPJ*@Pe$63LXq*%{}-g=iaHL-vyN-1X(l`(%btq6a%MbpG4 z1QG&QKw!3dg1%$8uF(Zf@-x5kJ7@Wmi=gW?QlE2<fK&Xyr<`G!K4gd-1*)f!Ciak~ zjr|<t5Qq7OI!^eMlXR3$zT!Mr`wCYnUjsBoV>Q0F-sPmtjKxjYL=|bWrp5eGo++V! zRv)WTRALhX34vS!-}c^^a&@Uwm3mrLs!^?qwNv$K&`EuyluGo3R%x?V>p7j!Q#zt& z)vh_ZUvo8I4{3oGYLOOeiOO`ZmTQI1XsMQIqe^waS7=tN+VrtLkzL^pJs*qvQr$YM z&vY*4kIwQ%=>NKp)hH^l34w$_E`h;$(d>`^xH~`Pto@er-?R6}9M3QMUKeuaQTG39 z2VT<Evok;MFJ08%>KF4zc@_Ex^|2a7B{m_D5XdDkg310(KZU9O#eX}~{agP|ZpGSh zrT%3<09S(BfLo6p!j)s4*a6(DbiapnU`KJUQGgx6m0|lh-Hf&2UcsfX_pxKxLF@x& zaXoGmZX>P&_cC@IJB(Y0dmY=4dxJtoGl_|e_vwm!OW`HIC)mdbG9_F6!Wc5^(#+r% z9`jv@vCPJ*ux78(-o+ZRUD#G^FSZ@4#G2?%W7XK(*q*Gy8mtAY;B*tV8Ee4mupQVo zYzwy2S1!i<p>|_l-aA+=_7+x;wPJ5#=}QVH#1(c`)76m`8?<_gnbJDnMJe>%lSh3I zWnM^e9Lv1^R)VxYPCY>bnbZzHYW?tfJ9xo2S_%l-33hQ~=*;qL36bv&5d^!vyOE&H w>&&FK_)$sF+{^MV-)RY22#&GDR}ShzlErbIGqSX*voONr6^2nk<G;iH0dV;l2LJ#7 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/mt.dat b/res/Keyboard Layouts/mt.dat new file mode 100644 index 0000000000000000000000000000000000000000..724ecbb63fa39e199bab08118b9322dcbecb1164 GIT binary patch literal 4645 zcmeI0{cBcr7{))>$;zyW$rxkGSj*IWNh`}*Y0H*nnU=M(e95vbE3;*-e3?3Jy||=l zhz(!n9Qw4j%vr70W~1+U9x5b55D}@6r;rMfirzrN?&oZe+KJ)*fOFuS@AtmX^}Wx< z1?PwBT1v-NzzptZEcp~Njv|IJo?E$%hj@_77)dSzxSoLwVH$bd$6$)_=)pPkq!$;^ zn?Cd<lWS~T4*hwOEV8+RtGL@b6Pd)F%;r%Z>-^rCmPH{zDRY^}e4Y#S(`8ApS&}ZJ zHBul_pc@LD=)|=09fxSAj?eH(@GhV8C3{G6nD=O+hHdO7Mg!ka%R%Znz)C83g-TZQ z25Weeb*!g_ayHq_qg1nj_i1LoRbTNn`}lz){MZdnDai2<?k|4k7{BmGsGlx>3pW3x z%V>=hh!p6C0;|;l8n1bpqlp@%$(o{Kjkf+&P16FEs6b<suOXVC;Tom68lc%4safiw zbJa^3y3nwh%2Kv+R3uNi%F|-?w{D@vb<T&GwkthZor&6OA!LOXs!YqYGSpAcDG&OU zUA#@BqBT+=Qs8t2^1Y7gkWT1t9afvZ*Ae}sJ@zLZ)iIszo#pM-J~gXd-^%F=9aoF~ zR6@UNt=6ep8&zZ2I>pqW9XhBgePDGTugRYKb-<n-*RSg7o!|Mjbg%0*H-yabdV77n zOfNgsPfy4S`gvWvO{1bUQXo>`bOrixxw-T!8D&oWYDSxXzt-ITaK@OgKaUb#Fwg$1 zx$cELZw`Du&k(OA9wWn&fdxFm9CP%K^Mv{Rr?`$m#4EX&MZ9Qczm$i0+D!W}3lK(F zaFAzXhmvTsvm-1sSZ3dFP4wd;3muXx8ZBVBgqcCaFqlg%b{J|D?y{)iW~OkDg%ib0 zV6w#s@h!x++mIVAS}3xZ;+7z&xZOgA0t$(*Vkr+Wm7BQNl8i~*VY$UvZa77tHB7*@ z;CA8a0v2vJi!I}rK^fBn4GKxDz<(RpOd>||<tqFZ{6_p;_@4&I4E!zlHTXM;uOU&H z(kK3L>ewt?1FjXfmE`h`c5gC8+=sZ2PSTnFKQ^@_D>kI)xHj9_sfx`cU)q`y%k9Lq z8>_wbB+Bt$#qA)m9k&g?8vk|twfLKjf0+&Sm*ZmiRk(LZtV&5XFm=c^270)9WAm2X S)h3bq1b;pLDN;-ROX^?ch6IHG literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/mv.dat b/res/Keyboard Layouts/mv.dat new file mode 100644 index 0000000000000000000000000000000000000000..69a416b0dd42181dedc5877a13f6aa894b50c52a GIT binary patch literal 4704 zcmeI0duUg67{))(i^|d*Y8k`H@P1piwbYiEF)d}73?)NSmxdIHAt{BCd0AfOZR%Rn zd1>C(wB@~Im<Z)4Dnvy@hQ&*YQW$EHh>2ide%mj`!J+<t4u|ue@B4ku`@H9Y?;r0| zLE|-wIn1JfUc5{p6L^k^Oky(gc#k2xKn8so%>c5QO?TdAAa7!{q75mu<#AH!KqsCg zKa}f2SC;S;X$&Wi86i`|G~VDt7O<$1?t#y;2%?l?mQlj$NItn-nRqErF5?(05G(Ky z3Jg>usDTujoNu_u75?BS{^UA;ld5()$!WgkIKS{MKhRor+@qemY-TG}Y-cCc)UbzI z_Hv#|4u_Imw4Z~V<s5gy>L$0iO-DVU&P{v|YOQ|+*IQ}ostomv<db!}CGwdq>?Toh zj1`C#Xs*EbO($lqc4&(}&_vDGLKSO<ma0Unv|H7BOEXodNqS$CHC<Jjph^{~LOB|w zA<ETI4OgD>HA*k(U1e*m#_21KQGwpkY?TLwQms>&YPC-X9`b~K7r`CZAstbjjz#jx ze>s}S*SD~nM8z>yAXcEc0!7xiO0itau~fUNj@H@I>|do@hIO|*8)kQPPnUH~?d&hz z(qQ{tS@w^fwx4xUr*uYVbx!BipbPp{ZR|%~3a4<axqg#bD;p3PdRZUqXCv)J8{Nd$ zyodX}zZSv0Y6UjV3hk9hKKbqVM1D#OyGc|WV+CRbnk$gbv*d(ne-MMioc}zzVb;$M z)BT7r*FT0I#7pqK_!4{#{wZFI@4@%u6-)_peS5qHUyrZGSK({%#rOt%IbO=JU>Zzk zD*g%e8}V?jz?b45<11-c!!u+BOQBn!%jBa_Dl1qCivsnDL!<|nA)lVXkLb<o^a-$j z^bamVX6VbS@tycSd@Ej#Z^ysHzrYVrU&s95GK8*n<HdLxH|h@KyYNl;7JM_ljG^>k kVIcG!cqRTB{yAQSufw+`EQ^M1|F?CbCfZl5*Q4n5AD=fdI{*Lx literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/my.dat b/res/Keyboard Layouts/my.dat new file mode 100644 index 0000000000000000000000000000000000000000..f2a42a2545a03047e6e0571673e0b4e7553373ce GIT binary patch literal 4673 zcmeI0|7(|36vtohTjI<bO2)7u+8RqY*IIt7vBs#743QME$kd`Jio~KQs%2X&S3^lE ztW0p5b90+IR?9i3R-YA85fw__`%#KSDvC0MqC&9aXZyrw&s_5lc%C2bd7g9L&pG$L z;QsP%X5d-G^E}N`uH{bdW(7BKFZc5xwbW3_Elj7B#muIRXDQ-I=J7a=F=R2GY$h^^ z9Ij*v3$0x~1-!;I@|e#8)>!6Y9<{ZOdNvG<8+C1nD7LVXH`v7HNIw1fR_diG{TauY zKuq8Q2+Y%f=qD!VQvJqf{LX3qB=9$9I7^Nu={Vo<F<<ZtUvZRd9b%l0Fjj4Ju!~N* z=w=Ul*~fl<pp}HR%-2Ca<OC-fV-uu{Y@MtrnmRadw5`pG=t`8Q0!>$OB%kh6n99!? zp_*33F(wcb$Ru!h@W!mwF14ywD^;g@ZP03M)a%-$ZguG~J)ygFpKA1g9#OlNt62}J zQRS*orEb=(ny=e*yB2DZs#K<>TBeV5hnDCmJ)^BQ;cacPwMV_$e}Omj%ZToCeV~4Q zqE93F^jQw2@?VcoO{?M<6Nm|95~y$kUuTr-a-4G~?FL=!vfL?+ciC>D%X3rRY5k#Z z^`p*O?N?29-&_27gq!w{zR_{36*;e@#lLh#YQp8IHQyBs&dc1x`QFPSy18zKD|RJr zb|jzvw=|V6AEBC7#W5xj6UZcxOK2oC5w;PU3EK%RgjT{1LK~rhVsiqr7>D13e;?mL zc#%+p--qud)ZurNY{T!wcXAoN8~+}m9&i8G;#=|Ugmr|MQmP*A!METW@y+-yPWAN> zUcuX>m+|l7_fp6-n^{Dabt~Z#Ua<LzE^@hwO0G6*A+)p7{Dnehm?yEylvyO#k!&Ej zlTd9fd-2=Nyy)+t|4sZmlv827j=f59hxr=IP0@q5(^lix+lVr=DXLgY@_;!Y&so(@ z*~B%Rs9tYoh~N6(juI`=EtPUTv&<8j!(8)2Zs10)J1?)K9d;-$+wo9d;ovY{o%nOS e5`82(hVhy?8m{4FhEmC75+QPq#}E|%i{W1yyfMrG literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ng.dat b/res/Keyboard Layouts/ng.dat new file mode 100644 index 0000000000000000000000000000000000000000..e4f1057e52d7caf9b5a4ce45993dfa890b0fe9f9 GIT binary patch literal 4596 zcmeI0XKasQ6vcl>M5<8{5fMa+qNv(bQPi&5MNylgc5PZ>#@>6++Iw$m@4femh=_=Y zL_}Qw_Ak7N=qI1v_sf0neNOIu?n#~x=L{p|3!xRwsYE`)s7g3N)Swo1XiE&ilpqfQ zgi??qMB`5sfixi<>B)c(zGNaZS;$H@%2~Ud<fa?h$w4W~(8wwgMACrvbfk0Yynls3 z4nRDy#L<(!j=DGP?fDtvP2K1+;4+W~2EL?X_HdV*9AG(zIKnYDaDtPZ<{|gl#1<B_ zl6|aZ9k*G^b=Go~k&I#t<Cw@~rZSzG%w`vfEVQ1lnag~(v4hK&o#i|idCXIur{PXN zA)g$$54_|JZ+Y*id((HGpU>XZjV=Q&18HDjfKouE6s1Ngr`!rrs4A(T!c<k^idJ(4 zs)%wZkIKkj0cxV0YM^|I)Hl9^(kZ<%$Va})q|7RzuVhnpbyOB*Rgi)eVH0Yomg=aL zV$?Qu-oLKa*MaM)_Uf!y#X0KUKHWU^_`jTbQEqe@a2fcWfsd&#W~;90l6Go=c5AQp zYn2Y_u#W1MZfK2?G)IfHT}!k=S2Rx-v`ptTRKu01ks7VB8m|eOq$%30!J1_~pJ<w9 zXuUS-jAh4_tW&z9dwP(@7y90Td#gu!rWbnSsC##L<*9%8%c&RTMwbDXf!`U(MM+cX zrA?=oHSJ!W5Gt73FGgk4^%?2MV7d^`0ERM<?({MJ-I_M|(SiP^<zwk;N<WSsrpzl+ z$P|7I!x%y*2AS6HO)v8if+=pUfxq=EYW{+sWxl2yDwDi}T;w&gAwMrhCsDwxhM)FA zAcbjXP#+r8f|_PCMA4FF)TN<W3ByfZ_)(3f9($s;859xJGjk!-jEfN@n28Zhbu%); m&2Fe~<HD%&Yj~J*c*^Dh|7G(8=kS!xlUMzR#gmi%9R35_yum*J literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/nl.dat b/res/Keyboard Layouts/nl.dat new file mode 100644 index 0000000000000000000000000000000000000000..471eb779149ffb46b40c12535ce319fe8ba715f6 GIT binary patch literal 4643 zcmeI0jc;FL6vsc`8<VR2%#2x#St+G6#!T4@wK2x1*`{oYVT`hwy_%V7x@FnC)UvSA zmX@_T+jK?MR$cboUy+4oSr%kLmLFNfTfBt`$(;LZZ`0iv{R8ezp65BwdCob{x!>d_ z_xoK$$CF1PlNrV7jNvjaXDH*ilB<}`Eu6>soXQzoLJmWiN*0qin*uzJ;7Bsaq<K zEXQ#?Bdpv&PGKhf8DREsuCsZ9jcY05c4nB>lV@HeXbyLAFZc0a#2;>p)5d~u8?P|} zF#<h6;K$CGO|-L%2G-HYTQpHaGuvok54(AlTGsLcTd3e=KH@n(q>A@h$}&nQrHmD< zWED^HG#gpM8msv^<>|_=k+ikd#!mL~37@6C|37^j2|2(%zGOdNNBrS7l{UT)xA7Vy z5F^k71XijeC{HsqO=EPD@-<H5m23V9ny6Wtsi7LC6EsL8m8BdN=|mMOTT}Eazw;-5 za}ZCxl%Y)Z)(HJfU-i>M^|1=WJF7#1CaGAnHMh(2-_4ap;z~4Mi?u|{BL1+-(zJiY zVNS!Sc#RQ=5$KM<V6S7hSAXd@?NhV9(0+ZT59~`ipl{@P2enHdt5MtasaloPA9`EA zXs3SCQ!3Y5J+JkuRJAs!PW9TO)oQTZgtyt|-Cf_~cltrSyo}D<x_9vJ_Q{dR0p8JG zAFr?1KjIIw`=$MZ4s#kt#cPZ}j6in;1{$}&z*zc)#@sI=kBg1v4>QK^8jRQ<#atE{ zm4BG|Ji-E_-*b3~ToOj(=W#dp7$u*@{S@<n2?P0zwx9pSM${K_C$o*JpToH(B;+#K z<{?J^6IM8r$4z2zTTLa%;xyA6vQ1ey)0Ba;OjF1)?IFX|g+kLFZe)sS4^vG$DBuR; z8VOS+CUXVjO_jKsYfMj=7?g2!T*@?VHof8|#&W&s4Wk%oSA^G2k6!EE#WmvI#I@kw z!?ogG;ZYt7-uc$_Tj$eON~&}dt_i;te+PaG{u}s~)?}n7fnSaP5`F`2BW<fm){$%u zl5%jC^*U}lu7*@eg^f!5t+d-+&A4}Po4Yy--suoPTs5iXF9z*on_;=jD{WMn2vbC= ztOmEk+H0?;?TMhe+k#((+kjtz{|x?`V0&B8oE_KUm#3RsMY7iLwUj%8-bNc*uHL#@ UXJbA7v$$=Y4Tpfa+C%&L2b!+~^Z)<= literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/no.dat b/res/Keyboard Layouts/no.dat new file mode 100644 index 0000000000000000000000000000000000000000..3813b8cafc4823a78824158c7a34f24bea7e33f4 GIT binary patch literal 4654 zcmeI0|7%ut6vtohTh@|UGE9bA%~qODbCso)`7O(`Ov}_PMY1d_OViAjnQOR**^u0x zhO=5u*Pbyo+sxcry5w`8hoZ<)At4pgQy>LWA@l_)I?uOQ503T++zaP^KIh!?Ip^H> z<^J$~uOoGh;{oP#BbRa$lbFINZsr!IvzSF(Nii358P_w6ku0Eqxm>{<JkI7Ea_CDg z=hL4&25_yF8^jPEV<7olZQk8xw{s`6c#wx!nripI_qACWt9g_sc#@~H;u&{Ea#NCV zgEc@PK%f^0{FTnx$5(vG0qSU{gM&2D$zdE{bBtzovyJWSX9tZO<#j%%fi6lZV<RCp zQORarp^7jqyvSCod4d|dzisxJS(K0Xgl{>{cjoox`ZFu(6yNhBC;2rio^gLpZcb<1 zU=0um5a<O0HA*E-({e4<3=Pvv&DI=^xA;6Q&?>Fe1WnRVjns6F)>ti5p_Zsvi{+`0 z&Q)LK>H_6yfCegGQ-v<lCEB1t>B^ZQ7Mj0CC0WtT)9ke>D{r&bt4twPX2mn-Dw6SV z4^J~$!5SbCAkZCwA}{6rpj@wy_me)>N&TWzI%a>;Z~8-dUVrZ!9hcLmI-xEdRgM?a zS>6|t_nPWduLec5OMBI-{c2NOwK{BPhj<-2l>8h2PXCjqZN1RTPxtFS!<qKOd&n#7 zAzqM-kLcm)nK}fq0D%C3!CYl5{Tjv^bH9#pj5n5FOc4u>*Pmx>d#y3{RXjrpYmC#c zU?qMd{fx@5=3yQ&QofAGjhHXTZ^w`D0>gQp=Zxq-%MzY4!amC6gV81%6xh9p33hgj z2?iTXW^k<xW~eC+g}Ar4+{A@3CM%3c3J^Ia8_YKW;vVib!C|fm2(y@tUv9^znDQ`< zTTPp|jTziw%7R~uAHp?Rm;1TTgo}Ah<t}ELoN<E*81c$->mIMDw*C{XK)j-+`vh(W zlW`5EZ@5FaM%I}UvWWGG@e&YBCRRqgY!7ZPekbwJ7PGKfHL);VrB=}G!rzYHLbQrl zCDA6L?TJ$^g4>Pz0M|^s^bNB*gT%dOn}}K1D3_~G4`#jl@%w+~dLOqB_b%?BCASbS zufuQ4RBXY0h}&Z$9%&}_5^g8)jXUw*OuRxoR7JFvST#rL6Z3T>!11>v293Q;G-6OE ijvT<>YF}hxYQ9?Qvdv&iWVhM=RkL?+omSxA@AVHulo7=M literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/np.dat b/res/Keyboard Layouts/np.dat new file mode 100644 index 0000000000000000000000000000000000000000..7b7be29394bf339b980d37cb996a400ba9e94aa2 GIT binary patch literal 4909 zcmeI0f2@vm7{;&bdRi1>QRGmkL+He!X`{$#)25bGQ<GuUu&L41)KnatapIhlUpXB@ zemw69aYE$SjvqTUtc;e$u=2)aYP4$DuyMWbIj_AvbEbc7&%1rz`~KeF`}yAYeLZ{r z`TmHy-)K}~DaN4>-p0FlAJ1blreOxEum*!M1U*rJH_#u?Vg-6(5eA?f!mYR+ci>Lk zjkdTKdFX_ZKCU|+!FJ@MD~91!%yVQGO7Sr^ViT(C>)pugjU?<r4R)dyyCU(-^1HON zFSCqotU#>5|4?8)>yjSi7{10Hyn;vBn|;}mPx2`~&G8(|*397r1nkB}Y|c@<gyC$$ zSNJmy;V_Qk7aYTHIDwNmjm|uPb3Sq^&){#|#}0hS6$Ww;U*H5z<fQs~H)?HmB(H>p zEaG&|jKnkN6sO~J8`#Zc#Wq$TRv=q}(W+ZrW*_y`E&7R#)l@C?J6oxZ+Nr+^^as!K zdmbcogvZ%S``BH-va2e%n9CS)71we-H?f*EyvTCy;vNpxPS)}to@W<V$W@*?YJi^6 zbM^JId$^wedL(azUewDPqG6GE=Gmd?_{au!Gg+~X6^IqcRv<s9TkX&lUC?eV&=1<L z16r*^I;vx86a>LKZBUsO>RT;QLYFjG|7yAZ(wiEqw=`bwXoB9;M17z_ZPOT)_$zE3 z6scI7wN-z5bwVd~N=<_1LCgAj**#p(?-a?)3+@W;337tmNIdgw`*gfZ1G|~5*v1OP z3S=vggJj|hv&yVCYs{BstyyQP%vYuo-Ee$L85-j@B*V`gDK*9R*PGC!vZmVZur0Cm zNnvV#Hk$c=yQwynW~TYnY&DC`0<#g1qqFTcKRw5Gi&<_yGn<Y33Eg8@<y(bh!u1km zzG299R}cBlq8T3cO++F3qILsva6byr0UhxGM)*o1-^r=w+-PE+hbZ+B$#9wZ#F39o zk^O{OYJZxUVt>A|5TW<OIq4B**!#v<u5gyAFw@NvQ*OS-W4;1OhBYR2VoHP+W|2t= lV>!c>#udVau985%Ya=`n9pUDGD<4Kjy7}HpZRLMwxC$07+qM7z literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ph.dat b/res/Keyboard Layouts/ph.dat new file mode 100644 index 0000000000000000000000000000000000000000..314272f6727da04aa41a571eb94c37e2a9fc89a8 GIT binary patch literal 4618 zcmeI0_iv416vscuCMqH#g4lcS-J<qhwfEk8?^Y?&7}bb2Rjah9b*)-8o~uS&L=Zs` zR|F9eGa?breS2@i)kgn-_f5`wo^zh_oaf}5JU@KDi%I{QGMN6fq&z{iCYYMEqXV57 z&QNMom(o<EIhCo-K*|zARr-*FT;w4i1t>@%3R8rlG}d+{D8)pIQJnfTq?cy8(2X99 zWHe*F_x;b!_bZsqcqTKInSOa+INe$-^o6#!5wH=+1_EEbHOG0tT~dhW4ChECiHlsu z$s-=JpJZa$!AW+pmwUu<hXii1f-u5a%^KDb$$B;tg@a{m)t)bjW($Wn!cC3RxW)~h z@RaA-n8{P}(XZ}3FL=dk-udNy;ah9**%#X0M!-fO8wi9;dQmGGA|bl2?2Q|E{b(5> zjis4J)g)MIsvn@%Tk1*=`N2<+oRUZKOF=0tMWwg|%6H03MVTd~q>R<0tMzX$on)L$ zl&Mzq|G`%H)h&@3GDqggBEP(^(*i3Wmc_2G%Jwz_HUfVlkT*wqWaODV)Yo%D(yTXh z*87rPiCa>wb&5ChSp9vqyRudyWrIY?7KxEK*&zv%B$p&Yj_K|fNtVObiQCryy4;jE z@=iWj(Vr7!zRu~L%eVVWKFK%vE<dw4|HI1X_B-V}ZF?I58-dIaC`mnK=?#>pH&X82 zgr+o8wqJ`t<@NcQ#RA4Lo4G7v9+Q}%{Cfz)2w)U*l*^B2f-?QdOi^auf-1`Jhq9Q3 zjA6cV{pn0o9icXLR5d88J!`1G5TH>3We$ND2PG+|VnYR$7AmRG;1L(9QjHN>n2+8J zpuLI=Aq=7)o$0AU!V)DH0kom7B~Elyd7=wlRa$7Svc+<is)R9+wkl%;tJu(8FAJho z#??XoSDQ1KW0>QZ^O#i31>CFS)V8U`t8K>|^bG02AuSqn8275(n7v$a;5?0cr9(S9 z6ER7+!f=IhBNmg4b1P;)?oe$L8jsU~If*MtgG8Ju8PhENXPRA@J(vXTtG6D-wGwy4 zCbi9KQEJiL+KGE@w9b>Z8FPv&M{&k@Mu@;1z!ixroU0o#=P)Ul-Fjn;S}e{e%voIf QaBoV$T+A53B>p|aZ|7$F)c^nh literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/pk.dat b/res/Keyboard Layouts/pk.dat new file mode 100644 index 0000000000000000000000000000000000000000..fc87e24f7af62e66ce87dfb9f5f5c7f4c6fd370e GIT binary patch literal 4688 zcmeI0eQ1|e6vsc`%Sap3#AIl*%y-j#S!?-{)0K>pp%MmyX-QFG6dIBgnmJo*=$x}= zEQSoToI2;6)20JoQYxfCDzbZjzYrT@Ath22QXw6G+b_mLYr_709yrgr=iKi-=R9Ay z@SIaa$MZ0&c!@_DMKSYvj65D^5sP_^)jYs-?qV!OjAsff8O{q#<arz!+(KV6$)Z04 z7|0+BE!-UprHpI_Gm}|7Yo4Vn<7w9N1{*rk_4uxiAgU;(oQ+gQ{AsfywRkUW#yVyo zX5c0mn4}I+l1ydj2aa)(AGyqz{K8d!<2GgKEML>gNzQYcGxSj#(q~*}J9X?}Cm&JI z9vWz*i9jufEo6?GY2jPG<8QP6;2M82P=l1+nXjkP#z$~tG(>l5m_|kX={Unv{(HOG zO`~ERGY~V-m4R<MZ_F!d&`zz<BCS)2O7)!H)<$hsi<-1tFKU4n>s2k)Gpg4@)oGb( zm8X17)pR|m0?pP#nxi7EQm%?MPoL-!&D9FMtoJQLmEP4hwW>|WZt{knjo`k}37yub zIur4yzvc6k|Eq3x)2LX-48#m{WniA`um+@bw)<5>+)y{n$&GNM-MExD!}T%!yKZ;a zbiMP2{bkxKq3?BG7u2qcx}=|US^eEPUA4U#?q^+5rpt1Z?d$|M(cZZ(&*i5gcCFyQ z*K;GdA~(&=bhF%?h(CS0Fy$}qW;czBb<9A_KvxEG$mKrk_U|X(`uwR(vtECSb@v6< z*WXImKq$u_#W&;kl6(ihgJcEC62fuo>Ytz=z8>F#w_pDf5>5C<{5}$U2&MR1n;L{o zEWsbdA0knPZ^iE>lo8&-TcBzt+f?Ch%Q(U21O3d(v?)OWr<%#JK|>)UZ6q<8CmCa~ zdl<)42JB0)N<JhUAhDHjlu(J^MW`bACSeP&v*t!&AK(v@C?{;iw~;uG{}{iYP|XZR zu+H*%3s8e^z#m}}i8ew_YG&c<{w?a%u4q;NM_Bv%&9twt=p|)0A}p~ul_q;l8cp_@ T>^EsJ+0rZOdPCaUp6K}pwV^4; literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/pl.dat b/res/Keyboard Layouts/pl.dat new file mode 100644 index 0000000000000000000000000000000000000000..f946107b359727f7fe7f9cb91d4ae0733df6cf98 GIT binary patch literal 4668 zcmeI0|4&zS6vkiAofT=Ya?VQ2kw%dkMn#GRkzdNREQ^ZLvMkNCsHjMd3Kdae4iO!G zQc+MO(oAK>2$Xd%w{k9>Ypz<g>f`!0SDUL=tIc)zz^CYzi$CDr?d-hId7pFMXU}$j zc%DUcePg(fySa{`WRt@<MlyjLnZyIkAdM>+!o`f`5{8pUGP$I32M&EWodo)F7D=2< ze+F=kjT^)T%w-_waV1xCyJaSG3sZTJSv=DH-v7D6KtTa>n8)Kh70AcK{McbZJPdt^ zK!`vu5cs9Lrir5*p_z@e(8@j<Xy+X~KH(!8*-nH_?4_1^K4d+I*}@0B%wm?ZjOCP3 z&Ppn%WH&ETZ8MKi#aiCrO%7V*^BxEIl+XF17dv&9oCwtYz*l_Dw;T`T<Kg$Q!%y)r z^dSNv0=+;WqOPKeD$smQQL3hDnsSw?JWbb3EmWbhl%t^<p-D<phVqr7xk}e;{mx0G zJ~~7Fl%#VsK<8?_eq)G|RjNVVljBRwQjv-Sx%l0`{n|ifrAkz$a#aNK@y?a8eDx`A z<5ieO0Ji9n{)6@91vPCw^I9n=Z^tY7t+{;+@Pq|SE+I$!FTd>ztp9nr^1a^6>h zb5y4}HLBHCHRyHi)E>R17PaXcZIEZ3DNcLfUzBs9lidAU&kg?joDrx@cZNBs&TwZ` zARq4@8Ox78#cjMQ^dSNv0zDBJOuDi3tBj{-7<V7d7&49RUrv_s`ZIZ&=b23b&$5u` zc#J2Fe^2Lr5_yPcjLXmAQDge^m~YJdS}rw)KZ8Xq;9&}l>*w=?=?H0zGSwj2W{xm@ zA<?3~#vHP6cQcra$YGdC3n?Zvbcze9T*gc*Okf)KFwsPYT<+yAZss-<5?(NJk;o0) z851XNGI?S$Q%qVIYqG^l6q$sP$9R)5#+le~t38&@^?yB`9eg@kwi$O1ZWC@D(Iq=@ z_u)3+Hsfx`Z6#V<6~o|gF@6;t5!^<+O+-sqnN^vs#%sdcZ*x1A;jhQrg|`jA+&Uv1 zh?uiz3GNR3HvG5gSZ=8rvyJ#AxO<6~Z8fX672VA-c#48My0y6NxLa`BtZx_56%E$0 z0(XBWe6A&m*VvMW8u3@tu?}}9(ULmcdRwp3Yz<x&UQOqUCHSx6t->qCf5rOhc(($7 jv5kBUzZJiQj#5jnGuwc_)bcfW)p*T+ujg+2=YD?z$6FNp literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/pt.dat b/res/Keyboard Layouts/pt.dat new file mode 100644 index 0000000000000000000000000000000000000000..983416477fa7a9179435c0a35ca935ddf88568e6 GIT binary patch literal 4634 zcmeI0`EONK5XV2?hoTh=A|e_zfFKIUB8wmjRuQlYvWc>4K-olA**8l=i>ZXPU{Xje z4K%bVRG?8TOA31Kdm1oE)DSfU4UecH#DLKlq9Jka>$`?r(%3)X-sHSFGiPS*obSv1 z;rm@l{nMX`jOPhDGKi;mn(ho?D8re`WP0)_?Rb#Kd5CVjLI=jtg)zjqiKg7jZQM?C z?%+=DqMx;E%l*vaZtkH^x_dSw7{zN$<Mnjp|IE@*!Xjochq){W#RGR<YO_3WBO4(Q zA<zf}{z&K4@GYk~NGY`(<|viaah%Wijx$uTm+h4C5j)w<*OYLIa=v68Ipnf|eBPyi zO>Cx+{j8zbdY)$s@AF~0yT|98;0Mlft`Rf&DVIZem-vYb{LIBrJaB(aZGI2j$VLc6 z2s8qLT-7HH)O1Z&mhRIK4O6yySbT&=X|`snxB97#+G~(Hs;gery_%rT8n3JT!!=M7 zHC2Y1DN`*pK!4Fnt+h}s)18AM#+pAj6bsI7wCh5dt2AGWwL~jI@t|^9DxTB8X^<7! z2!RNJ>k()ZtM^XpPyMDd`dHuVtbSD7zNGWIpucrhU+ARvsaD_Uh(6U7)##GybWs~s zpv@}MRu!v6Whz&NPAN~-R(o@-D)cS>qH8kB(8#A%D6>VZN$i$bMl3TF585?L#alOU z8e~N_LLfrmdIZ`Ux9@E{y{|F%$LP-hWBI*|=exZ|>@!%zawFc0S;9(|8UbIxLX!Y8 zjmW>v8_YDCKbtp=mcNBpi95m+R<XiJ{xYUBpLsk&50etQ(%yc%@uXGuG`Zj%6B%5M z=>#2kz!Zm0rY&@~gNIF3@YM%*)ZRVDgodGv<)xG`k!|w9XzP<{(!@BPWtd45&+$Aj zn6Th&#O*QKF^LH#TD;6NyvRtCG6tI95WIPC_|5JxS-5hXja`SUX0-_&Q(0>_@b8^P zB9~-tHSQA<l_c{EZEdx+1@92vF>B{l;FaMWAYMe`J>r$b5BXKr%fPccxLqW3KCo44 zP`HD*+W*Fxa>F<~N#>RK19h^E73G!M+Cg%|E*~j(0C(I5`>Kk>dcU#TN1_6^+a@X^ vUW2y{Z-+lrzJDXH&_^UuK)k|$^((3k`@y&>n`WD>?FNzkTV63<gG2obFOU8~ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ro.dat b/res/Keyboard Layouts/ro.dat new file mode 100644 index 0000000000000000000000000000000000000000..d50029394f30513cb8c72e1821fb043009d0a645 GIT binary patch literal 4571 zcmeI0`EQMR7{xyak!qB&L}X0tOHm!$&?#lCrS`o{84Mjur}o_#t%%q)jaVABZ>c4X zh|q|*w@oWz3kDGpors8tA4DV~;<@j=#eLm`Kj6K|d*APKp5=SbliVN9Sx)eizy!w9 zou>5QH+mCCU-~nENu&`^dm7T5L|W2@R2nmySVmHbDpVzkXsT0#AE-@Ty4biM`H30S zqdpz!%y2_e7|c*6GnHwf`@Z#B>?)W~I<v@Nt_!aSGo8cIiqLy|8}K&p9UFKXsyV}5 zZgGx1oTrG39OV+1@$-Ot9H)R??By)`Im~VHxWPfL@h@4dVJ+)e&qg-0l^hEBhaEQa ze{$K*NltUsq7q8E!b2YM_&a`6pyaiy?iEjX$}?WN@L>3y7tY~L#H<H;8}K#|c>{A5 z#9L^vlGRpK6|eT{s5<JbE=tgF4OKnW7m8M_s;ib#R9XF0Q+-06;d7hm9q;)-nv-py zM(Sm!Zc0*5jno*WM(hfo5r{Hebu%<UlQdcBE<D&dRnr_iGh+7Z=^o;3z}rAz1NTG! znC&`mr#yS|wND4MMTc}m$8=Fe$}x16)@rBLX_L+=OJ}t~XF{Ffd(71Wt+b3^i?qzC zD75baoz!V3y5xL^_e6^Bxaw}|vPx8{>n=Rldqr0r{J)6VNb^0++km$LXg~*3>77ic z|6<y`D+&B+YQG&xrt7OQk0nfJJ_}jKB4#qj^!M*fB!($0FfE_XU#9eDG24`RH(Hs( zPh&Yt`IE(_^)va~e1v#@HrJrB&1`Gg7>lA!IV9mLw9A{A+0e|ag%)Ns1k8n4TJwh$ zMlphM^fQxTG~*e=K!%x-u)@Se480iTm=nonPoyx&tc66gEmpD8ER0n8n2pif%!VOm zX7r%vr>o;F@47s|(0>5`Udppi7|XIeho=9O@$?;~e09D(d#tN?4Q0D1&iR6GNp=`v z-|<h3eFgZ6zTh19^~L3@a|86F@MrVnLcXyq+wIWwZ!w;BUp8esDc)udOa;l3tT2`p N96$4m!*?W{;73G0#)$v` literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/rs.dat b/res/Keyboard Layouts/rs.dat new file mode 100644 index 0000000000000000000000000000000000000000..941ba1c35a34ef82a4bd1bbfc26becd3cfa43d4c GIT binary patch literal 4649 zcmeI0|7%xe6vtoh4<l`~uq?}FmfzD=YMPnZ6p;!k5QHMEjH03_DvBstI=7rIi|OXt zrfXaKrl#5awpmL@cZDDo=T=BXMXf-PqA-f0sLtmr>$YKkz`fl2oacF;_jAs<Z+L!q zP6O#@DNpej%b3h9EN2CCxRu+vgA$%$9@jFSY23&RX7L0Qc!Vo>hy;0@!ASBsi?bQU zxtzxm4|fscSkD+PWFd=qz>!tl!+oq_E#;Yfr!%z?!e-V{$wsOocy{?xYEqY7#x_<U zR^WdqFh^<9SBz4=zT*fdILQxuz)$?luZ+=X86R_qcld^PIYxnc8KI-(sfiX^X{VDN zyvA<!(8U)t((NH9XdeeS&S%Io{LY{J%~%!c;!M8Nl{PcNE7B#Jq$!#n!LxCurSRFq zc(bh7#tOs=3|8Q1=EOX%4z=iM-K-L=R;gC0TotO+PHoq{x?eYGxt`PttyG(qsZqD7 zUh}oUcP~`27U$00qnf9sx<LmWS)vE^uxfqwqN-G_U3y(_<d}o2`0u<w!t2w1_2^9< zj^Npyy(#>?VZ2#ZY-0st1qLfHHIZI@?<XfeaY~=3PS7tt{-!_lSLQsOaQmfx^zqva z^0nLd^`VcZkMv0fg_Am_PklAo;~vkUO5`O*q%sv`@(r$GsQJVQZ+zmM#QBK}65}Fx zcJJ5}K6w~#mKEDrfmngT3KTM%tNgY<m#h7re+~2fu0PA~`bB=PKa;S5a4U9@u#~V2 z>me-14q->IKEe%z)f8Y|gln+_gwJF93D*(UV{c)-gzE{naW~eTe8XnK3Tz*?7dwo- z&E;I_t%Mm|>SK|&3ksO&?SwU4Pq3Fl?=(zglJ_L0Fx4HGG2I=DoIVn(#9qK^u@<Zq ztHatbPuqkwV>__2WM!MMSFtTvJ63~rU>h+1qixuBY$L0&ms4*Q)`?YPo3U50My_Ll zw=J@j6-O&es+QI)tyHp8GElagpqqixP6jGA`B&p#HGya9qrZp#y0lmWrA<z1WF>bF zAy&{u(C+?v{~8EdS<JIM$6c;Yu|r#OHI+nbN~)FCDydM=MzDvV!)x$=YEG*W^b+hE TLWjUB-|5k7a?yj%e~14EBdr-{ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ru.dat b/res/Keyboard Layouts/ru.dat new file mode 100644 index 0000000000000000000000000000000000000000..d67fd45df7e1651b1c94406b5e6234f8817a3ca5 GIT binary patch literal 4729 zcmeI0eQ1|e6vsc`qo`Smm1wDnnzGzlo0%`Gl`%%fNEjI-V=yvCmL<K2Q5foSsV%jo zxqNM@t);e{Enk+)SV)Cb=RzSxg$xR*kP4|N3NPD!F`pXxpZ`41Kj+@>J@=gReBl0Z z&Stv4VixfTC5&elrOakBWz3<R#XQMW3K&fmGsz~O#~I7R<nka!U-~hCfn361hHx1} zDT?7nFp5<S;|dCy!MvzcFqcY}P(^ijzH^zngu^;kP{V3!6MAO5wsWyDvrTPEASG}f z1PavU)WJ{<)=Ap=kyHFa;55JUCnGdmpL3kU9OXMc;!`fw5iZs-2B@Cx?4*%h?4gOh z?4yMfY@;=X%+h`i@)h6EFJ|}~)JIoojIQp^cdpW=B>X06f+i|Qc?mreC%03d*2`(e zE43+slt51cUv|HkDz&IdD>YX&TBBM$s`aYVCbjB-7U~I=t5VgPrv++Og?4Mc8g+|q zRgsEyn{HQ$?og@j)KV4dZr!5~b(hNYl%7^Y%&=AU+MzbRuMf`ig?^Fn3p%QgbxfZn z^vu6}(y1Ts<uv1!+LS;_peKPv*0mdLrB-6&?H^@Xw&mI&%eTok)yizP4YAAZ56Q+_ zUmIw%>@Ur<{#I<?>V!J<y-w-}{S;r`DgCTb_O*VC>-+3ioz^hB(u!h+0xPr`Hpj}X zqB~#D8vbwnSi*0C-D{P0zde-DGj|{8)ED-0n(<0)N+2cBlfXzOaeeIeZ(vI7^QSRA z_WJp;yT3X1^%voX2+tCp!CUcn@HYHy!b-v_`~abv@En5(%Lz63K722Jgs>EU4}TYL z!S@qZ6KdlmA*>~=AS}ZV;|B><gy->Q!WyoNgM~3MX%2ZYTwWX~EQtlQH#0KM8phGF zd;>Qzfg9sAA)9NM80QH&u|D63H{d()P54XrR(u`ah`)i?;jiJlVmRN4@5W!mU%+3% z>+x;)W_&%q0e=%;7E}6L`0Mzq_!j(Sd^^4euf?0V_TTCjC#yS~T}M^hg{AkO`jYf6 LAiMU4v*DcqF78S% literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/se.dat b/res/Keyboard Layouts/se.dat new file mode 100644 index 0000000000000000000000000000000000000000..28ea8ac8be9722cb15bfe270c34af7d438835893 GIT binary patch literal 4654 zcmeI0`)^f65XV2?gP39pX&OYOh&&W552*@@R%@|}q9|HL5fDWYv<eE!!z!r-TNO~- zLTWMPVQq`WMkrWXtOecEOF}}>s3B?y(Ho+Ms4+y1hJ-lxTrR2CVD2AqHksX>*_qin z-_7}9zQx4HIHq$S*D#1&uIC0uFo6PYW)?FU#bpd&2v>74moklk+{-Wu@i>dKN#h*S z=|cvY^yNxRcRu}joPM^;F}cg+7H;DX9_A6|n3l>|lH|0AxfJmf&m`Fs>VjaiETM*L zh(L%y3JCmp%BO`xd_gO<w6U8G8tG&&pYknV^B!BNVIw=)Og&%mHlI_+K}slPC1t$I zD%S7@6;!c}<y2eFqpY*J+2nwU&p!5Zm?L~=S}NmslGCq5`GKGKImw<-j|H3G6Kc4I z2!sfvfIy|<PWf7>B2Cl~P10md(O9z=YO0oMvBoP`7iyRal&u`i*F~DAQJSL@oCNhy zPxVr|`Y1!0%G2Lmpe&WBulfbKXWKkYGc?QA;=qzZS-hU)`I?riR4esLl0A{DEU>?M zhSP*sxP}OX2y{naq!-tYDBbJn9hI*ibxgnLOZ$_4({W{b8Qvj%qfYJ9_u8+|l;(Y+ z9^L`TtJZqeYLn{Jpe8kIn|A21)~Ul{&+}T<9{i0bZT>@l=|rG)zx)68!%x+f@EPiz z>-F~rc!QJdiSvPhJ^Ku&39oPs5eO0JjzAWdbA@&7V;RR)*5Qvg4j_k-*46i7Axn9T zMLfszEanNGw(i?+pf|I5)*AV_%(FJXh$pQr_jlpf<F+uIVwUkJORU#l!2Eza7;S9A zAVyo(>nwPT@dYKuF}N187;Ln{P+UEi7^5)8*oEwXeMsYO?l<<K(3pk?n93xk7?0qW zS@;C*;U*>;rEsf}3b!*EzZ(B#T&LYK-Pnl&<1udJPU9PLxt51c-<_9yw|j?t+`C3< zL{~K98hC*jJZSyP%vfzP0P=~fh#!7{zlUgfg~?izDk5uRmfpCn_?z&z(^W}iHC<ci zYL7+v?f8wjUAPZ%@8ddfO+;U+HQ8XmxK>=->C#^OPiebxJ8(O3ALHtXmTkaqOXS&( z+ly<q3J*3BDUCTet8ZiM6QbpnbhQwvis@F}N3l2YD`I6vR?*dHC|iVIgI|u@ga4L2 ZNnX6P8Y^wR;bt)-aGQhoa*hA4>>qUe3?~2p literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/si.dat b/res/Keyboard Layouts/si.dat new file mode 100644 index 0000000000000000000000000000000000000000..4b8d34b621bd3cf0c5626c361fb5df865f37afee GIT binary patch literal 4634 zcmeI0`)^cL6otPvX_~R2Xb_YLF;&qb$U_trlmd#ND2gJYf`}DCL`4Jyq(Xt%D%wD) zgjOsSv@Hcu8Vw+%815rP$5%8O4e?c?hNvNg5H-ffzB9c|=SE`xfIFEp=j_MXckMN~ zKkQXX<};ibOrwbN8O61X;S$Dj1LK)VF#{RQx%A;0E}|dPDc~OZau*45$R$Z0UFgag zbfY_0S-ErQ&10NJPlhm*$>zD4Te+QCJjBCo&-=fvB$BX%M|hkkcrxM-&4ua1^3aU; zn1PsqPB0*4lJ@gGU-K@nau64vogCslQvARX-lUm2>S>{o9em3c4%5U}JVQCp@jMl* zrIIQ(u#tCIO|6wYMh%;Ii`{%-)`xt;XZ*xbe(nUOAmy(}-XHwRaZd1C#2=a`(}#aT zGu~qcVg@?F!0NX5e~4yis)nhnMrfo)tHAtYG)^;BtUfAKp1NtMdZ@RitBa<nrzW-C z%znsV<tSH4%}+=BX@DlCPvbQ~vo%L^|MOOMjlfzF$y=s*TA)Q*8u5oW7pMIzPZ15X z;yq>{W}qVjXD2e&2Rg1_^r?2~bA749I%sdwH~LN|bwZvFX}jLm$J(P79n(%7)js{G zXSGHZTC4TiplZFOTGi=&m1&#Z%}H!keb(D}M8E4#{hj6Oh$Q=bW*e^1dwL>~$W0^@ z`4N8@&rADzoFW=##e2*^%s@v5dU2^u>6dZ2P3l*0rOofdY}zlRzs>chF`vaeXjAt> zo?;Pmm}fJ%zXh+7eC}s~sROf^ou2CF+I;R+;FaU-#XrDOmhga0>&2!7JZfsfKn9q0 zP+-6PO-IOQkf{bM7=hDFFU~XB;Q|vFE;NB*kVy*{TVSN6C%KI&TyN6B9VR(U=0=kd zCgQ(>x6Vq8W|9dNV;PqgDsD27!FvI(3}+jD3wN79aUFM>m~jgexSHYI*AAd43Lxlp z8YQ%@dL3ssej}}A>ugooT93OI_W<r5+>Lh8ZJ@Puv#pnz%Ds4v_^X1iTNkwMyk?PV zTQxXa8O1W5#%Z*ci_G_8JA#rZg5{*jO<GA+<Ln}}$<&xsjr|R&+Mpe)o8+S={FNDm zZ{RoJ)El@;yk^{L+|2<p>wQ1Y4xH`yYw#M3PP-Bm$he!VY+(RsU(kv*)LL5A4#{cA G#`G`gD*w>{ literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/sk.dat b/res/Keyboard Layouts/sk.dat new file mode 100644 index 0000000000000000000000000000000000000000..9c3033feaf0e0e6bb9be4fe1e21a3d74cbd4ee93 GIT binary patch literal 4616 zcmeI0{cBfs6vtohX|=>cN~BUu%QR;>(=sjdDb4aZ&4+BQsi~=%nVPlMvJu0K;g-c5 zW^3v;zWLNFTPa(0Ki`{(Xo!eNi8*^fEJS*s5TWzE+ZDS^+#hf++|T)(&*z-;KHvA3 z`@?w`()bKxF0&X(Pe$<=W9Y{?Ch#~5c#iwHpF8Nq!`#h1JWCI9$RwLIT5}C;xQ=$* zNC$4F6GN<AS8it+x7uzXgLum9WTx^Y&+`H=Ho{$TEr>+q^Aa!f3VD(9(9I1tZ-s7b zV+LXdTEM`CrkFa8bBu4O#^JM<8uqcD1DxappR$WhB>0Lg?BIJUIm$MU@D4?+p@g-( zPbp=rX9Ih9n+mIWhH_hL`I5tCzvGatr}&v)&9>zEHxl$0r}>?;{1G`1-E+a_eCWnD zW*}yu1q`fKW6*HT*Bp&f7me0fjaOey)Fe&OA}v&Z4OAy}(+KrYZ_QI@%~pnTl&03Y zTIp(|wz^*Jbc5P!sL)NiMJv?7Di6|NWt*L@8OqXPEz!~@yeqX<7>O&;a^)&dD<kJ& zo&4Z@)n#tOsMy8~#0*@@z*T9DUafxAG1aM5U(4xRRoR!cPy6+Yeo{hPRiZNO)(6_C zAM~D%s$55!{nmD=NNeooTyVQXJ9RkN9n>M6)^E+`T-r~#S5sf1e?e#Ur~cOY%T)L$ zIByln3bSJyGY~V-90MI~u20tESCA~iuf(s%)!`~|+i(dUBAshl!V2ct0KSY|mNTEl zHpaW%xXm{D&t$1d0&|&XLcszS+K}%)!>i^&{8hYa6Z>qN+h^J2zlgi&Z3;pLU2N?| zmL+GJdhmvUcr|o1X`!#l4)>be(BA}y0VW>wG1(#AM2Kl7OibblW-!IXi3v=!#5*m0 zm<bCbc*G=&M;UFR#aM1L@u8<l4bx4mn96X*n~X7p2YBWpY+e+$D??4M=w?vabhohA zc-?wS{p>7L8yX6>;(d-^O+#U^y=(1#7xx9O-jt1}tyn(E5|YJ%mt)$9Ux5Fn)k~=) zS$LmV@$LqZDw}O`$Y6uW!22lRAT!!bItLS}^pSYm@vHDE4bRHg;MU<j#MR<TEy)$8 tICjN&ALFkkS!EcO=E|*|ya2^Z(6Dlyy=6v%XMa{{D)}O^SM`7B{{XXV@J0Xt literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/sn.dat b/res/Keyboard Layouts/sn.dat new file mode 100644 index 0000000000000000000000000000000000000000..5e3ccc8a41a38fdd2446df8092952196c8bba474 GIT binary patch literal 4669 zcmeI0|4-Ic6vtohPcDff8*|o>8BwI>H=-iLBrUbfOwH0X)3P+nG|QqQBBF&6b4tu9 zGmS|3CL?epWJT`Y=W(tt&ef{bsyS-T^<~vuHCLOR=YfaOvrPYh=d<0<x#!$-&pG#f zcYiqVQhL6LEM+m1xs)52%8g_*of*tzIro#pm1Hu4>$r@u+`}a-Vl)d07{EZz;%rhF zL@I+hp9vOj7#XY~jdXIkhWTch#T;&D1rPCXZ@yEB;y8ywR`VE-^HiKYrWQmeB{4N2 z69^;_I1L2OP>)j=-F%Cqju87fKr0{c5eGTK_w1&fS{m3#6D=HO2Vc|7SFEF)3f8lM zN~+kzW~zCY7pbw3zp<6=?BQ*`FzpbZ@EJ$>fuDNPo$`Mo&f_nB;TXSjJkB0d|BO!5 zdzzRvArlBB5cod?w)MW487kCT&DIFb)jTawp4k^^iAq$gd`(uSMr)?VDOUx`(i-Jx zm6DXKb9AoGQ>u9n)(~Bw={i%xl%WcxDP2=EO)G6}sg`Ml$rn^+|I_)Z<NP+MT<f(# zRdM!Mtjef;>q%B)UJ02%Ab~)C1oDC&?Pm=M1_j6TvHs9;{jG28C7qCh^dK!btnYL{ zhxDsH)t5>QK2%EZxsrog?NozysYPvSSBLiMJ^iQ}?YF(dgMIQkqNC9lIl!_E3@!{Z zd$aYg;J@d&ah^FrRxmOc6=cWRW4p&h?c-0f8uLoX1Of>J`XeyZI)2}1?fr0T@W<dA zSc0#|*D#WaBw2TVFNG|N_TEqP1P}6v_4eTkBLPx)l(j|=Ea!n}YroQ(`&IZh+-}@k zJZZi9eH0k4u-e#y3FL8+@dp`}WE9uh=5ZwRoaJzB4CQho8Llvz;VPpHu4cT^2HCh) z^Gq^MVxch-w;6x1fIEzpn8j?uFXP^@7;~7*6s8$paT7NiUvY~u7QT|K$m)FVG%jNv z*K?~e7h^4-tM4lyKfZt>in*9)xQilVHx@IAyLmQxeqV>%MR#d4ZV%yly301&sIu`2 zz7yYNd)y9-Hwph5zLijA1fNhnp-#f35hz?cuGxr_i1rSymhO^QZEQ1S-21o=-0OXn z6~$L(YrY)U8I96_tHZy9dlSD7UxK&&T~?<rGf*wEYawg}@3itN3AN$3;J4dZe3QjJ v*cidUZ^Si4APm*n<%gfg?TwUYlYCsG)wRV&wV`HqzZu`rSDWSj*S-A%@1_y# literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/sy.dat b/res/Keyboard Layouts/sy.dat new file mode 100644 index 0000000000000000000000000000000000000000..a84fd573725db75bf37f52b74a407b13aa424f87 GIT binary patch literal 4620 zcmeI0`HPKF7{@=)WE)#Zl6~Kou`k&|L_|c%F0w>Kl>IUcml<Q<HH+)c&Wvr$jHo+_ zq9n>Wm!wOGB2kjW<GM4=eXW1M`_}V5=RD_ozRz>Mb$&R{DSmz<S;Gp((uVO&WHP;& z$~0!Mk#+QC0L^I6XgU$cDq6CPt}G#jN>rg5)u~Bs>QImR3|G2FG+{RlXviRjvPdJd zna2V=#FG%o_b+$M0XT%0B$7Gch?h<Gg$F0frmlAta25Cu1$xR)&{Jwjth^w=D_--K zd%Wi(pQtZ&<pB@5$_<`zi@Vg2>r|0DRFZUj_{k)jT+Wiuc`ovVREm|dxm@N7K^}u< z_{<l+(m)zYqe#AgmDbIH>m*I3rL>j~j(8bQ+i*PY536M;*SiY13RG0U_sfl0tdXVR z=<@JCp#oxVWE`*FBmHEc43=RsLPp6L87C8Dk}Q-yGE-*DL75`cWWM4ysI8RMvR1s3 zD9I6qiZ%Rhoa(@xl>Ks8j>>UIJbG{XUst2C?#xxdRUkGdT7&D68+147Cf%1pDGf(% z>%T<a$xV4vj>sw>!4t`lOFI87c~T$`<&nG$uRfLMVgI25Hac_ktg@pniTNa7<g0x9 z>;9^aUD2HG%vHcuAX<UO^q{A{_IuMu-}(LMuW$W0eccb%cYQ48GUgH{2fG!!1yhVE z!tTJF#pGdfG3Tg-xrn)d-G#}-Zo_0?vat!+?bvusAtqlt3C52}!}u@-yelcedNEnp zotX2OE81FUp=mp_K?%ESOJTE?5GbIrb{mG#TKf`hnMFH=b)<v#6FO^sb`N$pHW{0! zj769;%%QZ9(j%A?+ItwHRCX^miJ44Sgcfod>%k;yhJm!g?jz*!vkALj8y)KvqK8e_ zPDdBIVN%L#3izEx*)(iAR_T1$Ggv=11FOf^6QwHY0Ycu?u!KP$!Gs@$T*DS%a|oUz zl%lX~b(sW82&laI*j$1~v3cc59WsPG`O2#Wdv_{tXp3JhLoHJ+OIMW6lcScawnr@) Xb5hfWJV_X@I?d`SRx46V{C$$|Jpvdq literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/tg.dat b/res/Keyboard Layouts/tg.dat new file mode 100644 index 0000000000000000000000000000000000000000..16423f3e041b74ccd5a466ab02cfb464fedc3b03 GIT binary patch literal 4593 zcmeI0>2Fq55XOIxNB~JgTnN#!3sn}aAP5xMDw`m(i?WIc3POPj6>CAkrD+>L%2Fds zSejB6O(`O2P=WWg2XED2G=vaB2r9-9LWuDLAtW%peXnUR68Z<+`{B%)IdkVZ^CaiP zJS(XA(wNR<`jf&y(izNC3}rYYc#T)-P7m7iIM33VCz(nIUZyKAaS!*>h$b{8iDo>& zL$si`m1|8~=JN<GZT}1tY<+<j8O!U;;msPjyRO-xj4bAn!6KG~;(?p#Z*l@RvJnFj z1NC6wMk41hXF1IgcJeJpInI9KRC0pzoa0N%*hVoGl(3gGZ08iE{KkiTOfGp8u$r~3 zV?7%=#7eeU%}W&Vx!H1lvDM>8e&zyya4~^*H*+nN@GpOJnJfGgiU;mhe{(%>BO5Ug zF;EW%K2lB60L{@%4OV*%(+G`Hca70_P1JnNRZsO+E2Su1os_CsYNHwIs%erMsG%CE ziJB@&&2+yWR6pJ1VI?b5&DFwcr}_0K**aMn39Nctiw{D%Ia;J8%2IYH9@JXq$5-9q zG{}l<#6ZMAZ3eC+UQDS@s!Cs&SEhsdTH92iZ}go`=~wMgu~w^4`?OJ;^^?}>2Yn`| zy#IM^CCXKS#n09`J7!*7r|ZOO-{SWDrBLo)I-_$suRlZa;Li(w{PG=6gRIC#3`7jn zW+2%n{`ejn?;o=P{|Vxy%pks-_;xzckH$9L&m^1KWZLBYE=!rqLYu-n*u=k>xBZF! z4V&rb@s>^e3y4<`D>s$k9hNbREK?6MOeyF~8tp9F)&RPgijYJq_wl~fj~yVHZYD51 zZ4yII6AOBofY8Uphgg|qHfE4%5<?hg8p10~<atIjhS)AEFqZKqQVeC7FH(#&fngLK ztFdE;m}K(Ab0$xuo9HmW1dCK+yZ=M)A4X4M1&{I`Q^+x?W2(s@1DVG1MC(<B{Jv^G z-e$Za+*efP<L$xQU>wAXt<;IF#)7vASBSR@uLQ5ur^2(FlqYDYD!^M$Wr5E`z(P*= z9^L$Q-C^9PxP06}+yR_b{=|At!mY86T^?>7ZUf&J<BF(m+ik4|s%hDk<5p6c?{^&l J#Y*ZT-2&Du;PU_g literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/th.dat b/res/Keyboard Layouts/th.dat new file mode 100644 index 0000000000000000000000000000000000000000..bc037cf82a1a7988338fe0835a0f537d2d057fd9 GIT binary patch literal 4925 zcmeI0dx%w46vn^rJE*0oq-dxpDU3N|qm!1X_^2qU(6C6U@R4F>U}2<WD2z7Rs53UB zQ;y@<Xg<dAk?+U38Yz>QRH(hM(C|iyMMa5)MM-}5&fK^i9PHoXT=<=}_S$Rjwbyqz zf86~s8h%qyiyBPFV9dZw%*I2Qi+Nap?bw1xFc$qV4AXEA9>h8fz$%Qu3JA?{16raD z+My#lqZ@i)vbXDl0vth4<lzZSz;Z_xp%mrVjr};-Snqn~L?q#Tyn}ii#qmfyGdz}d zPGyF%jTML$_!kOPvmxnDKF?=3l&yI;@8bjP&QW}rWB3whF^9Qq!J9aU9oUu6vK60Z zCqBi~_yS+zE1bu7_z@TJD}G0Reuie=b1|=g%;)W#<k90C&xxGFLKZdFyWY_%BY71p zW(k*aStOp>rz{<>YGO8%728;WSb=N>W~gB#-K!yLsn6L)?bJ~}u(P_Uheqmt{mfr@ zif7qeNq)<_^eG4G8{VO{+`wAaaT|AXFGIe~BZO-BAy06Ej`BEv<DV>Wg`Ub&AC1<d zdaSWt_8G3_PmknH(>Oh;$(kC8XVy+h$DeCrHj@?GSb<o9Yy}1f4Wm!gHfRx?(N>+) z*Ses?`d&Zjl5Pk+`VZPX5()*c;Ft6;O51qT!av-G0os8B^JR*A|~p-O$E7qs4A z;jKZn*60JB)L$N5)*rf}PC?h8dt<%qGhE9b5XtKo<OI1v@1P(O&#cW)#|Jhso5_l8 ztU#<lwgO#{Oe{oS<RclbH7iVL_L~Lfb+gF4Y?k=n{*BIm#iZu;m>RRw>@xezdQ)ZA znN?;ZTKl=iY&G-EYhFFiEH<f~cbhF{lPShTKa0$2Q|*k@inq*ObHG%ZHyuyqyx|*$ zTYU1~7~(2@eG^fLp{U=5E)FFV%gl09VO%s!n8WtnQo?N}yj5bQsd8J%M7b|7lHsey z>%vrgsaay*>%$$!<FFjJr5oB{-!g<{&PhpAYFlhd>~A)8ro<N^IkpSY3%Ry#INWXy kI<FMN?fG=!HdFg|Bg3MN{2$)V+-Ot()wfe$`_E3U0!Mf8$N&HU literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/tj.dat b/res/Keyboard Layouts/tj.dat new file mode 100644 index 0000000000000000000000000000000000000000..e8858bf74137de1b5612673018402e56a8d05d74 GIT binary patch literal 4727 zcmeI0e`uCf6vsc`gOx2c6Z<(awJdF^Ej3eFnV48fKg3GRG_jIoV2lL8Fjp(HvbD{b zHZ@(##j<TqovYO<i$W?q&+{S_Qq+*BkP4|Nit76AePg{f^gsW39(bN}@44T5&Urp? z|F~x}UC(ruQ^HIx;TC3bJL8$dUCd`CE4Z4;3}GZUa5-19jEh*x7>Y4^aVovZqYwS) z&j1E8Erc7yV4mh2&gUAgV@dEV<X#q2N*Sv&`Hp8c<_M};!&=Iz%JFBX73o1ucAD6P zKtkXI2o$MH^fl*cfR6A1KX8<vImoa4&YuiczCPs;@35b5`Iwlq^&V&H0DV+T9ouPO z2aPn-!fskQ%vL%=$O5&|&KG<|UdSNz(rFs1i*;!x-|<SDn4=r7ks75j8k^(K#wkqu zC-<<LRV6kdkPzrj;PcFhc|vV!(KEVV<*HP*mT7}(v_&0i*K)1UJ$gWERIC#1(IPcz zsdi|prfIrn=tj-dt(v9Tx<h4}qIsIHk2FVfwNj;O2pP7iPW5_M@9V=8JfWZE=niVX zKG6ZCa{SqUiPHW<J*;L`iA@M31iBM=$hu~O>}H!`!|V?Yw-HugXV_>fv~f1uZnJ)N zmi?l?bfKB`wwvrXU2mt@)UdNthxLuVOP{(U`aakT>`VO=>_YodM>WvSwJAY2!6sRe z-Dz{}?o7V!HT>WB!5m$&EwDv)pDoGpXZJ2n`%8LQ&8iZc5J(7gCy-BJxYLhiT)6RH z#e{IzpU4%&Riv82&Hi-!b>bSL$M84sJ@{MrE}|!icj0@99w&N=zC>ljd+`>$8GoB- z72bij<Gb-zqP0X7%p)o%T1`}nzlpaIJxb~&d?(SfjOH?iFp7fESm+zxJRYHleLKl# zD8uM1TOWE5!<odjK{z7xBH~I?jiEx{Nc;jG;)HKCz8SB=Um*^)JdeMOH-vy*N8E~6 z;?LnP;#=`8cn!V|Uyr|rmxiR?gxBNS@J;vzyp~igUV%4;#z(fkhjZ(z=hY0q&Q(>R ie{zgqbNH2_lf&;n^|k*)?-;oS0r5$owr~5tvHcDAqfmAL literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/tr.dat b/res/Keyboard Layouts/tr.dat new file mode 100644 index 0000000000000000000000000000000000000000..c2b28df3a4a6c90afa2163c8b65bfcd7a3f29789 GIT binary patch literal 4591 zcmeI0`)`kT6vtmjT$fG+5kaJGRg^C?Y*lw-?i8gM8^by^W}TH)Nv%XgM_fu;ZR(n@ zd#j38**>3dBht(zgpC>bMr0O|Wm%SGKP)@nZ@&-SvzYz?&yzgQIp_U3&-t9sJNf)@ z-s`A&1~Qjf451^#7{NQlF`6-qV?OWWqYv%r%phXu&K#ndNi0d!qdpC3%xgr^lx8%i zC2woFHnigtTG5)m^k<qP6PQdQAF`N_Bm2F|WVjO2No6@JSn0x@FfHt4I-zGh20RAp zz(75zNvhx>KXQrve2b-u<6Pzn)jT4|Ns1}tAe9{EC_hoeUHp7cHXGT*X14G(+t|)d zayid>_G-yr*+U+uDdV<A-*KIrJmv{c>(Emu<!@KsUp(VCe&<gY?u38TIFZvhsAoL} zJO=)cfen!xGg21F9Q9*mY#51;;3=|L2B{w-aWYzbGC<~Olq`KENg7ELiIS$$Oj<}Q zX)SG}oeY--(os4~nzWZ_%^WJz^gBT&OQNL8GWF~BWVtdkWreJibjfhxPPNrx{HvF& zI$56e81NXV&A`*hjVYIE3DmkhB@zFIT$3~E9}<5UIVqRb8aXE4$Y#lrZL&jhBe{7} zAm?P09MJd&DT<)ZZj~C}a$(Nef9=n%%tvxZ?#X=#x^U;u2Vwk|m#jKjp7j{;7^uxa zTb=FS&^i50`su7bfVXsl@2yjQPo3+V@F`!gP^a!RR`EH3VwUL;9w@|K;B`LWGacy{ z=}`ZXj`d4)K(8t!MHPfNR+G*Goz>^74zLtkhCNI#ts1R$dyt?%`&2bptBQgtrY#-l zs`5h*x~Rb5Q)!`_E(~FwwlIYmDn=x#h>*;56(lC9kPs-q=4**zOl2gaRH%5Du_{%J zr>cO!DXgD?s%6Yn9V3b1OjPy3?!s;){&@$3-5m_Z?5C4z9HtU;kuRCed#q8dBO}bi zP=Z;<FlB1W32xYmt-zkZmXfKJ>^^KE<_M-#50apYi8+d?!0aQqE??ihN`pCr&BdI3 z-b04F2UCP8!JNiiAefyWqQ;!UT+$A%`Y|Uk2eEnB9PEzJu34ew1hjR(?y+0nJ$hJE Nj(xF-IrQ&c{sDj`<>&wa literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/tw.dat b/res/Keyboard Layouts/tw.dat new file mode 100644 index 0000000000000000000000000000000000000000..44526a6346c1168201280a1b1f71360a75f48a89 GIT binary patch literal 4621 zcmeI0d2Cc=6vcn1nx-}u#1JB)1QfJ@mWqgFD?4HZ1grvrY+|K|6$_M#6-6Xa8bG3^ z;6hUt3!%zVfhmPFyq7{sX;@T@8bSueC2EWk0%%CMeVv(%lcN3K_mVH)ckexOzx&SQ z{c+AB8lN<t<|+Dd7wHUSF!wQ(;f!DklSv_!_H?2T_t2FIbRd&t#u3Mj#FIcGH`9V! zxRuuQvUay~2eW9yZS<fgV=R-wNJcY_8O#jb_g`CH3?P>*W;2JmG5K(q;~nzDp}+eK z_zX0Ifr}wb1z&QKeSAbERUD*@Y7XJ@HD9rf?X0JSJ(RMA&-sAkY@(jmS;A75v7ADR zSj8IFvWwR!ww~Yd4)5^^JE*g$h9lJSEoV5}jF}oBf5hN^BglDv<d>LyIQ-c=TnLB$ z?la&s&<qCNP$Q_9rfHJ;s*MI{kcKK*!!<$~%F+yVQ;J%tt<rR-I%|qrYoa=8y#C@U z=my1ydNg$Esmmm(rE)Bns8sb(rkzG>YzUJbh5fhj3Sw~inxnbORbEU!++)6%UwoZv z80GIi13m-M3?#-iMu+r+f;ys7)u~=5RH0M)LZ|hse$rl5>O*aotF79p?^U9+D%Tk; z(+U-7wbn*`b=6v`_btApcU7z^9n?3G>hJn9a*m#%sdId2u5c|b?xL>fZ<*+5^114D zPPk6B$)EU1pMn291MPUgRQiLa(;qVJ{xE6uHno30{Y}^3#LFz?IdYlLD=Z+JmrQ?8 z;u(^d&OFodSv+q_e>N|eGVja1rtl}Th<u(U&$NCHFPe{#LU(fwI#|zc<}V~!lxWJK zKh7@N(UF1NZPr3(Ga4Gqg=D%g)qn|%Wjw>oWXNP9Px2^_o00IUiHjr#@q}kiJYx1l z29KGw(8p|x#T1x@F@YgwV+=O4VU%5#&Vb0(>9JQITSfgkoHCp(oO`nzx7d4SXRp1p zyNzIFiLD*BDmYq5?N;1C)Z4pO4XiN&YKlS(1Orvnz0J`BIOQG*Zkflzxh2&&dvK~F zqZGuB;*{d-#;L&BgtM`M8F!xz<LopJ+(H{+gRM_(?WXoE4j1FDi((_V-^zj2X4llL h3{esc?8o`o<HKF<5fc2&GB(9_oT|tm2KmSTaSh1L^ydHo literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/tz.dat b/res/Keyboard Layouts/tz.dat new file mode 100644 index 0000000000000000000000000000000000000000..74d240a968156ce358c5af2c15c1b1e16feb44ec GIT binary patch literal 4661 zcmeI0eQ1tR7{-6sBaDTFRztqEw#-MXl~^KDO0ASyl!%DbN-0gom@ymk8IrNhY%}|? znJr9HL?Ti<=haFnwbG<ktJTW!yzjf_U90^ie>_h;=iK*oU-x~T=c@D1bBpk^ks};p zGpS^<g{`b6i|y<nm!qs<9Z4)_6KSmEFezk{&OtoJ5=T6fnaXq$NMtq}+_;4-rjWVJ z_eURa>n`@Nk390jVxw5E$8fH2h9b^$DF%<GC4O)-ng)B|K;XbA97s@@^qD?>5u%MQ zzVeMX4*pKJUwp?0ns`PhFL*^SEe?H2Pq@*ocOy{+ReYk9MwgFOE%iSBBT|Ka1|Xt0 z2#yd;i{VYt7>(BiO^U&z?eRW7V}xpy73_fnfdfMwXo=jIow}@I?bSx@*Fj}#s}AX~ zj_8K2DNEb6R-3e2o3%wHTCYN7sz9?eNAtBvNlH<wmMcx^+Mz^cXpJhgQmg#g`EEU` zT;=JON=JP^AH^{1RHjN*sWt|WeoKvyH;+(_vVuKuAaG!)11r36)}yIjyw|JG>Qlc4 z^zF}0^2Yep@9Nfjb?TQw`l`v^M_21oT%;48Ms8iZUh0S1^v>mTyw`f`<KqT-)4c>Q zaWETtis5l;3@_Q6?alKRcu6sMv~!V<FB_p6Wd(cSK;Xbo2WDdLVDDnfu;tha>^*EH z_CB@>TgnpmCm@aq*b~?S>{UzyrW$(|dmeiMdlCDbN!Vh{BTOCkIH6MPY0Lv`9`+>W zCdO&hvklXTc}OUq(0z=P$j6?-oa4)7l9}toQds4NEoCCdoNz}2?tIn!Y<lkAc5JRA z#1X2)lw(@4t(X?<8SFWXJNGqAm1{SZm}bmlY$2u%Q;RLamXL#af@#9kVCpdym@>@m XLFJ5L%Kw)$Im6EPubk<)_qX(KA`(DE literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/ua.dat b/res/Keyboard Layouts/ua.dat new file mode 100644 index 0000000000000000000000000000000000000000..c3c4fe02d97b4accfc79945a9d7de1e826542c1c GIT binary patch literal 4732 zcmeI0`)k)#7{_1FNi0Q6ti+sH%1WEJrM1+w!ALAo?1Gh~bhX5;(nT!IIp^kFZp}^S zoX$0E-oDLkEiZFsd?*ULJ;xHMi0T`KP(*=LL{ZPa`+mpzjN$%(&j$|A=e*CubKalV z_j`UgPc<FSExf=p%qE?=+|FH0=57|Skd>?;i>ZuYG_%MclV=&plZ<C6jz09|BKk9c ziy6dVE+fav4P!V(3}GnK$>uRr?&l#Evzk2CCHFgDs0<~PQ%ErzDGTYTX=&o6Dm9H_ zL?9y23j))mBPq`1a*3QJ;3t0JH$3O~gTF|Vq4GIrXyZM8-~&Eku$*9kd`Lg3rH<X~ zWj`?*Xr!4IzNLm%D>+6EafC1Vn!dKfKOhpK8q$^Fh}Ei05aNv@F$87G+`JymBy zLZ8yZYAP#=5rK$6R|4NBPfW2Km%~yfk4uGA$~JjXc1W%4l6U1DStYr$Se}v+StiS+ zRhCGLJSR<(Ejcn%Zk5?GSLVqbGGFeIBAFo%%ERJifh>}>QXmIyhkDs3F?nB3%E!Gt zq2Gk^zLHPnGdV3^g!I(6oJr{4^{|@Cief|{BG8q<3fD19cX!%bhP%*>cbRUoyVPa5 zscyQPZ|V?tg%gXTU4J*o&2xR+95>M2X3AOlS$^$2bLZrD8RdSIe@%JR{V9LTaCfDf zWqH{y$IW#2x`plmoAu^-K9sl2J>r(QrS9pFo~rdkLSNp)YAP#=5rK$6R|08V$0WP$ zU(XG8&%co=cGu6e+x-l?*Y`t@;tTL=(N^>=^f>w^em%YjJ&a$6uVf%TAHM}{MjO!+ z_+0dD^cdQL9>P~x>)=!wz7$`GUxT)xNAP+0SI{PW2@|ZbaFuO3mWftwqBRs&n}MK- zH0w2tBA&m6o4A^3)=kJ@4A)veVXXPnDzqNmg>FMPqdU-YbT7IOtwdi(3$2{)MhnnQ z=&R^Xv=*&FtI-P7T<3GLjZ?OC5Z!~mhHgi<qIGBtEkhd^*J*EM*j{jypqXHg^-Y3C zYj@mCJhzVfSY)w+cu{Qvqu+|(iLW7Oz#9p(8^X9DiLp40(O2Qkx?$YNM{BGh(~hy4 zz&<g7F`i%7&M`PZaLmZ1ICe7{&#fY!*J2~aORO?`<?VnC;(D|cEkW&<+0c#P{v^Qz m-3Z!WATL4i4PLf3Q9D0#-vKXX^=oWww^83|DyaWIzW)Hugj5Rv literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/us.dat b/res/Keyboard Layouts/us.dat new file mode 100644 index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a GIT binary patch literal 4593 zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV! zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8> z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)% zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6 zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0 literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/uz.dat b/res/Keyboard Layouts/uz.dat new file mode 100644 index 0000000000000000000000000000000000000000..5599cc853f38f14a42a0dc218787c9e0d172277f GIT binary patch literal 4737 zcmeI0e`r@_6vjW#NleGo7#hZ6I5TVhXsNBVp=As!87U*fP)3p@mNAkH$+23^U!|^X z&9tSd%^73<nm<~tR#_BM;kn-s3MooND5OFv1VMV)c46Hb`lo-~3zzf0&->hSp8LT2 z$2r^Rd1kSa<&-j(Ig~MvBIdJza;jLxREilz0S_{P$*kZeDkx+b#sCH~h%B-h%5~&0 zoRX04M)G)->$!m$%;d>{EMhTBsHTRsz4a~^wk8OTtY;&&G$inNTi3m4innP@9Y`Ix z0tcq6hjf;a%F#K#;CIgR7bm&EMJ|!2Tz$tWKH)gO@HH7m=re}t1lig}GcB~z#y$?v z&S8#nh8=W;l;hPwCqMEtS)qb7K-Vf?V{}Vzy~|0Pmf#hsKoeD{DG5BzGpQRd?&maS zr7?9Nb)c^UKlI+1HR@2iHs}e}s$Pv+p)G3Cc6F&!E450GX{pw0nU?E_9@l<Vs7?2& zM6>jOW~)>WX|BrjuxfO#7OGrd=@C7uDpjjBRM@Fz?a`<DTwh+{4gEgBJE`OPMkn-b z0+0VC>c&s?a~iYKm^zR;(AR+~>)DO9`Br8VY@ij|WGk`}Hr0x4hLzg_8)><Q4YmTy zwj7&h*Vr5zW~FvoXLMG->YRSlA3Co;^|!{@Pr4Lt;Zt@&7nNuEHak?9X(e{QEwaV7 zq_<vQ4ga@(KEZp=mfF)+Vb3P;_}gc?@ydQqV^$hd2T}+6I*`kx(9=)hj?nSn$z7q> zpT_NE8ps?9o&8|^eWEo)FXJEJNAQpELqzL{w&U*+ttNVfAw)G~n(%h~0RA!2i+C5_ zi66#~5^W@^V<Ay3(ORNv{6oBh=p~{J_(7sg+{QRYF_H0MurMUNS-ik>jvXYId`5G+ zW^<T9+|1qF6NtBlSwyCuOnXr1Tk#hB9sEta5#NS4;P2v_@Hg<?cxy=L&1AxPJ^mX0 zHogN7`h()v@y+;NyqZdUKfVXwiNA$!!FS<pcpbhk3_fCgl}UY9nScM$ca`~ftmWSZ F{sS|fQ;Prq literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/vn.dat b/res/Keyboard Layouts/vn.dat new file mode 100644 index 0000000000000000000000000000000000000000..f0c501665de7d7c683b0ea2c42100becbcee5358 GIT binary patch literal 4620 zcmeI0ZD@{R6vu!66=oU{kwr_)@-j=(nwh-K%=`Oj4Z|=qZ^LK}qh&;vMUog=8qH`) zlJKmjr6(;((pqatOG{d7NeicEyY+Zj^Mz0M-Q9hzbFOn;*SY_7eK^09bUsOJV>2nl zu#m+pC648+WHs4j5l;f+h$WfHOeK>EWH5ydgwTsn`q7_(3}z_98NnReE{bRl5XmSK znMt}uQdvhDIqYU{*Lgje6F~__$t91&6a>W`H{U-fa$MKC3b+dVg#uyfOseH0AMjDd zOX_&VBVO}{w|t_7$2{Q<_jy4z4{4^7_dKA9Go0f*7r4Y_u5gtyZs6rK6}IIU%DKf; zJT#j3j(QsSOe<}j$MyK_-Bp*97@~H*(g8tnXa1Xi5ZcYGljT}h0at-Q1&X?E%p7GZ zL&=(;6fM+ZP1RB@*Ggq+o8lC&XvHW=v6`aI8mA4KtaJ^~APv#5fIAnVSqj%^MJZP! z6{!TxP@2uJR;t!1TRGYtkR4b@@VGE2uRwcsKzYg!iaYBL`{O6NnRT*U>nh+X5U4=k zkWSC5X1&)7Rm!KAs?$Tg(rdj@i$3a+9;-rCs?~ix&<EX7ld9FI(>kjXmFl7{>9Vfq zs>)QOV%@S^*shx@*AqQcgL!ZDPWAev&uab48``U@E~i$7wCRh!>U%fqJN)rJL93kA zu5}e~75I|^5!4*Va~)3wo@#tY@fG7cj_(-08`P9Ak*31i*5&tQ4+q&|{d+El*w1!$ zSvT*k!dpf-8`)>{Ad{^|5wh4})L<H8jS!?+$DYR~qX8M#{qHn#5W^&636Zw%c%us8 z=7n*D={&!Ol~Rbu-cxu=8Droe%2K1LImdd-4rLi@nCs^fYgxs7mKdk--o<;(_L<2F zV-HEpGfI)d0;3r5#vcmEH}a6mY$F-7jB6~iGZUHdvx3CmDhLqcAOC&+Z)gASzkgo- HYY9I9eu?Rz literal 0 HcmV?d00001 diff --git a/res/Keyboard Layouts/za.dat b/res/Keyboard Layouts/za.dat new file mode 100644 index 0000000000000000000000000000000000000000..2b6d2d3b1078f4fad1545fcad1b87e77a71739e4 GIT binary patch literal 4636 zcmeI0|4&tQ7{_1lt2rde%*;$zYGqocWtm1nXqH7;T9jsHWkp3sMn*<xq1;+9#}t(u zl7XQDI$@SV$gK0>)||`cnycpe0@a*zwN<M%w_4A=+{@^si$CC;?X%D4dCv1ZpZ9rh z=ZE*ZfUajM^SPfJ8BIDFOlLeZxRu*j$O0yC6&G>|sf^)r<}s2i#&QoK`qGaik{Q5R zoXt6$%XK#H0!Hu@=W#xhxR%+L$>dJ%;t>|{c>KQq+wy${d1RBrVwU*wi7+>ISe6Kb zJzyYUpcf4M9<SNW5e~DLDq3izjcx4bBOG7x1$8vAk<GkMHMM+BC7-c{PkEIhRuSe6 z-lUY(l(B{;mQ!Ifzo(q_>|_@QEsF372RO>teA^35(UM<$bwAO;j~wHKFP{jH#}2<G z!e9>=2pH%E11r>3G(`(FS7{odX_}##8gKbb%~G}&X`&`+s4h~fMr)krYnZY$MsswM zzd(I-hSm1hnM%<>P1c_b)(|b$p!noofH*}-fv-DXIm*=%E%oISt$DG0;c4C`s)9XW zAYh;;1H(dH(Lw#H6FRI$9nqIMst@f?`bOXBr2df8$Ew$E9nv1P>1XZKaebg;TBX-j zqSY!>xhhnt&8pD>6=}Qm_6ybe{>2~kw-mpvCxTO-hxjT7h5Ck)Ldl_lzI>v4KrBD> zG;b4C!5%OWFwm2M;aqJh{TkEhlTEu%VJg>~+P{)C)Ajv%o|kxnJeKk@FY+|cnf`u| zhe+X3UN9}6&6B3|b9ly-`3+oV3V#6wEaNfqP3!0KtoaBNm}suSNSk?u`3or)C7W_c z!)szVqsZW5vlcEjqakW8jAa}TTVWD&n9D6@GGy@p_i;OSo00H}iHj7bac|6=m}&Mz zCU=;%kZQKY3JT4_n8(d#V@x-*VU}H%&Q0A{r~9w=TJUP|w%F~RD|guJ=!Y%04~Twv z29cGx23$QIEls#q+&<hc+#cL}Hp#t9q?(TAa@yArDW!cI?adaq;Wgm3;?>ak+9q37 z)?aEX+zq7gKR~MK3|GdHgsmxDW$SG^i)*4Jd5w7c4b-7JB1O1TT#3zV#8u)p;mU9u zaO<L&iix~q7}ny|6Dgs6t5Mp~ybo_jj0>;M@VsSfqxDB;6yqvzd%KZ&TmKF1AMdIC AbN~PV literal 0 HcmV?d00001 diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 16cbbd836b3a7cc2ac416f7a6a6178579a41a785..753b84b6f2611a7f87209c3a42f3e9db1dc588a2 100644 GIT binary patch delta 652 zcmZXRK}Zx)7=Yh<^ZuFH*4SM`Xv3H_goX||mbiOqn?r|^r9%)%tq>7}hYlUPltGIj zg33dG$aQs%GTbfqV7x3C3=B4k=(x#(dkDG~R0KO>vxSbX@A!TE@B4YLRxs99i~uEs zoKXnb#K?6me&5d6G-I=jtz>Ne(uQ**Sp7y*_<02WpjiiNAvOv@QCtd%X%<Br)DVWk z$^|)x(9VRlvWt%y%Aia?f*va7oMvui8$7($#4$Y$x@^gTtL#KdZC+&dgwlsI4|o^8 znung9&_6deMF-{RV`%Y1K2JPp@a>S#zdmj7q4)n6@cH;NC{ms{Oo$j~o#>0|qBp>^ z`^CdzLy&0m1g0))2W0XEFv@T2v$D1X*MhvfN8GdMZA{;yy8QkIs*Kk0$5Hh-dT*`| zyADX#Q5SwPx{mqh+SRFL?GAIdaHFIR$jY*&cZgLUo`@L=sdJGmoDznqV|JFt(3*#S zQ4XHRj}8RH<Ryb{;@fo^kGS0X|6QjQ^M_a`_m(2q@s3@=LWLfazxtFdiq;J1xS9u3 z^lw<+1>Hx~)2tlDT!r2hLl;B%p`b=Edy}<_WS4;lIqMcq%@UtZnwa~-dPVqbKn(nj Oi&DzO+G|MY+x5SDbKVsI delta 395 zcmX@IQ~tqfc}_+K1_mo;28LhLb7wM|H#)RBFt$1{wK_1jI<RbYV0G!5K4CAb&-4pj ztUspT5N1}GwvNqW`k8&K9NT(We{fCLS-`F_UBH`-f4ly4)>NkH1y@-i{OSGj%$d^< z>|^8DZZnHjhmp}`dZ8kdIz;XK*{pLJr^~!TR=fSqTviqqh=F(ZvPMi#Sj3tFF%QiB zz|N>J{mwjAj_o;%Sy|xbf#kM-SOT;GVjf)W_C3p3c^IcZxCyibA(*j(bq(Y6no1PG zEvrB(6RMzs+a1<`jGJ?V5m_hCI*_7<n<#=i*0UyXPnOr<n0A;I=(@eEk<)#X7}d8Q z*v<NciE;b%kHReK?ZD95er6xr`Y)5`YjIA0agse``i;%(m6J8K^tU%`VYg5O0M^5m ACIA2c diff --git a/res/Theme.dat b/res/Theme.dat index f0d371b81c1b4dcfd1ac6dd4c15a678f48ece565..0c27b20f75b491927d1d7dc428367cc9e4a79448 100644 GIT binary patch delta 16 YcmbR9h;hy%#tpH8jDI%A3GRyr06|O#SpWb4 delta 16 YcmbR9h;hy%#tpH8jK4O=3GRyr06{<pR{#J2 diff --git a/shared/strings.cpp b/shared/strings.cpp index 12da177..cf96aa3 100644 --- a/shared/strings.cpp +++ b/shared/strings.cpp @@ -132,6 +132,7 @@ DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate, "Key repeat rate:" DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate, "Caret blink rate:"); DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction, "Try your settings in the textbox below:"); DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes, "Use smart quotes when typing"); +DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardLayout, "Keyboard layout:"); DEFINE_INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed, "Double click time:"); DEFINE_INTERFACE_STRING(DesktopSettingsMouseSpeed, "Cursor movement speed:"); diff --git a/util/build_core.c b/util/build_core.c index 951b132..ca68504 100644 --- a/util/build_core.c +++ b/util/build_core.c @@ -575,6 +575,23 @@ void BuildDesktop(Application *application) { } } + EsINIState s = {}; + s.buffer = (char *) LoadFile("res/Keyboard Layouts/index.ini", &s.bytes); + + while (EsINIParse(&s)) { + EsINIZeroTerminate(&s); + + if (s.key[0] != ';') { + char in[128]; + char name[128]; + snprintf(in, sizeof(in), "res/Keyboard Layouts/%s.dat", s.key); + snprintf(name, sizeof(name), "Keyboard Layouts/%s.dat", s.key); + ADD_BUNDLE_INPUT(strdup(in), strdup(name), 16); + } + } + + ADD_BUNDLE_INPUT("res/Keyboard Layouts/index.ini", "Keyboard Layouts.ini", 16); + ADD_BUNDLE_INPUT("res/Keyboard Layouts/License.txt", "Keyboard Layouts License.txt", 16); ADD_BUNDLE_INPUT("res/Theme.dat", "Theme.dat", 16); ADD_BUNDLE_INPUT("res/elementary Icons.dat", "Icons.dat", 16); ADD_BUNDLE_INPUT("res/elementary Icons License.txt", "Icons License.txt", 16); diff --git a/util/designer2.cpp b/util/designer2.cpp index 673d741..3241961 100644 --- a/util/designer2.cpp +++ b/util/designer2.cpp @@ -3691,6 +3691,7 @@ int main(int argc, char **argv) { UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_LETTER('Y'), 1 /* ctrl */, 0, 0, DocumentRedoStep, 0)); UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_LETTER('D'), 1 /* ctrl */, 0, 0, ObjectDuplicateCommand, 0)); UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_FKEY(2), 0, 0, 0, CanvasSwitchView, 0)); + UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_FKEY(3), 0, 0, 0, CanvasSwitchSelectorIndex, 0)); UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_DIGIT('1'), 1 /* ctrl */, 0, 0, CanvasZoom100, 0)); UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_DELETE, 0, 0, 0, ObjectDeleteCommand, 0));