Compare commits
75 Commits
caps-lock-
...
1.28.0
Author | SHA1 | Date | |
---|---|---|---|
|
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
|
||||||
|
3
FUNDING.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
github: [ Julow ]
|
||||||
|
liberapay: Julow
|
||||||
|
custom: [ "https://paypal.me/JulesAguillon" ]
|
@@ -20,9 +20,9 @@ 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://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.
|
||||||
|
32
build.gradle
@@ -4,14 +4,14 @@ plugins {
|
|||||||
|
|
||||||
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 34
|
||||||
versionCode 38
|
versionCode 40
|
||||||
versionName "1.26.0"
|
versionName "1.28.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -85,7 +85,6 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('buildKeyboardFont') {
|
tasks.register('buildKeyboardFont') {
|
||||||
@@ -104,10 +103,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 +146,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(".pre") || it.name.endsWith(".json")
|
||||||
|
}
|
||||||
|
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 +188,7 @@ tasks.register('copyLayoutDefinitions')
|
|||||||
{
|
{
|
||||||
copy {
|
copy {
|
||||||
from "srcs/layouts"
|
from "srcs/layouts"
|
||||||
|
include "*.xml"
|
||||||
into "build/generated-resources/xml"
|
into "build/generated-resources/xml"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -50,8 +50,13 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
# grek_qwerty
|
# grek_qwerty
|
||||||
Duplicate keys: ;
|
Duplicate keys: ;
|
||||||
1 warnings
|
1 warnings
|
||||||
|
# guj_phonetic_in
|
||||||
|
Duplicate keys: ટ, ડ
|
||||||
|
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||||
|
2 warnings
|
||||||
# hang_dubeolsik_kr
|
# hang_dubeolsik_kr
|
||||||
0 warnings
|
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, 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
|
||||||
@@ -65,7 +70,7 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
1 warnings
|
1 warnings
|
||||||
# latn_bone
|
# latn_bone
|
||||||
Layout includes some ASCII punctuation but not all, missing: $
|
Layout includes some ASCII punctuation but not all, missing: $
|
||||||
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_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,13 +78,14 @@ 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
|
0 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
|
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||||
1 warnings
|
1 warnings
|
||||||
|
# latn_qwerty_da
|
||||||
|
0 warnings
|
||||||
# latn_qwerty_es
|
# latn_qwerty_es
|
||||||
0 warnings
|
0 warnings
|
||||||
# latn_qwerty_gb
|
# latn_qwerty_gb
|
||||||
@@ -97,6 +103,9 @@ 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
|
||||||
|
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||||
|
1 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: esc, f11_placeholder, f12_placeholder, tab
|
||||||
@@ -127,6 +136,8 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
|||||||
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
|
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||||
2 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: <, >, ?, `, |, ~
|
||||||
|
113
doc/Custom-layouts.md
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# Custom layouts
|
||||||
|
|
||||||
|
Unexpected Keyboard allows custom layouts to be defined, loaded, and used in the app. These layouts are defined in XML.
|
||||||
|
|
||||||
|
## Existing keyboard layouts
|
||||||
|
|
||||||
|
The XML data files for the keyboard layouts that come with the app can be seen [in `/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts).
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
A complete keyboard file with a single row containing a single Turkish "i" key is provided below:
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<keyboard name="Keyboard Name" script="latin">
|
||||||
|
<modmap>
|
||||||
|
<shift a="i" b="İ" />
|
||||||
|
</modmap>
|
||||||
|
<row>
|
||||||
|
<key key0="i" />
|
||||||
|
</row>
|
||||||
|
</keyboard>
|
||||||
|
|
||||||
|
Shift assignments can be changed on a per-character basis.
|
||||||
|
|
||||||
|
### Crash course to XML
|
||||||
|
|
||||||
|
An XML document is made out of tags.
|
||||||
|
|
||||||
|
Paired tags start with `<` and end with `>`, and must be closed by another tag that starts with `</`. They can have other tags as children. Paired tags used in Unexpected Keyboard include `<row>`...`</row>` and `<keyboard>`...`</keyboard>`.
|
||||||
|
|
||||||
|
Auto-terminating tags start with `<` and end with `/>`, and can't have any children. Auto-terminating tags used in Unexpected Keyboard include `<key />` and `<shift />`.
|
||||||
|
|
||||||
|
An XML tag can have attributes, defined using an equals sign and a pair of ASCII double quotes.
|
||||||
|
|
||||||
|
If you do not like XML, you can also use [this third-party GUI editor](https://unexpected-keyboard-layout-editor.lixquid.com/) to create or edit a keyboard layout.
|
||||||
|
|
||||||
|
### XML declaration
|
||||||
|
|
||||||
|
Every keyboard XML starts with `<?xml version="1.0" encoding="utf-8"?>`.
|
||||||
|
|
||||||
|
### Keyboard metadata
|
||||||
|
|
||||||
|
The `<keyboard>` tag encloses the whole keyboard. The following properties may be used:
|
||||||
|
|
||||||
|
* `name`: The name of the keyboard as it appears in the settings menu. If not present, it will just be called “Custom layout”.
|
||||||
|
* `bottom_row`: Whether or not to show the common bottom row. Accepts `true` or `false`, and defaults to `true`.
|
||||||
|
* `script`: The (main) writing system that it supports. Possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. 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. Defaults to the same as `script`.
|
||||||
|
|
||||||
|
### Modmap
|
||||||
|
|
||||||
|
The `<modmap>` tag encloses custom mappings for the Shift and Fn key’s behavior.
|
||||||
|
|
||||||
|
Each entry contains two mandatory properties: `a` for the base character before the modifier is applied, and `b` for the modified character.
|
||||||
|
|
||||||
|
For example, to make the `I` key behave as in Turkish:
|
||||||
|
|
||||||
|
<modmap>
|
||||||
|
<shift a="i" b="İ" />
|
||||||
|
</modmap>
|
||||||
|
|
||||||
|
There can be as many of these tags inside `<modmap>` as needed.
|
||||||
|
|
||||||
|
Shift and Fn modmaps also affect the clockwise circle and the roundtrip gestures.
|
||||||
|
|
||||||
|
### Row
|
||||||
|
|
||||||
|
The `<row>` tag encloses one row on the keyboard. It requires no properties, and supports the following:
|
||||||
|
|
||||||
|
* `height`: The height of the row. Defaults to 1, and accepts a positive floating point value.
|
||||||
|
|
||||||
|
The total height of the keyboard is defined in Settings as a percentage of the total height of the screen, which can be different between portrait and landscape. The height of a row is relative to the other ones, and are scaled to keep the height of the keyboard constant.
|
||||||
|
|
||||||
|
### Key
|
||||||
|
|
||||||
|
The `<key />` tag defines a key on the keyboard. It requires at least one of the following properties:
|
||||||
|
|
||||||
|
* `key0`: What the key should do when it is tapped.
|
||||||
|
* `nw`, `ne`, `sw`, `se`, `w`, `e`, `n`, `s`: What the key should do when it is swiped. They are based on cardinal directions, and uses the convention that North is up. These are the new set of keywords, and should not be used with the other set of keywords.
|
||||||
|
|
||||||
|
nw | n | ne
|
||||||
|
:-: | :--: | :-:
|
||||||
|
w | key0 | e
|
||||||
|
sw | s | se
|
||||||
|
|
||||||
|
* `key1` through `key8`: The older set of keywords for what the key should do when it is swiped. The directions are ordered as follows:
|
||||||
|
|
||||||
|
key1 | key7 | key2
|
||||||
|
:--: | :--: | :--:
|
||||||
|
key5 | key0 | key6
|
||||||
|
key3 | key8 | key4
|
||||||
|
|
||||||
|
The following properties are optionally supported:
|
||||||
|
|
||||||
|
* `width`: The width of the key relative to the normal width. Defaults to `1` and accepts a positive floating point value.
|
||||||
|
* `shift`: How much empty space to add to the left of this key. Defaults to `0` and accepts a non-negative floating point value.
|
||||||
|
* `indication`: An extra label to show under the main label, intended to be used as a legend for 2A typing (e.g. `<key key0="2" indication="ABC" />`). Caution: if you have `key8` defined, it overlaps!
|
||||||
|
* `slider`: If set to `true`, the keys `w` and `e` are sent repeatedly when the key is being slid on. Intended to be used on the space bar, and in fact used on the default space bar.
|
||||||
|
* `anticircle`: The key value to send when doing an anti-clockwise circle gesture on the key. The clockwise circle and round-trip gestures are not configurable that way.
|
||||||
|
|
||||||
|
## Possible key values
|
||||||
|
|
||||||
|
`key0` and `nw` through `se` (`key1` through `key8`) take arbitrary strings of characters, and if they don't match any of the special values, it is printed verbatim. (This is intended behavior.)
|
||||||
|
|
||||||
|
Special values for the keys are documented in [this page](Possible-key-values).
|
||||||
|
|
||||||
|
### `loc ` prefix
|
||||||
|
|
||||||
|
Keys prefixed with `loc ` do not appear by default, and are only visible when they are enabled through the "Add keys to keyboard" option in the settings menu, or the language installed on the device is detected to require it.
|
||||||
|
|
||||||
|
## Portrait vs. landscape
|
||||||
|
|
||||||
|
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. That is to say, 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.
|
146
doc/Possible-key-values.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
## 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 do not perform editing in response to these keys.
|
||||||
|
|
||||||
|
`esc`, `enter`,
|
||||||
|
`up`, `right`,
|
||||||
|
`down`, `left`,
|
||||||
|
`page_up`, `page_down`,
|
||||||
|
`home`, `end`,
|
||||||
|
`backspace`, `delete`,
|
||||||
|
`insert`, `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`
|
||||||
|
|
||||||
|
## Unexpected Keyboard specific
|
||||||
|
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.
|
||||||
|
`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`
|
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
|
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 |
@@ -15,4 +15,4 @@
|
|||||||
- 다중 레이아웃: QWERTY, QWERTZ, AZERTY. 다양한 테마: White, Dark, OLED Black. 또한 다른 많은 옵션들.
|
- 다중 레이아웃: QWERTY, QWERTZ, AZERTY. 다양한 테마: White, Dark, OLED Black. 또한 다른 많은 옵션들.
|
||||||
|
|
||||||
다른 가상 키보드와 마찬가지로 시스템 설정에서 활성화해야 합니다. 시스템 설정을 열고 다음으로 이동합니다.
|
다른 가상 키보드와 마찬가지로 시스템 설정에서 활성화해야 합니다. 시스템 설정을 열고 다음으로 이동합니다.
|
||||||
시스템 > 언어 및 입력 > 키보드 > 키보드 관리.
|
시스템 > 언어 및 입력 > 키보드 > 키보드 관리.
|
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.
|
6
fastlane/metadata/android/zh-CN/full_description.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。
|
||||||
|
|
||||||
|
此应用最初是为使用 Termux 的程序员而设计的。
|
||||||
|
现在对于日常使用来说也很完美。
|
||||||
|
|
||||||
|
此应用没有广告,不会发送任何网络请求,而且是开源的。
|
1
fastlane/metadata/android/zh-CN/short_description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
适用于 Android 的轻量级、注重隐私的虚拟键盘。
|
38
gen_emoji.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import urllib.request
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
EMOJIS_PATH = 'res/raw/emojis.txt'
|
||||||
|
EMOJI_TEST_PATH = 'emoji-test.txt'
|
||||||
|
EMOJI_TEST_URL = 'https://unicode.org/Public/emoji/latest/emoji-test.txt'
|
||||||
|
|
||||||
|
def rawEmojiFromCodes(codes):
|
||||||
|
return ''.join([chr(int(c, 16)) for c in codes])
|
||||||
|
|
||||||
|
def getEmojiTestContents():
|
||||||
|
if os.path.exists(EMOJI_TEST_PATH):
|
||||||
|
print(f'Using existing {EMOJI_TEST_PATH}')
|
||||||
|
else:
|
||||||
|
print(f'Downloading {EMOJI_TEST_URL}')
|
||||||
|
urllib.request.urlretrieve(EMOJI_TEST_URL, EMOJI_TEST_PATH)
|
||||||
|
return open(EMOJI_TEST_PATH, mode='r', encoding='UTF-8').read()
|
||||||
|
|
||||||
|
|
||||||
|
emoji_list = []
|
||||||
|
group_indices = []
|
||||||
|
for line in getEmojiTestContents().splitlines():
|
||||||
|
if line.startswith('# group:'):
|
||||||
|
if len(group_indices) == 0 or len(emoji_list) > group_indices[-1]:
|
||||||
|
group_indices.append(len(emoji_list))
|
||||||
|
elif not line.startswith('#') and 'fully-qualified' in line:
|
||||||
|
codes = line.split(';')[0].split()
|
||||||
|
emoji_list.append(rawEmojiFromCodes(codes))
|
||||||
|
|
||||||
|
with open(EMOJIS_PATH, 'w', encoding='UTF-8') as emojis:
|
||||||
|
for e in emoji_list:
|
||||||
|
emojis.write(f'{e}\n')
|
||||||
|
emojis.write('\n')
|
||||||
|
|
||||||
|
emojis.write(' '.join([str(g) for g in group_indices]))
|
||||||
|
emojis.write('\n')
|
||||||
|
|
||||||
|
print(f'Parsed {len(emoji_list)} emojis in {len(group_indices)}')
|
@@ -1,18 +0,0 @@
|
|||||||
Tato aplikace je virtuální klávesnící pro Android. Umožňuje rychlejší a plynulejší psaní písmen i symbolů (vč. diakritiky), a to ve vícero jazycích a vlastních rozloženích. To vše zdarma, bez reklam a bez plýtvání vašeho uložiště. Můžete psát libovolné znaky pomocí gest (ASCII i Unicode), používat mrtvé (univerzální) klávesy pro diakritická znaménka a mnohem více.
|
|
||||||
|
|
||||||
Klávesnice zobrazuje až 4 další znaky v rozích každé klávesy. Tyto znaky jsou vyvolány přejetím prstu do vybraného rohu.
|
|
||||||
|
|
||||||
No zkrátka...:
|
|
||||||
|
|
||||||
- Obsahuje každý znak a speciální klávesu, která je běžnou součástí počítačové klávesnice. To přijde vhod obzvláště při používání aplikací jako např. Termux
|
|
||||||
|
|
||||||
- Můžete používat modifikační klávesy, obohaceny o speciální klávesy (např. Tab, Esc, šipky, F klávesy, ale také Ctrl nebo Alt !)
|
|
||||||
|
|
||||||
- Můžete psát vícero jazyky rychleji a bez chyb. Diakritická znaménka mohou být vyvolána i za pomocí mrtvých kláves. Nejdříve zvolte diakritické znaménko a pak znak, který chcete obohatit o toto znaménko.
|
|
||||||
|
|
||||||
- Je vysoce nenáročná a rychlá. Zabere 500x méně místa než klávesnice od Googlu (Gboard) a 15x méně než výchozí klávesnice systému. Bez reklam, bez sledování.
|
|
||||||
|
|
||||||
- Má vícero rozložení: QWERTY, QWERTZ, AZERTY. Motivy: Bílá, Tmavá, OLED Černá. A mnoho dalších které si s drobnou znalostí programování můžete upravovat dle libosti.
|
|
||||||
|
|
||||||
Nezapomeňte... Jako každá virtuální klávesnice, i tato musí být aktivována v nastavení systému (zařízení). Otevřte (Systémové) Nastavení a přejděte na:
|
|
||||||
(Další nastavení NEBO Nastavení systému) > Jazyk & způsob zadávání > Spravovat klávesnice.
|
|
@@ -1 +0,0 @@
|
|||||||
صفحه کلید غیرمنتظره
|
|