Compare commits

...

76 Commits

Author SHA1 Message Date
Jules Aguillon
997b7be4c0 launcher: Animated vector describing swipe gesture
Replace the short video with an animated vector image that shows the
swipe gesture.

This is much lighter and reliable than the mp4 video, which failed to
play on many devices.

Source for the image of the key is in inkscape SVG format in srcs/res
and is converted to an android drawable when needed. The swipe animation
is hand-written.
2024-11-18 00:13:08 +01:00
Jules Aguillon
23097921cf Disable automatic Shift when pressing Compose 2024-11-17 11:10:21 +01:00
Jules Aguillon
237c4e2cc2 Automatic Shift should be disabled when pressing Ctrl
This was caused by a programming error.
2024-11-17 11:09:24 +01:00
Jules Aguillon
9bf0a20226 method.xml: Add Australia 2024-11-17 10:38:33 +01:00
Jules Aguillon
354c0a6f1c compose: Add digits to accent_dot_above 2024-11-16 12:23:25 +01:00
Jules Aguillon
46408572bc font: Use standard symbols for home and end
The glyphs are taken from DejaVuSans, the lines are thickened to improve
readability.
2024-11-16 12:08:36 +01:00
Jules Aguillon
0d51f7ea1e Don't apply Fn to space bar left and right
"home" and "end" on the spacebar slider are not useful.
2024-11-16 11:46:43 +01:00
DocJr90
fcbaa23ccf
Add "scroll_lock" key (#800)
Added "scroll_lock" equates to KeyEvent.KEYCODE_SCROLL_LOCK
2024-11-11 16:28:59 +01:00
Jules Aguillon
70365b48d4 Readme: Update link and status for Calculator++ 2024-10-27 11:12:34 +01:00
Jules Aguillon
3c30e8248e Stable extra keys position when number row is added
Add the extra keys to the keyboard before the number row is added, as
that interferes with the "preferred pos" system.
2024-10-27 11:04:05 +01:00
Kalan Walmsley
73742a853f
Rosé Pine Theme (#788) 2024-10-26 00:54:25 +02:00
solokot
24a6dd0f2c
Update Russian translation (#784) 2024-10-19 11:39:40 +02:00
Anastázius Kaejatídarján
2233250e4d
Slavonictajiki (#776)
new layouts for old slavonic and tajik languages
2024-10-05 23:58:42 +02:00
Jules Aguillon
c4a88e4d5b Update compose sequences for Cyrillic
Mainly add sequences for the combining diacritics.

Co-authored-by: Anastazius Kaejatidarjan <zdarian@asu.edu>
2024-10-05 11:39:11 +02:00
Jules Aguillon
cd2932bde1 Add slavonic combining diacritics
Co-authored-by: Anastazius Kaejatidarjan <zdarian@asu.edu>
2024-10-05 11:28:14 +02:00
Zitrone
6fae23a432
compose/accent_*.json: improvements (more accents) (#770)
compose/accent_*.json: improve/complete implementation
compose/shift.json: uppercase for superscript letters & characters without preapplied uppercase versions
2024-10-05 11:06:24 +02:00
Sergiy Stupar
6e2494ca0b
Update Ukrainian translation (#781) 2024-10-05 10:31:39 +02:00
Jules Aguillon
8a6dc34b2c Add combining diacritics keys
Co-authored-by: Anastazius Kaejatidarjan <zdarian@asu.edu>
2024-10-04 01:09:51 +02:00
Jules Aguillon
9f0cf15d2e Add Fn layer and Compose sequences for Cyrillic 2024-09-29 22:47:57 +02:00
Jules Aguillon
700ec23bd4 Improve Ctrl key labels for Serbian Cyrillic layout
Add the ':char' syntax for defining character keys with a different
symbol.
This new kind of keys is used to implement Ctrl combinations in the
Serbian Cyrillic layout without showing latin letters while the Ctrl
modifier is activated.
2024-09-29 22:05:54 +02:00
Jules Aguillon
fb93d841a5 refactoring: safer KeyboardData.load 2024-09-29 22:05:09 +02:00
Jules Aguillon
a1be402638 Fix crash with complex keys 2024-09-29 21:59:07 +02:00
Jules Aguillon
9f22e53a3b
Add complex keys (#774)
This allows to add new kinds of keys that need more data without making
KeyValue's footprint bigger for common keys.

This changes the [_symbol] field into [_payload], which holds the same
as the previous field for more common keys but can hold bigger objects
for keys of the new "Complex" kind.

This also adds a complex key: String keys with a symbol different than
the outputted string.

Unit tests are added as the Java language is not helpful in making
robust code.
2024-09-29 21:58:22 +02:00
bokidori
e309b76c0a
Increase default label size (#747)
Change default label size to 1.15
2024-09-21 23:30:01 +02:00
Mostafa Khorashadi Zadeh
4d686a8836
Change the place of چ and ژ in Persian Keyboard Layout (#757)
* Change place of "چ" and "ژ"

* rollback unexpected changes
2024-09-21 11:33:59 +02:00
Zitrone
b21bf3fffd
Improve bone layout (#748)
* shell.nix: fix gradle error

error was:
> \> Task :compileDebugJavaWithJavac FAILED
> error: Source option 7 is no longer supported. Use 8 or later.
> error: Target option 7 is no longer supported. Use 8 or later.

fixed by overriding the jdk version for gradle to openjdk17

* layouts/latn_bone: fix layout

- fix alignment with tabs mess
- make like actual bone layout, instead of trying to fit it into a 10 key
  wide keyboard
  - fixes missing üäö
  - fix missing $
  - moves q and ß where they belong
  - remove all of the diacritic keys (they can be added through the
    settings as extra keys)
  - kept the number row extra keys integration into top row
  - kept the idea of compressing , and . into the swipe actions of the
    bottom row
  - kept the number keys as key4 in the layer4 positions (instead of
    moving them to a number row, which i also considered)
2024-09-19 23:57:26 +02:00
Spike
7454389f48
doc: Point to code for built-in bottom row and number row for use as starting points (#756) 2024-09-19 23:48:56 +02:00
Jules Aguillon
b61e9db21e compose: Deduplicate end states
Make compose sequences ending in the same character to share the ending
state.
This reduce the compiled compose key data size from 33kB to 27kB.
2024-09-14 15:13:04 +02:00
Jules Aguillon
24d6b96ad7 Add Serbian to method.xml 2024-09-14 14:28:56 +02:00
Jules Aguillon
13ad05c0b0 doc: Mention switch_clipboard 2024-09-14 14:26:34 +02:00
Jules Aguillon
a8e331c322 Define the Shift modifier using the compose mechanism 2024-09-10 22:50:39 +02:00
Jules Aguillon
b600332595 Define the Fn modifier using the compose mechanism
This removes 100Kb from the app.
2024-09-10 22:43:40 +02:00
Jules Aguillon
e734d1d0e2 compose: Allow c-style comments in json files
Useful to manager growing the collection of sequences.
2024-09-10 22:43:05 +02:00
Jules Aguillon
c57ae83bfa Compose sequences can end in internal key names
This adds the '\n' and '\t' sequences to showcase the new feature.
2024-09-10 22:16:49 +02:00
Jules Aguillon
c886a89b11 Update autocapitalisation on Enter 2024-09-10 21:53:52 +02:00
cknight828
231c08eb97
Add Japanese translation and layout (#743) 2024-09-08 15:46:38 +02:00
IYO-OYI
4eca9caec1
Update Korean translations (#737) 2024-08-24 23:43:42 +02:00
Spike
bc8fef11f1
Modmap: Reorganize (#730)
Put new example in Examples section; put all overview material at start; use "modmap" for the modmap tag but "mapping" for the various subtags; set out each subtag separately; stop illustrating example mappings as complete modmap.
2024-08-18 21:49:30 +02:00
Jules Aguillon
4d0598a011 Fix crash when clipboard contains an image 2024-08-18 21:24:32 +02:00
Jules Aguillon
038f693cae Update target SDK version to 35 2024-07-28 23:07:05 +02:00
bokidori
72d88a5298
Map Fn+Cursor_move to home/end (#728)
Fn modifier switches cursor_left to home key, cursor_right to end key
2024-07-28 21:29:50 +02:00
Jules Aguillon
bd50964651 Release 1.29.1 (42) 2024-07-27 12:35:59 +02:00
Adrian
105a5a2f33
Added supported key for avoiding the pain of auto-caps (#725) 2024-07-27 12:27:05 +02:00
bokidori
62530e98b9
Update cyrl_lynyertz_sr.xml (#727)
Include comprehensive ctrl modmap, enabling the use of ctrl modifier with Serbian Cyrillic keys. Remove clunky fn modmap previously used for just a few actions such as cut/copy/paste/etc.
2024-07-27 12:17:40 +02:00
Nils Brederlow
b3d1a3fc1a
Add new keyevent "menu" (#726)
* Update ExtraKeysPreference.java

add "menu" to array of extra keys

* Update KeyValue.java

add menu keyevent
2024-07-27 12:00:20 +02:00
Jules Aguillon
50a3c0f5bc Fix scaling for layouts with few columns
This was causing a slight padding on the right of 4 columns layouts,
which turned into a large padding when the number row was added.
2024-07-27 00:48:18 +02:00
Jules Aguillon
d8fc4e80e3 Fix crash on Android 6
The call to getLanguageTag() introduced in 4629410 requires API 24.
2024-07-27 00:25:33 +02:00
Jules Aguillon
9d76227982 check_layout.py: Handle compass-point attributes 2024-07-26 00:10:54 +02:00
Jules Aguillon
3967fb8a9f doc: Document the <ctrl /> modmap 2024-07-26 00:04:57 +02:00
Jules Aguillon
29b4b665dc Allow Ctrl modmaps in layouts
The 'ctrl' modmap is different from the other modmaps as it also applies
the built-in Ctrl modifier to the resulting character, even if it was
first modified by the custom modmap.

For example, this will map Ctrl+в to Ctrl+V (not to v):

    <ctrl a="в" b="v"/>

This is intended to add keyboard shortcuts in non-latin layouts.

A caveat is that the latin character appears on the keyboard while Ctrl
is activated.
2024-07-25 23:40:58 +02:00
Jules Aguillon
35f35b27be Update ComposeKeyData
Outdated since 6c786f2
2024-07-25 23:23:53 +02:00
asivery
bf2bec0d4b
Revert "latn_qwerty_pl: Consistent placement for ó" (#714)
This reverts commit c5e9e3ff5c.
2024-07-25 23:22:38 +02:00
bokidori
6e1364b5c2
Add Serbian Latin QWERTY layout (#720)
Adds Serbian Latin QWERTY layout. Serbian language uses both Latin and Cyrillic as its official scripts, and this variant should cover anyone from Serbo-Croatian speaking group that uses Latin script.
2024-07-25 23:21:39 +02:00
bokidori
acddd70435
Add Serbian Cyrillic layout (#718)
Adds Serbian Cyrillic layout. Modmap of Fn key allows for desktop-like easier access to actions such as selectAll, copy, paste, etc. This is because, unlike desktop systems, on mobile ctrl does not combine with cyrillic keys to perform actions.
2024-07-25 23:14:30 +02:00
bokidori
6c786f2a1a
Update accent_circonflexe.json (#719)
Allow combining circumflex \u0302 for Cyrillic vowels, enabling users to express themselves accurately.

ја сам са̂м = I am alone
ја сам сам = I am am

да = yes
да̂ = give

код = at
ко̂д = code

Similar to #437 for aigo.
2024-07-25 23:12:55 +02:00
Jules Aguillon
2696f42144
Allow extending the compose key (#713)
This allows adding more compose sequences without modifying
en_US_UTF_8_Compose.pre.

This is done by grouping sequences files that should be merged together
into a directory. This also allows moving keysymdef.h into that
directory.
2024-07-21 23:37:07 +02:00
Reza Hosseinzadeh
84e10e0470
Improve zwnj/halfspace symbol and Persian layout (#711)
* Fix persian's half-space invisibility
* Add a 0.5 space before ظ in persian
* Change the place of چ in persian
* Change the width of backspace in persian
* Rename zwnj to halfspace in KeyValue.java and beng_provat layout
2024-07-21 13:37:01 +02:00
Jules Aguillon
65f4ffd15b method.xml: Remove overridesImplicitlyEnabledSubtype
This was hoped to fix a random layouts to be shown by default to users
of unsupported languages. This breaks language switching using the
system dialog.
2024-07-20 12:20:24 +02:00
Jules Aguillon
deb611a0d2 Release 1.29.0 (41) 2024-07-15 00:21:59 +02:00
solokot
29f03d0e96
Update Russian translation (#702) 2024-07-14 16:55:34 +02:00
Jules Aguillon
4629410230 Fix unintended layout used for unsupported languages
The arabic layout was used as the default on devices where all the
installed languages are not supported by the keyboard. This is not
intended.
This is probably caused by 'getCurrentInputMethodSubtype' returning the
first layout in the list of disabled subtypes in alphabetical or
language tag order.
Re-ordering the subtypes in method.xml had no effect.

Setting 'overridesImplicitlyEnabledSubtype' in method.xml has no
measured effect.
2024-07-14 16:15:18 +02:00
Jules Aguillon
b9526d918d Fix crash when using a different script layout
This might happen when using a layout of a different script than the
installed languages.
2024-07-14 15:52:24 +02:00
Mehmet Ali
db3b021bfc
Update Turkish Translations (#699) 2024-07-13 11:16:06 +02:00
Spike
3862f4d6ba
doc: Re-add text for better overview (#697) 2024-07-10 22:47:58 +02:00
Edgars
555ede0fee
Add missing Latvian translations (#698) 2024-07-09 19:36:05 +02:00
Spike
7b90294b57
Clerical edits related to locale_extra_keys (#696)
* Post-edit on Metadata

① Tell reader exactly what to type to disable locale_extra_keys, as with prev. bullet
② Values should be quoted
③ Rephrase one passive

* locale_extra_keys obviates 2nd example under modmap
2024-07-08 22:45:11 +02:00
Spike
69881e75c7
Update Spanish translations (#695) 2024-07-08 00:17:16 +02:00
Chasm Solacer
533e22ab4f
Update Polish translation (#691) 2024-07-07 14:21:35 +02:00
Sergiy Stupar
46c86a05bd
Update Ukrainian translation (#692) 2024-07-07 14:21:03 +02:00
Validbit
e053d4b20c
Update Czech strings.xml (#693) 2024-07-07 14:20:13 +02:00
polyctena
c1e19a21d0
Update values-de/strings.xml (#694) 2024-07-07 14:19:33 +02:00
Jules Aguillon
3164215879 Add locale_extra_keys keyboard attribute
This attribute can be used to disable adding the extra keys from
method.xml.
2024-07-06 23:09:51 +02:00
Jules Aguillon
99367a9ec6 Update French translations 2024-07-06 22:42:56 +02:00
TadaCZE
cd0f61da74
Add support for Android 12+ dynamic colors (#647) 2024-07-06 22:32:01 +02:00
Jules Aguillon
ce57b5a4a2 Make the emoji and clipboard bottom rows consistent 2024-07-06 22:19:34 +02:00
Jules Aguillon
bf3b9c374e
Clipboard pane (#681)
This adds the clipboard pane, which allows to save an arbitrary number of
clipboards and to paste them later. The key can be disabled in settings.

Checking the "Recently copied text" checkbox will cause the keyboard to keep a
temporary history of copied text. This history can only contain 3 elements
which expire after 5 minutes.
If this is unchecked, no history is collected.

History entries can be pinned into the persisted list of pins.
2024-07-06 22:16:37 +02:00
143 changed files with 4497 additions and 655 deletions

View File

@ -190,6 +190,12 @@ As translations need to be updated regularly, you can subscribe to this issue
to receive a notification when an update is needed:
https://github.com/Julow/Unexpected-Keyboard/issues/373
### Adding Compose key sequences
New Compose sequences can be added into `srcs/compose/compose/extra.json`.
If a entirely new family of sequences were to be added, a new `.json` file can
be created in the same directory to host them.
### Adding key combinations
Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.

View File

@ -25,7 +25,7 @@ Usage: to apply the symbols located in the corners of each key, slide your finge
| <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
## Similar apps
* [Calculator++](https://github.com/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators. Works up to Android 13 but maybe unmaintained.
* [Calculator++](https://git.bubu1.eu/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators.
## Contributing

Binary file not shown.

View File

@ -2,6 +2,10 @@ plugins {
id 'com.android.application' version '8.1.1'
}
dependencies {
testImplementation "junit:junit:4.13.2"
}
android {
namespace 'juloo.keyboard2'
compileSdk 34
@ -9,18 +13,22 @@ android {
defaultConfig {
applicationId "juloo.keyboard2"
minSdk 11
targetSdkVersion 34
versionCode 40
versionName "1.28.0"
targetSdkVersion 35
versionCode 42
versionName "1.29.1"
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['srcs']
java.srcDirs = ['srcs/juloo.keyboard2']
res.srcDirs = ['res', 'build/generated-resources']
assets.srcDirs = ['assets']
}
test {
java.srcDirs = ['test']
}
}
signingConfigs {
@ -84,9 +92,6 @@ android {
}
}
dependencies {
}
tasks.register('buildKeyboardFont') {
println "\nBuilding assets/special_font.ttf"
mkdir "$buildDir"
@ -151,7 +156,7 @@ tasks.register('compileComposeSequences') {
println "\nGenerating ${out}"
exec {
def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
it.name.endsWith(".pre") || it.name.endsWith(".json")
!it.name.endsWith(".py") && !it.name.endsWith(".md")
}
workingDir = projectDir
commandLine("python", "srcs/compose/compile.py", *sequences)

View File

@ -29,11 +29,22 @@ Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >
0 warnings
# cyrl_jcuken_uk
0 warnings
# cyrl_lynyertz_sr
0 warnings
# cyrl_ueishsht
0 warnings
# cyrl_yaverti
Layout includes some ASCII punctuation but not all, missing: ~
1 warnings
# cyrl_yqukeng_tj
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
2 warnings
# cyrl_yxukeng_os
Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
3 warnings
# deva_alt
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
Layout doesn't define some important keys, missing: loc esc, loc tab
@ -62,8 +73,8 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
# latn_bepo_fr
0 warnings
# latn_bone
Layout includes some ASCII punctuation but not all, missing: $
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward
Layout doesn't define some important keys, missing: loc esc, loc tab
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
2 warnings
# latn_colemak
Some keys contain whitespaces, unexpected: ́
@ -71,7 +82,8 @@ Some keys contain whitespaces, unexpected: ́
# latn_dvorak
0 warnings
# latn_neo2
0 warnings
Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard
1 warnings
# latn_qwerty_br
0 warnings
# latn_qwerty_cz
@ -84,6 +96,8 @@ Some keys contain whitespaces, unexpected: ́
0 warnings
# latn_qwerty_hu
0 warnings
# latn_qwerty_jp
0 warnings
# latn_qwerty_lv
0 warnings
# latn_qwerty_no
@ -97,6 +111,8 @@ Duplicate keys: !, ', ,, -, ., ?
1 warnings
# latn_qwerty_sk
0 warnings
# latn_qwerty_sr
0 warnings
# latn_qwerty_tly
Duplicate keys: a, c, j, q
Layout doesn't define some important keys, missing: loc esc, loc tab

View File

@ -6,7 +6,14 @@ warning_count = 0
KNOWN_NOT_LAYOUT = set([
"number_row", "numpad", "pin",
"bottom_row", "settings", "method",
"greekmath", "numeric", "emoji_bottom_row" ])
"greekmath", "numeric", "emoji_bottom_row",
"clipboard_bottom_row" ])
KEY_ATTRIBUTES = set([
"key0",
"key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8",
"nw", "ne", "sw", "se", "w", "e", "n", "s"
])
def warn(msg):
global warning_count
@ -38,7 +45,7 @@ def unexpected_keys(keys, symbols, msg):
def parse_row_from_et(row, keys, dup):
for key in row:
for attr in key.keys():
if attr.startswith("key"):
if attr in KEY_ATTRIBUTES:
k = key.get(attr).removeprefix("\\")
if k in keys: dup.add(k)
keys.add(k)

View File

@ -34,11 +34,20 @@ Here is a complete keyboard file with a single row containing an "a" key on the
</keyboard>
## Keyboard metadata
The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses the whole keyboard. The following properties may be used (The first two appear in the example above):
* `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”.
* `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`.
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`.
* `bottom_row`: Whether or not to show the common bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row=false` to disable the built-in bottom row.
* `bottom_row`: Whether or not to show the built-in bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
+ We recommend your layout use the built-in bottom row, because it is still evolving and your layout will incorporate innovations in future versions. However, to define your own, the current definition of the bottom row is in [bottom_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/bottom_row.xml). You can copypaste this XML into your custom layout as a starting point.
+ Likewise, the current definition of the top (number) row is in [number_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/number_row.xml).
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
@ -98,39 +107,44 @@ Normally, a key's width is 1.0 unit. Unexpected Keyboard occupies the full width
* `indication`: An optional extra legend to show under the main label. For example, `<key key0="2" indication="ABC" />` displays ABC at the bottom of the 2 key, as on a pinpad or some telephones. If the key also defines a downward swipe with `s` or `key8`, the legends overlap.
### Possible key values
Built-in strings that assign a special function to a key are described in [this page](Possible-key-values.md). For example, `se="copy"` means a southeasterly swipe produces the Copy key. If a key value does not match any of the built-in strings, it outputs that text _verbatim_. For example, `key0="a"` simply outputs the letter a.
The possible key values are described in [this page](Possible-key-values.md).
In a layout, a key value can also start with the `loc` prefix. These are place-holders, the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use.
For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
In a layout, a key value can also start with the `loc` prefix. These are place-holders; the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use. For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
## Modmap
The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap.
The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap. It can contain any number of mappings. Each mapping has an `a` property and a `b` property and maps the `a` key to the `b` key. Valid values are listed in [Possible key values](Possible-key-values.md).
A modmap can contain the following tags, each of which must have an `a` and a `b` property:
* `<shift a="before" b="after" />` If the Shift modifier is on, the key `before` is changed into `after`.
* `<fn a="before" b="after" />` If the Fn modifier is on, the key `before` is changed into `after`.
The following mappings are supported:
Valid values for `before` and `after` are listed in [Possible key values](Possible-key-values.md).
```xml
<shift a="before" b="after" />
```
This means that when the Shift modifier is on, the key `before` is changed into `after`.
There can be as many of these tags inside `<modmap>` as needed.
```xml
<fn a="before" b="after" />
```
This means that when the Fn modifier is on, the key `before` is changed into `after`.
The clockwise circle and the round-trip gestures are affected by both Shift and Fn modmaps. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
```xml
<ctrl a="before" b="after" />
```
This means that when the Ctrl modifier is on, the key `before` is changed into `after`. The `<ctrl />` mapping is special in that the Ctrl modifier is applied to `after` after the mapping.
The clockwise circle and the round-trip gestures are affected by both `<shift />` and `<fn />` mappings. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
### Examples
① Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following modmap:
① Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following mapping:
<modmap>
<shift a="i" b="İ" />
</modmap>
② By default, `Fn`+`e` produces the € character. This can be inhibited with the following modmap, which maps the modified `e` key to itself:
```xml
<shift a="i" b="İ" />
```
② Cyrillic layouts have no V key. A layout can define Ctrl-V with the following mapping:
<modmap>
<fn a="e" b="e" />
</modmap>
These two examples are each shown in a modmap, for completeness. However, a layout can have at most one modmap, containing all the desired `<shift>` and `<fn>` tags.
```xml
<ctrl a="в" b="v" />
```
This maps Ctrl+в to Ctrl+V—not to v.
## Portrait vs. landscape
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. So you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention.

View File

@ -46,7 +46,8 @@ These keys are sent to apps, which are free to ignore them. The keyboard does no
`page_up`, `page_down`,
`home`, `end`,
`backspace`, `delete`,
`insert`, `f1`-`f12`,
`insert`, `scroll_lock`,
`f1`-`f12`,
`tab`, `copy`,
`paste`, `cut`,
`selectAll`, `pasteAsPlainText`,
@ -119,7 +120,7 @@ Keys ending in `_placeholder` are normally hidden unless the Fn key is pressed.
`ole`, `ole_placeholder`,
`meteg`, `meteg_placeholder`
## Unexpected Keyboard specific
## Keyboard behavior keys
Value | Meaning
:--------------------- | :------
`config` | Gear icon; opens Unexpected Keyboard settings.
@ -130,6 +131,7 @@ Value | Meaning
`switch_forward` | Change the keyboard layout, as long as Unexpected Keyboard has multiple keyboard layouts enabled in the settings.
`switch_backward` | Change the keyboard layout to the previous one in the list.
`switch_greekmath` | Switch to the Greek & Math Symbols layer.
`switch_clipboard` | Switch to the clipboard pane.
`change_method` | Open the input method picker dialog.
`change_method_prev` | Switch to the previously used input method.
`action` | Performs a special context-sensitive operation related to the Enter key. For example, in the Twitter (X) app, `enter` adds a new line, while `action` posts.
@ -147,3 +149,42 @@ These keys are known to do nothing.
These keys are normally hidden unless the Fn modifier is activated.
`f11_placeholder` | `f12_placeholder`
## Complex keys
More complex keys are of this form:
```
:<kind> <attributes>:<payload>
```
Where `<kind>` is one of the kinds documented below and `<attributes>` is a
space separated list of attributes. `<payload>` depends on the `<kind>`.
Attributes are:
- `symbol='Sym'` specifies the symbol to be shown on the keyboard.
- `flags='<flags>'` changes the behavior of the key.
`<flags>` is a coma separated list of:
+ `dim`: Make the symbol dimmer.
+ `small`: Make the symbol smaller.
### Kind `str`
Defines a key that outputs an arbitrary string. `<payload>` is a string wrapped
in single-quotes (`'`), escaping of other single quotes is allowed with `\'`.
For example:
- `:str:'Arbitrary string with a \' inside'`
- `:str symbol='Symbol':'Output string'`
### Kind `char`
Defines a key that outputs a single character. `<payload>` is the character to
output, unquoted.
This kind of key can be used to define a character key with a different symbol
on it. `char` keys can be modified by `ctrl` and other modifiers, unlike `str`
keys.
For example:
- `:char symbol='q':љ`, which is used to implement `ctrl` shortcuts in cyrillic
layouts.

View File

@ -0,0 +1,8 @@
Clipboard pane
New Monet theme
Improvements to custom layouts
Options to disable key repeat and the circle gesture
Options to disable the Tab and Esc keys
Many thanks to the contributors: @alotbsol555 @ChasmSolacer @eandersons @polyctena @Sestowner @solokot @Spike-from-NH @TadaCZE @V6lhost @Validbit

View File

@ -0,0 +1,6 @@
Fix crash on Android 6.
Fix scaling issues for layouts with few columns.
Added Serbian layouts.
Layout and compose key tweaks. Improvements to custom layouts. Added Menu key.
Many thanks to the contributors: @adrian4096 @asivery @bokidori @dingodoppelt @RZHSSNZDH

View File

@ -0,0 +1,7 @@
このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
このアプリは元々はTermuxでのプログラミング用に設計されました。
しかし、今では普段の入力にも適しています。
PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。

View File

@ -0,0 +1 @@
軽量でプライバシーに配慮したAndroid用仮想キーボード

View File

@ -0,0 +1 @@
Unexpected Keyboard

View File

@ -1,18 +1,6 @@
이 앱은 안드로이드용 가상 키보드입니다. 주요 기능은 스와이프 제스처를 사용하여 모든 ASCII 문자를 쉽게 입력할 수 있다는 점과 악센트 및 수정자 키를 위한 데드 키와 특수 키(tab, esc, 방향키 등)이 있다는 것입니다.
주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
키보드는 각 키의 모서리에 최대 4개의 추가 문자를 표시합니다. 이러한 추가 문자는 키에서 손가락을 스와이프하여 적중됩니다.
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
지금은 일상적인 용도로도 완벽합니다.
일부 하이라이트 기능:
- PC 키보드에서 사용할 수 있는 모든 문자 및 특수 키를 사요 가능합니다. 이것은 Termux와 같은 앱을 사용하는 데 효과적입니다.
- 여기에는 Tab, Esc, 방향키 및 function 키뿐만이 아닌 Ctrl 및 Alt 키도 포함되어 있습니다 !
- 악센트 키는 데드 키를 사용하여 액세스할 수 있습니다. 먼저 악센트 키를 활성화한 다음 악센트 문자를 입력합니다.
- 매우 가볍고 빠릅니다. Google 키보드보다 500배, 기본 키보드보다 15배 적은 공간을 사용합니다. 광고와 사용 기록 추적 없음.
- 다중 레이아웃: QWERTY, QWERTZ, AZERTY. 다양한 테마: White, Dark, OLED Black. 또한 다른 많은 옵션들.
다른 가상 키보드와 마찬가지로 시스템 설정에서 활성화해야 합니다. 시스템 설정을 열고 다음으로 이동합니다.
시스템 > 언어 및 입력 > 키보드 > 키보드 관리.
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.

View File

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable">
<vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40">
<path android:name="trace" android:pathData="M 0 0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/>
</vector>
</aapt:attr>
<target android:name="trace">
<aapt:attr name="android:animation">
<set>
<objectAnimator android:propertyName="fillAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator
android:propertyName="pathData"
android:duration="700"
android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0"
android:valueTo=" M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31 ,4"
android:valueType="pathType"
android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="fillAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="35dp"
android:height="40dp"
android:viewportWidth="35.0"
android:viewportHeight="40.0">
<path
android:pathData="M11.26,10.13L23.74,10.13A1.13,1.13 0,0 1,24.87 11.26L24.87,28.74A1.13,1.13 0,0 1,23.74 29.88L11.26,29.88A1.13,1.13 0,0 1,10.13 28.74L10.13,11.26A1.13,1.13 0,0 1,11.26 10.13z"
android:fillAlpha="1"
android:strokeColor="#404040"
android:fillColor="#333333"
android:strokeWidth="0.251"
android:strokeAlpha="1"/>
<path
android:pathData="m16.64,17.64l0,3.21q0,0.41 0.16,0.58 0.17,0.17 0.5,0.17 0.31,0 0.61,-0.19 0.29,-0.19 0.46,-0.46l0,-3.33l0.98,0l0,4.6l-0.84,0l-0.06,-0.59q-0.26,0.34 -0.65,0.53 -0.39,0.18 -0.8,0.18 -0.67,0 -1,-0.37 -0.33,-0.37 -0.33,-1.01l0,-3.33z"
android:fillColor="#fdfdfd"
android:strokeWidth="0.265729"/>
<path
android:pathData="m12.52,24.71q0.3,0 0.54,0.09 0.25,0.09 0.49,0.35l-0.37,0.33q-0.14,-0.16 -0.28,-0.23 -0.14,-0.08 -0.34,-0.08 -0.27,0 -0.41,0.15 -0.14,0.15 -0.14,0.39 0,0.17 0.08,0.31 0.08,0.14 0.23,0.22 0.15,0.08 0.33,0.08l1.58,0l0,0.46l-0.47,0l0,1.56q-0.1,0.12 -0.26,0.24 -0.16,0.12 -0.41,0.21 -0.24,0.08 -0.58,0.08 -0.45,0 -0.75,-0.17 -0.3,-0.17 -0.44,-0.45 -0.15,-0.28 -0.15,-0.6 0,-0.46 0.24,-0.74 0.24,-0.28 0.66,-0.37l0,-0.02q-0.25,-0.06 -0.4,-0.18 -0.15,-0.12 -0.22,-0.3 -0.07,-0.17 -0.07,-0.37 0,-0.26 0.14,-0.48 0.14,-0.22 0.4,-0.35 0.26,-0.13 0.6,-0.13zM13.18,26.79l-0.58,0q-0.28,0 -0.45,0.12 -0.17,0.12 -0.26,0.32 -0.08,0.19 -0.08,0.39 0,0.2 0.08,0.37 0.08,0.17 0.24,0.28 0.16,0.1 0.42,0.1 0.21,0 0.37,-0.07 0.16,-0.07 0.26,-0.19z"
android:fillColor="#cccccc"
android:strokeWidth="0.265729"/>
<path
android:pathData="m22.12,15.25 l-0.61,-0.19 1.54,-3.37l-1.84,0l0,-0.51l2.49,0l0,0.47z"
android:fillColor="#cccccc"
android:strokeWidth="0.265729"/>
</vector>

View File

@ -0,0 +1 @@
<!-- drawable/file_send.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M14,2H6C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M12.54,19.37V17.37H8.54V15.38H12.54V13.38L15.54,16.38L12.54,19.37M13,9V3.5L18.5,9H13Z" /></vector>

View File

@ -0,0 +1 @@
<!-- drawable/bookmark_plus.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M17,3A2,2 0 0,1 19,5V21L12,18L5,21V5C5,3.89 5.9,3 7,3H17M11,7V9H9V11H11V13H13V11H15V9H13V7H11Z" /></vector>

View File

@ -0,0 +1 @@
<!-- drawable/delete.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z" /></vector>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/clipboard_entry_text" style="@style/clipboardEntry"/>
<LinearLayout style="@style/clipboardEntryButtons">
<View android:id="@+id/clipboard_entry_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
<View android:id="@+id/clipboard_entry_addpin" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_save"/>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="?attr/colorKeyboard" android:hardwareAccelerated="false">
<ScrollView android:layout_width="fill_parent" android:layout_height="@dimen/clipboard_view_height">
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content">
<juloo.keyboard2.ClipboardHistoryCheckBox android:text="@string/clipboard_history_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
<juloo.keyboard2.ClipboardHistoryView android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
<TextView android:text="@string/clipboard_pin_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
<juloo.keyboard2.ClipboardPinView android:id="@+id/clipboard_pin_view" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
</LinearLayout>
</ScrollView>
<juloo.keyboard2.Keyboard2View layout="@xml/clipboard_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/colorKeyboard"/>
</LinearLayout>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/clipboard_pin_text" style="@style/clipboardEntry" android:maxLines="3"/>
<LinearLayout style="@style/clipboardEntryButtons">
<View android:id="@+id/clipboard_pin_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
<View android:id="@+id/clipboard_pin_remove" style="@style/clipboardEntryButton" android:background="@drawable/ic_delete"/>
</LinearLayout>
</LinearLayout>

View File

@ -4,7 +4,7 @@
<TextView style="@style/paragraph" android:text="@string/launcher_description"/>
<Button style="@style/paragraph" android:text="@string/launcher_button_imesettings" android:onClick="launch_imesettings" android:layout_width="wrap_content"/>
<Button style="@style/paragraph" android:text="@string/launcher_button_imepicker" android:onClick="launch_imepicker" android:layout_width="wrap_content"/>
<VideoView android:id="@+id/launcher_intro_video" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center"/>
<ImageView style="@style/anim" android:id="@+id/launcher_anim_swipe" android:background="@drawable/doc_key_u" android:src="@drawable/doc_anim_swipe"/>
<TextView android:id="@+id/launcher_tryhere_text" style="@style/paragraph" android:text="@string/launcher_tryhere"/>
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text" android:hint="@string/launcher_tryhere_hint" android:importantForAutofill="no"/>
<TextView style="@style/paragraph" android:text="@string/launcher_sourcecode"/>

Binary file not shown.

View File

@ -38,9 +38,9 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_category_typing">Psaní</string>
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string>
<string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Doba pro aktivaci dlouhého podržení</string>
<string name="pref_long_interval_title">Interval opakování znaků</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Opakování kláves při držení</string>
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string>
<string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string>
<string name="pref_category_behavior">Chování</string>
@ -68,6 +68,10 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_theme_e_epaper">ePapír</string>
<string name="pref_theme_e_desert">Poušťě</string>
<string name="pref_theme_e_jungle">Džungle</string>
<string name="pref_theme_e_monet">Monet (dle systému)</string>
<string name="pref_theme_e_monetlight">Monet (Světlý)</string>
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
<string name="pref_swipe_dist_e_short">Krátká</string>
<string name="pref_swipe_dist_e_default">Běžná</string>
@ -78,11 +82,11 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_border_config_title">Přizpůsobit okraje</string>
<string name="pref_border_width_title">Šířka okraje</string>
<string name="pref_corners_radius_title">Poloměr okraje</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_circle_sensitivity_title">Citlivost kruhového gesta</string>
<string name="pref_circle_sensitivity_e_high">Vysoká</string>
<string name="pref_circle_sensitivity_e_medium">Střední</string>
<string name="pref_circle_sensitivity_e_low">Nízká</string>
<string name="pref_circle_sensitivity_e_disabled">Deaktivováno</string>
<string name="key_action_next">Další</string>
<string name="key_action_done">Dokončit</string>
<string name="key_action_go">Spustit</string>
@ -116,4 +120,10 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Správce schránky</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
<string name="clipboard_pin_heading">Připnout</string>
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
<string name="clipboard_remove_confirmed">Ano</string>
</resources>

View File

@ -38,9 +38,9 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="pref_category_typing">Tippen</string>
<string name="pref_swipe_dist_title">Länge der Wischgeste</string>
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Zeitüberschreitung durch langes Drücken</string>
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Tastenwiederholung bei langem Drücken</string>
<string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string>
<string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string>
<string name="pref_category_behavior">Verhalten</string>
@ -68,6 +68,10 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Wüste</string>
<string name="pref_theme_e_jungle">Dschungel</string>
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Hell)</string>
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
<string name="pref_swipe_dist_e_short">Kurz</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -116,4 +120,10 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="key_descr_page_down">Bild ab</string>
<string name="key_descr_home">Pos1</string>
<string name="key_descr_end">Ende</string>
<string name="key_descr_clipboard">Clipboard-Manager</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
<string name="clipboard_pin_heading">Angeheftet</string>
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
<string name="clipboard_remove_confirmed">Ja</string>
</resources>

View File

@ -38,9 +38,9 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_category_typing">Escritura</string>
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Duración para toque largo</string>
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Permitir repetición de toque largo</string>
<string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string>
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string>
<string name="pref_category_behavior">Comportamiento</string>
@ -68,6 +68,10 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desierto</string>
<string name="pref_theme_e_jungle">Selva</string>
<string name="pref_theme_e_monet">Monet (de sistema)</string>
<string name="pref_theme_e_monetlight">Monet (claro)</string>
<string name="pref_theme_e_monetdark">Monet (oscuro)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
<string name="pref_swipe_dist_e_short">Corta</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -78,11 +82,11 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_border_config_title">Bordes personalizados</string>
<string name="pref_border_width_title">Ancho de bordes</string>
<string name="pref_corners_radius_title">Radio de rincones</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_circle_sensitivity_title">Sensibilidad a gestos circulares</string>
<string name="pref_circle_sensitivity_e_high">Alta</string>
<string name="pref_circle_sensitivity_e_medium">Mediana</string>
<string name="pref_circle_sensitivity_e_low">Baja</string>
<string name="pref_circle_sensitivity_e_disabled">Apagada</string>
<string name="key_action_next">Siguiente</string>
<string name="key_action_done">Hecho</string>
<string name="key_action_go">Ir</string>
@ -116,4 +120,10 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="key_descr_page_down">Re Pág</string>
<string name="key_descr_home">Inicio</string>
<string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Arreglar portapapeles</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Textos recién copiados</string>
<string name="clipboard_pin_heading">Pegado</string>
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
<string name="clipboard_remove_confirmed"></string>
</resources>

View File

@ -68,6 +68,10 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_theme_e_epaper">ای-پیپر</string>
<!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
<string name="pref_swipe_dist_e_short">کوتاه</string>
<string name="pref_swipe_dist_e_default">عادی</string>
@ -116,4 +120,10 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

View File

@ -38,9 +38,9 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_category_typing">Saisie</string>
<string name="pref_swipe_dist_title">Distance de swipe</string>
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Delai de l\'appui long</string>
<string name="pref_long_interval_title">Écart entre les répétitions</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Répétition par appui long</string>
<string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string>
<string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string>
<string name="pref_category_behavior">Comportement</string>
@ -48,8 +48,8 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
<string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string>
<string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string>
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<string name="pref_vibrate_custom">Vibrations personnalisées</string>
<string name="pref_vibrate_duration_title">Intensité des vibrations</string>
<string name="pref_pin_entry_enabled_title">Clavier PIN</string>
<string name="pref_pin_entry_enabled_summary">Lors de la saisie de nombres, de dates et de numéros de téléphone</string>
<string name="pref_category_style">Style</string>
@ -68,6 +68,10 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (Système)</string>
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Très courte</string>
<string name="pref_swipe_dist_e_short">Courte</string>
<string name="pref_swipe_dist_e_default">Normale</string>
@ -75,14 +79,14 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_swipe_dist_e_very_far">Très longue</string>
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
<!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_border_config_title">Bordures personnalisées</string>
<string name="pref_border_width_title">Largeur des bordures</string>
<string name="pref_corners_radius_title">Rayon des coins</string>
<string name="pref_circle_sensitivity_title">Sensibilité du mouvement en cercle</string>
<string name="pref_circle_sensitivity_e_high">Haute</string>
<string name="pref_circle_sensitivity_e_medium">Moyenne</string>
<string name="pref_circle_sensitivity_e_low">Basse</string>
<string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
<string name="key_action_next">Suiv.</string>
<string name="key_action_done">Fin</string>
<string name="key_action_go">Aller</string>
@ -94,11 +98,11 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<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_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
<string name="launcher_tryhere_hint">Essayer ici</string>
<string name="key_descr_capslock">Verrouillage majuscules</string>
<!-- <string name="key_descr_compose">Compose</string> -->
<string name="key_descr_compose">Compose</string>
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<string name="key_descr_change_method">Changer de clavier</string>
<string name="key_descr_voice_typing">Saisie vocale</string>
<string name="key_descr_copy">Copier</string>
<string name="key_descr_paste">Coller</string>
@ -116,4 +120,10 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="key_descr_page_down">Page suivante</string>
<string name="key_descr_home">Début</string>
<string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Presse-papiers</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Texte récemment copié</string>
<string name="clipboard_pin_heading">Épinglé</string>
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
<string name="clipboard_remove_confirmed">Oui</string>
</resources>

View File

@ -68,6 +68,10 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
<string name="pref_swipe_dist_e_short">Breve</string>
<string name="pref_swipe_dist_e_default">Normale</string>
@ -116,4 +120,10 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

130
res/values-ja/strings.xml Normal file
View File

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
<string name="store_description">"このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
このアプリは元々はTermuxでのプログラミング用に設計されました。
しかし、今では普段の入力にも適しています。
PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。"</string>
<string name="settings_activity_label">Unexpected Keyboardの設定</string>
<string name="pref_portrait">縦向き</string>
<string name="pref_landscape">横向き</string>
<string name="pref_category_layout">レイアウト</string>
<string name="pref_label_brightness">文字の明るさ</string>
<string name="pref_keyboard_opacity">背景の不透明度</string>
<string name="pref_key_opacity">キーの不透明度</string>
<string name="pref_key_activated_opacity">押下中のキーの不透明度</string>
<string name="pref_layout_e_system">システム設定</string>
<string name="pref_layout_e_custom">カスタムレイアウト</string>
<string name="pref_layouts_add">レイアウトを追加</string>
<string name="pref_layouts_item">レイアウト %1$d: %2$s</string>
<string name="pref_layouts_remove_custom">レイアウトを削除</string>
<string name="pref_custom_layout_title">カスタムレイアウト</string>
<string name="pref_show_numpad_title">テンキーを表示</string>
<string name="pref_show_numpad_never">表示しない</string>
<string name="pref_show_numpad_landscape">横向きの時は表示</string>
<string name="pref_show_numpad_always">表示する</string>
<string name="pref_number_row_title">数字の行を表示</string>
<string name="pref_number_row_summary">テンキーが非表示の場合最上段に数字の行を追加します</string>
<string name="pref_numpad_layout">テンキーのレイアウト</string>
<string name="pref_numpad_layout_e_high_first">大きい数字を上に</string>
<string name="pref_numpad_layout_e_low_first">小さい数字を上に</string>
<string name="pref_extra_keys_title">追加のキーの設定</string>
<string name="pref_extra_keys_custom">キーを追加</string>
<string name="pref_extra_keys_internal">キーボードに表示するキーを選択</string>
<string name="pref_category_typing">入力</string>
<string name="pref_swipe_dist_title">スワイプ距離</string>
<string name="pref_swipe_dist_summary">キーの角をスワイプする距離 (%s)</string>
<string name="pref_long_timeout_title">キー長押しの時間</string>
<string name="pref_long_interval_title">キーを連続入力する間隔</string>
<string name="pref_keyrepeat_enabled">長押しでキーを連続入力する</string>
<string name="pref_lock_double_tap_title">ShiftをダブルタップでCaps Lock</string>
<string name="pref_lock_double_tap_summary">どの装飾キーも長押しで固定できます</string>
<string name="pref_category_behavior">挙動</string>
<string name="pref_autocapitalisation_title">自動大文字化</string>
<string name="pref_autocapitalisation_summary">文章の先頭でShiftキーを自動入力</string>
<string name="pref_switch_input_immediate_title">最後に使用したキーボードに切替</string>
<string name="pref_switch_input_immediate_summary">キーボード切替キーの挙動</string>
<string name="pref_vibrate_custom">キーボード独自の振動設定</string>
<string name="pref_vibrate_duration_title">振動の時間</string>
<string name="pref_pin_entry_enabled_title">PIN入力</string>
<string name="pref_pin_entry_enabled_summary">数字・日付・電話番号入力時</string>
<string name="pref_category_style">表示</string>
<string name="pref_margin_bottom_title">下の余白</string>
<string name="pref_keyboard_height_title">キーボードの高さ</string>
<string name="pref_horizontal_margin_title">左右の余白</string>
<string name="pref_character_size_title">文字の大きさ</string>
<string name="pref_character_size_summary">キーボードに表示される文字の大きさ (%.2fx)</string>
<string name="pref_theme">テーマ</string>
<string name="pref_theme_e_system">システム設定</string>
<string name="pref_theme_e_dark">ダークモード</string>
<string name="pref_theme_e_light">ライトモード</string>
<string name="pref_theme_e_black"></string>
<string name="pref_theme_e_altblack">黒(別バージョン)</string>
<string name="pref_theme_e_white"></string>
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (システム)</string>
<string name="pref_theme_e_monetlight">Monet (ライト)</string>
<string name="pref_theme_e_monetdark">Monet (ダーク)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">短い</string>
<string name="pref_swipe_dist_e_short">やや短い</string>
<string name="pref_swipe_dist_e_default">普通</string>
<string name="pref_swipe_dist_e_far">やや長い</string>
<string name="pref_swipe_dist_e_very_far">長い</string>
<string name="pref_key_horizontal_space">キー間の左右の間隔</string>
<string name="pref_key_vertical_space">キー間の上下の間隔</string>
<string name="pref_border_config_title">キー形状の設定</string>
<string name="pref_border_width_title">縁取り</string>
<string name="pref_corners_radius_title">丸み</string>
<string name="pref_circle_sensitivity_title">円形ジェスチャーの感度</string>
<string name="pref_circle_sensitivity_e_high"></string>
<string name="pref_circle_sensitivity_e_medium"></string>
<string name="pref_circle_sensitivity_e_low"></string>
<string name="pref_circle_sensitivity_e_disabled">無効</string>
<string name="key_action_next">次へ</string>
<string name="key_action_done">完了</string>
<string name="key_action_go">実行</string>
<string name="key_action_prev">戻る</string>
<string name="key_action_search">検索</string>
<string name="key_action_send">送信</string>
<string name="launcher_button_imesettings">キーボードを有効化</string>
<string name="launcher_button_imepicker">キーボードを選択</string>
<string name="launcher_description">このアプリは仮想キーボードです。下のボタンからシステム設定を開いてUnexpected Keyboardを有効化してください。</string>
<string name="launcher_sourcecode">このアプリはオープンソースのフリーウェアです。GitHubでソースコードを入手したり、不具合を報告したりできます。</string>
<string name="launcher_tryhere">有効化されている場合、ここでキーボードを試すことができます。</string>
<string name="launcher_tryhere_hint">文字を入力</string>
<string name="key_descr_capslock">Caps Lock</string>
<string name="key_descr_compose">Compose</string>
<string name="key_descr_switch_greekmath">ギリシャ文字と数学記号</string>
<string name="key_descr_change_method">キーボードの切替</string>
<string name="key_descr_voice_typing">音声入力</string>
<string name="key_descr_copy">コピー</string>
<string name="key_descr_paste">貼り付け</string>
<string name="key_descr_cut">切り取り</string>
<string name="key_descr_selectAll">すべて選択</string>
<string name="key_descr_shareText">テキストを共有</string>
<string name="key_descr_pasteAsPlainText">書式なしで貼り付け</string>
<string name="key_descr_undo">元に戻す</string>
<string name="key_descr_redo">やり直し</string>
<string name="key_descr_ª">序数標識</string>
<string name="key_descr_º">序数標識</string>
<string name="key_descr_superscript">上付き文字</string>
<string name="key_descr_subscript">下付き文字</string>
<string name="key_descr_page_up">Page Up</string>
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">クリップボード</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
<string name="clipboard_pin_heading">お気に入り</string>
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
<string name="clipboard_remove_confirmed">はい</string>
</resources>

View File

@ -3,55 +3,55 @@
<string name="app_name_release">Unexpected Keyboard</string>
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
<!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
<string name="store_description">"주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
This application was originally designed for programmers using Termux.
Now perfect for everyday use.
이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
지금은 일상적인 용도로도 완벽합니다.
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다."</string>
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
<!-- <string name="pref_portrait">In portrait mode</string> -->
<!-- <string name="pref_landscape">In landscape mode</string> -->
<string name="pref_portrait">세로 화면</string>
<string name="pref_landscape">가로 화면</string>
<string name="pref_category_layout">레이아웃</string>
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
<string name="pref_label_brightness">라벨 밝기 조절</string>
<string name="pref_keyboard_opacity">키보드 배경 불투명도 조절</string>
<string name="pref_key_opacity">키 불투명도 조절</string>
<string name="pref_key_activated_opacity">누른 키 불투명도 조절</string>
<string name="pref_layout_e_system">시스템 세팅</string>
<!-- <string name="pref_layout_e_custom">Custom layout</string> -->
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
<!-- <string name="pref_show_numpad_title">Show NumPad</string> -->
<!-- <string name="pref_show_numpad_never">Never</string> -->
<!-- <string name="pref_show_numpad_landscape">Only in landscape mode</string> -->
<!-- <string name="pref_show_numpad_always">Always</string> -->
<!-- <string name="pref_number_row_title">Show number row</string> -->
<!-- <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> -->
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
<!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<string name="pref_category_typing">타자</string>
<string name="pref_layout_e_custom">사용자 정의 레이아웃</string>
<string name="pref_layouts_add">대체 레이아웃 추가</string>
<string name="pref_layouts_item">레이아웃 %1$d: %2$s</string>
<string name="pref_layouts_remove_custom">레이아웃 제거</string>
<string name="pref_custom_layout_title">사용자 정의 레이아웃</string>
<string name="pref_show_numpad_title">NumPad 표시</string>
<string name="pref_show_numpad_never">안 함</string>
<string name="pref_show_numpad_landscape">가로 모드에서만</string>
<string name="pref_show_numpad_always">항상</string>
<string name="pref_number_row_title">숫자 열 표시</string>
<string name="pref_number_row_summary">NumPad이 숨겨진 경우 키보드 상단에 숫자 행을 추가합니다.</string>
<string name="pref_numpad_layout">NumPad 레이아웃</string>
<string name="pref_numpad_layout_e_high_first">높은 자리수 우선</string>
<string name="pref_numpad_layout_e_low_first">낮은 자리수 우선</string>
<string name="pref_extra_keys_title">키보드에 추가 키 설정</string>
<string name="pref_extra_keys_custom">사용자 정의 키 추가</string>
<string name="pref_extra_keys_internal">키보드에 추가할 키 선택</string>
<string name="pref_category_typing">입력</string>
<string name="pref_swipe_dist_title">스와이프 범위</string>
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">길게 누르는 시간</string>
<string name="pref_long_interval_title">키 반복 간격</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
<!-- <string name="pref_category_behavior">Behavior</string> -->
<!-- <string name="pref_autocapitalisation_title">Automatic capitalisation</string> -->
<!-- <string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string> -->
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
<string name="pref_keyrepeat_enabled">키보드 입력을 길게 유지할 때 반복</string>
<string name="pref_lock_double_tap_title">쉬프트 키 더블 탭을 통해 대문자 잠금 설정</string>
<string name="pref_lock_double_tap_summary">modifier를 길게 누르고 있으면 해당 modifier가 잠긴 상태로 유지됩니다.</string>
<string name="pref_category_behavior">동작</string>
<string name="pref_autocapitalisation_title">자동 대문자 전환</string>
<string name="pref_autocapitalisation_summary">문장의 시작에서 Shift 키를 눌러 대문자로 전환합니다.</string>
<string name="pref_switch_input_immediate_title">마지막으로 사용한 키보드로 전환</string>
<string name="pref_switch_input_immediate_summary">키보드 전환 키의 동작 방식입니다.</string>
<string name="pref_vibrate_custom">사용자 정의 진동</string>
<string name="pref_vibrate_duration_title">진동 강도</string>
<string name="pref_pin_entry_enabled_title">Pin 입력 레이아웃</string>
<string name="pref_pin_entry_enabled_summary">숫자를 입력할 때, 날짜와 전화번호를 입력할 때 해당 레이아웃이 사용됩니다.</string>
<string name="pref_category_style">스타일</string>
<string name="pref_margin_bottom_title">아래 넓이</string>
<string name="pref_keyboard_height_title">키보드 높이</string>
@ -60,14 +60,18 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string>
<string name="pref_theme">테마</string>
<string name="pref_theme_e_system">시스템 테마</string>
<string name="pref_theme_e_dark">Dark</string>
<string name="pref_theme_e_light">Light</string>
<string name="pref_theme_e_black">Black</string>
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
<!-- <string name="pref_theme_e_white">White</string> -->
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<string name="pref_theme_e_dark">다크</string>
<string name="pref_theme_e_light">라이트</string>
<string name="pref_theme_e_black">블랙</string>
<string name="pref_theme_e_altblack">대체 블랙</string>
<string name="pref_theme_e_white">화이트</string>
<string name="pref_theme_e_epaper">종이</string>
<string name="pref_theme_e_desert">사막</string>
<string name="pref_theme_e_jungle">정글</string>
<string name="pref_theme_e_monet">모네트 (시스템)</string>
<string name="pref_theme_e_monetlight">모네트 (라이트)</string>
<string name="pref_theme_e_monetdark">모네트 (다크)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
<string name="pref_swipe_dist_e_short">짧음</string>
<string name="pref_swipe_dist_e_default">보통</string>
@ -75,45 +79,51 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_swipe_dist_e_very_far">매우 넓음</string>
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
<string name="pref_key_vertical_space">키보드 세로 간격</string>
<!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_border_config_title">경계선 사용자 정의</string>
<string name="pref_border_width_title">경계선 너비</string>
<string name="pref_corners_radius_title">모서리 반지름</string>
<string name="pref_circle_sensitivity_title">원형 제스처 감도</string>
<string name="pref_circle_sensitivity_e_high">높음</string>
<string name="pref_circle_sensitivity_e_medium">중간</string>
<string name="pref_circle_sensitivity_e_low">낮음</string>
<string name="pref_circle_sensitivity_e_disabled">사용 안 함</string>
<string name="key_action_next">다음</string>
<string name="key_action_done">확인</string>
<string name="key_action_go">Go</string>
<string name="key_action_go">엔터</string>
<string name="key_action_prev">이전</string>
<string name="key_action_search">검색</string>
<string name="key_action_send">보내기</string>
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
<!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> -->
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> -->
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
<!-- <string name="key_descr_copy">Copy</string> -->
<!-- <string name="key_descr_paste">Paste</string> -->
<!-- <string name="key_descr_cut">Cut</string> -->
<!-- <string name="key_descr_selectAll">Select all</string> -->
<!-- <string name="key_descr_shareText">Share text</string> -->
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<!-- <string name="key_descr_undo">Undo</string> -->
<!-- <string name="key_descr_redo">Redo</string> -->
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">Subscript</string> -->
<!-- <string name="key_descr_page_up">Page Up</string> -->
<!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<string name="launcher_button_imesettings">키보드 활성화</string>
<string name="launcher_button_imepicker">키보드 선택</string>
<string name="launcher_description">이 앱은 가상 키보드입니다.Unexpected-Keyboard를 클릭하여 시스템 설정으로 이동하고 아래 버튼을 클릭하세요.</string>
<string name="launcher_sourcecode">이것은 무료이고 오픈 소스 응용 프로그램입니다. GitHub에서 원본 코드를 찾을 수 있습니다 또는 버그를 신고할 수 있습니다.</string>
<string name="launcher_tryhere">켜면 여기에서 키보드를 시험해 볼 수 있습니다:</string>
<string name="launcher_tryhere_hint">여기서 시험해 보기</string>
<string name="key_descr_capslock">대문자 잠금</string>
<string name="key_descr_compose">구성</string>
<string name="key_descr_switch_greekmath">그리스 수학 기호 전환</string>
<string name="key_descr_change_method">키보드 전환</string>
<string name="key_descr_voice_typing">음성 입력</string>
<string name="key_descr_copy">복사</string>
<string name="key_descr_paste">붙여넣기</string>
<string name="key_descr_cut">자르기</string>
<string name="key_descr_selectAll">전부 선택</string>
<string name="key_descr_shareText">텍스트 공유</string>
<string name="key_descr_pasteAsPlainText">일반 텍스트로 붙여넣기</string>
<string name="key_descr_undo">실행 취소</string>
<string name="key_descr_redo">다시 실행</string>
<string name="key_descr_ª">순서 표시기</string>
<string name="key_descr_º">순서 표시기</string>
<string name="key_descr_superscript">상위 스크립트</string>
<string name="key_descr_subscript">하위 스크립트</string>
<string name="key_descr_page_up">페이지 위</string>
<string name="key_descr_page_down">페이지 아래</string>
<string name="key_descr_home"></string>
<string name="key_descr_end">종료</string>
<string name="key_descr_clipboard">클립보드 관리자</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
<string name="clipboard_pin_heading">고정</string>
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
<string name="clipboard_remove_confirmed"></string>
</resources>

View File

@ -38,9 +38,9 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_category_typing">Rakstīšana</string>
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Ilgas piepiešanas noildze</string>
<string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Taustiņa atkārtošanās ar ilgu piespiešanu</string>
<string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string>
<string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string>
<string name="pref_category_behavior">Uzvedība</string>
@ -68,6 +68,10 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_theme_e_epaper">ePapīrs</string>
<string name="pref_theme_e_desert">Tuksnesis</string>
<string name="pref_theme_e_jungle">Džungļi</string>
<string name="pref_theme_e_monet">Monē (sistēmas)</string>
<string name="pref_theme_e_monetlight">Monē (gaišs)</string>
<string name="pref_theme_e_monetdark">Monē (tumšs)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
<string name="pref_swipe_dist_e_short">Tuvs</string>
<string name="pref_swipe_dist_e_default">Vidējs</string>
@ -78,11 +82,11 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_border_config_title">Pielāgot apmales</string>
<string name="pref_border_width_title">Apmales platums</string>
<string name="pref_corners_radius_title">Stūru rādiuss</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_circle_sensitivity_title">Apļveida kustības jutīgums</string>
<string name="pref_circle_sensitivity_e_high">Augsts</string>
<string name="pref_circle_sensitivity_e_medium">Vidējs</string>
<string name="pref_circle_sensitivity_e_low">Zems</string>
<string name="pref_circle_sensitivity_e_disabled">Atspējots</string>
<string name="key_action_next">Nākamais</string>
<string name="key_action_done">Darīts</string>
<string name="key_action_go">Aiziet</string>
@ -118,4 +122,10 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="key_descr_page_down">Lejupšķirt</string>
<string name="key_descr_home">Sākums</string>
<string name="key_descr_end">Beigas</string>
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
<string name="clipboard_pin_heading">Piesprausts</string>
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
<string name="clipboard_remove_confirmed"></string>
</resources>

View File

@ -38,9 +38,9 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_category_typing">Pisanie</string>
<string name="pref_swipe_dist_title">Odległość przesuwania</string>
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniami</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_long_timeout_title">Opóźnienie przytrzymania klawisza</string>
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniem klawisza</string>
<string name="pref_keyrepeat_enabled">Powtarzanie klawisza po przytrzymaniu</string>
<string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string>
<string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string>
<string name="pref_category_behavior">Zachowanie</string>
@ -68,6 +68,10 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_theme_e_epaper">e-paper</string>
<string name="pref_theme_e_desert">Pustynny</string>
<string name="pref_theme_e_jungle">Dżunglowy</string>
<string name="pref_theme_e_monet">Monet (Systemowy)</string>
<string name="pref_theme_e_monetlight">Monet (Jasny)</string>
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
<string name="pref_swipe_dist_e_short">Mała</string>
<string name="pref_swipe_dist_e_default">Normalna</string>
@ -78,11 +82,11 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_border_config_title">Dostosuj krawędzie</string>
<string name="pref_border_width_title">Grubość krawedzi</string>
<string name="pref_corners_radius_title">Promień rogów</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_circle_sensitivity_title">Czułość gestu koła</string>
<string name="pref_circle_sensitivity_e_high">Wysoka</string>
<string name="pref_circle_sensitivity_e_medium">Średnia</string>
<string name="pref_circle_sensitivity_e_low">Mała</string>
<string name="pref_circle_sensitivity_e_disabled">Wyłączona</string>
<string name="key_action_next">Dalej</string>
<string name="key_action_done">OK</string>
<string name="key_action_go">Przejdź</string>
@ -116,4 +120,10 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Zarządzanie schowkiem</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
<string name="clipboard_pin_heading">Przypięte</string>
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
<string name="clipboard_remove_confirmed">Tak</string>
</resources>

View File

@ -68,6 +68,10 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<string name="pref_theme_e_epaper">Papel Eletrônico</string>
<string name="pref_theme_e_desert">Deserto</string>
<string name="pref_theme_e_jungle">Selva</string>
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Bem curto</string>
<string name="pref_swipe_dist_e_short">Curto</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -116,4 +120,10 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

View File

@ -68,6 +68,10 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<string name="pref_theme_e_epaper">ePaper</string>
<!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
<string name="pref_swipe_dist_e_short">Apropiată</string>
<string name="pref_swipe_dist_e_default">Normală</string>
@ -116,4 +120,10 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

View File

@ -68,6 +68,10 @@
<string name="pref_theme_e_epaper">Электронная бумага</string>
<string name="pref_theme_e_desert">Пустыня</string>
<string name="pref_theme_e_jungle">Джунгли</string>
<string name="pref_theme_e_monet">Моне (системная)</string>
<string name="pref_theme_e_monetlight">Моне (светлая)</string>
<string name="pref_theme_e_monetdark">Моне (темная)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Очень короткая</string>
<string name="pref_swipe_dist_e_short">Короткая</string>
<string name="pref_swipe_dist_e_default">Обычная</string>
@ -116,4 +120,10 @@
<string name="key_descr_page_down">Страница вниз</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обмена</string>
<string name="key_descr_combining">Сочетание диакритических знаков</string>
<string name="clipboard_history_heading">Недавно скопированный текст</string>
<string name="clipboard_pin_heading">Закреплено</string>
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
<string name="clipboard_remove_confirmed">Да</string>
</resources>

View File

@ -38,9 +38,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_category_typing">Yazma</string>
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_long_timeout_title">Uzun basma süresi</string>
<string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_keyrepeat_enabled">Uzun basınca tuş tekrarlamaları</string>
<string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string>
<string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string>
<string name="pref_category_behavior">Klavye davranışı</string>
@ -68,6 +68,10 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_theme_e_epaper">E-Kağıt</string>
<string name="pref_theme_e_desert">Çöl</string>
<string name="pref_theme_e_jungle">Orman</string>
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
<string name="pref_theme_e_monetlight">Monet (Açık)</string>
<string name="pref_theme_e_monetdark">Monet (Koyu)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
<string name="pref_swipe_dist_e_short">Kısa</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -75,14 +79,14 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
<!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_border_config_title">Çerçeveyi özelleştir</string>
<string name="pref_border_width_title">Çerçeve kalınlığı</string>
<string name="pref_corners_radius_title">Kenar yumuşaklığı</string>
<string name="pref_circle_sensitivity_title">Dairesel hareket hassasiyeti</string>
<string name="pref_circle_sensitivity_e_high">Yüksek</string>
<string name="pref_circle_sensitivity_e_medium">Orta</string>
<string name="pref_circle_sensitivity_e_low">Düşük</string>
<string name="pref_circle_sensitivity_e_disabled">Devre dışı</string>
<string name="key_action_next">Sonraki</string>
<string name="key_action_done">Tamam</string>
<string name="key_action_go">ileri</string>
@ -94,9 +98,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string>
<string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string>
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
<string name="launcher_tryhere_hint">Burada dene</string>
<string name="key_descr_capslock">CapsLock</string>
<!-- <string name="key_descr_compose">Compose</string> -->
<string name="key_descr_compose">Oluştur</string>
<string name="key_descr_switch_greekmath">Greek &amp; math sembolleri</string>
<string name="key_descr_change_method">Klavye değiştir</string>
<string name="key_descr_voice_typing">Sesle yazma</string>
@ -116,4 +120,10 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="key_descr_page_down">Aşağı</string>
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
<string name="key_descr_end">SON(Sağ yön tuşu)</string>
<string name="key_descr_clipboard">Pano</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Son kopyalanan metin</string>
<string name="clipboard_pin_heading">Sabitlendi</string>
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
<string name="clipboard_remove_confirmed">Evet</string>
</resources>

View File

@ -68,6 +68,10 @@
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Пустеля</string>
<string name="pref_theme_e_jungle">Джунглі</string>
<string name="pref_theme_e_monet">Моне (Системна)</string>
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
<string name="pref_swipe_dist_e_short">Коротка</string>
<string name="pref_swipe_dist_e_default">Звичайна</string>
@ -116,4 +120,10 @@
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
<string name="key_descr_combining">Комбінування діакритики</string>
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
<string name="clipboard_pin_heading">Закріплено</string>
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
<string name="clipboard_remove_confirmed">Так</string>
</resources>

View File

@ -68,6 +68,10 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
<string name="pref_theme_e_epaper">ePaper</string>
<!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Rất gần</string>
<string name="pref_swipe_dist_e_short">Gần</string>
<string name="pref_swipe_dist_e_default">Trungbình</string>
@ -116,4 +120,10 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
<!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

View File

@ -68,6 +68,10 @@
<string name="pref_theme_e_epaper">白色带边框</string>
<string name="pref_theme_e_desert">沙漠</string>
<string name="pref_theme_e_jungle">雨林</string>
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">非常短</string>
<string name="pref_swipe_dist_e_short"></string>
<string name="pref_swipe_dist_e_default">中(默认)</string>
@ -116,4 +120,10 @@
<string name="key_descr_page_down">下一页</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources>

View File

@ -28,6 +28,10 @@
<item>@string/pref_theme_e_epaper</item>
<item>@string/pref_theme_e_desert</item>
<item>@string/pref_theme_e_jungle</item>
<item>@string/pref_theme_e_monet</item>
<item>@string/pref_theme_e_monetlight</item>
<item>@string/pref_theme_e_monetdark</item>
<item>@string/pref_theme_e_rosepine</item>
</string-array>
<string-array name="pref_theme_values">
<item>system</item>
@ -39,6 +43,10 @@
<item>epaper</item>
<item>desert</item>
<item>jungle</item>
<item>monet</item>
<item>monetlight</item>
<item>monetdark</item>
<item>rosepine</item>
</string-array>
<string-array name="pref_swipe_dist_entries">
<item>@string/pref_swipe_dist_e_very_short</item>

View File

@ -17,8 +17,11 @@
<item>beng_provat</item>
<item>cyrl_jcuken_ru</item>
<item>cyrl_jcuken_uk</item>
<item>cyrl_lynyertz_sr</item>
<item>cyrl_ueishsht</item>
<item>cyrl_yaverti</item>
<item>cyrl_yqukeng_tj</item>
<item>cyrl_yxukeng_os</item>
<item>deva_alt</item>
<item>deva_inscript</item>
<item>grek_qwerty</item>
@ -36,12 +39,14 @@
<item>latn_qwerty_es</item>
<item>latn_qwerty_gb</item>
<item>latn_qwerty_hu</item>
<item>latn_qwerty_jp</item>
<item>latn_qwerty_lv</item>
<item>latn_qwerty_no</item>
<item>latn_qwerty_pl</item>
<item>latn_qwerty_ro</item>
<item>latn_qwerty_se</item>
<item>latn_qwerty_sk</item>
<item>latn_qwerty_sr</item>
<item>latn_qwerty_tly</item>
<item>latn_qwerty_tr</item>
<item>latn_qwerty_vi</item>
@ -72,8 +77,11 @@
<item>বাংলা (প্রভাত)</item>
<item>ЙЦУКЕН (Русский)</item>
<item>ЙЦУКЕН (Українська)</item>
<item>ЉЊЕРТЗ (Српски)</item>
<item>УЕИШЩ (Български, БДС)</item>
<item>ЯВЕРТЪ</item>
<item>Tajiki Persian (Тоҷикӣ)</item>
<item>Old Church Slavonic (Црькъвьнословѣньскъ ѩзыкъ)</item>
<item>देवनागरी (हिंदी)-2</item>
<item>देवनागरी (हिंदी)-1</item>
<item>QWERTY (Greek)</item>
@ -91,12 +99,14 @@
<item>QWERTY (Español)</item>
<item>QWERTY (UK)</item>
<item>QWERTY (Magyar)</item>
<item>QWERTY (Japan)</item>
<item>QWERTY (Latvian)</item>
<item>QWERTY (Norwegian)</item>
<item>QWERTY (Polski)</item>
<item>QWERTY (Română)</item>
<item>QWERTY (Swedish)</item>
<item>QWERTY (Slovak)</item>
<item>QWERTY (Srpski, latinica)</item>
<item>QWERTY (Talysh New Latin)</item>
<item>QWERTY (Türkçe)</item>
<item>QWERTY (Vietnamese)</item>
@ -127,8 +137,11 @@
<item>@xml/beng_provat</item>
<item>@xml/cyrl_jcuken_ru</item>
<item>@xml/cyrl_jcuken_uk</item>
<item>@xml/cyrl_lynyertz_sr</item>
<item>@xml/cyrl_ueishsht</item>
<item>@xml/cyrl_yaverti</item>
<item>@xml/cyrl_yqukeng_tj</item>
<item>@xml/cyrl_yxukeng_os</item>
<item>@xml/deva_alt</item>
<item>@xml/deva_inscript</item>
<item>@xml/grek_qwerty</item>
@ -146,12 +159,14 @@
<item>@xml/latn_qwerty_es</item>
<item>@xml/latn_qwerty_gb</item>
<item>@xml/latn_qwerty_hu</item>
<item>@xml/latn_qwerty_jp</item>
<item>@xml/latn_qwerty_lv</item>
<item>@xml/latn_qwerty_no</item>
<item>@xml/latn_qwerty_pl</item>
<item>@xml/latn_qwerty_ro</item>
<item>@xml/latn_qwerty_se</item>
<item>@xml/latn_qwerty_sk</item>
<item>@xml/latn_qwerty_sr</item>
<item>@xml/latn_qwerty_tly</item>
<item>@xml/latn_qwerty_tr</item>
<item>@xml/latn_qwerty_vi</item>

View File

@ -68,6 +68,10 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Light)</string>
<string name="pref_theme_e_monetdark">Monet (Dark)</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_swipe_dist_e_very_short">Very short</string>
<string name="pref_swipe_dist_e_short">Short</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -116,4 +120,10 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Clipboard manager</string>
<string name="key_descr_combining">Combining diacritic</string>
<string name="clipboard_history_heading">Recently copied text</string>
<string name="clipboard_pin_heading">Pinned</string>
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
<string name="clipboard_remove_confirmed">Yes</string>
</resources>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Emoji pane -->
<style name="emojiTypeButton">
<item name="android:padding">1px</item>
<item name="android:gravity">center</item>
@ -15,6 +16,39 @@
<item name="android:textSize">@dimen/emoji_text_size</item>
<item name="android:textColor">?attr/emoji_color</item>
</style>
<!-- Clipboard pane -->
<style name="clipboardEntry">
<item name="android:layout_weight">1</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginHorizontal">14dp</item>
<item name="android:layout_marginVertical">14dp</item>
<item name="android:textSize">16dp</item>
<item name="android:textColor">?attr/colorLabel</item>
</style>
<style name="clipboardHeading">
<item name="android:layout_marginHorizontal">6dp</item>
<item name="android:layout_marginTop">14dp</item>
<item name="android:layout_marginBottom">0dp</item>
<item name="android:textSize">14dp</item>
<item name="android:fontWeight">700</item>
<item name="android:textColor">?attr/colorSubLabel</item>
</style>
<style name="clipboardEntryButtons">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:layout_marginRight">12dp</item>
</style>
<style name="clipboardEntryButton">
<item name="android:layout_width">24dp</item>
<item name="android:layout_height">24dp</item>
<item name="android:layout_marginHorizontal">2dp</item>
<item name="android:backgroundTint">?attr/colorLabel</item>
<item name="android:backgroundTintMode">src_in</item>
</style>
<!-- Launcher activity -->
<style name="paragraph">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
@ -22,5 +56,12 @@
<item name="android:layout_marginHorizontal">16dp</item>
<item name="android:layout_gravity">center</item>
</style>
<style name="anim">
<item name="android:layout_width">100dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginVertical">16dp</item>
<item name="android:layout_gravity">center</item>
<item name="android:adjustViewBounds">true</item>
</style>
<style name="appTheme" parent="@android:style/Theme.DeviceDefault.DayNight"/>
</resources>

View File

@ -23,11 +23,14 @@
<attr name="keyBorderColorTop" format="color"/>
<attr name="keyBorderColorRight" format="color"/>
<attr name="keyBorderColorBottom" format="color"/>
<!-- Emoji panel -->
<!-- Emoji pane -->
<attr name="emoji_button_bg" type="color" format="color"/>
<attr name="emoji_color" type="color" format="color"/>
<attr name="emoji_key_bg" type="color" format="color"/>
<attr name="emoji_key_text" type="color" format="color"/>
<!-- Clipboard pane -->
<attr name="clipboard_divider_color" type="color" format="color"/>
<attr name="clipboard_divider_height" format="dimension"/>
<!-- System integration -->
<attr name="navigationBarColor" format="color"/>
<attr name="windowLightNavigationBar" format="boolean"/>
@ -43,6 +46,8 @@
<item name="greyedDimming">0.5</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
<item name="clipboard_divider_color" type="color">?attr/colorKey</item>
<item name="clipboard_divider_height">1px</item>
</style>
<style name="Dark" parent="BaseTheme">
<item name="android:isLightTheme">false</item>
@ -116,6 +121,7 @@
<item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#ffffff</item>
<item name="emoji_color">#000000</item>
<item name="clipboard_divider_color" type="color">#eeeeee</item>
</style>
<style name="ePaper" parent="BaseTheme">
<item name="android:isLightTheme">true</item>
@ -134,6 +140,8 @@
<item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#ffffff</item>
<item name="emoji_color">#000000</item>
<item name="clipboard_divider_color" type="color">#000000</item>
<item name="clipboard_divider_height">2dp</item>
</style>
<style name="Desert" parent="@style/BaseTheme">
<item name="android:isLightTheme">true</item>
@ -171,4 +179,47 @@
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">#000000</item>
</style>
<style name="MonetLight" parent="@style/BaseTheme">
<item name="android:isLightTheme">true</item>
<item name="colorKeyboard">@android:color/system_accent1_100</item>
<item name="colorKey">@android:color/system_accent1_0</item>
<item name="colorKeyActivated">@android:color/system_accent1_300</item>
<item name="colorLabel">@android:color/system_accent1_1000</item>
<item name="colorLabelActivated">@android:color/system_accent1_1000</item>
<item name="colorLabelLocked">@android:color/system_accent1_500</item>
<item name="colorSubLabel">@android:color/system_accent1_900</item>
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">@android:color/system_accent1_1000</item>
</style>
<style name="MonetDark" parent="@style/BaseTheme">
<item name="android:isLightTheme">false</item>
<item name="colorKeyboard">@android:color/system_accent1_900</item>
<item name="colorKey">@android:color/system_accent1_800</item>
<item name="colorKeyActivated">@android:color/system_accent1_600</item>
<item name="colorLabel">@android:color/system_neutral1_0</item>
<item name="colorLabelActivated">@android:color/system_accent2_300</item>
<item name="colorLabelLocked">@android:color/system_accent2_100</item>
<item name="colorSubLabel">@android:color/system_neutral1_300</item>
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">@android:color/system_accent1_900</item>
</style>
<style name="RosePine" parent="BaseTheme">
<item name="android:isLightTheme">false</item>
<item name="colorKeyboard">#191724</item>
<item name="colorKey">#26233a</item>
<item name="colorKeyActivated">#403d52</item>
<item name="keyBorderWidth">0dp</item>
<item name="keyBorderWidthActivated">1dp</item>
<item name="keyBorderColorLeft">#6e6a86</item>
<item name="keyBorderColorTop">#6e6a86</item>
<item name="keyBorderColorRight">#6e6a86</item>
<item name="keyBorderColorBottom">#6e6a86</item>
<item name="colorLabel">#e0def4</item>
<item name="colorLabelActivated">#c4a7e7</item>
<item name="colorLabelLocked">#31748f</item>
<item name="colorSubLabel">#6e6a86</item>
<item name="keyBorderRadius">1dp</item>
<item name="emoji_button_bg">#26233a</item>
<item name="emoji_color">#e0def4</item>
</style>
</resources>

View File

@ -4,6 +4,7 @@
<dimen name="key_padding">2dp</dimen>
<dimen name="emoji_grid_height">250dp</dimen>
<dimen name="emoji_text_size">28dp</dimen>
<dimen name="clipboard_view_height">300dp</dimen>
<dimen name="pref_button_size">28dp</dimen>
<bool name="debug_logs">false</bool> <!-- Will be overwritten automatically by Gradle for the debug build variant -->
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<row height="0.95">
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/>
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
<key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The bottom row used in the clipboard history pane. -->
<keyboard bottom_row="false">
<row height="0.95">
<key key0="switch_back_clipboard"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/>
</row>
</keyboard>

View File

@ -3,8 +3,8 @@
<keyboard bottom_row="false">
<row height="0.95">
<key key0="switch_back_emoji"/>
<key width="4" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace"/>
<key key0="enter"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/>
</row>
</keyboard>

View File

@ -10,6 +10,7 @@
<subtype android:label="%s" android:languageTag="da" android:imeSubtypeLocale="da_DK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_da,extra_keys=€|æ|å|ø"/>
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/>
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
<subtype android:label="%s" android:languageTag="en-AU" android:imeSubtypeLocale="en_AU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
@ -23,6 +24,7 @@
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/>
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d"/>
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/>
<subtype android:label="%s" android:languageTag="ja" android:imeSubtypeLocale="ja_JP" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_jp"/>
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/>
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/>
@ -35,6 +37,7 @@
<subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/>
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/>
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/>
<subtype android:label="%s" android:languageTag="sr" android:imeSubtypeLocale="sr_" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_lynyertz_sr"/>
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á@d|accent_trema:ä:ö@o|accent_ring:å@s|€"/>
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/>

View File

@ -45,7 +45,7 @@
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
</PreferenceScreen>
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.75" max="1.5"/>
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.15" min="0.75" max="1.5"/>
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_horizontal_margin" android:title="@string/pref_key_horizontal_space" android:summary="%s%%" android:defaultValue="2" min="0" max="5"/>
<CheckBoxPreference android:key="border_config" android:title="@string/pref_border_config_title" android:defaultValue="false"/>

View File

@ -15,12 +15,13 @@ let
ANDROID_SDK_ROOT = "${android.androidsdk}/libexec/android-sdk";
gradle = pkgs.gradle.override { java = jdk; };
# Without this option, aapt2 fails to run with a permissions error.
gradle_wrapped = pkgs.runCommandLocal "gradle-wrapped" {
nativeBuildInputs = with pkgs; [ makeBinaryWrapper ];
} ''
mkdir -p $out/bin
ln -s ${pkgs.gradle}/bin/gradle $out/bin/gradle
ln -s ${gradle}/bin/gradle $out/bin/gradle
wrapProgram $out/bin/gradle \
--add-flags "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${build_tools_version}/aapt2"
'';

View File

@ -3,6 +3,8 @@
The `compose.py` program parses the compose sequences found in this directory
and generates `srcs/juloo.keyboard2/ComposeKeyData.java`.
## `en_US_UTF_8_Compose.pre`
## `compose/en_US_UTF_8_Compose.pre`
This file is copied from the `xorg` project. Copyright applies.
## `compose/extra.json`

View File

@ -1,17 +1,52 @@
{
// latin
"a": "á",
"c": "ć",
"e": "é",
"g": "ǵ",
"i": "í",
"k": "ḱ",
"l": "ĺ",
"ń": "ń",
"m": "ḿ",
"n": "ń",
"o": "ó",
"p": "ṕ",
"r": "ŕ",
"s": "ś",
"u": "ú",
"w": "ẃ",
"y": "ý",
"z": "ź",
// extended latin (multiple diacritics)
"â": "ấ",
"ă": "ắ",
"å": "ǻ",
"æ": "ǽ",
"ç": "ḉ",
"ê": "ế",
"ē": "ḗ",
"ï": "ḯ",
"ô": "ố",
"ơ": "ớ",
"õ": "ṍ",
"ō": "ṓ",
"ø": "ǿ",
"ṡ": "ṥ",
"ü": "ǘ",
"ư": "ứ",
"ũ": "ṹ",
// greek
"α": "ά",
"ε": "έ",
"η": "ή",
"ι": "ί",
"ο": "ό",
"υ": "ύ",
// cyrillic
"к": "ќ",
"г": "ѓ",
// combining character
"ą": "ą\u0301",
"j": "j\u0301",
"у": "у\u0301",
"е": "е\u0301",

View File

@ -1,8 +1,12 @@
{
// latin
"2": "ƻ",
"b": "ƀ",
"c": "ꞓ",
"d": "đ",
"f": "",
"g": "ǥ",
"h": "ħ",
"i": "ɨ",
"j": "ɉ",
"k": "ꝁ",
@ -14,5 +18,13 @@
"t": "ŧ",
"u": "ʉ",
"y": "ɏ",
"z": "ƶ"
"z": "ƶ",
// extended latin
"ȷ": "ɟ",
// cyrillic
"о": "ө",
"ӧ": "ӫ",
"ү": "ұ",
"ь": "ҍ",
"х": "ӿ"
}

View File

@ -1,9 +1,14 @@
{
// latin
"a": "ǎ",
"c": "č",
"d": "ď",
"e": "ě",
"g": "ǧ",
"h": "ȟ",
"i": "ǐ",
"j": "ǰ", // no uppercase
"k": "ǩ",
"l": "ľ",
"n": "ň",
"o": "ǒ",
@ -12,5 +17,17 @@
"t": "ť",
"u": "ǔ",
"z": "ž",
"ü": "ǚ"
// extended latin
"ṡ": "ṧ",
"ü": "ǚ",
"ʒ": "ǯ",
// combining character
"в": "в\u030C",
"г": "г\u030C",
"ғ": "ғ\u030C",
"д": "д\u030C",
"з": "з\u030C",
"р": "р\u030C",
"т": "т\u030C",
"х": "х\u030C"
}

View File

@ -1,4 +1,5 @@
{
// latin
"c": "ç",
"d": "ḑ",
"e": "ȩ",
@ -9,5 +10,8 @@
"n": "ņ",
"r": "ŗ",
"s": "ş",
"t": "ţ"
"t": "ţ",
// extended latin
"ć": "ḉ",
"ĕ": "ḝ"
}

View File

@ -1,4 +1,7 @@
{
"+": "⨣",
"≈": "⩯",
// latin
"a": "â",
"c": "ĉ",
"e": "ê",
@ -9,5 +12,30 @@
"o": "ô",
"ŝ": "ŝ",
"u": "û",
"z": "ẑ"
"w": "ŵ",
"x": "x̂",
"y": "ŷ",
"z": "ẑ",
// extended latin
"á": "ấ",
"à": "ầ",
"ã": "ẫ",
"ạ": "ậ",
"ả": "ẩ",
"é": "ế",
"è": "ề",
"ẽ": "ễ",
"ẹ": "ệ",
"ẻ": "ể",
"ó": "ố",
"ò": "ồ",
"ơ": "ổ",
"õ": "ỗ",
"ọ": "ộ",
// combining characters
"а": "а\u0302",
"е": "е\u0302",
"и": "и\u0302",
"о": "о\u0302",
"у": "у\u0302"
}

View File

@ -17,5 +17,40 @@
"w": "ẇ",
"x": "ẋ",
"y": "ẏ",
"z": "ż"
"z": "ż",
// remove dot since i and j already have one
"i": "ı",
"j": "ȷ",
// extended latin
"ā": "ǡ",
"ō": "ȱ",
"ś": "ṥ",
"ṣ": "ṩ",
"š": "ṧ",
"ſ": "ẛ",
// combining character
"k": "k\u0307",
"l": "l\u0307",
"q": "q\u0307",
"u": "u\u0307",
"v": "v\u0307",
"0": "0\u0307",
"1": "1\u0307",
"2": "2\u0307",
"3": "3\u0307",
"4": "4\u0307",
"5": "5\u0307",
"6": "6\u0307",
"7": "7\u0307",
"8": "8\u0307",
"9": "9\u0307",
// math
"∈": "⋵",
"": "⨰",
"∧": "⩑",
"": "⩒",
"≡": "⩧",
"~": "⩪",
"⊆": "⫃",
"⊇": "⫄"
}

View File

@ -1,14 +1,34 @@
{
// latin
"a": "ạ",
"b": "ḅ",
"d": "ḍ",
"e": "ẹ",
"h": "ḥ",
"i": "ị",
"k": "ḳ",
"l": "ḷ",
"m": "ṃ",
"n": "ṇ",
"o": "ọ",
"r": "ṛ",
"s": "ṣ",
"t": "ṭ",
"u": "ụ",
"v": "ṿ",
"w": "ẉ",
"y": "ỵ",
"z": "ẓ",
// extended latin
"ă": "ặ",
"â": "ậ",
"e": "ẹ",
"ê": "ệ",
"i": "ị",
"o": "ọ",
"ô": "ộ",
"ơ": "ợ",
"u": "ụ",
"ṡ": "ṩ",
"ư": "ự",
"y": "ỵ"
// math
"-": "⨪",
"+": "⨥",
"=": "⩦"
}

View File

@ -1,7 +1,11 @@
{
" ": "˝",
// latin
"o": "ő",
"u": "ű",
" ": "˝",
// cyrillic
"у": "ӳ",
// combining character
"a": "a\u030b",
"e": "e\u030b",
"i": "i\u030b",

View File

@ -1,8 +1,38 @@
{
// latin
"a": "à",
"e": "è",
"i": "ì",
"n": "ǹ",
"o": "ò",
"u": "ù",
"ü": "ǜ"
"w": "ẁ",
"y": "ỳ",
// extended latin
"â": "ầ",
"ă": "ằ",
"ê": "ề",
"ē": "ḕ",
"ơ": "ờ",
"ô": "ồ",
"ō": "ṑ",
"ü": "ǜ",
"ư": "ừ",
// greek (technically not a grave, but a varia)
"α": "ὰ",
"ε": "ὲ",
"η": "ὴ",
"ι": "ὶ",
"ο": "ὸ",
"υ": "ὺ",
"ω": "ὼ",
// there is more like , , etc
// cyrillic
"е": "ѐ",
"и": "ѝ",
// combining character
"ɔ": "ɔ\u0300",
"s": "s\u0300",
"ʌ": "ʌ\u0300",
"z": "z\u0300"
}

View File

@ -1,8 +1,35 @@
{
// latin
"a": "ā",
"e": "ē",
"g": "ḡ",
"i": "ī",
"o": "ō",
"u": "ū",
"ü": "ǖ"
"y": "ȳ",
// extended latin
"æ": "ǣ",
"ä": "ǟ",
"ȧ": "ǡ",
"è": "ḕ",
"é": "ḗ",
"ḷ": "ḹ",
"ṛ": "ṝ",
"ö": "ȫ",
"ȯ": "ȱ",
"ǫ": "ǭ",
"õ": "ȭ",
"ò": "ṑ",
"ó": "ṓ",
"ü": "ǖ", // there is also
// cyrillic
"и": "ӣ",
"у": "ӯ",
// greek
"α": "ᾱ",
"ι": "ῑ",
"υ": "ῡ",
// combining characters
"l": "l\u0304",
"r": "r\u0304"
}

View File

@ -1,10 +1,10 @@
{
// latin
"a": "ą",
"e": "ę",
"i": "į",
"k": "ķ",
"l": "ļ",
"n": "ņ",
"o": "ǫ",
"u": "ų"
"u": "ų",
// extended latin
"ō": "ǭ"
}

View File

@ -1,4 +1,11 @@
{
// latin
"a": "å",
"u": "ů"
"u": "ů",
"w": "ẘ", // no uppercase
"y": "ẙ", // no uppercase
// extended latin
"á": "ǻ",
// extra
"~": "⸛"
}

View File

@ -8,7 +8,11 @@
"l": "ł",
"n": "ꞥ",
"o": "ø",
"ó": "ǿ",
"ɔ": "ꬿ",
"r": "ꞧ",
"s": "ꞩ",
"t": "ⱦ"
"t": "ⱦ",
"u": "ꞹ",
"v": "ꝟ"
}

View File

@ -1,4 +1,6 @@
{
// arabic numbers
"0": "₀",
"1": "₁",
"2": "₂",
"3": "₃",
@ -8,12 +10,13 @@
"7": "₇",
"8": "₈",
"9": "₉",
"0": "₀",
// math operators
"+": "₊",
"-": "₋",
"=": "₌",
"(": "₍",
")": "₎",
// latin
"a": "ₐ",
"e": "ₑ",
"h": "ₕ",
@ -30,5 +33,13 @@
"t": "ₜ",
"u": "ᵤ",
"v": "ᵥ",
"x": "ₓ"
"x": "ₓ",
// extended latin
"ə": "ₔ",
// greek
"β": "ᵦ",
"γ": "ᵧ",
"ρ": "ᵨ",
"φ": "ᵩ",
"χ": "ᵪ"
}

View File

@ -1,4 +1,6 @@
{
// numbers
"0": "⁰",
"1": "¹",
"2": "²",
"3": "³",
@ -8,12 +10,18 @@
"7": "⁷",
"8": "⁸",
"9": "⁹",
"0": "⁰",
// math operators
"+": "⁺",
"-": "⁻",
"=": "⁼",
"(": "⁽",
")": "⁾",
// latin
"n": "ⁿ",
// since there are no more "superscript" characters,
// we substitute with "modifier letter small"s which looks the same
// latin
"a": "ᵃ",
"b": "ᵇ",
"c": "ᶜ",
@ -26,10 +34,11 @@
"j": "ʲ",
"k": "ᵏ",
"l": "ˡ",
// see above for n
"m": "ᵐ",
"n": "ⁿ",
"o": "ᵒ",
"p": "ᵖ",
"q": "ꟴ", // there is no proper lowercase superscript q
"r": "ʳ",
"s": "ˢ",
"t": "ᵗ",
@ -38,5 +47,47 @@
"w": "ʷ",
"x": "ˣ",
"y": "ʸ",
"z": "ᶻ"
"z": "ᶻ",
// extended latin
"ɐ": "ᵄ",
"ᴂ": "ᵆ",
"ɕ": "ᶝ",
"ə": "ᵊ",
"ɛ": "ᵋ",
"ɜ": "ᶟ", // turned open e, not the same
"ᴈ": "ᵌ", // reversed open e
"ɥ": "ᶣ",
"ɦ": "ʱ",
"ᴉ": "ᵎ",
"ɨ": "ᶤ",
"ɟ": "ᶡ",
"ɱ": "ᶬ",
"ɯ": "ᵚ",
"ɰ": "ᶭ",
"ŋ": "ᵑ",
"ᴝ": "ᵙ",
"ɵ": "ᶱ",
"œ": "ꟹ",
"ɔ": "ᵓ",
"ɹ": "ʴ",
"ɻ": "ʵ",
"ʁ": "ʶ",
"ʂ": "ᶳ",
"ʉ": "ᶶ",
"ʃ": "ᶴ",
"ʒ": "ᶾ",
"ʍ": "ꭩ",
// greek
"ɒ": "ᶛ",
"β": "ᵝ",
"ɣ": "ˠ",
"δ": "ᵟ",
"φ": "ᵠ",
"χ": "ᵡ",
"ι": "ᶥ",
"ʊ": "ᶷ",
"ʌ": "ᶺ",
"θ": "ᶿ",
// cyrillic
"ө": "ᶱ"
}

View File

@ -1,13 +1,21 @@
{
// latin
"a": "ã",
"e": "ẽ",
"i": "ĩ",
"n": "ñ",
"o": "õ",
"u": "ũ",
"v": "ṽ",
"y": "ỹ",
// extended latin
"ă": "ẵ",
"â": "ẫ",
"ê": "ễ",
"ơ": "ỡ",
"ư": "ữ"
"ō": "ȭ",
"ó": "ṍ",
"ö": "ṏ",
"ư": "ữ",
"ú": "ṹ"
}

View File

@ -1,8 +1,54 @@
{
// fun
"~": "⍨",
"*": "⍣",
"∇": "⍢",
"°": "⍤",
// latin
"a": "ä",
"e": "ë",
"h": "ḧ",
"i": "ï",
"o": "ö",
"t": "ẗ",
"u": "ü",
"y": "ÿ"
"w": "ẅ",
"x": "ẍ",
"y": "ÿ",
// extended latin
"ā": "ǟ",
"ō": "ȫ",
"õ": "ṏ",
"í": "ḯ",
"ū": "ǖ", // there is also
"ú": "ǘ",
"ù": "ǜ",
"ǔ": "ǚ",
// greek
"ι": "ϊ",
"υ": "ϋ",
"ὺ": "ῢ",
"ύ": "ΰ",
"ῦ": "ῧ",
"ϒ": "ϔ",
// cyrillic
"а": "ӓ",
"ә": "ӛ",
"ж": "ӝ",
"з": "ӟ",
"и": "ӥ",
"о": "ӧ",
"ө": "ӫ",
"э": "ӭ",
"у": "ӱ",
"ч": "ӵ",
"ы": "ӹ",
// combining character
"c": "c\u0308",
"j": "j\u0308",
"k": "k\u0308",
"l": "l\u0308",
"m": "m\u0308",
"n": "n\u0308",
"s": "s\u0308"
}

View File

@ -12,20 +12,18 @@ from array import array
# Parse symbol names from keysymdef.h. Many compose sequences in
# en_US_UTF_8_Compose.pre reference theses. For example, all the sequences on
# the Greek, Cyrillic and Hebrew scripts need these symbols.
def parse_keysymdef_h():
with open(os.path.join(os.path.dirname(__file__), "keysymdef.h"), "r") as inp:
def parse_keysymdef_h(fname):
with open(fname, "r") as inp:
keysym_re = re.compile(r'^#define XK_(\S+)\s+\S+\s*/\*.U\+([0-9a-fA-F]+)\s')
for line in inp:
m = re.match(keysym_re, line)
if m != None:
yield (m.group(1), chr(int(m.group(2), 16)))
xkb_char_extra_names = dict(parse_keysymdef_h())
dropped_sequences = 0
# Parse XKB's Compose.pre files
def parse_sequences_file_xkb(fname):
def parse_sequences_file_xkb(fname, xkb_char_extra_names):
# Parse a line of the form:
# <Multi_key> <minus> <space> : "~" asciitilde # TILDE
# Sequences not starting with <Multi_key> are ignored.
@ -92,20 +90,47 @@ def parse_sequences_file_xkb(fname):
seqs.append(s)
return seqs
# Basic support for comments in json files. Reads a file
def strip_cstyle_comments(inp):
def strip_line(line):
i = line.find("//")
return line[:i] + "\n" if i >= 0 else line
return "".join(map(strip_line, inp))
# Parse from a json file containing a dictionary sequence → result string.
def parse_sequences_file_json(fname):
with open(fname, "r") as inp:
seqs = json.load(inp)
return list(seqs.items())
try:
with open(fname, "r") as inp:
seqs = json.loads(strip_cstyle_comments(inp))
return list(seqs.items())
except Exception as e:
print("Failed parsing '%s': %s" % (fname, str(e)), file=sys.stderr)
# Format of the sequences file is determined by its extension
def parse_sequences_file(fname):
def parse_sequences_file(fname, xkb_char_extra_names={}):
if fname.endswith(".pre"):
return parse_sequences_file_xkb(fname)
return parse_sequences_file_xkb(fname, xkb_char_extra_names)
if fname.endswith(".json"):
return parse_sequences_file_json(fname)
raise Exception(fname + ": Unsupported format")
# A sequence directory can contain several sequence files as well as
# 'keysymdef.h'.
def parse_sequences_dir(dname):
compose_files = []
xkb_char_extra_names = {}
# Parse keysymdef.h first if present
for fbasename in os.listdir(dname):
fname = os.path.join(dname, fbasename)
if fbasename == "keysymdef.h":
xkb_char_extra_names = dict(parse_keysymdef_h(fname))
else:
compose_files.append(fname)
sequences = []
for fname in compose_files:
sequences.extend(parse_sequences_file(fname, xkb_char_extra_names))
return sequences
# Turn a list of sequences into a trie.
def add_sequences_to_trie(seqs, trie):
def add_seq_to_trie(t_, seq, result):
@ -131,8 +156,10 @@ def add_sequences_to_trie(seqs, trie):
# Compile the trie into a state machine.
def make_automata(tries):
previous_leafs = {} # Deduplicate leafs
states = []
def add_tree(t):
this_node_index = len(states)
# Index and size of the new node
i = len(states)
s = len(t.keys())
@ -144,11 +171,14 @@ def make_automata(tries):
states.append((None, None))
# Add nested nodes and fill the current node
for c in sorted(t.keys()):
node_i = len(states)
add_node(t[c])
states[i] = (c, node_i)
states[i] = (c, add_node(t[c]))
i += 1
return this_node_index
def add_leaf(c):
if c in previous_leafs:
return previous_leafs[c]
this_node_index = len(states)
previous_leafs[c] = this_node_index
# There are two encoding for leafs: character final state for 15-bit
# characters and string final state for the rest.
if len(c) > 1 or ord(c[0]) > 32767: # String final state
@ -158,16 +188,14 @@ def make_automata(tries):
states.append((c, 0))
else: # Character final state
states.append((c, 1))
return this_node_index
def add_node(n):
if type(n) == str:
add_leaf(n)
return add_leaf(n)
else:
add_tree(n)
return add_tree(n)
states.append((1, 1)) # Add an empty state at the beginning.
entry_states = {}
for tname, tree_root in tries.items():
entry_states[tname] = len(states)
add_tree(tree_root)
entry_states = { n: add_tree(root) for n, root in tries.items() }
return entry_states, states
# Debug
@ -238,9 +266,12 @@ public final class ComposeKeyData
total_sequences = 0
tries = {} # Orderred dict
for fname in sys.argv[1:]:
for fname in sorted(sys.argv[1:]):
tname, _ = os.path.splitext(os.path.basename(fname))
sequences = parse_sequences_file(fname)
if os.path.isdir(fname):
sequences = parse_sequences_dir(fname)
else:
sequences = parse_sequences_file(fname)
add_sequences_to_trie(sequences, tries.setdefault(tname, {}))
total_sequences += len(sequences)
entry_states, automata = make_automata(tries)

View File

@ -0,0 +1,168 @@
{
"\"": {
"і": "ї"
},
",": {
"г": "ӻ",
"к": "ӄ",
"л": "ԓ",
"н": "ӈ",
"х": "ӽ",
"ѧ": "ӊ"
},
".": {
"г": "ӷ",
"ж": "җ",
"й": "ҋ",
"к": "қ",
"л": "ԯ",
"м": "ӎ",
"н": "ӊ",
"х": "ҳ",
"ч": "ҷ",
"і": "ї"
},
"а": {
"е": "ѣ",
"у": "ѡ",
"ч": "combining_acute",
"ы": "ѣ",
"ь": "ꙙ",
"ꙋ": "ꙍ",
"ꙑ": "ѣ"
},
"б": {
"ч": "combining_slavonic_psili"
},
"г": {
",": "ӻ",
".": "ӷ",
"й": "ғ",
"к": "ґ",
"х": "ҁ",
"ј": "ғ"
},
"д": {
"е": "ꙉ",
"ж": "џ",
"з": "ꙃ",
"й": "ꙉ",
"ј": "ꙉ",
"ѥ": "ђ"
},
"е": {
"ч": "combining_trema"
},
"ж": {
".": "җ"
},
"з": {
"ф": "ҙ"
},
"и": {
"и": "ӣ",
"у": "ѵ"
},
"й": {
".": "ҋ",
"ч": "combining_breve"
},
"к": {
",": "ӄ",
".": "қ",
"г": "ґ",
"с": "ѯ",
"х": "ҁ",
"ш": "ѯ"
},
"л": {
",": "ԓ",
".": "ԯ",
"ь": "љ"
},
"м": {
".": "ӎ"
},
"н": {
",": "ӈ",
"·": "ԩ",
"ч": "combining_titlo",
"ь": "њ"
},
"о": {
"т": "ѿ",
"у": "ѹ",
"ч": "combining_inverted_breve"
},
"п": {
"с": "ѱ"
},
"т": {
"й": "ћ",
"ф": "ѳ",
"ј": "ћ"
},
"у": {
"и": "ѵ",
"й": "ў",
"у": "ӯ",
"ч": "combining_porkrytie",
"і": "ѵ",
"ј": "ў"
},
"х": {
",": "ӽ",
".": "ҳ",
"ч": "combining_slavonic_dasia"
},
"ч": {
".": "ҷ",
"а": "combining_acute",
"б": "combining_slavonic_psili",
"е": "combining_trema",
"й": "combining_breve",
"н": "combining_titlo",
"о": "combining_inverted_breve",
"у": "combining_pokrytie",
"х": "combining_slavonic_dasia",
"ч": "combining_payerok",
"ч": "combining_payerok",
"ъ": "combining_vertical_tilde",
"ю": "combining_grave",
"ј": "combining_breve",
"ѧ": "combining_vzmet"
},
"ш": {
"т": "щ"
},
"ъ": {
"ч": "combining_vertical_tilde"
},
"ю": {
"а": "ꙓ",
"е": "ё",
"м": "ѭ",
"н": "ѩ",
"ч": "combining_grave"
},
"я": {
"ь": "ꙝ"
},
"і": {
"\"": "ї",
".": "ї",
"у": "ѵ",
"і": "ӣ"
},
"ј": {
"а": "ꙗ",
"ч": "combining_breve",
"ѣ": "ꙝ"
},
"ѡ": {
"т": "ѿ"
},
"ѧ": {
"ч": "combining_vzmet"
}
}

View File

@ -0,0 +1,11 @@
{
"V": {
"s": "Š",
"c": "Č",
"z": "Ž"
},
"\\": {
"n": "\\n",
"t": "\\t"
}
}

219
srcs/compose/fn.json Normal file
View File

@ -0,0 +1,219 @@
{
"1": "f1",
"2": "f2",
"3": "f3",
"4": "f4",
"5": "f5",
"6": "f6",
"7": "f7",
"8": "f8",
"9": "f9",
"0": "f10",
"<": "«",
">": "»",
"{": "",
"}": "",
"[": "",
"]": "",
"(": "“",
")": "”",
"'": "",
"\"": "„",
"-": "",
"_": "—",
"^": "¬",
"%": "‰",
"=": "≈",
"u": "µ",
"a": "æ",
"o": "œ",
"*": "°",
".": "…",
",": "·",
"!": "¡",
"?": "¿",
"|": "¦",
"§": "¶",
"†": "‡",
"×": "∙",
" ": "nbsp",
// arrows
"↖": "⇖",
"↑": "⇑",
"↗": "⇗",
"←": "⇐",
"→": "⇒",
"↙": "⇙",
"↓": "⇓",
"↘": "⇘",
"↔": "⇔",
"↕": "⇕",
// Currency symbols
"e": "€",
"l": "£",
"r": "₹",
"y": "¥",
"c": "¢",
"p": "₽",
"b": "₱",
"h": "₴",
"z": "₿",
// avoid showing these twice
"€": "removed",
"£": "removed",
// alternative greek letters
"π": "ϖ",
"θ": "ϑ",
"Θ": "ϴ",
"ε": "ϵ",
"β": "ϐ",
"ρ": "ϱ",
"σ": "ς",
"γ": "ɣ",
"φ": "ϕ",
"υ": "ϒ",
"κ": "ϰ",
// alternative math characters
"": "",
"∩": "⋂",
"∃": "∄",
"∈": "∉",
"∫": "∮",
"Π": "∏",
"Σ": "∑",
"": "",
"∧": "⋀",
"⊷": "⊶",
"⊂": "⊆",
"⊃": "⊇",
"±": "∓",
// hebrew niqqud
"ק": "qamats", // kamatz
"ר": "hataf_qamats", // reduced kamatz
"ו": "holam",
"ם": "rafe",
"פ": "patah", // patach
"ש": "sheva",
"ד": "dagesh", // or mapiq
"ח": "hiriq",
"ף": "hataf_patah", // reduced patach
"ז": "qubuts", // kubuts
"ס": "segol",
"ב": "hataf_segol", // reduced segol
"צ": "tsere",
// Devanagari symbols
"ए": "ऍ",
"े": "ॅ",
"ऐ": "ऎ",
"ै": "ॆ",
"ऋ": "ॠ",
"ृ": "ॄ",
"ळ": "ऴ",
"र": "ऱ",
"क": "क़",
"ख": "ख़",
"ग": "ग़",
"घ": "ॻ",
"ढ": "ढ़",
"न": "ऩ",
"ड": "ड़",
"ट": "ॸ",
"ण": "ॾ",
"फ": "फ़",
"ऌ": "ॡ",
"ॢ": "ॣ",
"औ": "ॵ",
"ौ": "ॏ",
"ओ": "ऒ",
"ो": "ॊ",
"च": "ॼ",
"ज": "ज़",
"ब": "ॿ",
"व": "ॺ",
"य": "य़",
"अ": "ॲ",
"आ": "ऑ",
"ा": "ॉ",
"झ": "ॹ",
"ई": "ॴ",
"ी": "ऻ",
"इ": "ॳ",
"ि": "ऺ",
"उ": "ॶ",
"ऊ": "ॷ",
"ु": "ऄ",
"ष": "क्ष",
"थ": "त्र",
"द": "द्र",
"प": "प्र",
"श": "श्र",
"छ": "श्च",
"ँ": "ऀ",
"₹": "₨",
"ॖ": "ॗ",
"॓": "॔",
"॰": "ॱ",
"।": "॥",
"ं": "ॕ",
"़": "ॎ",
"ऽ": "",
// Persian numbers
"۱": "f1",
"۲": "f2",
"۳": "f3",
"۴": "f4",
"۵": "f5",
"۶": "f6",
"۷": "f7",
"۸": "f8",
"۹": "f9",
// Arabic numbers
"۰": "f10",
"١": "f1",
"٢": "f2",
"٣": "f3",
"٤": "f4",
"٥": "f5",
"٦": "f6",
"٧": "f7",
"٨": "f8",
"٩": "f9",
"٠": "f10",
// Cyrillic
"ꙑ": "ы",
"ы": "ꙑ",
"ш": "ѱ",
"з": "ꙁ",
"и": "і",
"і": "и",
"я": "ꙗ",
"е": "ѥ",
"ѡ": "ꙍ",
"о": "ѻ",
"а": "ѣ",
"э": "є",
"ъ": "ь",
"ь": "ъ",
"й": "ј",
"ꙉ": "ђ",
"ч": "ћ",
"ҁ": "қ",
"қ": "ҁ",
"џ": "ҷ",
"ҷ": "џ",
"ј": "й",
"у": "ꙋ",
"м": "ѫ",
"н": "ѧ",
"с": "ѕ",
"л": "ԯ",
"ԓ": "ԯ",
"\ua67d": "\u0483",
"\u0487": "\ua66f",
"ӈ": "ԩ"
}

83
srcs/compose/shift.json Normal file
View File

@ -0,0 +1,83 @@
{
"↙": "⇙",
"↓": "⇓",
"↘": "⇘",
"←": "⇐",
"→": "⇒",
"↖": "⇖",
"↑": "⇑",
"↗": "⇗",
"└": "╚",
"┴": "╩",
"┘": "╝",
"├": "╠",
"┼": "╬",
"┤": "╣",
"┌": "╔",
"┬": "╦",
"┐": "╗",
"─": "═",
"│": "║",
// superscript
"ᵃ": "ᴬ",
"ᵇ": "ᴮ",
"ᶜ": "ꟲ",
"ᵈ": "ᴰ",
"ᵉ": "ᴱ",
"ᶠ": "ꟳ",
"ᵍ": "ᴳ",
"ʰ": "ᴴ",
"ⁱ": "ᴵ",
"ʲ": "ᴶ",
"ᵏ": "ᴷ",
"ˡ": "ᴸ",
"ᵐ": "ᴹ",
"ⁿ": "ᴺ",
"ᵒ": "ᴼ",
"ᵖ": "ᴾ",
"ʳ": "ᴿ",
"ᵗ": "ᵀ",
"ᵘ": "ᵁ",
"ᵛ": "ⱽ",
"ʷ": "ᵂ",
"ᶾ": "ᴣ",
"ᵠ": "ᶲ",
// german eszett has an uppercase, but because it is uncommon, java doesn't know about it
"ß": "ẞ",
// these characters don't have a preapplied uppercase version, so we use combining characters
"ẗ": "T\u0308",
"ẘ": "W\u030A",
"ẙ": "Y\u030A",
"ǰ": "J\u030C",
"ȷ": "J\u0307",
// In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
// return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
// has the inconvenient of swapping i and ı on the keyboard.
"ı": "İ",
"₹": "₨",
// Gujarati alternate characters
"અ": "આ",
"ઇ": "ઈ",
"િ": "ી",
"ઉ": "ઊ",
"ુ": "ૂ",
"એ": "ઐ",
"ે": "ૈ",
"ઓ": "ઔ",
"ો": "ૌ",
"ક": "ખ",
"ગ": "ઘ",
"ચ": "છ",
"જ": "ઝ",
"ટ": "ઠ",
"ડ": "ઢ",
"ન": "ણ",
"ત": "થ",
"દ": "ધ",
"પ": "ફ",
"બ": "ભ",
"મ": "ં",
"લ": "ળ",
"સ": "શ",
"હ": ""
}

View File

@ -74,6 +74,9 @@ public final class Autocapitalisation
if (_cursor > 0) _cursor--;
_should_update_caps_mode = true;
break;
case KeyEvent.KEYCODE_ENTER:
_should_update_caps_mode = true;
break;
}
callback(true);
}

View File

@ -0,0 +1,22 @@
package juloo.keyboard2;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;
import android.widget.CompoundButton;
final class ClipboardHistoryCheckBox extends CheckBox
implements CompoundButton.OnCheckedChangeListener
{
public ClipboardHistoryCheckBox(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton _v, boolean isChecked)
{
ClipboardHistoryService.set_history_enabled(isChecked);
}
}

View File

@ -0,0 +1,184 @@
package juloo.keyboard2;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build.VERSION;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public final class ClipboardHistoryService
{
/** Start the service on startup and start listening to clipboard changes. */
public static void on_startup(Context ctx, ClipboardPasteCallback cb)
{
get_service(ctx);
_paste_callback = cb;
}
/** Start the service if it hasn't been started before. Returns [null] if the
feature is unsupported. */
public static ClipboardHistoryService get_service(Context ctx)
{
if (VERSION.SDK_INT <= 11)
return null;
if (_service == null)
_service = new ClipboardHistoryService(ctx);
return _service;
}
public static void set_history_enabled(boolean e)
{
if (_service == null)
return;
Config.globalPrefs().edit()
.putBoolean("clipboard_history_enabled", e)
.commit();
if (e)
_service.add_current_clip();
else
_service.clear_history();
}
/** Send the given string to the editor. */
public static void paste(String clip)
{
if (_paste_callback != null)
_paste_callback.paste_from_clipboard_pane(clip);
}
/** The maximum size limits the amount of user data stored in memory but also
gives a sense to the user that the history is not persisted and can be
forgotten as soon as the app stops. */
public static final int MAX_HISTORY_SIZE = 3;
/** Time in ms until history entries expire. */
public static final long HISTORY_TTL_MS = 5 * 60 * 1000;
static ClipboardHistoryService _service = null;
static ClipboardPasteCallback _paste_callback = null;
ClipboardManager _cm;
List<HistoryEntry> _history;
OnClipboardHistoryChange _listener = null;
ClipboardHistoryService(Context ctx)
{
_history = new ArrayList<HistoryEntry>();
_cm = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
_cm.addPrimaryClipChangedListener(this.new SystemListener());
}
public List<String> clear_expired_and_get_history()
{
long now_ms = System.currentTimeMillis();
List<String> dst = new ArrayList<String>();
Iterator<HistoryEntry> it = _history.iterator();
while (it.hasNext())
{
HistoryEntry ent = it.next();
if (ent.expiry_timestamp <= now_ms)
it.remove();
else
dst.add(ent.content);
}
return dst;
}
/** This will call [on_clipboard_history_change]. */
public void remove_history_entry(String clip)
{
int last_pos = _history.size() - 1;
for (int pos = last_pos; pos >= 0; pos--)
{
if (!_history.get(pos).content.equals(clip))
continue;
// Removing the current clipboard, clear the system clipboard.
if (pos == last_pos)
{
if (VERSION.SDK_INT >= 28)
_cm.clearPrimaryClip();
else
_cm.setText("");
}
_history.remove(pos);
if (_listener != null)
_listener.on_clipboard_history_change();
}
}
/** Add clipboard entries to the history, skipping consecutive duplicates and
empty strings. */
public void add_clip(String clip)
{
if (!Config.globalConfig().clipboard_history_enabled)
return;
int size = _history.size();
if (clip.equals("") || (size > 0 && _history.get(size - 1).content.equals(clip)))
return;
if (size >= MAX_HISTORY_SIZE)
_history.remove(0);
_history.add(new HistoryEntry(clip));
if (_listener != null)
_listener.on_clipboard_history_change();
}
public void clear_history()
{
_history.clear();
if (_listener != null)
_listener.on_clipboard_history_change();
}
public void set_on_clipboard_history_change(OnClipboardHistoryChange l) { _listener = l; }
public static interface OnClipboardHistoryChange
{
public void on_clipboard_history_change();
}
/** Add what is currently in the system clipboard into the history. */
void add_current_clip()
{
ClipData clip = _cm.getPrimaryClip();
if (clip == null)
return;
int count = clip.getItemCount();
for (int i = 0; i < count; i++)
{
CharSequence text = clip.getItemAt(i).getText();
if (text != null)
add_clip(text.toString());
}
}
final class SystemListener implements ClipboardManager.OnPrimaryClipChangedListener
{
public SystemListener() {}
@Override
public void onPrimaryClipChanged()
{
add_current_clip();
}
}
static final class HistoryEntry
{
public final String content;
/** Time at which the entry expires. */
public final long expiry_timestamp;
public HistoryEntry(String c)
{
content = c;
expiry_timestamp = System.currentTimeMillis() + HISTORY_TTL_MS;
}
}
public interface ClipboardPasteCallback
{
public void paste_from_clipboard_pane(String content);
}
}

View File

@ -0,0 +1,125 @@
package juloo.keyboard2;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class ClipboardHistoryView extends NonScrollListView
implements ClipboardHistoryService.OnClipboardHistoryChange
{
List<String> _history;
ClipboardHistoryService _service;
ClipboardEntriesAdapter _adapter;
public ClipboardHistoryView(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
_history = Collections.EMPTY_LIST;
_adapter = this.new ClipboardEntriesAdapter();
_service = ClipboardHistoryService.get_service(ctx);
if (_service != null)
{
_service.set_on_clipboard_history_change(this);
_history = _service.clear_expired_and_get_history();
}
setAdapter(_adapter);
}
/** The history entry at index [pos] is removed from the history and added to
the list of pinned clipboards. */
public void pin_entry(int pos)
{
ClipboardPinView v = (ClipboardPinView)((ViewGroup)getParent().getParent()).findViewById(R.id.clipboard_pin_view);
String clip = _history.get(pos);
v.add_entry(clip);
_service.remove_history_entry(clip);
}
/** Send the specified entry to the editor. */
public void paste_entry(int pos)
{
ClipboardHistoryService.paste(_history.get(pos));
}
@Override
public void on_clipboard_history_change()
{
update_data();
}
@Override
protected void onWindowVisibilityChanged(int visibility)
{
if (visibility == View.VISIBLE)
update_data();
}
void update_data()
{
_history = _service.clear_expired_and_get_history();
_adapter.notifyDataSetChanged();
invalidate();
}
class ClipboardEntriesAdapter extends BaseAdapter
{
public ClipboardEntriesAdapter() {}
@Override
public int getCount() { return _history.size(); }
@Override
public Object getItem(int pos) { return _history.get(pos); }
@Override
public long getItemId(int pos) { return _history.get(pos).hashCode(); }
@Override
public View getView(final int pos, View v, ViewGroup _parent)
{
if (v == null)
v = View.inflate(getContext(), R.layout.clipboard_history_entry, null);
((TextView)v.findViewById(R.id.clipboard_entry_text))
.setText(_history.get(pos));
v.findViewById(R.id.clipboard_entry_addpin).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { pin_entry(pos); }
});
v.findViewById(R.id.clipboard_entry_paste).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { paste_entry(pos); }
});
// v.findViewById(R.id.clipboard_entry_removehist).setOnClickListener(
// new View.OnClickListener()
// {
// @Override
// public void onClick(View v)
// {
// AlertDialog d = new AlertDialog.Builder(getContext())
// .setTitle(R.string.clipboard_remove_confirm)
// .setPositiveButton(R.string.clipboard_remove_confirmed,
// new DialogInterface.OnClickListener(){
// public void onClick(DialogInterface _dialog, int _which)
// {
// _service.remove_history_entry(_history.get(pos));
// }
// })
// .setNegativeButton(android.R.string.cancel, null)
// .create();
// Utils.show_dialog_on_ime(d, v.getWindowToken());
// }
// });
return v;
}
}
}

View File

@ -0,0 +1,139 @@
package juloo.keyboard2;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
public final class ClipboardPinView extends NonScrollListView
{
/** Preference file name that store pinned clipboards. */
static final String PERSIST_FILE_NAME = "clipboards";
/** Preference name for pinned clipboards. */
static final String PERSIST_PREF = "pinned";
List<String> _entries;
ClipboardPinEntriesAdapter _adapter;
SharedPreferences _persist_store;
public ClipboardPinView(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
_entries = new ArrayList<String>();
_persist_store =
ctx.getSharedPreferences("pinned_clipboards", Context.MODE_PRIVATE);
load_from_prefs(_persist_store, _entries);
_adapter = this.new ClipboardPinEntriesAdapter();
setAdapter(_adapter);
}
/** Pin a clipboard and persist the change. */
public void add_entry(String text)
{
_entries.add(text);
_adapter.notifyDataSetChanged();
persist();
invalidate();
}
/** Remove the entry at index [pos] and persist the change. */
public void remove_entry(int pos)
{
if (pos < 0 || pos >= _entries.size())
return;
_entries.remove(pos);
_adapter.notifyDataSetChanged();
persist();
invalidate();
}
/** Send the specified entry to the editor. */
public void paste_entry(int pos)
{
ClipboardHistoryService.paste(_entries.get(pos));
}
void persist() { save_to_prefs(_persist_store, _entries); }
static void load_from_prefs(SharedPreferences store, List<String> dst)
{
String arr_s = store.getString(PERSIST_PREF, null);
if (arr_s == null)
return;
try
{
JSONArray arr = new JSONArray(arr_s);
for (int i = 0; i < arr.length(); i++)
dst.add(arr.getString(i));
}
catch (JSONException _e) {}
}
static void save_to_prefs(SharedPreferences store, List<String> entries)
{
JSONArray arr = new JSONArray();
for (int i = 0; i < entries.size(); i++)
arr.put(entries.get(i));
store.edit()
.putString(PERSIST_PREF, arr.toString())
.commit();
}
class ClipboardPinEntriesAdapter extends BaseAdapter
{
public ClipboardPinEntriesAdapter() {}
@Override
public int getCount() { return _entries.size(); }
@Override
public Object getItem(int pos) { return _entries.get(pos); }
@Override
public long getItemId(int pos) { return _entries.get(pos).hashCode(); }
@Override
public View getView(final int pos, View v, ViewGroup _parent)
{
if (v == null)
v = View.inflate(getContext(), R.layout.clipboard_pin_entry, null);
((TextView)v.findViewById(R.id.clipboard_pin_text))
.setText(_entries.get(pos));
v.findViewById(R.id.clipboard_pin_paste).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { paste_entry(pos); }
});
v.findViewById(R.id.clipboard_pin_remove).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog d = new AlertDialog.Builder(getContext())
.setTitle(R.string.clipboard_remove_confirm)
.setPositiveButton(R.string.clipboard_remove_confirmed,
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface _dialog, int _which)
{
remove_entry(pos);
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
Utils.show_dialog_on_ime(d, v.getWindowToken());
}
});
return v;
}
}
}

View File

@ -42,7 +42,7 @@ public final class ComposeKey
else if (next_header == 0xFFFF) // String final state
{
int next_length = edges[next];
return KeyValue.makeStringKey(
return KeyValue.getKeyByName(
new String(states, next + 1, next_length - 1));
}
else // Character final state.

View File

@ -67,6 +67,7 @@ public final class Config
public boolean pin_entry_enabled;
public boolean borderConfig;
public int circle_sensitivity;
public boolean clipboard_history_enabled;
// Dynamically set
public boolean shouldOfferVoiceTyping;
@ -174,7 +175,7 @@ public final class Config
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
characterSize =
_prefs.getFloat("character_size", 1.f)
_prefs.getFloat("character_size", 1.15f)
* characterSizeScale;
theme = getThemeId(res, _prefs.getString("theme", ""));
autocapitalisation = _prefs.getBoolean("autocapitalisation", true);
@ -185,6 +186,7 @@ public final class Config
current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2"));
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
}
public int get_current_layout()
@ -208,8 +210,7 @@ public final class Config
KeyValue action_key()
{
// Update the name to avoid caching in KeyModifier
return (actionLabel == null) ? null :
KeyValue.getKeyByName("action").withSymbol(actionLabel);
return (actionLabel == null) ? null : KeyValue.makeActionKey(actionLabel);
}
/** Update the layout according to the configuration.
@ -232,7 +233,7 @@ public final class Config
extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE);
extra_keys.putAll(extra_keys_param);
extra_keys.putAll(extra_keys_custom);
if (extra_keys_subtype != null)
if (extra_keys_subtype != null && kw.locale_extra_keys)
{
Set<KeyValue> present = new HashSet<KeyValue>();
present.addAll(kw.getKeys().keySet());
@ -300,10 +301,10 @@ public final class Config
});
if (show_numpad)
kw = kw.addNumPad(modify_numpad(num_pad, kw));
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
if (extra_keys.size() > 0)
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
return kw;
}
@ -403,6 +404,7 @@ public final class Config
private int getThemeId(Resources res, String theme_name)
{
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (theme_name)
{
case "light": return R.style.Light;
@ -413,9 +415,15 @@ public final class Config
case "epaper": return R.style.ePaper;
case "desert": return R.style.Desert;
case "jungle": return R.style.Jungle;
case "monetlight": return R.style.MonetLight;
case "monetdark": return R.style.MonetDark;
case "monet":
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
return R.style.MonetLight;
return R.style.MonetDark;
case "rosepine": return R.style.RosePine;
default:
case "system":
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
return R.style.Light;
return R.style.Dark;

View File

@ -10,7 +10,9 @@ import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import java.util.Iterator;
public final class KeyEventHandler implements Config.IKeyEventHandler
public final class KeyEventHandler
implements Config.IKeyEventHandler,
ClipboardHistoryService.ClipboardPasteCallback
{
IReceiver _recv;
Autocapitalisation _autocap;
@ -58,10 +60,10 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
{
if (key == null)
return;
// Stop auto capitalisation when pressing some keys
switch (key.getKind())
{
case Modifier:
// Stop auto capitalisation when activating a system modifier
switch (key.getModifier())
{
case CTRL:
@ -71,6 +73,9 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
break;
}
break;
case Compose_pending:
_autocap.stop();
break;
default: break;
}
}
@ -95,6 +100,7 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
_recv.set_compose_pending(true);
break;
case Cursor_move: move_cursor(key.getCursorMove()); break;
case Complex: send_complex_key(key.getComplexKind(), key.getComplex()); break;
}
update_meta_state(old_mods);
}
@ -105,6 +111,12 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
update_meta_state(mods);
}
@Override
public void paste_from_clipboard_pane(String content)
{
send_text(content);
}
/** Update [_mods] to be consistent with the [mods], sending key events if
needed. */
void update_meta_state(Pointers.Modifiers mods)
@ -207,6 +219,16 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
conn.performContextMenuAction(id);
}
void send_complex_key(KeyValue.Complex.Kind kind, KeyValue.Complex val)
{
switch (kind)
{
case StringWithSymbol:
send_text(((KeyValue.Complex.StringWithSymbol)val).str);
break;
}
}
@SuppressLint("InlinedApi")
void handle_editing_key(KeyValue.Editing ev)
{

View File

@ -51,7 +51,7 @@ public final class KeyModifier
{
switch (mod)
{
case CTRL:
case CTRL: return apply_ctrl(k);
case ALT:
case META: return turn_into_keyevent(k);
case FN: return apply_fn(k);
@ -182,9 +182,10 @@ public final class KeyModifier
{
case Char:
char kc = k.getChar();
char c = map_char_shift(kc);
if (kc == c)
c = Character.toUpperCase(kc);
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, kc);
if (r != null)
return r;
char c = Character.toUpperCase(kc);
return (kc == c) ? k : k.withChar(c);
case String:
String s = Utils.capitalize_string(k.getString());
@ -204,7 +205,9 @@ public final class KeyModifier
String name = null;
switch (k.getKind())
{
case Char: name = apply_fn_char(k.getChar()); break;
case Char:
KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k.getChar());
return (r != null) ? r : k;
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
case Event: name = apply_fn_event(k.getEvent()); break;
case Placeholder: name = apply_fn_placeholder(k.getPlaceholder()); break;
@ -253,191 +256,17 @@ public final class KeyModifier
}
}
/** Return the name of modified key, or [null]. */
private static String apply_fn_char(char c)
private static KeyValue apply_ctrl(KeyValue k)
{
switch (c)
if (_modmap != null)
{
case '1': return "f1";
case '2': return "f2";
case '3': return "f3";
case '4': return "f4";
case '5': return "f5";
case '6': return "f6";
case '7': return "f7";
case '8': return "f8";
case '9': return "f9";
case '0': return "f10";
case '<': return "«";
case '>': return "»";
case '{': return "";
case '}': return "";
case '[': return "";
case ']': return "";
case '(': return "";
case ')': return "";
case '\'': return "";
case '"': return "";
case '-': return "";
case '_': return "";
case '^': return "¬";
case '%': return "";
case '=': return "";
case 'u': return "µ";
case 'a': return "æ";
case 'o': return "œ";
case '*': return "°";
case '.': return "";
case ',': return "·";
case '!': return "¡";
case '?': return "¿";
case '|': return "¦";
case '§': return "";
case '†': return "";
case '×': return "";
case ' ': return "nbsp";
// arrows
case '↖': return "";
case '↑': return "";
case '↗': return "";
case '←': return "";
case '→': return "";
case '↙': return "";
case '↓': return "";
case '↘': return "";
case '↔': return "";
case '↕': return "";
// Currency symbols
case 'e': return "";
case 'l': return "£";
case 'r': return "";
case 'y': return "¥";
case 'c': return "¢";
case 'p': return "";
case 'b': return "";
case 'h': return "";
case 'z': return "";
case '€': case '£': return "removed"; // Avoid showing these twice
// alternating greek letters
case 'π': return "ϖ";
case 'θ': return "ϑ";
case 'Θ': return "ϴ";
case 'ε': return "ϵ";
case 'β': return "ϐ";
case 'ρ': return "ϱ";
case 'σ': return "ς";
case 'γ': return "ɣ";
case 'φ': return "ϕ";
case 'υ': return "ϒ";
case 'κ': return "ϰ";
// alternating math characters
case '': return "";
case '∩': return "";
case '∃': return "";
case '∈': return "";
case '∫': return "";
case 'Π': return "";
case 'Σ': return "";
case '': return "";
case '∧': return "";
case '⊷': return "";
case '⊂': return "";
case '⊃': return "";
case '±': return "";
// hebrew niqqud
case 'ק': return "qamats"; // kamatz
case 'ר': return "hataf_qamats"; // reduced kamatz
case 'ו': return "holam";
case 'ם': return "rafe";
case 'פ': return "patah"; // patach
case 'ש': return "sheva";
case 'ד': return "dagesh"; // or mapiq
case 'ח': return "hiriq";
case 'ף': return "hataf_patah"; // reduced patach
case 'ז': return "qubuts"; // kubuts
case 'ס': return "segol";
case 'ב': return "hataf_segol"; // reduced segol
case 'צ': return "tsere";
// Devanagari symbols
case 'ए': return "";
case 'े': return "";
case 'ऐ': return "";
case 'ै': return "";
case 'ऋ': return "";
case 'ृ': return "";
case 'ळ': return "";
case 'र': return "";
case 'क': return "";
case 'ख': return "";
case 'ग': return "";
case 'घ': return "";
case 'ढ': return "";
case 'न': return "";
case 'ड': return "";
case 'ट': return "";
case 'ण': return "";
case 'फ': return "";
case 'ऌ': return "";
case 'ॢ': return "";
case 'औ': return "";
case 'ौ': return "";
case 'ओ': return "";
case 'ो': return "";
case 'च': return "";
case 'ज': return "";
case 'ब': return "ॿ";
case 'व': return "";
case 'य': return "";
case 'अ': return "";
case 'आ': return "";
case 'ा': return "";
case 'झ': return "";
case 'ई': return "";
case 'ी': return "";
case 'इ': return "";
case 'ि': return "";
case 'उ': return "";
case 'ऊ': return "";
case 'ु': return "";
case 'ष': return "क्ष";
case 'थ': return "त्र";
case 'द': return "द्र";
case 'प': return "प्र";
case 'श': return "श्र";
case 'छ': return "श्च";
case 'ँ': return "";
case '₹': return "";
case 'ॖ': return "";
case '॓': return "";
case '॰': return "";
case '।': return "";
case 'ं': return "";
case '़': return "";
case 'ऽ': return "";
// Persian numbers
case '۱': return "f1";
case '۲': return "f2";
case '۳': return "f3";
case '۴': return "f4";
case '۵': return "f5";
case '۶': return "f6";
case '۷': return "f7";
case '۸': return "f8";
case '۹': return "f9";
case '۰': return "f10";
// Arabic numbers
case '١': return "f1";
case '٢': return "f2";
case '٣': return "f3";
case '٤': return "f4";
case '٥': return "f5";
case '٦': return "f6";
case '٧': return "f7";
case '٨': return "f8";
case '٩': return "f9";
case '٠': return "f10";
default: return null;
KeyValue mapped = _modmap.ctrl.get(k);
// Do not return the modified character right away, first turn it into a
// key event.
if (mapped != null)
k = mapped;
}
return turn_into_keyevent(k);
}
private static KeyValue turn_into_keyevent(KeyValue k)
@ -527,64 +356,6 @@ public final class KeyModifier
public String apply(char _c) { return null; }
};
private static char map_char_shift(char c)
{
switch (c)
{
case '↙': return '⇙';
case '↓': return '⇓';
case '↘': return '⇘';
case '←': return '⇐';
case '→': return '⇒';
case '↖': return '⇖';
case '↑': return '⇑';
case '↗': return '⇗';
case '└': return '╚';
case '┴': return '╩';
case '┘': return '╝';
case '├': return '╠';
case '┼': return '╬';
case '┤': return '╣';
case '┌': return '╔';
case '┬': return '╦';
case '┐': return '╗';
case '─': return '═';
case '│': return '║';
case 'ß': return 'ẞ';
/* In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
has the inconvenient of swapping i and ı on the keyboard. */
case 'ı': return 'İ';
case '₹': return '₨';
// Gujarati alternate characters
case 'અ': return 'આ';
case 'ઇ': return 'ઈ';
case 'િ': return 'ી';
case 'ઉ': return 'ઊ';
case 'ુ': return 'ૂ';
case 'એ': return 'ઐ';
case 'ે': return 'ૈ';
case 'ઓ': return 'ઔ';
case 'ો': return 'ૌ';
case 'ક': return 'ખ';
case 'ગ': return 'ઘ';
case 'ચ': return 'છ';
case 'જ': return 'ઝ';
case 'ટ': return 'ઠ';
case 'ડ': return 'ઢ';
case 'ન': return 'ણ';
case 'ત': return 'થ';
case 'દ': return 'ધ';
case 'પ': return 'ફ';
case 'બ': return 'ભ';
case 'મ': return 'ં';
case 'લ': return 'ળ';
case 'સ': return 'શ';
case 'હ': return '';
default: return c;
}
}
private static final Map_char map_char_arrow_right =
new Map_char() {
public String apply(char c)

View File

@ -12,6 +12,8 @@ public final class KeyValue implements Comparable<KeyValue>
SWITCH_NUMERIC,
SWITCH_EMOJI,
SWITCH_BACK_EMOJI,
SWITCH_CLIPBOARD,
SWITCH_BACK_CLIPBOARD,
CHANGE_METHOD_PICKER,
CHANGE_METHOD_AUTO,
ACTION,
@ -89,7 +91,8 @@ public final class KeyValue implements Comparable<KeyValue>
{
Char, String, Keyevent, Event, Compose_pending, Hangul_initial,
Hangul_medial, Modifier, Editing, Placeholder,
Cursor_move // Value is encoded as a 16-bit integer
Cursor_move, // Value is encoded as a 16-bit integer.
Complex, // [_payload] is a [KeyValue.Complex], value is [Complex.Kind].
}
private static final int FLAGS_OFFSET = 19;
@ -127,7 +130,13 @@ public final class KeyValue implements Comparable<KeyValue>
check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0);
}
private final String _symbol;
/**
* The symbol that is rendered on the keyboard as a [String].
* Except for keys of kind:
* - [String], this is also the string to output.
* - [Complex], this is an instance of [KeyValue.Complex].
*/
private final Object _payload;
/** This field encodes three things: Kind, flags and value. */
private final int _code;
@ -151,7 +160,9 @@ public final class KeyValue implements Comparable<KeyValue>
When [getKind() == Kind.String], also the string to send. */
public String getString()
{
return _symbol;
if (getKind() == Kind.Complex)
return ((Complex)_payload).getSymbol();
return (String)_payload;
}
/** Defined only when [getKind() == Kind.Char]. */
@ -209,25 +220,32 @@ public final class KeyValue implements Comparable<KeyValue>
return (short)(_code & VALUE_BITS);
}
/** Defined only when [getKind() == Kind.Complex]. */
public Complex getComplex()
{
return (Complex)_payload;
}
/** Defined only when [getKind() == Kind.Complex]. */
public Complex.Kind getComplexKind()
{
return Complex.Kind.values()[(_code & VALUE_BITS)];
}
/* Update the char and the symbol. */
public KeyValue withChar(char c)
{
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
}
public KeyValue withSymbol(String s)
{
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
}
public KeyValue withKeyevent(int code)
{
return new KeyValue(_symbol, Kind.Keyevent, code, getFlags());
return new KeyValue(getString(), Kind.Keyevent, code, getFlags());
}
public KeyValue withFlags(int f)
{
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), f);
return new KeyValue(_payload, (_code & KIND_BITS), (_code & VALUE_BITS), f);
}
@Override
@ -245,7 +263,9 @@ public final class KeyValue implements Comparable<KeyValue>
d = _code - snd._code;
if (d != 0)
return d;
return _symbol.compareTo(snd._symbol);
if (getKind() == Kind.Complex)
return ((Complex)_payload).compareTo((Complex)snd._payload);
return ((String)_payload).compareTo((String)snd._payload);
}
/** Type-safe alternative to [equals]. */
@ -253,24 +273,36 @@ public final class KeyValue implements Comparable<KeyValue>
{
if (snd == null)
return false;
return _symbol.equals(snd._symbol) && _code == snd._code;
return _code == snd._code && _payload.equals(snd._payload);
}
@Override
public int hashCode()
{
return _symbol.hashCode() + _code;
return _payload.hashCode() + _code;
}
public KeyValue(String s, int kind, int value, int flags)
public String toString()
{
_symbol = s;
int value = _code & VALUE_BITS;
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
}
private KeyValue(Object p, int kind, int value, int flags)
{
_payload = p;
_code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS);
}
public KeyValue(String s, Kind k, int v, int f)
public KeyValue(Complex p, Complex.Kind value, int flags)
{
this(s, (k.ordinal() << KIND_OFFSET), v, f);
this((Object)p, (Kind.Complex.ordinal() << KIND_OFFSET), value.ordinal(),
flags);
}
public KeyValue(String p, Kind k, int v, int f)
{
this(p, (k.ordinal() << KIND_OFFSET), v, f);
}
private static KeyValue charKey(String symbol, char c, int flags)
@ -361,7 +393,19 @@ public final class KeyValue implements Comparable<KeyValue>
public static KeyValue makeCharKey(char c)
{
return new KeyValue(String.valueOf(c), Kind.Char, c, 0);
return makeCharKey(c, null, 0);
}
public static KeyValue makeCharKey(char c, String symbol, int flags)
{
if (symbol == null)
symbol = String.valueOf(c);
return new KeyValue(symbol, Kind.Char, c, flags);
}
public static KeyValue makeCharKey(int symbol, char c, int flags)
{
return makeCharKey(c, String.valueOf((char)symbol), flags | FLAG_KEY_FONT);
}
public static KeyValue makeComposePending(String symbol, int state, int flags)
@ -395,6 +439,11 @@ public final class KeyValue implements Comparable<KeyValue>
return KeyValue.makeCharKey((char)precomposed);
}
public static KeyValue makeActionKey(String symbol)
{
return eventKey(symbol, Event.ACTION, FLAG_SMALLER_FONT);
}
/** Make a key that types a string. A char key is returned for a string of
length 1. */
public static KeyValue makeStringKey(String str, int flags)
@ -405,12 +454,36 @@ public final class KeyValue implements Comparable<KeyValue>
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
}
public static KeyValue makeStringKeyWithSymbol(String str, String symbol, int flags)
{
return new KeyValue(new Complex.StringWithSymbol(str, symbol),
Complex.Kind.StringWithSymbol, flags);
}
/** Make a modifier key for passing to [KeyModifier]. */
public static KeyValue makeInternalModifier(Modifier mod)
{
return new KeyValue("", Kind.Modifier, mod.ordinal(), 0);
}
public static KeyValue parseKeyDefinition(String str)
{
if (str.length() < 2 || str.charAt(0) != ':')
return makeStringKey(str);
try
{
return KeyValueParser.parse(str);
}
catch (KeyValueParser.ParseError _e)
{
return makeStringKey(str);
}
}
/**
* Return a key by its name. If the given name doesn't correspond to a key
* defined in this function, it is passed to [parseStringKey] as a fallback.
*/
public static KeyValue getKeyByName(String name)
{
switch (name)
@ -454,12 +527,46 @@ public final class KeyValue implements Comparable<KeyValue>
case "fn": return modifierKey("Fn", Modifier.FN, 0);
case "meta": return modifierKey("Meta", Modifier.META, 0);
/* Combining diacritics */
/* Glyphs is the corresponding dead-key + 0x0100. */
case "combining_dot_above": return makeCharKey(0xE15A, '\u0307', 0);
case "combining_double_aigu": return makeCharKey(0xE15B, '\u030B', 0);
case "combining_slash": return makeCharKey(0xE15C, '\u0337', 0);
case "combining_arrow_right": return makeCharKey(0xE15D, '\u20D7', 0);
case "combining_breve": return makeCharKey(0xE15E, '\u0306', 0);
case "combining_bar": return makeCharKey(0xE15F, '\u0335', 0);
case "combining_aigu": return makeCharKey(0xE150, '\u0301', 0);
case "combining_caron": return makeCharKey(0xE151, '\u030C', 0);
case "combining_cedille": return makeCharKey(0xE152, '\u0327', 0);
case "combining_circonflexe": return makeCharKey(0xE153, '\u0302', 0);
case "combining_grave": return makeCharKey(0xE154, '\u0300', 0);
case "combining_macron": return makeCharKey(0xE155, '\u0304', 0);
case "combining_ring": return makeCharKey(0xE156, '\u030A', 0);
case "combining_tilde": return makeCharKey(0xE157, '\u0303', 0);
case "combining_trema": return makeCharKey(0xE158, '\u0308', 0);
case "combining_ogonek": return makeCharKey(0xE159, '\u0328', 0);
case "combining_dot_below": return makeCharKey(0xE160, '\u0323', 0);
case "combining_horn": return makeCharKey(0xE161, '\u031B', 0);
case "combining_hook_above": return makeCharKey(0xE162, '\u0309', 0);
/* Combining diacritics that do not have a corresponding dead keys start
at 0xE200. */
case "combining_vertical_tilde": return makeCharKey(0xE200, '\u033E', 0);
case "combining_inverted_breve": return makeCharKey(0xE201, '\u0311', 0);
case "combining_pokrytie": return makeCharKey(0xE202, '\u0487', 0);
case "combining_slavonic_psili": return makeCharKey(0xE203, '\u0486', 0);
case "combining_slavonic_dasia": return makeCharKey(0xE204, '\u0485', 0);
case "combining_payerok": return makeCharKey(0xE205, '\uA67D', 0);
case "combining_titlo": return makeCharKey(0xE206, '\u0483', 0);
case "combining_vzmet": return makeCharKey(0xE207, '\uA66F', 0);
/* Special event keys */
case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT);
case "switch_text": return eventKey("ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT);
case "switch_numeric": return eventKey("123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT);
case "switch_emoji": return eventKey(0xE001, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT);
case "switch_back_emoji": return eventKey("ABC", Event.SWITCH_BACK_EMOJI, 0);
case "switch_clipboard": return eventKey(0xE017, Event.SWITCH_CLIPBOARD, 0);
case "switch_back_clipboard": return eventKey("ABC", Event.SWITCH_BACK_CLIPBOARD, 0);
case "switch_forward": return eventKey(0xE013, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT);
case "switch_backward": return eventKey(0xE014, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT);
case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT);
@ -479,8 +586,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, 0);
case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0);
case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, 0);
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, 0);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT);
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, FLAG_SMALLER_FONT);
case "backspace": return keyeventKey(0xE011, KeyEvent.KEYCODE_DEL, 0);
case "delete": return keyeventKey(0xE010, KeyEvent.KEYCODE_FORWARD_DEL, 0);
case "insert": return keyeventKey("Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
@ -497,6 +604,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "f11": return keyeventKey("F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
case "f12": return keyeventKey("F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
case "tab": return keyeventKey(0xE00F, KeyEvent.KEYCODE_TAB, FLAG_SMALLER_FONT);
case "menu": return keyeventKey("Menu", KeyEvent.KEYCODE_MENU, FLAG_SMALLER_FONT);
case "scroll_lock": return keyeventKey("Scrl", KeyEvent.KEYCODE_SCROLL_LOCK, FLAG_SMALLER_FONT);
/* Spaces */
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
@ -546,7 +655,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "meteg_placeholder": return placeholderKey(Placeholder.METEG);
/* intending/preventing ligature - supported by many scripts*/
case "zwj": return charKey("zwj", '\u200D', 0); // zero-width joiner (provides ligature)
case "zwnj": return charKey("zwnj", '\u200C', 0); // zero-width non joiner (prevents unintended ligature)
case "zwnj":
case "halfspace": return charKey("", '\u200C', 0); // zero-width non joiner
/* Editing keys */
case "copy": return editingKey(0xE030, Editing.COPY);
@ -565,7 +675,7 @@ public final class KeyValue implements Comparable<KeyValue>
case "autofill": return editingKey("auto", Editing.AUTOFILL);
/* The compose key */
case "compose": return makeComposePending(0xE016, ComposeKeyData.en_US_UTF_8_Compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
case "compose": return makeComposePending(0xE016, ComposeKeyData.compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
/* Placeholder keys */
case "removed": return placeholderKey(Placeholder.REMOVED);
@ -593,8 +703,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "": return makeHangulInitial("", 17);
case "": return makeHangulInitial("", 18);
/* Fallback to a string key that types its name */
default: return makeStringKey(name);
/* The key is not one of the special ones. */
default: return parseKeyDefinition(name);
}
}
@ -604,4 +714,49 @@ public final class KeyValue implements Comparable<KeyValue>
if (!b)
throw new RuntimeException("Assertion failure");
}
public static abstract class Complex
{
public abstract String getSymbol();
/** [compareTo] can assume that [snd] is an instance of the same class. */
public abstract int compareTo(Complex snd);
public boolean equals(Object snd)
{
if (snd instanceof Complex)
return compareTo((Complex)snd) == 0;
return false;
}
/** [hashCode] will be called on this class. */
/** The kind is stored in the [value] field of the key. */
public static enum Kind
{
StringWithSymbol,
}
public static final class StringWithSymbol extends Complex
{
public final String str;
private final String _symbol;
public StringWithSymbol(String _str, String _sym)
{
str = _str;
_symbol = _sym;
}
public String getSymbol() { return _symbol; }
public int compareTo(Complex _snd)
{
StringWithSymbol snd = (StringWithSymbol)_snd;
int d = str.compareTo(snd.str);
if (d != 0) return d;
return _symbol.compareTo(snd._symbol);
}
}
};
}

View File

@ -0,0 +1,148 @@
package juloo.keyboard2;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
Parse a key definition. The syntax for a key definition is:
- [:(kind) (attributes):(payload)].
- If [str] doesn't start with a [:] character, it is interpreted as an
arbitrary string key.
For the different kinds and attributes, see doc/Possible-key-values.md.
Examples:
- [:str flags=dim,small symbol='MyKey':'My arbitrary string'].
- [:str:'My arbitrary string'].
*/
public final class KeyValueParser
{
static Pattern START_PAT;
static Pattern ATTR_PAT;
static Pattern QUOTED_PAT;
static Pattern PAYLOAD_START_PAT;
static Pattern SINGLE_CHAR_PAT;
static public KeyValue parse(String str) throws ParseError
{
String symbol = null;
int flags = 0;
init();
// Kind
Matcher m = START_PAT.matcher(str);
if (!m.lookingAt())
parseError("Expected kind, for example \":str ...\".", m);
String kind = m.group(1);
// Attributes
while (true)
{
if (!match(m, ATTR_PAT))
break;
String attr_name = m.group(1);
String attr_value = parseSingleQuotedString(m);
switch (attr_name)
{
case "flags":
flags = parseFlags(attr_value, m);
break;
case "symbol":
symbol = attr_value;
break;
default:
parseError("Unknown attribute "+attr_name, m);
}
}
// Payload
if (!match(m, PAYLOAD_START_PAT))
parseError("Unexpected character", m);
switch (kind)
{
case "str":
String str_payload = parseSingleQuotedString(m);
if (symbol == null)
return KeyValue.makeStringKey(str_payload, flags);
return KeyValue.makeStringKeyWithSymbol(str_payload, symbol, flags);
case "char":
char char_payload = parseOneChar(m);
return KeyValue.makeCharKey(char_payload, symbol, flags);
default: break;
}
parseError("Unknown kind '"+kind+"'", m, 1);
return null; // Unreachable
}
static String parseSingleQuotedString(Matcher m) throws ParseError
{
if (!match(m, QUOTED_PAT))
parseError("Expected quoted string", m);
return m.group(1).replace("\\'", "'");
}
static char parseOneChar(Matcher m) throws ParseError
{
if (!match(m, SINGLE_CHAR_PAT))
parseError("Expected a character", m);
return m.group(0).charAt(0);
}
static int parseFlags(String s, Matcher m) throws ParseError
{
int flags = 0;
for (String f : s.split(","))
{
switch (f)
{
case "dim": flags |= KeyValue.FLAG_SECONDARY; break;
case "small": flags |= KeyValue.FLAG_SMALLER_FONT; break;
default: parseError("Unknown flag "+f, m);
}
}
return flags;
}
static boolean match(Matcher m, Pattern pat)
{
try { m.region(m.end(), m.regionEnd()); } catch (Exception _e) {}
m.usePattern(pat);
return m.lookingAt();
}
static void init()
{
if (START_PAT != null)
return;
START_PAT = Pattern.compile(":(\\w+)");
ATTR_PAT = Pattern.compile("\\s*(\\w+)\\s*=");
QUOTED_PAT = Pattern.compile("'(([^'\\\\]+|\\\\')*)'");
PAYLOAD_START_PAT = Pattern.compile("\\s*:");
SINGLE_CHAR_PAT = Pattern.compile(".");
}
static void parseError(String msg, Matcher m) throws ParseError
{
parseError(msg, m, m.regionStart());
}
static void parseError(String msg, Matcher m, int i) throws ParseError
{
StringBuilder msg_ = new StringBuilder("Syntax error");
try
{
char c = m.group(0).charAt(0);
msg_.append(" at character '").append(c).append("'");
} catch (IllegalStateException _e) {}
msg_.append(" at position ");
msg_.append(i);
msg_.append(": ");
msg_.append(msg);
throw new ParseError(msg_.toString());
}
public static class ParseError extends Exception
{
public ParseError(String msg) { super(msg); }
};
}

View File

@ -36,6 +36,7 @@ public class Keyboard2 extends InputMethodService
/** Layout associated with the currently selected locale. Not 'null'. */
private KeyboardData _localeTextLayout;
private ViewGroup _emojiPane = null;
private ViewGroup _clipboard_pane = null;
public int actionId; // Action performed by the Action key.
private Config _config;
@ -113,6 +114,7 @@ public class Keyboard2 extends InputMethodService
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_keyboardView.reset();
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
ClipboardHistoryService.on_startup(this, _keyeventhandler);
}
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
@ -134,13 +136,9 @@ public class Keyboard2 extends InputMethodService
return ExtraKeys.EMPTY;
}
@TargetApi(12)
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
private void refreshAccentsOption(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
{
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>();
// Gather extra keys from all enabled subtypes
extra_keys.add(extra_keys_of_subtype(subtype));
for (InputMethodSubtype s : enabled_subtypes)
extra_keys.add(extra_keys_of_subtype(s));
_config.extra_keys_subtype = ExtraKeys.merge(extra_keys);
@ -151,6 +149,20 @@ public class Keyboard2 extends InputMethodService
return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
}
@TargetApi(12)
private InputMethodSubtype defaultSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
{
if (VERSION.SDK_INT < 24)
return imm.getCurrentInputMethodSubtype();
// Android might return a random subtype, for example, the first in the
// list alphabetically.
InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype();
for (InputMethodSubtype s : enabled_subtypes)
if (s.getLanguageTag().equals(current_subtype.getLanguageTag()))
return s;
return null;
}
private void refreshSubtypeImm()
{
InputMethodManager imm = get_imm();
@ -159,13 +171,14 @@ public class Keyboard2 extends InputMethodService
_config.extra_keys_subtype = null;
if (VERSION.SDK_INT >= 12)
{
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
InputMethodSubtype subtype = defaultSubtypes(imm, enabled_subtypes);
if (subtype != null)
{
String s = subtype.getExtraValueOf("default_layout");
if (s != null)
default_layout = LayoutsPreference.layout_of_string(getResources(), s);
refreshAccentsOption(imm, subtype);
refreshAccentsOption(imm, enabled_subtypes);
}
}
if (default_layout == null)
@ -223,6 +236,7 @@ public class Keyboard2 extends InputMethodService
{
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_emojiPane = null;
_clipboard_pane = null;
setInputView(_keyboardView);
}
_keyboardView.reset();
@ -384,7 +398,14 @@ public class Keyboard2 extends InputMethodService
setInputView(_emojiPane);
break;
case SWITCH_CLIPBOARD:
if (_clipboard_pane == null)
_clipboard_pane = (ViewGroup)inflate_view(R.layout.clipboard_pane);
setInputView(_clipboard_pane);
break;
case SWITCH_BACK_EMOJI:
case SWITCH_BACK_CLIPBOARD:
setInputView(_keyboardView);
break;

View File

@ -31,6 +31,8 @@ public final class KeyboardData
public final String name;
/** Whether the bottom row should be added. */
public final boolean bottom_row;
/** Whether extra keys from [method.xml] should be added to this layout. */
public final boolean locale_extra_keys;
/** Position of every keys on the layout, see [getKeys()]. */
private Map<KeyValue, KeyPos> _key_pos = null;
@ -69,13 +71,15 @@ public final class KeyboardData
KeyPos next_to_pos = getKeys().get(pos.next_to);
// Use preferred direction if some preferred pos match
if (next_to_pos != null)
{
for (KeyPos p : pos.positions)
if ((p.row == -1 || p.row == next_to_pos.row)
&& (p.col == -1 || p.col == next_to_pos.col)
&& add_key_to_pos(rows, kv, next_to_pos.with_dir(p.dir)))
return true;
if (add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
return true;
if (add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
return true;
}
}
for (KeyPos p : pos.positions)
if (add_key_to_pos(rows, kv, p))
@ -189,21 +193,22 @@ public final class KeyboardData
/** Load a layout from a resource ID. Returns [null] on error. */
public static KeyboardData load(Resources res, int id)
{
KeyboardData l = _layoutCache.get(id);
if (l == null)
if (_layoutCache.containsKey(id))
return _layoutCache.get(id);
KeyboardData l = null;
XmlResourceParser parser = null;
try
{
try
{
XmlResourceParser parser = res.getXml(id);
l = parse_keyboard(parser);
parser.close();
_layoutCache.put(id, l);
}
catch (Exception e)
{
e.printStackTrace();
}
parser = res.getXml(id);
l = parse_keyboard(parser);
}
catch (Exception e)
{
Logs.exn("Failed to load layout id " + id, e);
}
if (parser != null)
parser.close();
_layoutCache.put(id, l);
return l;
}
@ -234,6 +239,7 @@ public final class KeyboardData
if (!expect_tag(parser, "keyboard"))
throw error(parser, "Expected tag <keyboard>");
boolean bottom_row = attribute_bool(parser, "bottom_row", true);
boolean locale_extra_keys = attribute_bool(parser, "locale_extra_keys", true);
float specified_kw = attribute_float(parser, "width", 0f);
String script = parser.getAttributeValue(null, "script");
if (script != null && script.equals(""))
@ -263,7 +269,7 @@ public final class KeyboardData
}
}
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row);
return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row, locale_extra_keys);
}
private static float compute_max_width(List<Row> rows)
@ -282,7 +288,7 @@ public final class KeyboardData
}
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc,
String npsc, String name_, boolean bottom_row_)
String npsc, String name_, boolean bottom_row_, boolean locale_extra_keys_)
{
float kh = 0.f;
for (Row r : rows_)
@ -295,13 +301,14 @@ public final class KeyboardData
keysWidth = Math.max(kw, 1f);
keysHeight = kh;
bottom_row = bottom_row_;
locale_extra_keys = locale_extra_keys_;
}
/** Copies the fields of an other keyboard, with rows changed. */
/** Copies the fields of a keyboard, with rows changed. */
protected KeyboardData(KeyboardData src, List<Row> rows)
{
this(rows, compute_max_width(rows), src.modmap, src.script,
src.numpad_script, src.name, src.bottom_row);
src.numpad_script, src.name, src.bottom_row, src.locale_extra_keys);
}
public static class Row
@ -409,7 +416,7 @@ public final class KeyboardData
keys = ks;
anticircle = antic;
keysflags = f;
width = Math.max(w, 0.5f);
width = Math.max(w, 0f);
shift = Math.max(s, 0f);
slider = sl;
indication = i;
@ -557,18 +564,20 @@ public final class KeyboardData
{
public final Map<KeyValue, KeyValue> shift;
public final Map<KeyValue, KeyValue> fn;
public final Map<KeyValue, KeyValue> ctrl;
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f)
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f, Map<KeyValue, KeyValue> c)
{
shift = s;
fn = f;
ctrl = c;
}
public static Modmap parse(XmlPullParser parser) throws Exception
{
HashMap<KeyValue, KeyValue> shift = new HashMap<KeyValue, KeyValue>();
HashMap<KeyValue, KeyValue> fn = new HashMap<KeyValue, KeyValue>();
HashMap<KeyValue, KeyValue> ctrl = new HashMap<KeyValue, KeyValue>();
while (next_tag(parser))
{
switch (parser.getName())
@ -579,12 +588,15 @@ public final class KeyboardData
case "fn":
parse_mapping(parser, fn);
break;
case "ctrl":
parse_mapping(parser, ctrl);
break;
default:
throw error(parser, "Expecting tag <shift> or <fn>, got <" + parser.getName() + ">");
}
}
return new Modmap(shift, fn);
return new Modmap(shift, fn, ctrl);
}
private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception

View File

@ -3,11 +3,14 @@ package juloo.keyboard2;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Animatable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.view.KeyEvent;
import android.view.Menu;
@ -15,28 +18,49 @@ import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.VideoView;
import java.util.ArrayList;
import java.util.List;
public class LauncherActivity extends Activity
public class LauncherActivity extends Activity implements Handler.Callback
{
/** Text is replaced when receiving key events. */
VideoView _intro_video;
TextView _tryhere_text;
EditText _tryhere_area;
/** Periodically restart the animations. */
List<Animatable> _animations;
Handler _handler;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.launcher_activity);
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
_tryhere_text = (TextView)findViewById(R.id.launcher_tryhere_text);
_tryhere_area = (EditText)findViewById(R.id.launcher_tryhere_area);
if (VERSION.SDK_INT >= 28)
_tryhere_area.addOnUnhandledKeyEventListener(
this.new Tryhere_OnUnhandledKeyEventListener());
setup_intro_video(_intro_video);
}
@Override
public void onStart()
{
super.onStart();
_animations = new ArrayList<Animatable>();
_animations.add(find_anim(R.id.launcher_anim_swipe));
_handler = new Handler(getMainLooper(), this);
_handler.sendEmptyMessageDelayed(0, 500);
}
@Override
public boolean handleMessage(Message _msg)
{
for (Animatable anim : _animations)
anim.start();
_handler.sendEmptyMessageDelayed(0, 3000);
return true;
}
@Override
@ -70,31 +94,10 @@ public class LauncherActivity extends Activity
imm.showInputMethodPicker();
}
static void setup_intro_video(final VideoView v)
Animatable find_anim(int id)
{
if (VERSION.SDK_INT >= 26)
v.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
v.setVideoURI(Uri.parse("android.resource://" +
v.getContext().getPackageName() + "/" + R.raw.intro_video));
v.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mp)
{
mp.setLooping(true);
}
});
v.setOnErrorListener(new MediaPlayer.OnErrorListener()
{
@Override
public boolean onError(MediaPlayer mp, int what, int extra)
{
v.stopPlayback();
v.setVisibility(View.GONE);
return true;
}
});
v.start();
ImageView img = (ImageView)findViewById(id);
return (Animatable)img.getDrawable();
}
@TargetApi(28)

View File

@ -0,0 +1,38 @@
package juloo.keyboard2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.widget.ListView;
/** A non-scrollable list view that can be embedded in a bigger ScrollView.
Credits to Dedaniya HirenKumar in
https://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview */
public class NonScrollListView extends ListView
{
public NonScrollListView(Context context)
{
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
}

View File

@ -110,7 +110,7 @@ public final class Pointers implements Handler.Callback
if (latched)
add_fake_pointer(key, kv, lock);
}
else if ((ptr.flags & FLAG_P_FAKE) != 0)
else if ((ptr.flags & FLAG_P_FAKE) == 0)
{} // Key already latched but not by a fake ptr, do nothing.
else if (lock)
{

View File

@ -40,7 +40,7 @@ public class CustomExtraKeysPreference extends ListGroupPreference<String>
if (key_names != null)
{
for (String key_name : key_names)
kvs.put(KeyValue.makeStringKey(key_name), KeyboardData.PreferredPos.DEFAULT);
kvs.put(KeyValue.parseKeyDefinition(key_name), KeyboardData.PreferredPos.DEFAULT);
}
return kvs;
}

View File

@ -24,6 +24,7 @@ public class ExtraKeysPreference extends PreferenceCategory
"meta",
"compose",
"voice_typing",
"switch_clipboard",
"accent_aigu",
"accent_grave",
"accent_double_aigu",
@ -70,6 +71,35 @@ public class ExtraKeysPreference extends PreferenceCategory
"subscript",
"f11_placeholder",
"f12_placeholder",
"menu",
"scroll_lock",
"combining_dot_above",
"combining_double_aigu",
"combining_slash",
"combining_arrow_right",
"combining_breve",
"combining_bar",
"combining_aigu",
"combining_caron",
"combining_cedille",
"combining_circonflexe",
"combining_grave",
"combining_macron",
"combining_ring",
"combining_tilde",
"combining_trema",
"combining_ogonek",
"combining_dot_below",
"combining_horn",
"combining_hook_above",
"combining_vertical_tilde",
"combining_inverted_breve",
"combining_pokrytie",
"combining_slavonic_psili",
"combining_slavonic_dasia",
"combining_payerok",
"combining_titlo",
"combining_vzmet"
};
/** Whether an extra key is enabled by default. */
@ -79,6 +109,7 @@ public class ExtraKeysPreference extends PreferenceCategory
{
case "voice_typing":
case "change_method":
case "switch_clipboard":
case "compose":
case "tab":
case "esc":
@ -117,6 +148,37 @@ public class ExtraKeysPreference extends PreferenceCategory
case "voice_typing": id = R.string.key_descr_voice_typing; break;
case "ª": id = R.string.key_descr_ª; break;
case "º": id = R.string.key_descr_º; break;
case "switch_clipboard": id = R.string.key_descr_clipboard; break;
case "combining_dot_above":
case "combining_double_aigu":
case "combining_slash":
case "combining_arrow_right":
case "combining_breve":
case "combining_bar":
case "combining_aigu":
case "combining_caron":
case "combining_cedille":
case "combining_circonflexe":
case "combining_grave":
case "combining_macron":
case "combining_ring":
case "combining_tilde":
case "combining_trema":
case "combining_ogonek":
case "combining_dot_below":
case "combining_horn":
case "combining_hook_above":
case "combining_vertical_tilde":
case "combining_inverted_breve":
case "combining_pokrytie":
case "combining_slavonic_psili":
case "combining_slavonic_dasia":
case "combining_payerok":
case "combining_titlo":
case "combining_vzmet":
id = R.string.key_descr_combining;
break;
}
if (id == 0)
return null;

View File

@ -20,23 +20,22 @@
<key key0="ب"/>
<key key0="ل"/>
<key key0="ا" key1="آ" key4="ء" key2="-" key3="_"/>
<key key0="ت" key1="&#x200C;" key2="+"/>
<key key0="ت" key1="halfspace" key2="+"/>
<key key0="ن"/>
<key key0="م"/>
<key key0="ک"/>
<key key0="گ"/>
</row>
<row>
<key key0="ظ"/>
<key shift="0.5" key0="ظ"/>
<key key0="ط"/>
<key key0="ز" key2="«"/>
<key key0="ر" key2="»"/>
<key key0="ژ" key2="."/>
<key key0="ز" key1="«" key2="»"/>
<key key0="ر" key1="ژ" key2="."/>
<key key0="ذ" key2=":"/>
<key key0="د" key2="؛"/>
<key key0="پ" key2="&#1567;"/>
<key key0="و"/>
<key key0="چ"/>
<key width="1.0" key0="backspace" key2="delete"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@ -21,7 +21,7 @@
<key key0="হ" key1="ঃ" key2="=" key3="+" />
<key key0="জ" key1="ঝ" key3="ে" key4="ৈ" />
<key key0="ক" key1="খ" key3="ো" key4="ৌ" />
<key key0="ল" key1="ং" key2="॥" key3="zwnj" />
<key key0="ল" key1="ং" key2="॥" key3="halfspace" />
</row>
<row>
<key width="1.5" key0="shift" />

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="ЉЊЕРТЗ (Српски)" script="cyrillic">
<modmap>
<fn a="а" b="а̂" />
<fn a="е" b="е̂" />
<fn a="и" b="и̂" />
<fn a="о" b="о̂" />
<fn a="у" b="у̂" />
<fn a="cursor_left" b="home" />
<fn a="cursor_right" b="end" />
<ctrl a="љ" b=":char symbol='љ':q" />
<ctrl a="њ" b=":char symbol='њ':w" />
<ctrl a="е" b=":char symbol='е':e" />
<ctrl a="р" b=":char symbol='р':r" />
<ctrl a="т" b=":char symbol='т':t" />
<ctrl a="ж" b=":char symbol='ж':y" />
<ctrl a="у" b=":char symbol='у':u" />
<ctrl a="и" b=":char symbol='и':i" />
<ctrl a="о" b=":char symbol='о':o" />
<ctrl a="п" b=":char symbol='п':p" />
<ctrl a="а" b=":char symbol='а':a" />
<ctrl a="с" b=":char symbol='с':s" />
<ctrl a="д" b=":char symbol='д':d" />
<ctrl a="ф" b=":char symbol='ф':f" />
<ctrl a="г" b=":char symbol='г':g" />
<ctrl a="х" b=":char symbol='х':h" />
<ctrl a="ј" b=":char symbol='ј':j" />
<ctrl a="к" b=":char symbol='к':k" />
<ctrl a="л" b=":char symbol='л':l" />
<ctrl a="з" b=":char symbol='з':z" />
<ctrl a="џ" b=":char symbol='џ':x" />
<ctrl a="ц" b=":char symbol='ц':c" />
<ctrl a="в" b=":char symbol='в':v" />
<ctrl a="б" b=":char symbol='б':b" />
<ctrl a="н" b=":char symbol='н':n" />
<ctrl a="м" b=":char symbol='м':m" />
</modmap>
<row>
<key key0="љ" ne="1" se="loc esc"/>
<key key0="њ" nw="~" ne="2" sw="\@"/>
<key key0="е" ne="3" sw="\#" se="€"/>
<key key0="р" ne="4" sw="$" se="loc £"/>
<key key0="т" ne="5" sw="%"/>
<key key0="з" ne="6" sw="^"/>
<key key0="у" ne="7" sw="&amp;"/>
<key key0="и" ne="8" sw="*"/>
<key key0="о" ne="9" sw="(" se=")"/>
<key key0="п" ne="0" sw="[" se="]"/>
<key key0="ш"/>
</row>
<row>
<key key0="а" nw="loc tab" ne="loc selectAll"/>
<key key0="с" nw="loc §" ne="loc shareText"/>
<key key0="д"/>
<key key0="ф"/>
<key key0="г"/>
<key key0="х"/>
<key key0="ј" ne="loc accent_circonflexe" sw="{" se="}"/>
<key key0="к" ne="-" sw="_"/>
<key key0="л" ne="=" sw="+"/>
<key key0="ч" nw="'" ne="&quot;" sw="\\"/>
<key key0="ћ" ne="`" sw="|"/>
</row>
<row>
<key width="1.5" key0="shift" nw="loc superscript" ne="loc capslock" sw="loc subscript"/>
<key key0="ж" nw="loc undo" ne="loc redo" sw="&lt;" se="&gt;"/>
<key key0="џ" ne="loc cut"/>
<key key0="ц" ne="loc copy"/>
<key key0="в" ne="loc paste"/>
<key key0="б" ne="loc pasteAsPlainText"/>
<key key0="н" nw="!" ne="\?" sw="/"/>
<key key0="м" ne=";" sw=","/>
<key key0="ђ" ne=":" sw="."/>
<key width="1.5" key0="backspace" ne="delete"/>
</row>
</keyboard>

Some files were not shown because too many files have changed in this diff Show More