Compare commits
56 Commits
compose-ex
...
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 |
@ -190,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:
|
||||
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
|
||||
|
||||
Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.
|
||||
|
@ -25,7 +25,7 @@ Usage: to apply the symbols located in the corners of each key, slide your finge
|
||||
| <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
|
||||
* [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
|
||||
|
||||
|
21
build.gradle
@ -2,6 +2,10 @@ plugins {
|
||||
id 'com.android.application' version '8.1.1'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation "junit:junit:4.13.2"
|
||||
}
|
||||
|
||||
android {
|
||||
namespace 'juloo.keyboard2'
|
||||
compileSdk 34
|
||||
@ -9,18 +13,22 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "juloo.keyboard2"
|
||||
minSdk 11
|
||||
targetSdkVersion 34
|
||||
versionCode 41
|
||||
versionName "1.29.0"
|
||||
targetSdkVersion 35
|
||||
versionCode 42
|
||||
versionName "1.29.1"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['srcs']
|
||||
java.srcDirs = ['srcs/juloo.keyboard2']
|
||||
res.srcDirs = ['res', 'build/generated-resources']
|
||||
assets.srcDirs = ['assets']
|
||||
}
|
||||
|
||||
test {
|
||||
java.srcDirs = ['test']
|
||||
}
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@ -84,9 +92,6 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
}
|
||||
|
||||
tasks.register('buildKeyboardFont') {
|
||||
println "\nBuilding assets/special_font.ttf"
|
||||
mkdir "$buildDir"
|
||||
@ -151,7 +156,7 @@ tasks.register('compileComposeSequences') {
|
||||
println "\nGenerating ${out}"
|
||||
exec {
|
||||
def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
|
||||
it.name.endsWith(".pre") || it.name.endsWith(".json")
|
||||
!it.name.endsWith(".py") && !it.name.endsWith(".md")
|
||||
}
|
||||
workingDir = projectDir
|
||||
commandLine("python", "srcs/compose/compile.py", *sequences)
|
||||
|
@ -29,11 +29,22 @@ Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >
|
||||
0 warnings
|
||||
# cyrl_jcuken_uk
|
||||
0 warnings
|
||||
# cyrl_lynyertz_sr
|
||||
0 warnings
|
||||
# cyrl_ueishsht
|
||||
0 warnings
|
||||
# cyrl_yaverti
|
||||
Layout includes some ASCII punctuation but not all, missing: ~
|
||||
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
|
||||
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
|
||||
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
@ -62,7 +73,7 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
|
||||
# latn_bepo_fr
|
||||
0 warnings
|
||||
# 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 compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
|
||||
2 warnings
|
||||
# latn_colemak
|
||||
@ -85,6 +96,8 @@ Layout redefines the bottom row but some important keys are missing, missing: lo
|
||||
0 warnings
|
||||
# latn_qwerty_hu
|
||||
0 warnings
|
||||
# latn_qwerty_jp
|
||||
0 warnings
|
||||
# latn_qwerty_lv
|
||||
0 warnings
|
||||
# latn_qwerty_no
|
||||
@ -98,6 +111,8 @@ Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# latn_qwerty_sk
|
||||
0 warnings
|
||||
# latn_qwerty_sr
|
||||
0 warnings
|
||||
# latn_qwerty_tly
|
||||
Duplicate keys: a, c, j, q
|
||||
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
|
@ -9,6 +9,12 @@ KNOWN_NOT_LAYOUT = set([
|
||||
"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):
|
||||
global warning_count
|
||||
print(msg)
|
||||
@ -39,7 +45,7 @@ def unexpected_keys(keys, symbols, msg):
|
||||
def parse_row_from_et(row, keys, dup):
|
||||
for key in row:
|
||||
for attr in key.keys():
|
||||
if attr.startswith("key"):
|
||||
if attr in KEY_ATTRIBUTES:
|
||||
k = key.get(attr).removeprefix("\\")
|
||||
if k in keys: dup.add(k)
|
||||
keys.add(k)
|
||||
|
@ -34,11 +34,19 @@ Here is a complete keyboard file with a single row containing an "a" key on the
|
||||
</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 common 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.
|
||||
|
||||
* `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
|
||||
@ -104,24 +112,39 @@ Built-in strings that assign a special function to a key are described in [this
|
||||
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.
|
||||
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).
|
||||
|
||||
A modmap can contain the following tags, each of which must have an `a` and a `b` property:
|
||||
* `<shift a="before" b="after" />` If the Shift modifier is on, the key `before` is changed into `after`.
|
||||
* `<fn a="before" b="after" />` If the Fn modifier is on, the key `before` is changed into `after`.
|
||||
The following mappings are supported:
|
||||
|
||||
Valid values for `before` and `after` are listed in [Possible key values](Possible-key-values.md).
|
||||
```xml
|
||||
<shift a="before" b="after" />
|
||||
```
|
||||
This means that when the Shift modifier is on, the key `before` is changed into `after`.
|
||||
|
||||
There can be as many of these tags inside `<modmap>` as needed.
|
||||
```xml
|
||||
<fn a="before" b="after" />
|
||||
```
|
||||
This means that when the Fn modifier is on, the key `before` is changed into `after`.
|
||||
|
||||
The clockwise circle and the round-trip gestures are affected by both Shift and Fn modmaps. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
|
||||
```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.
|
||||
|
||||
### Example
|
||||
Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following modmap:
|
||||
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.
|
||||
|
||||
<modmap>
|
||||
### 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="İ" />
|
||||
</modmap>
|
||||
```
|
||||
② 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.
|
||||
|
@ -46,7 +46,8 @@ These keys are sent to apps, which are free to ignore them. The keyboard does no
|
||||
`page_up`, `page_down`,
|
||||
`home`, `end`,
|
||||
`backspace`, `delete`,
|
||||
`insert`, `f1`-`f12`,
|
||||
`insert`, `scroll_lock`,
|
||||
`f1`-`f12`,
|
||||
`tab`, `copy`,
|
||||
`paste`, `cut`,
|
||||
`selectAll`, `pasteAsPlainText`,
|
||||
@ -119,7 +120,7 @@ Keys ending in `_placeholder` are normally hidden unless the Fn key is pressed.
|
||||
`ole`, `ole_placeholder`,
|
||||
`meteg`, `meteg_placeholder`
|
||||
|
||||
## Unexpected Keyboard specific
|
||||
## Keyboard behavior keys
|
||||
Value | Meaning
|
||||
:--------------------- | :------
|
||||
`config` | Gear icon; opens Unexpected Keyboard settings.
|
||||
@ -130,6 +131,7 @@ Value | Meaning
|
||||
`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.
|
||||
@ -147,3 +149,42 @@ These keys are known to do nothing.
|
||||
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/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
|
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用仮想キーボード
|
1
fastlane/metadata/android/ja-JP/title.txt
Normal file
@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
@ -1,18 +1,6 @@
|
||||
이 앱은 안드로이드용 가상 키보드입니다. 주요 기능은 스와이프 제스처를 사용하여 모든 ASCII 문자를 쉽게 입력할 수 있다는 점과 악센트 및 수정자 키를 위한 데드 키와 특수 키(tab, esc, 방향키 등)이 있다는 것입니다.
|
||||
주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
|
||||
|
||||
키보드는 각 키의 모서리에 최대 4개의 추가 문자를 표시합니다. 이러한 추가 문자는 키에서 손가락을 스와이프하여 적중됩니다.
|
||||
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
|
||||
지금은 일상적인 용도로도 완벽합니다.
|
||||
|
||||
일부 하이라이트 기능:
|
||||
|
||||
- PC 키보드에서 사용할 수 있는 모든 문자 및 특수 키를 사요 가능합니다. 이것은 Termux와 같은 앱을 사용하는 데 효과적입니다.
|
||||
|
||||
- 여기에는 Tab, Esc, 방향키 및 function 키뿐만이 아닌 Ctrl 및 Alt 키도 포함되어 있습니다 !
|
||||
|
||||
- 악센트 키는 데드 키를 사용하여 액세스할 수 있습니다. 먼저 악센트 키를 활성화한 다음 악센트 문자를 입력합니다.
|
||||
|
||||
- 매우 가볍고 빠릅니다. Google 키보드보다 500배, 기본 키보드보다 15배 적은 공간을 사용합니다. 광고와 사용 기록 추적 없음.
|
||||
|
||||
- 다중 레이아웃: QWERTY, QWERTZ, AZERTY. 다양한 테마: White, Dark, OLED Black. 또한 다른 많은 옵션들.
|
||||
|
||||
다른 가상 키보드와 마찬가지로 시스템 설정에서 활성화해야 합니다. 시스템 설정을 열고 다음으로 이동합니다.
|
||||
시스템 > 언어 및 입력 > 키보드 > 키보드 관리.
|
||||
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.
|
||||
|
25
res/drawable/doc_anim_swipe.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0"?>
|
||||
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt">
|
||||
<aapt:attr name="android:drawable">
|
||||
<vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40">
|
||||
<path android:name="trace" android:pathData="M 0 0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/>
|
||||
</vector>
|
||||
</aapt:attr>
|
||||
<target android:name="trace">
|
||||
<aapt:attr name="android:animation">
|
||||
<set>
|
||||
<objectAnimator android:propertyName="fillAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
|
||||
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
|
||||
<objectAnimator
|
||||
android:propertyName="pathData"
|
||||
android:duration="700"
|
||||
android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0"
|
||||
android:valueTo=" M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31 ,4"
|
||||
android:valueType="pathType"
|
||||
android:interpolator="@android:interpolator/linear_out_slow_in"/>
|
||||
<objectAnimator android:propertyName="fillAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
|
||||
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
|
||||
</set>
|
||||
</aapt:attr>
|
||||
</target>
|
||||
</animated-vector>
|
25
res/drawable/doc_key_u.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="35dp"
|
||||
android:height="40dp"
|
||||
android:viewportWidth="35.0"
|
||||
android:viewportHeight="40.0">
|
||||
<path
|
||||
android:pathData="M11.26,10.13L23.74,10.13A1.13,1.13 0,0 1,24.87 11.26L24.87,28.74A1.13,1.13 0,0 1,23.74 29.88L11.26,29.88A1.13,1.13 0,0 1,10.13 28.74L10.13,11.26A1.13,1.13 0,0 1,11.26 10.13z"
|
||||
android:fillAlpha="1"
|
||||
android:strokeColor="#404040"
|
||||
android:fillColor="#333333"
|
||||
android:strokeWidth="0.251"
|
||||
android:strokeAlpha="1"/>
|
||||
<path
|
||||
android:pathData="m16.64,17.64l0,3.21q0,0.41 0.16,0.58 0.17,0.17 0.5,0.17 0.31,0 0.61,-0.19 0.29,-0.19 0.46,-0.46l0,-3.33l0.98,0l0,4.6l-0.84,0l-0.06,-0.59q-0.26,0.34 -0.65,0.53 -0.39,0.18 -0.8,0.18 -0.67,0 -1,-0.37 -0.33,-0.37 -0.33,-1.01l0,-3.33z"
|
||||
android:fillColor="#fdfdfd"
|
||||
android:strokeWidth="0.265729"/>
|
||||
<path
|
||||
android:pathData="m12.52,24.71q0.3,0 0.54,0.09 0.25,0.09 0.49,0.35l-0.37,0.33q-0.14,-0.16 -0.28,-0.23 -0.14,-0.08 -0.34,-0.08 -0.27,0 -0.41,0.15 -0.14,0.15 -0.14,0.39 0,0.17 0.08,0.31 0.08,0.14 0.23,0.22 0.15,0.08 0.33,0.08l1.58,0l0,0.46l-0.47,0l0,1.56q-0.1,0.12 -0.26,0.24 -0.16,0.12 -0.41,0.21 -0.24,0.08 -0.58,0.08 -0.45,0 -0.75,-0.17 -0.3,-0.17 -0.44,-0.45 -0.15,-0.28 -0.15,-0.6 0,-0.46 0.24,-0.74 0.24,-0.28 0.66,-0.37l0,-0.02q-0.25,-0.06 -0.4,-0.18 -0.15,-0.12 -0.22,-0.3 -0.07,-0.17 -0.07,-0.37 0,-0.26 0.14,-0.48 0.14,-0.22 0.4,-0.35 0.26,-0.13 0.6,-0.13zM13.18,26.79l-0.58,0q-0.28,0 -0.45,0.12 -0.17,0.12 -0.26,0.32 -0.08,0.19 -0.08,0.39 0,0.2 0.08,0.37 0.08,0.17 0.24,0.28 0.16,0.1 0.42,0.1 0.21,0 0.37,-0.07 0.16,-0.07 0.26,-0.19z"
|
||||
android:fillColor="#cccccc"
|
||||
android:strokeWidth="0.265729"/>
|
||||
<path
|
||||
android:pathData="m22.12,15.25 l-0.61,-0.19 1.54,-3.37l-1.84,0l0,-0.51l2.49,0l0,0.47z"
|
||||
android:fillColor="#cccccc"
|
||||
android:strokeWidth="0.265729"/>
|
||||
</vector>
|
@ -4,7 +4,7 @@
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_description"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imesettings" android:onClick="launch_imesettings" android:layout_width="wrap_content"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imepicker" android:onClick="launch_imepicker" android:layout_width="wrap_content"/>
|
||||
<VideoView android:id="@+id/launcher_intro_video" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center"/>
|
||||
<ImageView style="@style/anim" android:id="@+id/launcher_anim_swipe" android:background="@drawable/doc_key_u" android:src="@drawable/doc_anim_swipe"/>
|
||||
<TextView android:id="@+id/launcher_tryhere_text" style="@style/paragraph" android:text="@string/launcher_tryhere"/>
|
||||
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text" android:hint="@string/launcher_tryhere_hint" android:importantForAutofill="no"/>
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_sourcecode"/>
|
||||
|
@ -71,6 +71,7 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="pref_theme_e_monet">Monet (dle systému)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Světlý)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
|
||||
<string name="pref_swipe_dist_e_short">Krátká</string>
|
||||
<string name="pref_swipe_dist_e_default">Běžná</string>
|
||||
@ -120,6 +121,7 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Správce schránky</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
|
||||
<string name="clipboard_pin_heading">Připnout</string>
|
||||
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
|
||||
|
@ -71,6 +71,7 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="pref_theme_e_monet">Monet (System)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Hell)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
|
||||
<string name="pref_swipe_dist_e_short">Kurz</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -120,6 +121,7 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="key_descr_home">Pos1</string>
|
||||
<string name="key_descr_end">Ende</string>
|
||||
<string name="key_descr_clipboard">Clipboard-Manager</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
|
||||
<string name="clipboard_pin_heading">Angeheftet</string>
|
||||
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
|
||||
|
@ -71,6 +71,7 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="pref_theme_e_monet">Monet (de sistema)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (claro)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (oscuro)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
|
||||
<string name="pref_swipe_dist_e_short">Corta</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -120,6 +121,7 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="key_descr_home">Inicio</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="key_descr_clipboard">Arreglar portapapeles</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Textos recién copiados</string>
|
||||
<string name="clipboard_pin_heading">Pegado</string>
|
||||
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
|
||||
|
@ -71,6 +71,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_short">کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_default">عادی</string>
|
||||
@ -120,6 +121,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
@ -71,6 +71,7 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="pref_theme_e_monet">Monet (Système)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Très courte</string>
|
||||
<string name="pref_swipe_dist_e_short">Courte</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@ -120,6 +121,7 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="key_descr_home">Début</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="key_descr_clipboard">Presse-papiers</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Texte récemment copié</string>
|
||||
<string name="clipboard_pin_heading">Épinglé</string>
|
||||
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
|
||||
|
@ -71,6 +71,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
|
||||
<string name="pref_swipe_dist_e_short">Breve</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@ -120,6 +121,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
130
res/values-ja/strings.xml
Normal file
@ -0,0 +1,130 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
|
||||
<string name="store_description">"このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
|
||||
|
||||
このアプリは元々はTermuxでのプログラミング用に設計されました。
|
||||
しかし、今では普段の入力にも適しています。
|
||||
PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
|
||||
|
||||
このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。"</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboardの設定</string>
|
||||
<string name="pref_portrait">縦向き</string>
|
||||
<string name="pref_landscape">横向き</string>
|
||||
<string name="pref_category_layout">レイアウト</string>
|
||||
<string name="pref_label_brightness">文字の明るさ</string>
|
||||
<string name="pref_keyboard_opacity">背景の不透明度</string>
|
||||
<string name="pref_key_opacity">キーの不透明度</string>
|
||||
<string name="pref_key_activated_opacity">押下中のキーの不透明度</string>
|
||||
<string name="pref_layout_e_system">システム設定</string>
|
||||
<string name="pref_layout_e_custom">カスタムレイアウト</string>
|
||||
<string name="pref_layouts_add">レイアウトを追加</string>
|
||||
<string name="pref_layouts_item">レイアウト %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">レイアウトを削除</string>
|
||||
<string name="pref_custom_layout_title">カスタムレイアウト</string>
|
||||
<string name="pref_show_numpad_title">テンキーを表示</string>
|
||||
<string name="pref_show_numpad_never">表示しない</string>
|
||||
<string name="pref_show_numpad_landscape">横向きの時は表示</string>
|
||||
<string name="pref_show_numpad_always">表示する</string>
|
||||
<string name="pref_number_row_title">数字の行を表示</string>
|
||||
<string name="pref_number_row_summary">テンキーが非表示の場合最上段に数字の行を追加します</string>
|
||||
<string name="pref_numpad_layout">テンキーのレイアウト</string>
|
||||
<string name="pref_numpad_layout_e_high_first">大きい数字を上に</string>
|
||||
<string name="pref_numpad_layout_e_low_first">小さい数字を上に</string>
|
||||
<string name="pref_extra_keys_title">追加のキーの設定</string>
|
||||
<string name="pref_extra_keys_custom">キーを追加</string>
|
||||
<string name="pref_extra_keys_internal">キーボードに表示するキーを選択</string>
|
||||
<string name="pref_category_typing">入力</string>
|
||||
<string name="pref_swipe_dist_title">スワイプ距離</string>
|
||||
<string name="pref_swipe_dist_summary">キーの角をスワイプする距離 (%s)</string>
|
||||
<string name="pref_long_timeout_title">キー長押しの時間</string>
|
||||
<string name="pref_long_interval_title">キーを連続入力する間隔</string>
|
||||
<string name="pref_keyrepeat_enabled">長押しでキーを連続入力する</string>
|
||||
<string name="pref_lock_double_tap_title">ShiftをダブルタップでCaps Lock</string>
|
||||
<string name="pref_lock_double_tap_summary">どの装飾キーも長押しで固定できます</string>
|
||||
<string name="pref_category_behavior">挙動</string>
|
||||
<string name="pref_autocapitalisation_title">自動大文字化</string>
|
||||
<string name="pref_autocapitalisation_summary">文章の先頭でShiftキーを自動入力</string>
|
||||
<string name="pref_switch_input_immediate_title">最後に使用したキーボードに切替</string>
|
||||
<string name="pref_switch_input_immediate_summary">キーボード切替キーの挙動</string>
|
||||
<string name="pref_vibrate_custom">キーボード独自の振動設定</string>
|
||||
<string name="pref_vibrate_duration_title">振動の時間</string>
|
||||
<string name="pref_pin_entry_enabled_title">PIN入力</string>
|
||||
<string name="pref_pin_entry_enabled_summary">数字・日付・電話番号入力時</string>
|
||||
<string name="pref_category_style">表示</string>
|
||||
<string name="pref_margin_bottom_title">下の余白</string>
|
||||
<string name="pref_keyboard_height_title">キーボードの高さ</string>
|
||||
<string name="pref_horizontal_margin_title">左右の余白</string>
|
||||
<string name="pref_character_size_title">文字の大きさ</string>
|
||||
<string name="pref_character_size_summary">キーボードに表示される文字の大きさ (%.2fx)</string>
|
||||
<string name="pref_theme">テーマ</string>
|
||||
<string name="pref_theme_e_system">システム設定</string>
|
||||
<string name="pref_theme_e_dark">ダークモード</string>
|
||||
<string name="pref_theme_e_light">ライトモード</string>
|
||||
<string name="pref_theme_e_black">黒</string>
|
||||
<string name="pref_theme_e_altblack">黒(別バージョン)</string>
|
||||
<string name="pref_theme_e_white">白</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desert</string>
|
||||
<string name="pref_theme_e_jungle">Jungle</string>
|
||||
<string name="pref_theme_e_monet">Monet (システム)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (ライト)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (ダーク)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">短い</string>
|
||||
<string name="pref_swipe_dist_e_short">やや短い</string>
|
||||
<string name="pref_swipe_dist_e_default">普通</string>
|
||||
<string name="pref_swipe_dist_e_far">やや長い</string>
|
||||
<string name="pref_swipe_dist_e_very_far">長い</string>
|
||||
<string name="pref_key_horizontal_space">キー間の左右の間隔</string>
|
||||
<string name="pref_key_vertical_space">キー間の上下の間隔</string>
|
||||
<string name="pref_border_config_title">キー形状の設定</string>
|
||||
<string name="pref_border_width_title">縁取り</string>
|
||||
<string name="pref_corners_radius_title">丸み</string>
|
||||
<string name="pref_circle_sensitivity_title">円形ジェスチャーの感度</string>
|
||||
<string name="pref_circle_sensitivity_e_high">高</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">中</string>
|
||||
<string name="pref_circle_sensitivity_e_low">低</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">無効</string>
|
||||
<string name="key_action_next">次へ</string>
|
||||
<string name="key_action_done">完了</string>
|
||||
<string name="key_action_go">実行</string>
|
||||
<string name="key_action_prev">戻る</string>
|
||||
<string name="key_action_search">検索</string>
|
||||
<string name="key_action_send">送信</string>
|
||||
<string name="launcher_button_imesettings">キーボードを有効化</string>
|
||||
<string name="launcher_button_imepicker">キーボードを選択</string>
|
||||
<string name="launcher_description">このアプリは仮想キーボードです。下のボタンからシステム設定を開いてUnexpected Keyboardを有効化してください。</string>
|
||||
<string name="launcher_sourcecode">このアプリはオープンソースのフリーウェアです。GitHubでソースコードを入手したり、不具合を報告したりできます。</string>
|
||||
<string name="launcher_tryhere">有効化されている場合、ここでキーボードを試すことができます。</string>
|
||||
<string name="launcher_tryhere_hint">文字を入力</string>
|
||||
<string name="key_descr_capslock">Caps Lock</string>
|
||||
<string name="key_descr_compose">Compose</string>
|
||||
<string name="key_descr_switch_greekmath">ギリシャ文字と数学記号</string>
|
||||
<string name="key_descr_change_method">キーボードの切替</string>
|
||||
<string name="key_descr_voice_typing">音声入力</string>
|
||||
<string name="key_descr_copy">コピー</string>
|
||||
<string name="key_descr_paste">貼り付け</string>
|
||||
<string name="key_descr_cut">切り取り</string>
|
||||
<string name="key_descr_selectAll">すべて選択</string>
|
||||
<string name="key_descr_shareText">テキストを共有</string>
|
||||
<string name="key_descr_pasteAsPlainText">書式なしで貼り付け</string>
|
||||
<string name="key_descr_undo">元に戻す</string>
|
||||
<string name="key_descr_redo">やり直し</string>
|
||||
<string name="key_descr_ª">序数標識</string>
|
||||
<string name="key_descr_º">序数標識</string>
|
||||
<string name="key_descr_superscript">上付き文字</string>
|
||||
<string name="key_descr_subscript">下付き文字</string>
|
||||
<string name="key_descr_page_up">Page Up</string>
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">クリップボード</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
|
||||
<string name="clipboard_pin_heading">お気に入り</string>
|
||||
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
|
||||
<string name="clipboard_remove_confirmed">はい</string>
|
||||
</resources>
|
@ -3,55 +3,55 @@
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
|
||||
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
|
||||
<!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
|
||||
<string name="store_description">"주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
|
||||
지금은 일상적인 용도로도 완벽합니다.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
<string name="pref_portrait">세로 화면</string>
|
||||
<string name="pref_landscape">가로 화면</string>
|
||||
<string name="pref_category_layout">레이아웃</string>
|
||||
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_label_brightness">라벨 밝기 조절</string>
|
||||
<string name="pref_keyboard_opacity">키보드 배경 불투명도 조절</string>
|
||||
<string name="pref_key_opacity">키 불투명도 조절</string>
|
||||
<string name="pref_key_activated_opacity">누른 키 불투명도 조절</string>
|
||||
<string name="pref_layout_e_system">시스템 세팅</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</string> -->
|
||||
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
|
||||
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_show_numpad_title">Show NumPad</string> -->
|
||||
<!-- <string name="pref_show_numpad_never">Never</string> -->
|
||||
<!-- <string name="pref_show_numpad_landscape">Only in landscape mode</string> -->
|
||||
<!-- <string name="pref_show_numpad_always">Always</string> -->
|
||||
<!-- <string name="pref_number_row_title">Show number row</string> -->
|
||||
<!-- <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> -->
|
||||
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
|
||||
<!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
|
||||
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
|
||||
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
|
||||
<string name="pref_category_typing">타자</string>
|
||||
<string name="pref_layout_e_custom">사용자 정의 레이아웃</string>
|
||||
<string name="pref_layouts_add">대체 레이아웃 추가</string>
|
||||
<string name="pref_layouts_item">레이아웃 %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">레이아웃 제거</string>
|
||||
<string name="pref_custom_layout_title">사용자 정의 레이아웃</string>
|
||||
<string name="pref_show_numpad_title">NumPad 표시</string>
|
||||
<string name="pref_show_numpad_never">안 함</string>
|
||||
<string name="pref_show_numpad_landscape">가로 모드에서만</string>
|
||||
<string name="pref_show_numpad_always">항상</string>
|
||||
<string name="pref_number_row_title">숫자 열 표시</string>
|
||||
<string name="pref_number_row_summary">NumPad이 숨겨진 경우 키보드 상단에 숫자 행을 추가합니다.</string>
|
||||
<string name="pref_numpad_layout">NumPad 레이아웃</string>
|
||||
<string name="pref_numpad_layout_e_high_first">높은 자리수 우선</string>
|
||||
<string name="pref_numpad_layout_e_low_first">낮은 자리수 우선</string>
|
||||
<string name="pref_extra_keys_title">키보드에 추가 키 설정</string>
|
||||
<string name="pref_extra_keys_custom">사용자 정의 키 추가</string>
|
||||
<string name="pref_extra_keys_internal">키보드에 추가할 키 선택</string>
|
||||
<string name="pref_category_typing">입력</string>
|
||||
<string name="pref_swipe_dist_title">스와이프 범위</string>
|
||||
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">길게 누르는 시간</string>
|
||||
<string name="pref_long_interval_title">키 반복 간격</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
|
||||
<!-- <string name="pref_category_behavior">Behavior</string> -->
|
||||
<!-- <string name="pref_autocapitalisation_title">Automatic capitalisation</string> -->
|
||||
<!-- <string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_keyrepeat_enabled">키보드 입력을 길게 유지할 때 반복</string>
|
||||
<string name="pref_lock_double_tap_title">쉬프트 키 더블 탭을 통해 대문자 잠금 설정</string>
|
||||
<string name="pref_lock_double_tap_summary">modifier를 길게 누르고 있으면 해당 modifier가 잠긴 상태로 유지됩니다.</string>
|
||||
<string name="pref_category_behavior">동작</string>
|
||||
<string name="pref_autocapitalisation_title">자동 대문자 전환</string>
|
||||
<string name="pref_autocapitalisation_summary">문장의 시작에서 Shift 키를 눌러 대문자로 전환합니다.</string>
|
||||
<string name="pref_switch_input_immediate_title">마지막으로 사용한 키보드로 전환</string>
|
||||
<string name="pref_switch_input_immediate_summary">키보드 전환 키의 동작 방식입니다.</string>
|
||||
<string name="pref_vibrate_custom">사용자 정의 진동</string>
|
||||
<string name="pref_vibrate_duration_title">진동 강도</string>
|
||||
<string name="pref_pin_entry_enabled_title">Pin 입력 레이아웃</string>
|
||||
<string name="pref_pin_entry_enabled_summary">숫자를 입력할 때, 날짜와 전화번호를 입력할 때 해당 레이아웃이 사용됩니다.</string>
|
||||
<string name="pref_category_style">스타일</string>
|
||||
<string name="pref_margin_bottom_title">아래 넓이</string>
|
||||
<string name="pref_keyboard_height_title">키보드 높이</string>
|
||||
@ -60,17 +60,18 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string>
|
||||
<string name="pref_theme">테마</string>
|
||||
<string name="pref_theme_e_system">시스템 테마</string>
|
||||
<string name="pref_theme_e_dark">Dark</string>
|
||||
<string name="pref_theme_e_light">Light</string>
|
||||
<string name="pref_theme_e_black">Black</string>
|
||||
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_theme_e_dark">다크</string>
|
||||
<string name="pref_theme_e_light">라이트</string>
|
||||
<string name="pref_theme_e_black">블랙</string>
|
||||
<string name="pref_theme_e_altblack">대체 블랙</string>
|
||||
<string name="pref_theme_e_white">화이트</string>
|
||||
<string name="pref_theme_e_epaper">종이</string>
|
||||
<string name="pref_theme_e_desert">사막</string>
|
||||
<string name="pref_theme_e_jungle">정글</string>
|
||||
<string name="pref_theme_e_monet">모네트 (시스템)</string>
|
||||
<string name="pref_theme_e_monetlight">모네트 (라이트)</string>
|
||||
<string name="pref_theme_e_monetdark">모네트 (다크)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
|
||||
<string name="pref_swipe_dist_e_short">짧음</string>
|
||||
<string name="pref_swipe_dist_e_default">보통</string>
|
||||
@ -78,50 +79,51 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_swipe_dist_e_very_far">매우 넓음</string>
|
||||
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
|
||||
<string name="pref_key_vertical_space">키보드 세로 간격</string>
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="pref_border_config_title">경계선 사용자 정의</string>
|
||||
<string name="pref_border_width_title">경계선 너비</string>
|
||||
<string name="pref_corners_radius_title">모서리 반지름</string>
|
||||
<string name="pref_circle_sensitivity_title">원형 제스처 감도</string>
|
||||
<string name="pref_circle_sensitivity_e_high">높음</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">중간</string>
|
||||
<string name="pref_circle_sensitivity_e_low">낮음</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">사용 안 함</string>
|
||||
<string name="key_action_next">다음</string>
|
||||
<string name="key_action_done">확인</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
<string name="key_action_go">엔터</string>
|
||||
<string name="key_action_prev">이전</string>
|
||||
<string name="key_action_search">검색</string>
|
||||
<string name="key_action_send">보내기</string>
|
||||
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
|
||||
<!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> -->
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_compose">Compose</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
<!-- <string name="key_descr_cut">Cut</string> -->
|
||||
<!-- <string name="key_descr_selectAll">Select all</string> -->
|
||||
<!-- <string name="key_descr_shareText">Share text</string> -->
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
<string name="launcher_button_imesettings">키보드 활성화</string>
|
||||
<string name="launcher_button_imepicker">키보드 선택</string>
|
||||
<string name="launcher_description">이 앱은 가상 키보드입니다.Unexpected-Keyboard를 클릭하여 시스템 설정으로 이동하고 아래 버튼을 클릭하세요.</string>
|
||||
<string name="launcher_sourcecode">이것은 무료이고 오픈 소스 응용 프로그램입니다. GitHub에서 원본 코드를 찾을 수 있습니다 또는 버그를 신고할 수 있습니다.</string>
|
||||
<string name="launcher_tryhere">켜면 여기에서 키보드를 시험해 볼 수 있습니다:</string>
|
||||
<string name="launcher_tryhere_hint">여기서 시험해 보기</string>
|
||||
<string name="key_descr_capslock">대문자 잠금</string>
|
||||
<string name="key_descr_compose">구성</string>
|
||||
<string name="key_descr_switch_greekmath">그리스 수학 기호 전환</string>
|
||||
<string name="key_descr_change_method">키보드 전환</string>
|
||||
<string name="key_descr_voice_typing">음성 입력</string>
|
||||
<string name="key_descr_copy">복사</string>
|
||||
<string name="key_descr_paste">붙여넣기</string>
|
||||
<string name="key_descr_cut">자르기</string>
|
||||
<string name="key_descr_selectAll">전부 선택</string>
|
||||
<string name="key_descr_shareText">텍스트 공유</string>
|
||||
<string name="key_descr_pasteAsPlainText">일반 텍스트로 붙여넣기</string>
|
||||
<string name="key_descr_undo">실행 취소</string>
|
||||
<string name="key_descr_redo">다시 실행</string>
|
||||
<string name="key_descr_ª">순서 표시기</string>
|
||||
<string name="key_descr_º">순서 표시기</string>
|
||||
<string name="key_descr_superscript">상위 스크립트</string>
|
||||
<string name="key_descr_subscript">하위 스크립트</string>
|
||||
<string name="key_descr_page_up">페이지 위</string>
|
||||
<string name="key_descr_page_down">페이지 아래</string>
|
||||
<string name="key_descr_home">홈</string>
|
||||
<string name="key_descr_end">종료</string>
|
||||
<string name="key_descr_clipboard">클립보드 관리자</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
|
||||
<string name="clipboard_pin_heading">고정</string>
|
||||
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
|
||||
<string name="clipboard_remove_confirmed">예</string>
|
||||
</resources>
|
||||
|
@ -71,6 +71,7 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="pref_theme_e_monet">Monē (sistēmas)</string>
|
||||
<string name="pref_theme_e_monetlight">Monē (gaišs)</string>
|
||||
<string name="pref_theme_e_monetdark">Monē (tumšs)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
|
||||
<string name="pref_swipe_dist_e_short">Tuvs</string>
|
||||
<string name="pref_swipe_dist_e_default">Vidējs</string>
|
||||
@ -122,6 +123,7 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="key_descr_home">Sākums</string>
|
||||
<string name="key_descr_end">Beigas</string>
|
||||
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
|
||||
<string name="clipboard_pin_heading">Piesprausts</string>
|
||||
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
|
||||
|
@ -71,6 +71,7 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="pref_theme_e_monet">Monet (Systemowy)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Jasny)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
|
||||
<string name="pref_swipe_dist_e_short">Mała</string>
|
||||
<string name="pref_swipe_dist_e_default">Normalna</string>
|
||||
@ -120,6 +121,7 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Zarządzanie schowkiem</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
|
||||
<string name="clipboard_pin_heading">Przypięte</string>
|
||||
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
|
||||
|
@ -71,6 +71,7 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Bem curto</string>
|
||||
<string name="pref_swipe_dist_e_short">Curto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -120,6 +121,7 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
@ -71,6 +71,7 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
|
||||
<string name="pref_swipe_dist_e_short">Apropiată</string>
|
||||
<string name="pref_swipe_dist_e_default">Normală</string>
|
||||
@ -120,6 +121,7 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
@ -71,6 +71,7 @@
|
||||
<string name="pref_theme_e_monet">Моне (системная)</string>
|
||||
<string name="pref_theme_e_monetlight">Моне (светлая)</string>
|
||||
<string name="pref_theme_e_monetdark">Моне (темная)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Очень короткая</string>
|
||||
<string name="pref_swipe_dist_e_short">Короткая</string>
|
||||
<string name="pref_swipe_dist_e_default">Обычная</string>
|
||||
@ -120,6 +121,7 @@
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Менеджер буфера обмена</string>
|
||||
<string name="key_descr_combining">Сочетание диакритических знаков</string>
|
||||
<string name="clipboard_history_heading">Недавно скопированный текст</string>
|
||||
<string name="clipboard_pin_heading">Закреплено</string>
|
||||
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
|
||||
|
@ -71,6 +71,7 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Açık)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Koyu)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
|
||||
<string name="pref_swipe_dist_e_short">Kısa</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -120,6 +121,7 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
|
||||
<string name="key_descr_end">SON(Sağ yön tuşu)</string>
|
||||
<string name="key_descr_clipboard">Pano</string>
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<string name="clipboard_history_heading">Son kopyalanan metin</string>
|
||||
<string name="clipboard_pin_heading">Sabitlendi</string>
|
||||
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
|
||||
|
@ -71,6 +71,7 @@
|
||||
<string name="pref_theme_e_monet">Моне (Системна)</string>
|
||||
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
|
||||
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
|
||||
<string name="pref_swipe_dist_e_short">Коротка</string>
|
||||
<string name="pref_swipe_dist_e_default">Звичайна</string>
|
||||
@ -120,6 +121,7 @@
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
|
||||
<string name="key_descr_combining">Комбінування діакритики</string>
|
||||
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
|
||||
<string name="clipboard_pin_heading">Закріплено</string>
|
||||
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
|
||||
|
@ -71,6 +71,7 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Rất gần</string>
|
||||
<string name="pref_swipe_dist_e_short">Gần</string>
|
||||
<string name="pref_swipe_dist_e_default">Trungbình</string>
|
||||
@ -120,6 +121,7 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
@ -71,6 +71,7 @@
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">非常短</string>
|
||||
<string name="pref_swipe_dist_e_short">短</string>
|
||||
<string name="pref_swipe_dist_e_default">中(默认)</string>
|
||||
@ -120,6 +121,7 @@
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
|
@ -31,6 +31,7 @@
|
||||
<item>@string/pref_theme_e_monet</item>
|
||||
<item>@string/pref_theme_e_monetlight</item>
|
||||
<item>@string/pref_theme_e_monetdark</item>
|
||||
<item>@string/pref_theme_e_rosepine</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_values">
|
||||
<item>system</item>
|
||||
@ -45,6 +46,7 @@
|
||||
<item>monet</item>
|
||||
<item>monetlight</item>
|
||||
<item>monetdark</item>
|
||||
<item>rosepine</item>
|
||||
</string-array>
|
||||
<string-array name="pref_swipe_dist_entries">
|
||||
<item>@string/pref_swipe_dist_e_very_short</item>
|
||||
|
@ -17,8 +17,11 @@
|
||||
<item>beng_provat</item>
|
||||
<item>cyrl_jcuken_ru</item>
|
||||
<item>cyrl_jcuken_uk</item>
|
||||
<item>cyrl_lynyertz_sr</item>
|
||||
<item>cyrl_ueishsht</item>
|
||||
<item>cyrl_yaverti</item>
|
||||
<item>cyrl_yqukeng_tj</item>
|
||||
<item>cyrl_yxukeng_os</item>
|
||||
<item>deva_alt</item>
|
||||
<item>deva_inscript</item>
|
||||
<item>grek_qwerty</item>
|
||||
@ -36,12 +39,14 @@
|
||||
<item>latn_qwerty_es</item>
|
||||
<item>latn_qwerty_gb</item>
|
||||
<item>latn_qwerty_hu</item>
|
||||
<item>latn_qwerty_jp</item>
|
||||
<item>latn_qwerty_lv</item>
|
||||
<item>latn_qwerty_no</item>
|
||||
<item>latn_qwerty_pl</item>
|
||||
<item>latn_qwerty_ro</item>
|
||||
<item>latn_qwerty_se</item>
|
||||
<item>latn_qwerty_sk</item>
|
||||
<item>latn_qwerty_sr</item>
|
||||
<item>latn_qwerty_tly</item>
|
||||
<item>latn_qwerty_tr</item>
|
||||
<item>latn_qwerty_vi</item>
|
||||
@ -72,8 +77,11 @@
|
||||
<item>বাংলা (প্রভাত)</item>
|
||||
<item>ЙЦУКЕН (Русский)</item>
|
||||
<item>ЙЦУКЕН (Українська)</item>
|
||||
<item>ЉЊЕРТЗ (Српски)</item>
|
||||
<item>УЕИШЩ (Български, БДС)</item>
|
||||
<item>ЯВЕРТЪ</item>
|
||||
<item>Tajiki Persian (Тоҷикӣ)</item>
|
||||
<item>Old Church Slavonic (Црькъвьнословѣньскъ ѩзыкъ)</item>
|
||||
<item>देवनागरी (हिंदी)-2</item>
|
||||
<item>देवनागरी (हिंदी)-1</item>
|
||||
<item>QWERTY (Greek)</item>
|
||||
@ -91,12 +99,14 @@
|
||||
<item>QWERTY (Español)</item>
|
||||
<item>QWERTY (UK)</item>
|
||||
<item>QWERTY (Magyar)</item>
|
||||
<item>QWERTY (Japan)</item>
|
||||
<item>QWERTY (Latvian)</item>
|
||||
<item>QWERTY (Norwegian)</item>
|
||||
<item>QWERTY (Polski)</item>
|
||||
<item>QWERTY (Română)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Slovak)</item>
|
||||
<item>QWERTY (Srpski, latinica)</item>
|
||||
<item>QWERTY (Talysh New Latin)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>QWERTY (Vietnamese)</item>
|
||||
@ -127,8 +137,11 @@
|
||||
<item>@xml/beng_provat</item>
|
||||
<item>@xml/cyrl_jcuken_ru</item>
|
||||
<item>@xml/cyrl_jcuken_uk</item>
|
||||
<item>@xml/cyrl_lynyertz_sr</item>
|
||||
<item>@xml/cyrl_ueishsht</item>
|
||||
<item>@xml/cyrl_yaverti</item>
|
||||
<item>@xml/cyrl_yqukeng_tj</item>
|
||||
<item>@xml/cyrl_yxukeng_os</item>
|
||||
<item>@xml/deva_alt</item>
|
||||
<item>@xml/deva_inscript</item>
|
||||
<item>@xml/grek_qwerty</item>
|
||||
@ -146,12 +159,14 @@
|
||||
<item>@xml/latn_qwerty_es</item>
|
||||
<item>@xml/latn_qwerty_gb</item>
|
||||
<item>@xml/latn_qwerty_hu</item>
|
||||
<item>@xml/latn_qwerty_jp</item>
|
||||
<item>@xml/latn_qwerty_lv</item>
|
||||
<item>@xml/latn_qwerty_no</item>
|
||||
<item>@xml/latn_qwerty_pl</item>
|
||||
<item>@xml/latn_qwerty_ro</item>
|
||||
<item>@xml/latn_qwerty_se</item>
|
||||
<item>@xml/latn_qwerty_sk</item>
|
||||
<item>@xml/latn_qwerty_sr</item>
|
||||
<item>@xml/latn_qwerty_tly</item>
|
||||
<item>@xml/latn_qwerty_tr</item>
|
||||
<item>@xml/latn_qwerty_vi</item>
|
||||
|
@ -71,6 +71,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_theme_e_monet">Monet (System)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Light)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Dark)</string>
|
||||
<string name="pref_theme_e_rosepine">Rosé Pine</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Very short</string>
|
||||
<string name="pref_swipe_dist_e_short">Short</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -120,6 +121,7 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Clipboard manager</string>
|
||||
<string name="key_descr_combining">Combining diacritic</string>
|
||||
<string name="clipboard_history_heading">Recently copied text</string>
|
||||
<string name="clipboard_pin_heading">Pinned</string>
|
||||
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
|
||||
|
@ -56,5 +56,12 @@
|
||||
<item name="android:layout_marginHorizontal">16dp</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
</style>
|
||||
<style name="anim">
|
||||
<item name="android:layout_width">100dp</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginVertical">16dp</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
<item name="android:adjustViewBounds">true</item>
|
||||
</style>
|
||||
<style name="appTheme" parent="@android:style/Theme.DeviceDefault.DayNight"/>
|
||||
</resources>
|
||||
|
@ -203,4 +203,23 @@
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">@android:color/system_accent1_900</item>
|
||||
</style>
|
||||
<style name="RosePine" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<item name="colorKeyboard">#191724</item>
|
||||
<item name="colorKey">#26233a</item>
|
||||
<item name="colorKeyActivated">#403d52</item>
|
||||
<item name="keyBorderWidth">0dp</item>
|
||||
<item name="keyBorderWidthActivated">1dp</item>
|
||||
<item name="keyBorderColorLeft">#6e6a86</item>
|
||||
<item name="keyBorderColorTop">#6e6a86</item>
|
||||
<item name="keyBorderColorRight">#6e6a86</item>
|
||||
<item name="keyBorderColorBottom">#6e6a86</item>
|
||||
<item name="colorLabel">#e0def4</item>
|
||||
<item name="colorLabelActivated">#c4a7e7</item>
|
||||
<item name="colorLabelLocked">#31748f</item>
|
||||
<item name="colorSubLabel">#6e6a86</item>
|
||||
<item name="keyBorderRadius">1dp</item>
|
||||
<item name="emoji_button_bg">#26233a</item>
|
||||
<item name="emoji_color">#e0def4</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@ -10,6 +10,7 @@
|
||||
<subtype android:label="%s" android:languageTag="da" android:imeSubtypeLocale="da_DK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_da,extra_keys=€|æ|å|ø"/>
|
||||
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/>
|
||||
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
|
||||
<subtype android:label="%s" android:languageTag="en-AU" android:imeSubtypeLocale="en_AU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
|
||||
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
|
||||
@ -23,6 +24,7 @@
|
||||
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/>
|
||||
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d"/>
|
||||
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/>
|
||||
<subtype android:label="%s" android:languageTag="ja" android:imeSubtypeLocale="ja_JP" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_jp"/>
|
||||
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/>
|
||||
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/>
|
||||
@ -35,6 +37,7 @@
|
||||
<subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/>
|
||||
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/>
|
||||
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/>
|
||||
<subtype android:label="%s" android:languageTag="sr" android:imeSubtypeLocale="sr_" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_lynyertz_sr"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á@d|accent_trema:ä:ö@o|accent_ring:å@s|€"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/>
|
||||
|
@ -45,7 +45,7 @@
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
|
||||
</PreferenceScreen>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.75" max="1.5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.15" min="0.75" max="1.5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_horizontal_margin" android:title="@string/pref_key_horizontal_space" android:summary="%s%%" android:defaultValue="2" min="0" max="5"/>
|
||||
<CheckBoxPreference android:key="border_config" android:title="@string/pref_border_config_title" android:defaultValue="false"/>
|
||||
|
@ -15,12 +15,13 @@ let
|
||||
|
||||
ANDROID_SDK_ROOT = "${android.androidsdk}/libexec/android-sdk";
|
||||
|
||||
gradle = pkgs.gradle.override { java = jdk; };
|
||||
# Without this option, aapt2 fails to run with a permissions error.
|
||||
gradle_wrapped = pkgs.runCommandLocal "gradle-wrapped" {
|
||||
nativeBuildInputs = with pkgs; [ makeBinaryWrapper ];
|
||||
} ''
|
||||
mkdir -p $out/bin
|
||||
ln -s ${pkgs.gradle}/bin/gradle $out/bin/gradle
|
||||
ln -s ${gradle}/bin/gradle $out/bin/gradle
|
||||
wrapProgram $out/bin/gradle \
|
||||
--add-flags "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${build_tools_version}/aapt2"
|
||||
'';
|
||||
|
@ -3,6 +3,8 @@
|
||||
The `compose.py` program parses the compose sequences found in this directory
|
||||
and generates `srcs/juloo.keyboard2/ComposeKeyData.java`.
|
||||
|
||||
## `en_US_UTF_8_Compose.pre`
|
||||
## `compose/en_US_UTF_8_Compose.pre`
|
||||
|
||||
This file is copied from the `xorg` project. Copyright applies.
|
||||
|
||||
## `compose/extra.json`
|
||||
|
@ -1,17 +1,52 @@
|
||||
{
|
||||
// latin
|
||||
"a": "á",
|
||||
"c": "ć",
|
||||
"e": "é",
|
||||
"g": "ǵ",
|
||||
"i": "í",
|
||||
"k": "ḱ",
|
||||
"l": "ĺ",
|
||||
"ń": "ń",
|
||||
"m": "ḿ",
|
||||
"n": "ń",
|
||||
"o": "ó",
|
||||
"p": "ṕ",
|
||||
"r": "ŕ",
|
||||
"s": "ś",
|
||||
"u": "ú",
|
||||
"w": "ẃ",
|
||||
"y": "ý",
|
||||
"z": "ź",
|
||||
// extended latin (multiple diacritics)
|
||||
"â": "ấ",
|
||||
"ă": "ắ",
|
||||
"å": "ǻ",
|
||||
"æ": "ǽ",
|
||||
"ç": "ḉ",
|
||||
"ê": "ế",
|
||||
"ē": "ḗ",
|
||||
"ï": "ḯ",
|
||||
"ô": "ố",
|
||||
"ơ": "ớ",
|
||||
"õ": "ṍ",
|
||||
"ō": "ṓ",
|
||||
"ø": "ǿ",
|
||||
"ṡ": "ṥ",
|
||||
"ü": "ǘ",
|
||||
"ư": "ứ",
|
||||
"ũ": "ṹ",
|
||||
// greek
|
||||
"α": "ά",
|
||||
"ε": "έ",
|
||||
"η": "ή",
|
||||
"ι": "ί",
|
||||
"ο": "ό",
|
||||
"υ": "ύ",
|
||||
// cyrillic
|
||||
"к": "ќ",
|
||||
"г": "ѓ",
|
||||
// combining character
|
||||
"ą": "ą\u0301",
|
||||
"j": "j\u0301",
|
||||
"у": "у\u0301",
|
||||
"е": "е\u0301",
|
||||
|
@ -1,8 +1,12 @@
|
||||
{
|
||||
// latin
|
||||
"2": "ƻ",
|
||||
"b": "ƀ",
|
||||
"c": "ꞓ",
|
||||
"d": "đ",
|
||||
"f": "ꞙ",
|
||||
"g": "ǥ",
|
||||
"h": "ħ",
|
||||
"i": "ɨ",
|
||||
"j": "ɉ",
|
||||
"k": "ꝁ",
|
||||
@ -14,5 +18,13 @@
|
||||
"t": "ŧ",
|
||||
"u": "ʉ",
|
||||
"y": "ɏ",
|
||||
"z": "ƶ"
|
||||
"z": "ƶ",
|
||||
// extended latin
|
||||
"ȷ": "ɟ",
|
||||
// cyrillic
|
||||
"о": "ө",
|
||||
"ӧ": "ӫ",
|
||||
"ү": "ұ",
|
||||
"ь": "ҍ",
|
||||
"х": "ӿ"
|
||||
}
|
||||
|
@ -1,9 +1,14 @@
|
||||
{
|
||||
// latin
|
||||
"a": "ǎ",
|
||||
"c": "č",
|
||||
"d": "ď",
|
||||
"e": "ě",
|
||||
"g": "ǧ",
|
||||
"h": "ȟ",
|
||||
"i": "ǐ",
|
||||
"j": "ǰ", // no uppercase
|
||||
"k": "ǩ",
|
||||
"l": "ľ",
|
||||
"n": "ň",
|
||||
"o": "ǒ",
|
||||
@ -12,5 +17,17 @@
|
||||
"t": "ť",
|
||||
"u": "ǔ",
|
||||
"z": "ž",
|
||||
"ü": "ǚ"
|
||||
// extended latin
|
||||
"ṡ": "ṧ",
|
||||
"ü": "ǚ",
|
||||
"ʒ": "ǯ",
|
||||
// combining character
|
||||
"в": "в\u030C",
|
||||
"г": "г\u030C",
|
||||
"ғ": "ғ\u030C",
|
||||
"д": "д\u030C",
|
||||
"з": "з\u030C",
|
||||
"р": "р\u030C",
|
||||
"т": "т\u030C",
|
||||
"х": "х\u030C"
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
// latin
|
||||
"c": "ç",
|
||||
"d": "ḑ",
|
||||
"e": "ȩ",
|
||||
@ -9,5 +10,8 @@
|
||||
"n": "ņ",
|
||||
"r": "ŗ",
|
||||
"s": "ş",
|
||||
"t": "ţ"
|
||||
"t": "ţ",
|
||||
// extended latin
|
||||
"ć": "ḉ",
|
||||
"ĕ": "ḝ"
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
{
|
||||
"+": "⨣",
|
||||
"≈": "⩯",
|
||||
// latin
|
||||
"a": "â",
|
||||
"c": "ĉ",
|
||||
"e": "ê",
|
||||
@ -9,5 +12,30 @@
|
||||
"o": "ô",
|
||||
"ŝ": "ŝ",
|
||||
"u": "û",
|
||||
"z": "ẑ"
|
||||
"w": "ŵ",
|
||||
"x": "x̂",
|
||||
"y": "ŷ",
|
||||
"z": "ẑ",
|
||||
// extended latin
|
||||
"á": "ấ",
|
||||
"à": "ầ",
|
||||
"ã": "ẫ",
|
||||
"ạ": "ậ",
|
||||
"ả": "ẩ",
|
||||
"é": "ế",
|
||||
"è": "ề",
|
||||
"ẽ": "ễ",
|
||||
"ẹ": "ệ",
|
||||
"ẻ": "ể",
|
||||
"ó": "ố",
|
||||
"ò": "ồ",
|
||||
"ơ": "ổ",
|
||||
"õ": "ỗ",
|
||||
"ọ": "ộ",
|
||||
// combining characters
|
||||
"а": "а\u0302",
|
||||
"е": "е\u0302",
|
||||
"и": "и\u0302",
|
||||
"о": "о\u0302",
|
||||
"у": "у\u0302"
|
||||
}
|
||||
|
@ -17,5 +17,40 @@
|
||||
"w": "ẇ",
|
||||
"x": "ẋ",
|
||||
"y": "ẏ",
|
||||
"z": "ż"
|
||||
"z": "ż",
|
||||
// remove dot since i and j already have one
|
||||
"i": "ı",
|
||||
"j": "ȷ",
|
||||
// extended latin
|
||||
"ā": "ǡ",
|
||||
"ō": "ȱ",
|
||||
"ś": "ṥ",
|
||||
"ṣ": "ṩ",
|
||||
"š": "ṧ",
|
||||
"ſ": "ẛ",
|
||||
// combining character
|
||||
"k": "k\u0307",
|
||||
"l": "l\u0307",
|
||||
"q": "q\u0307",
|
||||
"u": "u\u0307",
|
||||
"v": "v\u0307",
|
||||
"0": "0\u0307",
|
||||
"1": "1\u0307",
|
||||
"2": "2\u0307",
|
||||
"3": "3\u0307",
|
||||
"4": "4\u0307",
|
||||
"5": "5\u0307",
|
||||
"6": "6\u0307",
|
||||
"7": "7\u0307",
|
||||
"8": "8\u0307",
|
||||
"9": "9\u0307",
|
||||
// math
|
||||
"∈": "⋵",
|
||||
"⨯": "⨰",
|
||||
"∧": "⩑",
|
||||
"∨": "⩒",
|
||||
"≡": "⩧",
|
||||
"~": "⩪",
|
||||
"⊆": "⫃",
|
||||
"⊇": "⫄"
|
||||
}
|
||||
|
@ -1,14 +1,34 @@
|
||||
{
|
||||
// latin
|
||||
"a": "ạ",
|
||||
"b": "ḅ",
|
||||
"d": "ḍ",
|
||||
"e": "ẹ",
|
||||
"h": "ḥ",
|
||||
"i": "ị",
|
||||
"k": "ḳ",
|
||||
"l": "ḷ",
|
||||
"m": "ṃ",
|
||||
"n": "ṇ",
|
||||
"o": "ọ",
|
||||
"r": "ṛ",
|
||||
"s": "ṣ",
|
||||
"t": "ṭ",
|
||||
"u": "ụ",
|
||||
"v": "ṿ",
|
||||
"w": "ẉ",
|
||||
"y": "ỵ",
|
||||
"z": "ẓ",
|
||||
// extended latin
|
||||
"ă": "ặ",
|
||||
"â": "ậ",
|
||||
"e": "ẹ",
|
||||
"ê": "ệ",
|
||||
"i": "ị",
|
||||
"o": "ọ",
|
||||
"ô": "ộ",
|
||||
"ơ": "ợ",
|
||||
"u": "ụ",
|
||||
"ṡ": "ṩ",
|
||||
"ư": "ự",
|
||||
"y": "ỵ"
|
||||
// math
|
||||
"-": "⨪",
|
||||
"+": "⨥",
|
||||
"=": "⩦"
|
||||
}
|
||||
|
@ -1,7 +1,11 @@
|
||||
{
|
||||
" ": "˝",
|
||||
// latin
|
||||
"o": "ő",
|
||||
"u": "ű",
|
||||
" ": "˝",
|
||||
// cyrillic
|
||||
"у": "ӳ",
|
||||
// combining character
|
||||
"a": "a\u030b",
|
||||
"e": "e\u030b",
|
||||
"i": "i\u030b",
|
||||
|
@ -1,8 +1,38 @@
|
||||
{
|
||||
// latin
|
||||
"a": "à",
|
||||
"e": "è",
|
||||
"i": "ì",
|
||||
"n": "ǹ",
|
||||
"o": "ò",
|
||||
"u": "ù",
|
||||
"ü": "ǜ"
|
||||
"w": "ẁ",
|
||||
"y": "ỳ",
|
||||
// extended latin
|
||||
"â": "ầ",
|
||||
"ă": "ằ",
|
||||
"ê": "ề",
|
||||
"ē": "ḕ",
|
||||
"ơ": "ờ",
|
||||
"ô": "ồ",
|
||||
"ō": "ṑ",
|
||||
"ü": "ǜ",
|
||||
"ư": "ừ",
|
||||
// greek (technically not a grave, but a varia)
|
||||
"α": "ὰ",
|
||||
"ε": "ὲ",
|
||||
"η": "ὴ",
|
||||
"ι": "ὶ",
|
||||
"ο": "ὸ",
|
||||
"υ": "ὺ",
|
||||
"ω": "ὼ",
|
||||
// there is more like ἒ, ᾣ, etc
|
||||
// cyrillic
|
||||
"е": "ѐ",
|
||||
"и": "ѝ",
|
||||
// combining character
|
||||
"ɔ": "ɔ\u0300",
|
||||
"s": "s\u0300",
|
||||
"ʌ": "ʌ\u0300",
|
||||
"z": "z\u0300"
|
||||
}
|
||||
|
@ -1,8 +1,35 @@
|
||||
{
|
||||
// latin
|
||||
"a": "ā",
|
||||
"e": "ē",
|
||||
"g": "ḡ",
|
||||
"i": "ī",
|
||||
"o": "ō",
|
||||
"u": "ū",
|
||||
"ü": "ǖ"
|
||||
"y": "ȳ",
|
||||
// extended latin
|
||||
"æ": "ǣ",
|
||||
"ä": "ǟ",
|
||||
"ȧ": "ǡ",
|
||||
"è": "ḕ",
|
||||
"é": "ḗ",
|
||||
"ḷ": "ḹ",
|
||||
"ṛ": "ṝ",
|
||||
"ö": "ȫ",
|
||||
"ȯ": "ȱ",
|
||||
"ǫ": "ǭ",
|
||||
"õ": "ȭ",
|
||||
"ò": "ṑ",
|
||||
"ó": "ṓ",
|
||||
"ü": "ǖ", // there is also ṻ
|
||||
// cyrillic
|
||||
"и": "ӣ",
|
||||
"у": "ӯ",
|
||||
// greek
|
||||
"α": "ᾱ",
|
||||
"ι": "ῑ",
|
||||
"υ": "ῡ",
|
||||
// combining characters
|
||||
"l": "l\u0304",
|
||||
"r": "r\u0304"
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
{
|
||||
// latin
|
||||
"a": "ą",
|
||||
"e": "ę",
|
||||
"i": "į",
|
||||
"k": "ķ",
|
||||
"l": "ļ",
|
||||
"n": "ņ",
|
||||
"o": "ǫ",
|
||||
"u": "ų"
|
||||
"u": "ų",
|
||||
// extended latin
|
||||
"ō": "ǭ"
|
||||
}
|
||||
|
@ -1,4 +1,11 @@
|
||||
{
|
||||
// latin
|
||||
"a": "å",
|
||||
"u": "ů"
|
||||
"u": "ů",
|
||||
"w": "ẘ", // no uppercase
|
||||
"y": "ẙ", // no uppercase
|
||||
// extended latin
|
||||
"á": "ǻ",
|
||||
// extra
|
||||
"~": "⸛"
|
||||
}
|
||||
|
@ -8,7 +8,11 @@
|
||||
"l": "ł",
|
||||
"n": "ꞥ",
|
||||
"o": "ø",
|
||||
"ó": "ǿ",
|
||||
"ɔ": "ꬿ",
|
||||
"r": "ꞧ",
|
||||
"s": "ꞩ",
|
||||
"t": "ⱦ"
|
||||
"t": "ⱦ",
|
||||
"u": "ꞹ",
|
||||
"v": "ꝟ"
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
{
|
||||
// arabic numbers
|
||||
"0": "₀",
|
||||
"1": "₁",
|
||||
"2": "₂",
|
||||
"3": "₃",
|
||||
@ -8,12 +10,13 @@
|
||||
"7": "₇",
|
||||
"8": "₈",
|
||||
"9": "₉",
|
||||
"0": "₀",
|
||||
// math operators
|
||||
"+": "₊",
|
||||
"-": "₋",
|
||||
"=": "₌",
|
||||
"(": "₍",
|
||||
")": "₎",
|
||||
// latin
|
||||
"a": "ₐ",
|
||||
"e": "ₑ",
|
||||
"h": "ₕ",
|
||||
@ -30,5 +33,13 @@
|
||||
"t": "ₜ",
|
||||
"u": "ᵤ",
|
||||
"v": "ᵥ",
|
||||
"x": "ₓ"
|
||||
"x": "ₓ",
|
||||
// extended latin
|
||||
"ə": "ₔ",
|
||||
// greek
|
||||
"β": "ᵦ",
|
||||
"γ": "ᵧ",
|
||||
"ρ": "ᵨ",
|
||||
"φ": "ᵩ",
|
||||
"χ": "ᵪ"
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
{
|
||||
// numbers
|
||||
"0": "⁰",
|
||||
"1": "¹",
|
||||
"2": "²",
|
||||
"3": "³",
|
||||
@ -8,12 +10,18 @@
|
||||
"7": "⁷",
|
||||
"8": "⁸",
|
||||
"9": "⁹",
|
||||
"0": "⁰",
|
||||
// math operators
|
||||
"+": "⁺",
|
||||
"-": "⁻",
|
||||
"=": "⁼",
|
||||
"(": "⁽",
|
||||
")": "⁾",
|
||||
// latin
|
||||
"n": "ⁿ",
|
||||
|
||||
// since there are no more "superscript" characters,
|
||||
// we substitute with "modifier letter small"s which looks the same
|
||||
// latin
|
||||
"a": "ᵃ",
|
||||
"b": "ᵇ",
|
||||
"c": "ᶜ",
|
||||
@ -26,10 +34,11 @@
|
||||
"j": "ʲ",
|
||||
"k": "ᵏ",
|
||||
"l": "ˡ",
|
||||
// see above for n
|
||||
"m": "ᵐ",
|
||||
"n": "ⁿ",
|
||||
"o": "ᵒ",
|
||||
"p": "ᵖ",
|
||||
"q": "ꟴ", // there is no proper lowercase superscript q
|
||||
"r": "ʳ",
|
||||
"s": "ˢ",
|
||||
"t": "ᵗ",
|
||||
@ -38,5 +47,47 @@
|
||||
"w": "ʷ",
|
||||
"x": "ˣ",
|
||||
"y": "ʸ",
|
||||
"z": "ᶻ"
|
||||
"z": "ᶻ",
|
||||
// extended latin
|
||||
"ɐ": "ᵄ",
|
||||
"ᴂ": "ᵆ",
|
||||
"ɕ": "ᶝ",
|
||||
"ə": "ᵊ",
|
||||
"ɛ": "ᵋ",
|
||||
"ɜ": "ᶟ", // turned open e, ↓ not the same
|
||||
"ᴈ": "ᵌ", // reversed open e
|
||||
"ɥ": "ᶣ",
|
||||
"ɦ": "ʱ",
|
||||
"ᴉ": "ᵎ",
|
||||
"ɨ": "ᶤ",
|
||||
"ɟ": "ᶡ",
|
||||
"ɱ": "ᶬ",
|
||||
"ɯ": "ᵚ",
|
||||
"ɰ": "ᶭ",
|
||||
"ŋ": "ᵑ",
|
||||
"ᴝ": "ᵙ",
|
||||
"ɵ": "ᶱ",
|
||||
"œ": "ꟹ",
|
||||
"ɔ": "ᵓ",
|
||||
"ɹ": "ʴ",
|
||||
"ɻ": "ʵ",
|
||||
"ʁ": "ʶ",
|
||||
"ʂ": "ᶳ",
|
||||
"ʉ": "ᶶ",
|
||||
"ʃ": "ᶴ",
|
||||
"ʒ": "ᶾ",
|
||||
"ʍ": "ꭩ",
|
||||
// greek
|
||||
"ɒ": "ᶛ",
|
||||
"β": "ᵝ",
|
||||
"ɣ": "ˠ",
|
||||
"δ": "ᵟ",
|
||||
"φ": "ᵠ",
|
||||
"χ": "ᵡ",
|
||||
"ι": "ᶥ",
|
||||
"ʊ": "ᶷ",
|
||||
"ʌ": "ᶺ",
|
||||
"θ": "ᶿ",
|
||||
// cyrillic
|
||||
"ө": "ᶱ"
|
||||
}
|
||||
|
@ -1,13 +1,21 @@
|
||||
{
|
||||
// latin
|
||||
"a": "ã",
|
||||
"e": "ẽ",
|
||||
"i": "ĩ",
|
||||
"n": "ñ",
|
||||
"o": "õ",
|
||||
"u": "ũ",
|
||||
"v": "ṽ",
|
||||
"y": "ỹ",
|
||||
// extended latin
|
||||
"ă": "ẵ",
|
||||
"â": "ẫ",
|
||||
"ê": "ễ",
|
||||
"ơ": "ỡ",
|
||||
"ư": "ữ"
|
||||
"ō": "ȭ",
|
||||
"ó": "ṍ",
|
||||
"ö": "ṏ",
|
||||
"ư": "ữ",
|
||||
"ú": "ṹ"
|
||||
}
|
||||
|
@ -1,8 +1,54 @@
|
||||
{
|
||||
// fun
|
||||
"~": "⍨",
|
||||
"*": "⍣",
|
||||
"∇": "⍢",
|
||||
"°": "⍤",
|
||||
// latin
|
||||
"a": "ä",
|
||||
"e": "ë",
|
||||
"h": "ḧ",
|
||||
"i": "ï",
|
||||
"o": "ö",
|
||||
"t": "ẗ",
|
||||
"u": "ü",
|
||||
"y": "ÿ"
|
||||
"w": "ẅ",
|
||||
"x": "ẍ",
|
||||
"y": "ÿ",
|
||||
// extended latin
|
||||
"ā": "ǟ",
|
||||
"ō": "ȫ",
|
||||
"õ": "ṏ",
|
||||
"í": "ḯ",
|
||||
"ū": "ǖ", // there is also ṻ
|
||||
"ú": "ǘ",
|
||||
"ù": "ǜ",
|
||||
"ǔ": "ǚ",
|
||||
// greek
|
||||
"ι": "ϊ",
|
||||
"υ": "ϋ",
|
||||
"ὺ": "ῢ",
|
||||
"ύ": "ΰ",
|
||||
"ῦ": "ῧ",
|
||||
"ϒ": "ϔ",
|
||||
// cyrillic
|
||||
"а": "ӓ",
|
||||
"ә": "ӛ",
|
||||
"ж": "ӝ",
|
||||
"з": "ӟ",
|
||||
"и": "ӥ",
|
||||
"о": "ӧ",
|
||||
"ө": "ӫ",
|
||||
"э": "ӭ",
|
||||
"у": "ӱ",
|
||||
"ч": "ӵ",
|
||||
"ы": "ӹ",
|
||||
// combining character
|
||||
"c": "c\u0308",
|
||||
"j": "j\u0308",
|
||||
"k": "k\u0308",
|
||||
"l": "l\u0308",
|
||||
"m": "m\u0308",
|
||||
"n": "n\u0308",
|
||||
"s": "s\u0308"
|
||||
}
|
||||
|
@ -12,20 +12,18 @@ from array import array
|
||||
# Parse symbol names from keysymdef.h. Many compose sequences in
|
||||
# en_US_UTF_8_Compose.pre reference theses. For example, all the sequences on
|
||||
# the Greek, Cyrillic and Hebrew scripts need these symbols.
|
||||
def parse_keysymdef_h():
|
||||
with open(os.path.join(os.path.dirname(__file__), "keysymdef.h"), "r") as inp:
|
||||
def parse_keysymdef_h(fname):
|
||||
with open(fname, "r") as inp:
|
||||
keysym_re = re.compile(r'^#define XK_(\S+)\s+\S+\s*/\*.U\+([0-9a-fA-F]+)\s')
|
||||
for line in inp:
|
||||
m = re.match(keysym_re, line)
|
||||
if m != None:
|
||||
yield (m.group(1), chr(int(m.group(2), 16)))
|
||||
|
||||
xkb_char_extra_names = dict(parse_keysymdef_h())
|
||||
|
||||
dropped_sequences = 0
|
||||
|
||||
# Parse XKB's Compose.pre files
|
||||
def parse_sequences_file_xkb(fname):
|
||||
def parse_sequences_file_xkb(fname, xkb_char_extra_names):
|
||||
# Parse a line of the form:
|
||||
# <Multi_key> <minus> <space> : "~" asciitilde # TILDE
|
||||
# Sequences not starting with <Multi_key> are ignored.
|
||||
@ -92,20 +90,47 @@ def parse_sequences_file_xkb(fname):
|
||||
seqs.append(s)
|
||||
return seqs
|
||||
|
||||
# Basic support for comments in json files. Reads a file
|
||||
def strip_cstyle_comments(inp):
|
||||
def strip_line(line):
|
||||
i = line.find("//")
|
||||
return line[:i] + "\n" if i >= 0 else line
|
||||
return "".join(map(strip_line, inp))
|
||||
|
||||
# Parse from a json file containing a dictionary sequence → result string.
|
||||
def parse_sequences_file_json(fname):
|
||||
try:
|
||||
with open(fname, "r") as inp:
|
||||
seqs = json.load(inp)
|
||||
seqs = json.loads(strip_cstyle_comments(inp))
|
||||
return list(seqs.items())
|
||||
except Exception as e:
|
||||
print("Failed parsing '%s': %s" % (fname, str(e)), file=sys.stderr)
|
||||
|
||||
# Format of the sequences file is determined by its extension
|
||||
def parse_sequences_file(fname):
|
||||
def parse_sequences_file(fname, xkb_char_extra_names={}):
|
||||
if fname.endswith(".pre"):
|
||||
return parse_sequences_file_xkb(fname)
|
||||
return parse_sequences_file_xkb(fname, xkb_char_extra_names)
|
||||
if fname.endswith(".json"):
|
||||
return parse_sequences_file_json(fname)
|
||||
raise Exception(fname + ": Unsupported format")
|
||||
|
||||
# A sequence directory can contain several sequence files as well as
|
||||
# 'keysymdef.h'.
|
||||
def parse_sequences_dir(dname):
|
||||
compose_files = []
|
||||
xkb_char_extra_names = {}
|
||||
# Parse keysymdef.h first if present
|
||||
for fbasename in os.listdir(dname):
|
||||
fname = os.path.join(dname, fbasename)
|
||||
if fbasename == "keysymdef.h":
|
||||
xkb_char_extra_names = dict(parse_keysymdef_h(fname))
|
||||
else:
|
||||
compose_files.append(fname)
|
||||
sequences = []
|
||||
for fname in compose_files:
|
||||
sequences.extend(parse_sequences_file(fname, xkb_char_extra_names))
|
||||
return sequences
|
||||
|
||||
# Turn a list of sequences into a trie.
|
||||
def add_sequences_to_trie(seqs, trie):
|
||||
def add_seq_to_trie(t_, seq, result):
|
||||
@ -131,8 +156,10 @@ def add_sequences_to_trie(seqs, trie):
|
||||
|
||||
# Compile the trie into a state machine.
|
||||
def make_automata(tries):
|
||||
previous_leafs = {} # Deduplicate leafs
|
||||
states = []
|
||||
def add_tree(t):
|
||||
this_node_index = len(states)
|
||||
# Index and size of the new node
|
||||
i = len(states)
|
||||
s = len(t.keys())
|
||||
@ -144,11 +171,14 @@ def make_automata(tries):
|
||||
states.append((None, None))
|
||||
# Add nested nodes and fill the current node
|
||||
for c in sorted(t.keys()):
|
||||
node_i = len(states)
|
||||
add_node(t[c])
|
||||
states[i] = (c, node_i)
|
||||
states[i] = (c, add_node(t[c]))
|
||||
i += 1
|
||||
return this_node_index
|
||||
def add_leaf(c):
|
||||
if c in previous_leafs:
|
||||
return previous_leafs[c]
|
||||
this_node_index = len(states)
|
||||
previous_leafs[c] = this_node_index
|
||||
# There are two encoding for leafs: character final state for 15-bit
|
||||
# characters and string final state for the rest.
|
||||
if len(c) > 1 or ord(c[0]) > 32767: # String final state
|
||||
@ -158,16 +188,14 @@ def make_automata(tries):
|
||||
states.append((c, 0))
|
||||
else: # Character final state
|
||||
states.append((c, 1))
|
||||
return this_node_index
|
||||
def add_node(n):
|
||||
if type(n) == str:
|
||||
add_leaf(n)
|
||||
return add_leaf(n)
|
||||
else:
|
||||
add_tree(n)
|
||||
return add_tree(n)
|
||||
states.append((1, 1)) # Add an empty state at the beginning.
|
||||
entry_states = {}
|
||||
for tname, tree_root in tries.items():
|
||||
entry_states[tname] = len(states)
|
||||
add_tree(tree_root)
|
||||
entry_states = { n: add_tree(root) for n, root in tries.items() }
|
||||
return entry_states, states
|
||||
|
||||
# Debug
|
||||
@ -238,8 +266,11 @@ public final class ComposeKeyData
|
||||
|
||||
total_sequences = 0
|
||||
tries = {} # Orderred dict
|
||||
for fname in sys.argv[1:]:
|
||||
for fname in sorted(sys.argv[1:]):
|
||||
tname, _ = os.path.splitext(os.path.basename(fname))
|
||||
if os.path.isdir(fname):
|
||||
sequences = parse_sequences_dir(fname)
|
||||
else:
|
||||
sequences = parse_sequences_file(fname)
|
||||
add_sequences_to_trie(sequences, tries.setdefault(tname, {}))
|
||||
total_sequences += len(sequences)
|
||||
|
168
srcs/compose/compose/cyrillic.json
Normal file
@ -0,0 +1,168 @@
|
||||
{
|
||||
"\"": {
|
||||
"і": "ї"
|
||||
},
|
||||
",": {
|
||||
"г": "ӻ",
|
||||
"к": "ӄ",
|
||||
"л": "ԓ",
|
||||
"н": "ӈ",
|
||||
"х": "ӽ",
|
||||
"ѧ": "ӊ"
|
||||
},
|
||||
".": {
|
||||
"г": "ӷ",
|
||||
"ж": "җ",
|
||||
"й": "ҋ",
|
||||
"к": "қ",
|
||||
"л": "ԯ",
|
||||
"м": "ӎ",
|
||||
"н": "ӊ",
|
||||
"х": "ҳ",
|
||||
"ч": "ҷ",
|
||||
"і": "ї"
|
||||
},
|
||||
"а": {
|
||||
"е": "ѣ",
|
||||
"у": "ѡ",
|
||||
"ч": "combining_acute",
|
||||
"ы": "ѣ",
|
||||
"ь": "ꙙ",
|
||||
"ꙋ": "ꙍ",
|
||||
"ꙑ": "ѣ"
|
||||
},
|
||||
"б": {
|
||||
"ч": "combining_slavonic_psili"
|
||||
},
|
||||
"г": {
|
||||
",": "ӻ",
|
||||
".": "ӷ",
|
||||
"й": "ғ",
|
||||
"к": "ґ",
|
||||
"х": "ҁ",
|
||||
"ј": "ғ"
|
||||
},
|
||||
"д": {
|
||||
"е": "ꙉ",
|
||||
"ж": "џ",
|
||||
"з": "ꙃ",
|
||||
"й": "ꙉ",
|
||||
"ј": "ꙉ",
|
||||
"ѥ": "ђ"
|
||||
},
|
||||
"е": {
|
||||
"ч": "combining_trema"
|
||||
},
|
||||
"ж": {
|
||||
".": "җ"
|
||||
},
|
||||
"з": {
|
||||
"ф": "ҙ"
|
||||
},
|
||||
"и": {
|
||||
"и": "ӣ",
|
||||
"у": "ѵ"
|
||||
},
|
||||
"й": {
|
||||
".": "ҋ",
|
||||
"ч": "combining_breve"
|
||||
},
|
||||
"к": {
|
||||
",": "ӄ",
|
||||
".": "қ",
|
||||
"г": "ґ",
|
||||
"с": "ѯ",
|
||||
"х": "ҁ",
|
||||
"ш": "ѯ"
|
||||
},
|
||||
"л": {
|
||||
",": "ԓ",
|
||||
".": "ԯ",
|
||||
"ь": "љ"
|
||||
},
|
||||
"м": {
|
||||
".": "ӎ"
|
||||
},
|
||||
"н": {
|
||||
",": "ӈ",
|
||||
"·": "ԩ",
|
||||
"ч": "combining_titlo",
|
||||
"ь": "њ"
|
||||
},
|
||||
"о": {
|
||||
"т": "ѿ",
|
||||
"у": "ѹ",
|
||||
"ч": "combining_inverted_breve"
|
||||
},
|
||||
"п": {
|
||||
"с": "ѱ"
|
||||
},
|
||||
"т": {
|
||||
"й": "ћ",
|
||||
"ф": "ѳ",
|
||||
"ј": "ћ"
|
||||
},
|
||||
"у": {
|
||||
"и": "ѵ",
|
||||
"й": "ў",
|
||||
"у": "ӯ",
|
||||
"ч": "combining_porkrytie",
|
||||
"і": "ѵ",
|
||||
"ј": "ў"
|
||||
},
|
||||
"х": {
|
||||
",": "ӽ",
|
||||
".": "ҳ",
|
||||
"ч": "combining_slavonic_dasia"
|
||||
},
|
||||
"ч": {
|
||||
".": "ҷ",
|
||||
"а": "combining_acute",
|
||||
"б": "combining_slavonic_psili",
|
||||
"е": "combining_trema",
|
||||
"й": "combining_breve",
|
||||
"н": "combining_titlo",
|
||||
"о": "combining_inverted_breve",
|
||||
"у": "combining_pokrytie",
|
||||
"х": "combining_slavonic_dasia",
|
||||
"ч": "combining_payerok",
|
||||
"ч": "combining_payerok",
|
||||
"ъ": "combining_vertical_tilde",
|
||||
"ю": "combining_grave",
|
||||
"ј": "combining_breve",
|
||||
"ѧ": "combining_vzmet"
|
||||
},
|
||||
"ш": {
|
||||
"т": "щ"
|
||||
},
|
||||
"ъ": {
|
||||
"ч": "combining_vertical_tilde"
|
||||
},
|
||||
"ю": {
|
||||
"а": "ꙓ",
|
||||
"е": "ё",
|
||||
"м": "ѭ",
|
||||
"н": "ѩ",
|
||||
"ч": "combining_grave"
|
||||
},
|
||||
"я": {
|
||||
"ь": "ꙝ"
|
||||
},
|
||||
"і": {
|
||||
"\"": "ї",
|
||||
".": "ї",
|
||||
"у": "ѵ",
|
||||
"і": "ӣ"
|
||||
},
|
||||
"ј": {
|
||||
"а": "ꙗ",
|
||||
"ч": "combining_breve",
|
||||
"ѣ": "ꙝ"
|
||||
},
|
||||
"ѡ": {
|
||||
"т": "ѿ"
|
||||
},
|
||||
"ѧ": {
|
||||
"ч": "combining_vzmet"
|
||||
}
|
||||
}
|
11
srcs/compose/compose/extra.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"V": {
|
||||
"s": "Š",
|
||||
"c": "Č",
|
||||
"z": "Ž"
|
||||
},
|
||||
"\\": {
|
||||
"n": "\\n",
|
||||
"t": "\\t"
|
||||
}
|
||||
}
|
219
srcs/compose/fn.json
Normal file
@ -0,0 +1,219 @@
|
||||
{
|
||||
"1": "f1",
|
||||
"2": "f2",
|
||||
"3": "f3",
|
||||
"4": "f4",
|
||||
"5": "f5",
|
||||
"6": "f6",
|
||||
"7": "f7",
|
||||
"8": "f8",
|
||||
"9": "f9",
|
||||
"0": "f10",
|
||||
"<": "«",
|
||||
">": "»",
|
||||
"{": "‹",
|
||||
"}": "›",
|
||||
"[": "‘",
|
||||
"]": "’",
|
||||
"(": "“",
|
||||
")": "”",
|
||||
"'": "‚",
|
||||
"\"": "„",
|
||||
"-": "–",
|
||||
"_": "—",
|
||||
"^": "¬",
|
||||
"%": "‰",
|
||||
"=": "≈",
|
||||
"u": "µ",
|
||||
"a": "æ",
|
||||
"o": "œ",
|
||||
"*": "°",
|
||||
".": "…",
|
||||
",": "·",
|
||||
"!": "¡",
|
||||
"?": "¿",
|
||||
"|": "¦",
|
||||
"§": "¶",
|
||||
"†": "‡",
|
||||
"×": "∙",
|
||||
" ": "nbsp",
|
||||
|
||||
// arrows
|
||||
"↖": "⇖",
|
||||
"↑": "⇑",
|
||||
"↗": "⇗",
|
||||
"←": "⇐",
|
||||
"→": "⇒",
|
||||
"↙": "⇙",
|
||||
"↓": "⇓",
|
||||
"↘": "⇘",
|
||||
"↔": "⇔",
|
||||
"↕": "⇕",
|
||||
// Currency symbols
|
||||
"e": "€",
|
||||
"l": "£",
|
||||
"r": "₹",
|
||||
"y": "¥",
|
||||
"c": "¢",
|
||||
"p": "₽",
|
||||
"b": "₱",
|
||||
"h": "₴",
|
||||
"z": "₿",
|
||||
// avoid showing these twice
|
||||
"€": "removed",
|
||||
"£": "removed",
|
||||
// alternative greek letters
|
||||
"π": "ϖ",
|
||||
"θ": "ϑ",
|
||||
"Θ": "ϴ",
|
||||
"ε": "ϵ",
|
||||
"β": "ϐ",
|
||||
"ρ": "ϱ",
|
||||
"σ": "ς",
|
||||
"γ": "ɣ",
|
||||
"φ": "ϕ",
|
||||
"υ": "ϒ",
|
||||
"κ": "ϰ",
|
||||
// alternative math characters
|
||||
"∪": "⋃",
|
||||
"∩": "⋂",
|
||||
"∃": "∄",
|
||||
"∈": "∉",
|
||||
"∫": "∮",
|
||||
"Π": "∏",
|
||||
"Σ": "∑",
|
||||
"∨": "⋁",
|
||||
"∧": "⋀",
|
||||
"⊷": "⊶",
|
||||
"⊂": "⊆",
|
||||
"⊃": "⊇",
|
||||
"±": "∓",
|
||||
|
||||
// hebrew niqqud
|
||||
"ק": "qamats", // kamatz
|
||||
"ר": "hataf_qamats", // reduced kamatz
|
||||
"ו": "holam",
|
||||
"ם": "rafe",
|
||||
"פ": "patah", // patach
|
||||
"ש": "sheva",
|
||||
"ד": "dagesh", // or mapiq
|
||||
"ח": "hiriq",
|
||||
"ף": "hataf_patah", // reduced patach
|
||||
"ז": "qubuts", // kubuts
|
||||
"ס": "segol",
|
||||
"ב": "hataf_segol", // reduced segol
|
||||
"צ": "tsere",
|
||||
|
||||
// Devanagari symbols
|
||||
"ए": "ऍ",
|
||||
"े": "ॅ",
|
||||
"ऐ": "ऎ",
|
||||
"ै": "ॆ",
|
||||
"ऋ": "ॠ",
|
||||
"ृ": "ॄ",
|
||||
"ळ": "ऴ",
|
||||
"र": "ऱ",
|
||||
"क": "क़",
|
||||
"ख": "ख़",
|
||||
"ग": "ग़",
|
||||
"घ": "ॻ",
|
||||
"ढ": "ढ़",
|
||||
"न": "ऩ",
|
||||
"ड": "ड़",
|
||||
"ट": "ॸ",
|
||||
"ण": "ॾ",
|
||||
"फ": "फ़",
|
||||
"ऌ": "ॡ",
|
||||
"ॢ": "ॣ",
|
||||
"औ": "ॵ",
|
||||
"ौ": "ॏ",
|
||||
"ओ": "ऒ",
|
||||
"ो": "ॊ",
|
||||
"च": "ॼ",
|
||||
"ज": "ज़",
|
||||
"ब": "ॿ",
|
||||
"व": "ॺ",
|
||||
"य": "य़",
|
||||
"अ": "ॲ",
|
||||
"आ": "ऑ",
|
||||
"ा": "ॉ",
|
||||
"झ": "ॹ",
|
||||
"ई": "ॴ",
|
||||
"ी": "ऻ",
|
||||
"इ": "ॳ",
|
||||
"ि": "ऺ",
|
||||
"उ": "ॶ",
|
||||
"ऊ": "ॷ",
|
||||
"ु": "ऄ",
|
||||
"ष": "क्ष",
|
||||
"थ": "त्र",
|
||||
"द": "द्र",
|
||||
"प": "प्र",
|
||||
"श": "श्र",
|
||||
"छ": "श्च",
|
||||
"ँ": "ऀ",
|
||||
"₹": "₨",
|
||||
"ॖ": "ॗ",
|
||||
"॓": "॔",
|
||||
"॰": "ॱ",
|
||||
"।": "॥",
|
||||
"ं": "ॕ",
|
||||
"़": "ॎ",
|
||||
"ऽ": "ॽ",
|
||||
|
||||
// Persian numbers
|
||||
"۱": "f1",
|
||||
"۲": "f2",
|
||||
"۳": "f3",
|
||||
"۴": "f4",
|
||||
"۵": "f5",
|
||||
"۶": "f6",
|
||||
"۷": "f7",
|
||||
"۸": "f8",
|
||||
"۹": "f9",
|
||||
// Arabic numbers
|
||||
"۰": "f10",
|
||||
"١": "f1",
|
||||
"٢": "f2",
|
||||
"٣": "f3",
|
||||
"٤": "f4",
|
||||
"٥": "f5",
|
||||
"٦": "f6",
|
||||
"٧": "f7",
|
||||
"٨": "f8",
|
||||
"٩": "f9",
|
||||
"٠": "f10",
|
||||
|
||||
// Cyrillic
|
||||
"ꙑ": "ы",
|
||||
"ы": "ꙑ",
|
||||
"ш": "ѱ",
|
||||
"з": "ꙁ",
|
||||
"и": "і",
|
||||
"і": "и",
|
||||
"я": "ꙗ",
|
||||
"е": "ѥ",
|
||||
"ѡ": "ꙍ",
|
||||
"о": "ѻ",
|
||||
"а": "ѣ",
|
||||
"э": "є",
|
||||
"ъ": "ь",
|
||||
"ь": "ъ",
|
||||
"й": "ј",
|
||||
"ꙉ": "ђ",
|
||||
"ч": "ћ",
|
||||
"ҁ": "қ",
|
||||
"қ": "ҁ",
|
||||
"џ": "ҷ",
|
||||
"ҷ": "џ",
|
||||
"ј": "й",
|
||||
"у": "ꙋ",
|
||||
"м": "ѫ",
|
||||
"н": "ѧ",
|
||||
"с": "ѕ",
|
||||
"л": "ԯ",
|
||||
"ԓ": "ԯ",
|
||||
"\ua67d": "\u0483",
|
||||
"\u0487": "\ua66f",
|
||||
"ӈ": "ԩ"
|
||||
}
|
83
srcs/compose/shift.json
Normal file
@ -0,0 +1,83 @@
|
||||
{
|
||||
"↙": "⇙",
|
||||
"↓": "⇓",
|
||||
"↘": "⇘",
|
||||
"←": "⇐",
|
||||
"→": "⇒",
|
||||
"↖": "⇖",
|
||||
"↑": "⇑",
|
||||
"↗": "⇗",
|
||||
"└": "╚",
|
||||
"┴": "╩",
|
||||
"┘": "╝",
|
||||
"├": "╠",
|
||||
"┼": "╬",
|
||||
"┤": "╣",
|
||||
"┌": "╔",
|
||||
"┬": "╦",
|
||||
"┐": "╗",
|
||||
"─": "═",
|
||||
"│": "║",
|
||||
// superscript
|
||||
"ᵃ": "ᴬ",
|
||||
"ᵇ": "ᴮ",
|
||||
"ᶜ": "ꟲ",
|
||||
"ᵈ": "ᴰ",
|
||||
"ᵉ": "ᴱ",
|
||||
"ᶠ": "ꟳ",
|
||||
"ᵍ": "ᴳ",
|
||||
"ʰ": "ᴴ",
|
||||
"ⁱ": "ᴵ",
|
||||
"ʲ": "ᴶ",
|
||||
"ᵏ": "ᴷ",
|
||||
"ˡ": "ᴸ",
|
||||
"ᵐ": "ᴹ",
|
||||
"ⁿ": "ᴺ",
|
||||
"ᵒ": "ᴼ",
|
||||
"ᵖ": "ᴾ",
|
||||
"ʳ": "ᴿ",
|
||||
"ᵗ": "ᵀ",
|
||||
"ᵘ": "ᵁ",
|
||||
"ᵛ": "ⱽ",
|
||||
"ʷ": "ᵂ",
|
||||
"ᶾ": "ᴣ",
|
||||
"ᵠ": "ᶲ",
|
||||
// german eszett has an uppercase, but because it is uncommon, java doesn't know about it
|
||||
"ß": "ẞ",
|
||||
// these characters don't have a preapplied uppercase version, so we use combining characters
|
||||
"ẗ": "T\u0308",
|
||||
"ẘ": "W\u030A",
|
||||
"ẙ": "Y\u030A",
|
||||
"ǰ": "J\u030C",
|
||||
"ȷ": "J\u0307",
|
||||
// In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
|
||||
// return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
|
||||
// has the inconvenient of swapping i and ı on the keyboard.
|
||||
"ı": "İ",
|
||||
"₹": "₨",
|
||||
// Gujarati alternate characters
|
||||
"અ": "આ",
|
||||
"ઇ": "ઈ",
|
||||
"િ": "ી",
|
||||
"ઉ": "ઊ",
|
||||
"ુ": "ૂ",
|
||||
"એ": "ઐ",
|
||||
"ે": "ૈ",
|
||||
"ઓ": "ઔ",
|
||||
"ો": "ૌ",
|
||||
"ક": "ખ",
|
||||
"ગ": "ઘ",
|
||||
"ચ": "છ",
|
||||
"જ": "ઝ",
|
||||
"ટ": "ઠ",
|
||||
"ડ": "ઢ",
|
||||
"ન": "ણ",
|
||||
"ત": "થ",
|
||||
"દ": "ધ",
|
||||
"પ": "ફ",
|
||||
"બ": "ભ",
|
||||
"મ": "ં",
|
||||
"લ": "ળ",
|
||||
"સ": "શ",
|
||||
"હ": "ઃ"
|
||||
}
|
@ -74,6 +74,9 @@ public final class Autocapitalisation
|
||||
if (_cursor > 0) _cursor--;
|
||||
_should_update_caps_mode = true;
|
||||
break;
|
||||
case KeyEvent.KEYCODE_ENTER:
|
||||
_should_update_caps_mode = true;
|
||||
break;
|
||||
}
|
||||
callback(true);
|
||||
}
|
||||
|
@ -145,7 +145,11 @@ public final class ClipboardHistoryService
|
||||
return;
|
||||
int count = clip.getItemCount();
|
||||
for (int i = 0; i < count; i++)
|
||||
add_clip(clip.getItemAt(i).getText().toString());
|
||||
{
|
||||
CharSequence text = clip.getItemAt(i).getText();
|
||||
if (text != null)
|
||||
add_clip(text.toString());
|
||||
}
|
||||
}
|
||||
|
||||
final class SystemListener implements ClipboardManager.OnPrimaryClipChangedListener
|
||||
|
@ -42,7 +42,7 @@ public final class ComposeKey
|
||||
else if (next_header == 0xFFFF) // String final state
|
||||
{
|
||||
int next_length = edges[next];
|
||||
return KeyValue.makeStringKey(
|
||||
return KeyValue.getKeyByName(
|
||||
new String(states, next + 1, next_length - 1));
|
||||
}
|
||||
else // Character final state.
|
||||
|
@ -175,7 +175,7 @@ public final class Config
|
||||
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
|
||||
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
|
||||
characterSize =
|
||||
_prefs.getFloat("character_size", 1.f)
|
||||
_prefs.getFloat("character_size", 1.15f)
|
||||
* characterSizeScale;
|
||||
theme = getThemeId(res, _prefs.getString("theme", ""));
|
||||
autocapitalisation = _prefs.getBoolean("autocapitalisation", true);
|
||||
@ -210,8 +210,7 @@ public final class Config
|
||||
KeyValue action_key()
|
||||
{
|
||||
// Update the name to avoid caching in KeyModifier
|
||||
return (actionLabel == null) ? null :
|
||||
KeyValue.getKeyByName("action").withSymbol(actionLabel);
|
||||
return (actionLabel == null) ? null : KeyValue.makeActionKey(actionLabel);
|
||||
}
|
||||
|
||||
/** Update the layout according to the configuration.
|
||||
@ -302,10 +301,10 @@ public final class Config
|
||||
});
|
||||
if (show_numpad)
|
||||
kw = kw.addNumPad(modify_numpad(num_pad, kw));
|
||||
if (added_number_row != null)
|
||||
kw = kw.insert_row(added_number_row, 0);
|
||||
if (extra_keys.size() > 0)
|
||||
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
|
||||
if (added_number_row != null)
|
||||
kw = kw.insert_row(added_number_row, 0);
|
||||
return kw;
|
||||
}
|
||||
|
||||
@ -422,6 +421,7 @@ public final class Config
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
return R.style.MonetLight;
|
||||
return R.style.MonetDark;
|
||||
case "rosepine": return R.style.RosePine;
|
||||
default:
|
||||
case "system":
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
|
@ -60,10 +60,10 @@ public final class KeyEventHandler
|
||||
{
|
||||
if (key == null)
|
||||
return;
|
||||
// Stop auto capitalisation when pressing some keys
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Modifier:
|
||||
// Stop auto capitalisation when activating a system modifier
|
||||
switch (key.getModifier())
|
||||
{
|
||||
case CTRL:
|
||||
@ -73,6 +73,9 @@ public final class KeyEventHandler
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Compose_pending:
|
||||
_autocap.stop();
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@ -97,6 +100,7 @@ public final class KeyEventHandler
|
||||
_recv.set_compose_pending(true);
|
||||
break;
|
||||
case Cursor_move: move_cursor(key.getCursorMove()); break;
|
||||
case Complex: send_complex_key(key.getComplexKind(), key.getComplex()); break;
|
||||
}
|
||||
update_meta_state(old_mods);
|
||||
}
|
||||
@ -215,6 +219,16 @@ public final class KeyEventHandler
|
||||
conn.performContextMenuAction(id);
|
||||
}
|
||||
|
||||
void send_complex_key(KeyValue.Complex.Kind kind, KeyValue.Complex val)
|
||||
{
|
||||
switch (kind)
|
||||
{
|
||||
case StringWithSymbol:
|
||||
send_text(((KeyValue.Complex.StringWithSymbol)val).str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
void handle_editing_key(KeyValue.Editing ev)
|
||||
{
|
||||
|
@ -51,7 +51,7 @@ public final class KeyModifier
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL:
|
||||
case CTRL: return apply_ctrl(k);
|
||||
case ALT:
|
||||
case META: return turn_into_keyevent(k);
|
||||
case FN: return apply_fn(k);
|
||||
@ -182,9 +182,10 @@ public final class KeyModifier
|
||||
{
|
||||
case Char:
|
||||
char kc = k.getChar();
|
||||
char c = map_char_shift(kc);
|
||||
if (kc == c)
|
||||
c = Character.toUpperCase(kc);
|
||||
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, kc);
|
||||
if (r != null)
|
||||
return r;
|
||||
char c = Character.toUpperCase(kc);
|
||||
return (kc == c) ? k : k.withChar(c);
|
||||
case String:
|
||||
String s = Utils.capitalize_string(k.getString());
|
||||
@ -204,7 +205,9 @@ public final class KeyModifier
|
||||
String name = null;
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char: name = apply_fn_char(k.getChar()); break;
|
||||
case Char:
|
||||
KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k.getChar());
|
||||
return (r != null) ? r : k;
|
||||
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
|
||||
case Event: name = apply_fn_event(k.getEvent()); break;
|
||||
case Placeholder: name = apply_fn_placeholder(k.getPlaceholder()); break;
|
||||
@ -253,191 +256,17 @@ public final class KeyModifier
|
||||
}
|
||||
}
|
||||
|
||||
/** Return the name of modified key, or [null]. */
|
||||
private static String apply_fn_char(char c)
|
||||
private static KeyValue apply_ctrl(KeyValue k)
|
||||
{
|
||||
switch (c)
|
||||
if (_modmap != null)
|
||||
{
|
||||
case '1': return "f1";
|
||||
case '2': return "f2";
|
||||
case '3': return "f3";
|
||||
case '4': return "f4";
|
||||
case '5': return "f5";
|
||||
case '6': return "f6";
|
||||
case '7': return "f7";
|
||||
case '8': return "f8";
|
||||
case '9': return "f9";
|
||||
case '0': return "f10";
|
||||
case '<': return "«";
|
||||
case '>': return "»";
|
||||
case '{': return "‹";
|
||||
case '}': return "›";
|
||||
case '[': return "‘";
|
||||
case ']': return "’";
|
||||
case '(': return "“";
|
||||
case ')': return "”";
|
||||
case '\'': return "‚";
|
||||
case '"': return "„";
|
||||
case '-': return "–";
|
||||
case '_': return "—";
|
||||
case '^': return "¬";
|
||||
case '%': return "‰";
|
||||
case '=': return "≈";
|
||||
case 'u': return "µ";
|
||||
case 'a': return "æ";
|
||||
case 'o': return "œ";
|
||||
case '*': return "°";
|
||||
case '.': return "…";
|
||||
case ',': return "·";
|
||||
case '!': return "¡";
|
||||
case '?': return "¿";
|
||||
case '|': return "¦";
|
||||
case '§': return "¶";
|
||||
case '†': return "‡";
|
||||
case '×': return "∙";
|
||||
case ' ': return "nbsp";
|
||||
// arrows
|
||||
case '↖': return "⇖";
|
||||
case '↑': return "⇑";
|
||||
case '↗': return "⇗";
|
||||
case '←': return "⇐";
|
||||
case '→': return "⇒";
|
||||
case '↙': return "⇙";
|
||||
case '↓': return "⇓";
|
||||
case '↘': return "⇘";
|
||||
case '↔': return "⇔";
|
||||
case '↕': return "⇕";
|
||||
// Currency symbols
|
||||
case 'e': return "€";
|
||||
case 'l': return "£";
|
||||
case 'r': return "₹";
|
||||
case 'y': return "¥";
|
||||
case 'c': return "¢";
|
||||
case 'p': return "₽";
|
||||
case 'b': return "₱";
|
||||
case 'h': return "₴";
|
||||
case 'z': return "₿";
|
||||
case '€': case '£': return "removed"; // Avoid showing these twice
|
||||
// alternating greek letters
|
||||
case 'π': return "ϖ";
|
||||
case 'θ': return "ϑ";
|
||||
case 'Θ': return "ϴ";
|
||||
case 'ε': return "ϵ";
|
||||
case 'β': return "ϐ";
|
||||
case 'ρ': return "ϱ";
|
||||
case 'σ': return "ς";
|
||||
case 'γ': return "ɣ";
|
||||
case 'φ': return "ϕ";
|
||||
case 'υ': return "ϒ";
|
||||
case 'κ': return "ϰ";
|
||||
// alternating math characters
|
||||
case '∪': return "⋃";
|
||||
case '∩': return "⋂";
|
||||
case '∃': return "∄";
|
||||
case '∈': return "∉";
|
||||
case '∫': return "∮";
|
||||
case 'Π': return "∏";
|
||||
case 'Σ': return "∑";
|
||||
case '∨': return "⋁";
|
||||
case '∧': return "⋀";
|
||||
case '⊷': return "⊶";
|
||||
case '⊂': return "⊆";
|
||||
case '⊃': return "⊇";
|
||||
case '±': return "∓";
|
||||
// hebrew niqqud
|
||||
case 'ק': return "qamats"; // kamatz
|
||||
case 'ר': return "hataf_qamats"; // reduced kamatz
|
||||
case 'ו': return "holam";
|
||||
case 'ם': return "rafe";
|
||||
case 'פ': return "patah"; // patach
|
||||
case 'ש': return "sheva";
|
||||
case 'ד': return "dagesh"; // or mapiq
|
||||
case 'ח': return "hiriq";
|
||||
case 'ף': return "hataf_patah"; // reduced patach
|
||||
case 'ז': return "qubuts"; // kubuts
|
||||
case 'ס': return "segol";
|
||||
case 'ב': return "hataf_segol"; // reduced segol
|
||||
case 'צ': return "tsere";
|
||||
// Devanagari symbols
|
||||
case 'ए': return "ऍ";
|
||||
case 'े': return "ॅ";
|
||||
case 'ऐ': return "ऎ";
|
||||
case 'ै': return "ॆ";
|
||||
case 'ऋ': return "ॠ";
|
||||
case 'ृ': return "ॄ";
|
||||
case 'ळ': return "ऴ";
|
||||
case 'र': return "ऱ";
|
||||
case 'क': return "क़";
|
||||
case 'ख': return "ख़";
|
||||
case 'ग': return "ग़";
|
||||
case 'घ': return "ॻ";
|
||||
case 'ढ': return "ढ़";
|
||||
case 'न': return "ऩ";
|
||||
case 'ड': return "ड़";
|
||||
case 'ट': return "ॸ";
|
||||
case 'ण': return "ॾ";
|
||||
case 'फ': return "फ़";
|
||||
case 'ऌ': return "ॡ";
|
||||
case 'ॢ': return "ॣ";
|
||||
case 'औ': return "ॵ";
|
||||
case 'ौ': return "ॏ";
|
||||
case 'ओ': return "ऒ";
|
||||
case 'ो': return "ॊ";
|
||||
case 'च': return "ॼ";
|
||||
case 'ज': return "ज़";
|
||||
case 'ब': return "ॿ";
|
||||
case 'व': return "ॺ";
|
||||
case 'य': return "य़";
|
||||
case 'अ': return "ॲ";
|
||||
case 'आ': return "ऑ";
|
||||
case 'ा': return "ॉ";
|
||||
case 'झ': return "ॹ";
|
||||
case 'ई': return "ॴ";
|
||||
case 'ी': return "ऻ";
|
||||
case 'इ': return "ॳ";
|
||||
case 'ि': return "ऺ";
|
||||
case 'उ': return "ॶ";
|
||||
case 'ऊ': return "ॷ";
|
||||
case 'ु': return "ऄ";
|
||||
case 'ष': return "क्ष";
|
||||
case 'थ': return "त्र";
|
||||
case 'द': return "द्र";
|
||||
case 'प': return "प्र";
|
||||
case 'श': return "श्र";
|
||||
case 'छ': return "श्च";
|
||||
case 'ँ': return "ऀ";
|
||||
case '₹': return "₨";
|
||||
case 'ॖ': return "ॗ";
|
||||
case '॓': return "॔";
|
||||
case '॰': return "ॱ";
|
||||
case '।': return "॥";
|
||||
case 'ं': return "ॕ";
|
||||
case '़': return "ॎ";
|
||||
case 'ऽ': return "ॽ";
|
||||
// Persian numbers
|
||||
case '۱': return "f1";
|
||||
case '۲': return "f2";
|
||||
case '۳': return "f3";
|
||||
case '۴': return "f4";
|
||||
case '۵': return "f5";
|
||||
case '۶': return "f6";
|
||||
case '۷': return "f7";
|
||||
case '۸': return "f8";
|
||||
case '۹': return "f9";
|
||||
case '۰': return "f10";
|
||||
// Arabic numbers
|
||||
case '١': return "f1";
|
||||
case '٢': return "f2";
|
||||
case '٣': return "f3";
|
||||
case '٤': return "f4";
|
||||
case '٥': return "f5";
|
||||
case '٦': return "f6";
|
||||
case '٧': return "f7";
|
||||
case '٨': return "f8";
|
||||
case '٩': return "f9";
|
||||
case '٠': return "f10";
|
||||
default: return null;
|
||||
KeyValue mapped = _modmap.ctrl.get(k);
|
||||
// Do not return the modified character right away, first turn it into a
|
||||
// key event.
|
||||
if (mapped != null)
|
||||
k = mapped;
|
||||
}
|
||||
return turn_into_keyevent(k);
|
||||
}
|
||||
|
||||
private static KeyValue turn_into_keyevent(KeyValue k)
|
||||
@ -527,64 +356,6 @@ public final class KeyModifier
|
||||
public String apply(char _c) { return null; }
|
||||
};
|
||||
|
||||
private static char map_char_shift(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '↙': return '⇙';
|
||||
case '↓': return '⇓';
|
||||
case '↘': return '⇘';
|
||||
case '←': return '⇐';
|
||||
case '→': return '⇒';
|
||||
case '↖': return '⇖';
|
||||
case '↑': return '⇑';
|
||||
case '↗': return '⇗';
|
||||
case '└': return '╚';
|
||||
case '┴': return '╩';
|
||||
case '┘': return '╝';
|
||||
case '├': return '╠';
|
||||
case '┼': return '╬';
|
||||
case '┤': return '╣';
|
||||
case '┌': return '╔';
|
||||
case '┬': return '╦';
|
||||
case '┐': return '╗';
|
||||
case '─': return '═';
|
||||
case '│': return '║';
|
||||
case 'ß': return 'ẞ';
|
||||
/* In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
|
||||
return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
|
||||
has the inconvenient of swapping i and ı on the keyboard. */
|
||||
case 'ı': return 'İ';
|
||||
case '₹': return '₨';
|
||||
// Gujarati alternate characters
|
||||
case 'અ': return 'આ';
|
||||
case 'ઇ': return 'ઈ';
|
||||
case 'િ': return 'ી';
|
||||
case 'ઉ': return 'ઊ';
|
||||
case 'ુ': return 'ૂ';
|
||||
case 'એ': return 'ઐ';
|
||||
case 'ે': return 'ૈ';
|
||||
case 'ઓ': return 'ઔ';
|
||||
case 'ો': return 'ૌ';
|
||||
case 'ક': return 'ખ';
|
||||
case 'ગ': return 'ઘ';
|
||||
case 'ચ': return 'છ';
|
||||
case 'જ': return 'ઝ';
|
||||
case 'ટ': return 'ઠ';
|
||||
case 'ડ': return 'ઢ';
|
||||
case 'ન': return 'ણ';
|
||||
case 'ત': return 'થ';
|
||||
case 'દ': return 'ધ';
|
||||
case 'પ': return 'ફ';
|
||||
case 'બ': return 'ભ';
|
||||
case 'મ': return 'ં';
|
||||
case 'લ': return 'ળ';
|
||||
case 'સ': return 'શ';
|
||||
case 'હ': return 'ઃ';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
|
||||
private static final Map_char map_char_arrow_right =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
|
@ -91,7 +91,8 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
{
|
||||
Char, String, Keyevent, Event, Compose_pending, Hangul_initial,
|
||||
Hangul_medial, Modifier, Editing, Placeholder,
|
||||
Cursor_move // Value is encoded as a 16-bit integer
|
||||
Cursor_move, // Value is encoded as a 16-bit integer.
|
||||
Complex, // [_payload] is a [KeyValue.Complex], value is [Complex.Kind].
|
||||
}
|
||||
|
||||
private static final int FLAGS_OFFSET = 19;
|
||||
@ -129,7 +130,13 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0);
|
||||
}
|
||||
|
||||
private final String _symbol;
|
||||
/**
|
||||
* The symbol that is rendered on the keyboard as a [String].
|
||||
* Except for keys of kind:
|
||||
* - [String], this is also the string to output.
|
||||
* - [Complex], this is an instance of [KeyValue.Complex].
|
||||
*/
|
||||
private final Object _payload;
|
||||
|
||||
/** This field encodes three things: Kind, flags and value. */
|
||||
private final int _code;
|
||||
@ -153,7 +160,9 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
When [getKind() == Kind.String], also the string to send. */
|
||||
public String getString()
|
||||
{
|
||||
return _symbol;
|
||||
if (getKind() == Kind.Complex)
|
||||
return ((Complex)_payload).getSymbol();
|
||||
return (String)_payload;
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Char]. */
|
||||
@ -211,25 +220,32 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
return (short)(_code & VALUE_BITS);
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Complex]. */
|
||||
public Complex getComplex()
|
||||
{
|
||||
return (Complex)_payload;
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Complex]. */
|
||||
public Complex.Kind getComplexKind()
|
||||
{
|
||||
return Complex.Kind.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/* Update the char and the symbol. */
|
||||
public KeyValue withChar(char c)
|
||||
{
|
||||
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withSymbol(String s)
|
||||
{
|
||||
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withKeyevent(int code)
|
||||
{
|
||||
return new KeyValue(_symbol, Kind.Keyevent, code, getFlags());
|
||||
return new KeyValue(getString(), Kind.Keyevent, code, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withFlags(int f)
|
||||
{
|
||||
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), f);
|
||||
return new KeyValue(_payload, (_code & KIND_BITS), (_code & VALUE_BITS), f);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -247,7 +263,9 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
d = _code - snd._code;
|
||||
if (d != 0)
|
||||
return d;
|
||||
return _symbol.compareTo(snd._symbol);
|
||||
if (getKind() == Kind.Complex)
|
||||
return ((Complex)_payload).compareTo((Complex)snd._payload);
|
||||
return ((String)_payload).compareTo((String)snd._payload);
|
||||
}
|
||||
|
||||
/** Type-safe alternative to [equals]. */
|
||||
@ -255,24 +273,36 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
{
|
||||
if (snd == null)
|
||||
return false;
|
||||
return _symbol.equals(snd._symbol) && _code == snd._code;
|
||||
return _code == snd._code && _payload.equals(snd._payload);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return _symbol.hashCode() + _code;
|
||||
return _payload.hashCode() + _code;
|
||||
}
|
||||
|
||||
public KeyValue(String s, int kind, int value, int flags)
|
||||
public String toString()
|
||||
{
|
||||
_symbol = s;
|
||||
int value = _code & VALUE_BITS;
|
||||
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
|
||||
}
|
||||
|
||||
private KeyValue(Object p, int kind, int value, int flags)
|
||||
{
|
||||
_payload = p;
|
||||
_code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS);
|
||||
}
|
||||
|
||||
public KeyValue(String s, Kind k, int v, int f)
|
||||
public KeyValue(Complex p, Complex.Kind value, int flags)
|
||||
{
|
||||
this(s, (k.ordinal() << KIND_OFFSET), v, f);
|
||||
this((Object)p, (Kind.Complex.ordinal() << KIND_OFFSET), value.ordinal(),
|
||||
flags);
|
||||
}
|
||||
|
||||
public KeyValue(String p, Kind k, int v, int f)
|
||||
{
|
||||
this(p, (k.ordinal() << KIND_OFFSET), v, f);
|
||||
}
|
||||
|
||||
private static KeyValue charKey(String symbol, char c, int flags)
|
||||
@ -363,7 +393,19 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
|
||||
public static KeyValue makeCharKey(char c)
|
||||
{
|
||||
return new KeyValue(String.valueOf(c), Kind.Char, c, 0);
|
||||
return makeCharKey(c, null, 0);
|
||||
}
|
||||
|
||||
public static KeyValue makeCharKey(char c, String symbol, int flags)
|
||||
{
|
||||
if (symbol == null)
|
||||
symbol = String.valueOf(c);
|
||||
return new KeyValue(symbol, Kind.Char, c, flags);
|
||||
}
|
||||
|
||||
public static KeyValue makeCharKey(int symbol, char c, int flags)
|
||||
{
|
||||
return makeCharKey(c, String.valueOf((char)symbol), flags | FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
public static KeyValue makeComposePending(String symbol, int state, int flags)
|
||||
@ -397,6 +439,11 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
return KeyValue.makeCharKey((char)precomposed);
|
||||
}
|
||||
|
||||
public static KeyValue makeActionKey(String symbol)
|
||||
{
|
||||
return eventKey(symbol, Event.ACTION, FLAG_SMALLER_FONT);
|
||||
}
|
||||
|
||||
/** Make a key that types a string. A char key is returned for a string of
|
||||
length 1. */
|
||||
public static KeyValue makeStringKey(String str, int flags)
|
||||
@ -407,12 +454,36 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
|
||||
}
|
||||
|
||||
public static KeyValue makeStringKeyWithSymbol(String str, String symbol, int flags)
|
||||
{
|
||||
return new KeyValue(new Complex.StringWithSymbol(str, symbol),
|
||||
Complex.Kind.StringWithSymbol, flags);
|
||||
}
|
||||
|
||||
/** Make a modifier key for passing to [KeyModifier]. */
|
||||
public static KeyValue makeInternalModifier(Modifier mod)
|
||||
{
|
||||
return new KeyValue("", Kind.Modifier, mod.ordinal(), 0);
|
||||
}
|
||||
|
||||
public static KeyValue parseKeyDefinition(String str)
|
||||
{
|
||||
if (str.length() < 2 || str.charAt(0) != ':')
|
||||
return makeStringKey(str);
|
||||
try
|
||||
{
|
||||
return KeyValueParser.parse(str);
|
||||
}
|
||||
catch (KeyValueParser.ParseError _e)
|
||||
{
|
||||
return makeStringKey(str);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a key by its name. If the given name doesn't correspond to a key
|
||||
* defined in this function, it is passed to [parseStringKey] as a fallback.
|
||||
*/
|
||||
public static KeyValue getKeyByName(String name)
|
||||
{
|
||||
switch (name)
|
||||
@ -456,6 +527,38 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "fn": return modifierKey("Fn", Modifier.FN, 0);
|
||||
case "meta": return modifierKey("Meta", Modifier.META, 0);
|
||||
|
||||
/* Combining diacritics */
|
||||
/* Glyphs is the corresponding dead-key + 0x0100. */
|
||||
case "combining_dot_above": return makeCharKey(0xE15A, '\u0307', 0);
|
||||
case "combining_double_aigu": return makeCharKey(0xE15B, '\u030B', 0);
|
||||
case "combining_slash": return makeCharKey(0xE15C, '\u0337', 0);
|
||||
case "combining_arrow_right": return makeCharKey(0xE15D, '\u20D7', 0);
|
||||
case "combining_breve": return makeCharKey(0xE15E, '\u0306', 0);
|
||||
case "combining_bar": return makeCharKey(0xE15F, '\u0335', 0);
|
||||
case "combining_aigu": return makeCharKey(0xE150, '\u0301', 0);
|
||||
case "combining_caron": return makeCharKey(0xE151, '\u030C', 0);
|
||||
case "combining_cedille": return makeCharKey(0xE152, '\u0327', 0);
|
||||
case "combining_circonflexe": return makeCharKey(0xE153, '\u0302', 0);
|
||||
case "combining_grave": return makeCharKey(0xE154, '\u0300', 0);
|
||||
case "combining_macron": return makeCharKey(0xE155, '\u0304', 0);
|
||||
case "combining_ring": return makeCharKey(0xE156, '\u030A', 0);
|
||||
case "combining_tilde": return makeCharKey(0xE157, '\u0303', 0);
|
||||
case "combining_trema": return makeCharKey(0xE158, '\u0308', 0);
|
||||
case "combining_ogonek": return makeCharKey(0xE159, '\u0328', 0);
|
||||
case "combining_dot_below": return makeCharKey(0xE160, '\u0323', 0);
|
||||
case "combining_horn": return makeCharKey(0xE161, '\u031B', 0);
|
||||
case "combining_hook_above": return makeCharKey(0xE162, '\u0309', 0);
|
||||
/* Combining diacritics that do not have a corresponding dead keys start
|
||||
at 0xE200. */
|
||||
case "combining_vertical_tilde": return makeCharKey(0xE200, '\u033E', 0);
|
||||
case "combining_inverted_breve": return makeCharKey(0xE201, '\u0311', 0);
|
||||
case "combining_pokrytie": return makeCharKey(0xE202, '\u0487', 0);
|
||||
case "combining_slavonic_psili": return makeCharKey(0xE203, '\u0486', 0);
|
||||
case "combining_slavonic_dasia": return makeCharKey(0xE204, '\u0485', 0);
|
||||
case "combining_payerok": return makeCharKey(0xE205, '\uA67D', 0);
|
||||
case "combining_titlo": return makeCharKey(0xE206, '\u0483', 0);
|
||||
case "combining_vzmet": return makeCharKey(0xE207, '\uA66F', 0);
|
||||
|
||||
/* Special event keys */
|
||||
case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT);
|
||||
case "switch_text": return eventKey("ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT);
|
||||
@ -483,8 +586,8 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, 0);
|
||||
case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0);
|
||||
case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0);
|
||||
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, 0);
|
||||
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, 0);
|
||||
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT);
|
||||
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, FLAG_SMALLER_FONT);
|
||||
case "backspace": return keyeventKey(0xE011, KeyEvent.KEYCODE_DEL, 0);
|
||||
case "delete": return keyeventKey(0xE010, KeyEvent.KEYCODE_FORWARD_DEL, 0);
|
||||
case "insert": return keyeventKey("Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
|
||||
@ -501,6 +604,8 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "f11": return keyeventKey("F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
|
||||
case "f12": return keyeventKey("F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
|
||||
case "tab": return keyeventKey(0xE00F, KeyEvent.KEYCODE_TAB, FLAG_SMALLER_FONT);
|
||||
case "menu": return keyeventKey("Menu", KeyEvent.KEYCODE_MENU, FLAG_SMALLER_FONT);
|
||||
case "scroll_lock": return keyeventKey("Scrl", KeyEvent.KEYCODE_SCROLL_LOCK, FLAG_SMALLER_FONT);
|
||||
|
||||
/* Spaces */
|
||||
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
|
||||
@ -570,7 +675,7 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "autofill": return editingKey("auto", Editing.AUTOFILL);
|
||||
|
||||
/* The compose key */
|
||||
case "compose": return makeComposePending(0xE016, ComposeKeyData.en_US_UTF_8_Compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
|
||||
case "compose": return makeComposePending(0xE016, ComposeKeyData.compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
|
||||
|
||||
/* Placeholder keys */
|
||||
case "removed": return placeholderKey(Placeholder.REMOVED);
|
||||
@ -598,8 +703,8 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "ㅍ": return makeHangulInitial("ㅍ", 17);
|
||||
case "ㅎ": return makeHangulInitial("ㅎ", 18);
|
||||
|
||||
/* Fallback to a string key that types its name */
|
||||
default: return makeStringKey(name);
|
||||
/* The key is not one of the special ones. */
|
||||
default: return parseKeyDefinition(name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -609,4 +714,49 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
if (!b)
|
||||
throw new RuntimeException("Assertion failure");
|
||||
}
|
||||
|
||||
public static abstract class Complex
|
||||
{
|
||||
public abstract String getSymbol();
|
||||
|
||||
/** [compareTo] can assume that [snd] is an instance of the same class. */
|
||||
public abstract int compareTo(Complex snd);
|
||||
|
||||
public boolean equals(Object snd)
|
||||
{
|
||||
if (snd instanceof Complex)
|
||||
return compareTo((Complex)snd) == 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** [hashCode] will be called on this class. */
|
||||
|
||||
/** The kind is stored in the [value] field of the key. */
|
||||
public static enum Kind
|
||||
{
|
||||
StringWithSymbol,
|
||||
}
|
||||
|
||||
public static final class StringWithSymbol extends Complex
|
||||
{
|
||||
public final String str;
|
||||
private final String _symbol;
|
||||
|
||||
public StringWithSymbol(String _str, String _sym)
|
||||
{
|
||||
str = _str;
|
||||
_symbol = _sym;
|
||||
}
|
||||
|
||||
public String getSymbol() { return _symbol; }
|
||||
|
||||
public int compareTo(Complex _snd)
|
||||
{
|
||||
StringWithSymbol snd = (StringWithSymbol)_snd;
|
||||
int d = str.compareTo(snd.str);
|
||||
if (d != 0) return d;
|
||||
return _symbol.compareTo(snd._symbol);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
148
srcs/juloo.keyboard2/KeyValueParser.java
Normal file
@ -0,0 +1,148 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
Parse a key definition. The syntax for a key definition is:
|
||||
- [:(kind) (attributes):(payload)].
|
||||
- If [str] doesn't start with a [:] character, it is interpreted as an
|
||||
arbitrary string key.
|
||||
|
||||
For the different kinds and attributes, see doc/Possible-key-values.md.
|
||||
|
||||
Examples:
|
||||
- [:str flags=dim,small symbol='MyKey':'My arbitrary string'].
|
||||
- [:str:'My arbitrary string'].
|
||||
|
||||
*/
|
||||
public final class KeyValueParser
|
||||
{
|
||||
static Pattern START_PAT;
|
||||
static Pattern ATTR_PAT;
|
||||
static Pattern QUOTED_PAT;
|
||||
static Pattern PAYLOAD_START_PAT;
|
||||
static Pattern SINGLE_CHAR_PAT;
|
||||
|
||||
static public KeyValue parse(String str) throws ParseError
|
||||
{
|
||||
String symbol = null;
|
||||
int flags = 0;
|
||||
init();
|
||||
// Kind
|
||||
Matcher m = START_PAT.matcher(str);
|
||||
if (!m.lookingAt())
|
||||
parseError("Expected kind, for example \":str ...\".", m);
|
||||
String kind = m.group(1);
|
||||
// Attributes
|
||||
while (true)
|
||||
{
|
||||
if (!match(m, ATTR_PAT))
|
||||
break;
|
||||
String attr_name = m.group(1);
|
||||
String attr_value = parseSingleQuotedString(m);
|
||||
switch (attr_name)
|
||||
{
|
||||
case "flags":
|
||||
flags = parseFlags(attr_value, m);
|
||||
break;
|
||||
case "symbol":
|
||||
symbol = attr_value;
|
||||
break;
|
||||
|
||||
default:
|
||||
parseError("Unknown attribute "+attr_name, m);
|
||||
}
|
||||
}
|
||||
// Payload
|
||||
if (!match(m, PAYLOAD_START_PAT))
|
||||
parseError("Unexpected character", m);
|
||||
switch (kind)
|
||||
{
|
||||
case "str":
|
||||
String str_payload = parseSingleQuotedString(m);
|
||||
if (symbol == null)
|
||||
return KeyValue.makeStringKey(str_payload, flags);
|
||||
return KeyValue.makeStringKeyWithSymbol(str_payload, symbol, flags);
|
||||
|
||||
case "char":
|
||||
char char_payload = parseOneChar(m);
|
||||
return KeyValue.makeCharKey(char_payload, symbol, flags);
|
||||
default: break;
|
||||
}
|
||||
parseError("Unknown kind '"+kind+"'", m, 1);
|
||||
return null; // Unreachable
|
||||
}
|
||||
|
||||
static String parseSingleQuotedString(Matcher m) throws ParseError
|
||||
{
|
||||
if (!match(m, QUOTED_PAT))
|
||||
parseError("Expected quoted string", m);
|
||||
return m.group(1).replace("\\'", "'");
|
||||
}
|
||||
|
||||
static char parseOneChar(Matcher m) throws ParseError
|
||||
{
|
||||
if (!match(m, SINGLE_CHAR_PAT))
|
||||
parseError("Expected a character", m);
|
||||
return m.group(0).charAt(0);
|
||||
}
|
||||
|
||||
static int parseFlags(String s, Matcher m) throws ParseError
|
||||
{
|
||||
int flags = 0;
|
||||
for (String f : s.split(","))
|
||||
{
|
||||
switch (f)
|
||||
{
|
||||
case "dim": flags |= KeyValue.FLAG_SECONDARY; break;
|
||||
case "small": flags |= KeyValue.FLAG_SMALLER_FONT; break;
|
||||
default: parseError("Unknown flag "+f, m);
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
static boolean match(Matcher m, Pattern pat)
|
||||
{
|
||||
try { m.region(m.end(), m.regionEnd()); } catch (Exception _e) {}
|
||||
m.usePattern(pat);
|
||||
return m.lookingAt();
|
||||
}
|
||||
|
||||
static void init()
|
||||
{
|
||||
if (START_PAT != null)
|
||||
return;
|
||||
START_PAT = Pattern.compile(":(\\w+)");
|
||||
ATTR_PAT = Pattern.compile("\\s*(\\w+)\\s*=");
|
||||
QUOTED_PAT = Pattern.compile("'(([^'\\\\]+|\\\\')*)'");
|
||||
PAYLOAD_START_PAT = Pattern.compile("\\s*:");
|
||||
SINGLE_CHAR_PAT = Pattern.compile(".");
|
||||
}
|
||||
|
||||
static void parseError(String msg, Matcher m) throws ParseError
|
||||
{
|
||||
parseError(msg, m, m.regionStart());
|
||||
}
|
||||
|
||||
static void parseError(String msg, Matcher m, int i) throws ParseError
|
||||
{
|
||||
StringBuilder msg_ = new StringBuilder("Syntax error");
|
||||
try
|
||||
{
|
||||
char c = m.group(0).charAt(0);
|
||||
msg_.append(" at character '").append(c).append("'");
|
||||
} catch (IllegalStateException _e) {}
|
||||
msg_.append(" at position ");
|
||||
msg_.append(i);
|
||||
msg_.append(": ");
|
||||
msg_.append(msg);
|
||||
throw new ParseError(msg_.toString());
|
||||
}
|
||||
|
||||
public static class ParseError extends Exception
|
||||
{
|
||||
public ParseError(String msg) { super(msg); }
|
||||
};
|
||||
}
|
@ -150,14 +150,16 @@ public class Keyboard2 extends InputMethodService
|
||||
}
|
||||
|
||||
@TargetApi(12)
|
||||
private String defaultLayoutForSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
|
||||
private InputMethodSubtype defaultSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
|
||||
{
|
||||
if (VERSION.SDK_INT < 24)
|
||||
return imm.getCurrentInputMethodSubtype();
|
||||
// Android might return a random subtype, for example, the first in the
|
||||
// list alphabetically.
|
||||
InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype();
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
if (s.getLanguageTag().equals(current_subtype.getLanguageTag()))
|
||||
return s.getExtraValueOf("default_layout");
|
||||
return s;
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -170,10 +172,10 @@ public class Keyboard2 extends InputMethodService
|
||||
if (VERSION.SDK_INT >= 12)
|
||||
{
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
|
||||
InputMethodSubtype subtype = defaultSubtypes(imm, enabled_subtypes);
|
||||
if (subtype != null)
|
||||
{
|
||||
String s = defaultLayoutForSubtypes(imm, enabled_subtypes);
|
||||
String s = subtype.getExtraValueOf("default_layout");
|
||||
if (s != null)
|
||||
default_layout = LayoutsPreference.layout_of_string(getResources(), s);
|
||||
refreshAccentsOption(imm, enabled_subtypes);
|
||||
|
@ -193,21 +193,22 @@ public final class KeyboardData
|
||||
/** Load a layout from a resource ID. Returns [null] on error. */
|
||||
public static KeyboardData load(Resources res, int id)
|
||||
{
|
||||
KeyboardData l = _layoutCache.get(id);
|
||||
if (l == null)
|
||||
{
|
||||
if (_layoutCache.containsKey(id))
|
||||
return _layoutCache.get(id);
|
||||
KeyboardData l = null;
|
||||
XmlResourceParser parser = null;
|
||||
try
|
||||
{
|
||||
XmlResourceParser parser = res.getXml(id);
|
||||
parser = res.getXml(id);
|
||||
l = parse_keyboard(parser);
|
||||
parser.close();
|
||||
_layoutCache.put(id, l);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
Logs.exn("Failed to load layout id " + id, e);
|
||||
}
|
||||
if (parser != null)
|
||||
parser.close();
|
||||
_layoutCache.put(id, l);
|
||||
return l;
|
||||
}
|
||||
|
||||
@ -415,7 +416,7 @@ public final class KeyboardData
|
||||
keys = ks;
|
||||
anticircle = antic;
|
||||
keysflags = f;
|
||||
width = Math.max(w, 0.5f);
|
||||
width = Math.max(w, 0f);
|
||||
shift = Math.max(s, 0f);
|
||||
slider = sl;
|
||||
indication = i;
|
||||
@ -563,18 +564,20 @@ public final class KeyboardData
|
||||
{
|
||||
public final Map<KeyValue, KeyValue> shift;
|
||||
public final Map<KeyValue, KeyValue> fn;
|
||||
public final Map<KeyValue, KeyValue> ctrl;
|
||||
|
||||
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f)
|
||||
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f, Map<KeyValue, KeyValue> c)
|
||||
{
|
||||
shift = s;
|
||||
fn = f;
|
||||
ctrl = c;
|
||||
}
|
||||
|
||||
public static Modmap parse(XmlPullParser parser) throws Exception
|
||||
{
|
||||
HashMap<KeyValue, KeyValue> shift = new HashMap<KeyValue, KeyValue>();
|
||||
HashMap<KeyValue, KeyValue> fn = new HashMap<KeyValue, KeyValue>();
|
||||
|
||||
HashMap<KeyValue, KeyValue> ctrl = new HashMap<KeyValue, KeyValue>();
|
||||
while (next_tag(parser))
|
||||
{
|
||||
switch (parser.getName())
|
||||
@ -585,12 +588,15 @@ public final class KeyboardData
|
||||
case "fn":
|
||||
parse_mapping(parser, fn);
|
||||
break;
|
||||
case "ctrl":
|
||||
parse_mapping(parser, ctrl);
|
||||
break;
|
||||
default:
|
||||
throw error(parser, "Expecting tag <shift> or <fn>, got <" + parser.getName() + ">");
|
||||
}
|
||||
}
|
||||
|
||||
return new Modmap(shift, fn);
|
||||
return new Modmap(shift, fn, ctrl);
|
||||
}
|
||||
|
||||
private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception
|
||||
|
@ -3,11 +3,14 @@ package juloo.keyboard2;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Animatable;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.provider.Settings;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
@ -15,28 +18,49 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.VideoView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class LauncherActivity extends Activity
|
||||
public class LauncherActivity extends Activity implements Handler.Callback
|
||||
{
|
||||
/** Text is replaced when receiving key events. */
|
||||
VideoView _intro_video;
|
||||
TextView _tryhere_text;
|
||||
EditText _tryhere_area;
|
||||
/** Periodically restart the animations. */
|
||||
List<Animatable> _animations;
|
||||
Handler _handler;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.launcher_activity);
|
||||
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
|
||||
_tryhere_text = (TextView)findViewById(R.id.launcher_tryhere_text);
|
||||
_tryhere_area = (EditText)findViewById(R.id.launcher_tryhere_area);
|
||||
if (VERSION.SDK_INT >= 28)
|
||||
_tryhere_area.addOnUnhandledKeyEventListener(
|
||||
this.new Tryhere_OnUnhandledKeyEventListener());
|
||||
setup_intro_video(_intro_video);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
super.onStart();
|
||||
_animations = new ArrayList<Animatable>();
|
||||
_animations.add(find_anim(R.id.launcher_anim_swipe));
|
||||
_handler = new Handler(getMainLooper(), this);
|
||||
_handler.sendEmptyMessageDelayed(0, 500);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleMessage(Message _msg)
|
||||
{
|
||||
for (Animatable anim : _animations)
|
||||
anim.start();
|
||||
_handler.sendEmptyMessageDelayed(0, 3000);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -70,31 +94,10 @@ public class LauncherActivity extends Activity
|
||||
imm.showInputMethodPicker();
|
||||
}
|
||||
|
||||
static void setup_intro_video(final VideoView v)
|
||||
Animatable find_anim(int id)
|
||||
{
|
||||
if (VERSION.SDK_INT >= 26)
|
||||
v.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
|
||||
v.setVideoURI(Uri.parse("android.resource://" +
|
||||
v.getContext().getPackageName() + "/" + R.raw.intro_video));
|
||||
v.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
|
||||
{
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp)
|
||||
{
|
||||
mp.setLooping(true);
|
||||
}
|
||||
});
|
||||
v.setOnErrorListener(new MediaPlayer.OnErrorListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onError(MediaPlayer mp, int what, int extra)
|
||||
{
|
||||
v.stopPlayback();
|
||||
v.setVisibility(View.GONE);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
v.start();
|
||||
ImageView img = (ImageView)findViewById(id);
|
||||
return (Animatable)img.getDrawable();
|
||||
}
|
||||
|
||||
@TargetApi(28)
|
||||
|
@ -110,7 +110,7 @@ public final class Pointers implements Handler.Callback
|
||||
if (latched)
|
||||
add_fake_pointer(key, kv, lock);
|
||||
}
|
||||
else if ((ptr.flags & FLAG_P_FAKE) != 0)
|
||||
else if ((ptr.flags & FLAG_P_FAKE) == 0)
|
||||
{} // Key already latched but not by a fake ptr, do nothing.
|
||||
else if (lock)
|
||||
{
|
||||
|
@ -40,7 +40,7 @@ public class CustomExtraKeysPreference extends ListGroupPreference<String>
|
||||
if (key_names != null)
|
||||
{
|
||||
for (String key_name : key_names)
|
||||
kvs.put(KeyValue.makeStringKey(key_name), KeyboardData.PreferredPos.DEFAULT);
|
||||
kvs.put(KeyValue.parseKeyDefinition(key_name), KeyboardData.PreferredPos.DEFAULT);
|
||||
}
|
||||
return kvs;
|
||||
}
|
||||
|
@ -71,6 +71,35 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"subscript",
|
||||
"f11_placeholder",
|
||||
"f12_placeholder",
|
||||
"menu",
|
||||
"scroll_lock",
|
||||
"combining_dot_above",
|
||||
"combining_double_aigu",
|
||||
"combining_slash",
|
||||
"combining_arrow_right",
|
||||
"combining_breve",
|
||||
"combining_bar",
|
||||
"combining_aigu",
|
||||
"combining_caron",
|
||||
"combining_cedille",
|
||||
"combining_circonflexe",
|
||||
"combining_grave",
|
||||
"combining_macron",
|
||||
"combining_ring",
|
||||
"combining_tilde",
|
||||
"combining_trema",
|
||||
"combining_ogonek",
|
||||
"combining_dot_below",
|
||||
"combining_horn",
|
||||
"combining_hook_above",
|
||||
"combining_vertical_tilde",
|
||||
"combining_inverted_breve",
|
||||
"combining_pokrytie",
|
||||
"combining_slavonic_psili",
|
||||
"combining_slavonic_dasia",
|
||||
"combining_payerok",
|
||||
"combining_titlo",
|
||||
"combining_vzmet"
|
||||
};
|
||||
|
||||
/** Whether an extra key is enabled by default. */
|
||||
@ -120,6 +149,36 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
case "ª": id = R.string.key_descr_ª; break;
|
||||
case "º": id = R.string.key_descr_º; break;
|
||||
case "switch_clipboard": id = R.string.key_descr_clipboard; break;
|
||||
|
||||
case "combining_dot_above":
|
||||
case "combining_double_aigu":
|
||||
case "combining_slash":
|
||||
case "combining_arrow_right":
|
||||
case "combining_breve":
|
||||
case "combining_bar":
|
||||
case "combining_aigu":
|
||||
case "combining_caron":
|
||||
case "combining_cedille":
|
||||
case "combining_circonflexe":
|
||||
case "combining_grave":
|
||||
case "combining_macron":
|
||||
case "combining_ring":
|
||||
case "combining_tilde":
|
||||
case "combining_trema":
|
||||
case "combining_ogonek":
|
||||
case "combining_dot_below":
|
||||
case "combining_horn":
|
||||
case "combining_hook_above":
|
||||
case "combining_vertical_tilde":
|
||||
case "combining_inverted_breve":
|
||||
case "combining_pokrytie":
|
||||
case "combining_slavonic_psili":
|
||||
case "combining_slavonic_dasia":
|
||||
case "combining_payerok":
|
||||
case "combining_titlo":
|
||||
case "combining_vzmet":
|
||||
id = R.string.key_descr_combining;
|
||||
break;
|
||||
}
|
||||
if (id == 0)
|
||||
return null;
|
||||
|
@ -11,7 +11,7 @@
|
||||
<key key0="ه" key2="۸" key3="*"/>
|
||||
<key key0="خ" key2="۹" key3="(" key4=")"/>
|
||||
<key key0="ح" key2="۰"/>
|
||||
<key key0="ج" key2="چ"/>
|
||||
<key key0="ج"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key2="loc tab"/>
|
||||
@ -29,13 +29,13 @@
|
||||
<row>
|
||||
<key shift="0.5" key0="ظ"/>
|
||||
<key key0="ط"/>
|
||||
<key key0="ز" key2="«"/>
|
||||
<key key0="ر" key2="»"/>
|
||||
<key key0="ژ" key2="."/>
|
||||
<key key0="ز" key1="«" key2="»"/>
|
||||
<key key0="ر" key1="ژ" key2="."/>
|
||||
<key key0="ذ" key2=":"/>
|
||||
<key key0="د" key2="؛"/>
|
||||
<key key0="پ" key2="؟"/>
|
||||
<key key0="و"/>
|
||||
<key key0="چ"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
76
srcs/layouts/cyrl_lynyertz_sr.xml
Normal file
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="ЉЊЕРТЗ (Српски)" script="cyrillic">
|
||||
<modmap>
|
||||
<fn a="а" b="а̂" />
|
||||
<fn a="е" b="е̂" />
|
||||
<fn a="и" b="и̂" />
|
||||
<fn a="о" b="о̂" />
|
||||
<fn a="у" b="у̂" />
|
||||
<fn a="cursor_left" b="home" />
|
||||
<fn a="cursor_right" b="end" />
|
||||
<ctrl a="љ" b=":char symbol='љ':q" />
|
||||
<ctrl a="њ" b=":char symbol='њ':w" />
|
||||
<ctrl a="е" b=":char symbol='е':e" />
|
||||
<ctrl a="р" b=":char symbol='р':r" />
|
||||
<ctrl a="т" b=":char symbol='т':t" />
|
||||
<ctrl a="ж" b=":char symbol='ж':y" />
|
||||
<ctrl a="у" b=":char symbol='у':u" />
|
||||
<ctrl a="и" b=":char symbol='и':i" />
|
||||
<ctrl a="о" b=":char symbol='о':o" />
|
||||
<ctrl a="п" b=":char symbol='п':p" />
|
||||
<ctrl a="а" b=":char symbol='а':a" />
|
||||
<ctrl a="с" b=":char symbol='с':s" />
|
||||
<ctrl a="д" b=":char symbol='д':d" />
|
||||
<ctrl a="ф" b=":char symbol='ф':f" />
|
||||
<ctrl a="г" b=":char symbol='г':g" />
|
||||
<ctrl a="х" b=":char symbol='х':h" />
|
||||
<ctrl a="ј" b=":char symbol='ј':j" />
|
||||
<ctrl a="к" b=":char symbol='к':k" />
|
||||
<ctrl a="л" b=":char symbol='л':l" />
|
||||
<ctrl a="з" b=":char symbol='з':z" />
|
||||
<ctrl a="џ" b=":char symbol='џ':x" />
|
||||
<ctrl a="ц" b=":char symbol='ц':c" />
|
||||
<ctrl a="в" b=":char symbol='в':v" />
|
||||
<ctrl a="б" b=":char symbol='б':b" />
|
||||
<ctrl a="н" b=":char symbol='н':n" />
|
||||
<ctrl a="м" b=":char symbol='м':m" />
|
||||
</modmap>
|
||||
<row>
|
||||
<key key0="љ" ne="1" se="loc esc"/>
|
||||
<key key0="њ" nw="~" ne="2" sw="\@"/>
|
||||
<key key0="е" ne="3" sw="\#" se="€"/>
|
||||
<key key0="р" ne="4" sw="$" se="loc £"/>
|
||||
<key key0="т" ne="5" sw="%"/>
|
||||
<key key0="з" ne="6" sw="^"/>
|
||||
<key key0="у" ne="7" sw="&"/>
|
||||
<key key0="и" ne="8" sw="*"/>
|
||||
<key key0="о" ne="9" sw="(" se=")"/>
|
||||
<key key0="п" ne="0" sw="[" se="]"/>
|
||||
<key key0="ш"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="а" nw="loc tab" ne="loc selectAll"/>
|
||||
<key key0="с" nw="loc §" ne="loc shareText"/>
|
||||
<key key0="д"/>
|
||||
<key key0="ф"/>
|
||||
<key key0="г"/>
|
||||
<key key0="х"/>
|
||||
<key key0="ј" ne="loc accent_circonflexe" sw="{" se="}"/>
|
||||
<key key0="к" ne="-" sw="_"/>
|
||||
<key key0="л" ne="=" sw="+"/>
|
||||
<key key0="ч" nw="'" ne=""" sw="\\"/>
|
||||
<key key0="ћ" ne="`" sw="|"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" nw="loc superscript" ne="loc capslock" sw="loc subscript"/>
|
||||
<key key0="ж" nw="loc undo" ne="loc redo" sw="<" se=">"/>
|
||||
<key key0="џ" ne="loc cut"/>
|
||||
<key key0="ц" ne="loc copy"/>
|
||||
<key key0="в" ne="loc paste"/>
|
||||
<key key0="б" ne="loc pasteAsPlainText"/>
|
||||
<key key0="н" nw="!" ne="\?" sw="/"/>
|
||||
<key key0="м" ne=";" sw=","/>
|
||||
<key key0="ђ" ne=":" sw="."/>
|
||||
<key width="1.5" key0="backspace" ne="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
42
srcs/layouts/cyrl_yqukeng_tj.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Tajiki Persian (Тоҷикӣ)" script="cyrillic">
|
||||
<row>
|
||||
<key key0="й" key7="esc" key4="delete" />
|
||||
<key key0="қ" key7="-" key8="_" />
|
||||
<key key0="у" key7="\@" key8="ӯ" />
|
||||
<key key0="к" key7="=" key8="+" />
|
||||
<key key0="е" key8="ё" key7="!" />
|
||||
<key key0="н" key7="$" key8="%"/>
|
||||
<key key0="г" key7="^" key8="ғ" />
|
||||
<key key0="ш" key3="(" key2=")" />
|
||||
<key key0="ҳ" key3="[" key2="]" />
|
||||
<key key0="з" key3="{" key2="}" />
|
||||
<key key0="х" key7="tab" key3="backspace" />
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ф" key7="1" />
|
||||
<key key0="ҷ" key7="2" />
|
||||
<key key0="в" key7="3" />
|
||||
<key key0="а" key7="4" />
|
||||
<key key0="п" key7="5" />
|
||||
<key key0="р" key7="6" />
|
||||
<key key0="о" key7="7" />
|
||||
<key key0="л" key7="8" />
|
||||
<key key0="д" key7="9" key8="f11_placeholder" />
|
||||
<key key0="ж" key7="0" key8="f12_placeholder" />
|
||||
<key key0="э" key7="\?" key3="/" />
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.18" key0="shift" key2="loc capslock" />
|
||||
<key width="0.96" key0="я" key7="`" key8=";" />
|
||||
<key width="0.96" key0="ч" key7="*" key8=":" />
|
||||
<key width="0.96" key0="с" key7="&" key8="\#" />
|
||||
<key width="0.96" key0="м" key7="|" key8="\\" />
|
||||
<key width="0.96" key0="и" key7="~" />
|
||||
<key width="0.96" key0="т" key7="ц" />
|
||||
<key width="0.96" key0="ӣ" key3="<" key2=">" />
|
||||
<key width="0.96" key0="б" key7="ъ" key8="ы" />
|
||||
<key width="0.96" key0="ю" key7=""" key8="'"/>
|
||||
<key width="1.18" key0="." key7="," />
|
||||
</row>
|
||||
</keyboard>
|
42
srcs/layouts/cyrl_yxukeng_os.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Old Church Slavonic (Црькъвьнословѣньскъ ѩзыкъ)" script="cyrillic">
|
||||
<row>
|
||||
<key key0="й" key7="esc" key4="delete" />
|
||||
<key key0="ѯ" key7="=" key8="+" />
|
||||
<key key0="у" key8="ѵ" key7="!" />
|
||||
<key key0="к" key7="%" key8="*" />
|
||||
<key key0="е" key7="ё" key8="combining_trema" />
|
||||
<key key0="н" key7="ѩ" key8="combining_titlo" />
|
||||
<key key0="г" key7="^" key8="combining_payerok" />
|
||||
<key key0="ш" key7="щ" key8="combining_vzmet" />
|
||||
<key key0="ѳ" key3="combining_slavonic_dasia" key2="combining_slavonic_psili" />
|
||||
<key key0="з" key3="combining_grave" key2="combining_aigu" />
|
||||
<key key0="х" key7="ҁ" key3="backspace" />
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ф" key7="1" key4="tab" />
|
||||
<key key0="ꙉ" key7="2" key8="ъ" />
|
||||
<key key0="в" key7="3" key8="ꙑ" />
|
||||
<key key0="а" key7="4" key8="ь" />
|
||||
<key key0="п" key7="5" />
|
||||
<key key0="р" key7="6" />
|
||||
<key key0="о" key7="7" key8="ѡ" />
|
||||
<key key0="л" key7="8" />
|
||||
<key key0="д" key7="9" key8="f11_placeholder" />
|
||||
<key key0="ж" key7="0" key8="f12_placeholder" />
|
||||
<key key0="э" key7="/" key8="|" />
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.18" key0="shift" />
|
||||
<key width="0.96" key0="ꙗ" key7="combining_breve" key8=";" />
|
||||
<key width="0.96" key0="ч" key7="combining_pokrytie" key8=":" />
|
||||
<key width="0.96" key0="с" key7="combining_inverted_breve" key8="`" />
|
||||
<key width="0.96" key0="м" key7="ѭ" />
|
||||
<key width="0.96" key0="и" key7="combining_vertical_tilde" key8="-" />
|
||||
<key width="0.96" key0="т" key7="\?" key8="\\" />
|
||||
<key width="0.96" key0="ц" key3="<" key2=">" />
|
||||
<key width="0.96" key0="б" key3="(" key2=")" />
|
||||
<key width="0.96" key0="ю" key3="{" key2="}" />
|
||||
<key width="1.18" key0="." key7="," key8="_" />
|
||||
</row>
|
||||
</keyboard>
|
@ -1,46 +1,72 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://neo-layout.org/Layouts/bone/ -->
|
||||
<keyboard name="Bone" bottom_row="false" script="latin">
|
||||
<!-- first row + characters from number row:
|
||||
jduaxphlmwß
|
||||
…_[]^!<>=&ſ
|
||||
°§ℓ»«$€„“”—
|
||||
›‹¢¥‚‘’
|
||||
-->
|
||||
<row>
|
||||
<key key0="j" key2="loc esc" key4="…"/>
|
||||
<key key0="d" key2="°" key4="_"/>
|
||||
<key key0="u" key2="§" key4="["/>
|
||||
<key key0="a" key4="]"/>
|
||||
<key key0="x" key4="^"/>
|
||||
<key key0="p" key3="!" key4="7"/>
|
||||
<key key0="h" key3="<" key4="8"/>
|
||||
<key key0="l" key1="ℓ" key3=">" key4="9"/>
|
||||
<key key0="m" key1="≠" key3="="/>
|
||||
<key key0="w" key3="&"/>
|
||||
<!--left side-->
|
||||
<key key0="j" key2="°" key4="…"/>
|
||||
<key key0="d" key2="§" key4="_"/>
|
||||
<key key0="u" key2="ℓ" key4="["/>
|
||||
<key key0="a" key2="»" key4="]" key1="›"/>
|
||||
<key key0="x" key2="«" key4="^" key1="‹"/>
|
||||
<!--middle-->
|
||||
<key key0="p" key7="¢" key8="!"/>
|
||||
<!--right side-->
|
||||
<key key0="h" key1="€" key3="<" key4="7" key2="¥"/>
|
||||
<key key0="l" key1="„" key3=">" key4="8" key2="‚"/>
|
||||
<key key0="m" key1="“" key3="=" key4="9" key2="‘"/>
|
||||
<key key0="w" key1="”" key3="&" key2="’"/>
|
||||
<key key0="ß" key1="—" key3="ſ"/>
|
||||
</row>
|
||||
<!--second row:
|
||||
ctieobnrsgq
|
||||
\/{}*?()-:@
|
||||
-->
|
||||
<row>
|
||||
<key key0="c" key2="loc tab" key4="\\"/>
|
||||
<key key0="t" key1="accent_circonflexe" key2="accent_caron" key4="/"/>
|
||||
<key key0="i" key1="accent_aigu" key2="accent_grave" key4="{"/>
|
||||
<key key0="e" key1="accent_cedille" key2="accent_ogonek" key4="}"/>
|
||||
<key key0="o" key1="accent_ring" key2="accent_dot_above" key4="*"/>
|
||||
<key key0="b" key2="accent_macron" key3="\?" key4="4"/>
|
||||
<key key0="n" key2="accent_tilde" key3="(" key4="5"/>
|
||||
<key key0="r" key2="accent_trema" key3=")" key4="6"/>
|
||||
<key key0="s" key2="accent_slash" key3="-"/>
|
||||
<key key0="g" key1="\@" key3=":"/>
|
||||
<!--left side-->
|
||||
<key key0="c" key4="\\"/>
|
||||
<key key0="t" key4="/"/>
|
||||
<key key0="i" key4="{"/>
|
||||
<key key0="e" key4="}"/>
|
||||
<key key0="o" key4="*"/>
|
||||
<!--middle-->
|
||||
<key key0="b" key8="\?"/>
|
||||
<!--right side-->
|
||||
<key key0="n" key3="(" key4="4"/>
|
||||
<key key0="r" key3=")" key4="5"/>
|
||||
<key key0="s" key3="-" key4="6"/>
|
||||
<key key0="g" key3=":"/>
|
||||
<key key0="q" key3="@"/>
|
||||
</row>
|
||||
<!--third row -> compressed to also fit shift and backspace:
|
||||
fvüäöyz,.k
|
||||
#$|~`+%"';
|
||||
-->
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key4="\#" key2="loc capslock"/>
|
||||
<key key0="f" key4="|"/>
|
||||
<key key0="v" key4="~"/>
|
||||
<key key0="ß" key4="`"/>
|
||||
<!--left side-->
|
||||
<key width="1.5" key0="shift" key4="\#"/>
|
||||
<key key0="f" key4="$"/>
|
||||
<key key0="v" key4="|"/>
|
||||
<key key0="ü" key4="~"/>
|
||||
<key key0="ä" key4="`"/>
|
||||
<!--right side-->
|
||||
<key key0="ö" key3="+"/>
|
||||
<key key0="y" key3="%" key4="1"/>
|
||||
<key key0="z" key1=""" key3="+" key4="2"/>
|
||||
<key key0="q" key1="'" key3="," key4="3"/>
|
||||
<key key0="k" key3="."/>
|
||||
<key width="1.5" key0="backspace" key1="delete" key3=";"/>
|
||||
<key key0="z" key3="," key1=""" key4="2"/>
|
||||
<key key0="k" key3="." key1="'" key4="3"/>
|
||||
<key width="1.5" key0="backspace" key3=";" key1="delete"/>
|
||||
</row>
|
||||
<!--bottom row-->
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key7="switch_forward" key8="0"/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key width="5.0" key0="space" key7="switch_forward" key8="0"/>
|
||||
<key width="1.2" key5="left" key6="right" key7="up" key8="down"/>
|
||||
<key width="1.8" key0="enter" key3="action"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
37
srcs/layouts/latn_qwerty_jp.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<keyboard name="QWERTY (Japan)" script="latin">
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="!" key1="loc esc"/>
|
||||
<key key0="w" key2="2" key3="""/>
|
||||
<key key0="e" key2="3" key3="\#" key4="loc €"/>
|
||||
<key key0="r" key2="4" key3="$"/>
|
||||
<key key0="t" key2="5" key3="%"/>
|
||||
<key key0="y" key2="6" key3="&"/>
|
||||
<key key0="u" key2="7" key3="'"/>
|
||||
<key key0="i" key2="8" key3="(" key4=")"/>
|
||||
<key key0="o" key1="=" key2="9" key3="-"/>
|
||||
<key key0="p" key1="~" key2="0" key3="^"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="loc tab"/>
|
||||
<key key0="s" key2="loc §" key3="loc ß"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key2="+" key3=";"/>
|
||||
<key key0="h" key2="*" key3=":"/>
|
||||
<key key0="j" key3="{" key4="}"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="¥"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x" key2="loc †"/>
|
||||
<key key0="c" key2="<" key3=","/>
|
||||
<key key0="v" key2=">" key3="."/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key2="_" key3="\\"/>
|
||||
<key key0="m" key2="`" key3="\@"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@ -9,8 +9,8 @@
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&" key4="loc €"/>
|
||||
<key key0="i" key1="loc accent_macron" key2="8" key3="*"/>
|
||||
<key key0="o" key2="9" key4="ó"/>
|
||||
<key key0="p" key2="0" key3="(" key4=")"/>
|
||||
<key key0="o" key1="ó" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key2="0"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="loc tab" key2="`" key4="ą"/>
|
||||
|
46
srcs/layouts/latn_qwerty_sr.xml
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="QWERTY (Srpski, latinica)" script="latin">
|
||||
<modmap>
|
||||
<fn a="a" b="â" />
|
||||
<fn a="o" b="ô" />
|
||||
<fn a="e" b="æ" />
|
||||
<fn a="€" b="œ" />
|
||||
<fn a="cursor_left" b="home" />
|
||||
<fn a="cursor_right" b="end" />
|
||||
</modmap>
|
||||
<row>
|
||||
<key key0="q" ne="1" se="loc esc"/>
|
||||
<key key0="w" nw="~" ne="2" sw="\@"/>
|
||||
<key key0="e" ne="3" sw="\#" se="€"/>
|
||||
<key key0="r" ne="4" sw="$" se="loc £"/>
|
||||
<key key0="t" ne="5" sw="%"/>
|
||||
<key key0="y" ne="6" sw="^"/>
|
||||
<key key0="u" ne="7" sw="&"/>
|
||||
<key key0="i" ne="8" sw="*"/>
|
||||
<key key0="o" ne="9" sw="(" se=")"/>
|
||||
<key key0="p" ne="0" sw="[" se="]"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" nw="loc tab" ne="loc selectAll"/>
|
||||
<key key0="s" nw="loc §" ne="š"/>
|
||||
<key key0="d" ne="đ"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g"/>
|
||||
<key key0="h" ne="loc accent_circonflexe" sw="{" se="}"/>
|
||||
<key key0="j" ne="-" sw="_"/>
|
||||
<key key0="k" ne="=" sw="+"/>
|
||||
<key key0="l" nw="'" ne=""" sw="\\"/>
|
||||
<key key0="č" ne="`" sw="|"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" nw="loc superscript" ne="loc capslock" sw="loc subscript"/>
|
||||
<key key0="z" nw="loc undo" ne="ž"/>
|
||||
<key key0="x" nw="loc cut"/>
|
||||
<key key0="c" nw="loc copy" ne="ć"/>
|
||||
<key key0="v" nw="loc paste" ne="<" se=">"/>
|
||||
<key key0="b" nw="!" ne="\?" sw="/"/>
|
||||
<key key0="n" ne=";" sw=","/>
|
||||
<key key0="m" ne=":" sw="."/>
|
||||
<key width="1.5" key0="backspace" ne="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
32
srcs/res/SvgToVector.java
Normal file
@ -0,0 +1,32 @@
|
||||
package srcs.res;
|
||||
|
||||
import com.android.ide.common.vectordrawable.Svg2Vector;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
/** Inspired from Bernard Ladenthin's answer:
|
||||
https://stackoverflow.com/a/78898372 */
|
||||
public class SvgToVector
|
||||
{
|
||||
public static void main(String[] args)
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
System.out.println("Usage: svg_to_vector <input_file> <output_file>");
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
File input_file = new File(args[0]);
|
||||
FileOutputStream output_stream = new FileOutputStream(args[1]);
|
||||
String warnings;
|
||||
warnings = Svg2Vector.parseSvgToXml(input_file, output_stream);
|
||||
System.err.println(warnings);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
System.exit(2);
|
||||
}
|
||||
}
|
||||
}
|
192
srcs/res/doc_key.svg
Normal file
@ -0,0 +1,192 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="35mm"
|
||||
height="40mm"
|
||||
viewBox="0 0 35 40"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
sodipodi:docname="doc_key.svg"
|
||||
inkscape:export-filename="key_u.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#1b1b1b"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#1b1b1b"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="4.6038101"
|
||||
inkscape:cx="160.95364"
|
||||
inkscape:cy="75.69817"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1440"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer2">
|
||||
<inkscape:page
|
||||
x="0"
|
||||
y="0"
|
||||
width="35"
|
||||
height="40"
|
||||
id="page1"
|
||||
margin="0"
|
||||
bleed="0"
|
||||
inkscape:label="g" />
|
||||
<inkscape:page
|
||||
x="45"
|
||||
y="0"
|
||||
width="35"
|
||||
height="40"
|
||||
id="page2"
|
||||
margin="0"
|
||||
bleed="0"
|
||||
inkscape:label="u" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="U"
|
||||
style="display:inline">
|
||||
<g
|
||||
inkscape:label="Background"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="display:inline"
|
||||
transform="translate(42.916821,-9.9998472)">
|
||||
<rect
|
||||
style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
id="rect1"
|
||||
width="14.749311"
|
||||
height="19.74971"
|
||||
x="12.208678"
|
||||
y="20.125347"
|
||||
ry="1.1332803"
|
||||
inkscape:label="rect1" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="59.864403"
|
||||
y="22.246796"
|
||||
id="text1"
|
||||
inkscape:label="text1"
|
||||
inkscape:transform-center-x="-0.00074323194"
|
||||
inkscape:transform-center-y="-0.001350474"
|
||||
transform="scale(1.0003873,0.99961285)"><tspan
|
||||
id="tspan1"
|
||||
sodipodi:role="line"
|
||||
x="59.864403"
|
||||
y="22.246796"
|
||||
style="stroke-width:0.265729">u</tspan><tspan
|
||||
id="tspan2"
|
||||
sodipodi:role="line"
|
||||
x="59.864403"
|
||||
y="32.859245"
|
||||
style="stroke-width:0.265729" /></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="55.882885"
|
||||
y="28.802013"
|
||||
id="text3"
|
||||
transform="scale(1.0003873,0.99961285)"
|
||||
inkscape:label="text3"><tspan
|
||||
sodipodi:role="line"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
|
||||
x="55.882885"
|
||||
y="28.802013"
|
||||
id="tspan4">&</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="65.686905"
|
||||
y="15.189408"
|
||||
id="text5"
|
||||
transform="scale(1.0003873,0.99961285)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
|
||||
x="65.686905"
|
||||
y="15.189408">7</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="G"
|
||||
style="display:inline">
|
||||
<g
|
||||
inkscape:label="Background"
|
||||
inkscape:groupmode="layer"
|
||||
id="g2"
|
||||
style="display:inline">
|
||||
<rect
|
||||
style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
id="rect2"
|
||||
width="14.749311"
|
||||
height="19.74971"
|
||||
x="10.125345"
|
||||
y="10.125347"
|
||||
ry="1.1332803"
|
||||
inkscape:label="rect1" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="10.887006"
|
||||
y="27.77977"
|
||||
id="text3-3"
|
||||
transform="scale(1.0003873,0.99961285)"
|
||||
inkscape:label="text3"><tspan
|
||||
sodipodi:role="line"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
|
||||
x="10.887006"
|
||||
y="27.77977"
|
||||
id="tspan4-7">_</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="14.868526"
|
||||
y="22.204519"
|
||||
id="text1-2"
|
||||
inkscape:label="text1"
|
||||
inkscape:transform-center-x="-0.00074323194"
|
||||
inkscape:transform-center-y="-0.001350474"
|
||||
transform="scale(1.0003873,0.99961285)"><tspan
|
||||
id="tspan1-0"
|
||||
sodipodi:role="line"
|
||||
x="14.868526"
|
||||
y="22.204519"
|
||||
style="stroke-width:0.265729">g</tspan><tspan
|
||||
id="tspan2-2"
|
||||
sodipodi:role="line"
|
||||
x="14.868526"
|
||||
y="32.816971"
|
||||
style="stroke-width:0.265729" /></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
||||
x="20.691027"
|
||||
y="15.147132"
|
||||
id="text5-5"
|
||||
transform="scale(1.0003873,0.99961285)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
|
||||
x="20.691027"
|
||||
y="15.147132">-</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 9.4 KiB |
25
srcs/res/gen_doc_key_drawables.sh
Normal file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
cd "$(dirname $0)"
|
||||
|
||||
DRAWABLE_DIR=../../res/drawable
|
||||
ANDROID_LIB=$ANDROID_SDK_ROOT/tools/lib
|
||||
|
||||
first () { echo "$1"; }
|
||||
JAVA_ARGS=(
|
||||
-classpath
|
||||
"$(first $ANDROID_LIB/sdk-common-*.jar):$(first $ANDROID_LIB/common-*.jar)"
|
||||
)
|
||||
svg_to_vector ()
|
||||
{
|
||||
java "${JAVA_ARGS[@]}" SvgToVector.java "$@"
|
||||
}
|
||||
|
||||
TMP=`mktemp -d`
|
||||
trap "rm -r '$TMP'" EXIT
|
||||
set -x
|
||||
|
||||
inkscape doc_key.svg -o "$TMP/doc_key_u.svg" -C --export-page 2 --export-plain-svg --export-text-to-path
|
||||
|
||||
svg_to_vector "$TMP/doc_key_u.svg" "$DRAWABLE_DIR/doc_key_u.xml"
|
@ -1,9 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="-10 0 750 1000"
|
||||
fill="currentColor">
|
||||
<!-- created by @sdrapha - https://github.com/sdrapha/IconFontSVG
|
||||
License - LICENSE: CC BY-SA 4.0 -->
|
||||
<!-- derived from Entypo+ arrow-left-bold by Daniel Bruce -->
|
||||
<title>arrow-home</title>
|
||||
<path d="M0 165h50v669h-50v-669zM378 830l-328 -330l328 -330v190h352v278h-352v192z" />
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!-- Modified from DejaVuSans -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-10 0 1726 2048">
|
||||
<path fill="currentColor"
|
||||
d="M1613 63v169h-1322v1324h-169v-1493h1491zM412 416l63 -63h556v169h-330l862 862l-120 120l-862 -862v330h-169v-556z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 381 B After Width: | Height: | Size: 450 B |
@ -1,9 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="-10 0 750 1000"
|
||||
fill="currentColor">
|
||||
<!-- created by @sdrapha - https://github.com/sdrapha/IconFontSVG
|
||||
License - LICENSE: CC BY-SA 4.0 -->
|
||||
<!-- derived from Entypo+ arrow-right-bold by Daniel Bruce -->
|
||||
<title>arrow-end</title>
|
||||
<path d="M680 170h50v660h-50v-660zM350 170l330 330l-330 330v-192h-350v-278h350v-190z" />
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!-- Modified from DejaVuSans -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-10 0 1726 2048">
|
||||
<path fill="currentColor"
|
||||
d="M122 1556v-169h1322v-1324h169v1493h-1491zM1323 1203l-63 63h-556v-169h330l-862 -862l120 -120l862 862v-330h169v556z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 384 B After Width: | Height: | Size: 453 B |
41
srcs/special_font/150.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
viewBox="-20 0 1168 2048"
|
||||
id="svg1"
|
||||
sodipodi:docname="50.combining.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.43103287"
|
||||
inkscape:cx="573.04214"
|
||||
inkscape:cy="259.84097"
|
||||
inkscape:window-width="2736"
|
||||
inkscape:window-height="1744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g1" />
|
||||
<g
|
||||
transform="matrix(1 0 0 -1 0 1536)"
|
||||
id="g1">
|
||||
<path
|
||||
id="path1"
|
||||
d="M 650 1541 L 465 1275 L 613 1275 L 882 1535 L 880 1541 L 650 1541 z M 788.03711 1185.2168 L 788.03711 834.99219 L 884.67969 834.99219 L 884.67969 1185.2168 L 788.03711 1185.2168 z M 516.67773 1130.7461 C 398.97689 1122.8994 292.60787 1080.177 197.57227 1002.5801 L 194.95703 1005.1953 C 242.90998 956.37142 266.88672 931.52279 266.88672 930.65039 C 344.48318 990.80911 427.7482 1024.3767 516.67773 1031.3516 L 516.67773 1130.7461 z M 121.71875 938.49805 L 127.9043 933.55078 L 125.64258 935.88281 L 121.71875 938.49805 z M 127.9043 933.55078 L 128.2207 933.22461 C 128.2327 933.23861 128.24581 933.25358 128.25781 933.26758 L 127.9043 933.55078 z M 128.2207 933.22461 C 48.031653 841.68937 2.2696687 735.33339 -9.0625 614.16211 L 90.332031 614.16211 C 101.6658 709.19571 137.41295 791.15224 197.57227 860.0293 C 197.57227 860.90169 187.54483 871.80024 167.49219 892.72461 L 128.2207 933.22461 z M 788.03711 733.03516 L 788.03711 382.8125 L 884.67969 382.8125 L 884.67969 733.03516 L 788.03711 733.03516 z M -9.0605469 517.38281 C -0.34667559 391.03054 42.335595 282.09919 118.98047 190.58398 C 123.06104 195.44428 144.50061 217.66171 189.72656 263.66797 C 132.18314 335.1603 99.052766 419.73181 90.333984 517.38281 L -9.0605469 517.38281 z M 118.98047 190.58398 C 118.49847 190.00988 115.08964 186.50781 115.18164 186.50781 L 119.10352 190.43164 C 119.06152 190.48164 119.02242 190.53368 118.98047 190.58398 z M 788.03711 280.85547 L 788.03711 -69.369141 L 884.67969 -69.369141 L 884.67969 280.85547 L 788.03711 280.85547 z M 259.04102 190.43164 L 189.72656 121.11719 C 287.37616 38.28987 396.36145 -7.0487922 516.67969 -14.896484 L 516.67969 84.498047 C 423.38876 94.961136 337.50938 130.2728 259.04102 190.43164 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
41
srcs/special_font/151.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
viewBox="-20 0 1168 2048"
|
||||
id="svg1"
|
||||
sodipodi:docname="51.combining.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.32224737"
|
||||
inkscape:cx="1238.1792"
|
||||
inkscape:cy="301.01099"
|
||||
inkscape:window-width="2736"
|
||||
inkscape:window-height="1744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<g
|
||||
transform="matrix(1 0 0 -1 0 1536)"
|
||||
id="g1">
|
||||
<path
|
||||
id="path1"
|
||||
d="M 240 1543 L 240 1523 L 494 1280 L 613 1280 L 870 1525 L 870 1543 L 700 1543 L 553 1395 L 406 1543 L 240 1543 z M 788.03711 1185.4141 L 788.03711 835.18945 L 884.67969 835.18945 L 884.67969 1185.4141 L 788.03711 1185.4141 z M 516.67773 1130.9434 C 398.97689 1123.0967 292.60787 1080.3743 197.57227 1002.7773 L 194.95703 1005.3926 C 242.90998 956.56869 266.88672 931.72006 266.88672 930.84766 C 344.48318 991.00638 427.7482 1024.5739 516.67773 1031.5488 L 516.67773 1130.9434 z M 121.71875 938.69531 L 127.9043 933.74805 L 125.64258 936.08008 L 121.71875 938.69531 z M 127.9043 933.74805 L 128.2207 933.42188 C 128.2327 933.43587 128.24581 933.45084 128.25781 933.46484 L 127.9043 933.74805 z M 128.2207 933.42188 C 48.031653 841.88664 2.2696687 735.53065 -9.0625 614.35938 L 90.332031 614.35938 C 101.6658 709.39298 137.41295 791.3495 197.57227 860.22656 C 197.57227 861.09895 187.54483 871.99751 167.49219 892.92188 L 128.2207 933.42188 z M 788.03711 733.23242 L 788.03711 383.00977 L 884.67969 383.00977 L 884.67969 733.23242 L 788.03711 733.23242 z M -9.0605469 517.58008 C -0.34667559 391.2278 42.335595 282.29646 118.98047 190.78125 C 123.06104 195.64155 144.50061 217.85898 189.72656 263.86523 C 132.18314 335.35756 99.052766 419.92908 90.333984 517.58008 L -9.0605469 517.58008 z M 118.98047 190.78125 C 118.49847 190.20715 115.08964 186.70508 115.18164 186.70508 L 119.10352 190.62891 C 119.06152 190.67891 119.02242 190.73095 118.98047 190.78125 z M 788.03711 281.05273 L 788.03711 -69.171875 L 884.67969 -69.171875 L 884.67969 281.05273 L 788.03711 281.05273 z M 259.04102 190.62891 L 189.72656 121.31445 C 287.37616 38.487136 396.36145 -6.8515266 516.67969 -14.699219 L 516.67969 84.695312 C 423.38876 95.158402 337.50938 130.47007 259.04102 190.62891 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
41
srcs/special_font/152.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
viewBox="-20 0 1168 2048"
|
||||
id="svg1"
|
||||
sodipodi:docname="52.combining.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.28469254"
|
||||
inkscape:cx="1053.7684"
|
||||
inkscape:cy="540.93444"
|
||||
inkscape:window-width="2736"
|
||||
inkscape:window-height="1744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<g
|
||||
transform="matrix(1 0 0 -1 0 1536)"
|
||||
id="g1">
|
||||
<path
|
||||
id="path1"
|
||||
d="M 788.03711 1185.3613 L 788.03711 835.13672 L 884.67969 835.13672 L 884.67969 1185.3613 L 788.03711 1185.3613 z M 516.67773 1130.8906 C 398.97689 1123.0439 292.60787 1080.3215 197.57227 1002.7246 L 194.95703 1005.3398 C 242.90998 956.51595 266.88672 931.66732 266.88672 930.79492 C 344.48318 990.95364 427.7482 1024.5212 516.67773 1031.4961 L 516.67773 1130.8906 z M 121.71875 938.64258 L 127.9043 933.69531 L 125.64258 936.02734 L 121.71875 938.64258 z M 127.9043 933.69531 L 128.2207 933.36914 C 128.2327 933.38314 128.24581 933.39811 128.25781 933.41211 L 127.9043 933.69531 z M 128.2207 933.36914 C 48.031653 841.8339 2.2696687 735.47792 -9.0625 614.30664 L 90.332031 614.30664 C 101.6658 709.34025 137.41295 791.29677 197.57227 860.17383 C 197.57227 861.04622 187.54483 871.94477 167.49219 892.86914 L 128.2207 933.36914 z M 788.03711 733.17969 L 788.03711 382.95703 L 884.67969 382.95703 L 884.67969 733.17969 L 788.03711 733.17969 z M -9.0605469 517.52734 C -0.34667559 391.17507 42.335595 282.24372 118.98047 190.72852 C 123.06104 195.58881 144.50061 217.80625 189.72656 263.8125 C 132.18314 335.30483 99.052766 419.87634 90.333984 517.52734 L -9.0605469 517.52734 z M 118.98047 190.72852 C 118.49847 190.15442 115.08964 186.65234 115.18164 186.65234 L 119.10352 190.57617 C 119.06152 190.62617 119.02242 190.67822 118.98047 190.72852 z M 788.03711 281 L 788.03711 -69.224609 L 884.67969 -69.224609 L 884.67969 281 L 788.03711 281 z M 259.04102 190.57617 L 189.72656 121.26172 C 278.02009 46.370309 375.61486 2.2381133 482.44141 -11.353516 L 451 -144 C 508.99994 -148.66667 550.00002 -157.33334 574 -170 C 597.99998 -182.66666 610 -205.00003 610 -237 C 610 -269.66664 595.3333 -294.16669 566 -310.5 C 536.6667 -326.83331 497.99995 -335 450 -335 L 457 -444 C 554.9999 -444 630.33338 -424.99996 683 -387 C 735.66662 -349.00004 762 -297.99994 762 -234 C 762 -180.66672 747.66664 -140.3333 719 -113 C 690.33336 -85.666694 654.33329 -68.333326 611 -61 L 623 -9 L 516.67969 -9 L 516.67969 84.642578 C 423.38876 95.105668 337.50938 130.41733 259.04102 190.57617 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
41
srcs/special_font/153.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
viewBox="-20 0 1168 2048"
|
||||
id="svg1"
|
||||
sodipodi:docname="53.combining.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.43330418"
|
||||
inkscape:cx="964.68028"
|
||||
inkscape:cy="925.44687"
|
||||
inkscape:window-width="2736"
|
||||
inkscape:window-height="1744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<g
|
||||
transform="matrix(1 0 0 -1 0 1536)"
|
||||
id="g1">
|
||||
<path
|
||||
id="path1"
|
||||
d="M 495 1542 L 249 1305 L 249 1279 L 409 1279 L 555 1427 L 702 1279 L 863 1279 L 863 1304 L 615 1542 L 495 1542 z M 788.03711 1186.0098 L 788.03711 835.78516 L 884.67969 835.78516 L 884.67969 1186.0098 L 788.03711 1186.0098 z M 516.67773 1131.5391 C 398.97689 1123.6924 292.60787 1080.97 197.57227 1003.373 L 194.95703 1005.9883 C 242.90998 957.16439 266.88672 932.31576 266.88672 931.44336 C 344.48318 991.60208 427.7482 1025.1696 516.67773 1032.1445 L 516.67773 1131.5391 z M 121.71875 939.29102 L 127.9043 934.34375 L 125.64258 936.67578 L 121.71875 939.29102 z M 127.9043 934.34375 L 128.2207 934.01758 C 128.2327 934.03158 128.24581 934.04655 128.25781 934.06055 L 127.9043 934.34375 z M 128.2207 934.01758 C 48.031653 842.48234 2.2696687 736.12636 -9.0625 614.95508 L 90.332031 614.95508 C 101.6658 709.98868 137.41295 791.9452 197.57227 860.82227 C 197.57227 861.69465 187.54483 872.59321 167.49219 893.51758 L 128.2207 934.01758 z M 788.03711 733.82812 L 788.03711 383.60547 L 884.67969 383.60547 L 884.67969 733.82812 L 788.03711 733.82812 z M -9.0605469 518.17578 C -0.34667559 391.82351 42.335595 282.89216 118.98047 191.37695 C 123.06104 196.23725 144.50061 218.45468 189.72656 264.46094 C 132.18314 335.95327 99.052766 420.52478 90.333984 518.17578 L -9.0605469 518.17578 z M 118.98047 191.37695 C 118.49847 190.80285 115.08964 187.30078 115.18164 187.30078 L 119.10352 191.22461 C 119.06152 191.27461 119.02242 191.32665 118.98047 191.37695 z M 788.03711 281.64844 L 788.03711 -68.576172 L 884.67969 -68.576172 L 884.67969 281.64844 L 788.03711 281.64844 z M 259.04102 191.22461 L 189.72656 121.91016 C 287.37616 39.082839 396.36145 -6.2558235 516.67969 -14.103516 L 516.67969 85.291016 C 423.38876 95.754105 337.50938 131.06577 259.04102 191.22461 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
41
srcs/special_font/154.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
viewBox="-20 0 1168 2048"
|
||||
id="svg1"
|
||||
sodipodi:docname="54.combined.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.43113456"
|
||||
inkscape:cx="354.87761"
|
||||
inkscape:cy="635.53245"
|
||||
inkscape:window-width="2736"
|
||||
inkscape:window-height="1744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<g
|
||||
transform="matrix(1 0 0 -1 0 1536)"
|
||||
id="g1">
|
||||
<path
|
||||
id="path1"
|
||||
d="M 233 1545 L 230 1539 L 480 1279 L 638 1279 L 463 1545 L 233 1545 z M 788.03711 1185.8887 L 788.03711 835.66406 L 884.67969 835.66406 L 884.67969 1185.8887 L 788.03711 1185.8887 z M 516.67773 1131.418 C 398.97701 1123.5713 292.60777 1080.8489 197.57227 1003.252 L 194.95703 1005.8672 C 242.90993 957.04333 266.88672 932.19466 266.88672 931.32227 C 344.4831 991.48093 427.74829 1025.0485 516.67773 1032.0234 L 516.67773 1131.418 z M 121.71875 939.16992 L 127.9043 934.22266 L 125.64258 936.55469 L 121.71875 939.16992 z M 127.9043 934.22266 L 128.2207 933.89648 C 128.2327 933.91048 128.24581 933.92545 128.25781 933.93945 L 127.9043 934.22266 z M 128.2207 933.89648 C 48.031733 842.36134 2.2696587 736.00514 -9.0625 614.83398 L 90.332031 614.83398 C 101.66579 709.86749 137.41301 791.82417 197.57227 860.70117 C 197.57227 861.57355 187.54481 872.47214 167.49219 893.39648 L 128.2207 933.89648 z M 788.03711 733.70703 L 788.03711 383.48438 L 884.67969 383.48438 L 884.67969 733.70703 L 788.03711 733.70703 z M -9.0605469 518.05469 C -0.34668559 391.70251 42.335665 282.77107 118.98047 191.25586 C 123.06103 196.11615 144.50066 218.33369 189.72656 264.33984 C 132.1832 335.83217 99.052766 420.40379 90.333984 518.05469 L -9.0605469 518.05469 z M 118.98047 191.25586 C 118.49847 190.68176 115.08964 187.17969 115.18164 187.17969 L 119.10352 191.10352 C 119.06152 191.15352 119.02242 191.20556 118.98047 191.25586 z M 788.03711 281.52734 L 788.03711 -68.697266 L 884.67969 -68.697266 L 884.67969 281.52734 L 788.03711 281.52734 z M 259.04102 191.10352 L 189.72656 121.78906 C 287.37606 38.961745 396.36157 -6.3769172 516.67969 -14.224609 L 516.67969 85.169922 C 423.38885 95.633011 337.5093 130.94478 259.04102 191.10352 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |