mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2025-08-18 19:28:59 +02:00
Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
f0ebe45439 | ||
|
0ef36d52e1 | ||
|
08860eed17 | ||
|
b8bd3f7b0f | ||
|
60b01927ab | ||
|
9cfeb0f0c2 | ||
|
5e77fa84cf | ||
|
06fbc83c9c | ||
|
a123810247 | ||
|
906755b787 | ||
|
80c52460c7 | ||
|
2b978dd2e0 | ||
|
55cb5f5315 | ||
|
b7d1508d7b | ||
|
77b0c30728 | ||
|
466e0b8218 | ||
|
75fdc2bfa9 | ||
|
bee59aceaa | ||
|
92d50dd73f | ||
|
ba05b2770e | ||
|
44d1343b83 | ||
|
ca25cc55f6 | ||
|
68be82a4f9 |
Binary file not shown.
@@ -14,8 +14,8 @@ android {
|
|||||||
applicationId "juloo.keyboard2"
|
applicationId "juloo.keyboard2"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdkVersion 35
|
targetSdkVersion 35
|
||||||
versionCode 46
|
versionCode 47
|
||||||
versionName "1.30.3"
|
versionName "1.31.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
@@ -1,64 +1,74 @@
|
|||||||
# Key values
|
# Key values
|
||||||
|
|
||||||
A key value is the denomination of a key accepted in the "Add keys to the keyboard" option or for the `nw`, ..., `se` attributes in custom layouts (or `key0` ... `key8`).
|
A key value defines what a key on the keyboard does when pressed or swiped.
|
||||||
It can be:
|
|
||||||
|
|
||||||
- The name of a special key. An exhaustive list of the special keys follows.
|
Key values appear in the following places:
|
||||||
|
|
||||||
|
- In custom layouts, they are the value of: the `c` attribute, the compass-point attributes `nw` ... `se`, and the old-style `key0` ... `key8` attributes.
|
||||||
|
- Internally, they are used in the definition of the "Add keys to the keyboard" setting.
|
||||||
|
|
||||||
|
Key values can be any of the following:
|
||||||
|
|
||||||
|
- The name of a special key. A complete list of valid special keys follows.
|
||||||
|
|
||||||
- An arbitrary sequence of characters not containing `:`.
|
- An arbitrary sequence of characters not containing `:`.
|
||||||
This results in a key that writes the specified characters.
|
This results in a key that writes the specified characters.
|
||||||
|
|
||||||
- Using the syntax `symbol:key_def`.
|
- The syntax `legend:key_def`.
|
||||||
`symbol` is the symbol that appears on the keyboard, it cannot contain `:`.
|
`legend` is the visible legend on the keyboard. It cannot contain `:`.
|
||||||
`key_def` can be:
|
`key_def` can be:
|
||||||
+ The name of a special key, as listed below.
|
+ The name of a special key, as listed below.
|
||||||
+ `'Arbitrary string'` An arbitrary string that can contain `:`. `'` can be added to the string as `` \' ``.
|
+ `'string'` An arbitrary string that can contain `:`. `'` can be added to the string as `` \' ``.
|
||||||
+ `keyevent:keycode` An Android keycode. They are listed as `KEYCODE_...` in [KeyEvent](https://developer.android.com/reference/android/view/KeyEvent#summary).
|
+ `keyevent:keycode` An Android keycode. They are listed as `KEYCODE_...` in [KeyEvent](https://developer.android.com/reference/android/view/KeyEvent#summary).
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
+ `⏯:keyevent:85` A play/pause key (which probably doesn't do anything in most apps).
|
+ `⏯:keyevent:85` A play/pause key (which has no effect in most apps).
|
||||||
+ `my@:'my.email@domain.com'` An arbitrary string key
|
+ `my@:'my.email@domain.com'` A key that sends an arbitrary string
|
||||||
|
|
||||||
- A macro, `symbol:key_def1,key_def2,...`.
|
- A macro, `legend:key_def1,key_def2,...`.
|
||||||
This results in a key that behaves as if the sequence of `key_def` had been pressed in order.
|
This results in a key with legend `legend` that behaves as if the sequence of `key_def` had been pressed in order.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
+ `CA:ctrl,a,ctrl,c` The sequence `ctrl+a`, `ctrl+c`.
|
+ `CA:ctrl,a,ctrl,c` A key with legend CA that sends the sequence `ctrl+a`, `ctrl+c`.
|
||||||
+ `Cd:ctrl,backspace` The shortcut `ctrl+backspace`.
|
+ `Cd:ctrl,backspace` A key with legend Cd that sends the shortcut `ctrl+backspace`.
|
||||||
|
|
||||||
## Escape codes
|
### Escape codes
|
||||||
Value | Escape code for
|
|
||||||
|
When defining a key value, several characters have special effects. If you want a character not to have its usual effect but to be taken literally, you should "escape" it in the usual way for XML:
|
||||||
|
|
||||||
|
To get this character... | ...you can type
|
||||||
:---- | :------
|
:---- | :------
|
||||||
`\?` | `?`
|
A literal newline character, which is different from `enter` and `action` in certain apps. | `\n`
|
||||||
`\#` | `#`
|
A literal tab character, which is different from `tab` in certain apps. | `\t`
|
||||||
`\@` | `@`
|
`\` | `\\`
|
||||||
`\n` | Literal newline character. This is different from `enter` and `action` in certain apps.
|
`&` | `&`
|
||||||
`\t` | Literal tab character. This is different from `tab` in certain apps.
|
`<` | `<`
|
||||||
`\\` | `\`
|
`>` | `>`
|
||||||
|
`"` | `"`
|
||||||
|
|
||||||
XML escape codes also work, including:
|
The characters `?`, `#`, and `@` do not need to be escaped when writing custom layouts. Internally, they can be escaped by prepending backslash (by typing `\?`, `\#`, and `\@`).
|
||||||
|
|
||||||
Value | Escape code for
|
The characters `,` and `:` can be escaped in a key value, using single quotes. For example, this macro defines a key with legend `http` that sends a string containing `:`: `<key c="http:home,'https://'" />` For simplicity, `,` and `:` cannot be escaped in the key legend.
|
||||||
:------- | :------
|
|
||||||
`&` | `&`
|
|
||||||
`<` | `<`
|
|
||||||
`>` | `>`
|
|
||||||
`"` | `"`
|
|
||||||
|
|
||||||
## Modifiers
|
## Modifiers
|
||||||
System modifiers are sent to the app, which is free to do whatever they want in response.
|
System modifiers are sent to the app, which can take app-specific action.
|
||||||
The other modifiers only exist within the keyboard.
|
|
||||||
Value | Meaning
|
Value | Meaning
|
||||||
:---------- | :------
|
:---------- | :------
|
||||||
`shift` | System modifier.
|
`shift` | System modifier.
|
||||||
`ctrl` | System modifier.
|
`ctrl` | System modifier.
|
||||||
`alt` | System modifier.
|
`alt` | System modifier.
|
||||||
`meta` | System modifier. Equivalent to the Windows key.
|
`meta` | System modifier. Equivalent to the Windows key.
|
||||||
`fn` | Activates Fn mode, which assigns letters and symbols to special characters. e.g. `fn` `!` = `¡`
|
|
||||||
`compose` | Compose key. Enables composing characters using Linux-like shortcuts; e.g. `Compose` `A` `single quote` types `Á` (A with acute accent).
|
|
||||||
`capslock` | Actives and locks Shift
|
|
||||||
|
|
||||||
## Special keys
|
The other modifiers take effect only within the keyboard.
|
||||||
|
|
||||||
|
Value | Meaning
|
||||||
|
:---------- | :------
|
||||||
|
`fn` | Activates Fn mode, which assigns letters and symbols to special characters. Example: `fn` `!` = `¡`
|
||||||
|
`compose` | Compose key. Enables composing characters using Linux-like shortcuts. Example: `Compose` `A` `'` types `Á` (A with acute accent).
|
||||||
|
`capslock` | Activates and locks Shift.
|
||||||
|
|
||||||
|
## App function keys
|
||||||
These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys.
|
These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys.
|
||||||
|
|
||||||
`esc`, `enter`,
|
`esc`, `enter`,
|
||||||
@@ -74,6 +84,17 @@ These keys are sent to apps, which are free to ignore them. The keyboard does no
|
|||||||
`selectAll`, `pasteAsPlainText`,
|
`selectAll`, `pasteAsPlainText`,
|
||||||
`undo`, `redo`
|
`undo`, `redo`
|
||||||
|
|
||||||
|
## Keyboard editing actions
|
||||||
|
In contrast, these keys perform editing on the text without sending anything to the app.
|
||||||
|
Value | Meaning
|
||||||
|
:-------------------- | :------
|
||||||
|
`cursor_left` | Moves the cursor to the left with the slider gesture.
|
||||||
|
`cursor_right` | Moves the cursor to the right with the slider gesture.
|
||||||
|
`cursor_up` | Moves the cursor up with the slider gesture. Warning: this might make the cursor leave the text box.
|
||||||
|
`cursor_down` | Moves the cursor down with the slider gesture. Warning: this might make the cursor leave the text box.
|
||||||
|
`delete_word` | Delete the word to the left of the cursor.
|
||||||
|
`forward_delete_word` | Delete the word to the right of the cursor.
|
||||||
|
|
||||||
## Whitespace
|
## Whitespace
|
||||||
Value | Meaning
|
Value | Meaning
|
||||||
:------ | :------
|
:------ | :------
|
||||||
@@ -83,15 +104,6 @@ Value | Meaning
|
|||||||
`zwj` | Zero-width joiner.
|
`zwj` | Zero-width joiner.
|
||||||
`zwnj` | Zero-width non-joiner.
|
`zwnj` | Zero-width non-joiner.
|
||||||
|
|
||||||
## Keyboard editing actions
|
|
||||||
These keys perform editing on the text without sending keys that the app can interpret differently or ignore.
|
|
||||||
Value | Meaning
|
|
||||||
:----------------- | :------
|
|
||||||
`cursor_left` | Moves the cursor to the left with the slider gesture.
|
|
||||||
`cursor_right` | Moves the cursor to the right with the slider gesture.
|
|
||||||
`cursor_up` | Moves the cursor up with the slider gesture. Warning: this might make the cursor leave the text box.
|
|
||||||
`cursor_down` | Moves the cursor down with the slider gesture. Warning: this might make the cursor leave the text box.
|
|
||||||
|
|
||||||
## Other modifiers and diacritics
|
## Other modifiers and diacritics
|
||||||
Value | Meaning
|
Value | Meaning
|
||||||
:------------------- | :------
|
:------------------- | :------
|
||||||
|
6
fastlane/metadata/android/en-US/changelogs/47.txt
Normal file
6
fastlane/metadata/android/en-US/changelogs/47.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Delete a word with a circle gesture on the delete key.
|
||||||
|
Compose key can be unselected.
|
||||||
|
Improved space bar slider and added selection mode.
|
||||||
|
Lock shift with a circle gesture.
|
||||||
|
Improvements to layouts.
|
||||||
|
Various bug fixes and improvements to themes.
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Klávesnice Unexpected</string>
|
<string name="app_name_release">Klávesnice Unexpected</string>
|
||||||
<string name="app_name_debug">Klávesnice Unexpected (pro ladění)</string>
|
<string name="app_name_debug">Klávesnice Unexpected (pro ladění)</string>
|
||||||
<string name="short_description">Nenáročná virtuální klávesnice pro vývojáře.</string>
|
<string name="short_description">Nenáročná virtuální klávesnice pro vývojáře.</string>
|
||||||
<string name="store_description">"Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.
|
<string name="store_description">Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.\n\nTato aplikace byla původně navržena pro programátory používající Termux.\nNyní je ideální pro každodenní použití.\n\nTato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source.</string>
|
||||||
|
|
||||||
Tato aplikace byla původně navržena pro programátory používající Termux.
|
|
||||||
Nyní je ideální pro každodenní použití.
|
|
||||||
|
|
||||||
Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source."</string>
|
|
||||||
<string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
|
<string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
|
||||||
<string name="pref_portrait">V režimu na výšku</string>
|
<string name="pref_portrait">V režimu na výšku</string>
|
||||||
<string name="pref_landscape">V režimu na šířku</string>
|
<string name="pref_landscape">V režimu na šířku</string>
|
||||||
@@ -127,8 +122,12 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
|
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
|
||||||
<string name="clipboard_pin_heading">Připnout</string>
|
<string name="clipboard_pin_heading">Připnout</string>
|
||||||
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
|
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
|
||||||
<string name="clipboard_remove_confirmed">Ano</string>
|
<string name="clipboard_remove_confirmed">Ano</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||||
<string name="short_description">Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android.</string>
|
<string name="short_description">Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android.</string>
|
||||||
<string name="store_description">"Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.
|
<string name="store_description">Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.\n\nDie Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.\nMittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.\n\nDiese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen.</string>
|
||||||
|
|
||||||
Die Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.
|
|
||||||
Mittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.
|
|
||||||
|
|
||||||
Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
|
<string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
|
||||||
<string name="pref_portrait">Im Hochformatmodus</string>
|
<string name="pref_portrait">Im Hochformatmodus</string>
|
||||||
<string name="pref_landscape">Im Querformatmodus</string>
|
<string name="pref_landscape">Im Querformatmodus</string>
|
||||||
@@ -127,8 +122,12 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
|
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
|
||||||
<string name="clipboard_pin_heading">Angeheftet</string>
|
<string name="clipboard_pin_heading">Angeheftet</string>
|
||||||
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
|
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
|
||||||
<string name="clipboard_remove_confirmed">Ja</string>
|
<string name="clipboard_remove_confirmed">Ja</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">Un teclado virtual ligero para Android consciente de su privacidad.</string>
|
<string name="short_description">Un teclado virtual ligero para Android consciente de su privacidad.</string>
|
||||||
<string name="store_description">"La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.
|
<string name="store_description">La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.\n\nEsta aplicación fue originalmente diseñada para programadores que usaran Termux.\nAhora es perfecta para uso cotidiano.\n\nLa misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta.</string>
|
||||||
|
|
||||||
Esta aplicación fue originalmente diseñada para programadores que usaran Termux.
|
|
||||||
Ahora es perfecta para uso cotidiano.
|
|
||||||
|
|
||||||
La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta."</string>
|
|
||||||
<string name="settings_activity_label">Ajustes de Unexpected Keyboard</string>
|
<string name="settings_activity_label">Ajustes de Unexpected Keyboard</string>
|
||||||
<string name="pref_portrait">En modo vertical</string>
|
<string name="pref_portrait">En modo vertical</string>
|
||||||
<string name="pref_landscape">En modo horizontal</string>
|
<string name="pref_landscape">En modo horizontal</string>
|
||||||
@@ -127,8 +122,12 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Textos recién copiados</string>
|
<string name="clipboard_history_heading">Textos recién copiados</string>
|
||||||
<string name="clipboard_pin_heading">Pegado</string>
|
<string name="clipboard_pin_heading">Pegado</string>
|
||||||
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
|
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
|
||||||
<string name="clipboard_remove_confirmed">Sí</string>
|
<string name="clipboard_remove_confirmed">Sí</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">صفحه کلید غیرمنتظره</string>
|
<string name="app_name_release">صفحه کلید غیرمنتظره</string>
|
||||||
<string name="app_name_debug">صفحه کلید غیرمنتظره</string>
|
<string name="app_name_debug">صفحه کلید غیرمنتظره</string>
|
||||||
<!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> -->
|
<!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</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">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> -->
|
||||||
|
|
||||||
This application was originally designed for programmers using Termux.
|
|
||||||
Now perfect for everyday use.
|
|
||||||
|
|
||||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
|
||||||
<string name="settings_activity_label">تنظیمات صفحه کلید غیرمنتظره</string>
|
<string name="settings_activity_label">تنظیمات صفحه کلید غیرمنتظره</string>
|
||||||
<string name="pref_portrait">در حالت عمودی</string>
|
<string name="pref_portrait">در حالت عمودی</string>
|
||||||
<string name="pref_landscape">در حالت افقی</string>
|
<string name="pref_landscape">در حالت افقی</string>
|
||||||
@@ -127,8 +122,12 @@ This application contains no ads, doesn't make any network requests and is Open
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">Clavier virtuel léger et respectueux de la vie privée pour Android.</string>
|
<string name="short_description">Clavier virtuel léger et respectueux de la vie privée pour Android.</string>
|
||||||
<string name="store_description">"La fonctionnalité principale est l'accès rapide à plus de caractères en balayant les touches vers les coins.
|
<string name="store_description">La fonctionnalité principale est l\'accès rapide à plus de caractères en balayant les touches vers les coins.\n\nCette application a été conçue à l\'origine pour les programmeurs utilisant Termux.\nElle est maintenant parfaite pour une utilisation quotidienne.\n\nCette application ne contient pas de publicité, n\'accède pas au réseau et est Open Source.</string>
|
||||||
|
|
||||||
Cette application a été conçue à l'origine pour les programmeurs utilisant Termux.
|
|
||||||
Elle est maintenant parfaite pour une utilisation quotidienne.
|
|
||||||
|
|
||||||
Cette application ne contient pas de publicité, n'accède pas au réseau et est Open Source."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard Paramètres</string>
|
<string name="settings_activity_label">Unexpected Keyboard Paramètres</string>
|
||||||
<string name="pref_portrait">En mode portrait</string>
|
<string name="pref_portrait">En mode portrait</string>
|
||||||
<string name="pref_landscape">En mode landscape</string>
|
<string name="pref_landscape">En mode landscape</string>
|
||||||
@@ -66,12 +61,12 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
|||||||
<string name="pref_theme_e_altblack">Noir 2</string>
|
<string name="pref_theme_e_altblack">Noir 2</string>
|
||||||
<string name="pref_theme_e_white">Blanc</string>
|
<string name="pref_theme_e_white">Blanc</string>
|
||||||
<string name="pref_theme_e_epaper">ePaper</string>
|
<string name="pref_theme_e_epaper">ePaper</string>
|
||||||
<string name="pref_theme_e_desert">Desert</string>
|
<string name="pref_theme_e_desert">Désert</string>
|
||||||
<string name="pref_theme_e_jungle">Jungle</string>
|
<string name="pref_theme_e_jungle">Jungle</string>
|
||||||
<string name="pref_theme_e_monet">Monet (Système)</string>
|
<string name="pref_theme_e_monet">Monet (Système)</string>
|
||||||
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
|
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
|
||||||
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
|
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
|
||||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</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_very_short">Très courte</string>
|
||||||
<string name="pref_swipe_dist_e_short">Courte</string>
|
<string name="pref_swipe_dist_e_short">Courte</string>
|
||||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||||
@@ -88,7 +83,7 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
|||||||
<string name="pref_circle_sensitivity_e_low">Basse</string>
|
<string name="pref_circle_sensitivity_e_low">Basse</string>
|
||||||
<string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
|
<string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
|
||||||
<string name="key_action_next">Suiv.</string>
|
<string name="key_action_next">Suiv.</string>
|
||||||
<string name="key_action_done">Fin</string>
|
<string name="key_action_done">Fini</string>
|
||||||
<string name="key_action_go">Aller</string>
|
<string name="key_action_go">Aller</string>
|
||||||
<string name="key_action_prev">Prec.</string>
|
<string name="key_action_prev">Prec.</string>
|
||||||
<string name="key_action_search">Chercher</string>
|
<string name="key_action_search">Chercher</string>
|
||||||
@@ -97,10 +92,10 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
|||||||
<string name="launcher_button_imepicker">Selectionner le keyboard</string>
|
<string name="launcher_button_imepicker">Selectionner le keyboard</string>
|
||||||
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
|
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
|
||||||
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
|
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
|
||||||
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
|
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici :</string>
|
||||||
<string name="launcher_tryhere_hint">Essayer ici</string>
|
<string name="launcher_tryhere_hint">Essayer ici</string>
|
||||||
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
||||||
<string name="key_descr_compose">Compose</string>
|
<string name="key_descr_compose">Composition</string>
|
||||||
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
||||||
<string name="key_descr_change_method">Changer de clavier</string>
|
<string name="key_descr_change_method">Changer de clavier</string>
|
||||||
<string name="key_descr_voice_typing">Saisie vocale</string>
|
<string name="key_descr_voice_typing">Saisie vocale</string>
|
||||||
@@ -110,8 +105,8 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
|||||||
<string name="key_descr_selectAll">Sel. tout</string>
|
<string name="key_descr_selectAll">Sel. tout</string>
|
||||||
<string name="key_descr_shareText">Partager</string>
|
<string name="key_descr_shareText">Partager</string>
|
||||||
<string name="key_descr_pasteAsPlainText">Copier en texte brut</string>
|
<string name="key_descr_pasteAsPlainText">Copier en texte brut</string>
|
||||||
<string name="key_descr_undo">Undo</string>
|
<string name="key_descr_undo">Annuler</string>
|
||||||
<string name="key_descr_redo">Redo</string>
|
<string name="key_descr_redo">Refaire</string>
|
||||||
<string name="key_descr_ª">Ordinal</string>
|
<string name="key_descr_ª">Ordinal</string>
|
||||||
<string name="key_descr_º">Ordinal</string>
|
<string name="key_descr_º">Ordinal</string>
|
||||||
<string name="key_descr_superscript">Exposant</string>
|
<string name="key_descr_superscript">Exposant</string>
|
||||||
@@ -121,14 +116,18 @@ 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_home">Début</string>
|
||||||
<string name="key_descr_end">Fin</string>
|
<string name="key_descr_end">Fin</string>
|
||||||
<string name="key_descr_clipboard">Presse-papiers</string>
|
<string name="key_descr_clipboard">Presse-papiers</string>
|
||||||
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
|
<string name="key_descr_combining">Diacritique combinant</string>
|
||||||
<!-- <string name="key_descr_dead_key">Dead key</string> -->
|
<string name="key_descr_dead_key">Touche morte</string>
|
||||||
<!-- <string name="key_descr_zwj">Zero width joiner</string> -->
|
<string name="key_descr_zwj">Liant sans chasse</string>
|
||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<string name="key_descr_zwnj">Antiliant sans chasse</string>
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<string name="key_descr_nbsp">Espace insécable</string>
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<string name="key_descr_nnbsp">Espace fine insécable</string>
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Texte récemment copié</string>
|
<string name="clipboard_history_heading">Texte récemment copié</string>
|
||||||
<string name="clipboard_pin_heading">Épinglé</string>
|
<string name="clipboard_pin_heading">Épinglé</string>
|
||||||
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
|
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
|
||||||
<string name="clipboard_remove_confirmed">Oui</string>
|
<string name="clipboard_remove_confirmed">Oui</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</string>
|
<string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</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">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> -->
|
||||||
|
|
||||||
This application was originally designed for programmers using Termux.
|
|
||||||
Now perfect for everyday use.
|
|
||||||
|
|
||||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
|
||||||
<string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
|
<string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
|
||||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||||
@@ -127,8 +122,12 @@ This application contains no ads, doesn't make any network requests and is Open
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,13 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||||
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
|
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
|
||||||
<string name="store_description">"このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
|
<string name="store_description">このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。\n\nこのアプリは元々はTermuxでのプログラミング用に設計されました。\nしかし、今では普段の入力にも適しています。\nPCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。\n\nこのアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。</string>
|
||||||
|
|
||||||
このアプリは元々はTermuxでのプログラミング用に設計されました。
|
|
||||||
しかし、今では普段の入力にも適しています。
|
|
||||||
PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
|
|
||||||
|
|
||||||
このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。"</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboardの設定</string>
|
<string name="settings_activity_label">Unexpected Keyboardの設定</string>
|
||||||
<string name="pref_portrait">縦向き</string>
|
<string name="pref_portrait">縦向き</string>
|
||||||
<string name="pref_landscape">横向き</string>
|
<string name="pref_landscape">横向き</string>
|
||||||
@@ -128,8 +122,12 @@ PCキーボードでの半角入力を再現しています。日本語入力、
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
|
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
|
||||||
<string name="clipboard_pin_heading">お気に入り</string>
|
<string name="clipboard_pin_heading">お気に入り</string>
|
||||||
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
|
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
|
||||||
<string name="clipboard_remove_confirmed">はい</string>
|
<string name="clipboard_remove_confirmed">はい</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
|
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
|
||||||
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
|
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
|
||||||
<string name="store_description">"주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
|
<string name="store_description">주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.\n\n이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.\n지금은 일상적인 용도로도 완벽합니다.\n\n이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.</string>
|
||||||
|
|
||||||
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
|
|
||||||
지금은 일상적인 용도로도 완벽합니다.
|
|
||||||
|
|
||||||
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
|
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
|
||||||
<string name="pref_portrait">세로 화면</string>
|
<string name="pref_portrait">세로 화면</string>
|
||||||
<string name="pref_landscape">가로 화면</string>
|
<string name="pref_landscape">가로 화면</string>
|
||||||
@@ -127,8 +122,12 @@
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
|
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
|
||||||
<string name="clipboard_pin_heading">고정</string>
|
<string name="clipboard_pin_heading">고정</string>
|
||||||
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
|
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
|
||||||
<string name="clipboard_remove_confirmed">예</string>
|
<string name="clipboard_remove_confirmed">예</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string>
|
<string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string>
|
||||||
<string name="short_description">Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.</string>
|
<string name="short_description">Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.</string>
|
||||||
<string name="store_description">"Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.
|
<string name="store_description">Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.\n\nŠī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.\nTagad lieliski piemērota izmantošanai ikdienā.\n\nŠī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem.</string>
|
||||||
|
|
||||||
Šī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.
|
|
||||||
Tagad lieliski piemērota izmantošanai ikdienā.
|
|
||||||
|
|
||||||
Šī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
|
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
|
||||||
<string name="pref_portrait">Stateniski</string>
|
<string name="pref_portrait">Stateniski</string>
|
||||||
<string name="pref_landscape">Guleniski</string>
|
<string name="pref_landscape">Guleniski</string>
|
||||||
@@ -95,10 +90,8 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
|||||||
<string name="key_action_send">Sūtīt</string>
|
<string name="key_action_send">Sūtīt</string>
|
||||||
<string name="launcher_button_imesettings">Iespējot tastatūru</string>
|
<string name="launcher_button_imesettings">Iespējot tastatūru</string>
|
||||||
<string name="launcher_button_imepicker">Izvēlēties tastatūru</string>
|
<string name="launcher_button_imepicker">Izvēlēties tastatūru</string>
|
||||||
<string name="launcher_description">Šī lietotne ir virtuālā tastatūra.
|
<string name="launcher_description">Šī lietotne ir virtuālā tastatūra. Ar zemāk esošo pogu var atvērt sistēmas iestatījumus un iespējot Unexpected Keyboard.</string>
|
||||||
Ar zemāk esošo pogu var atvērt sistēmas iestatījumus un iespējot Unexpected Keyboard.</string>
|
<string name="launcher_sourcecode">Šī ir bezmaksas un atvērtā pirmkoda lietotne. GitHub var atrast pirmkodu un ziņot par nepilnībām.</string>
|
||||||
<string name="launcher_sourcecode">Šī ir bezmaksas un atvērtā pirmkoda lietotne.
|
|
||||||
GitHub var atrast pirmkodu un ziņot par nepilnībām.</string>
|
|
||||||
<string name="launcher_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string>
|
<string name="launcher_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string>
|
||||||
<string name="launcher_tryhere_hint">Izmēģināt šeit</string>
|
<string name="launcher_tryhere_hint">Izmēģināt šeit</string>
|
||||||
<string name="key_descr_capslock">Burtslēgs</string>
|
<string name="key_descr_capslock">Burtslēgs</string>
|
||||||
@@ -129,8 +122,12 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
|
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
|
||||||
<string name="clipboard_pin_heading">Piesprausts</string>
|
<string name="clipboard_pin_heading">Piesprausts</string>
|
||||||
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
|
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
|
||||||
<string name="clipboard_remove_confirmed">Jā</string>
|
<string name="clipboard_remove_confirmed">Jā</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">Lekka i dbająca o prywatność klawiatura wirtualna dla Androida.</string>
|
<string name="short_description">Lekka i dbająca o prywatność klawiatura wirtualna dla Androida.</string>
|
||||||
<string name="store_description">"Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.
|
<string name="store_description">Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.\n\nTa aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.\nObecnie nadaje się doskonale do codziennego użytku.\n\nAplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie.</string>
|
||||||
|
|
||||||
Ta aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.
|
|
||||||
Obecnie nadaje się doskonale do codziennego użytku.
|
|
||||||
|
|
||||||
Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie."</string>
|
|
||||||
<string name="settings_activity_label">Ustawienia Unexpected Keyboard</string>
|
<string name="settings_activity_label">Ustawienia Unexpected Keyboard</string>
|
||||||
<string name="pref_portrait">W widoku pionowym</string>
|
<string name="pref_portrait">W widoku pionowym</string>
|
||||||
<string name="pref_landscape">W widoku poziomym</string>
|
<string name="pref_landscape">W widoku poziomym</string>
|
||||||
@@ -127,8 +122,12 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
|
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
|
||||||
<string name="clipboard_pin_heading">Przypięte</string>
|
<string name="clipboard_pin_heading">Przypięte</string>
|
||||||
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
|
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
|
||||||
<string name="clipboard_remove_confirmed">Tak</string>
|
<string name="clipboard_remove_confirmed">Tak</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Teclado Unexpected</string>
|
<string name="app_name_release">Teclado Unexpected</string>
|
||||||
<string name="app_name_debug">Teclado Unexpected</string>
|
<string name="app_name_debug">Teclado Unexpected</string>
|
||||||
<string name="short_description">Um teclado virtual leve para desenvolvedores.</string>
|
<string name="short_description">Um teclado virtual leve para desenvolvedores.</string>
|
||||||
<string name="store_description">"A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.
|
<string name="store_description">A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.\n\nO app foi criado originalmente para desenvolvedores que usam Termux.\nAgora aperfeiçoado para o uso diário.\n\nEste aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source.</string>
|
||||||
|
|
||||||
O app foi criado originalmente para desenvolvedores que usam Termux.
|
|
||||||
Agora aperfeiçoado para o uso diário.
|
|
||||||
|
|
||||||
Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source."</string>
|
|
||||||
<string name="settings_activity_label">Configurações</string>
|
<string name="settings_activity_label">Configurações</string>
|
||||||
<string name="pref_portrait">No modo retrato</string>
|
<string name="pref_portrait">No modo retrato</string>
|
||||||
<string name="pref_landscape">No modo paisagem</string>
|
<string name="pref_landscape">No modo paisagem</string>
|
||||||
@@ -127,8 +122,12 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Textos recém copiados</string>
|
<string name="clipboard_history_heading">Textos recém copiados</string>
|
||||||
<string name="clipboard_pin_heading">Fixados</string>
|
<string name="clipboard_pin_heading">Fixados</string>
|
||||||
<string name="clipboard_remove_confirm">Remover esta cópia?</string>
|
<string name="clipboard_remove_confirm">Remover esta cópia?</string>
|
||||||
<string name="clipboard_remove_confirmed">Sim</string>
|
<string name="clipboard_remove_confirmed">Sim</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Tastatură Unexpected (depanare)</string>
|
<string name="app_name_debug">Tastatură Unexpected (depanare)</string>
|
||||||
<string name="short_description">Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată.</string>
|
<string name="short_description">Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată.</string>
|
||||||
<string name="store_description">"Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.
|
<string name="store_description">Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.\n\nAceastă aplicație a fost concepută inițial pentru programatori care folosec Termux.\nEste perfectă pentru uzul cotidian.\n\nAceastă aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source.</string>
|
||||||
|
|
||||||
Această aplicație a fost concepută inițial pentru programatori care folosec Termux.
|
|
||||||
Este perfectă pentru uzul cotidian.
|
|
||||||
|
|
||||||
Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source."</string>
|
|
||||||
<string name="settings_activity_label">Setări Tastatură Unexpected</string>
|
<string name="settings_activity_label">Setări Tastatură Unexpected</string>
|
||||||
<string name="pref_portrait">În mod portret</string>
|
<string name="pref_portrait">În mod portret</string>
|
||||||
<string name="pref_landscape">În mod panoramă</string>
|
<string name="pref_landscape">În mod panoramă</string>
|
||||||
@@ -127,8 +122,12 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (отладка)</string>
|
<string name="app_name_debug">Unexpected Keyboard (отладка)</string>
|
||||||
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
|
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
|
||||||
<string name="store_description">"Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.
|
<string name="store_description">Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.</string>
|
||||||
|
|
||||||
Приложение изначально было разработано для использования с Termux.
|
|
||||||
На данный момент оно также удобно в повседневном использовании.
|
|
||||||
|
|
||||||
Приложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код."</string>
|
|
||||||
<string name="settings_activity_label">Настройки Unexpected Keyboard</string>
|
<string name="settings_activity_label">Настройки Unexpected Keyboard</string>
|
||||||
<string name="pref_portrait">В портретном режиме</string>
|
<string name="pref_portrait">В портретном режиме</string>
|
||||||
<string name="pref_landscape">В ландшафтном режиме</string>
|
<string name="pref_landscape">В ландшафтном режиме</string>
|
||||||
@@ -127,8 +122,12 @@
|
|||||||
<string name="key_descr_zwnj">Разделитель нулевой ширины</string>
|
<string name="key_descr_zwnj">Разделитель нулевой ширины</string>
|
||||||
<string name="key_descr_nbsp">Неразрывный пробел</string>
|
<string name="key_descr_nbsp">Неразрывный пробел</string>
|
||||||
<string name="key_descr_nnbsp">Узкий неразрывный пробел</string>
|
<string name="key_descr_nnbsp">Узкий неразрывный пробел</string>
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Недавно скопированный текст</string>
|
<string name="clipboard_history_heading">Недавно скопированный текст</string>
|
||||||
<string name="clipboard_pin_heading">Закреплено</string>
|
<string name="clipboard_pin_heading">Закреплено</string>
|
||||||
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
|
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
|
||||||
<string name="clipboard_remove_confirmed">Да</string>
|
<string name="clipboard_remove_confirmed">Да</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.</string>
|
<string name="short_description">Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.</string>
|
||||||
<string name="store_description">"Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.
|
<string name="store_description">Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.\n\nBu uygulama aslında Termux kullanıcıları için geliştirildi.\nArtık gündelik kullanım için de uygun.\n\nBu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz.</string>
|
||||||
|
|
||||||
Bu uygulama aslında Termux kullanıcıları için geliştirildi.
|
|
||||||
Artık gündelik kullanım için de uygun.
|
|
||||||
|
|
||||||
Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
|
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
|
||||||
<string name="pref_portrait">Portre modunda</string>
|
<string name="pref_portrait">Portre modunda</string>
|
||||||
<string name="pref_landscape">Manzara modunda</string>
|
<string name="pref_landscape">Manzara modunda</string>
|
||||||
@@ -127,8 +122,12 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Son kopyalanan metin</string>
|
<string name="clipboard_history_heading">Son kopyalanan metin</string>
|
||||||
<string name="clipboard_pin_heading">Sabitlendi</string>
|
<string name="clipboard_pin_heading">Sabitlendi</string>
|
||||||
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
|
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
|
||||||
<string name="clipboard_remove_confirmed">Evet</string>
|
<string name="clipboard_remove_confirmed">Evet</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (Налагодження)</string>
|
<string name="app_name_debug">Unexpected Keyboard (Налагодження)</string>
|
||||||
<string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string>
|
<string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string>
|
||||||
<string name="store_description">"Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.
|
<string name="store_description">Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.\n\nЦя програма спочатку була розроблена для програмістів, які використовують Termux.\nТепер ідеально підходить для щоденного використання.\n\nЦя програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код.</string>
|
||||||
|
|
||||||
Ця програма спочатку була розроблена для програмістів, які використовують Termux.
|
|
||||||
Тепер ідеально підходить для щоденного використання.
|
|
||||||
|
|
||||||
Ця програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard Налаштування</string>
|
<string name="settings_activity_label">Unexpected Keyboard Налаштування</string>
|
||||||
<string name="pref_portrait">У портретному режимі</string>
|
<string name="pref_portrait">У портретному режимі</string>
|
||||||
<string name="pref_landscape">У альбомному режимі</string>
|
<string name="pref_landscape">У альбомному режимі</string>
|
||||||
@@ -23,7 +18,7 @@
|
|||||||
<string name="pref_layouts_item">Макет %1$d: %2$s</string>
|
<string name="pref_layouts_item">Макет %1$d: %2$s</string>
|
||||||
<string name="pref_layouts_remove_custom">Видалити макет</string>
|
<string name="pref_layouts_remove_custom">Видалити макет</string>
|
||||||
<string name="pref_custom_layout_title">Власний макет</string>
|
<string name="pref_custom_layout_title">Власний макет</string>
|
||||||
<string name="pref_show_numpad_title">Показувати числову клавіатуру </string>
|
<string name="pref_show_numpad_title">Показувати числову клавіатуру</string>
|
||||||
<string name="pref_show_numpad_never">Ніколи</string>
|
<string name="pref_show_numpad_never">Ніколи</string>
|
||||||
<string name="pref_show_numpad_landscape">Тільки в альбомному режимі</string>
|
<string name="pref_show_numpad_landscape">Тільки в альбомному режимі</string>
|
||||||
<string name="pref_show_numpad_always">Завжди</string>
|
<string name="pref_show_numpad_always">Завжди</string>
|
||||||
@@ -71,7 +66,7 @@
|
|||||||
<string name="pref_theme_e_monet">Моне (Системна)</string>
|
<string name="pref_theme_e_monet">Моне (Системна)</string>
|
||||||
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
|
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
|
||||||
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
|
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
|
||||||
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
|
<string name="pref_theme_e_rosepine">Рожева сосна</string>
|
||||||
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
|
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
|
||||||
<string name="pref_swipe_dist_e_short">Коротка</string>
|
<string name="pref_swipe_dist_e_short">Коротка</string>
|
||||||
<string name="pref_swipe_dist_e_default">Звичайна</string>
|
<string name="pref_swipe_dist_e_default">Звичайна</string>
|
||||||
@@ -122,13 +117,17 @@
|
|||||||
<string name="key_descr_end">End</string>
|
<string name="key_descr_end">End</string>
|
||||||
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
|
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
|
||||||
<string name="key_descr_combining">Комбінування діакритики</string>
|
<string name="key_descr_combining">Комбінування діакритики</string>
|
||||||
<!-- <string name="key_descr_dead_key">Dead key</string> -->
|
<string name="key_descr_dead_key">Мертва клавіша</string>
|
||||||
<!-- <string name="key_descr_zwj">Zero width joiner</string> -->
|
<string name="key_descr_zwj">З\'єднувач нульової ширини</string>
|
||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<string name="key_descr_zwnj">Разділювач нульової ширини</string>
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<string name="key_descr_nbsp">Нерозривний пробіл</string>
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<string name="key_descr_nnbsp">Вузький нерозривний пробіл</string>
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
|
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
|
||||||
<string name="clipboard_pin_heading">Закріплено</string>
|
<string name="clipboard_pin_heading">Закріплено</string>
|
||||||
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
|
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
|
||||||
<string name="clipboard_remove_confirmed">Так</string>
|
<string name="clipboard_remove_confirmed">Так</string>
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (gỡ lỗi)</string>
|
<string name="app_name_debug">Unexpected Keyboard (gỡ lỗi)</string>
|
||||||
<string name="short_description">Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android.</string>
|
<string name="short_description">Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android.</string>
|
||||||
<string name="store_description">"Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.
|
<string name="store_description">Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.\n\nỨng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.\nBây giờ đã hoàn hảo cho việc sử dụng hàng ngày.\n\nỨng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở.</string>
|
||||||
|
|
||||||
Ứng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.
|
|
||||||
Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
|
||||||
|
|
||||||
Ứng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở."</string>
|
|
||||||
<string name="settings_activity_label">Cài đặt Unexpected Keyboard</string>
|
<string name="settings_activity_label">Cài đặt Unexpected Keyboard</string>
|
||||||
<string name="pref_portrait">Trong chế độ chân dung</string>
|
<string name="pref_portrait">Trong chế độ chân dung</string>
|
||||||
<string name="pref_landscape">Trong chế độ phong cảnh</string>
|
<string name="pref_landscape">Trong chế độ phong cảnh</string>
|
||||||
@@ -127,8 +122,12 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||||
<string name="short_description">适用于 Android 的轻量级、注重隐私的虚拟键盘。</string>
|
<string name="short_description">适用于 Android 的轻量级、注重隐私的虚拟键盘。</string>
|
||||||
<string name="store_description">"此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。
|
<string name="store_description">此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。\n\n此应用最初是为使用 Termux 的程序员而设计的。\n现在对于日常使用来说也很完美。\n\n此应用没有广告,不会发送任何网络请求,而且是开源的。</string>
|
||||||
|
|
||||||
此应用最初是为使用 Termux 的程序员而设计的。
|
|
||||||
现在对于日常使用来说也很完美。
|
|
||||||
|
|
||||||
此应用没有广告,不会发送任何网络请求,而且是开源的。"</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard 设置</string>
|
<string name="settings_activity_label">Unexpected Keyboard 设置</string>
|
||||||
<string name="pref_portrait">在竖屏模式下</string>
|
<string name="pref_portrait">在竖屏模式下</string>
|
||||||
<string name="pref_landscape">在横屏模式下</string>
|
<string name="pref_landscape">在横屏模式下</string>
|
||||||
@@ -127,8 +122,12 @@
|
|||||||
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
|
||||||
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
|
||||||
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
|
||||||
|
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
|
||||||
|
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
|
||||||
|
<!-- <string name="key_descr_gesture">Gesture</string> -->
|
||||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||||
|
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -41,7 +41,9 @@
|
|||||||
<item>latn_bepo_fr</item>
|
<item>latn_bepo_fr</item>
|
||||||
<item>latn_bone</item>
|
<item>latn_bone</item>
|
||||||
<item>latn_neo2</item>
|
<item>latn_neo2</item>
|
||||||
|
<item>latn_qwerty_apl</item>
|
||||||
<item>latn_qwerty_az</item>
|
<item>latn_qwerty_az</item>
|
||||||
|
<item>latn_qwerty_bqn</item>
|
||||||
<item>latn_qwerty_br</item>
|
<item>latn_qwerty_br</item>
|
||||||
<item>latn_qwerty_cy</item>
|
<item>latn_qwerty_cy</item>
|
||||||
<item>latn_qwerty_cz</item>
|
<item>latn_qwerty_cz</item>
|
||||||
@@ -122,7 +124,9 @@
|
|||||||
<item>BEPO (Français)</item>
|
<item>BEPO (Français)</item>
|
||||||
<item>Bone</item>
|
<item>Bone</item>
|
||||||
<item>Neo 2</item>
|
<item>Neo 2</item>
|
||||||
|
<item>QWERTY (APL)</item>
|
||||||
<item>QWERTY (Azərbaycanca)</item>
|
<item>QWERTY (Azərbaycanca)</item>
|
||||||
|
<item>QWERTY (BQN)</item>
|
||||||
<item>QWERTY (Brasileiro)</item>
|
<item>QWERTY (Brasileiro)</item>
|
||||||
<item>QWERTY (Welsh)</item>
|
<item>QWERTY (Welsh)</item>
|
||||||
<item>QWERTY (Czech)</item>
|
<item>QWERTY (Czech)</item>
|
||||||
@@ -203,7 +207,9 @@
|
|||||||
<item>@xml/latn_bepo_fr</item>
|
<item>@xml/latn_bepo_fr</item>
|
||||||
<item>@xml/latn_bone</item>
|
<item>@xml/latn_bone</item>
|
||||||
<item>@xml/latn_neo2</item>
|
<item>@xml/latn_neo2</item>
|
||||||
|
<item>@xml/latn_qwerty_apl</item>
|
||||||
<item>@xml/latn_qwerty_az</item>
|
<item>@xml/latn_qwerty_az</item>
|
||||||
|
<item>@xml/latn_qwerty_bqn</item>
|
||||||
<item>@xml/latn_qwerty_br</item>
|
<item>@xml/latn_qwerty_br</item>
|
||||||
<item>@xml/latn_qwerty_cy</item>
|
<item>@xml/latn_qwerty_cy</item>
|
||||||
<item>@xml/latn_qwerty_cz</item>
|
<item>@xml/latn_qwerty_cz</item>
|
||||||
|
@@ -3,12 +3,7 @@
|
|||||||
<string name="app_name_release">Unexpected Keyboard</string>
|
<string name="app_name_release">Unexpected Keyboard</string>
|
||||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||||
<string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string>
|
<string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</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">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string>
|
||||||
|
|
||||||
This application was originally designed for programmers using Termux.
|
|
||||||
Now perfect for everyday use.
|
|
||||||
|
|
||||||
This application contains no ads, doesn't make any network requests and is Open Source."</string>
|
|
||||||
<string name="settings_activity_label">Unexpected Keyboard Settings</string>
|
<string name="settings_activity_label">Unexpected Keyboard Settings</string>
|
||||||
<string name="pref_portrait">In portrait mode</string>
|
<string name="pref_portrait">In portrait mode</string>
|
||||||
<string name="pref_landscape">In landscape mode</string>
|
<string name="pref_landscape">In landscape mode</string>
|
||||||
@@ -127,8 +122,12 @@ This application contains no ads, doesn't make any network requests and is Open
|
|||||||
<string name="key_descr_zwnj">Zero width non-joiner</string>
|
<string name="key_descr_zwnj">Zero width non-joiner</string>
|
||||||
<string name="key_descr_nbsp">Non-breaking space</string>
|
<string name="key_descr_nbsp">Non-breaking space</string>
|
||||||
<string name="key_descr_nnbsp">Narrow non-breaking space</string>
|
<string name="key_descr_nnbsp">Narrow non-breaking space</string>
|
||||||
|
<string name="key_descr_delete_word">Delete a word</string>
|
||||||
|
<string name="key_descr_forward_delete_word">Delete a word on the right</string>
|
||||||
|
<string name="key_descr_gesture">Gesture</string>
|
||||||
<string name="clipboard_history_heading">Recently copied text</string>
|
<string name="clipboard_history_heading">Recently copied text</string>
|
||||||
<string name="clipboard_pin_heading">Pinned</string>
|
<string name="clipboard_pin_heading">Pinned</string>
|
||||||
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
|
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
|
||||||
<string name="clipboard_remove_confirmed">Yes</string>
|
<string name="clipboard_remove_confirmed">Yes</string>
|
||||||
|
<string name="toast_no_voice_input">No voice typing app installed</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -181,27 +181,27 @@
|
|||||||
</style>
|
</style>
|
||||||
<style name="MonetLight" parent="@style/BaseTheme">
|
<style name="MonetLight" parent="@style/BaseTheme">
|
||||||
<item name="android:isLightTheme">true</item>
|
<item name="android:isLightTheme">true</item>
|
||||||
<item name="colorKeyboard">@android:color/system_accent1_100</item>
|
<item name="colorKeyboard">@android:color/system_neutral1_100</item>
|
||||||
<item name="colorKey">@android:color/system_accent1_0</item>
|
<item name="colorKey">@android:color/system_neutral1_50</item>
|
||||||
<item name="colorKeyActivated">@android:color/system_accent1_300</item>
|
<item name="colorKeyActivated">?colorKeyboard</item>
|
||||||
<item name="colorLabel">@android:color/system_accent1_1000</item>
|
<item name="colorLabel">@android:color/system_neutral1_800</item>
|
||||||
<item name="colorLabelActivated">@android:color/system_accent1_1000</item>
|
<item name="colorLabelActivated">@android:color/system_accent1_400</item>
|
||||||
<item name="colorLabelLocked">@android:color/system_accent1_500</item>
|
<item name="colorLabelLocked">@android:color/system_accent1_600</item>
|
||||||
<item name="colorSubLabel">@android:color/system_accent1_900</item>
|
<item name="colorSubLabel">@android:color/system_neutral1_500</item>
|
||||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||||
<item name="emoji_color">@android:color/system_accent1_1000</item>
|
<item name="emoji_color">?colorKeyboard</item>
|
||||||
</style>
|
</style>
|
||||||
<style name="MonetDark" parent="@style/BaseTheme">
|
<style name="MonetDark" parent="@style/BaseTheme">
|
||||||
<item name="android:isLightTheme">false</item>
|
<item name="android:isLightTheme">false</item>
|
||||||
<item name="colorKeyboard">@android:color/system_neutral1_900</item>
|
<item name="colorKeyboard">@android:color/system_neutral1_900</item>
|
||||||
<item name="colorKey">@android:color/system_accent2_800</item>
|
<item name="colorKey">@android:color/system_neutral1_800</item>
|
||||||
<item name="colorKeyActivated">@android:color/system_accent1_800</item>
|
<item name="colorKeyActivated">?colorKeyboard</item>
|
||||||
<item name="colorLabel">@android:color/system_neutral1_0</item>
|
<item name="colorLabel">@android:color/system_neutral1_0</item>
|
||||||
<item name="colorLabelActivated">@android:color/system_accent1_400</item>
|
<item name="colorLabelActivated">@android:color/system_accent1_400</item>
|
||||||
<item name="colorLabelLocked">@android:color/system_accent1_100</item>
|
<item name="colorLabelLocked">@android:color/system_accent1_600</item>
|
||||||
<item name="colorSubLabel">@android:color/system_neutral1_300</item>
|
<item name="colorSubLabel">@android:color/system_neutral1_400</item>
|
||||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||||
<item name="emoji_color">@android:color/system_neutral1_900</item>
|
<item name="emoji_color">?colorKeyboard</item>
|
||||||
</style>
|
</style>
|
||||||
<style name="RosePine" parent="BaseTheme">
|
<style name="RosePine" parent="BaseTheme">
|
||||||
<item name="android:isLightTheme">false</item>
|
<item name="android:isLightTheme">false</item>
|
||||||
|
@@ -88,6 +88,16 @@
|
|||||||
"⊃": "⊇",
|
"⊃": "⊇",
|
||||||
"±": "∓",
|
"±": "∓",
|
||||||
|
|
||||||
|
// APL
|
||||||
|
"⍺": "⍶",
|
||||||
|
"⍵": "⍹",
|
||||||
|
"⋄": "⌺",
|
||||||
|
"⍝": "⍧",
|
||||||
|
"∆": "⍙",
|
||||||
|
"∇": "⍢",
|
||||||
|
"⊤": "⍡",
|
||||||
|
"⎕": "⍞",
|
||||||
|
|
||||||
// hebrew niqqud
|
// hebrew niqqud
|
||||||
"ק": "qamats", // kamatz
|
"ק": "qamats", // kamatz
|
||||||
"ר": "hataf_qamats", // reduced kamatz
|
"ר": "hataf_qamats", // reduced kamatz
|
||||||
|
@@ -125,5 +125,14 @@
|
|||||||
"ॢ": "ॣ",
|
"ॢ": "ॣ",
|
||||||
"॒": "॑",
|
"॒": "॑",
|
||||||
"ॅ": "ॲ",
|
"ॅ": "ॲ",
|
||||||
"ॉ": "ऑ"
|
"ॉ": "ऑ",
|
||||||
|
|
||||||
|
// Mathematical symbols
|
||||||
|
"\uD835": {
|
||||||
|
"\uDD68": "𝕎", // 𝕨 → 𝕎
|
||||||
|
"\uDD69": "𝕏", // 𝕩 → 𝕏
|
||||||
|
"\uDD57": "𝔽", // 𝕗 → 𝔽
|
||||||
|
"\uDD58": "𝔾", // 𝕘 → 𝔾
|
||||||
|
"\uDD64": "𝕊" // 𝕤 → 𝕊
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package juloo.keyboard2;
|
package juloo.keyboard2;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.inputmethod.EditorInfo;
|
import android.view.inputmethod.EditorInfo;
|
||||||
@@ -27,9 +26,9 @@ public final class Autocapitalisation
|
|||||||
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES |
|
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES |
|
||||||
InputType.TYPE_TEXT_FLAG_CAP_WORDS;
|
InputType.TYPE_TEXT_FLAG_CAP_WORDS;
|
||||||
|
|
||||||
public Autocapitalisation(Looper looper, Callback cb)
|
public Autocapitalisation(Handler h, Callback cb)
|
||||||
{
|
{
|
||||||
_handler = new Handler(looper);
|
_handler = h;
|
||||||
_callback = cb;
|
_callback = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,31 +4,22 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
public final class ComposeKey
|
public final class ComposeKey
|
||||||
{
|
{
|
||||||
/** Apply the pending compose sequence to [kv]. */
|
/** Apply the pending compose sequence to [kv]. Returns [null] if no sequence
|
||||||
|
matched. */
|
||||||
public static KeyValue apply(int state, KeyValue kv)
|
public static KeyValue apply(int state, KeyValue kv)
|
||||||
{
|
{
|
||||||
switch (kv.getKind())
|
switch (kv.getKind())
|
||||||
{
|
{
|
||||||
case Char:
|
case Char:
|
||||||
KeyValue res = apply(state, kv.getChar());
|
return apply(state, kv.getChar());
|
||||||
// Grey-out characters not part of any sequence.
|
case String:
|
||||||
if (res == null)
|
return apply(state, kv.getString());
|
||||||
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
|
||||||
return res;
|
|
||||||
/* Tapping compose again exits the pending sequence. */
|
|
||||||
case Compose_pending:
|
|
||||||
return KeyValue.getKeyByName("compose_cancel");
|
|
||||||
/* These keys are not greyed. */
|
|
||||||
case Event:
|
|
||||||
case Modifier:
|
|
||||||
return kv;
|
|
||||||
/* Other keys cannot be part of sequences. */
|
|
||||||
default:
|
|
||||||
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Apply the pending compose sequence to char [c]. */
|
/** Apply the pending compose sequence to char [c]. Returns [null] if no
|
||||||
|
sequence matched. */
|
||||||
public static KeyValue apply(int prev, char c)
|
public static KeyValue apply(int prev, char c)
|
||||||
{
|
{
|
||||||
char[] states = ComposeKeyData.states;
|
char[] states = ComposeKeyData.states;
|
||||||
@@ -51,6 +42,25 @@ public final class ComposeKey
|
|||||||
return KeyValue.makeCharKey((char)next_header);
|
return KeyValue.makeCharKey((char)next_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Apply each char of a string to a sequence. Returns [null] if no sequence
|
||||||
|
matched. */
|
||||||
|
public static KeyValue apply(int prev, String s)
|
||||||
|
{
|
||||||
|
final int len = s.length();
|
||||||
|
int i = 0;
|
||||||
|
if (len == 0) return null;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
KeyValue k = apply(prev, s.charAt(i));
|
||||||
|
i++;
|
||||||
|
if (k == null) return null;
|
||||||
|
if (i >= len) return k;
|
||||||
|
if (k.getKind() != KeyValue.Kind.Compose_pending)
|
||||||
|
return null; // Found a final state before the end of [s].
|
||||||
|
prev = k.getPendingCompose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** The state machine is comprised of two arrays.
|
/** The state machine is comprised of two arrays.
|
||||||
|
|
||||||
The [states] array represents the different states and the associated
|
The [states] array represents the different states and the associated
|
||||||
|
@@ -111,16 +111,16 @@ public final class ComposeKeyData
|
|||||||
"|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abcehlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0435" +
|
"|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abcehlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0435" +
|
||||||
"\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0456\u0458\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062b\u062d\u0631\u0632\u0633\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0646\u0647\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668" +
|
"\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0456\u0458\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062b\u062d\u0631\u0632\u0633\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0646\u0647\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668" +
|
||||||
"\u0669\u06a1\u06a9\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92" +
|
"\u0669\u06a1\u06a9\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92" +
|
||||||
"\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22b7\ua649\ua651\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4" +
|
"\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22a4\u22b7\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066" +
|
||||||
"\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\u0465\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u044c\uFFFF\ua651\u044a\u0454\u0438\uFFFF\ua66f\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062" +
|
"\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\u0465\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u044c\uFFFF\ua651\u044a\u0454\u0438\uFFFF\ua66f\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068" +
|
||||||
"\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e" +
|
"\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073" +
|
||||||
"\u06c1\u0698\u0640\u0636\u0638\u0621\u06a4\u063a\u06a9\u06ba\u06be\u06cc\u0643\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957" +
|
"\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e\u06c1\u0698\u0640\u0636\u0638\u0621\u06a4\u063a\u06a9\u06ba\u06be\u06cc\u0643\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b" +
|
||||||
"\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u0483\u00000123456789\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u000001" +
|
"\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u0483\u00000123456789\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a" +
|
||||||
"23456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u00000123456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0" +
|
"\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u00000123456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0000012" +
|
||||||
"\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87" +
|
"3456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943" +
|
||||||
"\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\uFFFF\u004a" +
|
"\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514" +
|
||||||
"\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2" +
|
"\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37" +
|
||||||
"\uFFFF\ua7f3\u1d23\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c").toCharArray();
|
"\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\u1d23\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835\udd4a\uFFFF\ud835\udd4e\uFFFF\ud835\udd4f").toCharArray();
|
||||||
|
|
||||||
public static final char[] edges =
|
public static final char[] edges =
|
||||||
("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||||
@@ -226,19 +226,19 @@ public final class ComposeKeyData
|
|||||||
"\u1c22\u0001\u0001\u0003\u1387\u1c26\u0001\u0003\u0cab\u1c2a\u0001\u0003\u1388\u1c2e\u0001\u0003\u0cac\u1c32\u0001\u0002\u1c35\u0001\u0004\u111c\u1389\u1c3a\u0001\u0005\u138a\u1407\u04f5\u1c40\u0001\u0002\u1c43\u0001\u0002\u111d\u0002\u1c48\u0001\u0008\u111e\u04e4\u1c51\u1c52\u1c53\u1c54\u1c55\u0001\u0001\u0001\u0001\u0001\u0002\u1c58\u0001\u0002\u1c5b\u0001\u0004\u1408\u0de1\u1c60\u0001\u0004\u1409\u0de1\u1c65\u0001\u0002\u1c51" +
|
"\u1c22\u0001\u0001\u0003\u1387\u1c26\u0001\u0003\u0cab\u1c2a\u0001\u0003\u1388\u1c2e\u0001\u0003\u0cac\u1c32\u0001\u0002\u1c35\u0001\u0004\u111c\u1389\u1c3a\u0001\u0005\u138a\u1407\u04f5\u1c40\u0001\u0002\u1c43\u0001\u0002\u111d\u0002\u1c48\u0001\u0008\u111e\u04e4\u1c51\u1c52\u1c53\u1c54\u1c55\u0001\u0001\u0001\u0001\u0001\u0002\u1c58\u0001\u0002\u1c5b\u0001\u0004\u1408\u0de1\u1c60\u0001\u0004\u1409\u0de1\u1c65\u0001\u0002\u1c51" +
|
||||||
"\u0002\u138b\u0002\u1c6c\u0001\u0002\u1c6f\u0001\u0002\u1c72\u0001\u0002\u1c75\u0001\u0003\u111f\u1c79\u0001\u0002\u111f\u0002\u1c7e\u0001\u0002\u1c81\u0001\u0002\u1c84\u0001\u0002\u1c87\u0001\u0002\u1c8a\u0001\u0002\u1c8d\u0001\u0002\u1c90\u0001\u0002\u1c93\u0001\u0002\u1c96\u0001\u0002\u1c99\u0001\u0004\u1c9e\u1120\u138c\u0001\u0003\u1ca2\u1121\u0001\u0002\u1ca5\u0001\u0002\u1ca8\u0001\u0002\u1cab\u0001\u0002\u1cae\u0001\u0002" +
|
"\u0002\u138b\u0002\u1c6c\u0001\u0002\u1c6f\u0001\u0002\u1c72\u0001\u0002\u1c75\u0001\u0003\u111f\u1c79\u0001\u0002\u111f\u0002\u1c7e\u0001\u0002\u1c81\u0001\u0002\u1c84\u0001\u0002\u1c87\u0001\u0002\u1c8a\u0001\u0002\u1c8d\u0001\u0002\u1c90\u0001\u0002\u1c93\u0001\u0002\u1c96\u0001\u0002\u1c99\u0001\u0004\u1c9e\u1120\u138c\u0001\u0003\u1ca2\u1121\u0001\u0002\u1ca5\u0001\u0002\u1ca8\u0001\u0002\u1cab\u0001\u0002\u1cae\u0001\u0002" +
|
||||||
"\u1cb1\u0001\u0005\u1423\u1473\u1c52\u1cb7\u0001\u0004\u1122\u1c53\u1cb7\u0002\u1cbe\u0001\u0002\u1cc1\u0001\u0002\u1cc4\u0001\u0002\u1cc7\u0001\u0002\u1cca\u0001\u0002\u1ccd\u0001\u0002\u1cd0\u0001\u0003\u1123\u1cd4\u0001\u0002\u1124\u0002\u1125\u0002\u1126\u0016\u083b\u0d65\u0da7\u0deb\u0e1e\u0e3d\u0e7c\u0fe8\u1550\u1c26\u1c2a\u1c2e\u1c32\u1c3a\u1c40\u1c54\u1c60\u1c65\u1c79\u1cd4\u1cf1\u0001\n\u0c23\u0cad\u0d23\u0fe9\u1127" +
|
"\u1cb1\u0001\u0005\u1423\u1473\u1c52\u1cb7\u0001\u0004\u1122\u1c53\u1cb7\u0002\u1cbe\u0001\u0002\u1cc1\u0001\u0002\u1cc4\u0001\u0002\u1cc7\u0001\u0002\u1cca\u0001\u0002\u1ccd\u0001\u0002\u1cd0\u0001\u0003\u1123\u1cd4\u0001\u0002\u1124\u0002\u1125\u0002\u1126\u0016\u083b\u0d65\u0da7\u0deb\u0e1e\u0e3d\u0e7c\u0fe8\u1550\u1c26\u1c2a\u1c2e\u1c32\u1c3a\u1c40\u1c54\u1c60\u1c65\u1c79\u1cd4\u1cf1\u0001\n\u0c23\u0cad\u0d23\u0fe9\u1127" +
|
||||||
"\u138d\u1424\u1c55\u1cf1\u0002\u1cfe\u0001\u00ee\u1ded\u066c\u06cc\u0706\u07ce\u06cd\u06ce\u0351\u0cfd\u0c95\u0cfe\u1df2\u1df6\u1df9\u1dfc\u1dff\u1e02\u1e05\u1e08\u1e0b\u1e0e\u1e11\u0ddf\u1401\u0e36\u0e66\u07d3\u07d4\u0c59\u0c94\u1222\u1e16\u0d58\u0e0f\u1e17\u0ca6\u12fa\u0e13\u0e14\u0d5a\u0e18\u1e18\u0d00\u0688\u0d02\u1e19\u0f3a\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u1e2c\u1e2d\u1e2e\u1e2f\u162d\u1e30" +
|
"\u138d\u1424\u1c55\u1cf1\u0002\u1cfe\u0001\u00f6\u1df5\u066c\u06cc\u0706\u07ce\u06cd\u06ce\u0351\u0cfd\u0c95\u0cfe\u1dfa\u1dfe\u1e01\u1e04\u1e07\u1e0a\u1e0d\u1e10\u1e13\u1e16\u1e19\u0ddf\u1401\u0e36\u0e66\u07d3\u07d4\u0c59\u0c94\u1222\u1e1e\u0d58\u0e0f\u1e1f\u0ca6\u12fa\u0e13\u0e14\u0d5a\u0e18\u1e20\u0d00\u0688\u0d02\u1e21\u0f3a\u1e29\u1e2a\u1e2b\u1e2c\u1e2d\u1e2e\u1e2f\u1e30\u1e31\u1e32\u1e33\u1e34\u1e35\u1e36\u1e37\u162d\u1e38" +
|
||||||
"\u1e31\u1e33\u1e34\u0d1f\u1e35\u1e36\u1e37\u1e38\u1e39\u16ef\u16ea\u1e3b\u1e3c\u1e3e\u1e3f\u179e\u1e40\u0fb7\u0d22\u1640\u0d1e\u1e41\u1665\u166f\u16b6\u0d1f\u1e43\u1e4f\u1e56\u1e5c\u1e63\u1e69\u1e6e\u1e74\u1e80\u1e86\u1e8c\u1e93\u1ea0\u1884\u189a\u1967\u1ea6\u191b\u1ea7\u1ea8\u1870\u1ea9\u1eaa\u1eab\u1eac\u1ead\u18b3\u1995\u1eae\u1eaf\u1eb0\u18d0\u1eb1\u1eb2\u1eb3\u192b\u192c\u1df2\u1df6\u1df9\u1dfc\u1dff\u1e02\u1e05\u1e08\u1e0b" +
|
"\u1e39\u1e3b\u1e3c\u0d1f\u1e3d\u1e3e\u1e3f\u1e40\u1e41\u16ef\u16ea\u1e43\u1e44\u1e46\u1e47\u179e\u1e48\u0fb7\u0d22\u1640\u0d1e\u1e49\u1665\u166f\u16b6\u0d1f\u1e4b\u1e57\u1e5e\u1e64\u1e6b\u1e71\u1e76\u1e7c\u1e88\u1e8e\u1e94\u1e9b\u1ea8\u1884\u189a\u1967\u1eae\u191b\u1eaf\u1eb0\u1870\u1eb1\u1eb2\u1eb3\u1eb4\u1eb5\u18b3\u1995\u1eb6\u1eb7\u1eb8\u18d0\u1eb9\u1eba\u1ebb\u192b\u192c\u1dfa\u1dfe\u1e01\u1e04\u1e07\u1e0a\u1e0d\u1e10\u1e13" +
|
||||||
"\u1e0e\u1938\u1eb4\u197c\u1995\u1eb5\u1955\u1df2\u1df6\u1df9\u1dfc\u1dff\u1e02\u1e05\u1e08\u1e0b\u1e0e\u1eb6\u1eb7\u1eb8\u1eb9\u1eba\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u19d6\u19d7\u19d8\u1ec4\u1ec5\u1ec6\u19d9\u1eca\u1ecb\u19da\u19db\u1ecc\u1ecd\u1ed1\u19dc\u1ed5\u19dd\u1ed9\u19de\u19df\u19e0\u1eda\u1edb\u1edf\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3" +
|
"\u1e16\u1938\u1ebc\u197c\u1995\u1ebd\u1955\u1dfa\u1dfe\u1e01\u1e04\u1e07\u1e0a\u1e0d\u1e10\u1e13\u1e16\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u1ec9\u1eca\u1ecb\u19d6\u19d7\u19d8\u1ecc\u1ecd\u1ece\u19d9\u1ed2\u1ed3\u19da\u19db\u1ed4\u1ed5\u1ed9\u19dc\u1edd\u19dd\u1ee1\u19de\u19df\u19e0\u1ee2\u1ee3\u1ee7\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1efa\u1efb" +
|
||||||
"\u1ef5\u1ef7\u1ef9\u1efb\u1385\u1e19\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1efd\u1efe\u1eff\u1f00\u1f01\u1f02\u1c35\u1f03\u1f04\u1f05\u1f06\u1f07\u1120\u1121\u1f08\u1672\u1f09\u1f0a\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001" +
|
"\u1efd\u1eff\u1f01\u1f03\u1385\u1e21\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1f05\u1f06\u1f07\u1f08\u1f09\u1f0a\u1c35\u111c\u04f5\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1120\u1121\u1423\u1f10\u1cd4\u138c\u1125\u1126\u083b\u1672\u1f11\u1f12\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
|
||||||
"\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000" +
|
"\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000" +
|
||||||
"\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001" +
|
"\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
|
||||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
"\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001" +
|
||||||
"\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f16\u1f17\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f1e\u1f1f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f30\u1f31\u1f32\u1f33\u1f34\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f40\u1f41" +
|
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f1e\u1f1f\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f33\u1f34\u1f35\u1f36\u1f37\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u0001\u0001\u0001\u0001\u0001" +
|
||||||
"\u1f42\u1f43\u1f44\u1f45\u1f46\u1f47\u1f48\u1f49\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f55\u1f56\u1f57\u1f58\u1f59\u1f5a\u1f5b\u1f5c\u1f5d\u1f5e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1f70\u1f71\u1f72\u1f73\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f7f\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f88\u0001" +
|
"\u0001\u0001\u0001\u0001\u0001\u000b\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f4e\u1f4f\u1f50\u1f51\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f5d\u1f5e\u1f5f\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f87\u1f88\u1f89" +
|
||||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f94\u1f95\u1f96\u1f97\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0070\u0f55\u0d0b\u200e\u2011\u2014\u2015\u2016\u2017\u2018\u2019\u201a\u201b\u1ebe\u1ebf\u201c\u201d\u201e\u201f\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2027\u2028\u2029\u202a\u202b\u202c\u202d\u1ee9\u1eb8\u202e\u1eb9\u202f\u2030\u1ef0\u2031\u2032" +
|
"\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f90\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0071\u0f55\u0d0b\u2017\u201a\u201d\u201e\u201f\u2020\u2021\u2022\u2023\u2024\u1ec6\u1ec7\u2025\u2026\u2027\u2028\u2029\u202a\u202b\u202c\u202d\u202e\u202f\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u1ef1" +
|
||||||
"\u2033\u2034\u2035\u2036\u2037\u2038\u2039\u203a\u203b\u203c\u203d\u203e\u203f\u2040\u2041\u2042\u2043\u2044\u2045\u2046\u2047\u2048\u0f48\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2052\u2053\u2054\u2055\u2056\u2058\u205a\u205b\u205e\u2061\u2064\u2065\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1eff\u1f00\u1f01\u1f02\u1c43\u1c48\u1c9e\u1ca2\u1ca5\u1ca8\u2066\u2067\u2068\u2069\u206a\u206b\u206c\u206d\u206e\u206f\u2070\u0003\u0000" +
|
"\u1ec0\u2037\u1ec1\u2038\u2039\u1ef8\u203a\u203b\u203c\u203d\u203e\u203f\u2040\u2041\u2042\u2043\u2044\u2045\u2046\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u0f48\u2052\u2053\u2054\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u205f\u2061\u2063\u2064\u2067\u206a\u206d\u206e\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1f07\u1f08\u1f09\u1f0a\u1c43\u1c48\u1c9e\u1ca2\u1ca5\u1ca8\u206f\u2070\u2071\u2072\u2073" +
|
||||||
"\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000" +
|
"\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||||
"\u0002\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001").toCharArray();
|
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u2080\u2083\u2086\u2089\u208c\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000").toCharArray();
|
||||||
|
|
||||||
public static final int accent_aigu = 1;
|
public static final int accent_aigu = 1;
|
||||||
public static final int accent_arrows = 130;
|
public static final int accent_arrows = 130;
|
||||||
@@ -265,12 +265,12 @@ public final class ComposeKeyData
|
|||||||
public static final int accent_trema = 1172;
|
public static final int accent_trema = 1172;
|
||||||
public static final int compose = 1270;
|
public static final int compose = 1270;
|
||||||
public static final int fn = 7423;
|
public static final int fn = 7423;
|
||||||
public static final int numpad_bengali = 7947;
|
public static final int numpad_bengali = 7955;
|
||||||
public static final int numpad_devanagari = 7968;
|
public static final int numpad_devanagari = 7976;
|
||||||
public static final int numpad_gujarati = 7989;
|
public static final int numpad_gujarati = 7997;
|
||||||
public static final int numpad_hindu = 8010;
|
public static final int numpad_hindu = 8018;
|
||||||
public static final int numpad_kannada = 8031;
|
public static final int numpad_kannada = 8039;
|
||||||
public static final int numpad_persian = 8052;
|
public static final int numpad_persian = 8060;
|
||||||
public static final int numpad_tamil = 8073;
|
public static final int numpad_tamil = 8081;
|
||||||
public static final int shift = 8094;
|
public static final int shift = 8102;
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package juloo.keyboard2;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import android.os.Handler;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
import android.view.KeyCharacterMap;
|
import android.view.KeyCharacterMap;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
@@ -28,10 +29,10 @@ public final class KeyEventHandler
|
|||||||
[setSelection] could be used instead. */
|
[setSelection] could be used instead. */
|
||||||
boolean _move_cursor_force_fallback = false;
|
boolean _move_cursor_force_fallback = false;
|
||||||
|
|
||||||
public KeyEventHandler(Looper looper, IReceiver recv)
|
public KeyEventHandler(IReceiver recv)
|
||||||
{
|
{
|
||||||
_recv = recv;
|
_recv = recv;
|
||||||
_autocap = new Autocapitalisation(looper,
|
_autocap = new Autocapitalisation(recv.getHandler(),
|
||||||
this.new Autocapitalisation_callback());
|
this.new Autocapitalisation_callback());
|
||||||
_mods = Pointers.Modifiers.EMPTY;
|
_mods = Pointers.Modifiers.EMPTY;
|
||||||
}
|
}
|
||||||
@@ -99,7 +100,6 @@ public final class KeyEventHandler
|
|||||||
case Editing: handle_editing_key(key.getEditing()); break;
|
case Editing: handle_editing_key(key.getEditing()); break;
|
||||||
case Compose_pending: _recv.set_compose_pending(true); break;
|
case Compose_pending: _recv.set_compose_pending(true); break;
|
||||||
case Slider: handle_slider(key.getSlider(), key.getSliderRepeat()); break;
|
case Slider: handle_slider(key.getSlider(), key.getSliderRepeat()); break;
|
||||||
case StringWithSymbol: send_text(key.getStringWithSymbol()); break;
|
|
||||||
case Macro: evaluate_macro(key.getMacro()); break;
|
case Macro: evaluate_macro(key.getMacro()); break;
|
||||||
}
|
}
|
||||||
update_meta_state(old_mods);
|
update_meta_state(old_mods);
|
||||||
@@ -147,11 +147,11 @@ public final class KeyEventHandler
|
|||||||
if (down)
|
if (down)
|
||||||
{
|
{
|
||||||
_meta_state = _meta_state | meta_flags;
|
_meta_state = _meta_state | meta_flags;
|
||||||
send_keyevent(KeyEvent.ACTION_DOWN, eventCode);
|
send_keyevent(KeyEvent.ACTION_DOWN, eventCode, _meta_state);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
send_keyevent(KeyEvent.ACTION_UP, eventCode);
|
send_keyevent(KeyEvent.ACTION_UP, eventCode, _meta_state);
|
||||||
_meta_state = _meta_state & ~meta_flags;
|
_meta_state = _meta_state & ~meta_flags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,25 +182,28 @@ public final class KeyEventHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
|
|
||||||
*/
|
|
||||||
void send_key_down_up(int keyCode)
|
void send_key_down_up(int keyCode)
|
||||||
{
|
{
|
||||||
send_keyevent(KeyEvent.ACTION_DOWN, keyCode);
|
send_key_down_up(keyCode, _meta_state);
|
||||||
send_keyevent(KeyEvent.ACTION_UP, keyCode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_keyevent(int eventAction, int eventCode)
|
/** Ignores currently pressed system modifiers. */
|
||||||
|
void send_key_down_up(int keyCode, int metaState)
|
||||||
|
{
|
||||||
|
send_keyevent(KeyEvent.ACTION_DOWN, keyCode, metaState);
|
||||||
|
send_keyevent(KeyEvent.ACTION_UP, keyCode, metaState);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_keyevent(int eventAction, int eventCode, int metaState)
|
||||||
{
|
{
|
||||||
InputConnection conn = _recv.getCurrentInputConnection();
|
InputConnection conn = _recv.getCurrentInputConnection();
|
||||||
if (conn == null)
|
if (conn == null)
|
||||||
return;
|
return;
|
||||||
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0,
|
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0,
|
||||||
_meta_state, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
|
metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
|
||||||
KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE));
|
KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE));
|
||||||
if (eventAction == KeyEvent.ACTION_UP)
|
if (eventAction == KeyEvent.ACTION_UP)
|
||||||
_autocap.event_sent(eventCode, _meta_state);
|
_autocap.event_sent(eventCode, metaState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_text(CharSequence text)
|
void send_text(CharSequence text)
|
||||||
@@ -237,6 +240,9 @@ public final class KeyEventHandler
|
|||||||
case REPLACE: send_context_menu_action(android.R.id.replaceText); break;
|
case REPLACE: send_context_menu_action(android.R.id.replaceText); break;
|
||||||
case ASSIST: send_context_menu_action(android.R.id.textAssist); break;
|
case ASSIST: send_context_menu_action(android.R.id.textAssist); break;
|
||||||
case AUTOFILL: send_context_menu_action(android.R.id.autofill); break;
|
case AUTOFILL: send_context_menu_action(android.R.id.autofill); break;
|
||||||
|
case DELETE_WORD: send_key_down_up(KeyEvent.KEYCODE_DEL, KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON); break;
|
||||||
|
case FORWARD_DELETE_WORD: send_key_down_up(KeyEvent.KEYCODE_FORWARD_DEL, KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON); break;
|
||||||
|
case SELECTION_CANCEL: cancel_selection(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,15 +260,17 @@ public final class KeyEventHandler
|
|||||||
return conn.getExtractedText(_move_cursor_req, 0);
|
return conn.getExtractedText(_move_cursor_req, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** [repeatition] might be negative, in which case the direction is reversed. */
|
/** [r] might be negative, in which case the direction is reversed. */
|
||||||
void handle_slider(KeyValue.Slider s, int repeatition)
|
void handle_slider(KeyValue.Slider s, int r)
|
||||||
{
|
{
|
||||||
switch (s)
|
switch (s)
|
||||||
{
|
{
|
||||||
case Cursor_left: move_cursor(-repeatition); break;
|
case Cursor_left: move_cursor(-r); break;
|
||||||
case Cursor_right: move_cursor(repeatition); break;
|
case Cursor_right: move_cursor(r); break;
|
||||||
case Cursor_up: move_cursor_vertical(-repeatition); break;
|
case Cursor_up: move_cursor_vertical(-r); break;
|
||||||
case Cursor_down: move_cursor_vertical(repeatition); break;
|
case Cursor_down: move_cursor_vertical(r); break;
|
||||||
|
case Selection_cursor_left: move_cursor_sel(r, true); break;
|
||||||
|
case Selection_cursor_right: move_cursor_sel(r, false); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,12 +284,7 @@ public final class KeyEventHandler
|
|||||||
if (conn == null)
|
if (conn == null)
|
||||||
return;
|
return;
|
||||||
ExtractedText et = get_cursor_pos(conn);
|
ExtractedText et = get_cursor_pos(conn);
|
||||||
int system_mods =
|
if (et != null && can_set_selection(conn))
|
||||||
KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON | KeyEvent.META_META_ON;
|
|
||||||
// Fallback to sending key events if system modifiers are activated or
|
|
||||||
// ExtractedText is not supported, for example on Termux.
|
|
||||||
if (!_move_cursor_force_fallback && et != null
|
|
||||||
&& (_meta_state & system_mods) == 0)
|
|
||||||
{
|
{
|
||||||
int sel_start = et.selectionStart;
|
int sel_start = et.selectionStart;
|
||||||
int sel_end = et.selectionEnd;
|
int sel_end = et.selectionEnd;
|
||||||
@@ -300,8 +303,45 @@ public final class KeyEventHandler
|
|||||||
sel_start = sel_end;
|
sel_start = sel_end;
|
||||||
}
|
}
|
||||||
if (conn.setSelection(sel_start, sel_end))
|
if (conn.setSelection(sel_start, sel_end))
|
||||||
return; // [setSelection] succeeded, don't fallback to key events
|
return; // Fallback to sending key events if [setSelection] failed
|
||||||
}
|
}
|
||||||
|
move_cursor_fallback(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Move one of the two side of a selection. If [sel_left] is true, the left
|
||||||
|
position is moved, otherwise the right position is moved. */
|
||||||
|
void move_cursor_sel(int d, boolean sel_left)
|
||||||
|
{
|
||||||
|
InputConnection conn = _recv.getCurrentInputConnection();
|
||||||
|
if (conn == null)
|
||||||
|
return;
|
||||||
|
ExtractedText et = get_cursor_pos(conn);
|
||||||
|
if (et != null && can_set_selection(conn))
|
||||||
|
{
|
||||||
|
int sel_start = et.selectionStart;
|
||||||
|
int sel_end = et.selectionEnd;
|
||||||
|
if (sel_left == (sel_start <= sel_end))
|
||||||
|
sel_start += d;
|
||||||
|
else
|
||||||
|
sel_end += d;
|
||||||
|
if (conn.setSelection(sel_start, sel_end))
|
||||||
|
return; // Fallback to sending key events if [setSelection] failed
|
||||||
|
}
|
||||||
|
move_cursor_fallback(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns whether the selection can be set using [conn.setSelection()].
|
||||||
|
This can happen on Termux or when system modifiers are activated for
|
||||||
|
example. */
|
||||||
|
boolean can_set_selection(InputConnection conn)
|
||||||
|
{
|
||||||
|
final int system_mods =
|
||||||
|
KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON | KeyEvent.META_META_ON;
|
||||||
|
return !_move_cursor_force_fallback && (_meta_state & system_mods) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void move_cursor_fallback(int d)
|
||||||
|
{
|
||||||
if (d < 0)
|
if (d < 0)
|
||||||
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_LEFT, -d);
|
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_LEFT, -d);
|
||||||
else
|
else
|
||||||
@@ -320,32 +360,73 @@ public final class KeyEventHandler
|
|||||||
|
|
||||||
void evaluate_macro(KeyValue[] keys)
|
void evaluate_macro(KeyValue[] keys)
|
||||||
{
|
{
|
||||||
final Pointers.Modifiers empty = Pointers.Modifiers.EMPTY;
|
if (keys.length == 0)
|
||||||
|
return;
|
||||||
// Ignore modifiers that are activated at the time the macro is evaluated
|
// Ignore modifiers that are activated at the time the macro is evaluated
|
||||||
mods_changed(empty);
|
mods_changed(Pointers.Modifiers.EMPTY);
|
||||||
Pointers.Modifiers mods = empty;
|
evaluate_macro_loop(keys, 0, Pointers.Modifiers.EMPTY, _autocap.pause());
|
||||||
final boolean autocap_paused = _autocap.pause();
|
}
|
||||||
for (KeyValue kv : keys)
|
|
||||||
|
/** Evaluate the macro asynchronously to make sure event are processed in the
|
||||||
|
right order. */
|
||||||
|
void evaluate_macro_loop(final KeyValue[] keys, int i, Pointers.Modifiers mods, final boolean autocap_paused)
|
||||||
|
{
|
||||||
|
boolean should_delay = false;
|
||||||
|
KeyValue kv = KeyModifier.modify(keys[i], mods);
|
||||||
|
if (kv != null)
|
||||||
{
|
{
|
||||||
kv = KeyModifier.modify(kv, mods);
|
|
||||||
if (kv == null)
|
|
||||||
continue;
|
|
||||||
if (kv.hasFlagsAny(KeyValue.FLAG_LATCH))
|
if (kv.hasFlagsAny(KeyValue.FLAG_LATCH))
|
||||||
{
|
{
|
||||||
// Non-special latchable keys clear latched modifiers
|
// Non-special latchable keys clear latched modifiers
|
||||||
if (!kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
|
if (!kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
|
||||||
mods = empty;
|
mods = Pointers.Modifiers.EMPTY;
|
||||||
mods = mods.with_extra_mod(kv);
|
mods = mods.with_extra_mod(kv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
key_down(kv, false);
|
key_down(kv, false);
|
||||||
key_up(kv, mods);
|
key_up(kv, mods);
|
||||||
mods = empty;
|
mods = Pointers.Modifiers.EMPTY;
|
||||||
}
|
}
|
||||||
|
should_delay = wait_after_macro_key(kv);
|
||||||
}
|
}
|
||||||
|
i++;
|
||||||
|
if (i >= keys.length) // Stop looping
|
||||||
|
{
|
||||||
_autocap.unpause(autocap_paused);
|
_autocap.unpause(autocap_paused);
|
||||||
}
|
}
|
||||||
|
else if (should_delay)
|
||||||
|
{
|
||||||
|
// Add a delay before sending the next key to avoid race conditions
|
||||||
|
// causing keys to be handled in the wrong order. Notably, KeyEvent keys
|
||||||
|
// handling is scheduled differently than the other edit functions.
|
||||||
|
final int i_ = i;
|
||||||
|
final Pointers.Modifiers mods_ = mods;
|
||||||
|
_recv.getHandler().postDelayed(new Runnable() {
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
evaluate_macro_loop(keys, i_, mods_, autocap_paused);
|
||||||
|
}
|
||||||
|
}, 1000/30);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
evaluate_macro_loop(keys, i, mods, autocap_paused);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean wait_after_macro_key(KeyValue kv)
|
||||||
|
{
|
||||||
|
switch (kv.getKind())
|
||||||
|
{
|
||||||
|
case Keyevent:
|
||||||
|
case Editing:
|
||||||
|
case Event:
|
||||||
|
return true;
|
||||||
|
case Slider:
|
||||||
|
return _move_cursor_force_fallback;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Repeat calls to [send_key_down_up]. */
|
/** Repeat calls to [send_key_down_up]. */
|
||||||
void send_key_down_up_repeat(int event_code, int repeat)
|
void send_key_down_up_repeat(int event_code, int repeat)
|
||||||
@@ -354,12 +435,27 @@ public final class KeyEventHandler
|
|||||||
send_key_down_up(event_code);
|
send_key_down_up(event_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cancel_selection()
|
||||||
|
{
|
||||||
|
InputConnection conn = _recv.getCurrentInputConnection();
|
||||||
|
if (conn == null)
|
||||||
|
return;
|
||||||
|
ExtractedText et = get_cursor_pos(conn);
|
||||||
|
if (et == null) return;
|
||||||
|
final int curs = et.selectionStart;
|
||||||
|
// Notify the receiver as Android's [onUpdateSelection] is not triggered.
|
||||||
|
if (conn.setSelection(curs, curs));
|
||||||
|
_recv.selection_state_changed(false);
|
||||||
|
}
|
||||||
|
|
||||||
public static interface IReceiver
|
public static interface IReceiver
|
||||||
{
|
{
|
||||||
public void handle_event_key(KeyValue.Event ev);
|
public void handle_event_key(KeyValue.Event ev);
|
||||||
public void set_shift_state(boolean state, boolean lock);
|
public void set_shift_state(boolean state, boolean lock);
|
||||||
public void set_compose_pending(boolean pending);
|
public void set_compose_pending(boolean pending);
|
||||||
|
public void selection_state_changed(boolean selection_is_ongoing);
|
||||||
public InputConnection getCurrentInputConnection();
|
public InputConnection getCurrentInputConnection();
|
||||||
|
public Handler getHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
class Autocapitalisation_callback implements Autocapitalisation.Callback
|
class Autocapitalisation_callback implements Autocapitalisation.Callback
|
||||||
|
@@ -36,7 +36,7 @@ public final class KeyModifier
|
|||||||
case Modifier:
|
case Modifier:
|
||||||
return modify(k, mod.getModifier());
|
return modify(k, mod.getModifier());
|
||||||
case Compose_pending:
|
case Compose_pending:
|
||||||
return ComposeKey.apply(mod.getPendingCompose(), k);
|
return apply_compose_pending(mod.getPendingCompose(), k);
|
||||||
case Hangul_initial:
|
case Hangul_initial:
|
||||||
if (k.equals(mod)) // Allow typing the initial in letter form
|
if (k.equals(mod)) // Allow typing the initial in letter form
|
||||||
return KeyValue.makeStringKey(k.getString(), KeyValue.FLAG_GREYED);
|
return KeyValue.makeStringKey(k.getString(), KeyValue.FLAG_GREYED);
|
||||||
@@ -82,6 +82,7 @@ public final class KeyModifier
|
|||||||
case HOOK_ABOVE: return apply_compose(k, ComposeKeyData.accent_hook_above);
|
case HOOK_ABOVE: return apply_compose(k, ComposeKeyData.accent_hook_above);
|
||||||
case DOUBLE_GRAVE: return apply_compose(k, ComposeKeyData.accent_double_grave);
|
case DOUBLE_GRAVE: return apply_compose(k, ComposeKeyData.accent_double_grave);
|
||||||
case ARROW_RIGHT: return apply_combining_char(k, "\u20D7");
|
case ARROW_RIGHT: return apply_combining_char(k, "\u20D7");
|
||||||
|
case SELECTION_MODE: return apply_selection_mode(k);
|
||||||
default: return k;
|
default: return k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,30 +123,44 @@ public final class KeyModifier
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Keys that do not match any sequence are greyed. */
|
||||||
|
private static KeyValue apply_compose_pending(int state, KeyValue kv)
|
||||||
|
{
|
||||||
|
switch (kv.getKind())
|
||||||
|
{
|
||||||
|
case Char:
|
||||||
|
case String:
|
||||||
|
KeyValue res = ComposeKey.apply(state, kv);
|
||||||
|
// Grey-out characters not part of any sequence.
|
||||||
|
if (res == null)
|
||||||
|
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
||||||
|
return res;
|
||||||
|
/* Tapping compose again exits the pending sequence. */
|
||||||
|
case Compose_pending:
|
||||||
|
return KeyValue.getKeyByName("compose_cancel");
|
||||||
|
/* These keys are not greyed. */
|
||||||
|
case Event:
|
||||||
|
case Modifier:
|
||||||
|
return kv;
|
||||||
|
/* Other keys cannot be part of sequences. */
|
||||||
|
default:
|
||||||
|
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Apply the given compose state or fallback to the dead_char. */
|
/** Apply the given compose state or fallback to the dead_char. */
|
||||||
private static KeyValue apply_compose_or_dead_char(KeyValue k, int state, char dead_char)
|
private static KeyValue apply_compose_or_dead_char(KeyValue k, int state, char dead_char)
|
||||||
{
|
{
|
||||||
switch (k.getKind())
|
KeyValue r = ComposeKey.apply(state, k);
|
||||||
{
|
|
||||||
case Char:
|
|
||||||
char c = k.getChar();
|
|
||||||
KeyValue r = ComposeKey.apply(state, c);
|
|
||||||
if (r != null)
|
if (r != null)
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
return apply_dead_char(k, dead_char);
|
return apply_dead_char(k, dead_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static KeyValue apply_compose(KeyValue k, int state)
|
private static KeyValue apply_compose(KeyValue k, int state)
|
||||||
{
|
{
|
||||||
switch (k.getKind())
|
KeyValue r = ComposeKey.apply(state, k);
|
||||||
{
|
return (r != null) ? r : k;
|
||||||
case Char:
|
|
||||||
KeyValue r = ComposeKey.apply(state, k.getChar());
|
|
||||||
if (r != null)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
return k;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
|
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
|
||||||
@@ -179,18 +194,19 @@ public final class KeyModifier
|
|||||||
if (mapped != null)
|
if (mapped != null)
|
||||||
return mapped;
|
return mapped;
|
||||||
}
|
}
|
||||||
|
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, k);
|
||||||
|
if (r != null)
|
||||||
|
return r;
|
||||||
switch (k.getKind())
|
switch (k.getKind())
|
||||||
{
|
{
|
||||||
case Char:
|
case Char:
|
||||||
char kc = k.getChar();
|
char kc = k.getChar();
|
||||||
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, kc);
|
|
||||||
if (r != null)
|
|
||||||
return r;
|
|
||||||
char c = Character.toUpperCase(kc);
|
char c = Character.toUpperCase(kc);
|
||||||
return (kc == c) ? k : k.withChar(c);
|
return (kc == c) ? k : k.withChar(c);
|
||||||
case String:
|
case String:
|
||||||
String s = Utils.capitalize_string(k.getString());
|
String ks = k.getString();
|
||||||
return KeyValue.makeStringKey(s, k.getFlags());
|
String s = Utils.capitalize_string(ks);
|
||||||
|
return s.equals(ks) ? k : KeyValue.makeStringKey(s, k.getFlags());
|
||||||
default: return k;
|
default: return k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -207,7 +223,8 @@ public final class KeyModifier
|
|||||||
switch (k.getKind())
|
switch (k.getKind())
|
||||||
{
|
{
|
||||||
case Char:
|
case Char:
|
||||||
KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k.getChar());
|
case String:
|
||||||
|
KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k);
|
||||||
return (r != null) ? r : k;
|
return (r != null) ? r : k;
|
||||||
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
|
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
|
||||||
case Event: name = apply_fn_event(k.getEvent()); break;
|
case Event: name = apply_fn_event(k.getEvent()); break;
|
||||||
@@ -365,6 +382,41 @@ public final class KeyModifier
|
|||||||
case SHIFT: name = "capslock"; break;
|
case SHIFT: name = "capslock"; break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Keyevent:
|
||||||
|
switch (k.getKeyevent())
|
||||||
|
{
|
||||||
|
case KeyEvent.KEYCODE_DEL: name = "delete_word"; break;
|
||||||
|
case KeyEvent.KEYCODE_FORWARD_DEL: name = "forward_delete_word"; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (name == null) ? k : KeyValue.getKeyByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static KeyValue apply_selection_mode(KeyValue k)
|
||||||
|
{
|
||||||
|
String name = null;
|
||||||
|
switch (k.getKind())
|
||||||
|
{
|
||||||
|
case Char:
|
||||||
|
switch (k.getChar())
|
||||||
|
{
|
||||||
|
case ' ': name = "selection_cancel"; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Slider:
|
||||||
|
switch (k.getSlider())
|
||||||
|
{
|
||||||
|
case Cursor_left: name = "selection_cursor_left"; break;
|
||||||
|
case Cursor_right: name = "selection_cursor_right"; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Keyevent:
|
||||||
|
switch (k.getKeyevent())
|
||||||
|
{
|
||||||
|
case KeyEvent.KEYCODE_ESCAPE: name = "selection_cancel"; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return (name == null) ? k : KeyValue.getKeyByName(name);
|
return (name == null) ? k : KeyValue.getKeyByName(name);
|
||||||
}
|
}
|
||||||
|
@@ -59,6 +59,7 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
BREVE,
|
BREVE,
|
||||||
BAR,
|
BAR,
|
||||||
FN,
|
FN,
|
||||||
|
SELECTION_MODE,
|
||||||
} // Last is be applied first
|
} // Last is be applied first
|
||||||
|
|
||||||
public static enum Editing
|
public static enum Editing
|
||||||
@@ -75,6 +76,9 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
SHARE,
|
SHARE,
|
||||||
ASSIST,
|
ASSIST,
|
||||||
AUTOFILL,
|
AUTOFILL,
|
||||||
|
DELETE_WORD,
|
||||||
|
FORWARD_DELETE_WORD,
|
||||||
|
SELECTION_CANCEL,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum Placeholder
|
public static enum Placeholder
|
||||||
@@ -95,7 +99,6 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
Modifier, Editing, Placeholder,
|
Modifier, Editing, Placeholder,
|
||||||
String, // [_payload] is also the string to output, value is unused.
|
String, // [_payload] is also the string to output, value is unused.
|
||||||
Slider, // [_payload] is a [KeyValue.Slider], value is slider repeatition.
|
Slider, // [_payload] is a [KeyValue.Slider], value is slider repeatition.
|
||||||
StringWithSymbol, // [_payload] is a [KeyValue.StringWithSymbol], value is unused.
|
|
||||||
Macro, // [_payload] is a [KeyValue.Macro], value is unused.
|
Macro, // [_payload] is a [KeyValue.Macro], value is unused.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,12 +228,6 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
return ((int)(short)(_code & VALUE_BITS));
|
return ((int)(short)(_code & VALUE_BITS));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Defined only when [getKind() == Kind.StringWithSymbol]. */
|
|
||||||
public String getStringWithSymbol()
|
|
||||||
{
|
|
||||||
return ((StringWithSymbol)_payload).str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Defined only when [getKind() == Kind.Macro]. */
|
/** Defined only when [getKind() == Kind.Macro]. */
|
||||||
public KeyValue[] getMacro()
|
public KeyValue[] getMacro()
|
||||||
{
|
{
|
||||||
@@ -240,7 +237,8 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
/* Update the char and the symbol. */
|
/* Update the char and the symbol. */
|
||||||
public KeyValue withChar(char c)
|
public KeyValue withChar(char c)
|
||||||
{
|
{
|
||||||
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
|
return new KeyValue(String.valueOf(c), Kind.Char, c,
|
||||||
|
getFlags() & ~(FLAG_KEY_FONT | FLAG_SMALLER_FONT));
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeyValue withKeyevent(int code)
|
public KeyValue withKeyevent(int code)
|
||||||
@@ -250,7 +248,31 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
|
|
||||||
public KeyValue withFlags(int f)
|
public KeyValue withFlags(int f)
|
||||||
{
|
{
|
||||||
return new KeyValue(_payload, (_code & KIND_BITS), (_code & VALUE_BITS), f);
|
return new KeyValue(_payload, _code, _code, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyValue withSymbol(String symbol)
|
||||||
|
{
|
||||||
|
int flags = getFlags() & ~(FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||||
|
switch (getKind())
|
||||||
|
{
|
||||||
|
case Char:
|
||||||
|
case Keyevent:
|
||||||
|
case Event:
|
||||||
|
case Compose_pending:
|
||||||
|
case Hangul_initial:
|
||||||
|
case Hangul_medial:
|
||||||
|
case Modifier:
|
||||||
|
case Editing:
|
||||||
|
case Placeholder:
|
||||||
|
if (symbol.length() > 1)
|
||||||
|
flags |= FLAG_SMALLER_FONT;
|
||||||
|
return new KeyValue(symbol, _code, _code, flags);
|
||||||
|
case Macro:
|
||||||
|
return makeMacro(symbol, getMacro(), flags);
|
||||||
|
default:
|
||||||
|
return makeMacro(symbol, new KeyValue[]{ this }, flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -294,7 +316,6 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
|
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
|
||||||
}
|
}
|
||||||
|
|
||||||
/** [value] is an unsigned integer. */
|
|
||||||
private KeyValue(Comparable p, int kind, int value, int flags)
|
private KeyValue(Comparable p, int kind, int value, int flags)
|
||||||
{
|
{
|
||||||
if (p == null)
|
if (p == null)
|
||||||
@@ -462,14 +483,10 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
|
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 StringWithSymbol(str, symbol),
|
|
||||||
Kind.StringWithSymbol, 0, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static KeyValue makeMacro(String symbol, KeyValue[] keys, int flags)
|
public static KeyValue makeMacro(String symbol, KeyValue[] keys, int flags)
|
||||||
{
|
{
|
||||||
|
if (symbol.length() > 1)
|
||||||
|
flags |= FLAG_SMALLER_FONT;
|
||||||
return new KeyValue(new Macro(keys, symbol), Kind.Macro, 0, flags);
|
return new KeyValue(new Macro(keys, symbol), Kind.Macro, 0, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,10 +711,15 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
case "pasteAsPlainText": return editingKey(0xE035, Editing.PASTE_PLAIN);
|
case "pasteAsPlainText": return editingKey(0xE035, Editing.PASTE_PLAIN);
|
||||||
case "undo": return editingKey(0xE036, Editing.UNDO);
|
case "undo": return editingKey(0xE036, Editing.UNDO);
|
||||||
case "redo": return editingKey(0xE037, Editing.REDO);
|
case "redo": return editingKey(0xE037, Editing.REDO);
|
||||||
|
case "delete_word": return editingKey(0xE01B, Editing.DELETE_WORD);
|
||||||
|
case "forward_delete_word": return editingKey(0xE01C, Editing.FORWARD_DELETE_WORD);
|
||||||
case "cursor_left": return sliderKey(Slider.Cursor_left, 1);
|
case "cursor_left": return sliderKey(Slider.Cursor_left, 1);
|
||||||
case "cursor_right": return sliderKey(Slider.Cursor_right, 1);
|
case "cursor_right": return sliderKey(Slider.Cursor_right, 1);
|
||||||
case "cursor_up": return sliderKey(Slider.Cursor_up, 1);
|
case "cursor_up": return sliderKey(Slider.Cursor_up, 1);
|
||||||
case "cursor_down": return sliderKey(Slider.Cursor_down, 1);
|
case "cursor_down": return sliderKey(Slider.Cursor_down, 1);
|
||||||
|
case "selection_cancel": return editingKey("Esc", Editing.SELECTION_CANCEL, FLAG_SMALLER_FONT);
|
||||||
|
case "selection_cursor_left": return sliderKey(Slider.Selection_cursor_left, -1); // Move the left side of the selection
|
||||||
|
case "selection_cursor_right": return sliderKey(Slider.Selection_cursor_right, 1);
|
||||||
// These keys are not used
|
// These keys are not used
|
||||||
case "replaceText": return editingKey("repl", Editing.REPLACE);
|
case "replaceText": return editingKey("repl", Editing.REPLACE);
|
||||||
case "textAssist": return editingKey(0xE038, Editing.ASSIST);
|
case "textAssist": return editingKey(0xE038, Editing.ASSIST);
|
||||||
@@ -747,6 +769,9 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
case "௲": case "௳":
|
case "௲": case "௳":
|
||||||
return makeStringKey(name, FLAG_SMALLER_FONT);
|
return makeStringKey(name, FLAG_SMALLER_FONT);
|
||||||
|
|
||||||
|
/* Internal keys */
|
||||||
|
case "selection_mode": return makeInternalModifier(Modifier.SELECTION_MODE);
|
||||||
|
|
||||||
default: return null;
|
default: return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -758,35 +783,14 @@ public final class KeyValue implements Comparable<KeyValue>
|
|||||||
throw new RuntimeException("Assertion failure");
|
throw new RuntimeException("Assertion failure");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class StringWithSymbol implements Comparable<StringWithSymbol>
|
|
||||||
{
|
|
||||||
public final String str;
|
|
||||||
final String _symbol;
|
|
||||||
|
|
||||||
public StringWithSymbol(String _str, String _sym)
|
|
||||||
{
|
|
||||||
str = _str;
|
|
||||||
_symbol = _sym;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() { return _symbol; }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(StringWithSymbol snd)
|
|
||||||
{
|
|
||||||
int d = str.compareTo(snd.str);
|
|
||||||
if (d != 0) return d;
|
|
||||||
return _symbol.compareTo(snd._symbol);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public static enum Slider
|
public static enum Slider
|
||||||
{
|
{
|
||||||
Cursor_left(0xE008),
|
Cursor_left(0xE008),
|
||||||
Cursor_right(0xE006),
|
Cursor_right(0xE006),
|
||||||
Cursor_up(0xE005),
|
Cursor_up(0xE005),
|
||||||
Cursor_down(0xE007);
|
Cursor_down(0xE007),
|
||||||
|
Selection_cursor_left(0xE008),
|
||||||
|
Selection_cursor_right(0xE006);
|
||||||
|
|
||||||
final String symbol;
|
final String symbol;
|
||||||
|
|
||||||
|
@@ -41,15 +41,17 @@ public final class KeyValueParser
|
|||||||
if (symbol_ends == input_len) // String key
|
if (symbol_ends == input_len) // String key
|
||||||
return KeyValue.makeStringKey(input);
|
return KeyValue.makeStringKey(input);
|
||||||
String symbol = input.substring(0, symbol_ends);
|
String symbol = input.substring(0, symbol_ends);
|
||||||
ArrayList<KeyValue> keydefs = new ArrayList<KeyValue>();
|
|
||||||
init();
|
init();
|
||||||
Matcher m = KEYDEF_TOKEN.matcher(input);
|
Matcher m = KEYDEF_TOKEN.matcher(input);
|
||||||
m.region(symbol_ends + 1, input_len);
|
m.region(symbol_ends + 1, input_len);
|
||||||
|
KeyValue first_key = parse_key_def(m);
|
||||||
|
if (!parse_comma(m)) // Input is a single key def with a specified symbol
|
||||||
|
return first_key.withSymbol(symbol);
|
||||||
|
// Input is a macro
|
||||||
|
ArrayList<KeyValue> keydefs = new ArrayList<KeyValue>();
|
||||||
|
keydefs.add(first_key);
|
||||||
do { keydefs.add(parse_key_def(m)); }
|
do { keydefs.add(parse_key_def(m)); }
|
||||||
while (parse_comma(m));
|
while (parse_comma(m));
|
||||||
for (KeyValue k : keydefs)
|
|
||||||
if (k == null)
|
|
||||||
parseError("Contains null key", m);
|
|
||||||
return KeyValue.makeMacro(symbol, keydefs.toArray(new KeyValue[]{}), 0);
|
return KeyValue.makeMacro(symbol, keydefs.toArray(new KeyValue[]{}), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,7 +184,7 @@ public final class KeyValueParser
|
|||||||
payload = parseSingleQuotedString(m);
|
payload = parseSingleQuotedString(m);
|
||||||
if (symbol == null)
|
if (symbol == null)
|
||||||
return KeyValue.makeStringKey(payload, flags);
|
return KeyValue.makeStringKey(payload, flags);
|
||||||
return KeyValue.makeStringKeyWithSymbol(payload, symbol, flags);
|
return KeyValue.makeStringKey(payload, flags).withSymbol(symbol);
|
||||||
|
|
||||||
case "char":
|
case "char":
|
||||||
payload = parsePayloadWord(m);
|
payload = parsePayloadWord(m);
|
||||||
|
@@ -6,6 +6,7 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.inputmethodservice.InputMethodService;
|
import android.inputmethodservice.InputMethodService;
|
||||||
import android.os.Build.VERSION;
|
import android.os.Build.VERSION;
|
||||||
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -38,6 +39,7 @@ public class Keyboard2 extends InputMethodService
|
|||||||
private ViewGroup _emojiPane = null;
|
private ViewGroup _emojiPane = null;
|
||||||
private ViewGroup _clipboard_pane = null;
|
private ViewGroup _clipboard_pane = null;
|
||||||
public int actionId; // Action performed by the Action key.
|
public int actionId; // Action performed by the Action key.
|
||||||
|
private Handler _handler;
|
||||||
|
|
||||||
private Config _config;
|
private Config _config;
|
||||||
|
|
||||||
@@ -107,7 +109,8 @@ public class Keyboard2 extends InputMethodService
|
|||||||
{
|
{
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
|
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
|
||||||
_keyeventhandler = new KeyEventHandler(getMainLooper(), this.new Receiver());
|
_handler = new Handler(getMainLooper());
|
||||||
|
_keyeventhandler = new KeyEventHandler(this.new Receiver());
|
||||||
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
|
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
|
||||||
prefs.registerOnSharedPreferenceChangeListener(this);
|
prefs.registerOnSharedPreferenceChangeListener(this);
|
||||||
_config = Config.globalConfig();
|
_config = Config.globalConfig();
|
||||||
@@ -359,6 +362,8 @@ public class Keyboard2 extends InputMethodService
|
|||||||
{
|
{
|
||||||
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd);
|
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd);
|
||||||
_keyeventhandler.selection_updated(oldSelStart, newSelStart);
|
_keyeventhandler.selection_updated(oldSelStart, newSelStart);
|
||||||
|
if ((oldSelStart == oldSelEnd) != (newSelStart == newSelEnd))
|
||||||
|
_keyboardView.set_selection_state(newSelStart != newSelEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -477,10 +482,20 @@ public class Keyboard2 extends InputMethodService
|
|||||||
_keyboardView.set_compose_pending(pending);
|
_keyboardView.set_compose_pending(pending);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void selection_state_changed(boolean selection_is_ongoing)
|
||||||
|
{
|
||||||
|
_keyboardView.set_selection_state(selection_is_ongoing);
|
||||||
|
}
|
||||||
|
|
||||||
public InputConnection getCurrentInputConnection()
|
public InputConnection getCurrentInputConnection()
|
||||||
{
|
{
|
||||||
return Keyboard2.this.getCurrentInputConnection();
|
return Keyboard2.this.getCurrentInputConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Handler getHandler()
|
||||||
|
{
|
||||||
|
return _handler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IBinder getConnectionToken()
|
private IBinder getConnectionToken()
|
||||||
|
@@ -139,6 +139,13 @@ public class Keyboard2View extends View
|
|||||||
set_fake_ptr_latched(_compose_key, _compose_kv, pending, false);
|
set_fake_ptr_latched(_compose_key, _compose_kv, pending, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Called from [Keybard2.onUpdateSelection]. */
|
||||||
|
public void set_selection_state(boolean selection_state)
|
||||||
|
{
|
||||||
|
set_fake_ptr_latched(KeyboardData.Key.EMPTY,
|
||||||
|
KeyValue.getKeyByName("selection_mode"), selection_state, true);
|
||||||
|
}
|
||||||
|
|
||||||
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
||||||
{
|
{
|
||||||
return KeyModifier.modify(k, mods);
|
return KeyModifier.modify(k, mods);
|
||||||
@@ -296,15 +303,15 @@ public class Keyboard2View extends View
|
|||||||
DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
|
DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
|
||||||
width = dm.widthPixels;
|
width = dm.widthPixels;
|
||||||
}
|
}
|
||||||
int height =
|
|
||||||
(int)(_config.keyHeight * _keyboard.keysHeight
|
|
||||||
+ _config.marginTop + _marginBottom);
|
|
||||||
setMeasuredDimension(width, height);
|
|
||||||
_marginLeft = Math.max(_config.horizontal_margin, insets_left);
|
_marginLeft = Math.max(_config.horizontal_margin, insets_left);
|
||||||
_marginRight = Math.max(_config.horizontal_margin, insets_right);
|
_marginRight = Math.max(_config.horizontal_margin, insets_right);
|
||||||
_marginBottom = _config.margin_bottom + insets_bottom;
|
_marginBottom = _config.margin_bottom + insets_bottom;
|
||||||
_keyWidth = (width - _marginLeft - _marginRight) / _keyboard.keysWidth;
|
_keyWidth = (width - _marginLeft - _marginRight) / _keyboard.keysWidth;
|
||||||
_tc = new Theme.Computed(_theme, _config, _keyWidth);
|
_tc = new Theme.Computed(_theme, _config, _keyWidth);
|
||||||
|
int height =
|
||||||
|
(int)(_config.keyHeight * _keyboard.keysHeight
|
||||||
|
+ _config.marginTop + _marginBottom);
|
||||||
|
setMeasuredDimension(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -422,6 +422,8 @@ public final class KeyboardData
|
|||||||
indication = i;
|
indication = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static final Key EMPTY = new Key(new KeyValue[9], null, 0, 1.f, 1.f, null);
|
||||||
|
|
||||||
/** Read a key value attribute that have a synonym. Having both synonyms
|
/** Read a key value attribute that have a synonym. Having both synonyms
|
||||||
present at the same time is an error.
|
present at the same time is an error.
|
||||||
Returns [null] if the attributes are not present. */
|
Returns [null] if the attributes are not present. */
|
||||||
|
@@ -138,15 +138,8 @@ public final class LayoutModifier
|
|||||||
return new KeyboardData.MapKeyValues() {
|
return new KeyboardData.MapKeyValues() {
|
||||||
public KeyValue apply(KeyValue key, boolean localized)
|
public KeyValue apply(KeyValue key, boolean localized)
|
||||||
{
|
{
|
||||||
switch (key.getKind())
|
KeyValue modified = ComposeKey.apply(map_digit, key);
|
||||||
{
|
return (modified != null) ? modified : key;
|
||||||
case Char:
|
|
||||||
KeyValue modified = ComposeKey.apply(map_digit, key.getChar());
|
|
||||||
if (modified != null)
|
|
||||||
return modified;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@ import android.view.inputmethod.InputMethodInfo;
|
|||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.view.inputmethod.InputMethodSubtype;
|
import android.view.inputmethod.InputMethodSubtype;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.Toast;
|
||||||
import java.util.AbstractMap.SimpleEntry;
|
import java.util.AbstractMap.SimpleEntry;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -70,6 +71,8 @@ class VoiceImeSwitcher
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.create();
|
.create();
|
||||||
|
if (ime_display_names.size() == 0)
|
||||||
|
dialog.setMessage(ims.getResources().getString(R.string.toast_no_voice_input));
|
||||||
Utils.show_dialog_on_ime(dialog, ims.getWindow().getWindow().getDecorView().getWindowToken());
|
Utils.show_dialog_on_ime(dialog, ims.getWindow().getWindow().getDecorView().getWindowToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@ package juloo.keyboard2.prefs;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.os.Build.VERSION;
|
||||||
import android.preference.CheckBoxPreference;
|
import android.preference.CheckBoxPreference;
|
||||||
import android.preference.PreferenceCategory;
|
import android.preference.PreferenceCategory;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
@@ -72,6 +73,8 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
"pasteAsPlainText",
|
"pasteAsPlainText",
|
||||||
"undo",
|
"undo",
|
||||||
"redo",
|
"redo",
|
||||||
|
"delete_word",
|
||||||
|
"forward_delete_word",
|
||||||
"superscript",
|
"superscript",
|
||||||
"subscript",
|
"subscript",
|
||||||
"f11_placeholder",
|
"f11_placeholder",
|
||||||
@@ -177,6 +180,14 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
id = R.string.key_descr_redo;
|
id = R.string.key_descr_redo;
|
||||||
additional_info = format_key_combination(new String[]{"fn", "undo"});
|
additional_info = format_key_combination(new String[]{"fn", "undo"});
|
||||||
break;
|
break;
|
||||||
|
case "delete_word":
|
||||||
|
id = R.string.key_descr_delete_word;
|
||||||
|
additional_info = format_key_combination_gesture(res, "backspace");
|
||||||
|
break;
|
||||||
|
case "forward_delete_word":
|
||||||
|
id = R.string.key_descr_forward_delete_word;
|
||||||
|
additional_info = format_key_combination_gesture(res, "forward_delete");
|
||||||
|
break;
|
||||||
case "selectAll": id = R.string.key_descr_selectAll; break;
|
case "selectAll": id = R.string.key_descr_selectAll; break;
|
||||||
case "shareText": id = R.string.key_descr_shareText; break;
|
case "shareText": id = R.string.key_descr_shareText; break;
|
||||||
case "subscript": id = R.string.key_descr_subscript; break;
|
case "subscript": id = R.string.key_descr_subscript; break;
|
||||||
@@ -276,6 +287,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
return kv.getString();
|
return kv.getString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Format a key combination */
|
||||||
static String format_key_combination(String[] keys)
|
static String format_key_combination(String[] keys)
|
||||||
{
|
{
|
||||||
StringBuilder out = new StringBuilder();
|
StringBuilder out = new StringBuilder();
|
||||||
@@ -287,6 +299,13 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Explain a gesture on a key */
|
||||||
|
static String format_key_combination_gesture(Resources res, String key_name)
|
||||||
|
{
|
||||||
|
return res.getString(R.string.key_descr_gesture) + " + "
|
||||||
|
+ KeyValue.getKeyByName(key_name).getString();
|
||||||
|
}
|
||||||
|
|
||||||
static KeyboardData.PreferredPos key_preferred_pos(String key_name)
|
static KeyboardData.PreferredPos key_preferred_pos(String key_name)
|
||||||
{
|
{
|
||||||
switch (key_name)
|
switch (key_name)
|
||||||
@@ -341,6 +360,16 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
new KeyboardData.KeyPos(0, -1, 3),
|
new KeyboardData.KeyPos(0, -1, 3),
|
||||||
new KeyboardData.KeyPos(0, -1, 4),
|
new KeyboardData.KeyPos(0, -1, 4),
|
||||||
});
|
});
|
||||||
|
case "delete_word":
|
||||||
|
return new KeyboardData.PreferredPos(KeyValue.getKeyByName("backspace"),
|
||||||
|
new KeyboardData.KeyPos[]{
|
||||||
|
new KeyboardData.KeyPos(-1, -1, 3),
|
||||||
|
});
|
||||||
|
case "forward_delete_word":
|
||||||
|
return new KeyboardData.PreferredPos(KeyValue.getKeyByName("backspace"),
|
||||||
|
new KeyboardData.KeyPos[]{
|
||||||
|
new KeyboardData.KeyPos(-1, -1, 4),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return KeyboardData.PreferredPos.DEFAULT;
|
return KeyboardData.PreferredPos.DEFAULT;
|
||||||
}
|
}
|
||||||
@@ -397,6 +426,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
|||||||
setKey(pref_key_of_key_name(key_name));
|
setKey(pref_key_of_key_name(key_name));
|
||||||
setDefaultValue(default_checked);
|
setDefaultValue(default_checked);
|
||||||
setTitle(title);
|
setTitle(title);
|
||||||
|
if (VERSION.SDK_INT >= 26)
|
||||||
setSingleLineTitle(false);
|
setSingleLineTitle(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,32 +8,32 @@
|
|||||||
<fn a="у" b="у̂" />
|
<fn a="у" b="у̂" />
|
||||||
<fn a="cursor_left" b="home" />
|
<fn a="cursor_left" b="home" />
|
||||||
<fn a="cursor_right" b="end" />
|
<fn a="cursor_right" b="end" />
|
||||||
<ctrl a="љ" b=":char symbol='љ':q" />
|
<ctrl a="љ" b="љ:q" />
|
||||||
<ctrl a="њ" b=":char symbol='њ':w" />
|
<ctrl a="њ" b="њ:w" />
|
||||||
<ctrl a="е" b=":char symbol='е':e" />
|
<ctrl a="е" b="е:e" />
|
||||||
<ctrl a="р" b=":char symbol='р':r" />
|
<ctrl a="р" b="р:r" />
|
||||||
<ctrl a="т" b=":char symbol='т':t" />
|
<ctrl a="т" b="т:t" />
|
||||||
<ctrl a="ж" b=":char symbol='ж':y" />
|
<ctrl a="ж" b="ж:y" />
|
||||||
<ctrl a="у" b=":char symbol='у':u" />
|
<ctrl a="у" b="у:u" />
|
||||||
<ctrl a="и" b=":char symbol='и':i" />
|
<ctrl a="и" b="и:i" />
|
||||||
<ctrl a="о" b=":char symbol='о':o" />
|
<ctrl a="о" b="о:o" />
|
||||||
<ctrl a="п" b=":char symbol='п':p" />
|
<ctrl a="п" b="п:p" />
|
||||||
<ctrl a="а" b=":char symbol='а':a" />
|
<ctrl a="а" b="а:a" />
|
||||||
<ctrl a="с" b=":char symbol='с':s" />
|
<ctrl a="с" b="с:s" />
|
||||||
<ctrl a="д" b=":char symbol='д':d" />
|
<ctrl a="д" b="д:d" />
|
||||||
<ctrl a="ф" b=":char symbol='ф':f" />
|
<ctrl a="ф" b="ф:f" />
|
||||||
<ctrl a="г" b=":char symbol='г':g" />
|
<ctrl a="г" b="г:g" />
|
||||||
<ctrl a="х" b=":char symbol='х':h" />
|
<ctrl a="х" b="х:h" />
|
||||||
<ctrl a="ј" b=":char symbol='ј':j" />
|
<ctrl a="ј" b="ј:j" />
|
||||||
<ctrl a="к" b=":char symbol='к':k" />
|
<ctrl a="к" b="к:k" />
|
||||||
<ctrl a="л" b=":char symbol='л':l" />
|
<ctrl a="л" b="л:l" />
|
||||||
<ctrl a="з" b=":char symbol='з':z" />
|
<ctrl a="з" b="з:z" />
|
||||||
<ctrl a="џ" b=":char symbol='џ':x" />
|
<ctrl a="џ" b="џ:x" />
|
||||||
<ctrl a="ц" b=":char symbol='ц':c" />
|
<ctrl a="ц" b="ц:c" />
|
||||||
<ctrl a="в" b=":char symbol='в':v" />
|
<ctrl a="в" b="в:v" />
|
||||||
<ctrl a="б" b=":char symbol='б':b" />
|
<ctrl a="б" b="б:b" />
|
||||||
<ctrl a="н" b=":char symbol='н':n" />
|
<ctrl a="н" b="н:n" />
|
||||||
<ctrl a="м" b=":char symbol='м':m" />
|
<ctrl a="м" b="м:m" />
|
||||||
</modmap>
|
</modmap>
|
||||||
<row>
|
<row>
|
||||||
<key key0="љ" ne="1" se="loc esc"/>
|
<key key0="љ" ne="1" se="loc esc"/>
|
||||||
|
50
srcs/layouts/latn_qwerty_apl.xml
Normal file
50
srcs/layouts/latn_qwerty_apl.xml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<keyboard name="QWERTY (APL)" script="latin" embedded_number_row="true">
|
||||||
|
<row height="0.75">
|
||||||
|
<key c="1" nw="⌶" ne="¨" se="!"/>
|
||||||
|
<key c="2" nw="¯" ne="⍫" se="@" sw="`"/>
|
||||||
|
<key c="3" nw="<" ne="⍒" se="#" sw="~"/>
|
||||||
|
<key c="4" nw="≤" ne="⍋" se="$"/>
|
||||||
|
<key c="5" nw="=" ne="⌽" se="%"/>
|
||||||
|
<key c="6" nw="≥" ne="⍉" sw="^"/>
|
||||||
|
<key c="7" nw=">" ne="⊖" sw="&" se="|"/>
|
||||||
|
<key c="8" nw="≠" ne="⍟" se="∞" sw="*"/>
|
||||||
|
<key c="9" nw="∨" ne="⍱" sw="("/>
|
||||||
|
<key c="0" nw="∧" ne="⍲" sw=")"/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="q" ne="?" se="loc esc"/>
|
||||||
|
<key c="w" ne="⍵" sw="'" se="""/>
|
||||||
|
<key c="e" nw="∊" ne="⍷"/>
|
||||||
|
<key c="r" nw="⍴" sw="←"/>
|
||||||
|
<key c="t" nw="⍨" se="→"/>
|
||||||
|
<key c="y" nw="↑" ne="⌹" se="÷" sw="-"/>
|
||||||
|
<key c="u" nw="↓" ne="⍮" se="×" sw="+"/>
|
||||||
|
<key c="i" nw="⍳" ne="⍸" sw="[" se="{"/>
|
||||||
|
<key c="o" nw="○" ne="⍥" sw="]" se="}"/>
|
||||||
|
<key c="p" nw="⍣" sw="⍬"/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="a" ne="⍺" se="loc tab"/>
|
||||||
|
<key c="s" nw="⌈" ne="ᑈ" se="«"/>
|
||||||
|
<key c="d" nw="⌊" ne="ᐵ" se="»"/>
|
||||||
|
<key c="f" s="…"/>
|
||||||
|
<key c="g" nw="∇" s="_"/>
|
||||||
|
<key c="h" nw="∆"/>
|
||||||
|
<key c="j" nw="∘" ne="⍤" w="⊣" e="⊢"/>
|
||||||
|
<key c="k" ne="⌸"/>
|
||||||
|
<key c="l" nw="⎕" ne="⌷" se="⍪"/>
|
||||||
|
<key c=";" n="⋄" s=","/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="shift" e="loc capslock"/>
|
||||||
|
<key c="z" nw="⊂" se="⍝"/>
|
||||||
|
<key c="x" nw="⊃"/>
|
||||||
|
<key c="c" nw="∩" ne="⍛" sw="." se=":"/>
|
||||||
|
<key c="v" nw="∪" ne="√"/>
|
||||||
|
<key c="b" nw="⊥" ne="⍎" sw="⌿" se="⍀"/>
|
||||||
|
<key c="n" nw="⊤" ne="⍕" sw="/" se="\\"/>
|
||||||
|
<key c="m" nw="≡" ne="≢" sw="∥" se="⍠"/>
|
||||||
|
<key width="2" c="backspace" e="delete"/>
|
||||||
|
</row>
|
||||||
|
</keyboard>
|
50
srcs/layouts/latn_qwerty_bqn.xml
Normal file
50
srcs/layouts/latn_qwerty_bqn.xml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<keyboard name="QWERTY (BQN)" script="latin" embedded_number_row="true">
|
||||||
|
<row height="0.75">
|
||||||
|
<key c="1" nw="˘" ne="⎉" se="!"/>
|
||||||
|
<key c="2" nw="¨" ne="⚇" se="@" sw="`"/>
|
||||||
|
<key c="3" nw="⁼" ne="⍟" se="#" sw="~"/>
|
||||||
|
<key c="4" nw="⌜" ne="◶" se="$"/>
|
||||||
|
<key c="5" nw="´" ne="⊘" se="%"/>
|
||||||
|
<key c="6" nw="˝" ne="⎊" sw="^"/>
|
||||||
|
<key c="7" sw="&" se="|"/>
|
||||||
|
<key c="8" nw="∞" sw="*" se="\\"/>
|
||||||
|
<key c="9" nw="⟨" ne="¯" sw="("/>
|
||||||
|
<key c="0" nw="⟩" ne="•" sw=")"/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="q" nw="⌽" ne="˜" se="loc esc"/>
|
||||||
|
<key c="w" nw="𝕨" sw="'" se="""/>
|
||||||
|
<key c="e" nw="∊" ne="⍷"/>
|
||||||
|
<key c="r" nw="↑" ne="𝕣" sw="←" se="⇐"/>
|
||||||
|
<key c="t" nw="∧" ne="⍋" sw="↩︎:↩" se="→"/>
|
||||||
|
<key c="y" nw="¬" ne="√" se="÷" sw="-"/>
|
||||||
|
<key c="u" nw="⊔" ne="⋆" se="×" sw="+"/>
|
||||||
|
<key c="i" nw="⊏" ne="⊑" sw="[" se="{"/>
|
||||||
|
<key c="o" nw="⊐" ne="⊒" sw="]" se="}"/>
|
||||||
|
<key c="p" nw="π" ne="⍳"/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="a" ne="⍉" se="loc tab"/>
|
||||||
|
<key c="s" nw="𝕤"/>
|
||||||
|
<key c="d" nw="↕︎:↕" se="∾"/>
|
||||||
|
<key c="f" nw="𝕗" se="≍"/>
|
||||||
|
<key c="g" nw="𝕘" s="_"/>
|
||||||
|
<key c="h" nw="⊸" ne="«"/>
|
||||||
|
<key c="j" nw="∘" w="⊣" e="⊢"/>
|
||||||
|
<key c="k" nw="○" ne="⌾"/>
|
||||||
|
<key c="l" nw="⟜" ne="»"/>
|
||||||
|
<key c=";" w="·" n="⋄" s=","/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<key c="shift" e="loc capslock"/>
|
||||||
|
<key c="z" nw="⥊" ne="⋈"/>
|
||||||
|
<key c="x" nw="𝕩"/>
|
||||||
|
<key c="c" nw="↓" ne="˙" sw="." se=":"/>
|
||||||
|
<key c="v" nw="∨" ne="⍒" s="‿"/>
|
||||||
|
<key c="b" s="⌊" n="⌈"/>
|
||||||
|
<key c="n" nw="≤" ne="≥" n="≠" sw="<" se=">" s="="/>
|
||||||
|
<key c="m" nw="≡" ne="≢" sw="/" se="?"/>
|
||||||
|
<key width="2" c="backspace" e="delete"/>
|
||||||
|
</row>
|
||||||
|
</keyboard>
|
18
srcs/special_font/01B.svg
Normal file
18
srcs/special_font/01B.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Based on materialdesignicons.com backspace-outline -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
id="svg1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<path
|
||||||
|
id="text3"
|
||||||
|
style="font-weight:600;font-size:13.3333px;font-family:FreeSans;-inkscape-font-specification:'FreeSans Semi-Bold'"
|
||||||
|
d="m 17.517249,16.883978 c -0.599999,0 -1.199997,0 -1.799996,0 -0.542221,-2.528883 -1.084441,-5.057765 -1.626662,-7.5866476 -0.528888,2.5288826 -1.057775,5.0577646 -1.586663,7.5866476 -0.599998,0 -1.199997,0 -1.799995,0 -0.9155533,-3.239992 -1.8311066,-6.479984 -2.7466599,-9.7199755 0.706665,0 1.4133299,0 2.1199949,0 0.502221,2.4266605 1.004442,4.8533215 1.506663,7.2799815 0.502221,-2.426661 1.004441,-4.853321 1.506662,-7.2799815 0.657776,0 1.315553,0 1.973329,0 0.524443,2.4311048 1.048886,4.8622095 1.573329,7.2933145 0.484443,-2.431105 0.968887,-4.8622097 1.45333,-7.2933145 0.706665,0 1.413329,0 2.119994,0 C 19.3128,10.403994 18.415024,13.643986 17.517249,16.883978 Z M 22,3 c 1.232984,-0.040548 2.168377,1.1810823 2,2.36 -0.0069,4.6147431 0.01374,9.230179 -0.01033,13.844488 C 23.906211,20.390581 22.701093,21.155835 21.58,21 16.677486,20.9972 11.77479,21.0056 6.8723901,20.9958 5.6427252,20.925088 5.1783178,19.667046 4.5442984,18.812248 3.0295323,16.541498 1.5147661,14.270749 0,12 1.8548324,9.2326362 3.6795639,6.4439141 5.5533789,3.6900195 6.2693382,2.7489141 7.4877473,3.0506966 8.5000001,3 13,3 17.5,3 22,3 Z m 0,2 C 17,5 12,5 7,5 5.4266667,7.3333333 3.8533333,9.6666667 2.28,12 c 1.5733333,2.333333 3.1466667,4.666667 4.72,7 5,0 10,0 15,0 0,-4.666667 0,-9.3333333 0,-14 z" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
18
srcs/special_font/01C.svg
Normal file
18
srcs/special_font/01C.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Based on materialdesignicons.com backspace-reverse-outline -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
id="svg1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<path
|
||||||
|
id="text3"
|
||||||
|
style="font-weight:600;font-size:13.3333px;font-family:FreeSans;-inkscape-font-specification:'FreeSans Semi-Bold'"
|
||||||
|
d="m 13.559976,16.719975 c -0.599999,0 -1.199997,0 -1.799996,0 -0.542221,-2.528883 -1.084441,-5.057765 -1.626662,-7.586648 -0.5288876,2.528883 -1.0577752,5.057765 -1.5866628,7.586648 -0.5999985,0 -1.1999969,0 -1.7999954,0 -0.9155532,-3.239992 -1.8311065,-6.479984 -2.7466597,-9.7199759 0.7066649,0 1.4133297,0 2.1199946,0 0.502221,2.4266606 1.0044419,4.8533209 1.5066629,7.2799819 0.5022209,-2.426661 1.0044419,-4.8533213 1.5066628,-7.2799819 0.6577762,0 1.3155526,0 1.9733286,0 0.524443,2.431105 1.048886,4.8622099 1.573329,7.2933149 0.484443,-2.431105 0.968887,-4.8622099 1.45333,-7.2933149 0.706665,0 1.413329,0 2.119994,0 -0.897775,3.2399919 -1.795551,6.4799839 -2.693326,9.7199759 z M 2,3 C 0.76701608,2.9594518 -0.16837714,4.1810822 0,5.36 0.00686259,9.9747431 -0.01373935,14.590179 0.01032577,19.204488 0.09378911,20.390581 1.2989069,21.155835 2.42,21 c 4.902514,-0.0028 9.80521,0.0056 14.70761,-0.0042 1.229665,-0.07074 1.694072,-1.328782 2.328092,-2.18358 C 20.970468,16.541498 22.485234,14.270749 24,12 22.145168,9.2326362 20.320436,6.4439141 18.446621,3.6900195 17.730662,2.7489141 16.512253,3.0506966 15.5,3 11,3 6.5,3 2,3 Z m 0,2 c 5,0 10,0 15,0 1.573333,2.3333333 3.146667,4.6666667 4.72,7 C 20.146667,14.333333 18.573333,16.666667 17,19 12,19 7,19 2,19 2,14.333333 2,9.6666667 2,5 Z" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
@@ -74,7 +74,11 @@ def sync_metadata(value_dir, strings):
|
|||||||
os.makedirs(meta_dir)
|
os.makedirs(meta_dir)
|
||||||
txt_file = os.path.join(meta_dir, fname)
|
txt_file = os.path.join(meta_dir, fname)
|
||||||
with open(txt_file, "w", encoding="utf-8") as out:
|
with open(txt_file, "w", encoding="utf-8") as out:
|
||||||
out.write(string.text.removeprefix('"').removesuffix('"'))
|
out.write(string.text
|
||||||
|
.replace("\\n", "\n")
|
||||||
|
.replace("\\'", "'")
|
||||||
|
.removeprefix('"')
|
||||||
|
.removesuffix('"'))
|
||||||
out.write("\n")
|
out.write("\n")
|
||||||
sync_meta_file("title.txt", ("app_name_release", None))
|
sync_meta_file("title.txt", ("app_name_release", None))
|
||||||
sync_meta_file("short_description.txt", ("short_description", None))
|
sync_meta_file("short_description.txt", ("short_description", None))
|
||||||
|
@@ -42,22 +42,21 @@ public class ComposeKeyTest
|
|||||||
assertEquals(apply("ய", state), KeyValue.makeStringKey("௰", KeyValue.FLAG_SMALLER_FONT));
|
assertEquals(apply("ய", state), KeyValue.makeStringKey("௰", KeyValue.FLAG_SMALLER_FONT));
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyValue apply(String seq) throws Exception
|
@Test
|
||||||
|
public void stringKeys() throws Exception
|
||||||
{
|
{
|
||||||
return apply(seq, ComposeKeyData.compose);
|
int state = ComposeKeyData.shift;
|
||||||
|
assertEquals(apply("𝕨", state), KeyValue.makeStringKey("𝕎"));
|
||||||
|
assertEquals(apply("𝕩", state), KeyValue.makeStringKey("𝕏"));
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyValue apply(String seq, int state) throws Exception
|
KeyValue apply(String seq)
|
||||||
{
|
{
|
||||||
KeyValue r = null;
|
return ComposeKey.apply(ComposeKeyData.compose, seq);
|
||||||
for (int i = 0; i < seq.length(); i++)
|
|
||||||
{
|
|
||||||
r = ComposeKey.apply(state, seq.charAt(i));
|
|
||||||
if (r.getKind() == KeyValue.Kind.Compose_pending)
|
|
||||||
state = r.getPendingCompose();
|
|
||||||
else if (i + 1 < seq.length())
|
|
||||||
throw new Exception("Sequence too long: " + seq);
|
|
||||||
}
|
}
|
||||||
return r;
|
|
||||||
|
KeyValue apply(String seq, int state)
|
||||||
|
{
|
||||||
|
return ComposeKey.apply(state, seq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,6 @@ public class KeyValueParserTest
|
|||||||
@Test
|
@Test
|
||||||
public void parse_macro() throws Exception
|
public void parse_macro() throws Exception
|
||||||
{
|
{
|
||||||
Utils.parse("symbol:abc", KeyValue.makeMacro("symbol", new KeyValue[]{
|
|
||||||
KeyValue.makeStringKey("abc")
|
|
||||||
}, 0));
|
|
||||||
Utils.parse("copy:ctrl,a,ctrl,c", KeyValue.makeMacro("copy", new KeyValue[]{
|
Utils.parse("copy:ctrl,a,ctrl,c", KeyValue.makeMacro("copy", new KeyValue[]{
|
||||||
KeyValue.getSpecialKeyByName("ctrl"),
|
KeyValue.getSpecialKeyByName("ctrl"),
|
||||||
KeyValue.makeStringKey("a"),
|
KeyValue.makeStringKey("a"),
|
||||||
@@ -54,6 +51,14 @@ public class KeyValueParserTest
|
|||||||
Utils.expect_error("unexpected_quote:,");
|
Utils.expect_error("unexpected_quote:,");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
/* Using the [symbol:..] syntax but not resulting in a macro. */
|
||||||
|
public void parse_non_macro() throws Exception
|
||||||
|
{
|
||||||
|
Utils.parse("a:b", KeyValue.makeCharKey('b', "a", 0));
|
||||||
|
Utils.parse("symbol:abc", KeyValue.makeStringKey("abc").withSymbol("symbol"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void parse_string_key() throws Exception
|
public void parse_string_key() throws Exception
|
||||||
{
|
{
|
||||||
@@ -87,9 +92,8 @@ public class KeyValueParserTest
|
|||||||
@Test
|
@Test
|
||||||
public void parse_key_event() throws Exception
|
public void parse_key_event() throws Exception
|
||||||
{
|
{
|
||||||
Utils.parse("symbol:keyevent:85", KeyValue.makeMacro("symbol", new KeyValue[]{
|
Utils.parse("a:keyevent:85", KeyValue.keyeventKey("a", 85, 0));
|
||||||
KeyValue.keyeventKey("", 85, 0)
|
Utils.parse("symbol:keyevent:85", KeyValue.keyeventKey("symbol", 85, KeyValue.FLAG_SMALLER_FONT));
|
||||||
}, 0));
|
|
||||||
Utils.parse("macro:keyevent:85,abc", KeyValue.makeMacro("macro", new KeyValue[]{
|
Utils.parse("macro:keyevent:85,abc", KeyValue.makeMacro("macro", new KeyValue[]{
|
||||||
KeyValue.keyeventKey("", 85, 0),
|
KeyValue.keyeventKey("", 85, 0),
|
||||||
KeyValue.makeStringKey("abc")
|
KeyValue.makeStringKey("abc")
|
||||||
@@ -107,8 +111,8 @@ public class KeyValueParserTest
|
|||||||
{
|
{
|
||||||
Utils.parse(":str:'Foo'", KeyValue.makeStringKey("Foo"));
|
Utils.parse(":str:'Foo'", KeyValue.makeStringKey("Foo"));
|
||||||
Utils.parse(":str flags='dim':'Foo'", KeyValue.makeStringKey("Foo", KeyValue.FLAG_SECONDARY));
|
Utils.parse(":str flags='dim':'Foo'", KeyValue.makeStringKey("Foo", KeyValue.FLAG_SECONDARY));
|
||||||
Utils.parse(":str symbol='Symbol':'Foo'", KeyValue.makeStringKeyWithSymbol("Foo", "Symbol", 0));
|
Utils.parse(":str symbol='Symbol':'Foo'", KeyValue.makeStringKey("Foo").withSymbol("Symbol"));
|
||||||
Utils.parse(":str symbol='Symbol' flags='dim':'Foo'", KeyValue.makeStringKeyWithSymbol("Foo", "Symbol", KeyValue.FLAG_SECONDARY));
|
Utils.parse(":str symbol='Symbol' flags='dim':'f'", KeyValue.makeStringKey("f").withSymbol("Symbol").withFlags(KeyValue.FLAG_SECONDARY | KeyValue.FLAG_SMALLER_FONT));
|
||||||
Utils.parse(":str flags='dim,small':'Foo'", KeyValue.makeStringKey("Foo", KeyValue.FLAG_SECONDARY | KeyValue.FLAG_SMALLER_FONT));
|
Utils.parse(":str flags='dim,small':'Foo'", KeyValue.makeStringKey("Foo", KeyValue.FLAG_SECONDARY | KeyValue.FLAG_SMALLER_FONT));
|
||||||
Utils.parse(":str flags=',,':'Foo'", KeyValue.makeStringKey("Foo")); // Unintentional
|
Utils.parse(":str flags=',,':'Foo'", KeyValue.makeStringKey("Foo")); // Unintentional
|
||||||
Utils.expect_error(":unknown:Foo"); // Unknown kind
|
Utils.expect_error(":unknown:Foo"); // Unknown kind
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package juloo.keyboard2;
|
package juloo.keyboard2;
|
||||||
|
|
||||||
|
import android.view.KeyEvent;
|
||||||
import juloo.keyboard2.KeyValue;
|
import juloo.keyboard2.KeyValue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
@@ -11,7 +12,14 @@ public class KeyValueTest
|
|||||||
@Test
|
@Test
|
||||||
public void equals()
|
public void equals()
|
||||||
{
|
{
|
||||||
assertEquals(KeyValue.makeStringKeyWithSymbol("Foo", "Symbol", 0), KeyValue.makeStringKeyWithSymbol("Foo", "Symbol", 0));
|
assertEquals(KeyValue.makeStringKey("Foo").withSymbol("Symbol"),
|
||||||
|
KeyValue.makeMacro("Symbol", new KeyValue[] { KeyValue.makeStringKey("Foo") }, 0));
|
||||||
|
assertEquals(KeyValue.getSpecialKeyByName("tab"),
|
||||||
|
KeyValue.keyeventKey(0xE00F, KeyEvent.KEYCODE_TAB, KeyValue.FLAG_KEY_FONT | KeyValue.FLAG_SMALLER_FONT));
|
||||||
|
assertEquals(KeyValue.getSpecialKeyByName("tab").withSymbol("t"),
|
||||||
|
KeyValue.keyeventKey("t", KeyEvent.KEYCODE_TAB, 0));
|
||||||
|
assertEquals(KeyValue.getSpecialKeyByName("tab").withSymbol("tab"),
|
||||||
|
KeyValue.keyeventKey("tab", KeyEvent.KEYCODE_TAB, KeyValue.FLAG_SMALLER_FONT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Reference in New Issue
Block a user