├── .gitignore ├── screenshots └── 1.png ├── src ├── data │ ├── compile-gresource.sh │ ├── gnome-shell-osk-layouts.gresource.xml │ └── osk-layouts │ │ ├── ge.json │ │ ├── il.json │ │ ├── kr.json │ │ ├── in+bolnagri.json │ │ ├── ara.json │ │ ├── ir.json │ │ ├── la.json │ │ ├── kh.json │ │ ├── my.json │ │ └── id.json ├── metadata.json ├── schemas │ └── org.gnome.shell.extensions.improvedosk.gschema.xml ├── prefs.js └── extension.js ├── package-extension.sh ├── TEST_CASES.md ├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── install-as-global-extension.sh └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | dist/ 3 | *.zip 4 | *.gresource 5 | *.compiled 6 | -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nick-shmyrev/improved-osk-gnome-ext/HEAD/screenshots/1.png -------------------------------------------------------------------------------- /src/data/compile-gresource.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | glib-compile-resources gnome-shell-osk-layouts.gresource.xml --sourcedir=./osk-layouts --target=gnome-shell-osk-layouts.gresource 4 | -------------------------------------------------------------------------------- /src/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "Makes Gnome's OnScreen Keyboard more usable.\n\nFeatures:\n* Includes additional buttons: Arrow keys, Esc, Tab, Ctrl, Alt, Super, F1-12\n* Supports key combinations like `Ctrl + C`, `Alt + Tab`, `Ctrl + Shift + C`, `Super + A` etc.\n* Configurable keyboard size (landscape/portrait)\n* Statusbar indicator to toggle keyboard\n* Works in Gnome password modals\n* Works on Lock screen (see README for instructions)\n* Works on Login screen (see README for instructions)\n\nThis extension is a fork of https://extensions.gnome.org/extension/3330/improved-onscreen-keyboard/ by SebastianLuebke.", 3 | "name": "Improved OSK", 4 | "shell-version": [ 5 | "43", 6 | "44" 7 | ], 8 | "url": "https://github.com/nick-shmyrev/improved-osk-gnome-ext", 9 | "uuid": "improvedosk@nick-shmyrev.dev", 10 | "version": 18 11 | } 12 | -------------------------------------------------------------------------------- /src/schemas/org.gnome.shell.extensions.improvedosk.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | true 8 | 9 | 10 | false 11 | 12 | 13 | false 14 | 15 | 16 | false 17 | 18 | 19 | 33 20 | 21 | 22 | 16 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /package-extension.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Run this script to package all necessary extension files into a .zip 4 | 5 | root_dir=$PWD 6 | zip_filename="improvedosk@nick-shmyrev.dev.shell-extension.zip" 7 | 8 | # Remove existing .zip 9 | rm -f "$zip_filename" 10 | 11 | # Compile gnome-shell-osk-layouts.gresource 12 | cd src/data/ || exit 13 | ./compile-gresource.sh 14 | 15 | # Compile gschemas.compiled 16 | cd ../schemas || exit 17 | glib-compile-schemas . 18 | 19 | cd "$root_dir" || exit 20 | 21 | # Create expected .zip folders structure 22 | mkdir dist 23 | cp LICENSE README.md src/*.js src/metadata.json src/stylesheet.css dist/ 24 | mkdir dist/data 25 | cp src/data/gnome-shell-osk-layouts.gresource dist/data/ 26 | mkdir dist/schemas 27 | cp src/schemas/gschemas.compiled src/schemas/org.gnome.shell.extensions.improvedosk.gschema.xml dist/schemas/ 28 | 29 | # Add necessary extension files to archive 30 | cd dist/ || exit 31 | zip -r "../$zip_filename" ./* 32 | cd "$root_dir" || exit 33 | 34 | # Cleanup 35 | rm -r dist src/data/*.gresource src/schemas/*.compiled 36 | -------------------------------------------------------------------------------- /TEST_CASES.md: -------------------------------------------------------------------------------- 1 | # Test cases 2 | 3 | - OSK shows up when you click/tap text inputs and/or terminal window 4 | - OSK can type lowercase chars 5 | - Tapping "Shift" switches OSK to uppercase layer 6 | - OSK can type uppercase chars 7 | - After typing an uppercase char, OSK switches back to lowercase layer 8 | - Once switched to Numbers layer, it stays latched until user switches to another layer 9 | - Long-pressing characters like "1" shows a popup with additional chars, typing those chars works 10 | - Tapping "Ctrl", "Alt", "Super", "Shift" adds highlight to those buttons 11 | - "Ctrl", "Alt" and/or "Super" remain latched when "Shift" is toggled on/off 12 | - Key combinations like "Ctrl + C", "Ctrl + X", "Ctrl + V", "Ctrl + A", "Ctrl + Z", "Ctrl + Shift + Z", "Ctrl + Shift + V" (in terminal), "Alt + Tab", "Super + A" work as expected 13 | - Esc, F1-12, Backspace keys work as expected 14 | - OSK doesn't switch to `us-extended` layout in terminal 15 | - OSK works in Gnome password modal 16 | - OSK works on lock screen screensaver 17 | - OSK works on login screen if installed as a system-wide extension 18 | - OSK settings for landscape/portrait height work -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Environment (please complete the following information):** 27 | - Distro: [e.g. Ubuntu 21.10, Fedora 35, Manjaro, Arch] 28 | - Gnome version: [e.g. 38, 40, 41.1] 29 | 30 | **Additional context** 31 | Have you been running your system for a while, or is it a fresh installation? 32 | Are you running any other extensions that might interfere with on-screen keyboard? 33 | Does `journalctl /usr/bin/gnome-shell -f -o cat` show any errors? 34 | Can you see any errors in looking glass? (Press `Alt + F2`, enter `lg`, switch to "extensions" tab and click "show errors" for Improved OSK extension) 35 | -------------------------------------------------------------------------------- /src/data/gnome-shell-osk-layouts.gresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | am.json 5 | ara.json 6 | at.json 7 | be.json 8 | bg.json 9 | by.json 10 | ca.json 11 | ch.json 12 | ch+fr.json 13 | cz.json 14 | de.json 15 | dk.json 16 | ee.json 17 | epo.json 18 | es+cat.json 19 | es.json 20 | fi.json 21 | fr.json 22 | ge.json 23 | gr.json 24 | hr.json 25 | hu.json 26 | id.json 27 | il.json 28 | in+bolnagri.json 29 | in+mal.json 30 | ir.json 31 | is.json 32 | it.json 33 | ke.json 34 | kg.json 35 | kh.json 36 | kr.json 37 | la.json 38 | latam.json 39 | lt.json 40 | lv.json 41 | mk.json 42 | mn.json 43 | my.json 44 | nl.json 45 | no.json 46 | ph.json 47 | pl.json 48 | pt.json 49 | ro.json 50 | rs.json 51 | ru.json 52 | se.json 53 | si.json 54 | sk.json 55 | th.json 56 | tr.json 57 | ua.json 58 | uk.json 59 | us.json 60 | us-extended.json 61 | vn.json 62 | za.json 63 | emoji.json 64 | 65 | 66 | -------------------------------------------------------------------------------- /install-as-global-extension.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Run this script to install extension system-wide. This will allow it to run on Gnome's login screen 4 | 5 | zip_filename="improvedosk@nick-shmyrev.dev.shell-extension.zip" 6 | 7 | # Check if "improvedosk@nick-shmyrev.dev.shell-extension.zip" exists in the current directory 8 | if [ ! -f "$zip_filename" ]; then 9 | echo "$zip_filename file not found, exiting..." 10 | exit 11 | fi 12 | 13 | # Extract .zip into "/usr/share/gnome-shell/extensions/" directory 14 | sudo unzip -o "$zip_filename" -d /usr/share/gnome-shell/extensions/improvedosk@nick-shmyrev.dev/ 15 | 16 | # Check if "user" file exists in "/etc/dconf/profile/" directory 17 | if [ ! -f /etc/dconf/profile/user ]; then 18 | # If "user" file doesn't exist, create it 19 | sudo touch /etc/dconf/profile/user 20 | fi 21 | 22 | # Check if "user" file has line "user-db:user" 23 | if ! grep -q "^user-db:user$" /etc/dconf/profile/user; then 24 | # If "user" file doesn't have line "user-db:user", add it to file 25 | echo "user-db:user" | sudo tee -a /etc/dconf/profile/user > /dev/null 26 | fi 27 | 28 | # Check if "user" file has line "system-db:local" 29 | if ! grep -q "^system-db:local$" /etc/dconf/profile/user; then 30 | # If "user" file doesn't have line "system-db:local", add it to file 31 | echo "system-db:local" | sudo tee -a /etc/dconf/profile/user > /dev/null 32 | fi 33 | 34 | # Check if "00-extensions" file exists in "/etc/dconf/db/local.d/" directory 35 | if [ ! -f /etc/dconf/db/local.d/00-extensions ]; then 36 | # If "00-extensions" file doesn't exist, create it 37 | sudo touch /etc/dconf/db/local.d/00-extensions 38 | 39 | # Add "[org/gnome/shell]" line to the top of the file 40 | echo "[org/gnome/shell]" | sudo tee /etc/dconf/db/local.d/00-extensions > /dev/null 41 | fi 42 | 43 | # Check if enabled-extensions=[ line exists in 00-extensions file 44 | if grep -q "enabled-extensions=\[" "/etc/dconf/db/local.d/00-extensions"; then 45 | # If enabled-extensions=[ line exists, but improvedosk@nick-shmyrev.dev is not included, 46 | # add it to the line starting with enabled-extensions=[ right after enabled-extensions=[ 47 | sudo sed -i '/enabled-extensions=\[/ s/\]/, \x27improvedosk@nick-shmyrev.dev\x27\]/' /etc/dconf/db/local.d/00-extensions 48 | else 49 | # If enabled-extension=[ line does not exist, add enabled-extension=[improvedosk@nick-shmyrev.dev] to the end of the file. 50 | echo "enabled-extensions=['improvedosk@nick-shmyrev.dev']" | sudo tee --append /etc/dconf/db/local.d/00-extensions > /dev/null 51 | fi 52 | 53 | # Update dconf database with new settings 54 | sudo dconf update 55 | 56 | echo "$zip_filename installed as a system-wide extension. Please reboot to apply changes." -------------------------------------------------------------------------------- /src/prefs.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const Gio = imports.gi.Gio; 4 | const Gtk = imports.gi.Gtk; 5 | 6 | const ExtensionUtils = imports.misc.extensionUtils; 7 | const Me = ExtensionUtils.getCurrentExtension(); 8 | 9 | function init() {} 10 | 11 | function buildPrefsWidget() { 12 | const gschema = Gio.SettingsSchemaSource.new_from_directory( 13 | Me.dir.get_child("schemas").get_path(), 14 | Gio.SettingsSchemaSource.get_default(), 15 | false 16 | ); 17 | 18 | this.settings = new Gio.Settings({ 19 | settings_schema: gschema.lookup( 20 | "org.gnome.shell.extensions.improvedosk", 21 | true 22 | ), 23 | }); 24 | 25 | // https://gjs-docs.gnome.org/gtk40/gtk.widget#index-properties 26 | const prefsWidget = new Gtk.Grid({ 27 | margin_top: 24, 28 | margin_bottom: 24, 29 | margin_start: 24, 30 | margin_end: 24, 31 | column_spacing: 24, 32 | row_spacing: 12, 33 | visible: true, 34 | }); 35 | 36 | const labelPortraitHeight = new Gtk.Label({ 37 | label: "Portrait Height in Percent", 38 | halign: Gtk.Align.START, 39 | visible: true, 40 | }); 41 | prefsWidget.attach(labelPortraitHeight, 0, 0, 1, 1); 42 | 43 | let inputPortraitHeight = new Gtk.SpinButton(); 44 | inputPortraitHeight.set_range(0, 100); 45 | inputPortraitHeight.set_increments(1, 10); 46 | this.settings.bind( 47 | "portrait-height", 48 | inputPortraitHeight, 49 | "value", 50 | Gio.SettingsBindFlags.DEFAULT 51 | ); 52 | prefsWidget.attach(inputPortraitHeight, 1, 0, 1, 1); 53 | 54 | const labelLandscapeHeight = new Gtk.Label({ 55 | label: "Landscape Height in Percent", 56 | halign: Gtk.Align.START, 57 | visible: true, 58 | }); 59 | prefsWidget.attach(labelLandscapeHeight, 0, 1, 1, 1); 60 | 61 | let inputLandscapeHeight = new Gtk.SpinButton(); 62 | inputLandscapeHeight.set_range(0, 100); 63 | inputLandscapeHeight.set_increments(1, 10); 64 | this.settings.bind( 65 | "landscape-height", 66 | inputLandscapeHeight, 67 | "value", 68 | Gio.SettingsBindFlags.DEFAULT 69 | ); 70 | prefsWidget.attach(inputLandscapeHeight, 1, 1, 1, 1); 71 | 72 | const labelResizeDesktop = new Gtk.Label({ 73 | label: "Resize Desktop (Shell restart required)", 74 | halign: Gtk.Align.START, 75 | visible: true, 76 | }); 77 | prefsWidget.attach(labelResizeDesktop, 0, 2, 1, 1); 78 | 79 | let inputResizeDesktop = new Gtk.Switch({ 80 | halign: Gtk.Align.START, 81 | visible: true, 82 | }); 83 | this.settings.bind( 84 | "resize-desktop", 85 | inputResizeDesktop, 86 | "active", 87 | Gio.SettingsBindFlags.DEFAULT 88 | ); 89 | prefsWidget.attach(inputResizeDesktop, 1, 2, 1, 1); 90 | 91 | const labelIgnoreTouchInput = new Gtk.Label({ 92 | label: "Ignore touch-input", 93 | halign: Gtk.Align.START, 94 | visible: true, 95 | }); 96 | prefsWidget.attach(labelIgnoreTouchInput, 0, 3, 1, 1); 97 | 98 | let inputIgnoreTouchInput = new Gtk.Switch({ 99 | halign: Gtk.Align.START, 100 | visible: true, 101 | }); 102 | this.settings.bind( 103 | "ignore-touch-input", 104 | inputIgnoreTouchInput, 105 | "active", 106 | Gio.SettingsBindFlags.DEFAULT 107 | ); 108 | //Gray out on force-touch-input 109 | this.settings.bind( 110 | "force-touch-input", 111 | inputIgnoreTouchInput, 112 | "sensitive", 113 | Gio.SettingsBindFlags.INVERT_BOOLEAN 114 | ); 115 | prefsWidget.attach(inputIgnoreTouchInput, 1, 3, 1, 1); 116 | 117 | const labelForceTouchInput = new Gtk.Label({ 118 | label: "Force touch-input", 119 | halign: Gtk.Align.START, 120 | visible: true, 121 | }); 122 | prefsWidget.attach(labelForceTouchInput, 0, 4, 1, 1); 123 | 124 | let inputForceTouchInput = new Gtk.Switch({ 125 | halign: Gtk.Align.START, 126 | visible: true, 127 | }); 128 | this.settings.bind( 129 | "force-touch-input", 130 | inputForceTouchInput, 131 | "active", 132 | Gio.SettingsBindFlags.DEFAULT 133 | ); 134 | //Gray out on ignore-touch-input 135 | this.settings.bind( 136 | "ignore-touch-input", 137 | inputForceTouchInput, 138 | "sensitive", 139 | Gio.SettingsBindFlags.INVERT_BOOLEAN 140 | ); 141 | prefsWidget.attach(inputForceTouchInput, 1, 4, 1, 1); 142 | 143 | const labelShowStatusbarIcon = new Gtk.Label({ 144 | label: "Show statusbar icon", 145 | halign: Gtk.Align.START, 146 | visible: true, 147 | }); 148 | prefsWidget.attach(labelShowStatusbarIcon, 0, 5, 1, 1); 149 | 150 | let inputShowStatusbarIcon = new Gtk.Switch({ 151 | halign: Gtk.Align.START, 152 | visible: true, 153 | }); 154 | this.settings.bind( 155 | "show-statusbar-icon", 156 | inputShowStatusbarIcon, 157 | "active", 158 | Gio.SettingsBindFlags.DEFAULT 159 | ); 160 | prefsWidget.attach(inputShowStatusbarIcon, 1, 5, 1, 1); 161 | 162 | return prefsWidget; 163 | } 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # improved-osk-gnome-ext 2 | 3 | Makes Gnome's OnScreen Keyboard more usable. 4 | 5 | Features: 6 | * Includes additional buttons: Arrow keys, Esc, Tab, Ctrl, Alt, Super, F1-12 7 | * Supports key combinations like `Ctrl + C`, `Alt + Tab`, `Ctrl + Shift + C`, etc. 8 | * Configurable keyboard size (landscape/portrait) 9 | * Statusbar indicator to toggle keyboard 10 | * Works in Gnome password modals 11 | * Works on Lock screen (see [README](https://github.com/nick-shmyrev/improved-osk-gnome-ext/blob/master/README.md#using-improved-osk-on-gnomes-lock-screen) for instructions) 12 | * Works on Login screen (see [README](https://github.com/nick-shmyrev/improved-osk-gnome-ext/blob/master/README.md#as-a-system-wide-extension) for instructions) 13 | 14 | Currently, the following layouts have extended keys: CH+FR, CH, DE, HU, ES, FR, IT, RU, UA, US. 15 | 16 | ![Screenshot](screenshots/1.png) 17 | 18 | This extension is a fork of [SebastianLuebke/improved-osk-gnome-ext](https://github.com/SebastianLuebke/improved-osk-gnome-ext). 19 | 20 | ## Installation 21 | 22 | ### From extensions.gnome.org 23 | 24 | https://extensions.gnome.org/extension/4413/improved-osk/ 25 | 26 | ### From source code 27 | Clone the repo, change into its root directory, run `package-extension.sh`, 28 | install and enable the extension: 29 | 30 | ```console 31 | git clone https://github.com/nick-shmyrev/improved-osk-gnome-ext.git 32 | cd ./improved-osk-gnome-ext 33 | ./package-extension.sh 34 | gnome-extensions install improvedosk@nick-shmyrev.dev.shell-extension.zip 35 | gnome-extensions enable improvedosk@nick-shmyrev.dev 36 | ``` 37 | 38 | After enabling extension, log out and back in to reload Gnome Shell. 39 | 40 | ### As a system-wide extension 41 | **This is an experimental feature**, see issue [#41](https://github.com/nick-shmyrev/improved-osk-gnome-ext/issues/41) for details and bug reports! 42 | 43 | Installing as a system-wide extension allows Improved OSK to be used on Gnome's login screen, as well as within the user session. 44 | 45 | To install as a system-wide extension: 46 | 47 | 1. Remove the extension if you have it installed: 48 | ```console 49 | gnome-extensions uninstall improvedosk@nick-shmyrev.dev 50 | ``` 51 | 52 | 2. Clone this repo: 53 | ```console 54 | git clone https://github.com/nick-shmyrev/improved-osk-gnome-ext.git 55 | ``` 56 | 57 | 3. Add `session-modes` array with `"user"` and `"gdm"` values to `metadata.json` file. The result should look something like this: 58 | ```js 59 | { 60 | // rest of the metadata.json properties... 61 | "session-modes": ["user", "gdm"] 62 | } 63 | ``` 64 | 4. Run `/package-extension.sh` script to package extension 65 | 66 | 5. Then follow this [guide](https://help.gnome.org/admin/system-admin-guide/stable/extensions-enable.html.en), or use the `install-as-global-extension.sh` script. 67 | 68 | If extension is installed, but the keyboards doesn't show up on login screen, tap on accessibility options in upper right corner of the screen, and enable "Screen Keyboard". 69 | 70 | 71 | ## FAQ 72 | 73 | ### Using Improved OSK on Gnome's lock screen. 74 | This extension can also be used when screen is locked. 75 | 76 | ***Warning***: for this extension to work on lock screen, it needs `unlock-dialog` session mode to be enabled, 77 | however Gnome Shell Extension [review guidelines](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#session-modes) 78 | do not allow extensions to connect to keyboard signals in `unlock-dialog` session mode. 79 | For this reason, this extension is shipped with `unlock-dialog` session mode disabled by default. 80 | Enable it at your own risk. 81 | 82 | If you still want to enable it, simply add `session-modes` array with `"user"` and `"unlock-dialog"` values to `metadata.json` file. The result should look something like this: 83 | ```js 84 | { 85 | // rest of the metadata.json properties... 86 | "session-modes": ["user", "unlock-dialog"] 87 | } 88 | ``` 89 | If you're already using `"gdm"` session mode, keep it and the `"user"` mode in the `"session-modes"` array and just add `"unlock-dialog"` as the third value. 90 | 91 | ### My language layout doesn't have the additional keys. 92 | If the layout you're using does not have the extended keys, let me know, and I'll add them. 93 | Or, feel free to modify it yourself (see [/src/data/osk-layouts](https://github.com/nick-shmyrev/improved-osk-gnome-ext/tree/master/src/data/osk-layouts) dir) and make a PR. 94 | 95 | ### How do I make a custom layout? 96 | You'll need to follow the manual installation process from [README](https://github.com/nick-shmyrev/improved-osk-gnome-ext/blob/master/README.md#from-source-code), 97 | but before running `package-extension.sh` you'll have to make changes to your preferred layout 98 | (see [osk-layouts](https://github.com/nick-shmyrev/improved-osk-gnome-ext/tree/master/src/data/osk-layouts)), then continue with the installation process. 99 | 100 | ### I want to test this extension with a new version of Gnome. 101 | To install the extension on an unsupported Gnome version, you can either add desired version number to `metadata.json` file and proceed with a manual installation, 102 | or disable extension version check and then install from [extensions.gnome.org](https://extensions.gnome.org/extension/4413/improved-osk/): 103 | 104 | ```console 105 | gsettings set org.gnome.shell disable-extension-version-validation true 106 | ``` 107 | 108 | See [TEST_CASES](https://github.com/nick-shmyrev/improved-osk-gnome-ext/blob/master/TEST_CASES.md) for test cases. 109 | 110 | ### Do I need to enable the OSK in Gnome accessibility settings? 111 | By default, the keyboard will pop up on touch input events. 112 | You can use "Force touch-input" option in extension preferences 113 | to force the OSK to appear on non-touch events. 114 | 115 | ### Extension is installed and activated, but keyboard layout doesn't change. 116 | Gnome's default on-screen keyboard, on which this extension is based on, 117 | uses `ibus` package, make sure you have it installed. 118 | 119 | ### Some symbols are missing... 120 | The keyboard uses unicode characters, try installing `ttf-symbola` on archlinux (AUR) 121 | or `ttf-ancient-fonts-symbola` on ubuntu/debian 122 | 123 | ## Alternatives 124 | ### [GJS OSK](https://extensions.gnome.org/extension/5949/gjs-osk/) 125 | Full-size Onscreen Keyboard than can be dragged around the screen. -------------------------------------------------------------------------------- /src/extension.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Gio, GLib, St, Clutter, GObject } = imports.gi; 3 | const Main = imports.ui.main; 4 | const Keyboard = imports.ui.keyboard; 5 | const Key = Keyboard.Key; 6 | const PanelMenu = imports.ui.panelMenu; 7 | const ExtensionUtils = imports.misc.extensionUtils; 8 | const Me = ExtensionUtils.getCurrentExtension(); 9 | 10 | const A11Y_APPLICATIONS_SCHEMA = "org.gnome.desktop.a11y.applications"; 11 | const KEY_RELEASE_TIMEOUT = 100; 12 | 13 | let _oskA11yApplicationsSettings; 14 | let backup_lastDeviceIsTouchScreen; 15 | let backup_relayout; 16 | let backup_addRowKeys; 17 | let backup_commitAction; 18 | let backup_toggleDelete; 19 | let backup_toggleModifier; 20 | let backup_setActiveLayer; 21 | let backup_touchMode; 22 | let backup_getCurrentGroup; 23 | let currentSeat; 24 | let _indicator; 25 | let settings; 26 | let keyReleaseTimeoutId; 27 | 28 | function isInUnlockDialogMode() { 29 | return Main.sessionMode.currentMode === 'unlock-dialog'; 30 | } 31 | 32 | // Indicator 33 | let OSKIndicator = GObject.registerClass( 34 | { GTypeName: "OSKIndicator" }, 35 | class OSKIndicator extends PanelMenu.Button { 36 | _init() { 37 | super._init(0.0, `${Me.metadata.name} Indicator`, false); 38 | 39 | let icon = new St.Icon({ 40 | icon_name: "input-keyboard-symbolic", 41 | style_class: "system-status-icon", 42 | }); 43 | 44 | this.add_child(icon); 45 | 46 | this.connect("button-press-event", function (_actor, event) { 47 | let button = event.get_button(); 48 | 49 | if (button == 1) { 50 | toggleOSK(); 51 | } 52 | 53 | // Don't open extension prefs if in unlock-dialog session mode 54 | if (button == 3 && !isInUnlockDialogMode()) { 55 | ExtensionUtils.openPrefs(); 56 | } 57 | }); 58 | 59 | this.connect("touch-event", function () { 60 | toggleOSK(); 61 | }); 62 | } 63 | } 64 | ); 65 | 66 | function toggleOSK() { 67 | if (Main.keyboard._keyboard._keyboardVisible) return Main.keyboard.close(); 68 | 69 | Main.keyboard.open(Main.layoutManager.bottomIndex); 70 | } 71 | 72 | // Overrides 73 | function override_lastDeviceIsTouchScreen() { 74 | if (!this._lastDevice) return false; 75 | 76 | let deviceType = this._lastDevice.get_device_type(); 77 | 78 | return settings.get_boolean("ignore-touch-input") 79 | ? false 80 | : deviceType == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE; 81 | } 82 | 83 | function override_relayout() { 84 | let monitor = Main.layoutManager.keyboardMonitor; 85 | 86 | if (!monitor) return; 87 | 88 | this.width = monitor.width; 89 | 90 | if (monitor.width > monitor.height) { 91 | this.height = (monitor.height * settings.get_int("landscape-height")) / 100; 92 | } else { 93 | this.height = (monitor.height * settings.get_int("portrait-height")) / 100; 94 | } 95 | } 96 | 97 | function override_addRowKeys(keys, layout) { 98 | for (let i = 0; i < keys.length; ++i) { 99 | const key = keys[i]; 100 | const {strings} = key; 101 | const commitString = strings?.shift(); 102 | 103 | let button = new Key({ 104 | commitString, 105 | label: key.label, 106 | iconName: key.iconName, 107 | keyval: key.keyval, 108 | }, strings); 109 | 110 | if (key.width !== null) 111 | button.setWidth(key.width); 112 | 113 | if (key.action !== 'modifier') { 114 | button.connect('commit', (_actor, keyval, str) => { 115 | this._commitAction(keyval, str); 116 | }); 117 | } 118 | 119 | if (key.action !== null) { 120 | button.connect('released', () => { 121 | if (key.action === 'hide') { 122 | this.close(); 123 | } else if (key.action === 'languageMenu') { 124 | this._popupLanguageMenu(button); 125 | } else if (key.action === 'emoji') { 126 | this._toggleEmoji(); 127 | } else if (key.action === 'modifier') { 128 | // Pass the whole key object to allow switching layers on "Shift" press 129 | this._toggleModifier(key); 130 | 131 | } else if (key.action === 'delete') { 132 | this._toggleDelete(true); 133 | this._toggleDelete(false); 134 | } else if (!this._longPressed && key.action === 'levelSwitch') { 135 | this._setActiveLayer(key.level); 136 | 137 | // Ensure numbers layer latches 138 | const isNumbersLayer = key.level === 2; 139 | this._setLatched(isNumbersLayer); 140 | } 141 | 142 | this._longPressed = false; 143 | }); 144 | } 145 | 146 | if (key.iconName === 'keyboard-shift-symbolic') layout.shiftKeys.push(button); 147 | 148 | if (key.action === 'delete') { 149 | button.connect('long-press', 150 | () => this._toggleDelete(true)); 151 | } 152 | 153 | if (key.action === 'modifier') { 154 | let modifierKeys = this._modifierKeys[key.keyval] || []; 155 | modifierKeys.push(button); 156 | this._modifierKeys[key.keyval] = modifierKeys; 157 | } 158 | 159 | if (key.action || key.keyval) 160 | button.keyButton.add_style_class_name('default-key'); 161 | 162 | layout.appendKey(button, button.keyButton.keyWidth); 163 | } 164 | } 165 | 166 | async function override_commitAction(keyval, str) { 167 | if (this._modifiers.size === 0 && str !== '' && 168 | keyval && this._oskCompletionEnabled) { 169 | if (await Main.inputMethod.handleVirtualKey(keyval)) 170 | return; 171 | } 172 | 173 | if (str === '' || !Main.inputMethod.currentFocus || 174 | (keyval && this._oskCompletionEnabled) || 175 | this._modifiers.size > 0 || 176 | !this._keyboardController.commitString(str, true)) { 177 | if (keyval !== 0) { 178 | // If sending a key combination with a string char, use lowercase key value, 179 | // otherwise extension can't reliably input "Shift + [key]" combinations 180 | // See https://github.com/nick-shmyrev/improved-osk-gnome-ext/issues/38#issuecomment-1466599579 181 | const keyvalToPress = str === '' ? keyval : Key.prototype._getKeyvalFromString(str.toLowerCase()); 182 | 183 | this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_PRESS); 184 | this._keyboardController.keyvalPress(keyvalToPress); 185 | keyReleaseTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, KEY_RELEASE_TIMEOUT, () => { 186 | this._keyboardController.keyvalRelease(keyvalToPress); 187 | this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_RELEASE); 188 | this._disableAllModifiers(); 189 | return GLib.SOURCE_REMOVE; 190 | }); 191 | } 192 | } 193 | 194 | if (!this._latched) 195 | this._setActiveLayer(0); 196 | } 197 | 198 | function override_toggleDelete(enabled) { 199 | if (this._deleteEnabled === enabled) return; 200 | 201 | this._deleteEnabled = enabled; 202 | 203 | if (enabled) { 204 | this._keyboardController.keyvalPress(Clutter.KEY_BackSpace); 205 | } else { 206 | this._keyboardController.keyvalRelease(Clutter.KEY_BackSpace); 207 | } 208 | } 209 | 210 | function override_toggleModifier(key) { 211 | const { keyval, level } = key; 212 | const SHIFT_KEYVAL = '0xffe1'; 213 | const isActive = this._modifiers.has(keyval); 214 | 215 | if (keyval === SHIFT_KEYVAL) this._setActiveLayer(level); 216 | 217 | this._setModifierEnabled(keyval, !isActive); 218 | } 219 | 220 | function override_setActiveLayer(activeLevel) { 221 | let activeGroupName = this._keyboardController.getCurrentGroup(); 222 | let layers = this._groups[activeGroupName]; 223 | let currentPage = layers[activeLevel]; 224 | 225 | if (this._currentPage == currentPage) { 226 | this._updateCurrentPageVisible(); 227 | return; 228 | } 229 | 230 | if (this._currentPage != null) { 231 | this._setCurrentLevelLatched(this._currentPage, false); 232 | this._currentPage.disconnect(this._currentPage._destroyID); 233 | this._currentPage.hide(); 234 | delete this._currentPage._destroyID; 235 | } 236 | // === Override starts here === 237 | 238 | // Don't unlatch modifiers if switching to lower or upper case layer 239 | if (activeLevel > 1) this._disableAllModifiers(); 240 | 241 | // === Override ends here === 242 | this._currentPage = currentPage; 243 | this._currentPage._destroyID = this._currentPage.connect('destroy', () => { 244 | this._currentPage = null; 245 | }); 246 | this._updateCurrentPageVisible(); 247 | this._aspectContainer.setRatio(...this._currentPage.getRatio()); 248 | this._emojiSelection.setRatio(...this._currentPage.getRatio()); 249 | } 250 | 251 | function override_getCurrentGroup() { 252 | // Special case for Korean, if Hangul mode is disabled, use the 'us' keymap 253 | if (this._currentSource.id === 'hangul') { 254 | const inputSourceManager = InputSourceManager.getInputSourceManager(); 255 | const currentSource = inputSourceManager.currentSource; 256 | let prop; 257 | for (let i = 0; (prop = currentSource.properties.get(i)) !== null; ++i) { 258 | if (prop.get_key() === 'InputMode' && 259 | prop.get_prop_type() === IBus.PropType.TOGGLE && 260 | prop.get_state() !== IBus.PropState.CHECKED) 261 | return 'us'; 262 | } 263 | } 264 | return this._currentSource.xkbId; 265 | } 266 | 267 | function enable_overrides() { 268 | Keyboard.Keyboard.prototype["_relayout"] = override_relayout; 269 | Keyboard.Keyboard.prototype["_toggleModifier"] = override_toggleModifier; 270 | Keyboard.Keyboard.prototype["_setActiveLayer"] = override_setActiveLayer; 271 | Keyboard.Keyboard.prototype["_addRowKeys"] = override_addRowKeys; 272 | Keyboard.Keyboard.prototype["_commitAction"] = override_commitAction; 273 | Keyboard.Keyboard.prototype["_toggleDelete"] = override_toggleDelete; 274 | 275 | Keyboard.KeyboardManager.prototype["_lastDeviceIsTouchscreen"] = 276 | override_lastDeviceIsTouchScreen; 277 | 278 | Keyboard.KeyboardController.prototype["getCurrentGroup"] = 279 | override_getCurrentGroup; 280 | 281 | // Unregister original osk layouts resource file 282 | getDefaultLayouts()._unregister(); 283 | 284 | // Register modified osk layouts resource file 285 | getModifiedLayouts()._register(); 286 | } 287 | 288 | function disable_overrides() { 289 | Keyboard.Keyboard.prototype["_relayout"] = backup_relayout; 290 | Keyboard.Keyboard.prototype["_toggleModifier"] = backup_toggleModifier; 291 | Keyboard.Keyboard.prototype["_setActiveLayer"] = backup_setActiveLayer; 292 | Keyboard.Keyboard.prototype["_addRowKeys"] = backup_addRowKeys; 293 | Keyboard.Keyboard.prototype["_commitAction"] = backup_commitAction; 294 | Keyboard.Keyboard.prototype["_toggleDelete"] = backup_toggleDelete; 295 | 296 | Keyboard.KeyboardManager.prototype["_lastDeviceIsTouchscreen"] = 297 | backup_lastDeviceIsTouchScreen; 298 | 299 | Keyboard.KeyboardController.prototype["getCurrentGroup"] = 300 | backup_getCurrentGroup; 301 | 302 | // Unregister modified osk layouts resource file 303 | getModifiedLayouts()._unregister(); 304 | 305 | // Register original osk layouts resource file 306 | getDefaultLayouts()._register(); 307 | } 308 | 309 | function getModifiedLayouts() { 310 | const modifiedLayoutsPath = Me.dir 311 | .get_child("data") 312 | .get_child("gnome-shell-osk-layouts.gresource") 313 | .get_path(); 314 | return Gio.Resource.load(modifiedLayoutsPath); 315 | } 316 | 317 | function getDefaultLayouts() { 318 | return Gio.Resource.load( 319 | (GLib.getenv("JHBUILD_PREFIX") || "/usr") + 320 | "/share/gnome-shell/gnome-shell-osk-layouts.gresource" 321 | ); 322 | } 323 | 324 | // In case the keyboard is currently disabled in accessibility settings, attempting to _destroyKeyboard() yields a TypeError ("TypeError: this.actor is null") 325 | // This function proofs this condition, which would be used in the parent function to determine whether to run _setupKeyboard 326 | function tryDestroyKeyboard() { 327 | try { 328 | Main.keyboard._destroyKeyboard(); 329 | } catch (e) { 330 | if (e instanceof TypeError) { 331 | return false; 332 | } else { 333 | // Something different happened 334 | throw e; 335 | } 336 | } 337 | return true; 338 | } 339 | 340 | // Extension 341 | function init() { 342 | backup_relayout = Keyboard.Keyboard.prototype["_relayout"]; 343 | backup_toggleModifier = Keyboard.Keyboard.prototype["_toggleModifier"]; 344 | backup_setActiveLayer = Keyboard.Keyboard.prototype["_setActiveLayer"]; 345 | backup_addRowKeys = Keyboard.Keyboard.prototype["_addRowKeys"]; 346 | backup_commitAction = Keyboard.Keyboard.prototype["_commitAction"]; 347 | backup_toggleDelete = Keyboard.Keyboard.prototype["_toggleDelete"]; 348 | 349 | backup_lastDeviceIsTouchScreen = 350 | Keyboard.KeyboardManager._lastDeviceIsTouchscreen; 351 | 352 | backup_getCurrentGroup = 353 | Keyboard.KeyboardController.prototype["getCurrentGroup"]; 354 | 355 | currentSeat = Clutter.get_default_backend().get_default_seat(); 356 | backup_touchMode = currentSeat.get_touch_mode; 357 | } 358 | 359 | function enable() { 360 | settings = ExtensionUtils.getSettings( 361 | "org.gnome.shell.extensions.improvedosk" 362 | ); 363 | _oskA11yApplicationsSettings = new Gio.Settings({ 364 | schema_id: A11Y_APPLICATIONS_SCHEMA, 365 | }); 366 | 367 | Main.layoutManager.removeChrome(Main.layoutManager.keyboardBox); 368 | 369 | // Set up the indicator in the status area 370 | if (settings.get_boolean("show-statusbar-icon")) { 371 | _indicator = new OSKIndicator(); 372 | Main.panel.addToStatusArea("OSKIndicator", _indicator); 373 | } 374 | 375 | if (settings.get_boolean("force-touch-input")) { 376 | currentSeat.get_touch_mode = () => true; 377 | } 378 | 379 | let KeyboardIsSetup = tryDestroyKeyboard(); 380 | 381 | enable_overrides(); 382 | 383 | settings.connect("changed::show-statusbar-icon", function () { 384 | if (settings.get_boolean("show-statusbar-icon")) { 385 | _indicator = new OSKIndicator(); 386 | Main.panel.addToStatusArea("OSKIndicator", _indicator); 387 | } else if (_indicator !== null) { 388 | _indicator.destroy(); 389 | _indicator = null; 390 | } 391 | }); 392 | 393 | settings.connect("changed::force-touch-input", function () { 394 | if (settings.get_boolean("force-touch-input")) { 395 | currentSeat.get_touch_mode = () => true; 396 | } else { 397 | currentSeat.get_touch_mode = backup_touchMode; 398 | } 399 | }); 400 | 401 | if (KeyboardIsSetup) { 402 | Main.keyboard._setupKeyboard(); 403 | } 404 | 405 | Main.layoutManager.addTopChrome(Main.layoutManager.keyboardBox, { 406 | affectsStruts: settings.get_boolean("resize-desktop"), 407 | trackFullscreen: false, 408 | }); 409 | } 410 | 411 | function disable() { 412 | Main.layoutManager.removeChrome(Main.layoutManager.keyboardBox); 413 | 414 | currentSeat.get_touch_mode = backup_touchMode; 415 | 416 | let KeyboardIsSetup = tryDestroyKeyboard(); 417 | 418 | // Remove indicator if it exists 419 | if (_indicator instanceof OSKIndicator) { 420 | _indicator.destroy(); 421 | _indicator = null; 422 | } 423 | 424 | settings = null; 425 | 426 | if (keyReleaseTimeoutId) { 427 | GLib.Source.remove(keyReleaseTimeoutId); 428 | keyReleaseTimeoutId = null; 429 | } 430 | 431 | disable_overrides(); 432 | 433 | if (KeyboardIsSetup) { 434 | Main.keyboard._setupKeyboard(); 435 | } 436 | Main.layoutManager.addTopChrome(Main.layoutManager.keyboardBox); 437 | } 438 | -------------------------------------------------------------------------------- /src/data/osk-layouts/ge.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "ქ" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "წ" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "ე", 21 | "ჱ" 22 | ] 23 | }, 24 | { 25 | "strings": [ 26 | "რ" 27 | ] 28 | }, 29 | { 30 | "strings": [ 31 | "ტ" 32 | ] 33 | }, 34 | { 35 | "strings": [ 36 | "ყ", 37 | "ჸ" 38 | ] 39 | }, 40 | { 41 | "strings": [ 42 | "უ" 43 | ] 44 | }, 45 | { 46 | "strings": [ 47 | "ი", 48 | "ჲ" 49 | ] 50 | }, 51 | { 52 | "strings": [ 53 | "ო" 54 | ] 55 | }, 56 | { 57 | "strings": [ 58 | "პ" 59 | ] 60 | }, 61 | { 62 | "action": "delete", 63 | "iconName": "edit-clear-symbolic", 64 | "width": 1.5 65 | } 66 | ], 67 | [ 68 | { 69 | "strings": [ 70 | "ა", 71 | "ჺ" 72 | ] 73 | }, 74 | { 75 | "strings": [ 76 | "ს" 77 | ] 78 | }, 79 | { 80 | "strings": [ 81 | "დ" 82 | ] 83 | }, 84 | { 85 | "strings": [ 86 | "ფ", 87 | "ჶ" 88 | ] 89 | }, 90 | { 91 | "strings": [ 92 | "გ", 93 | "ჹ" 94 | ] 95 | }, 96 | { 97 | "strings": [ 98 | "ჰ", 99 | "ჵ" 100 | ] 101 | }, 102 | { 103 | "strings": [ 104 | "ჯ", 105 | "ჷ" 106 | ] 107 | }, 108 | { 109 | "strings": [ 110 | "კ" 111 | ] 112 | }, 113 | { 114 | "strings": [ 115 | "ლ" 116 | ] 117 | }, 118 | { 119 | "iconName": "keyboard-enter-symbolic", 120 | "keyval": "0xff0d", 121 | "width": 2.5 122 | } 123 | ], 124 | [ 125 | { 126 | "strings": [ 127 | "ზ" 128 | ] 129 | }, 130 | { 131 | "strings": [ 132 | "ხ", 133 | "ჴ" 134 | ] 135 | }, 136 | { 137 | "strings": [ 138 | "ც" 139 | ] 140 | }, 141 | { 142 | "strings": [ 143 | "ვ", 144 | "ჳ" 145 | ] 146 | }, 147 | { 148 | "strings": [ 149 | "ბ" 150 | ] 151 | }, 152 | { 153 | "strings": [ 154 | "ნ", 155 | "ჼ" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "მ" 161 | ] 162 | }, 163 | { 164 | "strings": [ 165 | "," 166 | ] 167 | }, 168 | { 169 | "strings": [ 170 | ".", 171 | "#", 172 | "!", 173 | ",", 174 | "?", 175 | "-", 176 | ":", 177 | "'", 178 | "@" 179 | ] 180 | } 181 | ], 182 | [ 183 | { 184 | "action": "levelSwitch", 185 | "label": "?123", 186 | "level": 2, 187 | "width": 1.5 188 | }, 189 | { 190 | "action": "emoji", 191 | "iconName": "face-smile-symbolic", 192 | "width": 1.5 193 | }, 194 | { 195 | "strings": [ 196 | " " 197 | ], 198 | "width": 5 199 | }, 200 | { 201 | "action": "languageMenu", 202 | "iconName": "keyboard-layout-symbolic", 203 | "width": 1.5 204 | }, 205 | { 206 | "action": "hide", 207 | "iconName": "keyboard-hide-symbolic", 208 | "width": 2 209 | } 210 | ] 211 | ] 212 | }, 213 | { 214 | "level": "opt", 215 | "mode": "locked", 216 | "rows": [ 217 | [ 218 | { 219 | "strings": [ 220 | "1", 221 | "¹", 222 | "½", 223 | "⅓", 224 | "¼", 225 | "⅛" 226 | ] 227 | }, 228 | { 229 | "strings": [ 230 | "2", 231 | "²", 232 | "⅔" 233 | ] 234 | }, 235 | { 236 | "strings": [ 237 | "3", 238 | "³", 239 | "¾", 240 | "⅜" 241 | ] 242 | }, 243 | { 244 | "strings": [ 245 | "4", 246 | "⁴" 247 | ] 248 | }, 249 | { 250 | "strings": [ 251 | "5", 252 | "⅝" 253 | ] 254 | }, 255 | { 256 | "strings": [ 257 | "6" 258 | ] 259 | }, 260 | { 261 | "strings": [ 262 | "7", 263 | "⅞" 264 | ] 265 | }, 266 | { 267 | "strings": [ 268 | "8" 269 | ] 270 | }, 271 | { 272 | "strings": [ 273 | "9" 274 | ] 275 | }, 276 | { 277 | "strings": [ 278 | "0", 279 | "ⁿ", 280 | "∅" 281 | ] 282 | }, 283 | { 284 | "action": "delete", 285 | "iconName": "edit-clear-symbolic", 286 | "width": 1.5 287 | } 288 | ], 289 | [ 290 | { 291 | "strings": [ 292 | "@" 293 | ] 294 | }, 295 | { 296 | "strings": [ 297 | "#" 298 | ] 299 | }, 300 | { 301 | "strings": [ 302 | "$", 303 | "¢", 304 | "£", 305 | "€", 306 | "¥", 307 | "₱" 308 | ] 309 | }, 310 | { 311 | "strings": [ 312 | "%", 313 | "‰" 314 | ] 315 | }, 316 | { 317 | "strings": [ 318 | "&" 319 | ] 320 | }, 321 | { 322 | "strings": [ 323 | "-", 324 | "_", 325 | "–", 326 | "—", 327 | "·" 328 | ] 329 | }, 330 | { 331 | "strings": [ 332 | "+", 333 | "±" 334 | ] 335 | }, 336 | { 337 | "strings": [ 338 | "(", 339 | "<", 340 | "{", 341 | "[" 342 | ] 343 | }, 344 | { 345 | "strings": [ 346 | ")", 347 | ">", 348 | "}", 349 | "]" 350 | ] 351 | }, 352 | { 353 | "iconName": "keyboard-enter-symbolic", 354 | "keyval": "0xff0d", 355 | "width": 2 356 | } 357 | ], 358 | [ 359 | { 360 | "action": "levelSwitch", 361 | "label": "=/<", 362 | "level": 3, 363 | "width": 1.5 364 | }, 365 | { 366 | "strings": [ 367 | "*", 368 | "†", 369 | "‡", 370 | "★" 371 | ] 372 | }, 373 | { 374 | "strings": [ 375 | "\"", 376 | "“", 377 | "”", 378 | "«", 379 | "»" 380 | ] 381 | }, 382 | { 383 | "strings": [ 384 | "'", 385 | "‘", 386 | "’", 387 | "‹", 388 | "›" 389 | ] 390 | }, 391 | { 392 | "strings": [ 393 | ":" 394 | ] 395 | }, 396 | { 397 | "strings": [ 398 | ";" 399 | ] 400 | }, 401 | { 402 | "strings": [ 403 | "!", 404 | "¡" 405 | ] 406 | }, 407 | { 408 | "strings": [ 409 | "?", 410 | "¿" 411 | ] 412 | }, 413 | { 414 | "action": "levelSwitch", 415 | "label": "=/<", 416 | "level": 3, 417 | "width": 3 418 | } 419 | ], 420 | [ 421 | { 422 | "action": "levelSwitch", 423 | "label": "ABC", 424 | "level": 0, 425 | "width": 1.5 426 | }, 427 | { 428 | "strings": [ 429 | "_" 430 | ] 431 | }, 432 | { 433 | "strings": [ 434 | "/" 435 | ] 436 | }, 437 | { 438 | "strings": [ 439 | " " 440 | ], 441 | "width": 3 442 | }, 443 | { 444 | "strings": [ 445 | "," 446 | ] 447 | }, 448 | { 449 | "strings": [ 450 | ".", 451 | "…" 452 | ] 453 | }, 454 | { 455 | "action": "emoji", 456 | "iconName": "face-smile-symbolic" 457 | }, 458 | { 459 | "action": "languageMenu", 460 | "iconName": "keyboard-layout-symbolic" 461 | }, 462 | { 463 | "action": "hide", 464 | "iconName": "keyboard-hide-symbolic" 465 | } 466 | ] 467 | ] 468 | }, 469 | { 470 | "level": "opt+shift", 471 | "mode": "locked", 472 | "rows": [ 473 | [ 474 | { 475 | "strings": [ 476 | "~" 477 | ] 478 | }, 479 | { 480 | "strings": [ 481 | "`" 482 | ] 483 | }, 484 | { 485 | "strings": [ 486 | "|" 487 | ] 488 | }, 489 | { 490 | "strings": [ 491 | "•", 492 | "♪", 493 | "♥", 494 | "♠", 495 | "♦", 496 | "♣" 497 | ] 498 | }, 499 | { 500 | "strings": [ 501 | "√" 502 | ] 503 | }, 504 | { 505 | "strings": [ 506 | "Π", 507 | "π" 508 | ] 509 | }, 510 | { 511 | "strings": [ 512 | "÷" 513 | ] 514 | }, 515 | { 516 | "strings": [ 517 | "×" 518 | ] 519 | }, 520 | { 521 | "strings": [ 522 | "¶", 523 | "§" 524 | ] 525 | }, 526 | { 527 | "strings": [ 528 | "∆" 529 | ] 530 | }, 531 | { 532 | "action": "delete", 533 | "iconName": "edit-clear-symbolic", 534 | "width": 1.5 535 | } 536 | ], 537 | [ 538 | { 539 | "strings": [ 540 | "£" 541 | ] 542 | }, 543 | { 544 | "strings": [ 545 | "¢" 546 | ] 547 | }, 548 | { 549 | "strings": [ 550 | "€" 551 | ] 552 | }, 553 | { 554 | "strings": [ 555 | "¥" 556 | ] 557 | }, 558 | { 559 | "strings": [ 560 | "^", 561 | "↑", 562 | "↓", 563 | "←", 564 | "→" 565 | ] 566 | }, 567 | { 568 | "strings": [ 569 | "°", 570 | "′", 571 | "″" 572 | ] 573 | }, 574 | { 575 | "strings": [ 576 | "=", 577 | "≠", 578 | "≈", 579 | "∞" 580 | ] 581 | }, 582 | { 583 | "strings": [ 584 | "{" 585 | ] 586 | }, 587 | { 588 | "strings": [ 589 | "}" 590 | ] 591 | }, 592 | { 593 | "iconName": "keyboard-enter-symbolic", 594 | "keyval": "0xff0d", 595 | "width": 2 596 | } 597 | ], 598 | [ 599 | { 600 | "action": "levelSwitch", 601 | "label": "?123", 602 | "level": 2, 603 | "width": 1.5 604 | }, 605 | { 606 | "strings": [ 607 | "\\" 608 | ] 609 | }, 610 | { 611 | "strings": [ 612 | "©" 613 | ] 614 | }, 615 | { 616 | "strings": [ 617 | "®" 618 | ] 619 | }, 620 | { 621 | "strings": [ 622 | "™" 623 | ] 624 | }, 625 | { 626 | "strings": [ 627 | "℅" 628 | ] 629 | }, 630 | { 631 | "strings": [ 632 | "[" 633 | ] 634 | }, 635 | { 636 | "strings": [ 637 | "]" 638 | ] 639 | }, 640 | { 641 | "action": "levelSwitch", 642 | "label": "?123", 643 | "level": 2, 644 | "width": 3 645 | } 646 | ], 647 | [ 648 | { 649 | "action": "levelSwitch", 650 | "label": "ABC", 651 | "level": 0, 652 | "width": 1.5 653 | }, 654 | { 655 | "strings": [ 656 | "<", 657 | "‹", 658 | "≤", 659 | "«" 660 | ] 661 | }, 662 | { 663 | "strings": [ 664 | ">", 665 | "›", 666 | "≥", 667 | "»" 668 | ] 669 | }, 670 | { 671 | "strings": [ 672 | " " 673 | ], 674 | "width": 3 675 | }, 676 | { 677 | "strings": [ 678 | "," 679 | ] 680 | }, 681 | { 682 | "strings": [ 683 | ".", 684 | "…" 685 | ] 686 | }, 687 | { 688 | "action": "emoji", 689 | "iconName": "face-smile-symbolic" 690 | }, 691 | { 692 | "action": "languageMenu", 693 | "iconName": "keyboard-layout-symbolic" 694 | }, 695 | { 696 | "action": "hide", 697 | "iconName": "keyboard-hide-symbolic" 698 | } 699 | ] 700 | ] 701 | } 702 | ], 703 | "locale": "ka", 704 | "name": "Georgian" 705 | } 706 | -------------------------------------------------------------------------------- /src/data/osk-layouts/il.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "'", 11 | "\"" 12 | ] 13 | }, 14 | { 15 | "strings": [ 16 | "-", 17 | "_" 18 | ] 19 | }, 20 | { 21 | "strings": [ 22 | "ק" 23 | ] 24 | }, 25 | { 26 | "strings": [ 27 | "ר" 28 | ] 29 | }, 30 | { 31 | "strings": [ 32 | "א" 33 | ] 34 | }, 35 | { 36 | "strings": [ 37 | "ט" 38 | ] 39 | }, 40 | { 41 | "strings": [ 42 | "ו" 43 | ] 44 | }, 45 | { 46 | "strings": [ 47 | "ן" 48 | ] 49 | }, 50 | { 51 | "strings": [ 52 | "ם" 53 | ] 54 | }, 55 | { 56 | "strings": [ 57 | "פ" 58 | ] 59 | }, 60 | { 61 | "action": "delete", 62 | "iconName": "edit-clear-symbolic", 63 | "width": 1.5 64 | } 65 | ], 66 | [ 67 | { 68 | "strings": [ 69 | "ש" 70 | ] 71 | }, 72 | { 73 | "strings": [ 74 | "ד" 75 | ] 76 | }, 77 | { 78 | "strings": [ 79 | "ג", 80 | "ג׳" 81 | ] 82 | }, 83 | { 84 | "strings": [ 85 | "כ" 86 | ] 87 | }, 88 | { 89 | "strings": [ 90 | "ע" 91 | ] 92 | }, 93 | { 94 | "strings": [ 95 | "י", 96 | "ײַ" 97 | ] 98 | }, 99 | { 100 | "strings": [ 101 | "ח", 102 | "ח׳" 103 | ] 104 | }, 105 | { 106 | "strings": [ 107 | "ל" 108 | ] 109 | }, 110 | { 111 | "strings": [ 112 | "ך" 113 | ] 114 | }, 115 | { 116 | "strings": [ 117 | "ף" 118 | ] 119 | }, 120 | { 121 | "iconName": "keyboard-enter-symbolic", 122 | "keyval": "0xff0d", 123 | "width": 1.5 124 | } 125 | ], 126 | [ 127 | { 128 | "strings": [ 129 | "ז", 130 | "ז׳" 131 | ] 132 | }, 133 | { 134 | "strings": [ 135 | "ס" 136 | ] 137 | }, 138 | { 139 | "strings": [ 140 | "ב" 141 | ] 142 | }, 143 | { 144 | "strings": [ 145 | "ה" 146 | ] 147 | }, 148 | { 149 | "strings": [ 150 | "נ" 151 | ] 152 | }, 153 | { 154 | "strings": [ 155 | "מ" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "צ", 161 | "צ׳" 162 | ] 163 | }, 164 | { 165 | "strings": [ 166 | "ת", 167 | "ת׳" 168 | ] 169 | }, 170 | { 171 | "strings": [ 172 | "ץ", 173 | "ץ׳" 174 | ] 175 | } 176 | ], 177 | [ 178 | { 179 | "action": "levelSwitch", 180 | "label": "?123", 181 | "level": 2, 182 | "width": 1.5 183 | }, 184 | { 185 | "strings": [ 186 | "," 187 | ] 188 | }, 189 | { 190 | "strings": [ 191 | " " 192 | ], 193 | "width": 5 194 | }, 195 | { 196 | "strings": [ 197 | ".", 198 | "#", 199 | "!", 200 | ",", 201 | "?", 202 | "-", 203 | ":", 204 | "'", 205 | "@" 206 | ] 207 | }, 208 | { 209 | "action": "emoji", 210 | "iconName": "face-smile-symbolic" 211 | }, 212 | { 213 | "action": "languageMenu", 214 | "iconName": "keyboard-layout-symbolic" 215 | }, 216 | { 217 | "action": "hide", 218 | "iconName": "keyboard-hide-symbolic" 219 | } 220 | ] 221 | ] 222 | }, 223 | { 224 | "level": "opt", 225 | "mode": "locked", 226 | "rows": [ 227 | [ 228 | { 229 | "strings": [ 230 | "1", 231 | "¹", 232 | "½", 233 | "⅓", 234 | "¼", 235 | "⅛" 236 | ] 237 | }, 238 | { 239 | "strings": [ 240 | "2", 241 | "²", 242 | "⅔" 243 | ] 244 | }, 245 | { 246 | "strings": [ 247 | "3", 248 | "³", 249 | "¾", 250 | "⅜" 251 | ] 252 | }, 253 | { 254 | "strings": [ 255 | "4", 256 | "⁴" 257 | ] 258 | }, 259 | { 260 | "strings": [ 261 | "5", 262 | "⅝" 263 | ] 264 | }, 265 | { 266 | "strings": [ 267 | "6" 268 | ] 269 | }, 270 | { 271 | "strings": [ 272 | "7", 273 | "⅞" 274 | ] 275 | }, 276 | { 277 | "strings": [ 278 | "8" 279 | ] 280 | }, 281 | { 282 | "strings": [ 283 | "9" 284 | ] 285 | }, 286 | { 287 | "strings": [ 288 | "0", 289 | "ⁿ", 290 | "∅" 291 | ] 292 | }, 293 | { 294 | "action": "delete", 295 | "iconName": "edit-clear-symbolic", 296 | "width": 1.5 297 | } 298 | ], 299 | [ 300 | { 301 | "strings": [ 302 | "@" 303 | ] 304 | }, 305 | { 306 | "strings": [ 307 | "#" 308 | ] 309 | }, 310 | { 311 | "strings": [ 312 | "₪", 313 | "$", 314 | "¢", 315 | "€", 316 | "£", 317 | "¥", 318 | "₱" 319 | ] 320 | }, 321 | { 322 | "strings": [ 323 | "%", 324 | "‰" 325 | ] 326 | }, 327 | { 328 | "strings": [ 329 | "&" 330 | ] 331 | }, 332 | { 333 | "strings": [ 334 | "-", 335 | "_", 336 | "–", 337 | "—", 338 | "·" 339 | ] 340 | }, 341 | { 342 | "strings": [ 343 | "+", 344 | "±", 345 | "﬩" 346 | ] 347 | }, 348 | { 349 | "strings": [ 350 | "(", 351 | ">", 352 | "}", 353 | "]" 354 | ] 355 | }, 356 | { 357 | "strings": [ 358 | ")", 359 | "<", 360 | "{", 361 | "[" 362 | ] 363 | }, 364 | { 365 | "iconName": "keyboard-enter-symbolic", 366 | "keyval": "0xff0d", 367 | "width": 2 368 | } 369 | ], 370 | [ 371 | { 372 | "action": "levelSwitch", 373 | "label": "=/<", 374 | "level": 3, 375 | "width": 1.5 376 | }, 377 | { 378 | "strings": [ 379 | "*", 380 | "★" 381 | ] 382 | }, 383 | { 384 | "strings": [ 385 | "\"", 386 | "“", 387 | "”", 388 | "«", 389 | "»" 390 | ] 391 | }, 392 | { 393 | "strings": [ 394 | "'", 395 | "‘", 396 | "’", 397 | "‹", 398 | "›" 399 | ] 400 | }, 401 | { 402 | "strings": [ 403 | ":" 404 | ] 405 | }, 406 | { 407 | "strings": [ 408 | ";" 409 | ] 410 | }, 411 | { 412 | "strings": [ 413 | "!", 414 | "¡" 415 | ] 416 | }, 417 | { 418 | "strings": [ 419 | "?", 420 | "¿" 421 | ] 422 | }, 423 | { 424 | "action": "levelSwitch", 425 | "label": "=/<", 426 | "level": 3, 427 | "width": 3 428 | } 429 | ], 430 | [ 431 | { 432 | "action": "levelSwitch", 433 | "label": "ABC", 434 | "level": 0, 435 | "width": 1.5 436 | }, 437 | { 438 | "strings": [ 439 | "_" 440 | ] 441 | }, 442 | { 443 | "strings": [ 444 | "/" 445 | ] 446 | }, 447 | { 448 | "strings": [ 449 | " " 450 | ], 451 | "width": 3 452 | }, 453 | { 454 | "strings": [ 455 | ",", 456 | "!" 457 | ] 458 | }, 459 | { 460 | "strings": [ 461 | ".", 462 | "?" 463 | ] 464 | }, 465 | { 466 | "action": "emoji", 467 | "iconName": "face-smile-symbolic" 468 | }, 469 | { 470 | "action": "languageMenu", 471 | "iconName": "keyboard-layout-symbolic" 472 | }, 473 | { 474 | "action": "hide", 475 | "iconName": "keyboard-hide-symbolic" 476 | } 477 | ] 478 | ] 479 | }, 480 | { 481 | "level": "opt+shift", 482 | "mode": "locked", 483 | "rows": [ 484 | [ 485 | { 486 | "strings": [ 487 | "~" 488 | ] 489 | }, 490 | { 491 | "strings": [ 492 | "`" 493 | ] 494 | }, 495 | { 496 | "strings": [ 497 | "|" 498 | ] 499 | }, 500 | { 501 | "strings": [ 502 | "•", 503 | "♪", 504 | "♥", 505 | "♠", 506 | "♦", 507 | "♣" 508 | ] 509 | }, 510 | { 511 | "strings": [ 512 | "√" 513 | ] 514 | }, 515 | { 516 | "strings": [ 517 | "Π", 518 | "π" 519 | ] 520 | }, 521 | { 522 | "strings": [ 523 | "÷" 524 | ] 525 | }, 526 | { 527 | "strings": [ 528 | "×" 529 | ] 530 | }, 531 | { 532 | "strings": [ 533 | "¶", 534 | "§" 535 | ] 536 | }, 537 | { 538 | "strings": [ 539 | "∆" 540 | ] 541 | }, 542 | { 543 | "action": "delete", 544 | "iconName": "edit-clear-symbolic", 545 | "width": 1.5 546 | } 547 | ], 548 | [ 549 | { 550 | "strings": [ 551 | "£" 552 | ] 553 | }, 554 | { 555 | "strings": [ 556 | "€" 557 | ] 558 | }, 559 | { 560 | "strings": [ 561 | "$", 562 | "¢" 563 | ] 564 | }, 565 | { 566 | "strings": [ 567 | "¢" 568 | ] 569 | }, 570 | { 571 | "strings": [ 572 | "^", 573 | "↑", 574 | "↓", 575 | "←", 576 | "→" 577 | ] 578 | }, 579 | { 580 | "strings": [ 581 | "°", 582 | "′", 583 | "″" 584 | ] 585 | }, 586 | { 587 | "strings": [ 588 | "=", 589 | "≠", 590 | "≈", 591 | "∞" 592 | ] 593 | }, 594 | { 595 | "strings": [ 596 | "{" 597 | ] 598 | }, 599 | { 600 | "strings": [ 601 | "}" 602 | ] 603 | }, 604 | { 605 | "iconName": "keyboard-enter-symbolic", 606 | "keyval": "0xff0d", 607 | "width": 2 608 | } 609 | ], 610 | [ 611 | { 612 | "action": "levelSwitch", 613 | "label": "?123", 614 | "level": 2, 615 | "width": 1.5 616 | }, 617 | { 618 | "strings": [ 619 | "\\" 620 | ] 621 | }, 622 | { 623 | "strings": [ 624 | "©" 625 | ] 626 | }, 627 | { 628 | "strings": [ 629 | "®" 630 | ] 631 | }, 632 | { 633 | "strings": [ 634 | "™" 635 | ] 636 | }, 637 | { 638 | "strings": [ 639 | "℅" 640 | ] 641 | }, 642 | { 643 | "strings": [ 644 | "[" 645 | ] 646 | }, 647 | { 648 | "strings": [ 649 | "]" 650 | ] 651 | }, 652 | { 653 | "action": "levelSwitch", 654 | "label": "?123", 655 | "level": 2, 656 | "width": 3 657 | } 658 | ], 659 | [ 660 | { 661 | "action": "levelSwitch", 662 | "label": "ABC", 663 | "level": 0, 664 | "width": 1.5 665 | }, 666 | { 667 | "strings": [ 668 | "<", 669 | "›", 670 | "≥", 671 | "»" 672 | ] 673 | }, 674 | { 675 | "strings": [ 676 | ">", 677 | "‹", 678 | "≤", 679 | "«" 680 | ] 681 | }, 682 | { 683 | "strings": [ 684 | " " 685 | ], 686 | "width": 3 687 | }, 688 | { 689 | "strings": [ 690 | ",", 691 | "!" 692 | ] 693 | }, 694 | { 695 | "strings": [ 696 | ".", 697 | "?" 698 | ] 699 | }, 700 | { 701 | "action": "emoji", 702 | "iconName": "face-smile-symbolic" 703 | }, 704 | { 705 | "action": "languageMenu", 706 | "iconName": "keyboard-layout-symbolic" 707 | }, 708 | { 709 | "action": "hide", 710 | "iconName": "keyboard-hide-symbolic" 711 | } 712 | ] 713 | ] 714 | } 715 | ], 716 | "locale": "he", 717 | "name": "Hebrew" 718 | } -------------------------------------------------------------------------------- /src/data/osk-layouts/kr.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "label": "ㅂ", 10 | "strings": [ 11 | "q" 12 | ] 13 | }, 14 | { 15 | "label": "ㅈ", 16 | "strings": [ 17 | "w" 18 | ] 19 | }, 20 | { 21 | "label": "ㄷ", 22 | "strings": [ 23 | "e" 24 | ] 25 | }, 26 | { 27 | "label": "ㄱ", 28 | "strings": [ 29 | "r" 30 | ] 31 | }, 32 | { 33 | "label": "ㅅ", 34 | "strings": [ 35 | "t" 36 | ] 37 | }, 38 | { 39 | "label": "ㅛ", 40 | "strings": [ 41 | "y" 42 | ] 43 | }, 44 | { 45 | "label": "ㅕ", 46 | "strings": [ 47 | "u" 48 | ] 49 | }, 50 | { 51 | "label": "ㅑ", 52 | "strings": [ 53 | "i" 54 | ] 55 | }, 56 | { 57 | "label": "ㅐ", 58 | "strings": [ 59 | "o" 60 | ] 61 | }, 62 | { 63 | "label": "ㅔ", 64 | "strings": [ 65 | "p" 66 | ] 67 | }, 68 | { 69 | "iconName": "edit-clear-symbolic", 70 | "keyval": "0xff08", 71 | "width": 1.5 72 | } 73 | ], 74 | [ 75 | { 76 | "label": "ㅁ", 77 | "strings": [ 78 | "a" 79 | ] 80 | }, 81 | { 82 | "label": "ㄴ", 83 | "strings": [ 84 | "s" 85 | ] 86 | }, 87 | { 88 | "label": "ㅇ", 89 | "strings": [ 90 | "d" 91 | ] 92 | }, 93 | { 94 | "label": "ㄹ", 95 | "strings": [ 96 | "f" 97 | ] 98 | }, 99 | { 100 | "label": "ㅎ", 101 | "strings": [ 102 | "g" 103 | ] 104 | }, 105 | { 106 | "label": "ㅗ", 107 | "strings": [ 108 | "h" 109 | ] 110 | }, 111 | { 112 | "label": "ㅓ", 113 | "strings": [ 114 | "j" 115 | ] 116 | }, 117 | { 118 | "label": "ㅏ", 119 | "strings": [ 120 | "k" 121 | ] 122 | }, 123 | { 124 | "label": "ㅣ", 125 | "strings": [ 126 | "l" 127 | ] 128 | }, 129 | { 130 | "iconName": "keyboard-enter-symbolic", 131 | "keyval": "0xff0d", 132 | "width": 2 133 | } 134 | ], 135 | [ 136 | { 137 | "label": "ㅋ", 138 | "strings": [ 139 | "z" 140 | ] 141 | }, 142 | { 143 | "label": "ㅌ", 144 | "strings": [ 145 | "x" 146 | ] 147 | }, 148 | { 149 | "label": "ㅊ", 150 | "strings": [ 151 | "c" 152 | ] 153 | }, 154 | { 155 | "label": "ㅍ", 156 | "strings": [ 157 | "v" 158 | ] 159 | }, 160 | { 161 | "label": "ㅠ", 162 | "strings": [ 163 | "b" 164 | ] 165 | }, 166 | { 167 | "label": "ㅜ", 168 | "strings": [ 169 | "n" 170 | ] 171 | }, 172 | { 173 | "label": "ㅡ", 174 | "strings": [ 175 | "m" 176 | ] 177 | }, 178 | { 179 | "strings": [ 180 | "," 181 | ] 182 | }, 183 | { 184 | "strings": [ 185 | ".", 186 | "#", 187 | "!", 188 | ",", 189 | "?", 190 | "-", 191 | ":", 192 | "'", 193 | "@" 194 | ] 195 | } 196 | ], 197 | [ 198 | { 199 | "action": "levelSwitch", 200 | "label": "?123", 201 | "level": 2, 202 | "width": 1.5 203 | }, 204 | { 205 | "action": "emoji", 206 | "iconName": "face-smile-symbolic", 207 | "width": 1.5 208 | }, 209 | { 210 | "strings": [ 211 | " " 212 | ], 213 | "width": 5 214 | }, 215 | { 216 | "action": "languageMenu", 217 | "iconName": "keyboard-layout-symbolic", 218 | "width": 1.5 219 | }, 220 | { 221 | "action": "hide", 222 | "iconName": "keyboard-hide-symbolic", 223 | "width": 2 224 | } 225 | ] 226 | ] 227 | }, 228 | { 229 | "level": "opt", 230 | "mode": "locked", 231 | "rows": [ 232 | [ 233 | { 234 | "strings": [ 235 | "1", 236 | "¹", 237 | "½", 238 | "⅓", 239 | "¼", 240 | "⅛" 241 | ] 242 | }, 243 | { 244 | "strings": [ 245 | "2", 246 | "²", 247 | "⅔" 248 | ] 249 | }, 250 | { 251 | "strings": [ 252 | "3", 253 | "³", 254 | "¾", 255 | "⅜" 256 | ] 257 | }, 258 | { 259 | "strings": [ 260 | "4", 261 | "⁴" 262 | ] 263 | }, 264 | { 265 | "strings": [ 266 | "5", 267 | "⅝" 268 | ] 269 | }, 270 | { 271 | "strings": [ 272 | "6" 273 | ] 274 | }, 275 | { 276 | "strings": [ 277 | "7", 278 | "⅞" 279 | ] 280 | }, 281 | { 282 | "strings": [ 283 | "8" 284 | ] 285 | }, 286 | { 287 | "strings": [ 288 | "9" 289 | ] 290 | }, 291 | { 292 | "strings": [ 293 | "0", 294 | "ⁿ", 295 | "∅" 296 | ] 297 | }, 298 | { 299 | "iconName": "edit-clear-symbolic", 300 | "keyval": "0xff08", 301 | "width": 1.5 302 | } 303 | ], 304 | [ 305 | { 306 | "strings": [ 307 | "@" 308 | ] 309 | }, 310 | { 311 | "strings": [ 312 | "#" 313 | ] 314 | }, 315 | { 316 | "strings": [ 317 | "$", 318 | "¢", 319 | "£", 320 | "€", 321 | "¥", 322 | "₱" 323 | ] 324 | }, 325 | { 326 | "strings": [ 327 | "%", 328 | "‰" 329 | ] 330 | }, 331 | { 332 | "strings": [ 333 | "&" 334 | ] 335 | }, 336 | { 337 | "strings": [ 338 | "-", 339 | "_", 340 | "–", 341 | "—", 342 | "·" 343 | ] 344 | }, 345 | { 346 | "strings": [ 347 | "+", 348 | "±" 349 | ] 350 | }, 351 | { 352 | "strings": [ 353 | "(", 354 | "<", 355 | "{", 356 | "[" 357 | ] 358 | }, 359 | { 360 | "strings": [ 361 | ")", 362 | ">", 363 | "}", 364 | "]" 365 | ] 366 | }, 367 | { 368 | "iconName": "keyboard-enter-symbolic", 369 | "keyval": "0xff0d", 370 | "width": 2 371 | } 372 | ], 373 | [ 374 | { 375 | "action": "levelSwitch", 376 | "label": "=/<", 377 | "level": 3, 378 | "width": 1.5 379 | }, 380 | { 381 | "strings": [ 382 | "*", 383 | "†", 384 | "‡", 385 | "★" 386 | ] 387 | }, 388 | { 389 | "strings": [ 390 | "\"", 391 | "“", 392 | "”", 393 | "«", 394 | "»" 395 | ] 396 | }, 397 | { 398 | "strings": [ 399 | "'", 400 | "‘", 401 | "’", 402 | "‹", 403 | "›" 404 | ] 405 | }, 406 | { 407 | "strings": [ 408 | ":" 409 | ] 410 | }, 411 | { 412 | "strings": [ 413 | ";" 414 | ] 415 | }, 416 | { 417 | "strings": [ 418 | "!", 419 | "¡" 420 | ] 421 | }, 422 | { 423 | "strings": [ 424 | "?", 425 | "¿" 426 | ] 427 | }, 428 | { 429 | "action": "levelSwitch", 430 | "label": "=/<", 431 | "level": 3, 432 | "width": 3 433 | } 434 | ], 435 | [ 436 | { 437 | "action": "levelSwitch", 438 | "label": "ABC", 439 | "level": 0, 440 | "width": 1.5 441 | }, 442 | { 443 | "strings": [ 444 | "_" 445 | ] 446 | }, 447 | { 448 | "strings": [ 449 | "/" 450 | ] 451 | }, 452 | { 453 | "strings": [ 454 | " " 455 | ], 456 | "width": 3 457 | }, 458 | { 459 | "strings": [ 460 | "," 461 | ] 462 | }, 463 | { 464 | "strings": [ 465 | ".", 466 | "…" 467 | ] 468 | }, 469 | { 470 | "action": "emoji", 471 | "iconName": "face-smile-symbolic" 472 | }, 473 | { 474 | "action": "languageMenu", 475 | "iconName": "keyboard-layout-symbolic" 476 | }, 477 | { 478 | "action": "hide", 479 | "iconName": "keyboard-hide-symbolic" 480 | } 481 | ] 482 | ] 483 | }, 484 | { 485 | "level": "opt+shift", 486 | "mode": "locked", 487 | "rows": [ 488 | [ 489 | { 490 | "strings": [ 491 | "~" 492 | ] 493 | }, 494 | { 495 | "strings": [ 496 | "`" 497 | ] 498 | }, 499 | { 500 | "strings": [ 501 | "|" 502 | ] 503 | }, 504 | { 505 | "strings": [ 506 | "•", 507 | "♪", 508 | "♥", 509 | "♠", 510 | "♦", 511 | "♣" 512 | ] 513 | }, 514 | { 515 | "strings": [ 516 | "√" 517 | ] 518 | }, 519 | { 520 | "strings": [ 521 | "Π", 522 | "π" 523 | ] 524 | }, 525 | { 526 | "strings": [ 527 | "÷" 528 | ] 529 | }, 530 | { 531 | "strings": [ 532 | "×" 533 | ] 534 | }, 535 | { 536 | "strings": [ 537 | "¶", 538 | "§" 539 | ] 540 | }, 541 | { 542 | "strings": [ 543 | "∆" 544 | ] 545 | }, 546 | { 547 | "iconName": "edit-clear-symbolic", 548 | "keyval": "0xff08", 549 | "width": 1.5 550 | } 551 | ], 552 | [ 553 | { 554 | "strings": [ 555 | "£" 556 | ] 557 | }, 558 | { 559 | "strings": [ 560 | "¢" 561 | ] 562 | }, 563 | { 564 | "strings": [ 565 | "€" 566 | ] 567 | }, 568 | { 569 | "strings": [ 570 | "¥" 571 | ] 572 | }, 573 | { 574 | "strings": [ 575 | "^", 576 | "↑", 577 | "↓", 578 | "←", 579 | "→" 580 | ] 581 | }, 582 | { 583 | "strings": [ 584 | "°", 585 | "′", 586 | "″" 587 | ] 588 | }, 589 | { 590 | "strings": [ 591 | "=", 592 | "≠", 593 | "≈", 594 | "∞" 595 | ] 596 | }, 597 | { 598 | "strings": [ 599 | "{" 600 | ] 601 | }, 602 | { 603 | "strings": [ 604 | "}" 605 | ] 606 | }, 607 | { 608 | "iconName": "keyboard-enter-symbolic", 609 | "keyval": "0xff0d", 610 | "width": 2 611 | } 612 | ], 613 | [ 614 | { 615 | "action": "levelSwitch", 616 | "label": "?123", 617 | "level": 2, 618 | "width": 1.5 619 | }, 620 | { 621 | "strings": [ 622 | "\\" 623 | ] 624 | }, 625 | { 626 | "strings": [ 627 | "©" 628 | ] 629 | }, 630 | { 631 | "strings": [ 632 | "®" 633 | ] 634 | }, 635 | { 636 | "strings": [ 637 | "™" 638 | ] 639 | }, 640 | { 641 | "strings": [ 642 | "℅" 643 | ] 644 | }, 645 | { 646 | "strings": [ 647 | "[" 648 | ] 649 | }, 650 | { 651 | "strings": [ 652 | "]" 653 | ] 654 | }, 655 | { 656 | "action": "levelSwitch", 657 | "label": "?123", 658 | "level": 2, 659 | "width": 3 660 | } 661 | ], 662 | [ 663 | { 664 | "action": "levelSwitch", 665 | "label": "ABC", 666 | "level": 0, 667 | "width": 1.5 668 | }, 669 | { 670 | "strings": [ 671 | "<", 672 | "‹", 673 | "≤", 674 | "«" 675 | ] 676 | }, 677 | { 678 | "strings": [ 679 | ">", 680 | "›", 681 | "≥", 682 | "»" 683 | ] 684 | }, 685 | { 686 | "strings": [ 687 | " " 688 | ], 689 | "width": 3 690 | }, 691 | { 692 | "strings": [ 693 | "," 694 | ] 695 | }, 696 | { 697 | "strings": [ 698 | ".", 699 | "…" 700 | ] 701 | }, 702 | { 703 | "action": "emoji", 704 | "iconName": "face-smile-symbolic" 705 | }, 706 | { 707 | "action": "languageMenu", 708 | "iconName": "keyboard-layout-symbolic" 709 | }, 710 | { 711 | "action": "hide", 712 | "iconName": "keyboard-hide-symbolic" 713 | } 714 | ] 715 | ] 716 | } 717 | ], 718 | "locale": "kr", 719 | "name": "Korean (Hangul)" 720 | } 721 | -------------------------------------------------------------------------------- /src/data/osk-layouts/in+bolnagri.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "◌ौ" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "◌ै" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "◌ा" 21 | ] 22 | }, 23 | { 24 | "strings": [ 25 | "◌ी" 26 | ] 27 | }, 28 | { 29 | "strings": [ 30 | "◌ू" 31 | ] 32 | }, 33 | { 34 | "strings": [ 35 | "ब", 36 | "ब॒", 37 | "%" 38 | ] 39 | }, 40 | { 41 | "strings": [ 42 | "ह" 43 | ] 44 | }, 45 | { 46 | "strings": [ 47 | "ग", 48 | "ज्ञ", 49 | "ग़", 50 | "ग॒", 51 | "%" 52 | ] 53 | }, 54 | { 55 | "strings": [ 56 | "द" 57 | ] 58 | }, 59 | { 60 | "strings": [ 61 | "ज", 62 | "ज॒", 63 | "ज्ञ", 64 | "ज़", 65 | "%" 66 | ] 67 | }, 68 | { 69 | "strings": [ 70 | "ड", 71 | "ड॒", 72 | "ड़" 73 | ] 74 | }, 75 | { 76 | "action": "delete", 77 | "iconName": "edit-clear-symbolic", 78 | "width": 1.5 79 | } 80 | ], 81 | [ 82 | { 83 | "strings": [ 84 | "◌ो" 85 | ] 86 | }, 87 | { 88 | "strings": [ 89 | "◌े" 90 | ] 91 | }, 92 | { 93 | "strings": [ 94 | "◌्" 95 | ] 96 | }, 97 | { 98 | "strings": [ 99 | "◌ि" 100 | ] 101 | }, 102 | { 103 | "strings": [ 104 | "◌ु" 105 | ] 106 | }, 107 | { 108 | "strings": [ 109 | "प" 110 | ] 111 | }, 112 | { 113 | "strings": [ 114 | "र", 115 | "ऋ", 116 | "ऱ", 117 | "ॠ" 118 | ] 119 | }, 120 | { 121 | "strings": [ 122 | "क", 123 | "क़" 124 | ] 125 | }, 126 | { 127 | "strings": [ 128 | "त", 129 | "त्र" 130 | ] 131 | }, 132 | { 133 | "strings": [ 134 | "च" 135 | ] 136 | }, 137 | { 138 | "strings": [ 139 | "ट" 140 | ] 141 | }, 142 | { 143 | "iconName": "keyboard-enter-symbolic", 144 | "keyval": "0xff0d", 145 | "width": 1.5 146 | } 147 | ], 148 | [ 149 | { 150 | "strings": [ 151 | "◌ॉ" 152 | ] 153 | }, 154 | { 155 | "strings": [ 156 | "◌ं" 157 | ] 158 | }, 159 | { 160 | "strings": [ 161 | "म", 162 | "ॐ" 163 | ] 164 | }, 165 | { 166 | "strings": [ 167 | "न", 168 | "ञ", 169 | "ङ", 170 | "ऩ" 171 | ] 172 | }, 173 | { 174 | "strings": [ 175 | "व" 176 | ] 177 | }, 178 | { 179 | "strings": [ 180 | "ल", 181 | "ऌ", 182 | "ॡ" 183 | ] 184 | }, 185 | { 186 | "strings": [ 187 | "स" 188 | ] 189 | }, 190 | { 191 | "strings": [ 192 | "य", 193 | "य़" 194 | ] 195 | }, 196 | { 197 | "strings": [ 198 | "◌़" 199 | ] 200 | }, 201 | { 202 | "strings": [ 203 | "," 204 | ] 205 | }, 206 | { 207 | "strings": [ 208 | ".", 209 | "#", 210 | "!", 211 | ",", 212 | "?", 213 | "-", 214 | ":", 215 | "'", 216 | "@" 217 | ] 218 | } 219 | ], 220 | [ 221 | { 222 | "action": "levelSwitch", 223 | "label": "?123", 224 | "level": 2, 225 | "width": 1.5 226 | }, 227 | { 228 | "action": "emoji", 229 | "iconName": "face-smile-symbolic", 230 | "width": 1.5 231 | }, 232 | { 233 | "strings": [ 234 | " " 235 | ], 236 | "width": 6 237 | }, 238 | { 239 | "action": "languageMenu", 240 | "iconName": "keyboard-layout-symbolic", 241 | "width": 1.5 242 | }, 243 | { 244 | "action": "hide", 245 | "iconName": "keyboard-hide-symbolic", 246 | "width": 2 247 | } 248 | ] 249 | ] 250 | }, 251 | { 252 | "level": "opt", 253 | "mode": "locked", 254 | "rows": [ 255 | [ 256 | { 257 | "strings": [ 258 | "१", 259 | "¹", 260 | "½", 261 | "⅓", 262 | "¼", 263 | "⅛" 264 | ] 265 | }, 266 | { 267 | "strings": [ 268 | "२", 269 | "²", 270 | "⅔" 271 | ] 272 | }, 273 | { 274 | "strings": [ 275 | "३", 276 | "³", 277 | "¾", 278 | "⅜" 279 | ] 280 | }, 281 | { 282 | "strings": [ 283 | "४", 284 | "⁴" 285 | ] 286 | }, 287 | { 288 | "strings": [ 289 | "५", 290 | "⅝" 291 | ] 292 | }, 293 | { 294 | "strings": [ 295 | "६" 296 | ] 297 | }, 298 | { 299 | "strings": [ 300 | "७", 301 | "⅞" 302 | ] 303 | }, 304 | { 305 | "strings": [ 306 | "८" 307 | ] 308 | }, 309 | { 310 | "strings": [ 311 | "९" 312 | ] 313 | }, 314 | { 315 | "strings": [ 316 | "०", 317 | "ⁿ", 318 | "∅" 319 | ] 320 | }, 321 | { 322 | "action": "delete", 323 | "iconName": "edit-clear-symbolic", 324 | "width": 1.5 325 | } 326 | ], 327 | [ 328 | { 329 | "strings": [ 330 | "@" 331 | ] 332 | }, 333 | { 334 | "strings": [ 335 | "#" 336 | ] 337 | }, 338 | { 339 | "strings": [ 340 | "₹", 341 | "$", 342 | "¢", 343 | "€", 344 | "£", 345 | "¥", 346 | "₱" 347 | ] 348 | }, 349 | { 350 | "strings": [ 351 | "%", 352 | "‰" 353 | ] 354 | }, 355 | { 356 | "strings": [ 357 | "&" 358 | ] 359 | }, 360 | { 361 | "strings": [ 362 | "-", 363 | "_", 364 | "–", 365 | "—", 366 | "·" 367 | ] 368 | }, 369 | { 370 | "strings": [ 371 | "+", 372 | "±" 373 | ] 374 | }, 375 | { 376 | "strings": [ 377 | "(", 378 | "<", 379 | "{", 380 | "[" 381 | ] 382 | }, 383 | { 384 | "strings": [ 385 | ")", 386 | ">", 387 | "}", 388 | "]" 389 | ] 390 | }, 391 | { 392 | "iconName": "keyboard-enter-symbolic", 393 | "keyval": "0xff0d", 394 | "width": 2 395 | } 396 | ], 397 | [ 398 | { 399 | "action": "levelSwitch", 400 | "label": "=/<", 401 | "level": 3, 402 | "width": 1.5 403 | }, 404 | { 405 | "strings": [ 406 | "*", 407 | "†", 408 | "‡", 409 | "★" 410 | ] 411 | }, 412 | { 413 | "strings": [ 414 | "\"", 415 | "“", 416 | "”", 417 | "«", 418 | "»" 419 | ] 420 | }, 421 | { 422 | "strings": [ 423 | "'", 424 | "‘", 425 | "’", 426 | "‹", 427 | "›" 428 | ] 429 | }, 430 | { 431 | "strings": [ 432 | ":" 433 | ] 434 | }, 435 | { 436 | "strings": [ 437 | ";" 438 | ] 439 | }, 440 | { 441 | "strings": [ 442 | "!", 443 | "¡" 444 | ] 445 | }, 446 | { 447 | "strings": [ 448 | "?", 449 | "¿" 450 | ] 451 | }, 452 | { 453 | "action": "levelSwitch", 454 | "label": "=/<", 455 | "level": 3, 456 | "width": 3 457 | } 458 | ], 459 | [ 460 | { 461 | "action": "levelSwitch", 462 | "label": "ABC", 463 | "level": 0, 464 | "width": 1.5 465 | }, 466 | { 467 | "strings": [ 468 | "_" 469 | ] 470 | }, 471 | { 472 | "strings": [ 473 | "/" 474 | ] 475 | }, 476 | { 477 | "strings": [ 478 | " " 479 | ], 480 | "width": 3 481 | }, 482 | { 483 | "strings": [ 484 | "," 485 | ] 486 | }, 487 | { 488 | "strings": [ 489 | ".", 490 | "…" 491 | ] 492 | }, 493 | { 494 | "action": "emoji", 495 | "iconName": "face-smile-symbolic" 496 | }, 497 | { 498 | "action": "languageMenu", 499 | "iconName": "keyboard-layout-symbolic" 500 | }, 501 | { 502 | "action": "hide", 503 | "iconName": "keyboard-hide-symbolic" 504 | } 505 | ] 506 | ] 507 | }, 508 | { 509 | "level": "opt+shift", 510 | "mode": "locked", 511 | "rows": [ 512 | [ 513 | { 514 | "strings": [ 515 | "~" 516 | ] 517 | }, 518 | { 519 | "strings": [ 520 | "`" 521 | ] 522 | }, 523 | { 524 | "strings": [ 525 | "|" 526 | ] 527 | }, 528 | { 529 | "strings": [ 530 | "•", 531 | "♪", 532 | "♥", 533 | "♠", 534 | "♦", 535 | "♣" 536 | ] 537 | }, 538 | { 539 | "strings": [ 540 | "√" 541 | ] 542 | }, 543 | { 544 | "strings": [ 545 | "Π", 546 | "π" 547 | ] 548 | }, 549 | { 550 | "strings": [ 551 | "÷" 552 | ] 553 | }, 554 | { 555 | "strings": [ 556 | "×" 557 | ] 558 | }, 559 | { 560 | "strings": [ 561 | "¶", 562 | "§" 563 | ] 564 | }, 565 | { 566 | "strings": [ 567 | "∆" 568 | ] 569 | }, 570 | { 571 | "action": "delete", 572 | "iconName": "edit-clear-symbolic", 573 | "width": 1.5 574 | } 575 | ], 576 | [ 577 | { 578 | "strings": [ 579 | "£" 580 | ] 581 | }, 582 | { 583 | "strings": [ 584 | "€" 585 | ] 586 | }, 587 | { 588 | "strings": [ 589 | "$", 590 | "¢" 591 | ] 592 | }, 593 | { 594 | "strings": [ 595 | "¢" 596 | ] 597 | }, 598 | { 599 | "strings": [ 600 | "^", 601 | "↑", 602 | "↓", 603 | "←", 604 | "→" 605 | ] 606 | }, 607 | { 608 | "strings": [ 609 | "°", 610 | "′", 611 | "″" 612 | ] 613 | }, 614 | { 615 | "strings": [ 616 | "=", 617 | "≠", 618 | "≈", 619 | "∞" 620 | ] 621 | }, 622 | { 623 | "strings": [ 624 | "{" 625 | ] 626 | }, 627 | { 628 | "strings": [ 629 | "}" 630 | ] 631 | }, 632 | { 633 | "iconName": "keyboard-enter-symbolic", 634 | "keyval": "0xff0d", 635 | "width": 2 636 | } 637 | ], 638 | [ 639 | { 640 | "action": "levelSwitch", 641 | "label": "?123", 642 | "level": 2, 643 | "width": 1.5 644 | }, 645 | { 646 | "strings": [ 647 | "\\" 648 | ] 649 | }, 650 | { 651 | "strings": [ 652 | "©" 653 | ] 654 | }, 655 | { 656 | "strings": [ 657 | "®" 658 | ] 659 | }, 660 | { 661 | "strings": [ 662 | "™" 663 | ] 664 | }, 665 | { 666 | "strings": [ 667 | "℅" 668 | ] 669 | }, 670 | { 671 | "strings": [ 672 | "[" 673 | ] 674 | }, 675 | { 676 | "strings": [ 677 | "]" 678 | ] 679 | }, 680 | { 681 | "action": "levelSwitch", 682 | "label": "?123", 683 | "level": 2, 684 | "width": 3 685 | } 686 | ], 687 | [ 688 | { 689 | "action": "levelSwitch", 690 | "label": "ABC", 691 | "level": 0, 692 | "width": 1.5 693 | }, 694 | { 695 | "strings": [ 696 | "<", 697 | "‹", 698 | "≤", 699 | "«" 700 | ] 701 | }, 702 | { 703 | "strings": [ 704 | ">", 705 | "›", 706 | "≥", 707 | "»" 708 | ] 709 | }, 710 | { 711 | "strings": [ 712 | " " 713 | ], 714 | "width": 3 715 | }, 716 | { 717 | "strings": [ 718 | "," 719 | ] 720 | }, 721 | { 722 | "strings": [ 723 | ".", 724 | "…" 725 | ] 726 | }, 727 | { 728 | "action": "emoji", 729 | "iconName": "face-smile-symbolic" 730 | }, 731 | { 732 | "action": "languageMenu", 733 | "iconName": "keyboard-layout-symbolic" 734 | }, 735 | { 736 | "action": "hide", 737 | "iconName": "keyboard-hide-symbolic" 738 | } 739 | ] 740 | ] 741 | } 742 | ], 743 | "locale": "hi", 744 | "name": "Hindi" 745 | } 746 | -------------------------------------------------------------------------------- /src/data/osk-layouts/ara.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "ض" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "ص" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "ث" 21 | ] 22 | }, 23 | { 24 | "strings": [ 25 | "ق", 26 | "ڨ" 27 | ] 28 | }, 29 | { 30 | "strings": [ 31 | "ف", 32 | "ڤ", 33 | "ڢ", 34 | "ڥ" 35 | ] 36 | }, 37 | { 38 | "strings": [ 39 | "غ" 40 | ] 41 | }, 42 | { 43 | "strings": [ 44 | "ع" 45 | ] 46 | }, 47 | { 48 | "strings": [ 49 | "ه", 50 | "ه‍" 51 | ] 52 | }, 53 | { 54 | "strings": [ 55 | "خ" 56 | ] 57 | }, 58 | { 59 | "strings": [ 60 | "ح" 61 | ] 62 | }, 63 | { 64 | "strings": [ 65 | "ج", 66 | "چ" 67 | ] 68 | }, 69 | { 70 | "action": "delete", 71 | "iconName": "edit-clear-symbolic", 72 | "width": 1.5 73 | } 74 | ], 75 | [ 76 | { 77 | "strings": [ 78 | "ش", 79 | "ڜ" 80 | ] 81 | }, 82 | { 83 | "strings": [ 84 | "س" 85 | ] 86 | }, 87 | { 88 | "strings": [ 89 | "ي", 90 | "ئ", 91 | "ى" 92 | ] 93 | }, 94 | { 95 | "strings": [ 96 | "ب", 97 | "پ" 98 | ] 99 | }, 100 | { 101 | "strings": [ 102 | "ل", 103 | "لا", 104 | "لأ", 105 | "لإ", 106 | "لآ" 107 | ] 108 | }, 109 | { 110 | "strings": [ 111 | "ا", 112 | "آ", 113 | "ء", 114 | "أ", 115 | "إ", 116 | "ٱ" 117 | ] 118 | }, 119 | { 120 | "strings": [ 121 | "ت" 122 | ] 123 | }, 124 | { 125 | "strings": [ 126 | "ن" 127 | ] 128 | }, 129 | { 130 | "strings": [ 131 | "م" 132 | ] 133 | }, 134 | { 135 | "strings": [ 136 | "ك", 137 | "گ", 138 | "ک" 139 | ] 140 | }, 141 | { 142 | "strings": [ 143 | "ط" 144 | ] 145 | }, 146 | { 147 | "iconName": "keyboard-enter-symbolic", 148 | "keyval": "0xff0d", 149 | "width": 1.5 150 | } 151 | ], 152 | [ 153 | { 154 | "strings": [ 155 | "ذ" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "ء" 161 | ] 162 | }, 163 | { 164 | "strings": [ 165 | "ؤ" 166 | ] 167 | }, 168 | { 169 | "strings": [ 170 | "ر" 171 | ] 172 | }, 173 | { 174 | "strings": [ 175 | "ى", 176 | "ئ" 177 | ] 178 | }, 179 | { 180 | "strings": [ 181 | "ة" 182 | ] 183 | }, 184 | { 185 | "strings": [ 186 | "و" 187 | ] 188 | }, 189 | { 190 | "strings": [ 191 | "ز", 192 | "ژ" 193 | ] 194 | }, 195 | { 196 | "strings": [ 197 | "ظ" 198 | ] 199 | }, 200 | { 201 | "strings": [ 202 | "د" 203 | ] 204 | } 205 | ], 206 | [ 207 | { 208 | "action": "levelSwitch", 209 | "label": "?123", 210 | "level": 2, 211 | "width": 1.5 212 | }, 213 | { 214 | "strings": [ 215 | "،" 216 | ] 217 | }, 218 | { 219 | "strings": [ 220 | " " 221 | ], 222 | "width": 6 223 | }, 224 | { 225 | "strings": [ 226 | ".", 227 | "\"", 228 | "'", 229 | "#", 230 | "-", 231 | ":", 232 | "!", 233 | "،", 234 | "؟", 235 | "@", 236 | "&", 237 | "%", 238 | "+", 239 | "؛", 240 | "/", 241 | ")", 242 | "(" 243 | ] 244 | }, 245 | { 246 | "action": "emoji", 247 | "iconName": "face-smile-symbolic" 248 | }, 249 | { 250 | "action": "languageMenu", 251 | "iconName": "keyboard-layout-symbolic" 252 | }, 253 | { 254 | "action": "hide", 255 | "iconName": "keyboard-hide-symbolic" 256 | } 257 | ] 258 | ] 259 | }, 260 | { 261 | "level": "opt", 262 | "mode": "locked", 263 | "rows": [ 264 | [ 265 | { 266 | "strings": [ 267 | "١", 268 | "¹", 269 | "½", 270 | "⅓", 271 | "¼", 272 | "⅛" 273 | ] 274 | }, 275 | { 276 | "strings": [ 277 | "٢", 278 | "²", 279 | "⅔" 280 | ] 281 | }, 282 | { 283 | "strings": [ 284 | "٣", 285 | "³", 286 | "¾", 287 | "⅜" 288 | ] 289 | }, 290 | { 291 | "strings": [ 292 | "٤", 293 | "⁴" 294 | ] 295 | }, 296 | { 297 | "strings": [ 298 | "٥", 299 | "⅝" 300 | ] 301 | }, 302 | { 303 | "strings": [ 304 | "٦" 305 | ] 306 | }, 307 | { 308 | "strings": [ 309 | "٧", 310 | "⅞" 311 | ] 312 | }, 313 | { 314 | "strings": [ 315 | "٨" 316 | ] 317 | }, 318 | { 319 | "strings": [ 320 | "٩" 321 | ] 322 | }, 323 | { 324 | "strings": [ 325 | "٠", 326 | "ⁿ", 327 | "∅" 328 | ] 329 | }, 330 | { 331 | "action": "delete", 332 | "iconName": "edit-clear-symbolic", 333 | "width": 1.5 334 | } 335 | ], 336 | [ 337 | { 338 | "strings": [ 339 | "@" 340 | ] 341 | }, 342 | { 343 | "strings": [ 344 | "#" 345 | ] 346 | }, 347 | { 348 | "strings": [ 349 | "$", 350 | "¢", 351 | "£", 352 | "€", 353 | "¥", 354 | "₱" 355 | ] 356 | }, 357 | { 358 | "strings": [ 359 | "٪", 360 | "%", 361 | "‰" 362 | ] 363 | }, 364 | { 365 | "strings": [ 366 | "&" 367 | ] 368 | }, 369 | { 370 | "strings": [ 371 | "-", 372 | "_", 373 | "–", 374 | "—", 375 | "·" 376 | ] 377 | }, 378 | { 379 | "strings": [ 380 | "+", 381 | "±" 382 | ] 383 | }, 384 | { 385 | "strings": [ 386 | "(", 387 | "﴿", 388 | ">", 389 | "}", 390 | "]" 391 | ] 392 | }, 393 | { 394 | "strings": [ 395 | ")", 396 | "﴾", 397 | "<", 398 | "{", 399 | "[" 400 | ] 401 | }, 402 | { 403 | "iconName": "keyboard-enter-symbolic", 404 | "keyval": "0xff0d", 405 | "width": 2 406 | } 407 | ], 408 | [ 409 | { 410 | "action": "levelSwitch", 411 | "label": "=/<", 412 | "level": 3, 413 | "width": 1.5 414 | }, 415 | { 416 | "strings": [ 417 | "*", 418 | "★", 419 | "٭" 420 | ] 421 | }, 422 | { 423 | "strings": [ 424 | "\"", 425 | "“", 426 | "”", 427 | "«", 428 | "»" 429 | ] 430 | }, 431 | { 432 | "strings": [ 433 | "'", 434 | "‘", 435 | "’", 436 | "‹", 437 | "›" 438 | ] 439 | }, 440 | { 441 | "strings": [ 442 | ":" 443 | ] 444 | }, 445 | { 446 | "strings": [ 447 | "؛", 448 | ";" 449 | ] 450 | }, 451 | { 452 | "strings": [ 453 | "!", 454 | "¡" 455 | ] 456 | }, 457 | { 458 | "strings": [ 459 | "؟", 460 | "?" 461 | ] 462 | }, 463 | { 464 | "action": "levelSwitch", 465 | "label": "=/<", 466 | "level": 3, 467 | "width": 3 468 | } 469 | ], 470 | [ 471 | { 472 | "action": "levelSwitch", 473 | "label": "ABC", 474 | "level": 0, 475 | "width": 1.5 476 | }, 477 | { 478 | "strings": [ 479 | "_" 480 | ] 481 | }, 482 | { 483 | "strings": [ 484 | "/" 485 | ] 486 | }, 487 | { 488 | "strings": [ 489 | " " 490 | ], 491 | "width": 3 492 | }, 493 | { 494 | "strings": [ 495 | "،", 496 | "؟", 497 | "؛", 498 | "!", 499 | ":", 500 | "-", 501 | "/", 502 | "'", 503 | "\"" 504 | ] 505 | }, 506 | { 507 | "strings": [ 508 | ".", 509 | "ٕ", 510 | "ٔ", 511 | "ْ", 512 | "ٍ", 513 | "ٌ", 514 | "ً", 515 | "ّ", 516 | "ٖ", 517 | "ٰ", 518 | "ٓ", 519 | "ِ", 520 | "ُ", 521 | "َ", 522 | "ـ" 523 | ] 524 | }, 525 | { 526 | "action": "emoji", 527 | "iconName": "face-smile-symbolic" 528 | }, 529 | { 530 | "action": "languageMenu", 531 | "iconName": "keyboard-layout-symbolic" 532 | }, 533 | { 534 | "action": "hide", 535 | "iconName": "keyboard-hide-symbolic" 536 | } 537 | ] 538 | ] 539 | }, 540 | { 541 | "level": "opt+shift", 542 | "mode": "locked", 543 | "rows": [ 544 | [ 545 | { 546 | "strings": [ 547 | "~" 548 | ] 549 | }, 550 | { 551 | "strings": [ 552 | "`" 553 | ] 554 | }, 555 | { 556 | "strings": [ 557 | "|" 558 | ] 559 | }, 560 | { 561 | "strings": [ 562 | "•", 563 | "♪" 564 | ] 565 | }, 566 | { 567 | "strings": [ 568 | "√" 569 | ] 570 | }, 571 | { 572 | "strings": [ 573 | "Π", 574 | "π" 575 | ] 576 | }, 577 | { 578 | "strings": [ 579 | "÷" 580 | ] 581 | }, 582 | { 583 | "strings": [ 584 | "×" 585 | ] 586 | }, 587 | { 588 | "strings": [ 589 | "¶", 590 | "§" 591 | ] 592 | }, 593 | { 594 | "strings": [ 595 | "∆" 596 | ] 597 | }, 598 | { 599 | "action": "delete", 600 | "iconName": "edit-clear-symbolic", 601 | "width": 1.5 602 | } 603 | ], 604 | [ 605 | { 606 | "strings": [ 607 | "£" 608 | ] 609 | }, 610 | { 611 | "strings": [ 612 | "¢" 613 | ] 614 | }, 615 | { 616 | "strings": [ 617 | "€" 618 | ] 619 | }, 620 | { 621 | "strings": [ 622 | "¥" 623 | ] 624 | }, 625 | { 626 | "strings": [ 627 | "^", 628 | "↑", 629 | "↓", 630 | "←", 631 | "→" 632 | ] 633 | }, 634 | { 635 | "strings": [ 636 | "°", 637 | "′", 638 | "″" 639 | ] 640 | }, 641 | { 642 | "strings": [ 643 | "=", 644 | "≠", 645 | "≈", 646 | "∞" 647 | ] 648 | }, 649 | { 650 | "strings": [ 651 | "{" 652 | ] 653 | }, 654 | { 655 | "strings": [ 656 | "}" 657 | ] 658 | }, 659 | { 660 | "iconName": "keyboard-enter-symbolic", 661 | "keyval": "0xff0d", 662 | "width": 2 663 | } 664 | ], 665 | [ 666 | { 667 | "action": "levelSwitch", 668 | "label": "?123", 669 | "level": 2, 670 | "width": 1.5 671 | }, 672 | { 673 | "strings": [ 674 | "\\" 675 | ] 676 | }, 677 | { 678 | "strings": [ 679 | "©" 680 | ] 681 | }, 682 | { 683 | "strings": [ 684 | "®" 685 | ] 686 | }, 687 | { 688 | "strings": [ 689 | "™" 690 | ] 691 | }, 692 | { 693 | "strings": [ 694 | "℅" 695 | ] 696 | }, 697 | { 698 | "strings": [ 699 | "[" 700 | ] 701 | }, 702 | { 703 | "strings": [ 704 | "]" 705 | ] 706 | }, 707 | { 708 | "action": "levelSwitch", 709 | "label": "?123", 710 | "level": 2, 711 | "width": 3 712 | } 713 | ], 714 | [ 715 | { 716 | "action": "levelSwitch", 717 | "label": "ABC", 718 | "level": 0, 719 | "width": 1.5 720 | }, 721 | { 722 | "strings": [ 723 | "<", 724 | "›", 725 | "≥", 726 | "»" 727 | ] 728 | }, 729 | { 730 | "strings": [ 731 | ">", 732 | "‹", 733 | "≤", 734 | "«" 735 | ] 736 | }, 737 | { 738 | "strings": [ 739 | " " 740 | ], 741 | "width": 3 742 | }, 743 | { 744 | "strings": [ 745 | "،", 746 | "؟", 747 | "؛", 748 | "!", 749 | ":", 750 | "-", 751 | "/", 752 | "'", 753 | "\"" 754 | ] 755 | }, 756 | { 757 | "strings": [ 758 | ".", 759 | "ٕ", 760 | "ٔ", 761 | "ْ", 762 | "ٍ", 763 | "ٌ", 764 | "ً", 765 | "ّ", 766 | "ٖ", 767 | "ٰ", 768 | "ٓ", 769 | "ِ", 770 | "ُ", 771 | "َ", 772 | "ـ" 773 | ] 774 | }, 775 | { 776 | "action": "emoji", 777 | "iconName": "face-smile-symbolic" 778 | }, 779 | { 780 | "action": "languageMenu", 781 | "iconName": "keyboard-layout-symbolic" 782 | }, 783 | { 784 | "action": "hide", 785 | "iconName": "keyboard-hide-symbolic" 786 | } 787 | ] 788 | ] 789 | } 790 | ], 791 | "locale": "ar", 792 | "name": "Arabic" 793 | } -------------------------------------------------------------------------------- /src/data/osk-layouts/ir.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "ض" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "ص" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "ث" 21 | ] 22 | }, 23 | { 24 | "strings": [ 25 | "ق", 26 | "ڨ" 27 | ] 28 | }, 29 | { 30 | "strings": [ 31 | "ف", 32 | "ڤ", 33 | "ڢ", 34 | "ڥ" 35 | ] 36 | }, 37 | { 38 | "strings": [ 39 | "غ" 40 | ] 41 | }, 42 | { 43 | "strings": [ 44 | "ع" 45 | ] 46 | }, 47 | { 48 | "strings": [ 49 | "ه", 50 | "ه‍" 51 | ] 52 | }, 53 | { 54 | "strings": [ 55 | "خ" 56 | ] 57 | }, 58 | { 59 | "strings": [ 60 | "ح" 61 | ] 62 | }, 63 | { 64 | "strings": [ 65 | "ج", 66 | "چ" 67 | ] 68 | }, 69 | { 70 | "action": "delete", 71 | "iconName": "edit-clear-symbolic", 72 | "width": 1.5 73 | } 74 | ], 75 | [ 76 | { 77 | "strings": [ 78 | "ش", 79 | "ڜ" 80 | ] 81 | }, 82 | { 83 | "strings": [ 84 | "س" 85 | ] 86 | }, 87 | { 88 | "strings": [ 89 | "ي", 90 | "ئ", 91 | "ى" 92 | ] 93 | }, 94 | { 95 | "strings": [ 96 | "ب", 97 | "پ" 98 | ] 99 | }, 100 | { 101 | "strings": [ 102 | "ل", 103 | "لا", 104 | "لأ", 105 | "لإ", 106 | "لآ" 107 | ] 108 | }, 109 | { 110 | "strings": [ 111 | "ا", 112 | "آ", 113 | "ء", 114 | "أ", 115 | "إ", 116 | "ٱ" 117 | ] 118 | }, 119 | { 120 | "strings": [ 121 | "ت" 122 | ] 123 | }, 124 | { 125 | "strings": [ 126 | "ن" 127 | ] 128 | }, 129 | { 130 | "strings": [ 131 | "م" 132 | ] 133 | }, 134 | { 135 | "strings": [ 136 | "ك", 137 | "گ", 138 | "ک" 139 | ] 140 | }, 141 | { 142 | "strings": [ 143 | "ط" 144 | ] 145 | }, 146 | { 147 | "iconName": "keyboard-enter-symbolic", 148 | "keyval": "0xff0d", 149 | "width": 1.5 150 | } 151 | ], 152 | [ 153 | { 154 | "strings": [ 155 | "ذ" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "ء" 161 | ] 162 | }, 163 | { 164 | "strings": [ 165 | "ؤ" 166 | ] 167 | }, 168 | { 169 | "strings": [ 170 | "ر" 171 | ] 172 | }, 173 | { 174 | "strings": [ 175 | "ى", 176 | "ئ" 177 | ] 178 | }, 179 | { 180 | "strings": [ 181 | "ة" 182 | ] 183 | }, 184 | { 185 | "strings": [ 186 | "و" 187 | ] 188 | }, 189 | { 190 | "strings": [ 191 | "ز", 192 | "ژ" 193 | ] 194 | }, 195 | { 196 | "strings": [ 197 | "ظ" 198 | ] 199 | }, 200 | { 201 | "strings": [ 202 | "د" 203 | ] 204 | } 205 | ], 206 | [ 207 | { 208 | "action": "levelSwitch", 209 | "label": "?123", 210 | "level": 2, 211 | "width": 1.5 212 | }, 213 | { 214 | "strings": [ 215 | "،" 216 | ] 217 | }, 218 | { 219 | "strings": [ 220 | " " 221 | ], 222 | "width": 6 223 | }, 224 | { 225 | "strings": [ 226 | ".", 227 | "\"", 228 | "'", 229 | "#", 230 | "-", 231 | ":", 232 | "!", 233 | "،", 234 | "؟", 235 | "@", 236 | "&", 237 | "%", 238 | "+", 239 | "؛", 240 | "/", 241 | ")", 242 | "(" 243 | ] 244 | }, 245 | { 246 | "action": "emoji", 247 | "iconName": "face-smile-symbolic" 248 | }, 249 | { 250 | "action": "languageMenu", 251 | "iconName": "keyboard-layout-symbolic" 252 | }, 253 | { 254 | "action": "hide", 255 | "iconName": "keyboard-hide-symbolic" 256 | } 257 | ] 258 | ] 259 | }, 260 | { 261 | "level": "opt", 262 | "mode": "locked", 263 | "rows": [ 264 | [ 265 | { 266 | "strings": [ 267 | "۱", 268 | "¹", 269 | "½", 270 | "⅓", 271 | "¼", 272 | "⅛" 273 | ] 274 | }, 275 | { 276 | "strings": [ 277 | "۲", 278 | "²", 279 | "⅔" 280 | ] 281 | }, 282 | { 283 | "strings": [ 284 | "۳", 285 | "³", 286 | "¾", 287 | "⅜" 288 | ] 289 | }, 290 | { 291 | "strings": [ 292 | "۴", 293 | "⁴" 294 | ] 295 | }, 296 | { 297 | "strings": [ 298 | "۵", 299 | "⅝" 300 | ] 301 | }, 302 | { 303 | "strings": [ 304 | "۶" 305 | ] 306 | }, 307 | { 308 | "strings": [ 309 | "۷", 310 | "⅞" 311 | ] 312 | }, 313 | { 314 | "strings": [ 315 | "۸" 316 | ] 317 | }, 318 | { 319 | "strings": [ 320 | "۹" 321 | ] 322 | }, 323 | { 324 | "strings": [ 325 | "۰", 326 | "ⁿ", 327 | "∅" 328 | ] 329 | }, 330 | { 331 | "action": "delete", 332 | "iconName": "edit-clear-symbolic", 333 | "width": 1.5 334 | } 335 | ], 336 | [ 337 | { 338 | "strings": [ 339 | "٬", 340 | "@" 341 | ] 342 | }, 343 | { 344 | "strings": [ 345 | "٫", 346 | "#" 347 | ] 348 | }, 349 | { 350 | "strings": [ 351 | "﷼", 352 | "$", 353 | "¢", 354 | "€", 355 | "£", 356 | "¥", 357 | "₱" 358 | ] 359 | }, 360 | { 361 | "strings": [ 362 | "٪", 363 | "%", 364 | "‰" 365 | ] 366 | }, 367 | { 368 | "strings": [ 369 | "&" 370 | ] 371 | }, 372 | { 373 | "strings": [ 374 | "-", 375 | "_", 376 | "–", 377 | "—", 378 | "·" 379 | ] 380 | }, 381 | { 382 | "strings": [ 383 | "+", 384 | "±" 385 | ] 386 | }, 387 | { 388 | "strings": [ 389 | "(", 390 | "﴿", 391 | ">", 392 | "}", 393 | "]" 394 | ] 395 | }, 396 | { 397 | "strings": [ 398 | ")", 399 | "﴾", 400 | "<", 401 | "{", 402 | "[" 403 | ] 404 | }, 405 | { 406 | "iconName": "keyboard-enter-symbolic", 407 | "keyval": "0xff0d", 408 | "width": 2 409 | } 410 | ], 411 | [ 412 | { 413 | "action": "levelSwitch", 414 | "label": "=/<", 415 | "level": 3, 416 | "width": 1.5 417 | }, 418 | { 419 | "strings": [ 420 | "*", 421 | "★", 422 | "٭" 423 | ] 424 | }, 425 | { 426 | "strings": [ 427 | "«", 428 | "“", 429 | "”", 430 | "«", 431 | "»" 432 | ] 433 | }, 434 | { 435 | "strings": [ 436 | "»", 437 | "‘", 438 | "’", 439 | "‹", 440 | "›" 441 | ] 442 | }, 443 | { 444 | "strings": [ 445 | ":" 446 | ] 447 | }, 448 | { 449 | "strings": [ 450 | "؛", 451 | ";" 452 | ] 453 | }, 454 | { 455 | "strings": [ 456 | "!", 457 | "¡" 458 | ] 459 | }, 460 | { 461 | "strings": [ 462 | "؟", 463 | "?" 464 | ] 465 | }, 466 | { 467 | "action": "levelSwitch", 468 | "label": "=/<", 469 | "level": 3, 470 | "width": 3 471 | } 472 | ], 473 | [ 474 | { 475 | "action": "levelSwitch", 476 | "label": "ABC", 477 | "level": 0, 478 | "width": 1.5 479 | }, 480 | { 481 | "strings": [ 482 | "_" 483 | ] 484 | }, 485 | { 486 | "strings": [ 487 | "/" 488 | ] 489 | }, 490 | { 491 | "strings": [ 492 | " " 493 | ], 494 | "width": 3 495 | }, 496 | { 497 | "strings": [ 498 | "،", 499 | ":", 500 | "!", 501 | "؟", 502 | "؛", 503 | "-", 504 | "/", 505 | "»", 506 | "«" 507 | ] 508 | }, 509 | { 510 | "strings": [ 511 | ".", 512 | "ٕ", 513 | "ٔ", 514 | "ْ", 515 | "ٍ", 516 | "ٌ", 517 | "ً", 518 | "ّ", 519 | "ٖ", 520 | "ٰ", 521 | "ٓ", 522 | "ِ", 523 | "ُ", 524 | "َ", 525 | "ـ" 526 | ] 527 | }, 528 | { 529 | "action": "emoji", 530 | "iconName": "face-smile-symbolic" 531 | }, 532 | { 533 | "action": "languageMenu", 534 | "iconName": "keyboard-layout-symbolic" 535 | }, 536 | { 537 | "action": "hide", 538 | "iconName": "keyboard-hide-symbolic" 539 | } 540 | ] 541 | ] 542 | }, 543 | { 544 | "level": "opt+shift", 545 | "mode": "locked", 546 | "rows": [ 547 | [ 548 | { 549 | "strings": [ 550 | "~" 551 | ] 552 | }, 553 | { 554 | "strings": [ 555 | "`" 556 | ] 557 | }, 558 | { 559 | "strings": [ 560 | "|" 561 | ] 562 | }, 563 | { 564 | "strings": [ 565 | "•", 566 | "♪" 567 | ] 568 | }, 569 | { 570 | "strings": [ 571 | "√" 572 | ] 573 | }, 574 | { 575 | "strings": [ 576 | "Π", 577 | "π" 578 | ] 579 | }, 580 | { 581 | "strings": [ 582 | "÷" 583 | ] 584 | }, 585 | { 586 | "strings": [ 587 | "×" 588 | ] 589 | }, 590 | { 591 | "strings": [ 592 | "¶", 593 | "§" 594 | ] 595 | }, 596 | { 597 | "strings": [ 598 | "∆" 599 | ] 600 | }, 601 | { 602 | "action": "delete", 603 | "iconName": "edit-clear-symbolic", 604 | "width": 1.5 605 | } 606 | ], 607 | [ 608 | { 609 | "strings": [ 610 | "£" 611 | ] 612 | }, 613 | { 614 | "strings": [ 615 | "€" 616 | ] 617 | }, 618 | { 619 | "strings": [ 620 | "$", 621 | "¢" 622 | ] 623 | }, 624 | { 625 | "strings": [ 626 | "¢" 627 | ] 628 | }, 629 | { 630 | "strings": [ 631 | "^", 632 | "↑", 633 | "↓", 634 | "←", 635 | "→" 636 | ] 637 | }, 638 | { 639 | "strings": [ 640 | "°", 641 | "′", 642 | "″" 643 | ] 644 | }, 645 | { 646 | "strings": [ 647 | "=", 648 | "≠", 649 | "≈", 650 | "∞" 651 | ] 652 | }, 653 | { 654 | "strings": [ 655 | "{" 656 | ] 657 | }, 658 | { 659 | "strings": [ 660 | "}" 661 | ] 662 | }, 663 | { 664 | "iconName": "keyboard-enter-symbolic", 665 | "keyval": "0xff0d", 666 | "width": 2 667 | } 668 | ], 669 | [ 670 | { 671 | "action": "levelSwitch", 672 | "label": "?123", 673 | "level": 2, 674 | "width": 1.5 675 | }, 676 | { 677 | "strings": [ 678 | "\\" 679 | ] 680 | }, 681 | { 682 | "strings": [ 683 | "©" 684 | ] 685 | }, 686 | { 687 | "strings": [ 688 | "®" 689 | ] 690 | }, 691 | { 692 | "strings": [ 693 | "™" 694 | ] 695 | }, 696 | { 697 | "strings": [ 698 | "℅" 699 | ] 700 | }, 701 | { 702 | "strings": [ 703 | "[" 704 | ] 705 | }, 706 | { 707 | "strings": [ 708 | "]" 709 | ] 710 | }, 711 | { 712 | "action": "levelSwitch", 713 | "label": "?123", 714 | "level": 2, 715 | "width": 3 716 | } 717 | ], 718 | [ 719 | { 720 | "action": "levelSwitch", 721 | "label": "ABC", 722 | "level": 0, 723 | "width": 1.5 724 | }, 725 | { 726 | "strings": [ 727 | "«", 728 | "›", 729 | "≥", 730 | ">" 731 | ] 732 | }, 733 | { 734 | "strings": [ 735 | "»", 736 | "‹", 737 | "≤", 738 | "<" 739 | ] 740 | }, 741 | { 742 | "strings": [ 743 | " " 744 | ], 745 | "width": 3 746 | }, 747 | { 748 | "strings": [ 749 | "،", 750 | ":", 751 | "!", 752 | "؟", 753 | "؛", 754 | "-", 755 | "/", 756 | "»", 757 | "«" 758 | ] 759 | }, 760 | { 761 | "strings": [ 762 | ".", 763 | "ٕ", 764 | "ٔ", 765 | "ْ", 766 | "ٍ", 767 | "ٌ", 768 | "ً", 769 | "ّ", 770 | "ٖ", 771 | "ٰ", 772 | "ٓ", 773 | "ِ", 774 | "ُ", 775 | "َ", 776 | "ـ" 777 | ] 778 | }, 779 | { 780 | "action": "emoji", 781 | "iconName": "face-smile-symbolic" 782 | }, 783 | { 784 | "action": "languageMenu", 785 | "iconName": "keyboard-layout-symbolic" 786 | }, 787 | { 788 | "action": "hide", 789 | "iconName": "keyboard-hide-symbolic" 790 | } 791 | ] 792 | ] 793 | } 794 | ], 795 | "locale": "fa", 796 | "name": "Persian" 797 | } -------------------------------------------------------------------------------- /src/data/osk-layouts/la.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "ຢ", 11 | "໑" 12 | ] 13 | }, 14 | { 15 | "strings": [ 16 | "ຟ", 17 | "໒" 18 | ] 19 | }, 20 | { 21 | "strings": [ 22 | "ໂ", 23 | "໓" 24 | ] 25 | }, 26 | { 27 | "strings": [ 28 | "ຖ", 29 | "໔" 30 | ] 31 | }, 32 | { 33 | "strings": [ 34 | "ຸ" 35 | ] 36 | }, 37 | { 38 | "strings": [ 39 | "ູ" 40 | ] 41 | }, 42 | { 43 | "strings": [ 44 | "ຄ", 45 | "໕" 46 | ] 47 | }, 48 | { 49 | "strings": [ 50 | "ຕ", 51 | "໖" 52 | ] 53 | }, 54 | { 55 | "strings": [ 56 | "ຈ", 57 | "໗" 58 | ] 59 | }, 60 | { 61 | "strings": [ 62 | "ຂ", 63 | "໘" 64 | ] 65 | }, 66 | { 67 | "strings": [ 68 | "ຊ", 69 | "໙" 70 | ] 71 | }, 72 | { 73 | "strings": [ 74 | "ໍ" 75 | ] 76 | }, 77 | { 78 | "action": "delete", 79 | "iconName": "edit-clear-symbolic", 80 | "width": 1.5 81 | } 82 | ], 83 | [ 84 | { 85 | "strings": [ 86 | "ົ" 87 | ] 88 | }, 89 | { 90 | "strings": [ 91 | "ໄ", 92 | "໐" 93 | ] 94 | }, 95 | { 96 | "strings": [ 97 | "ຳ" 98 | ] 99 | }, 100 | { 101 | "strings": [ 102 | "ພ" 103 | ] 104 | }, 105 | { 106 | "strings": [ 107 | "ະ" 108 | ] 109 | }, 110 | { 111 | "strings": [ 112 | "ິ" 113 | ] 114 | }, 115 | { 116 | "strings": [ 117 | "ີ" 118 | ] 119 | }, 120 | { 121 | "strings": [ 122 | "ຮ" 123 | ] 124 | }, 125 | { 126 | "strings": [ 127 | "ນ" 128 | ] 129 | }, 130 | { 131 | "strings": [ 132 | "ຍ" 133 | ] 134 | }, 135 | { 136 | "strings": [ 137 | "ບ" 138 | ] 139 | }, 140 | { 141 | "strings": [ 142 | "ລ" 143 | ] 144 | }, 145 | { 146 | "iconName": "keyboard-enter-symbolic", 147 | "keyval": "0xff0d", 148 | "width": 1.5 149 | } 150 | ], 151 | [ 152 | { 153 | "strings": [ 154 | "ັ" 155 | ] 156 | }, 157 | { 158 | "strings": [ 159 | "ຫ" 160 | ] 161 | }, 162 | { 163 | "strings": [ 164 | "ກ" 165 | ] 166 | }, 167 | { 168 | "strings": [ 169 | "ດ" 170 | ] 171 | }, 172 | { 173 | "strings": [ 174 | "ເ" 175 | ] 176 | }, 177 | { 178 | "strings": [ 179 | "້" 180 | ] 181 | }, 182 | { 183 | "strings": [ 184 | "່" 185 | ] 186 | }, 187 | { 188 | "strings": [ 189 | "າ" 190 | ] 191 | }, 192 | { 193 | "strings": [ 194 | "ສ" 195 | ] 196 | }, 197 | { 198 | "strings": [ 199 | "ວ" 200 | ] 201 | }, 202 | { 203 | "strings": [ 204 | "ງ" 205 | ] 206 | }, 207 | { 208 | "strings": [ 209 | "“" 210 | ] 211 | } 212 | ], 213 | [ 214 | { 215 | "strings": [ 216 | "ຜ" 217 | ] 218 | }, 219 | { 220 | "strings": [ 221 | "ປ" 222 | ] 223 | }, 224 | { 225 | "strings": [ 226 | "ແ" 227 | ] 228 | }, 229 | { 230 | "strings": [ 231 | "ອ" 232 | ] 233 | }, 234 | { 235 | "strings": [ 236 | "ຶ" 237 | ] 238 | }, 239 | { 240 | "strings": [ 241 | "ື" 242 | ] 243 | }, 244 | { 245 | "strings": [ 246 | "ທ" 247 | ] 248 | }, 249 | { 250 | "strings": [ 251 | "ມ" 252 | ] 253 | }, 254 | { 255 | "strings": [ 256 | "ໃ" 257 | ] 258 | }, 259 | { 260 | "strings": [ 261 | "ຝ" 262 | ] 263 | }, 264 | { 265 | "strings": [ 266 | "," 267 | ] 268 | }, 269 | { 270 | "strings": [ 271 | ".", 272 | "#", 273 | "!", 274 | ",", 275 | "?", 276 | "-", 277 | ":", 278 | "'", 279 | "@" 280 | ] 281 | } 282 | ], 283 | [ 284 | { 285 | "action": "levelSwitch", 286 | "label": "?123", 287 | "level": 2, 288 | "width": 1.5 289 | }, 290 | { 291 | "action": "emoji", 292 | "iconName": "face-smile-symbolic", 293 | "width": 1.5 294 | }, 295 | { 296 | "strings": [ 297 | " " 298 | ], 299 | "width": 7 300 | }, 301 | { 302 | "action": "languageMenu", 303 | "iconName": "keyboard-layout-symbolic", 304 | "width": 1.5 305 | }, 306 | { 307 | "action": "hide", 308 | "iconName": "keyboard-hide-symbolic", 309 | "width": 2 310 | } 311 | ] 312 | ] 313 | }, 314 | { 315 | "level": "opt", 316 | "mode": "locked", 317 | "rows": [ 318 | [ 319 | { 320 | "strings": [ 321 | "1", 322 | "¹", 323 | "½", 324 | "⅓", 325 | "¼", 326 | "⅛" 327 | ] 328 | }, 329 | { 330 | "strings": [ 331 | "2", 332 | "²", 333 | "⅔" 334 | ] 335 | }, 336 | { 337 | "strings": [ 338 | "3", 339 | "³", 340 | "¾", 341 | "⅜" 342 | ] 343 | }, 344 | { 345 | "strings": [ 346 | "4", 347 | "⁴" 348 | ] 349 | }, 350 | { 351 | "strings": [ 352 | "5", 353 | "⅝" 354 | ] 355 | }, 356 | { 357 | "strings": [ 358 | "6" 359 | ] 360 | }, 361 | { 362 | "strings": [ 363 | "7", 364 | "⅞" 365 | ] 366 | }, 367 | { 368 | "strings": [ 369 | "8" 370 | ] 371 | }, 372 | { 373 | "strings": [ 374 | "9" 375 | ] 376 | }, 377 | { 378 | "strings": [ 379 | "0", 380 | "ⁿ", 381 | "∅" 382 | ] 383 | }, 384 | { 385 | "action": "delete", 386 | "iconName": "edit-clear-symbolic", 387 | "width": 1.5 388 | } 389 | ], 390 | [ 391 | { 392 | "strings": [ 393 | "@" 394 | ] 395 | }, 396 | { 397 | "strings": [ 398 | "#" 399 | ] 400 | }, 401 | { 402 | "strings": [ 403 | "₭", 404 | "$", 405 | "¢", 406 | "€", 407 | "£", 408 | "¥", 409 | "₱" 410 | ] 411 | }, 412 | { 413 | "strings": [ 414 | "%", 415 | "‰" 416 | ] 417 | }, 418 | { 419 | "strings": [ 420 | "&" 421 | ] 422 | }, 423 | { 424 | "strings": [ 425 | "-", 426 | "_", 427 | "–", 428 | "—", 429 | "·" 430 | ] 431 | }, 432 | { 433 | "strings": [ 434 | "+", 435 | "±" 436 | ] 437 | }, 438 | { 439 | "strings": [ 440 | "(", 441 | "<", 442 | "{", 443 | "[" 444 | ] 445 | }, 446 | { 447 | "strings": [ 448 | ")", 449 | ">", 450 | "}", 451 | "]" 452 | ] 453 | }, 454 | { 455 | "iconName": "keyboard-enter-symbolic", 456 | "keyval": "0xff0d", 457 | "width": 2 458 | } 459 | ], 460 | [ 461 | { 462 | "action": "levelSwitch", 463 | "label": "=/<", 464 | "level": 3, 465 | "width": 1.5 466 | }, 467 | { 468 | "strings": [ 469 | "*", 470 | "†", 471 | "‡", 472 | "★" 473 | ] 474 | }, 475 | { 476 | "strings": [ 477 | "\"", 478 | "“", 479 | "”", 480 | "«", 481 | "»" 482 | ] 483 | }, 484 | { 485 | "strings": [ 486 | "'", 487 | "‘", 488 | "’", 489 | "‹", 490 | "›" 491 | ] 492 | }, 493 | { 494 | "strings": [ 495 | ":" 496 | ] 497 | }, 498 | { 499 | "strings": [ 500 | ";" 501 | ] 502 | }, 503 | { 504 | "strings": [ 505 | "!", 506 | "¡" 507 | ] 508 | }, 509 | { 510 | "strings": [ 511 | "?", 512 | "¿" 513 | ] 514 | }, 515 | { 516 | "action": "levelSwitch", 517 | "label": "=/<", 518 | "level": 3, 519 | "width": 3 520 | } 521 | ], 522 | [ 523 | { 524 | "action": "levelSwitch", 525 | "label": "ABC", 526 | "level": 0, 527 | "width": 1.5 528 | }, 529 | { 530 | "strings": [ 531 | "_" 532 | ] 533 | }, 534 | { 535 | "strings": [ 536 | "/" 537 | ] 538 | }, 539 | { 540 | "strings": [ 541 | " " 542 | ], 543 | "width": 3 544 | }, 545 | { 546 | "strings": [ 547 | "," 548 | ] 549 | }, 550 | { 551 | "strings": [ 552 | ".", 553 | "…" 554 | ] 555 | }, 556 | { 557 | "action": "emoji", 558 | "iconName": "face-smile-symbolic" 559 | }, 560 | { 561 | "action": "languageMenu", 562 | "iconName": "keyboard-layout-symbolic" 563 | }, 564 | { 565 | "action": "hide", 566 | "iconName": "keyboard-hide-symbolic" 567 | } 568 | ] 569 | ] 570 | }, 571 | { 572 | "level": "opt+shift", 573 | "mode": "locked", 574 | "rows": [ 575 | [ 576 | { 577 | "strings": [ 578 | "~" 579 | ] 580 | }, 581 | { 582 | "strings": [ 583 | "`" 584 | ] 585 | }, 586 | { 587 | "strings": [ 588 | "|" 589 | ] 590 | }, 591 | { 592 | "strings": [ 593 | "•", 594 | "♪", 595 | "♥", 596 | "♠", 597 | "♦", 598 | "♣" 599 | ] 600 | }, 601 | { 602 | "strings": [ 603 | "√" 604 | ] 605 | }, 606 | { 607 | "strings": [ 608 | "Π", 609 | "π" 610 | ] 611 | }, 612 | { 613 | "strings": [ 614 | "÷" 615 | ] 616 | }, 617 | { 618 | "strings": [ 619 | "×" 620 | ] 621 | }, 622 | { 623 | "strings": [ 624 | "¶", 625 | "§" 626 | ] 627 | }, 628 | { 629 | "strings": [ 630 | "∆" 631 | ] 632 | }, 633 | { 634 | "action": "delete", 635 | "iconName": "edit-clear-symbolic", 636 | "width": 1.5 637 | } 638 | ], 639 | [ 640 | { 641 | "strings": [ 642 | "£" 643 | ] 644 | }, 645 | { 646 | "strings": [ 647 | "€" 648 | ] 649 | }, 650 | { 651 | "strings": [ 652 | "$", 653 | "¢" 654 | ] 655 | }, 656 | { 657 | "strings": [ 658 | "¢" 659 | ] 660 | }, 661 | { 662 | "strings": [ 663 | "^", 664 | "↑", 665 | "↓", 666 | "←", 667 | "→" 668 | ] 669 | }, 670 | { 671 | "strings": [ 672 | "°", 673 | "′", 674 | "″" 675 | ] 676 | }, 677 | { 678 | "strings": [ 679 | "=", 680 | "≠", 681 | "≈", 682 | "∞" 683 | ] 684 | }, 685 | { 686 | "strings": [ 687 | "{" 688 | ] 689 | }, 690 | { 691 | "strings": [ 692 | "}" 693 | ] 694 | }, 695 | { 696 | "iconName": "keyboard-enter-symbolic", 697 | "keyval": "0xff0d", 698 | "width": 2 699 | } 700 | ], 701 | [ 702 | { 703 | "action": "levelSwitch", 704 | "label": "?123", 705 | "level": 2, 706 | "width": 1.5 707 | }, 708 | { 709 | "strings": [ 710 | "\\" 711 | ] 712 | }, 713 | { 714 | "strings": [ 715 | "©" 716 | ] 717 | }, 718 | { 719 | "strings": [ 720 | "®" 721 | ] 722 | }, 723 | { 724 | "strings": [ 725 | "™" 726 | ] 727 | }, 728 | { 729 | "strings": [ 730 | "℅" 731 | ] 732 | }, 733 | { 734 | "strings": [ 735 | "[" 736 | ] 737 | }, 738 | { 739 | "strings": [ 740 | "]" 741 | ] 742 | }, 743 | { 744 | "action": "levelSwitch", 745 | "label": "?123", 746 | "level": 2, 747 | "width": 3 748 | } 749 | ], 750 | [ 751 | { 752 | "action": "levelSwitch", 753 | "label": "ABC", 754 | "level": 0, 755 | "width": 1.5 756 | }, 757 | { 758 | "strings": [ 759 | "<", 760 | "‹", 761 | "≤", 762 | "«" 763 | ] 764 | }, 765 | { 766 | "strings": [ 767 | ">", 768 | "›", 769 | "≥", 770 | "»" 771 | ] 772 | }, 773 | { 774 | "strings": [ 775 | " " 776 | ], 777 | "width": 3 778 | }, 779 | { 780 | "strings": [ 781 | "," 782 | ] 783 | }, 784 | { 785 | "strings": [ 786 | ".", 787 | "…" 788 | ] 789 | }, 790 | { 791 | "action": "emoji", 792 | "iconName": "face-smile-symbolic" 793 | }, 794 | { 795 | "action": "languageMenu", 796 | "iconName": "keyboard-layout-symbolic" 797 | }, 798 | { 799 | "action": "hide", 800 | "iconName": "keyboard-hide-symbolic" 801 | } 802 | ] 803 | ] 804 | } 805 | ], 806 | "locale": "lo", 807 | "name": "Lao" 808 | } 809 | -------------------------------------------------------------------------------- /src/data/osk-layouts/kh.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "១", 11 | "៱" 12 | ] 13 | }, 14 | { 15 | "strings": [ 16 | "២", 17 | "៲" 18 | ] 19 | }, 20 | { 21 | "strings": [ 22 | "៣", 23 | "៳" 24 | ] 25 | }, 26 | { 27 | "strings": [ 28 | "៤", 29 | "៴" 30 | ] 31 | }, 32 | { 33 | "strings": [ 34 | "៥", 35 | "៵" 36 | ] 37 | }, 38 | { 39 | "strings": [ 40 | "៦", 41 | "៶" 42 | ] 43 | }, 44 | { 45 | "strings": [ 46 | "៧", 47 | "៷" 48 | ] 49 | }, 50 | { 51 | "strings": [ 52 | "៨", 53 | "៸" 54 | ] 55 | }, 56 | { 57 | "strings": [ 58 | "៩", 59 | "៹" 60 | ] 61 | }, 62 | { 63 | "strings": [ 64 | "០", 65 | "៰" 66 | ] 67 | }, 68 | { 69 | "strings": [ 70 | "ឥ", 71 | "", 72 | "ឦ" 73 | ] 74 | }, 75 | { 76 | "strings": [ 77 | "ឲ", 78 | "ឱ" 79 | ] 80 | }, 81 | { 82 | "action": "delete", 83 | "iconName": "edit-clear-symbolic", 84 | "width": 1.5 85 | } 86 | ], 87 | [ 88 | { 89 | "strings": [ 90 | "ឆ" 91 | ] 92 | }, 93 | { 94 | "strings": [ 95 | "ឹ" 96 | ] 97 | }, 98 | { 99 | "strings": [ 100 | "េ" 101 | ] 102 | }, 103 | { 104 | "strings": [ 105 | "រ" 106 | ] 107 | }, 108 | { 109 | "strings": [ 110 | "ត" 111 | ] 112 | }, 113 | { 114 | "strings": [ 115 | "យ" 116 | ] 117 | }, 118 | { 119 | "strings": [ 120 | "ុ" 121 | ] 122 | }, 123 | { 124 | "strings": [ 125 | "ិ" 126 | ] 127 | }, 128 | { 129 | "strings": [ 130 | "ោ" 131 | ] 132 | }, 133 | { 134 | "strings": [ 135 | "ផ" 136 | ] 137 | }, 138 | { 139 | "strings": [ 140 | "ៀ" 141 | ] 142 | }, 143 | { 144 | "strings": [ 145 | "ឪ", 146 | "ឧ", 147 | "ឱ", 148 | "ឳ", 149 | "ឩ", 150 | "ឨ" 151 | ] 152 | }, 153 | { 154 | "iconName": "keyboard-enter-symbolic", 155 | "keyval": "0xff0d", 156 | "width": 1.5 157 | } 158 | ], 159 | [ 160 | { 161 | "strings": [ 162 | "ា" 163 | ] 164 | }, 165 | { 166 | "strings": [ 167 | "ស" 168 | ] 169 | }, 170 | { 171 | "strings": [ 172 | "ដ" 173 | ] 174 | }, 175 | { 176 | "strings": [ 177 | "ថ" 178 | ] 179 | }, 180 | { 181 | "strings": [ 182 | "ង" 183 | ] 184 | }, 185 | { 186 | "strings": [ 187 | "ហ" 188 | ] 189 | }, 190 | { 191 | "strings": [ 192 | "្" 193 | ] 194 | }, 195 | { 196 | "strings": [ 197 | "ក" 198 | ] 199 | }, 200 | { 201 | "strings": [ 202 | "ល" 203 | ] 204 | }, 205 | { 206 | "strings": [ 207 | "ើ" 208 | ] 209 | }, 210 | { 211 | "strings": [ 212 | "់" 213 | ] 214 | }, 215 | { 216 | "strings": [ 217 | "ឮ", 218 | "ឭ", 219 | "ឰ" 220 | ] 221 | } 222 | ], 223 | [ 224 | { 225 | "strings": [ 226 | "ឋ" 227 | ] 228 | }, 229 | { 230 | "strings": [ 231 | "ខ" 232 | ] 233 | }, 234 | { 235 | "strings": [ 236 | "ច" 237 | ] 238 | }, 239 | { 240 | "strings": [ 241 | "វ" 242 | ] 243 | }, 244 | { 245 | "strings": [ 246 | "ប" 247 | ] 248 | }, 249 | { 250 | "strings": [ 251 | "ន" 252 | ] 253 | }, 254 | { 255 | "strings": [ 256 | "ម" 257 | ] 258 | }, 259 | { 260 | "strings": [ 261 | "ុំ" 262 | ] 263 | }, 264 | { 265 | "strings": [ 266 | "។" 267 | ] 268 | }, 269 | { 270 | "strings": [ 271 | "៊" 272 | ] 273 | }, 274 | { 275 | "strings": [ 276 | "," 277 | ] 278 | }, 279 | { 280 | "strings": [ 281 | ".", 282 | "#", 283 | "!", 284 | ",", 285 | "?", 286 | "-", 287 | ":", 288 | "'", 289 | "@" 290 | ] 291 | } 292 | ], 293 | [ 294 | { 295 | "action": "levelSwitch", 296 | "label": "?123", 297 | "level": 2, 298 | "width": 1.5 299 | }, 300 | { 301 | "action": "emoji", 302 | "iconName": "face-smile-symbolic", 303 | "width": 1.5 304 | }, 305 | { 306 | "strings": [ 307 | " " 308 | ], 309 | "width": 7 310 | }, 311 | { 312 | "action": "languageMenu", 313 | "iconName": "keyboard-layout-symbolic", 314 | "width": 1.5 315 | }, 316 | { 317 | "action": "hide", 318 | "iconName": "keyboard-hide-symbolic", 319 | "width": 2 320 | } 321 | ] 322 | ] 323 | }, 324 | { 325 | "level": "opt", 326 | "mode": "locked", 327 | "rows": [ 328 | [ 329 | { 330 | "strings": [ 331 | "1", 332 | "¹", 333 | "½", 334 | "⅓", 335 | "¼", 336 | "⅛" 337 | ] 338 | }, 339 | { 340 | "strings": [ 341 | "2", 342 | "²", 343 | "⅔" 344 | ] 345 | }, 346 | { 347 | "strings": [ 348 | "3", 349 | "³", 350 | "¾", 351 | "⅜" 352 | ] 353 | }, 354 | { 355 | "strings": [ 356 | "4", 357 | "⁴" 358 | ] 359 | }, 360 | { 361 | "strings": [ 362 | "5", 363 | "⅝" 364 | ] 365 | }, 366 | { 367 | "strings": [ 368 | "6" 369 | ] 370 | }, 371 | { 372 | "strings": [ 373 | "7", 374 | "⅞" 375 | ] 376 | }, 377 | { 378 | "strings": [ 379 | "8" 380 | ] 381 | }, 382 | { 383 | "strings": [ 384 | "9" 385 | ] 386 | }, 387 | { 388 | "strings": [ 389 | "0", 390 | "ⁿ", 391 | "∅" 392 | ] 393 | }, 394 | { 395 | "action": "delete", 396 | "iconName": "edit-clear-symbolic", 397 | "width": 1.5 398 | } 399 | ], 400 | [ 401 | { 402 | "strings": [ 403 | "@" 404 | ] 405 | }, 406 | { 407 | "strings": [ 408 | "#" 409 | ] 410 | }, 411 | { 412 | "strings": [ 413 | "$", 414 | "៛", 415 | "¢", 416 | "£", 417 | "€", 418 | "¥", 419 | "₱" 420 | ] 421 | }, 422 | { 423 | "strings": [ 424 | "%", 425 | "‰" 426 | ] 427 | }, 428 | { 429 | "strings": [ 430 | "&" 431 | ] 432 | }, 433 | { 434 | "strings": [ 435 | "-", 436 | "_", 437 | "–", 438 | "—", 439 | "·" 440 | ] 441 | }, 442 | { 443 | "strings": [ 444 | "+", 445 | "±" 446 | ] 447 | }, 448 | { 449 | "strings": [ 450 | "(", 451 | "<", 452 | "{", 453 | "[" 454 | ] 455 | }, 456 | { 457 | "strings": [ 458 | ")", 459 | ">", 460 | "}", 461 | "]" 462 | ] 463 | }, 464 | { 465 | "iconName": "keyboard-enter-symbolic", 466 | "keyval": "0xff0d", 467 | "width": 2 468 | } 469 | ], 470 | [ 471 | { 472 | "action": "levelSwitch", 473 | "label": "=/<", 474 | "level": 3, 475 | "width": 1.5 476 | }, 477 | { 478 | "strings": [ 479 | "*", 480 | "†", 481 | "‡", 482 | "★" 483 | ] 484 | }, 485 | { 486 | "strings": [ 487 | "\"", 488 | "“", 489 | "”", 490 | "«", 491 | "»" 492 | ] 493 | }, 494 | { 495 | "strings": [ 496 | "'", 497 | "‘", 498 | "’", 499 | "‹", 500 | "›" 501 | ] 502 | }, 503 | { 504 | "strings": [ 505 | ":" 506 | ] 507 | }, 508 | { 509 | "strings": [ 510 | ";" 511 | ] 512 | }, 513 | { 514 | "strings": [ 515 | "!", 516 | "¡" 517 | ] 518 | }, 519 | { 520 | "strings": [ 521 | "?", 522 | "¿" 523 | ] 524 | }, 525 | { 526 | "action": "levelSwitch", 527 | "label": "=/<", 528 | "level": 3, 529 | "width": 3 530 | } 531 | ], 532 | [ 533 | { 534 | "action": "levelSwitch", 535 | "label": "ABC", 536 | "level": 0, 537 | "width": 1.5 538 | }, 539 | { 540 | "strings": [ 541 | "_" 542 | ] 543 | }, 544 | { 545 | "strings": [ 546 | "/" 547 | ] 548 | }, 549 | { 550 | "strings": [ 551 | " " 552 | ], 553 | "width": 3 554 | }, 555 | { 556 | "strings": [ 557 | "," 558 | ] 559 | }, 560 | { 561 | "strings": [ 562 | ".", 563 | "…" 564 | ] 565 | }, 566 | { 567 | "action": "emoji", 568 | "iconName": "face-smile-symbolic" 569 | }, 570 | { 571 | "action": "languageMenu", 572 | "iconName": "keyboard-layout-symbolic" 573 | }, 574 | { 575 | "action": "hide", 576 | "iconName": "keyboard-hide-symbolic" 577 | } 578 | ] 579 | ] 580 | }, 581 | { 582 | "level": "opt+shift", 583 | "mode": "locked", 584 | "rows": [ 585 | [ 586 | { 587 | "strings": [ 588 | "~" 589 | ] 590 | }, 591 | { 592 | "strings": [ 593 | "`" 594 | ] 595 | }, 596 | { 597 | "strings": [ 598 | "|" 599 | ] 600 | }, 601 | { 602 | "strings": [ 603 | "•", 604 | "♪", 605 | "♥", 606 | "♠", 607 | "♦", 608 | "♣" 609 | ] 610 | }, 611 | { 612 | "strings": [ 613 | "√" 614 | ] 615 | }, 616 | { 617 | "strings": [ 618 | "Π", 619 | "π" 620 | ] 621 | }, 622 | { 623 | "strings": [ 624 | "÷" 625 | ] 626 | }, 627 | { 628 | "strings": [ 629 | "×" 630 | ] 631 | }, 632 | { 633 | "strings": [ 634 | "¶", 635 | "§" 636 | ] 637 | }, 638 | { 639 | "strings": [ 640 | "∆" 641 | ] 642 | }, 643 | { 644 | "action": "delete", 645 | "iconName": "edit-clear-symbolic", 646 | "width": 1.5 647 | } 648 | ], 649 | [ 650 | { 651 | "strings": [ 652 | "£" 653 | ] 654 | }, 655 | { 656 | "strings": [ 657 | "¢" 658 | ] 659 | }, 660 | { 661 | "strings": [ 662 | "€" 663 | ] 664 | }, 665 | { 666 | "strings": [ 667 | "¥" 668 | ] 669 | }, 670 | { 671 | "strings": [ 672 | "^", 673 | "↑", 674 | "↓", 675 | "←", 676 | "→" 677 | ] 678 | }, 679 | { 680 | "strings": [ 681 | "°", 682 | "′", 683 | "″" 684 | ] 685 | }, 686 | { 687 | "strings": [ 688 | "=", 689 | "≠", 690 | "≈", 691 | "∞" 692 | ] 693 | }, 694 | { 695 | "strings": [ 696 | "{" 697 | ] 698 | }, 699 | { 700 | "strings": [ 701 | "}" 702 | ] 703 | }, 704 | { 705 | "iconName": "keyboard-enter-symbolic", 706 | "keyval": "0xff0d", 707 | "width": 2 708 | } 709 | ], 710 | [ 711 | { 712 | "action": "levelSwitch", 713 | "label": "?123", 714 | "level": 2, 715 | "width": 1.5 716 | }, 717 | { 718 | "strings": [ 719 | "\\" 720 | ] 721 | }, 722 | { 723 | "strings": [ 724 | "©" 725 | ] 726 | }, 727 | { 728 | "strings": [ 729 | "®" 730 | ] 731 | }, 732 | { 733 | "strings": [ 734 | "™" 735 | ] 736 | }, 737 | { 738 | "strings": [ 739 | "℅" 740 | ] 741 | }, 742 | { 743 | "strings": [ 744 | "[" 745 | ] 746 | }, 747 | { 748 | "strings": [ 749 | "]" 750 | ] 751 | }, 752 | { 753 | "action": "levelSwitch", 754 | "label": "?123", 755 | "level": 2, 756 | "width": 3 757 | } 758 | ], 759 | [ 760 | { 761 | "action": "levelSwitch", 762 | "label": "ABC", 763 | "level": 0, 764 | "width": 1.5 765 | }, 766 | { 767 | "strings": [ 768 | "<", 769 | "‹", 770 | "≤", 771 | "«" 772 | ] 773 | }, 774 | { 775 | "strings": [ 776 | ">", 777 | "›", 778 | "≥", 779 | "»" 780 | ] 781 | }, 782 | { 783 | "strings": [ 784 | " " 785 | ], 786 | "width": 3 787 | }, 788 | { 789 | "strings": [ 790 | "," 791 | ] 792 | }, 793 | { 794 | "strings": [ 795 | ".", 796 | "…" 797 | ] 798 | }, 799 | { 800 | "action": "emoji", 801 | "iconName": "face-smile-symbolic" 802 | }, 803 | { 804 | "action": "languageMenu", 805 | "iconName": "keyboard-layout-symbolic" 806 | }, 807 | { 808 | "action": "hide", 809 | "iconName": "keyboard-hide-symbolic" 810 | } 811 | ] 812 | ] 813 | } 814 | ], 815 | "locale": "km", 816 | "name": "Khmer" 817 | } 818 | -------------------------------------------------------------------------------- /src/data/osk-layouts/my.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "q" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "w" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "e" 21 | ] 22 | }, 23 | { 24 | "strings": [ 25 | "r" 26 | ] 27 | }, 28 | { 29 | "strings": [ 30 | "t" 31 | ] 32 | }, 33 | { 34 | "strings": [ 35 | "y" 36 | ] 37 | }, 38 | { 39 | "strings": [ 40 | "u" 41 | ] 42 | }, 43 | { 44 | "strings": [ 45 | "i" 46 | ] 47 | }, 48 | { 49 | "strings": [ 50 | "o" 51 | ] 52 | }, 53 | { 54 | "strings": [ 55 | "p" 56 | ] 57 | }, 58 | { 59 | "action": "delete", 60 | "iconName": "edit-clear-symbolic", 61 | "width": 1.5 62 | } 63 | ], 64 | [ 65 | { 66 | "strings": [ 67 | "a" 68 | ] 69 | }, 70 | { 71 | "strings": [ 72 | "s" 73 | ] 74 | }, 75 | { 76 | "strings": [ 77 | "d" 78 | ] 79 | }, 80 | { 81 | "strings": [ 82 | "f" 83 | ] 84 | }, 85 | { 86 | "strings": [ 87 | "g" 88 | ] 89 | }, 90 | { 91 | "strings": [ 92 | "h" 93 | ] 94 | }, 95 | { 96 | "strings": [ 97 | "j" 98 | ] 99 | }, 100 | { 101 | "strings": [ 102 | "k" 103 | ] 104 | }, 105 | { 106 | "strings": [ 107 | "l" 108 | ] 109 | }, 110 | { 111 | "iconName": "keyboard-enter-symbolic", 112 | "keyval": "0xff0d", 113 | "width": 2 114 | } 115 | ], 116 | [ 117 | { 118 | "action": "modifier", 119 | "keyval": "0xffe1", 120 | "iconName": "keyboard-shift-symbolic", 121 | "level": 1 122 | }, 123 | { 124 | "strings": [ 125 | "z" 126 | ] 127 | }, 128 | { 129 | "strings": [ 130 | "x" 131 | ] 132 | }, 133 | { 134 | "strings": [ 135 | "c" 136 | ] 137 | }, 138 | { 139 | "strings": [ 140 | "v" 141 | ] 142 | }, 143 | { 144 | "strings": [ 145 | "b" 146 | ] 147 | }, 148 | { 149 | "strings": [ 150 | "n" 151 | ] 152 | }, 153 | { 154 | "strings": [ 155 | "m" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "," 161 | ] 162 | }, 163 | { 164 | "strings": [ 165 | ".", 166 | "#", 167 | "!", 168 | ",", 169 | "?", 170 | "-", 171 | ":", 172 | "'", 173 | "@" 174 | ] 175 | }, 176 | { 177 | "action": "modifier", 178 | "keyval": "0xffe1", 179 | "iconName": "keyboard-shift-symbolic", 180 | "level": 1, 181 | "width": 1.5 182 | } 183 | ], 184 | [ 185 | { 186 | "action": "levelSwitch", 187 | "label": "?123", 188 | "level": 2, 189 | "width": 1.5 190 | }, 191 | { 192 | "action": "emoji", 193 | "iconName": "face-smile-symbolic", 194 | "width": 1.5 195 | }, 196 | { 197 | "strings": [ 198 | " " 199 | ], 200 | "width": 5 201 | }, 202 | { 203 | "action": "languageMenu", 204 | "iconName": "keyboard-layout-symbolic", 205 | "width": 1.5 206 | }, 207 | { 208 | "action": "hide", 209 | "iconName": "keyboard-hide-symbolic", 210 | "width": 2 211 | } 212 | ] 213 | ] 214 | }, 215 | { 216 | "level": "shift", 217 | "mode": "latched", 218 | "rows": [ 219 | [ 220 | { 221 | "strings": [ 222 | "Q" 223 | ] 224 | }, 225 | { 226 | "strings": [ 227 | "W" 228 | ] 229 | }, 230 | { 231 | "strings": [ 232 | "E" 233 | ] 234 | }, 235 | { 236 | "strings": [ 237 | "R" 238 | ] 239 | }, 240 | { 241 | "strings": [ 242 | "T" 243 | ] 244 | }, 245 | { 246 | "strings": [ 247 | "Y" 248 | ] 249 | }, 250 | { 251 | "strings": [ 252 | "U" 253 | ] 254 | }, 255 | { 256 | "strings": [ 257 | "I" 258 | ] 259 | }, 260 | { 261 | "strings": [ 262 | "O" 263 | ] 264 | }, 265 | { 266 | "strings": [ 267 | "P" 268 | ] 269 | }, 270 | { 271 | "action": "delete", 272 | "iconName": "edit-clear-symbolic", 273 | "width": 1.5 274 | } 275 | ], 276 | [ 277 | { 278 | "strings": [ 279 | "A" 280 | ] 281 | }, 282 | { 283 | "strings": [ 284 | "S" 285 | ] 286 | }, 287 | { 288 | "strings": [ 289 | "D" 290 | ] 291 | }, 292 | { 293 | "strings": [ 294 | "F" 295 | ] 296 | }, 297 | { 298 | "strings": [ 299 | "G" 300 | ] 301 | }, 302 | { 303 | "strings": [ 304 | "H" 305 | ] 306 | }, 307 | { 308 | "strings": [ 309 | "J" 310 | ] 311 | }, 312 | { 313 | "strings": [ 314 | "K" 315 | ] 316 | }, 317 | { 318 | "strings": [ 319 | "L" 320 | ] 321 | }, 322 | { 323 | "iconName": "keyboard-enter-symbolic", 324 | "keyval": "0xff0d", 325 | "width": 2 326 | } 327 | ], 328 | [ 329 | { 330 | "action": "modifier", 331 | "keyval": "0xffe1", 332 | "iconName": "keyboard-shift-symbolic", 333 | "level": 0 334 | }, 335 | { 336 | "strings": [ 337 | "Z" 338 | ] 339 | }, 340 | { 341 | "strings": [ 342 | "X" 343 | ] 344 | }, 345 | { 346 | "strings": [ 347 | "C" 348 | ] 349 | }, 350 | { 351 | "strings": [ 352 | "V" 353 | ] 354 | }, 355 | { 356 | "strings": [ 357 | "B" 358 | ] 359 | }, 360 | { 361 | "strings": [ 362 | "N" 363 | ] 364 | }, 365 | { 366 | "strings": [ 367 | "M" 368 | ] 369 | }, 370 | { 371 | "strings": [ 372 | "," 373 | ] 374 | }, 375 | { 376 | "strings": [ 377 | ".", 378 | "#", 379 | "!", 380 | ",", 381 | "?", 382 | "-", 383 | ":", 384 | "'", 385 | "@" 386 | ] 387 | }, 388 | { 389 | "action": "modifier", 390 | "keyval": "0xffe1", 391 | "iconName": "keyboard-shift-symbolic", 392 | "level": 0, 393 | "width": 1.5 394 | } 395 | ], 396 | [ 397 | { 398 | "action": "levelSwitch", 399 | "label": "?123", 400 | "level": 2, 401 | "width": 1.5 402 | }, 403 | { 404 | "action": "emoji", 405 | "iconName": "face-smile-symbolic", 406 | "width": 1.5 407 | }, 408 | { 409 | "strings": [ 410 | " " 411 | ], 412 | "width": 5 413 | }, 414 | { 415 | "action": "languageMenu", 416 | "iconName": "keyboard-layout-symbolic", 417 | "width": 1.5 418 | }, 419 | { 420 | "action": "hide", 421 | "iconName": "keyboard-hide-symbolic", 422 | "width": 2 423 | } 424 | ] 425 | ] 426 | }, 427 | { 428 | "level": "opt", 429 | "mode": "locked", 430 | "rows": [ 431 | [ 432 | { 433 | "strings": [ 434 | "1", 435 | "¹", 436 | "½", 437 | "⅓", 438 | "¼", 439 | "⅛" 440 | ] 441 | }, 442 | { 443 | "strings": [ 444 | "2", 445 | "²", 446 | "⅔" 447 | ] 448 | }, 449 | { 450 | "strings": [ 451 | "3", 452 | "³", 453 | "¾", 454 | "⅜" 455 | ] 456 | }, 457 | { 458 | "strings": [ 459 | "4", 460 | "⁴" 461 | ] 462 | }, 463 | { 464 | "strings": [ 465 | "5", 466 | "⅝" 467 | ] 468 | }, 469 | { 470 | "strings": [ 471 | "6" 472 | ] 473 | }, 474 | { 475 | "strings": [ 476 | "7", 477 | "⅞" 478 | ] 479 | }, 480 | { 481 | "strings": [ 482 | "8" 483 | ] 484 | }, 485 | { 486 | "strings": [ 487 | "9" 488 | ] 489 | }, 490 | { 491 | "strings": [ 492 | "0", 493 | "ⁿ", 494 | "∅" 495 | ] 496 | }, 497 | { 498 | "action": "delete", 499 | "iconName": "edit-clear-symbolic", 500 | "width": 1.5 501 | } 502 | ], 503 | [ 504 | { 505 | "strings": [ 506 | "@" 507 | ] 508 | }, 509 | { 510 | "strings": [ 511 | "#" 512 | ] 513 | }, 514 | { 515 | "strings": [ 516 | "$", 517 | "¢", 518 | "£", 519 | "€", 520 | "¥", 521 | "₱" 522 | ] 523 | }, 524 | { 525 | "strings": [ 526 | "%", 527 | "‰" 528 | ] 529 | }, 530 | { 531 | "strings": [ 532 | "&" 533 | ] 534 | }, 535 | { 536 | "strings": [ 537 | "-", 538 | "_", 539 | "–", 540 | "—", 541 | "·" 542 | ] 543 | }, 544 | { 545 | "strings": [ 546 | "+", 547 | "±" 548 | ] 549 | }, 550 | { 551 | "strings": [ 552 | "(", 553 | "<", 554 | "{", 555 | "[" 556 | ] 557 | }, 558 | { 559 | "strings": [ 560 | ")", 561 | ">", 562 | "}", 563 | "]" 564 | ] 565 | }, 566 | { 567 | "iconName": "keyboard-enter-symbolic", 568 | "keyval": "0xff0d", 569 | "width": 2 570 | } 571 | ], 572 | [ 573 | { 574 | "action": "levelSwitch", 575 | "label": "=/<", 576 | "level": 3, 577 | "width": 1.5 578 | }, 579 | { 580 | "strings": [ 581 | "*", 582 | "†", 583 | "‡", 584 | "★" 585 | ] 586 | }, 587 | { 588 | "strings": [ 589 | "\"", 590 | "“", 591 | "”", 592 | "«", 593 | "»" 594 | ] 595 | }, 596 | { 597 | "strings": [ 598 | "'", 599 | "‘", 600 | "’", 601 | "‹", 602 | "›" 603 | ] 604 | }, 605 | { 606 | "strings": [ 607 | ":" 608 | ] 609 | }, 610 | { 611 | "strings": [ 612 | ";" 613 | ] 614 | }, 615 | { 616 | "strings": [ 617 | "!", 618 | "¡" 619 | ] 620 | }, 621 | { 622 | "strings": [ 623 | "?", 624 | "¿" 625 | ] 626 | }, 627 | { 628 | "action": "levelSwitch", 629 | "label": "=/<", 630 | "level": 3, 631 | "width": 3 632 | } 633 | ], 634 | [ 635 | { 636 | "action": "levelSwitch", 637 | "label": "ABC", 638 | "level": 0, 639 | "width": 1.5 640 | }, 641 | { 642 | "strings": [ 643 | "_" 644 | ] 645 | }, 646 | { 647 | "strings": [ 648 | "/" 649 | ] 650 | }, 651 | { 652 | "strings": [ 653 | " " 654 | ], 655 | "width": 3 656 | }, 657 | { 658 | "strings": [ 659 | "," 660 | ] 661 | }, 662 | { 663 | "strings": [ 664 | ".", 665 | "…" 666 | ] 667 | }, 668 | { 669 | "action": "emoji", 670 | "iconName": "face-smile-symbolic" 671 | }, 672 | { 673 | "action": "languageMenu", 674 | "iconName": "keyboard-layout-symbolic" 675 | }, 676 | { 677 | "action": "hide", 678 | "iconName": "keyboard-hide-symbolic" 679 | } 680 | ] 681 | ] 682 | }, 683 | { 684 | "level": "opt+shift", 685 | "mode": "locked", 686 | "rows": [ 687 | [ 688 | { 689 | "strings": [ 690 | "~" 691 | ] 692 | }, 693 | { 694 | "strings": [ 695 | "`" 696 | ] 697 | }, 698 | { 699 | "strings": [ 700 | "|" 701 | ] 702 | }, 703 | { 704 | "strings": [ 705 | "•", 706 | "♪", 707 | "♥", 708 | "♠", 709 | "♦", 710 | "♣" 711 | ] 712 | }, 713 | { 714 | "strings": [ 715 | "√" 716 | ] 717 | }, 718 | { 719 | "strings": [ 720 | "Π", 721 | "π" 722 | ] 723 | }, 724 | { 725 | "strings": [ 726 | "÷" 727 | ] 728 | }, 729 | { 730 | "strings": [ 731 | "×" 732 | ] 733 | }, 734 | { 735 | "strings": [ 736 | "¶", 737 | "§" 738 | ] 739 | }, 740 | { 741 | "strings": [ 742 | "∆" 743 | ] 744 | }, 745 | { 746 | "action": "delete", 747 | "iconName": "edit-clear-symbolic", 748 | "width": 1.5 749 | } 750 | ], 751 | [ 752 | { 753 | "strings": [ 754 | "£" 755 | ] 756 | }, 757 | { 758 | "strings": [ 759 | "¢" 760 | ] 761 | }, 762 | { 763 | "strings": [ 764 | "€" 765 | ] 766 | }, 767 | { 768 | "strings": [ 769 | "¥" 770 | ] 771 | }, 772 | { 773 | "strings": [ 774 | "^", 775 | "↑", 776 | "↓", 777 | "←", 778 | "→" 779 | ] 780 | }, 781 | { 782 | "strings": [ 783 | "°", 784 | "′", 785 | "″" 786 | ] 787 | }, 788 | { 789 | "strings": [ 790 | "=", 791 | "≠", 792 | "≈", 793 | "∞" 794 | ] 795 | }, 796 | { 797 | "strings": [ 798 | "{" 799 | ] 800 | }, 801 | { 802 | "strings": [ 803 | "}" 804 | ] 805 | }, 806 | { 807 | "iconName": "keyboard-enter-symbolic", 808 | "keyval": "0xff0d", 809 | "width": 2 810 | } 811 | ], 812 | [ 813 | { 814 | "action": "levelSwitch", 815 | "label": "?123", 816 | "level": 2, 817 | "width": 1.5 818 | }, 819 | { 820 | "strings": [ 821 | "\\" 822 | ] 823 | }, 824 | { 825 | "strings": [ 826 | "©" 827 | ] 828 | }, 829 | { 830 | "strings": [ 831 | "®" 832 | ] 833 | }, 834 | { 835 | "strings": [ 836 | "™" 837 | ] 838 | }, 839 | { 840 | "strings": [ 841 | "℅" 842 | ] 843 | }, 844 | { 845 | "strings": [ 846 | "[" 847 | ] 848 | }, 849 | { 850 | "strings": [ 851 | "]" 852 | ] 853 | }, 854 | { 855 | "action": "levelSwitch", 856 | "label": "?123", 857 | "level": 2, 858 | "width": 3 859 | } 860 | ], 861 | [ 862 | { 863 | "action": "levelSwitch", 864 | "label": "ABC", 865 | "level": 0, 866 | "width": 1.5 867 | }, 868 | { 869 | "strings": [ 870 | "<", 871 | "‹", 872 | "≤", 873 | "«" 874 | ] 875 | }, 876 | { 877 | "strings": [ 878 | ">", 879 | "›", 880 | "≥", 881 | "»" 882 | ] 883 | }, 884 | { 885 | "strings": [ 886 | " " 887 | ], 888 | "width": 3 889 | }, 890 | { 891 | "strings": [ 892 | "," 893 | ] 894 | }, 895 | { 896 | "strings": [ 897 | ".", 898 | "…" 899 | ] 900 | }, 901 | { 902 | "action": "emoji", 903 | "iconName": "face-smile-symbolic" 904 | }, 905 | { 906 | "action": "languageMenu", 907 | "iconName": "keyboard-layout-symbolic" 908 | }, 909 | { 910 | "action": "hide", 911 | "iconName": "keyboard-hide-symbolic" 912 | } 913 | ] 914 | ] 915 | } 916 | ], 917 | "locale": "ms", 918 | "name": "Malay" 919 | } 920 | -------------------------------------------------------------------------------- /src/data/osk-layouts/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": [ 3 | { 4 | "level": "", 5 | "mode": "default", 6 | "rows": [ 7 | [ 8 | { 9 | "strings": [ 10 | "q" 11 | ] 12 | }, 13 | { 14 | "strings": [ 15 | "w" 16 | ] 17 | }, 18 | { 19 | "strings": [ 20 | "e" 21 | ] 22 | }, 23 | { 24 | "strings": [ 25 | "r" 26 | ] 27 | }, 28 | { 29 | "strings": [ 30 | "t" 31 | ] 32 | }, 33 | { 34 | "strings": [ 35 | "y" 36 | ] 37 | }, 38 | { 39 | "strings": [ 40 | "u" 41 | ] 42 | }, 43 | { 44 | "strings": [ 45 | "i" 46 | ] 47 | }, 48 | { 49 | "strings": [ 50 | "o" 51 | ] 52 | }, 53 | { 54 | "strings": [ 55 | "p" 56 | ] 57 | }, 58 | { 59 | "action": "delete", 60 | "iconName": "edit-clear-symbolic", 61 | "width": 1.5 62 | } 63 | ], 64 | [ 65 | { 66 | "strings": [ 67 | "a" 68 | ] 69 | }, 70 | { 71 | "strings": [ 72 | "s" 73 | ] 74 | }, 75 | { 76 | "strings": [ 77 | "d" 78 | ] 79 | }, 80 | { 81 | "strings": [ 82 | "f" 83 | ] 84 | }, 85 | { 86 | "strings": [ 87 | "g" 88 | ] 89 | }, 90 | { 91 | "strings": [ 92 | "h" 93 | ] 94 | }, 95 | { 96 | "strings": [ 97 | "j" 98 | ] 99 | }, 100 | { 101 | "strings": [ 102 | "k" 103 | ] 104 | }, 105 | { 106 | "strings": [ 107 | "l" 108 | ] 109 | }, 110 | { 111 | "iconName": "keyboard-enter-symbolic", 112 | "keyval": "0xff0d", 113 | "width": 2 114 | } 115 | ], 116 | [ 117 | { 118 | "action": "modifier", 119 | "keyval": "0xffe1", 120 | "iconName": "keyboard-shift-symbolic", 121 | "level": 1 122 | }, 123 | { 124 | "strings": [ 125 | "z" 126 | ] 127 | }, 128 | { 129 | "strings": [ 130 | "x" 131 | ] 132 | }, 133 | { 134 | "strings": [ 135 | "c" 136 | ] 137 | }, 138 | { 139 | "strings": [ 140 | "v" 141 | ] 142 | }, 143 | { 144 | "strings": [ 145 | "b" 146 | ] 147 | }, 148 | { 149 | "strings": [ 150 | "n" 151 | ] 152 | }, 153 | { 154 | "strings": [ 155 | "m" 156 | ] 157 | }, 158 | { 159 | "strings": [ 160 | "," 161 | ] 162 | }, 163 | { 164 | "strings": [ 165 | ".", 166 | "#", 167 | "!", 168 | ",", 169 | "?", 170 | "-", 171 | ":", 172 | "'", 173 | "@" 174 | ] 175 | }, 176 | { 177 | "action": "modifier", 178 | "keyval": "0xffe1", 179 | "iconName": "keyboard-shift-symbolic", 180 | "level": 1, 181 | "width": 1.5 182 | } 183 | ], 184 | [ 185 | { 186 | "action": "levelSwitch", 187 | "label": "?123", 188 | "level": 2, 189 | "width": 1.5 190 | }, 191 | { 192 | "action": "emoji", 193 | "iconName": "face-smile-symbolic", 194 | "width": 1.5 195 | }, 196 | { 197 | "strings": [ 198 | " " 199 | ], 200 | "width": 5 201 | }, 202 | { 203 | "action": "languageMenu", 204 | "iconName": "keyboard-layout-symbolic", 205 | "width": 1.5 206 | }, 207 | { 208 | "action": "hide", 209 | "iconName": "keyboard-hide-symbolic", 210 | "width": 2 211 | } 212 | ] 213 | ] 214 | }, 215 | { 216 | "level": "shift", 217 | "mode": "latched", 218 | "rows": [ 219 | [ 220 | { 221 | "strings": [ 222 | "Q" 223 | ] 224 | }, 225 | { 226 | "strings": [ 227 | "W" 228 | ] 229 | }, 230 | { 231 | "strings": [ 232 | "E" 233 | ] 234 | }, 235 | { 236 | "strings": [ 237 | "R" 238 | ] 239 | }, 240 | { 241 | "strings": [ 242 | "T" 243 | ] 244 | }, 245 | { 246 | "strings": [ 247 | "Y" 248 | ] 249 | }, 250 | { 251 | "strings": [ 252 | "U" 253 | ] 254 | }, 255 | { 256 | "strings": [ 257 | "I" 258 | ] 259 | }, 260 | { 261 | "strings": [ 262 | "O" 263 | ] 264 | }, 265 | { 266 | "strings": [ 267 | "P" 268 | ] 269 | }, 270 | { 271 | "action": "delete", 272 | "iconName": "edit-clear-symbolic", 273 | "width": 1.5 274 | } 275 | ], 276 | [ 277 | { 278 | "strings": [ 279 | "A" 280 | ] 281 | }, 282 | { 283 | "strings": [ 284 | "S" 285 | ] 286 | }, 287 | { 288 | "strings": [ 289 | "D" 290 | ] 291 | }, 292 | { 293 | "strings": [ 294 | "F" 295 | ] 296 | }, 297 | { 298 | "strings": [ 299 | "G" 300 | ] 301 | }, 302 | { 303 | "strings": [ 304 | "H" 305 | ] 306 | }, 307 | { 308 | "strings": [ 309 | "J" 310 | ] 311 | }, 312 | { 313 | "strings": [ 314 | "K" 315 | ] 316 | }, 317 | { 318 | "strings": [ 319 | "L" 320 | ] 321 | }, 322 | { 323 | "iconName": "keyboard-enter-symbolic", 324 | "keyval": "0xff0d", 325 | "width": 2 326 | } 327 | ], 328 | [ 329 | { 330 | "action": "modifier", 331 | "keyval": "0xffe1", 332 | "iconName": "keyboard-shift-symbolic", 333 | "level": 0 334 | }, 335 | { 336 | "strings": [ 337 | "Z" 338 | ] 339 | }, 340 | { 341 | "strings": [ 342 | "X" 343 | ] 344 | }, 345 | { 346 | "strings": [ 347 | "C" 348 | ] 349 | }, 350 | { 351 | "strings": [ 352 | "V" 353 | ] 354 | }, 355 | { 356 | "strings": [ 357 | "B" 358 | ] 359 | }, 360 | { 361 | "strings": [ 362 | "N" 363 | ] 364 | }, 365 | { 366 | "strings": [ 367 | "M" 368 | ] 369 | }, 370 | { 371 | "strings": [ 372 | "," 373 | ] 374 | }, 375 | { 376 | "strings": [ 377 | ".", 378 | "#", 379 | "!", 380 | ",", 381 | "?", 382 | "-", 383 | ":", 384 | "'", 385 | "@" 386 | ] 387 | }, 388 | { 389 | "action": "modifier", 390 | "keyval": "0xffe1", 391 | "iconName": "keyboard-shift-symbolic", 392 | "level": 0, 393 | "width": 1.5 394 | } 395 | ], 396 | [ 397 | { 398 | "action": "levelSwitch", 399 | "label": "?123", 400 | "level": 2, 401 | "width": 1.5 402 | }, 403 | { 404 | "action": "emoji", 405 | "iconName": "face-smile-symbolic", 406 | "width": 1.5 407 | }, 408 | { 409 | "strings": [ 410 | " " 411 | ], 412 | "width": 5 413 | }, 414 | { 415 | "action": "languageMenu", 416 | "iconName": "keyboard-layout-symbolic", 417 | "width": 1.5 418 | }, 419 | { 420 | "action": "hide", 421 | "iconName": "keyboard-hide-symbolic", 422 | "width": 2 423 | } 424 | ] 425 | ] 426 | }, 427 | { 428 | "level": "opt", 429 | "mode": "locked", 430 | "rows": [ 431 | [ 432 | { 433 | "strings": [ 434 | "1", 435 | "¹", 436 | "½", 437 | "⅓", 438 | "¼", 439 | "⅛" 440 | ] 441 | }, 442 | { 443 | "strings": [ 444 | "2", 445 | "²", 446 | "⅔" 447 | ] 448 | }, 449 | { 450 | "strings": [ 451 | "3", 452 | "³", 453 | "¾", 454 | "⅜" 455 | ] 456 | }, 457 | { 458 | "strings": [ 459 | "4", 460 | "⁴" 461 | ] 462 | }, 463 | { 464 | "strings": [ 465 | "5", 466 | "⅝" 467 | ] 468 | }, 469 | { 470 | "strings": [ 471 | "6" 472 | ] 473 | }, 474 | { 475 | "strings": [ 476 | "7", 477 | "⅞" 478 | ] 479 | }, 480 | { 481 | "strings": [ 482 | "8" 483 | ] 484 | }, 485 | { 486 | "strings": [ 487 | "9" 488 | ] 489 | }, 490 | { 491 | "strings": [ 492 | "0", 493 | "ⁿ", 494 | "∅" 495 | ] 496 | }, 497 | { 498 | "action": "delete", 499 | "iconName": "edit-clear-symbolic", 500 | "width": 1.5 501 | } 502 | ], 503 | [ 504 | { 505 | "strings": [ 506 | "@" 507 | ] 508 | }, 509 | { 510 | "strings": [ 511 | "#" 512 | ] 513 | }, 514 | { 515 | "strings": [ 516 | "$", 517 | "¢", 518 | "£", 519 | "€", 520 | "¥", 521 | "₱" 522 | ] 523 | }, 524 | { 525 | "strings": [ 526 | "%", 527 | "‰" 528 | ] 529 | }, 530 | { 531 | "strings": [ 532 | "&" 533 | ] 534 | }, 535 | { 536 | "strings": [ 537 | "-", 538 | "_", 539 | "–", 540 | "—", 541 | "·" 542 | ] 543 | }, 544 | { 545 | "strings": [ 546 | "+", 547 | "±" 548 | ] 549 | }, 550 | { 551 | "strings": [ 552 | "(", 553 | "<", 554 | "{", 555 | "[" 556 | ] 557 | }, 558 | { 559 | "strings": [ 560 | ")", 561 | ">", 562 | "}", 563 | "]" 564 | ] 565 | }, 566 | { 567 | "iconName": "keyboard-enter-symbolic", 568 | "keyval": "0xff0d", 569 | "width": 2 570 | } 571 | ], 572 | [ 573 | { 574 | "action": "levelSwitch", 575 | "label": "=/<", 576 | "level": 3, 577 | "width": 1.5 578 | }, 579 | { 580 | "strings": [ 581 | "*", 582 | "†", 583 | "‡", 584 | "★" 585 | ] 586 | }, 587 | { 588 | "strings": [ 589 | "\"", 590 | "“", 591 | "”", 592 | "«", 593 | "»" 594 | ] 595 | }, 596 | { 597 | "strings": [ 598 | "'", 599 | "‘", 600 | "’", 601 | "‹", 602 | "›" 603 | ] 604 | }, 605 | { 606 | "strings": [ 607 | ":" 608 | ] 609 | }, 610 | { 611 | "strings": [ 612 | ";" 613 | ] 614 | }, 615 | { 616 | "strings": [ 617 | "!", 618 | "¡" 619 | ] 620 | }, 621 | { 622 | "strings": [ 623 | "?", 624 | "¿" 625 | ] 626 | }, 627 | { 628 | "action": "levelSwitch", 629 | "label": "=/<", 630 | "level": 3, 631 | "width": 3 632 | } 633 | ], 634 | [ 635 | { 636 | "action": "levelSwitch", 637 | "label": "ABC", 638 | "level": 0, 639 | "width": 1.5 640 | }, 641 | { 642 | "strings": [ 643 | "_" 644 | ] 645 | }, 646 | { 647 | "strings": [ 648 | "/" 649 | ] 650 | }, 651 | { 652 | "strings": [ 653 | " " 654 | ], 655 | "width": 3 656 | }, 657 | { 658 | "strings": [ 659 | "," 660 | ] 661 | }, 662 | { 663 | "strings": [ 664 | ".", 665 | "…" 666 | ] 667 | }, 668 | { 669 | "action": "emoji", 670 | "iconName": "face-smile-symbolic" 671 | }, 672 | { 673 | "action": "languageMenu", 674 | "iconName": "keyboard-layout-symbolic" 675 | }, 676 | { 677 | "action": "hide", 678 | "iconName": "keyboard-hide-symbolic" 679 | } 680 | ] 681 | ] 682 | }, 683 | { 684 | "level": "opt+shift", 685 | "mode": "locked", 686 | "rows": [ 687 | [ 688 | { 689 | "strings": [ 690 | "~" 691 | ] 692 | }, 693 | { 694 | "strings": [ 695 | "`" 696 | ] 697 | }, 698 | { 699 | "strings": [ 700 | "|" 701 | ] 702 | }, 703 | { 704 | "strings": [ 705 | "•", 706 | "♪", 707 | "♥", 708 | "♠", 709 | "♦", 710 | "♣" 711 | ] 712 | }, 713 | { 714 | "strings": [ 715 | "√" 716 | ] 717 | }, 718 | { 719 | "strings": [ 720 | "Π", 721 | "π" 722 | ] 723 | }, 724 | { 725 | "strings": [ 726 | "÷" 727 | ] 728 | }, 729 | { 730 | "strings": [ 731 | "×" 732 | ] 733 | }, 734 | { 735 | "strings": [ 736 | "¶", 737 | "§" 738 | ] 739 | }, 740 | { 741 | "strings": [ 742 | "∆" 743 | ] 744 | }, 745 | { 746 | "action": "delete", 747 | "iconName": "edit-clear-symbolic", 748 | "width": 1.5 749 | } 750 | ], 751 | [ 752 | { 753 | "strings": [ 754 | "£" 755 | ] 756 | }, 757 | { 758 | "strings": [ 759 | "¢" 760 | ] 761 | }, 762 | { 763 | "strings": [ 764 | "€" 765 | ] 766 | }, 767 | { 768 | "strings": [ 769 | "¥" 770 | ] 771 | }, 772 | { 773 | "strings": [ 774 | "^", 775 | "↑", 776 | "↓", 777 | "←", 778 | "→" 779 | ] 780 | }, 781 | { 782 | "strings": [ 783 | "°", 784 | "′", 785 | "″" 786 | ] 787 | }, 788 | { 789 | "strings": [ 790 | "=", 791 | "≠", 792 | "≈", 793 | "∞" 794 | ] 795 | }, 796 | { 797 | "strings": [ 798 | "{" 799 | ] 800 | }, 801 | { 802 | "strings": [ 803 | "}" 804 | ] 805 | }, 806 | { 807 | "iconName": "keyboard-enter-symbolic", 808 | "keyval": "0xff0d", 809 | "width": 2 810 | } 811 | ], 812 | [ 813 | { 814 | "action": "levelSwitch", 815 | "label": "?123", 816 | "level": 2, 817 | "width": 1.5 818 | }, 819 | { 820 | "strings": [ 821 | "\\" 822 | ] 823 | }, 824 | { 825 | "strings": [ 826 | "©" 827 | ] 828 | }, 829 | { 830 | "strings": [ 831 | "®" 832 | ] 833 | }, 834 | { 835 | "strings": [ 836 | "™" 837 | ] 838 | }, 839 | { 840 | "strings": [ 841 | "℅" 842 | ] 843 | }, 844 | { 845 | "strings": [ 846 | "[" 847 | ] 848 | }, 849 | { 850 | "strings": [ 851 | "]" 852 | ] 853 | }, 854 | { 855 | "action": "levelSwitch", 856 | "label": "?123", 857 | "level": 2, 858 | "width": 3 859 | } 860 | ], 861 | [ 862 | { 863 | "action": "levelSwitch", 864 | "label": "ABC", 865 | "level": 0, 866 | "width": 1.5 867 | }, 868 | { 869 | "strings": [ 870 | "<", 871 | "‹", 872 | "≤", 873 | "«" 874 | ] 875 | }, 876 | { 877 | "strings": [ 878 | ">", 879 | "›", 880 | "≥", 881 | "»" 882 | ] 883 | }, 884 | { 885 | "strings": [ 886 | " " 887 | ], 888 | "width": 3 889 | }, 890 | { 891 | "strings": [ 892 | "," 893 | ] 894 | }, 895 | { 896 | "strings": [ 897 | ".", 898 | "…" 899 | ] 900 | }, 901 | { 902 | "action": "emoji", 903 | "iconName": "face-smile-symbolic" 904 | }, 905 | { 906 | "action": "languageMenu", 907 | "iconName": "keyboard-layout-symbolic" 908 | }, 909 | { 910 | "action": "hide", 911 | "iconName": "keyboard-hide-symbolic" 912 | } 913 | ] 914 | ] 915 | } 916 | ], 917 | "locale": "id", 918 | "name": "Indonesian" 919 | } 920 | --------------------------------------------------------------------------------