Compare commits
183 Commits
caps-lock-
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
997b7be4c0 | ||
|
23097921cf | ||
|
237c4e2cc2 | ||
|
9bf0a20226 | ||
|
354c0a6f1c | ||
|
46408572bc | ||
|
0d51f7ea1e | ||
|
fcbaa23ccf | ||
|
70365b48d4 | ||
|
3c30e8248e | ||
|
73742a853f | ||
|
24a6dd0f2c | ||
|
2233250e4d | ||
|
c4a88e4d5b | ||
|
cd2932bde1 | ||
|
6fae23a432 | ||
|
6e2494ca0b | ||
|
8a6dc34b2c | ||
|
9f0cf15d2e | ||
|
700ec23bd4 | ||
|
fb93d841a5 | ||
|
a1be402638 | ||
|
9f22e53a3b | ||
|
e309b76c0a | ||
|
4d686a8836 | ||
|
b21bf3fffd | ||
|
7454389f48 | ||
|
b61e9db21e | ||
|
24d6b96ad7 | ||
|
13ad05c0b0 | ||
|
a8e331c322 | ||
|
b600332595 | ||
|
e734d1d0e2 | ||
|
c57ae83bfa | ||
|
c886a89b11 | ||
|
231c08eb97 | ||
|
4eca9caec1 | ||
|
bc8fef11f1 | ||
|
4d0598a011 | ||
|
038f693cae | ||
|
72d88a5298 | ||
|
bd50964651 | ||
|
105a5a2f33 | ||
|
62530e98b9 | ||
|
b3d1a3fc1a | ||
|
50a3c0f5bc | ||
|
d8fc4e80e3 | ||
|
9d76227982 | ||
|
3967fb8a9f | ||
|
29b4b665dc | ||
|
35f35b27be | ||
|
bf2bec0d4b | ||
|
6e1364b5c2 | ||
|
acddd70435 | ||
|
6c786f2a1a | ||
|
2696f42144 | ||
|
84e10e0470 | ||
|
65f4ffd15b | ||
|
deb611a0d2 | ||
|
29f03d0e96 | ||
|
4629410230 | ||
|
b9526d918d | ||
|
db3b021bfc | ||
|
3862f4d6ba | ||
|
555ede0fee | ||
|
7b90294b57 | ||
|
69881e75c7 | ||
|
533e22ab4f | ||
|
46c86a05bd | ||
|
e053d4b20c | ||
|
c1e19a21d0 | ||
|
3164215879 | ||
|
99367a9ec6 | ||
|
cd0f61da74 | ||
|
ce57b5a4a2 | ||
|
bf3b9c374e | ||
|
6021a0b83c | ||
|
89d0e6c063 | ||
|
a2eea76e70 | ||
|
2cb5e67d1f | ||
|
3a371c354b | ||
|
bdb080657d | ||
|
bf33230c26 | ||
|
45fc18576e | ||
|
b432f1d773 | ||
|
66cf643574 | ||
|
ada3b5f3b7 | ||
|
6405e5e8be | ||
|
460f25317f | ||
|
81d1a1a831 | ||
|
c01b289eaf | ||
|
a7b79022e5 | ||
|
bad2e8c237 | ||
|
b7be19dc1f | ||
|
b5a96dc4dc | ||
|
944ed32a37 | ||
|
773147ab9c | ||
|
52805d9745 | ||
|
8d793da6b6 | ||
|
91ace060bc | ||
|
ecac6a77f8 | ||
|
a886f6eede | ||
|
1197ce36b4 | ||
|
8b99c04a21 | ||
|
6ac973cfda | ||
|
c5e9e3ff5c | ||
|
cf1aaa3bdf | ||
|
39b3f50aa3 | ||
|
f7f1d85f80 | ||
|
5d2eb35574 | ||
|
93d58571cc | ||
|
1a290f96f2 | ||
|
304375268d | ||
|
9d89297c15 | ||
|
46f3b41393 | ||
|
bea2e6cd1f | ||
|
abf36e5d56 | ||
|
c9b6380ed0 | ||
|
4906f8105f | ||
|
96fc4003f1 | ||
|
a91332a903 | ||
|
53e04d5784 | ||
|
c7d33356bc | ||
|
69ab869079 | ||
|
d96414c6c6 | ||
|
0f11a88418 | ||
|
82e0840568 | ||
|
c7ed2bcae9 | ||
|
5386541db3 | ||
|
94b2ded843 | ||
|
2684d1f041 | ||
|
78f85e52a2 | ||
|
5e3a3f894b | ||
|
3f6b6fd232 | ||
|
f17afba7be | ||
|
7e9d8c73df | ||
|
b22b49d3e6 | ||
|
7c3286078b | ||
|
e604f6fd57 | ||
|
dc3a303af1 | ||
|
ec8e78d5cc | ||
|
0549c6c8a1 | ||
|
e74b45c2d6 | ||
|
1cbaa7106c | ||
|
fe0f82436a | ||
|
5c19140609 | ||
|
47e2009da4 | ||
|
b33bcd8865 | ||
|
c41a098924 | ||
|
8cd868ba76 | ||
|
07f9c1ffaa | ||
|
9a07149efc | ||
|
0594127575 | ||
|
a9f9bbec19 | ||
|
35d1ebeab5 | ||
|
0739c6bd2c | ||
|
a1de69bcc4 | ||
|
5e5937b0f4 | ||
|
ce38a4f151 | ||
|
0e0c761a92 | ||
|
940cf0deb8 | ||
|
c2d5b14261 | ||
|
ebda7b2c3e | ||
|
39f6d294fb | ||
|
8b5d971fb5 | ||
|
8c7559d8f6 | ||
|
d7e5040873 | ||
|
b29a344cd0 | ||
|
b8e673b614 | ||
|
bae82d6ed8 | ||
|
f913051dca | ||
|
dac702ad0b | ||
|
f2f6ef0627 | ||
|
6389d58553 | ||
|
e40558677e | ||
|
ae270b36f4 | ||
|
146d520325 | ||
|
065d9520e5 | ||
|
bb60ed9b13 | ||
|
d56e4d129e | ||
|
e9f734b6cc | ||
|
63e7ac2e94 | ||
|
8c29073260 |
1
.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
srcs/juloo.keyboard2/ComposeKeyData.java -diff
|
17
.github/workflows/check-layouts.yml
vendored
@ -1,19 +1,26 @@
|
|||||||
name: Check layouts
|
name: Check layouts
|
||||||
|
|
||||||
# Runs 'gen_layouts.py' and checks that the generated file were uptodate.
|
|
||||||
# This doesn't run 'check_layout.py'.
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-layouts:
|
gen-layouts:
|
||||||
|
name: Generated files
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- run: python3 gen_layouts.py
|
- run: python3 gen_layouts.py
|
||||||
- name: Check that the generated layouts.xml is uptodate, run python3 gen_layouts.py otherwise
|
- name: "Check that the generated 'layouts.xml' is uptodate, otherwise run 'python3 gen_layouts.py'"
|
||||||
|
run: git diff --exit-code
|
||||||
|
check-layouts:
|
||||||
|
name: check_layout.output
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- run: python3 check_layout.py
|
||||||
|
- name: "Check that the generated 'check_layout.output' is uptodate, otherwise run 'python3 check_layout.py'"
|
||||||
run: git diff --exit-code
|
run: git diff --exit-code
|
||||||
|
4
.github/workflows/check-translations.yml
vendored
@ -12,5 +12,5 @@ jobs:
|
|||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- run: python3 sync_translations.py
|
- run: python3 sync_translations.py
|
||||||
- name: Check that strings files are uptodate, run python3 sync_translations.py otherwise
|
- name: "Check that strings files are uptodate, otherwise run 'python3 sync_translations.py'"
|
||||||
run: git diff --exit-code
|
run: git add -N . && git diff --exit-code
|
||||||
|
@ -14,7 +14,7 @@ Python 3 is required to update generated files but not to build the app.
|
|||||||
For Android Studio users, no more setup is needed.
|
For Android Studio users, no more setup is needed.
|
||||||
|
|
||||||
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`.
|
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`.
|
||||||
Instructions to install Nix are [here](https://nixos.wiki/wiki/Nix_Installation_Guide).
|
Instructions to install Nix are [here](https://wiki.nixos.org/wiki/Nix_Installation_Guide).
|
||||||
|
|
||||||
If you don't use Android Studio or Nix, you have to inform Gradle about the
|
If you don't use Android Studio or Nix, you have to inform Gradle about the
|
||||||
location of your Android SDK by either:
|
location of your Android SDK by either:
|
||||||
@ -110,6 +110,10 @@ Run `./gradlew checkKeyboardLayouts` to check some properties about your
|
|||||||
layout. This will change the file `check_layout.output`, which you should
|
layout. This will change the file `check_layout.output`, which you should
|
||||||
commit.
|
commit.
|
||||||
|
|
||||||
|
Layouts are CC0 licensed by default. If you do not want your layout to be
|
||||||
|
released into the public domain, add a copyright notice at the top of the file
|
||||||
|
and a mention in `srcs/layouts/LICENSE`.
|
||||||
|
|
||||||
#### Adding a programming layout
|
#### Adding a programming layout
|
||||||
|
|
||||||
A programming layout must contain all ASCII characters.
|
A programming layout must contain all ASCII characters.
|
||||||
@ -176,7 +180,7 @@ the file and the English strings.
|
|||||||
To check that `strings.xml` is formatted correctly, run
|
To check that `strings.xml` is formatted correctly, run
|
||||||
`python sync_translations.py`. This will modify your files.
|
`python sync_translations.py`. This will modify your files.
|
||||||
|
|
||||||
Store descriptions in `metadata/` are updated automatically.
|
Store descriptions in `fastlane/metadata/android/` are updated automatically.
|
||||||
Translating changelogs is not useful.
|
Translating changelogs is not useful.
|
||||||
|
|
||||||
The app name might be partially translated, the "Unexpected" word should remain
|
The app name might be partially translated, the "Unexpected" word should remain
|
||||||
@ -186,6 +190,12 @@ As translations need to be updated regularly, you can subscribe to this issue
|
|||||||
to receive a notification when an update is needed:
|
to receive a notification when an update is needed:
|
||||||
https://github.com/Julow/Unexpected-Keyboard/issues/373
|
https://github.com/Julow/Unexpected-Keyboard/issues/373
|
||||||
|
|
||||||
|
### Adding Compose key sequences
|
||||||
|
|
||||||
|
New Compose sequences can be added into `srcs/compose/compose/extra.json`.
|
||||||
|
If a entirely new family of sequences were to be added, a new `.json` file can
|
||||||
|
be created in the same directory to host them.
|
||||||
|
|
||||||
### Adding key combinations
|
### Adding key combinations
|
||||||
|
|
||||||
Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.
|
Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.
|
||||||
|
3
FUNDING.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
github: [ Julow ]
|
||||||
|
liberapay: Julow
|
||||||
|
custom: [ "https://paypal.me/JulesAguillon" ]
|
@ -20,12 +20,12 @@ This application contains no ads, doesn't make any network requests and is Open
|
|||||||
|
|
||||||
Usage: to apply the symbols located in the corners of each key, slide your finger in the direction of the symbols. For example, the Settings are opened by sliding in the left down corner.
|
Usage: to apply the symbols located in the corners of each key, slide your finger in the direction of the symbols. For example, the Settings are opened by sliding in the left down corner.
|
||||||
|
|
||||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
| <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
| <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
||||||
|
|
||||||
## Similar apps
|
## Similar apps
|
||||||
* [Calculator++](https://github.com/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators. Works up to Android 13 but maybe unmaintained.
|
* [Calculator++](https://git.bubu1.eu/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
45
build.gradle
@ -2,25 +2,33 @@ plugins {
|
|||||||
id 'com.android.application' version '8.1.1'
|
id 'com.android.application' version '8.1.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation "junit:junit:4.13.2"
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace 'juloo.keyboard2'
|
namespace 'juloo.keyboard2'
|
||||||
compileSdk 33
|
compileSdk 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "juloo.keyboard2"
|
applicationId "juloo.keyboard2"
|
||||||
minSdk 11
|
minSdk 11
|
||||||
targetSdkVersion 33
|
targetSdkVersion 35
|
||||||
versionCode 38
|
versionCode 42
|
||||||
versionName "1.26.0"
|
versionName "1.29.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
java.srcDirs = ['srcs']
|
java.srcDirs = ['srcs/juloo.keyboard2']
|
||||||
res.srcDirs = ['res', 'build/generated-resources']
|
res.srcDirs = ['res', 'build/generated-resources']
|
||||||
assets.srcDirs = ['assets']
|
assets.srcDirs = ['assets']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
java.srcDirs = ['test']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
@ -84,10 +92,6 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register('buildKeyboardFont') {
|
tasks.register('buildKeyboardFont') {
|
||||||
println "\nBuilding assets/special_font.ttf"
|
println "\nBuilding assets/special_font.ttf"
|
||||||
mkdir "$buildDir"
|
mkdir "$buildDir"
|
||||||
@ -104,10 +108,19 @@ tasks.register('buildKeyboardFont') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.register('genEmojis') {
|
||||||
|
println "\nGenerating res/raw/emojis.txt"
|
||||||
|
exec {
|
||||||
|
workingDir = projectDir
|
||||||
|
commandLine "python", "gen_emoji.py"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
tasks.withType(Test).configureEach {
|
||||||
dependsOn 'genLayoutsList'
|
dependsOn 'genLayoutsList'
|
||||||
dependsOn 'checkKeyboardLayouts'
|
dependsOn 'checkKeyboardLayouts'
|
||||||
dependsOn 'syncTranslations'
|
dependsOn 'syncTranslations'
|
||||||
|
dependsOn 'compileComposeSequences'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('genLayoutsList') {
|
tasks.register('genLayoutsList') {
|
||||||
@ -138,6 +151,19 @@ tasks.register('syncTranslations') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.register('compileComposeSequences') {
|
||||||
|
def out = "srcs/juloo.keyboard2/ComposeKeyData.java"
|
||||||
|
println "\nGenerating ${out}"
|
||||||
|
exec {
|
||||||
|
def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
|
||||||
|
!it.name.endsWith(".py") && !it.name.endsWith(".md")
|
||||||
|
}
|
||||||
|
workingDir = projectDir
|
||||||
|
commandLine("python", "srcs/compose/compile.py", *sequences)
|
||||||
|
standardOutput = new FileOutputStream("${projectDir}/${out}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tasks.named("preBuild") {
|
tasks.named("preBuild") {
|
||||||
dependsOn += "initDebugKeystore"
|
dependsOn += "initDebugKeystore"
|
||||||
dependsOn += "copyRawQwertyUS"
|
dependsOn += "copyRawQwertyUS"
|
||||||
@ -167,6 +193,7 @@ tasks.register('copyLayoutDefinitions')
|
|||||||
{
|
{
|
||||||
copy {
|
copy {
|
||||||
from "srcs/layouts"
|
from "srcs/layouts"
|
||||||
|
include "*.xml"
|
||||||
into "build/generated-resources/xml"
|
into "build/generated-resources/xml"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
# arab_alt
|
# arab_alt
|
||||||
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
1 warnings
|
||||||
2 warnings
|
|
||||||
# arab_hamvaj_tly
|
# arab_hamvaj_tly
|
||||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
|
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
|
||||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder
|
Layout doesn't define some important keys, missing: loc esc
|
||||||
2 warnings
|
2 warnings
|
||||||
# arab_pc
|
# arab_pc
|
||||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||||
@ -19,39 +18,50 @@ Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
|||||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
|
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
|
||||||
1 warnings
|
1 warnings
|
||||||
# armenian_ph_am
|
# armenian_ph_am
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
0 warnings
|
||||||
1 warnings
|
|
||||||
# beng_national
|
# beng_national
|
||||||
Layout includes some ASCII punctuation but not all, missing: $
|
Layout includes some ASCII punctuation but not all, missing: $
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
1 warnings
|
||||||
2 warnings
|
|
||||||
# beng_provat
|
# beng_provat
|
||||||
Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
|
Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
1 warnings
|
||||||
2 warnings
|
|
||||||
# cyrl_jcuken_ru
|
# cyrl_jcuken_ru
|
||||||
0 warnings
|
0 warnings
|
||||||
# cyrl_jcuken_uk
|
# cyrl_jcuken_uk
|
||||||
0 warnings
|
0 warnings
|
||||||
|
# cyrl_lynyertz_sr
|
||||||
|
0 warnings
|
||||||
# cyrl_ueishsht
|
# cyrl_ueishsht
|
||||||
0 warnings
|
0 warnings
|
||||||
# cyrl_yaverti
|
# cyrl_yaverti
|
||||||
Layout includes some ASCII punctuation but not all, missing: ~
|
Layout includes some ASCII punctuation but not all, missing: ~
|
||||||
1 warnings
|
1 warnings
|
||||||
|
# cyrl_yqukeng_tj
|
||||||
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
|
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
|
||||||
|
2 warnings
|
||||||
|
# cyrl_yxukeng_os
|
||||||
|
Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~
|
||||||
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
|
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
|
||||||
|
3 warnings
|
||||||
# deva_alt
|
# deva_alt
|
||||||
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
|
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
|
||||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
2 warnings
|
2 warnings
|
||||||
# deva_inscript
|
# deva_inscript
|
||||||
Duplicate keys: ।
|
Duplicate keys: ।
|
||||||
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
|
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
2 warnings
|
||||||
3 warnings
|
|
||||||
# grek_qwerty
|
# grek_qwerty
|
||||||
Duplicate keys: ;
|
Duplicate keys: ;
|
||||||
1 warnings
|
1 warnings
|
||||||
|
# guj_phonetic_in
|
||||||
|
Duplicate keys: ટ, ડ
|
||||||
|
1 warnings
|
||||||
# hang_dubeolsik_kr
|
# hang_dubeolsik_kr
|
||||||
0 warnings
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
|
1 warnings
|
||||||
# hebr_1_il
|
# hebr_1_il
|
||||||
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
|
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
|
||||||
1 warnings
|
1 warnings
|
||||||
@ -61,11 +71,10 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
|
|||||||
# latn_azerty_fr
|
# latn_azerty_fr
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_bepo_fr
|
# latn_bepo_fr
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
0 warnings
|
||||||
1 warnings
|
|
||||||
# latn_bone
|
# latn_bone
|
||||||
Layout includes some ASCII punctuation but not all, missing: $
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward
|
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
|
||||||
2 warnings
|
2 warnings
|
||||||
# latn_colemak
|
# latn_colemak
|
||||||
Some keys contain whitespaces, unexpected: ́
|
Some keys contain whitespaces, unexpected: ́
|
||||||
@ -73,19 +82,22 @@ Some keys contain whitespaces, unexpected: ́
|
|||||||
# latn_dvorak
|
# latn_dvorak
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_neo2
|
# latn_neo2
|
||||||
Layout redefines the bottom row but some important keys are missing, missing: loc end, loc home, loc page_down, loc page_up
|
Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard
|
||||||
1 warnings
|
1 warnings
|
||||||
# latn_qwerty_br
|
# latn_qwerty_br
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_cz
|
# latn_qwerty_cz
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
0 warnings
|
||||||
1 warnings
|
# latn_qwerty_da
|
||||||
|
0 warnings
|
||||||
# latn_qwerty_es
|
# latn_qwerty_es
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_gb
|
# latn_qwerty_gb
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_hu
|
# latn_qwerty_hu
|
||||||
0 warnings
|
0 warnings
|
||||||
|
# latn_qwerty_jp
|
||||||
|
0 warnings
|
||||||
# latn_qwerty_lv
|
# latn_qwerty_lv
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_no
|
# latn_qwerty_no
|
||||||
@ -97,13 +109,16 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
# latn_qwerty_se
|
# latn_qwerty_se
|
||||||
Duplicate keys: !, ', ,, -, ., ?
|
Duplicate keys: !, ', ,, -, ., ?
|
||||||
1 warnings
|
1 warnings
|
||||||
|
# latn_qwerty_sk
|
||||||
|
0 warnings
|
||||||
|
# latn_qwerty_sr
|
||||||
|
0 warnings
|
||||||
# latn_qwerty_tly
|
# latn_qwerty_tly
|
||||||
Duplicate keys: a, c, j, q
|
Duplicate keys: a, c, j, q
|
||||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||||
2 warnings
|
2 warnings
|
||||||
# latn_qwerty_tr
|
# latn_qwerty_tr
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
0 warnings
|
||||||
1 warnings
|
|
||||||
# latn_qwerty_us
|
# latn_qwerty_us
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_vi
|
# latn_qwerty_vi
|
||||||
@ -111,12 +126,10 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
# latn_qwertz
|
# latn_qwertz
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwertz_cz
|
# latn_qwertz_cz
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
0 warnings
|
||||||
1 warnings
|
|
||||||
# latn_qwertz_cz_multifunctional
|
# latn_qwertz_cz_multifunctional
|
||||||
Layout includes some ASCII punctuation but not all, missing: `
|
Layout includes some ASCII punctuation but not all, missing: `
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
1 warnings
|
||||||
2 warnings
|
|
||||||
# latn_qwertz_de
|
# latn_qwertz_de
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwertz_fr_ch
|
# latn_qwertz_fr_ch
|
||||||
@ -125,11 +138,11 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwertz_sk
|
# latn_qwertz_sk
|
||||||
Layout includes some ASCII punctuation but not all, missing: `
|
Layout includes some ASCII punctuation but not all, missing: `
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
1 warnings
|
||||||
2 warnings
|
# shaw_imperial_en
|
||||||
|
0 warnings
|
||||||
# urdu_phonetic_ur
|
# urdu_phonetic_ur
|
||||||
Duplicate keys:
|
Duplicate keys:
|
||||||
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
|
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
|
||||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
|
||||||
Some keys contain whitespaces, unexpected:
|
Some keys contain whitespaces, unexpected:
|
||||||
4 warnings
|
3 warnings
|
||||||
|
@ -6,7 +6,14 @@ warning_count = 0
|
|||||||
KNOWN_NOT_LAYOUT = set([
|
KNOWN_NOT_LAYOUT = set([
|
||||||
"number_row", "numpad", "pin",
|
"number_row", "numpad", "pin",
|
||||||
"bottom_row", "settings", "method",
|
"bottom_row", "settings", "method",
|
||||||
"greekmath", "numeric", "emoji_bottom_row" ])
|
"greekmath", "numeric", "emoji_bottom_row",
|
||||||
|
"clipboard_bottom_row" ])
|
||||||
|
|
||||||
|
KEY_ATTRIBUTES = set([
|
||||||
|
"key0",
|
||||||
|
"key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8",
|
||||||
|
"nw", "ne", "sw", "se", "w", "e", "n", "s"
|
||||||
|
])
|
||||||
|
|
||||||
def warn(msg):
|
def warn(msg):
|
||||||
global warning_count
|
global warning_count
|
||||||
@ -38,7 +45,7 @@ def unexpected_keys(keys, symbols, msg):
|
|||||||
def parse_row_from_et(row, keys, dup):
|
def parse_row_from_et(row, keys, dup):
|
||||||
for key in row:
|
for key in row:
|
||||||
for attr in key.keys():
|
for attr in key.keys():
|
||||||
if attr.startswith("key"):
|
if attr in KEY_ATTRIBUTES:
|
||||||
k = key.get(attr).removeprefix("\\")
|
k = key.get(attr).removeprefix("\\")
|
||||||
if k in keys: dup.add(k)
|
if k in keys: dup.add(k)
|
||||||
keys.add(k)
|
keys.add(k)
|
||||||
@ -68,8 +75,7 @@ def check_layout(layout):
|
|||||||
missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation")
|
missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation")
|
||||||
missing_some_of(keys, "0123456789", "digits")
|
missing_some_of(keys, "0123456789", "digits")
|
||||||
missing_required(keys,
|
missing_required(keys,
|
||||||
["esc", "tab", "backspace", "delete",
|
["loc esc", "loc tab", "backspace", "delete"],
|
||||||
"f11_placeholder", "f12_placeholder"],
|
|
||||||
"Layout doesn't define some important keys")
|
"Layout doesn't define some important keys")
|
||||||
unexpected_keys(keys,
|
unexpected_keys(keys,
|
||||||
["copy", "paste", "cut", "selectAll", "shareText",
|
["copy", "paste", "cut", "selectAll", "shareText",
|
||||||
@ -82,6 +88,7 @@ def check_layout(layout):
|
|||||||
unexpected_keys(keys, [""], "Layout contains empty strings")
|
unexpected_keys(keys, [""], "Layout contains empty strings")
|
||||||
unexpected_keys(keys, ["loc"], "Special keyword cannot be a symbol")
|
unexpected_keys(keys, ["loc"], "Special keyword cannot be a symbol")
|
||||||
unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces")
|
unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces")
|
||||||
|
unexpected_keys(keys, ["f11_placeholder", "f12_placeholder"], "These keys are now added automatically")
|
||||||
|
|
||||||
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
|
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
|
||||||
|
|
||||||
|
155
doc/Custom-layouts.md
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
# Custom layouts
|
||||||
|
You select a key layout for Unexpected Keyboard by calling up the Settings page (swipe the gear icon) and, at the top of the page, either tapping an existing layout or tapping _Add an alternate layout_. This displays a menu of available layouts. You can define your own layout by choosing _Custom layout_ at the bottom of this menu. Unexpected Keyboard now displays code in the XML format. You make changes by replacing this with different code and tapping OK.
|
||||||
|
|
||||||
|
We recommend you keep your work in a file outside Unexpected Keyboard (named something like `MyChanges.xml`). If you installed a new version of Unexpected from a different website (with a different signature), then the work you did solely by editing the XML inside Unexpected would be lost.
|
||||||
|
|
||||||
|
Put initial contents into your file in one of these ways:
|
||||||
|
* Copypaste the code Unexpected displays for _Custom layout_.
|
||||||
|
* Make a copy of one of the built-in layouts found in [`/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts).
|
||||||
|
* Use the [web-based editor](https://unexpected-keyboard-layout-editor.lixquid.com/). Interact with this web page to define keys and swipes and move keys to desired positions, and it will write the XML code for you. You can make the web page put the XML in a text file or copy it to the clipboard.
|
||||||
|
|
||||||
|
When you have prepared suitable XML code in one of these ways, copy it to the clipboard and paste it into Unexpected Keyboard.
|
||||||
|
|
||||||
|
## XML language overview
|
||||||
|
A layout XML file comprises tags that start with `<` and end with `>`.
|
||||||
|
* Every layout file starts with this declaration:
|
||||||
|
`<?xml version="1.0" encoding="utf-8"?>`
|
||||||
|
* Certain tags come in pairs—an opening tag and a closing tag—and apply to everything between them.
|
||||||
|
* The `<keyboard>`...`</keyboard>` pair says that the material between them is the definition of your keyboard. There can be only one of these.
|
||||||
|
* The `<row>`...`</row>` pair encloses the definition of a single row.
|
||||||
|
* An optional `<modmap>`...`</modmap>` pair contains instructions if you want to change the behavior of a modifier key such as Shift.
|
||||||
|
* Stand-alone tags include `<key`...`/>`, which defines a single key.
|
||||||
|
|
||||||
|
A tag can have properties, defined using an equals sign and a pair of ASCII double quotes. For example, `<key key0="a" />` defines the "a" key. The `key0` property of the `key` tag says which key you are defining, and the tag's location inside `<row>`...`</row>` specifies where it will go in the row.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
Here is a complete keyboard file with a single row containing an "a" key on the left and a "b" key on the right:
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<keyboard name="Simple example" script="latin">
|
||||||
|
<row>
|
||||||
|
<key key0="a" />
|
||||||
|
<key key0="b" />
|
||||||
|
</row>
|
||||||
|
</keyboard>
|
||||||
|
|
||||||
|
## Keyboard metadata
|
||||||
|
|
||||||
|
The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses the whole keyboard. The following properties may be used (The first two appear in the example above):
|
||||||
|
|
||||||
|
* `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”.
|
||||||
|
|
||||||
|
* `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`.
|
||||||
|
|
||||||
|
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`.
|
||||||
|
|
||||||
|
* `bottom_row`: Whether or not to show the built-in bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
|
||||||
|
+ We recommend your layout use the built-in bottom row, because it is still evolving and your layout will incorporate innovations in future versions. However, to define your own, the current definition of the bottom row is in [bottom_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/bottom_row.xml). You can copypaste this XML into your custom layout as a starting point.
|
||||||
|
+ Likewise, the current definition of the top (number) row is in [number_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/number_row.xml).
|
||||||
|
|
||||||
|
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
|
||||||
|
|
||||||
|
## Row
|
||||||
|
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
|
||||||
|
* `height`: The height of the row: a positive floating-point value.
|
||||||
|
|
||||||
|
A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings.
|
||||||
|
|
||||||
|
## Key
|
||||||
|
The `<key />` tag defines a key on the keyboard. Its position in the sequence of keys inside `<row>`...`</row>` indicates its position in the row from left to right. What the key does is defined by optional properties.
|
||||||
|
|
||||||
|
### Taps
|
||||||
|
What the key does when tapped is defined by the optional `key0` property. For example, `<key key0="a" />` defines the "a" key. Unexpected Keyboard provides a legend in the middle of the key.
|
||||||
|
|
||||||
|
When the Shift modifier is tapped, the "a" key becomes the "A" key and the legend temporarily changes. The Fn modifier makes a different change. You can override this behavior with a modmap (see below).
|
||||||
|
|
||||||
|
### Swipes
|
||||||
|
The following optional properties define the effects of swipes:
|
||||||
|
* `n`, `ne`, `e`, `se`, `s`, `sw`, `w`, `nw`: What the key should do when it is swiped in the direction of that compass point. ("North" means upward and "East" is to the right.)
|
||||||
|
<TABLE ALIGN=CENTER>
|
||||||
|
<TR>
|
||||||
|
<TD STYLE="width: 6em;">nw</TD><TD>n</TD><TD>ne</TD>
|
||||||
|
</TR>
|
||||||
|
<TR ALIGN=CENTER>
|
||||||
|
<TD>w</TD><TD> </TD><TD>e</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>sw</TD><TD>s</TD><TD>se</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
* `key1` through `key8` is an older way to achieve the same effects. The directions are ordered as follows:
|
||||||
|
<TABLE ALIGN=CENTER>
|
||||||
|
<TR>
|
||||||
|
<TD>key1</TD><TD>key7</TD><TD>key2</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>key5</TD><TD> </TD><TD>key6</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>key3</TD><TD>key8</TD><TD>key4</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
You can define a swipe only once with either compass-point or numeric notation. Unexpected Keyboard automatically puts a small legend in that direction from the center of the key.
|
||||||
|
|
||||||
|
* `slider`: If `slider="true"`, and the key also has `w` and `e` properties, then the key tracks horizontal finger motion precisely and sends the `w` and `e` keystrokes repeatedly. In built-in layouts, this makes the space bar send left and right characters as the user slides on the space bar.
|
||||||
|
* `anticircle`: The key value to send when doing an anti-clockwise gesture on the key.
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
A key may have the following properties to control the row's layout:
|
||||||
|
* `width`: The width of the key, a positive floating-point value. It defaults to 1.0
|
||||||
|
* `shift`: How much empty space to add to the left of this key, a non-negative floating-point value. It defaults to 0.0
|
||||||
|
|
||||||
|
Normally, a key's width is 1.0 unit. Unexpected Keyboard occupies the full width of the screen, and the row defining the highest number of units (in widths plus shifts) is as wide as the screen. A row whose width is a smaller number of units has empty space on the right.
|
||||||
|
|
||||||
|
### Extra legend
|
||||||
|
* `indication`: An optional extra legend to show under the main label. For example, `<key key0="2" indication="ABC" />` displays ABC at the bottom of the 2 key, as on a pinpad or some telephones. If the key also defines a downward swipe with `s` or `key8`, the legends overlap.
|
||||||
|
|
||||||
|
### Possible key values
|
||||||
|
Built-in strings that assign a special function to a key are described in [this page](Possible-key-values.md). For example, `se="copy"` means a southeasterly swipe produces the Copy key. If a key value does not match any of the built-in strings, it outputs that text _verbatim_. For example, `key0="a"` simply outputs the letter a.
|
||||||
|
|
||||||
|
In a layout, a key value can also start with the `loc` prefix. These are place-holders; the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use. For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
|
||||||
|
|
||||||
|
## Modmap
|
||||||
|
The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap. It can contain any number of mappings. Each mapping has an `a` property and a `b` property and maps the `a` key to the `b` key. Valid values are listed in [Possible key values](Possible-key-values.md).
|
||||||
|
|
||||||
|
The following mappings are supported:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<shift a="before" b="after" />
|
||||||
|
```
|
||||||
|
This means that when the Shift modifier is on, the key `before` is changed into `after`.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<fn a="before" b="after" />
|
||||||
|
```
|
||||||
|
This means that when the Fn modifier is on, the key `before` is changed into `after`.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<ctrl a="before" b="after" />
|
||||||
|
```
|
||||||
|
This means that when the Ctrl modifier is on, the key `before` is changed into `after`. The `<ctrl />` mapping is special in that the Ctrl modifier is applied to `after` after the mapping.
|
||||||
|
|
||||||
|
The clockwise circle and the round-trip gestures are affected by both `<shift />` and `<fn />` mappings. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
① Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following mapping:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<shift a="i" b="İ" />
|
||||||
|
```
|
||||||
|
② Cyrillic layouts have no V key. A layout can define Ctrl-V with the following mapping:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<ctrl a="в" b="v" />
|
||||||
|
```
|
||||||
|
This maps Ctrl+в to Ctrl+V—not to v.
|
||||||
|
|
||||||
|
## Portrait vs. landscape
|
||||||
|
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. So you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention.
|
||||||
|
|
||||||
|
## Contributing your layout
|
||||||
|
The Unexpected Keyboard project enthusiastically accepts user contributions, including custom layouts. (See the guidance for layouts at [CONTRIBUTING.md](https://github.com/Julow/Unexpected-Keyboard/blob/master/CONTRIBUTING.md#Adding-a-layout)).
|
||||||
|
* Submit a layout that has innovations of possible interest to other users at [Unexpected-Keyboard-layouts](https://github.com/Julow/Unexpected-Keyboard-layouts).
|
||||||
|
* Propose that your layout be included in the set of built-in layouts by making a Pull Request for an addition to [srcs/layouts](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts). Please show that such a layout is standard in your locale or has a substantial number of users.
|
190
doc/Possible-key-values.md
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
# Key values
|
||||||
|
|
||||||
|
This is an exhaustive list of special values accepted for the `key0` through `key8` or `nw` through `se` attributes on a key.
|
||||||
|
|
||||||
|
Any string that does not exactly match these will be printed verbatim.
|
||||||
|
A key can output multiple characters, but cannot combine multiple built-in key values.
|
||||||
|
|
||||||
|
## Escape codes
|
||||||
|
Value | Escape code for
|
||||||
|
:---- | :------
|
||||||
|
`\?` | `?`
|
||||||
|
`\#` | `#`
|
||||||
|
`\@` | `@`
|
||||||
|
`\n` | Literal newline character. This is different from `enter` and `action` in certain apps.
|
||||||
|
`\t` | Literal tab character. This is different from `tab` in certain apps.
|
||||||
|
`\\` | `\`
|
||||||
|
|
||||||
|
XML escape codes also work, including:
|
||||||
|
|
||||||
|
Value | Escape code for
|
||||||
|
:------- | :------
|
||||||
|
`&` | `&`
|
||||||
|
`<` | `<`
|
||||||
|
`>` | `>`
|
||||||
|
`"` | `"`
|
||||||
|
|
||||||
|
## Modifiers
|
||||||
|
System modifiers are sent to the app, which is free to do whatever they want in response.
|
||||||
|
The other modifiers only exist within the keyboard.
|
||||||
|
Value | Meaning
|
||||||
|
:---------- | :------
|
||||||
|
`shift` | System modifier.
|
||||||
|
`ctrl` | System modifier.
|
||||||
|
`alt` | System modifier.
|
||||||
|
`meta` | System modifier. Equivalent to the Windows key.
|
||||||
|
`fn` | Activates Fn mode, which assigns letters and symbols to special characters. e.g. `fn` `!` = `¡`
|
||||||
|
`compose` | Compose key. Enables composing characters using Linux-like shortcuts; e.g. `Compose` `A` `single quote` types `Á` (A with acute accent).
|
||||||
|
`capslock` | Actives and locks Shift
|
||||||
|
|
||||||
|
## Special keys
|
||||||
|
These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys.
|
||||||
|
|
||||||
|
`esc`, `enter`,
|
||||||
|
`up`, `right`,
|
||||||
|
`down`, `left`,
|
||||||
|
`page_up`, `page_down`,
|
||||||
|
`home`, `end`,
|
||||||
|
`backspace`, `delete`,
|
||||||
|
`insert`, `scroll_lock`,
|
||||||
|
`f1`-`f12`,
|
||||||
|
`tab`, `copy`,
|
||||||
|
`paste`, `cut`,
|
||||||
|
`selectAll`, `pasteAsPlainText`,
|
||||||
|
`undo`, `redo`
|
||||||
|
|
||||||
|
## Whitespace
|
||||||
|
Value | Meaning
|
||||||
|
:------ | :------
|
||||||
|
`space` | Space bar.
|
||||||
|
`nbsp` | Non-breaking space.
|
||||||
|
`nnbsp` | Narrow non-breaking space.
|
||||||
|
`zwj` | Zero-width joiner.
|
||||||
|
`zwnj` | Zero-width non-joiner.
|
||||||
|
|
||||||
|
## Keyboard editing actions
|
||||||
|
These keys perform editing on the text without sending keys that the app can interpret differently or ignore.
|
||||||
|
Value | Meaning
|
||||||
|
:----------------- | :------
|
||||||
|
`cursor_left` | Moves the cursor position to the left directly, without sending a `left` key event.
|
||||||
|
`cursor_right` | Moves the cursor position to the right directly, without sending a `right` key event.
|
||||||
|
|
||||||
|
## Other modifiers and diacritics
|
||||||
|
Value | Meaning
|
||||||
|
:------------------- | :------
|
||||||
|
`accent_aigu` | Acute accent. `á`
|
||||||
|
`accent_caron` | Háček. `č`
|
||||||
|
`accent_cedille` | Cedilla. `ç`
|
||||||
|
`accent_circonflexe` | Circumflex. `â`
|
||||||
|
`accent_grave` | Grave accent. `à`
|
||||||
|
`accent_macron` | Macron. `ā`
|
||||||
|
`accent_ring` | Ring accent. `å`
|
||||||
|
`accent_tilde` | Tilde. `ã`
|
||||||
|
`accent_trema` | Dieresis/umlaut. `ä`
|
||||||
|
`accent_ogonek` | Ogonek. `ą`
|
||||||
|
`accent_dot_above` | Dot accent. `ż` If applied to the lowercase `i`, removes the dot instead for Turkish. `ı`
|
||||||
|
`accent_double_aigu` | Double acute accent. `ő`
|
||||||
|
`accent_slash` | Slash through. `ø`
|
||||||
|
`accent_arrow_right` | Right arrow above, used to denote a vector. `a⃗`
|
||||||
|
`accent_breve` | Breve. `ă`
|
||||||
|
`accent_bar` | Bar/strikethrough. `ɨ`
|
||||||
|
`accent_dot_below` | Dot below. `ạ`
|
||||||
|
`accent_horn` | Horn accent. `ơ`
|
||||||
|
`accent_hook_above` | Hook accent. `ả`
|
||||||
|
`superscript` | Superscript. `ᵃ`
|
||||||
|
`subscript` | Subscript. `ₐ`
|
||||||
|
`ordinal` | Turns `a` and `o` into `ª` and `º`.
|
||||||
|
`arrows` | Turns `1`-`4` and `6`-`9` into arrows.
|
||||||
|
`box` | Turns `1`-`9`, `0`, and `.` into single-line, thin box-drawing characters.
|
||||||
|
|
||||||
|
## Bidirectional
|
||||||
|
Value | Meaning
|
||||||
|
:------ | :------
|
||||||
|
`lrm` | Left-to-right mark.
|
||||||
|
`rlm` | Right-to-left mark.
|
||||||
|
`b(`, `b)`, `b[`, `b]`, `b{`, `b}`, `blt`, `bgt` | Sends the bracket characters, but with mirrored key legends for right-to-left languages. (`blt` and `bgt` print `<` and `>` respectively.)
|
||||||
|
|
||||||
|
## Hebrew
|
||||||
|
Keys ending in `_placeholder` are normally hidden unless the Fn key is pressed.
|
||||||
|
|
||||||
|
`qamats`, `patah`,
|
||||||
|
`sheva`, `dagesh`,
|
||||||
|
`hiriq`, `segol`,
|
||||||
|
`tsere`, `holam`,
|
||||||
|
`qubuts`, `hataf_patah`,
|
||||||
|
`hataf_qamats`, `hataf_segol`,
|
||||||
|
`shindot`, `shindot_placeholder`,
|
||||||
|
`sindot`, `sindot_placeholder`,
|
||||||
|
`geresh`, `gershayim`,
|
||||||
|
`maqaf`, `rafe`,
|
||||||
|
`ole`, `ole_placeholder`,
|
||||||
|
`meteg`, `meteg_placeholder`
|
||||||
|
|
||||||
|
## Keyboard behavior keys
|
||||||
|
Value | Meaning
|
||||||
|
:--------------------- | :------
|
||||||
|
`config` | Gear icon; opens Unexpected Keyboard settings.
|
||||||
|
`switch_text` | Switch to the text layer (main layer).
|
||||||
|
`switch_numeric` | Switch to the numeric layer.
|
||||||
|
`switch_emoji` | Switch to the emoji layer.
|
||||||
|
`switch_back_emoji` | Switch to the text layer from the emoji layer.
|
||||||
|
`switch_forward` | Change the keyboard layout, as long as Unexpected Keyboard has multiple keyboard layouts enabled in the settings.
|
||||||
|
`switch_backward` | Change the keyboard layout to the previous one in the list.
|
||||||
|
`switch_greekmath` | Switch to the Greek & Math Symbols layer.
|
||||||
|
`switch_clipboard` | Switch to the clipboard pane.
|
||||||
|
`change_method` | Open the input method picker dialog.
|
||||||
|
`change_method_prev` | Switch to the previously used input method.
|
||||||
|
`action` | Performs a special context-sensitive operation related to the Enter key. For example, in the Twitter (X) app, `enter` adds a new line, while `action` posts.
|
||||||
|
`voice_typing` | Begin voice typing.
|
||||||
|
`voice_typing_chooser` | Shows a menu where you can choose which voice typing provider to use, then begins voice typing when you make a selection.
|
||||||
|
`shareText` | Emit a share Intent for the selected text. **Oddity:** This is in CamelCase.
|
||||||
|
|
||||||
|
## Unused
|
||||||
|
These keys are known to do nothing.
|
||||||
|
|
||||||
|
`replaceText`, `textAssist`,
|
||||||
|
`autofill`, `removed`
|
||||||
|
|
||||||
|
## Placeholders
|
||||||
|
These keys are normally hidden unless the Fn modifier is activated.
|
||||||
|
|
||||||
|
`f11_placeholder` | `f12_placeholder`
|
||||||
|
|
||||||
|
## Complex keys
|
||||||
|
|
||||||
|
More complex keys are of this form:
|
||||||
|
|
||||||
|
```
|
||||||
|
:<kind> <attributes>:<payload>
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<kind>` is one of the kinds documented below and `<attributes>` is a
|
||||||
|
space separated list of attributes. `<payload>` depends on the `<kind>`.
|
||||||
|
|
||||||
|
Attributes are:
|
||||||
|
- `symbol='Sym'` specifies the symbol to be shown on the keyboard.
|
||||||
|
- `flags='<flags>'` changes the behavior of the key.
|
||||||
|
`<flags>` is a coma separated list of:
|
||||||
|
+ `dim`: Make the symbol dimmer.
|
||||||
|
+ `small`: Make the symbol smaller.
|
||||||
|
|
||||||
|
### Kind `str`
|
||||||
|
|
||||||
|
Defines a key that outputs an arbitrary string. `<payload>` is a string wrapped
|
||||||
|
in single-quotes (`'`), escaping of other single quotes is allowed with `\'`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
- `:str:'Arbitrary string with a \' inside'`
|
||||||
|
- `:str symbol='Symbol':'Output string'`
|
||||||
|
|
||||||
|
### Kind `char`
|
||||||
|
|
||||||
|
Defines a key that outputs a single character. `<payload>` is the character to
|
||||||
|
output, unquoted.
|
||||||
|
This kind of key can be used to define a character key with a different symbol
|
||||||
|
on it. `char` keys can be modified by `ctrl` and other modifiers, unlike `str`
|
||||||
|
keys.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
- `:char symbol='q':љ`, which is used to implement `ctrl` shortcuts in cyrillic
|
||||||
|
layouts.
|
6
fastlane/metadata/android/cs-CZ/full_description.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.
|
||||||
|
|
||||||
|
Tato aplikace byla původně navržena pro programátory používající Termux.
|
||||||
|
Nyní je ideální pro každodenní použití.
|
||||||
|
|
||||||
|
Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source.
|
6
fastlane/metadata/android/en-US/changelogs/39.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
New layouts: QWERTY (Slovak), Gujarati phonetic
|
||||||
|
Add Linux Compose key to type a variety of characters using known combinations.
|
||||||
|
Fixed localized numpad and number row.
|
||||||
|
Many improvements and bug fixes.
|
||||||
|
|
||||||
|
Huge thanks to the contributors: @Yogesh-B, @ChasmSolacer, @matthiakl, @Sestowner, @RyanGibb, @BogdanLata, @RetrogisusDEV, @V6lhost, @ErrrorMaxx, @sdrapha, @vedamanavi
|
11
fastlane/metadata/android/en-US/changelogs/40.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
MessagEase and Thumb-Key inspired gestures with the anti-clockwise circle being
|
||||||
|
completely configurable.
|
||||||
|
|
||||||
|
Updated emojis.
|
||||||
|
Improved Hangul (Korean) support.
|
||||||
|
Added Danish support.
|
||||||
|
Improved spacebar slider.
|
||||||
|
Updated translations.
|
||||||
|
Various improvements and fixes to the app and layouts.
|
||||||
|
|
||||||
|
Many thanks to the contributors: @alotbsol555 @bkmgit @Cheesebaron @CloneWith @eandersons @JapanYoshi @Julow @la-ninpre @m15a @marciozomb13 @polyctena @solokot @Spike-from-NH @tmqCypher @Validbit
|
8
fastlane/metadata/android/en-US/changelogs/41.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Clipboard pane
|
||||||
|
|
||||||
|
New Monet theme
|
||||||
|
Improvements to custom layouts
|
||||||
|
Options to disable key repeat and the circle gesture
|
||||||
|
Options to disable the Tab and Esc keys
|
||||||
|
|
||||||
|
Many thanks to the contributors: @alotbsol555 @ChasmSolacer @eandersons @polyctena @Sestowner @solokot @Spike-from-NH @TadaCZE @V6lhost @Validbit
|
6
fastlane/metadata/android/en-US/changelogs/42.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Fix crash on Android 6.
|
||||||
|
Fix scaling issues for layouts with few columns.
|
||||||
|
Added Serbian layouts.
|
||||||
|
Layout and compose key tweaks. Improvements to custom layouts. Added Menu key.
|
||||||
|
|
||||||
|
Many thanks to the contributors: @adrian4096 @asivery @bokidori @dingodoppelt @RZHSSNZDH
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
7
fastlane/metadata/android/ja-JP/full_description.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
|
||||||
|
|
||||||
|
このアプリは元々はTermuxでのプログラミング用に設計されました。
|
||||||
|
しかし、今では普段の入力にも適しています。
|
||||||
|
PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
|
||||||
|
|
||||||
|
このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。
|
1
fastlane/metadata/android/ja-JP/short_description.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
軽量でプライバシーに配慮したAndroid用仮想キーボード
|
6
fastlane/metadata/android/ko-KR/full_description.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
|
||||||
|
|
||||||
|
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
|
||||||
|
지금은 일상적인 용도로도 완벽합니다.
|
||||||
|
|
||||||
|
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.
|
6
fastlane/metadata/android/pt-BR/full_description.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.
|
||||||
|
|
||||||
|
O app foi criado originalmente para desenvolvedores que usam Termux.
|
||||||
|
Agora aperfeiçoado para o uso diário.
|
||||||
|
|
||||||
|
Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source.
|
6
fastlane/metadata/android/ru-RU/full_description.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.
|
||||||
|
|
||||||
|
Приложение изначально было разработано для использования с Termux.
|
||||||
|
На данный момент оно также удобно в повседневном использовании.
|
||||||
|
|
||||||
|
Приложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.
|
6
fastlane/metadata/android/uk/full_description.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.
|
||||||
|
|
||||||
|
Ця програма спочатку була розроблена для програмістів, які використовують Termux.
|
||||||
|
Тепер ідеально підходить для щоденного використання.
|
||||||
|
|
||||||
|
Ця програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код.
|
1
fastlane/metadata/android/uk/short_description.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Легка та конфіденційна віртуальна клавіатура для Android.
|