├── .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 | 
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 |
--------------------------------------------------------------------------------