Compare commits
58 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
fda53e3952 | ||
|
ef03dfed5c | ||
|
e0131fa6b0 | ||
|
b236a74b64 | ||
|
f6338a652b | ||
|
9a42fa4dca | ||
|
4d104eacf3 | ||
|
31d6a70dfb | ||
|
7462955507 | ||
|
9aac7900c0 | ||
|
088d46d6e6 | ||
|
5cc7fdf6d7 | ||
|
cc571ea1ca | ||
|
c1a816d3d4 | ||
|
e10c587dc5 | ||
|
d03e96da3e | ||
|
b3b7877a3b | ||
|
02124dd71f | ||
|
e4e54628b7 | ||
|
4127aa6f03 | ||
|
4f9375373e | ||
|
9b154a2495 | ||
|
646ff4834d | ||
|
815025aaa9 | ||
|
d9f2fdf8bf | ||
|
2e81cb5cf7 | ||
|
89dfc782a7 | ||
|
eb42943327 | ||
|
121a2ba76f | ||
|
82d3290c6a | ||
|
b15ca662c2 | ||
|
9a48acfe3e | ||
|
bce0a98f62 | ||
|
a27c64479f | ||
|
7da7a5082d | ||
|
80600ed659 | ||
|
3b1c652370 | ||
|
8cb1789eeb | ||
|
04a7ec4bb8 | ||
|
8e0d38c257 | ||
|
b72635b887 | ||
|
84af72c222 | ||
|
2df4764557 | ||
|
39952f8bdf | ||
|
ab4c73f9f3 | ||
|
e52e537fd7 | ||
|
2900e8d197 | ||
|
d8e475467a | ||
|
fec3f109c9 | ||
|
f9f44fbd7d | ||
|
914599f16a | ||
|
65cc0c736e | ||
|
2cce0fed67 | ||
|
9a8c4f291d | ||
|
14cc318a0e | ||
|
8d8a58462c | ||
|
5562ee1391 | ||
|
120c0a9d23 |
17
.github/workflows/make-apk.yml
vendored
@@ -9,19 +9,6 @@ jobs:
|
||||
Build-Apk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cache fontforge and extra dependencies
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /usr/local/bin
|
||||
key: usr-local-bin
|
||||
- name: Install latest FontForge version (using AppImage)
|
||||
run: |
|
||||
# Get most recent version of FontForge
|
||||
# Using AppImage there is no dependecy problem, it is the latest version and it's easier to cache
|
||||
cd /usr/local/bin
|
||||
sudo wget -c -N https://github.com/fontforge/fontforge/releases/download/20220308/FontForge-2022-03-08-582bd41-x86_64.AppImage
|
||||
sudo chmod +x ./FontForge-2022-03-08-582bd41-x86_64.AppImage
|
||||
sudo ln --symbolic --force /usr/local/bin/FontForge-2022-03-08-582bd41-x86_64.AppImage /usr/local/bin/fontforge
|
||||
- uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||
@@ -36,11 +23,11 @@ jobs:
|
||||
- name: Restore debug keystore from github Secrets
|
||||
run: |
|
||||
mkdir -p _build
|
||||
cd "$GITHUB_WORKSPACE/_build"
|
||||
cd "_build"
|
||||
# Check if exist and use the secret named DEBUG_KEYSTORE
|
||||
# The contents of the secret can be obtained -
|
||||
# from the debug.keystore.asc from you local _build folder
|
||||
if [[ ! "${{ secrets.DEBUG_KEYSTORE }}" == "" ]]; then
|
||||
if [[ ! "${{ secrets.DEBUG_KEYSTORE }}" = "" ]]; then
|
||||
echo "${{ secrets.DEBUG_KEYSTORE }}" > "debug.keystore.asc"
|
||||
if [[ -s "debug.keystore.asc" ]]; then
|
||||
gpg -d --passphrase "debug0" --batch "debug.keystore.asc" > "debug.keystore"
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="19" android:versionName="1.14.0" android:hardwareAccelerated="false">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="23" android:versionName="1.16.0" android:hardwareAccelerated="false">
|
||||
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="30"/>
|
||||
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="false">
|
||||
<service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD">
|
||||
|
@@ -12,7 +12,8 @@ Fortunately, there's not many dependencies:
|
||||
- Android SDK: build tools (minimum `28.0.1`), platform `30`
|
||||
- Make sure to have the `$ANDROID_HOME` environment variable set.
|
||||
|
||||
For Nix users, there's a `shell.nix` for setting-up the right environment.
|
||||
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`.
|
||||
Instructions to install Nix are [here](https://nixos.wiki/wiki/Nix_Installation_Guide).
|
||||
|
||||
Building the debug apk:
|
||||
|
||||
@@ -20,8 +21,7 @@ Building the debug apk:
|
||||
make
|
||||
```
|
||||
|
||||
If the build succeed, the debug apk is located in
|
||||
`_build/juloo.keyboard2.debug.apk`.
|
||||
If the build succeed, the debug apk is located in `_build/juloo.keyboard2.debug.apk`.
|
||||
|
||||
## Using the local debug.keystore on the Github CI actions
|
||||
|
||||
@@ -78,26 +78,54 @@ make installd
|
||||
|
||||
## Guidelines
|
||||
|
||||
### Add a localized layout
|
||||
### Adding a programming layout
|
||||
|
||||
Localized layouts (a layout specific to a language) are generally accepted.
|
||||
A programming layout must contains every ASCII characters.
|
||||
The current programming layouts are: QWERTY, Dvorak.
|
||||
|
||||
Layouts are defined in XML, see `res/xml/qwerty.xml`. An entry must be added to
|
||||
the layout option in `res/values/arrays.xml`, to both `pref_layout_values`
|
||||
(correspond to the file name) and `pref_layout_entries` (display name).
|
||||
The layout must also be referenced in `srcs/juloo.keyboard2/Config.java` in
|
||||
`layoutId_of_string`.
|
||||
|
||||
Keys with a name starting in `loc ` are hidden unless they are configured for
|
||||
the user's installed languages in `res/xml/method.xml`. These keys are optional
|
||||
and will be added automatically when necessary.
|
||||
|
||||
Some users cannot easily type the characters close the the edges of the screen
|
||||
due to a bulky phone case. It is best to avoid placing important characters
|
||||
there (such as the digits or punctuation).
|
||||
|
||||
### Adding a localized layout
|
||||
|
||||
Localized layouts (a layout specific to a language) are gladly accepted.
|
||||
See for example: 4333575 (Bulgarian), 88e2175 (Latvian), 133b6ec (German).
|
||||
|
||||
This keyboard is intended for programmers. If your language uses the Latin script, make sure it is possible to type every letters on the QWERTY keyboard.
|
||||
This is generally done using dead-keys, for example: 0bf7ff5 (Latvian), 573c13f (Swedish).
|
||||
It is also possible to add some characters that are hidden in other languages, for example 93e84ba (ß), though the space is limited.
|
||||
They don't need to contain every ASCII characters (although it's useful in
|
||||
passwords) and dead-keys.
|
||||
|
||||
### Add a programming layout
|
||||
### Adding support for a language
|
||||
|
||||
A programming layout must contains every ASCII characters as well as every dead-keys.
|
||||
Currently, the only example is QWERTY.
|
||||
Supported locales are defined in `res/xml/method.xml`.
|
||||
|
||||
The attributes `languageTag` and `imeSubtypeLocale` define a locale, the
|
||||
attribute `imeSubtypeExtraValue` defines the default layout and the dead-keys
|
||||
and other extra keys to show.
|
||||
|
||||
### Translations
|
||||
|
||||
Translations are always welcome ! See for example: 1723288 (Latvian), baf867a (French).
|
||||
The app can be translated by writing `res/values-<language code>/strings.xml` (for example `values-fr`, `values-lv`), based on the default: `res/values/strings.xml` (English).
|
||||
Translations are always welcome !
|
||||
|
||||
The store description is found in `metadata/android/<locale>/`, `short_description.txt` and `full_description.txt`.
|
||||
The full description changes very infrequently (it was changed once in 6 years). But if it changes too much, outdated translation might be removed.
|
||||
See for example: 1723288 (Latvian), baf867a (French).
|
||||
The app can be translated by writing `res/values-<language code>/strings.xml`
|
||||
(for example `values-fr`, `values-lv`), based on the default:
|
||||
`res/values/strings.xml` (English).
|
||||
|
||||
Translating changelogs is not useful because they evolve too fast. Changelogs are generally written entirely just before a release, translating them would delay releases too much. Old changelogs are not shown to anyone currently.
|
||||
The store description is found in `metadata/android/<locale>/`,
|
||||
`short_description.txt` and `full_description.txt`.
|
||||
Translating changelogs is not useful. Changelogs are written quickly just
|
||||
before a release and older ones are never shown to anyone currently.
|
||||
|
||||
The app name might be partially translated, the "unexpected" word should remain
|
||||
untranslated.
|
||||
|
23
Makefile
@@ -3,7 +3,7 @@
|
||||
PACKAGE_NAME = juloo.keyboard2
|
||||
|
||||
ANDROID_PLATFORM_VERSION = android-30
|
||||
JAVA_VERSION = 1.8
|
||||
JAVA_VERSION = 1.7
|
||||
|
||||
SRC_DIR = srcs
|
||||
RES_DIR = res
|
||||
@@ -16,13 +16,16 @@ debug: _build/$(PACKAGE_NAME).debug.apk
|
||||
release: _build/$(PACKAGE_NAME).apk
|
||||
|
||||
installd: _build/$(PACKAGE_NAME).debug.apk
|
||||
adb install "$<"
|
||||
adb install -r "$<"
|
||||
|
||||
clean:
|
||||
rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \
|
||||
_build/*.idsig _build/assets
|
||||
|
||||
.PHONY: release debug installd clean
|
||||
rebuild_special_font:
|
||||
cd srcs/special_font && fontforge -lang=ff -script build.pe *.svg
|
||||
|
||||
.PHONY: release debug installd clean rebuild_special_font
|
||||
|
||||
$(shell mkdir -p _build)
|
||||
|
||||
@@ -85,6 +88,11 @@ _build/%.unaligned-apk: $(addprefix _build/,$(APK_EXTRA_FILES)) $(MANIFEST_FILE)
|
||||
-I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS)
|
||||
cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) $(APK_EXTRA_FILES)
|
||||
|
||||
# Copy the special font file into _build because aapt requires relative paths
|
||||
_build/assets/special_font.ttf: srcs/special_font/result.ttf
|
||||
mkdir -p $(@D)
|
||||
cp "$<" "$@"
|
||||
|
||||
# R.java
|
||||
|
||||
GEN_DIR = _build/gen
|
||||
@@ -95,15 +103,6 @@ $(R_FILE): $(RES_FILES) $(MANIFEST_FILE)
|
||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(RES_DIR) -J $(GEN_DIR) \
|
||||
-M $(MANIFEST_FILE) -I $(ANDROID_PLATFORM)/android.jar
|
||||
|
||||
# Special font
|
||||
|
||||
SPECIAL_FONT_GLYPHS = $(wildcard $(CURDIR)/srcs/special_font/*.svg)
|
||||
SPECIAL_FONT_SCRIPT = $(CURDIR)/srcs/special_font/build.pe
|
||||
|
||||
_build/assets/special_font.ttf: $(SPECIAL_FONT_SCRIPT) $(SPECIAL_FONT_GLYPHS)
|
||||
mkdir -p $(@D)
|
||||
fontforge -lang=ff -script $(SPECIAL_FONT_SCRIPT) $(CURDIR)/$@ $(SPECIAL_FONT_GLYPHS)
|
||||
|
||||
# Compile java classes and build classes.dex
|
||||
|
||||
OBJ_DIR = _build/class
|
||||
|
@@ -1,8 +1,9 @@
|
||||
# Unexpected Keyboard
|
||||
|
||||
A lightweight virtual keyboard for developers.
|
||||
|
||||

|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
||||
| --- | --- | --- |
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
||||
|
||||
This app is a virtual keyboard for Android. The main features are easy typing of every ASCII character using the swipe gesture, dead keys for accents and modifier keys and the presence of special keys (tab, esc, arrows, etc..).
|
||||
|
||||
|
25
metadata/android/en-US/changelogs/20.txt
Normal file
@@ -0,0 +1,25 @@
|
||||
Quick fix release.
|
||||
|
||||
Previously:
|
||||
|
||||
Translations: Brazilian portuguese (@igorSilCar), Chinese-Simplified (@9-2-1), Korean (@notnickid)
|
||||
New layouts: Swedish (@thabubble), Korean (@notnickid)
|
||||
|
||||
Improved computation of the swipe gesture and fix unstoppable key-repeat on
|
||||
some devices.
|
||||
|
||||
Moved keys away from the edges of the screen and other improvements to the layouts.
|
||||
|
||||
Improved rendering of some symbols.
|
||||
|
||||
Added more characters to the keyboard:
|
||||
- New combinations to Fn (@ArenaL5)
|
||||
- Currency symbols
|
||||
- Added arrow and box symbols (@sdrapha)
|
||||
- F11 and F12.
|
||||
|
||||
Option for making modifiers lockable. (@sdrapha)
|
||||
Fixes to the Spanish layout and other fixes. (@ArenaL5)
|
||||
Many other fixes.
|
||||
|
||||
Huge thanks to the contributors: @igorSilCar, @sdrapha, @ArenaL5, @notnickid, @9-2-1, @thabubble
|
4
metadata/android/en-US/changelogs/21.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Fix compatibility with Android 6.
|
||||
Translation improvements.
|
||||
|
||||
Huge thanks to the contributors: @marciozomb13
|
7
metadata/android/en-US/changelogs/22.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Support languages: Lithuanian, Hungarian (@tbilles)
|
||||
New layouts: Neo2 (@matthiakl)
|
||||
|
||||
Translation improvements (@polyctena, @marciozomb13)
|
||||
Fix modifiers applied twice when typing quickly. Some other fixes.
|
||||
|
||||
Many thanks to the contributors: @matthiakl, @polyctena, @marciozomb13, @dircsem
|
9
metadata/android/en-US/changelogs/23.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
New languages: Turkish (@erqan), Dutch (Belgium) (@draxaris1010)
|
||||
New layouts: Turkish (@erqan), Colemak (@dircsem), Hungarian QWERTY
|
||||
|
||||
Less typos: Select the closest key on swipe (@Rodrigodd)
|
||||
Removed settings: Vibration, Show every accents
|
||||
More tweaks to the layouts
|
||||
Fixes to landscape mode, updated translations and more tweaks.
|
||||
|
||||
Thanks to the contributors: @erqan, @draxaris1010, @dircsem, @Rodrigodd, @meanindra
|
@@ -7,19 +7,18 @@
|
||||
<string name="pref_accents_title">Akzente</string>
|
||||
<string name="pref_accents_e_all_installed">Akzente für alle installierten Sprachen anzeigen</string>
|
||||
<string name="pref_accents_e_selected">Akzente nur für die gewählte Sprache anzeigen</string>
|
||||
<string name="pref_accents_e_all">Alle Akzente anzeigen</string>
|
||||
<string name="pref_accents_e_none">Akzente verbergen</string>
|
||||
<string name="pref_programming_layout_title">Tastaturlayout zum Programmieren</string>
|
||||
<string name="pref_programming_layout_none">Keines</string>
|
||||
<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">Zeitüberschreitung bei Tastenwiederholung</string>
|
||||
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
|
||||
<string name="pref_category_vibrate">Vibration</string>
|
||||
<string name="pref_vibrate_title">Vibration</string>
|
||||
<string name="pref_vibrate_summary">Vibration bei Tastendruck ein-/ausschalten</string>
|
||||
<string name="pref_vibrate_duration_title">Dauer</string>
|
||||
<string name="pref_precise_repeat_title">Präzise Cursorsteuerung</string>
|
||||
<string name="pref_precise_repeat_summary">Geschwindigkeit der Tastenwiederholung durch weniger oder mehr Wischen anpassen</string>
|
||||
<string name="pref_lockable_keys_title">Sperrbare Hilfstasten</string>
|
||||
<string name="pref_lockable_keys_summary">Hilfstasten, die durch zweimaliges Tippen gesperrt (eingerastet) werden können</string>
|
||||
<string name="pref_category_style">Design</string>
|
||||
<string name="pref_margin_bottom_title">Unterer Abstand</string>
|
||||
<string name="pref_keyboard_height_title">Höhe der Tastatur</string>
|
||||
|
@@ -7,17 +7,12 @@
|
||||
<string name="pref_accents_title">Acentos</string>
|
||||
<string name="pref_accents_e_all_installed">Mostrar acentos para todos los lenguajes instalados</string>
|
||||
<string name="pref_accents_e_selected">Solo mostrar acentos para el lenguaje seleccionado</string>
|
||||
<string name="pref_accents_e_all">Mostrar todos los acentos</string>
|
||||
<string name="pref_accents_e_none">Ocultar acentos</string>
|
||||
<string name="pref_category_typing">Escribiendo</string>
|
||||
<string name="pref_swipe_dist_title">Distancia para deslizar</string>
|
||||
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las letras (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tiempo de espera de repetición de tecla</string>
|
||||
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
|
||||
<string name="pref_category_vibrate">Vibración</string>
|
||||
<string name="pref_vibrate_title">Vibración</string>
|
||||
<string name="pref_vibrate_summary">Habilitar/deshabilitar vibración al presionar una tecla</string>
|
||||
<string name="pref_vibrate_duration_title">Duración</string>
|
||||
<string name="pref_precise_repeat_title">Movimientos de cursor preciso</string>
|
||||
<string name="pref_precise_repeat_summary">Modular la velocidad de repetición de teclas según si se desliza más o menos</string>
|
||||
<string name="pref_lockable_keys_title">Bloqueo de teclas modificadoras</string>
|
||||
|
@@ -7,22 +7,18 @@
|
||||
<string name="pref_accents_title">Accents</string>
|
||||
<string name="pref_accents_e_all_installed">Afficher les accents pour les langues installées</string>
|
||||
<string name="pref_accents_e_selected">Afficher les accents pour la langue sélectionnée</string>
|
||||
<string name="pref_accents_e_all">Afficher tous les accents</string>
|
||||
<string name="pref_accents_e_none">Cacher les accents</string>
|
||||
<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">Délai avant répétition</string>
|
||||
<string name="pref_long_interval_title">Écart entre répétitions</string>
|
||||
<string name="pref_category_vibrate">Vibration</string>
|
||||
<string name="pref_vibrate_title">Vibreur</string>
|
||||
<string name="pref_vibrate_summary">Vibration a chaque touche</string>
|
||||
<string name="pref_vibrate_duration_title">Durée</string>
|
||||
<string name="pref_precise_repeat_title">Mouvement précis du curseur</string>
|
||||
<string name="pref_precise_repeat_summary">Modifier la vitesse de répétition en bougeant le doigt</string>
|
||||
<string name="pref_category_style">Style</string>
|
||||
<string name="pref_margin_bottom_title">Marge du bas</string>
|
||||
<string name="pref_keyboard_height_title">Hauteur du clavier</string>
|
||||
<string name="pref_keyboard_height_landscape_title">Hauteur du clavier en mode paysage</string>
|
||||
<string name="pref_horizontal_margin_title">Marge des côtés</string>
|
||||
<string name="pref_character_size_title">Taille des labels</string>
|
||||
<string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string>
|
||||
|
@@ -7,17 +7,12 @@
|
||||
<string name="pref_accents_title">악센트</string>
|
||||
<string name="pref_accents_e_all_installed">설치된 모든 언어의 악센트 표시</string>
|
||||
<string name="pref_accents_e_selected">선택한 언어의 악센트만 표시</string>
|
||||
<string name="pref_accents_e_all">모든 언어의 악센트 표시</string>
|
||||
<string name="pref_accents_e_none">모든 언어의 악센트 숨기기</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_category_vibrate">진동</string>
|
||||
<string name="pref_vibrate_title">진동</string>
|
||||
<string name="pref_vibrate_summary">키 누를 때 진동 키거/끄기</string>
|
||||
<string name="pref_vibrate_duration_title">지속 시간</string>
|
||||
<string name="pref_precise_repeat_title">정확한 커서 움직임</string>
|
||||
<string name="pref_precise_repeat_summary">더 많거나 적은 스와이프로 키 반복 조절</string>
|
||||
<string name="pref_category_style">스타일</string>
|
||||
|
@@ -1,11 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="horizontal_margin">12dp</dimen>
|
||||
<dimen name="margin_bottom">3dp</dimen>
|
||||
<dimen name="key_padding">3dp</dimen>
|
||||
<dimen name="key_height">36dp</dimen>
|
||||
<item name="label_text_size" type="integer" format="float">0.4</item>
|
||||
<item name="sublabel_text_size" type="integer" format="float">0.3</item>
|
||||
<dimen name="emoji_type_button_height">48dp</dimen>
|
||||
<dimen name="extra_horizontal_margin">20dp</dimen>
|
||||
<dimen name="extra_horizontal_margin">25dp</dimen>
|
||||
</resources>
|
||||
|
@@ -1,5 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (atkļūdošana)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
|
||||
<string name="pref_category_layout">Izkārtojums</string>
|
||||
<string name="pref_layout_title">Mainīt tastatūras izkārtojumu</string>
|
||||
@@ -7,19 +9,18 @@
|
||||
<string name="pref_accents_title">Uzsvara zīmes</string>
|
||||
<string name="pref_accents_e_all_installed">Rādīt uzsvara zīmes visām uzstādītajām valodām</string>
|
||||
<string name="pref_accents_e_selected">Rādīt uzsvara zīmes tikai atlasītajām valodām</string>
|
||||
<string name="pref_accents_e_all">Rādīt visas uzsvara zīmes</string>
|
||||
<string name="pref_accents_e_none">Paslēpt uzsvara zīmes</string>
|
||||
<string name="pref_programming_layout_title">Tastatūras izkārtojums programmēšanai</string>
|
||||
<string name="pref_programming_layout_none">Neviens</string>
|
||||
<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">Taustiņa atkārtošanās ātrums</string>
|
||||
<string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
|
||||
<string name="pref_category_vibrate">Trīcēšana</string>
|
||||
<string name="pref_vibrate_title">Trīcēšana</string>
|
||||
<string name="pref_vibrate_summary">Iespējot/atspējot taustiņa piespiešanas trīcēšanu</string>
|
||||
<string name="pref_vibrate_duration_title">Ilgums</string>
|
||||
<string name="pref_precise_repeat_title">Pielāgojama kursora kustība</string>
|
||||
<string name="pref_precise_repeat_summary">Mainīt taustiņa atkārtošanās ātrumu ar pavilkšanas attālumu</string>
|
||||
<string name="pref_lockable_keys_title">Slēdzami pārveidotājtaustiņi</string>
|
||||
<string name="pref_lockable_keys_summary">Pārveidotātjtaustiņi, kas var tikt slēgti ar divkāršu piesitienu</string>
|
||||
<string name="pref_category_style">Izskata pielāgojumi</string>
|
||||
<string name="pref_margin_bottom_title">Apakšējā apmale</string>
|
||||
<string name="pref_keyboard_height_title">Tastatūras augstums</string>
|
||||
@@ -36,6 +37,8 @@
|
||||
<string name="pref_swipe_dist_e_default">Vidējs</string>
|
||||
<string name="pref_swipe_dist_e_far">Tāls</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Ļoti tāls</string>
|
||||
<string name="pref_key_horizontal_space">Līmeniskais attālums starp taustiņiem</string>
|
||||
<string name="pref_key_vertical_space">Stateniskais attālums starp taustiņiem</string>
|
||||
<string name="key_action_next">Nākamais</string>
|
||||
<string name="key_action_done">Darīts</string>
|
||||
<string name="key_action_go">Aiziet</string>
|
||||
|
@@ -1,29 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="settings_activity_label">Configurações Unexpected Keyboard</string>
|
||||
<string name="app_name" product="debug">Teclado Unexpected</string>
|
||||
<string name="app_name" product="default">Teclado Unexpected</string>
|
||||
<string name="settings_activity_label">Configurar Teclado Unexpected</string>
|
||||
<string name="pref_category_layout">Layout</string>
|
||||
<string name="pref_layout_title">Mudar layout do teclado</string>
|
||||
<string name="pref_layout_e_system">Mesmo do sistema</string>
|
||||
<string name="pref_accents_title">Acentos</string>
|
||||
<string name="pref_accents_e_all_installed">Mostrar acentos para todos idiomas instalados</string>
|
||||
<string name="pref_accents_e_all_installed">Mostrar acentos para todos os idiomas instalados</string>
|
||||
<string name="pref_accents_e_selected">Mostrar acentos só para o idioma selecionado</string>
|
||||
<string name="pref_accents_e_all">Mostrar todos acentos</string>
|
||||
<string name="pref_accents_e_none">Esconder acentos</string>
|
||||
<string name="pref_accents_e_none">Ocultar acentos</string>
|
||||
<string name="pref_programming_layout_title">Layout do teclado para programação</string>
|
||||
<string name="pref_programming_layout_none">Nenhum</string>
|
||||
<string name="pref_category_typing">Digitação</string>
|
||||
<string name="pref_swipe_dist_title">Distância a deslizar</string>
|
||||
<string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tempo até repetir tecla</string>
|
||||
<string name="pref_long_interval_title">Intervalo para repetir tecla</string>
|
||||
<string name="pref_category_vibrate">Vibração</string>
|
||||
<string name="pref_vibrate_title">Vibração</string>
|
||||
<string name="pref_vibrate_summary">Ativar/desativar vibração ao digitar</string>
|
||||
<string name="pref_vibrate_duration_title">Duração</string>
|
||||
<string name="pref_long_interval_title">Intervalo de repetição de tecla</string>
|
||||
<string name="pref_precise_repeat_title">Precisão nos movimentos do cursor</string>
|
||||
<string name="pref_precise_repeat_summary">Varia a velocidade de repetição ao depender de quanto deslizar</string>
|
||||
<string name="pref_lockable_keys_title">Segurar teclas</string>
|
||||
<string name="pref_precise_repeat_summary">Varia a velocidade de repetição a depender do quanto deslizar</string>
|
||||
<string name="pref_lockable_keys_title">Teclas traváveis</string>
|
||||
<string name="pref_lockable_keys_summary">Teclas que podem ficar seguradas ao teclar duas vezes</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
<string name="pref_margin_bottom_title">Margem de baixo</string>
|
||||
<string name="pref_margin_bottom_title">Margem inferior</string>
|
||||
<string name="pref_keyboard_height_title">Altura do teclado</string>
|
||||
<string name="pref_horizontal_margin_title">Margem horizontal</string>
|
||||
<string name="pref_character_size_title">Tamanho dos indicadores</string>
|
||||
|
48
res/values-tr/strings.xml
Normal file
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
|
||||
<string name="pref_category_layout">Düzen</string>
|
||||
<string name="pref_layout_title">Klavye Düzenini Değiştir</string>
|
||||
<string name="pref_layout_e_system">Sistem Ayarları</string>
|
||||
<string name="pref_accents_title">Aksanlar</string>
|
||||
<string name="pref_accents_e_all_installed">Yüklü tüm dillerin aksanlarını göster</string>
|
||||
<string name="pref_accents_e_selected">Sadece seçili dilin aksanlarını göster</string>
|
||||
<string name="pref_accents_e_none">Aksanları gizle</string>
|
||||
<string name="pref_programming_layout_title">Programlama için klavye düzeni</string>
|
||||
<string name="pref_programming_layout_none">Hiçbiri</string>
|
||||
<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öşelerindeki karakterlerin uzaklıkları (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tuş tekrarlama beklemesi</string>
|
||||
<string name="pref_long_interval_title">Tuş tekrarlama aralığı</string>
|
||||
<string name="pref_precise_repeat_title">İmleç hareketini ayarla</string>
|
||||
<string name="pref_precise_repeat_summary">Tuş tekrar hızını az ya da çok kaydırarak ayarla</string>
|
||||
<string name="pref_lockable_keys_title">Sabitlenebilir değiştiriciler</string>
|
||||
<string name="pref_lockable_keys_summary">Çift vuruşla sabitlenebilecek değiştirici tuşlar</string>
|
||||
<string name="pref_category_style">Stil</string>
|
||||
<string name="pref_margin_bottom_title">Alt boşluk</string>
|
||||
<string name="pref_keyboard_height_title">Klavye yüksekliği</string>
|
||||
<string name="pref_horizontal_margin_title">Yatay boşluk</string>
|
||||
<string name="pref_character_size_title">Etiket boyutu</string>
|
||||
<string name="pref_character_size_summary">Klavye üzerinde gösterilecek karakter boyutu (%.2fx)</string>
|
||||
<string name="pref_theme">Tema</string>
|
||||
<string name="pref_theme_e_system">Sistem Ayarları</string>
|
||||
<string name="pref_theme_e_dark">Koyu</string>
|
||||
<string name="pref_theme_e_light">Açık</string>
|
||||
<string name="pref_theme_e_black">Siyah</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>
|
||||
<string name="pref_swipe_dist_e_far">Uzun</string>
|
||||
<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="key_action_next">İleri</string>
|
||||
<string name="key_action_done">Bitti</string>
|
||||
<string name="key_action_go">İlerle</string>
|
||||
<string name="key_action_prev">Geri</string>
|
||||
<string name="key_action_search">Ara</string>
|
||||
<string name="key_action_send">Gönder</string>
|
||||
</resources>
|
@@ -9,17 +9,12 @@
|
||||
<string name="pref_accents_title">声调</string>
|
||||
<string name="pref_accents_e_all_installed">显示所有安装的语言的声调符号</string>
|
||||
<string name="pref_accents_e_selected">只显示选择的语言的声调符号</string>
|
||||
<string name="pref_accents_e_all">显示所有声调符号</string>
|
||||
<string name="pref_accents_e_none">隐藏声调符号</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_category_vibrate">振动</string>
|
||||
<string name="pref_vibrate_title">振动</string>
|
||||
<string name="pref_vibrate_summary">启用或者禁用按下按键时振动</string>
|
||||
<string name="pref_vibrate_duration_title">每次振动持续的时间</string>
|
||||
<string name="pref_precise_repeat_title">精确控制光标移速</string>
|
||||
<string name="pref_precise_repeat_summary">按键重复按下速度由手指滑动的距离决定</string>
|
||||
<string name="pref_lockable_keys_title">组合键锁定</string>
|
||||
|
@@ -6,13 +6,18 @@
|
||||
<item>qwerty</item>
|
||||
<item>qwerty_pt</item>
|
||||
<item>qwerty_es</item>
|
||||
<item>qwerty_kr</item>
|
||||
<item>qwerty_ko</item>
|
||||
<item>qwerty_lv</item>
|
||||
<item>qwerty_sv_se</item>
|
||||
<item>qwerty_hu</item>
|
||||
<item>qwerty_tr</item>
|
||||
<item>ru_jcuken</item>
|
||||
<item>qwertz</item>
|
||||
<item>qwertz_hu</item>
|
||||
<item>bgph1</item>
|
||||
<item>dvorak</item>
|
||||
<item>colemak</item>
|
||||
<item>neo2</item>
|
||||
</string-array>
|
||||
<string-array name="pref_layout_entries">
|
||||
<item>@string/pref_layout_e_system</item>
|
||||
@@ -23,31 +28,36 @@
|
||||
<item>QWERTY (Korean)</item>
|
||||
<item>QWERTY (Latvian)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Hungarian)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>ЙЦУКЕН (Русский)</item>
|
||||
<item>QWERTZ</item>
|
||||
<item>QWERTZ (Hungarian)</item>
|
||||
<item>Bulgarian (Phonetic Traditional)</item>
|
||||
<item>Dvorak</item>
|
||||
<item>Colemak</item>
|
||||
<item>Neo 2</item>
|
||||
</string-array>
|
||||
<string-array name="pref_programming_layout_values">
|
||||
<item>none</item>
|
||||
<item>qwerty</item>
|
||||
<item>dvorak</item>
|
||||
<item>colemak</item>
|
||||
</string-array>
|
||||
<string-array name="pref_programming_layout_entries">
|
||||
<item>@string/pref_programming_layout_none</item>
|
||||
<item>QWERTY</item>
|
||||
<item>Dvorak</item>
|
||||
<item>Colemak</item>
|
||||
</string-array>
|
||||
<string-array name="pref_accents_entries">
|
||||
<item>@string/pref_accents_e_all_installed</item>
|
||||
<item>@string/pref_accents_e_selected</item>
|
||||
<item>@string/pref_accents_e_all</item>
|
||||
<item>@string/pref_accents_e_none</item>
|
||||
</string-array>
|
||||
<string-array name="pref_accents_values">
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_entries">
|
||||
|
@@ -9,7 +9,6 @@
|
||||
<string name="pref_accents_title">Accents</string>
|
||||
<string name="pref_accents_e_all_installed">Show accents for all installed languages</string>
|
||||
<string name="pref_accents_e_selected">Only show accents for the selected language</string>
|
||||
<string name="pref_accents_e_all">Show all accents</string>
|
||||
<string name="pref_accents_e_none">Hide accents</string>
|
||||
<string name="pref_programming_layout_title">Keyboard layout for programming</string>
|
||||
<string name="pref_programming_layout_none">None</string>
|
||||
@@ -18,10 +17,6 @@
|
||||
<string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string>
|
||||
<string name="pref_long_timeout_title">Key repeat timeout</string>
|
||||
<string name="pref_long_interval_title">Key repeat interval</string>
|
||||
<string name="pref_category_vibrate">Vibration</string>
|
||||
<string name="pref_vibrate_title">Vibration</string>
|
||||
<string name="pref_vibrate_summary">Enable/disable vibration on keypress</string>
|
||||
<string name="pref_vibrate_duration_title">Duration</string>
|
||||
<string name="pref_precise_repeat_title">Precise cursor movements</string>
|
||||
<string name="pref_precise_repeat_summary">Modulate key repeat speed by swiping more or less</string>
|
||||
<string name="pref_lockable_keys_title">Lockable modifiers</string>
|
||||
@@ -29,6 +24,7 @@
|
||||
<string name="pref_category_style">Style</string>
|
||||
<string name="pref_margin_bottom_title">Margin bottom</string>
|
||||
<string name="pref_keyboard_height_title">Keyboard height</string>
|
||||
<string name="pref_keyboard_height_landscape_title">Keyboard height in landscape mode</string>
|
||||
<string name="pref_horizontal_margin_title">Horizontal margin</string>
|
||||
<string name="pref_character_size_title">Label size</string>
|
||||
<string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string>
|
||||
|
@@ -20,10 +20,20 @@
|
||||
<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"/>
|
||||
<!-- System integration -->
|
||||
<attr name="navigationBarColor" format="color"/>
|
||||
<attr name="windowLightNavigationBar" format="boolean"/>
|
||||
</declare-styleable>
|
||||
<style name="Dark">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<style name="BaseTheme">
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="navigationBarColor">?attr/colorKeyboard</item>
|
||||
<item name="windowLightNavigationBar">?attr/android:isLightTheme</item>
|
||||
<item name="keyBorderRadius">5dp</item>
|
||||
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
|
||||
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
|
||||
</style>
|
||||
<style name="Dark" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<item name="colorKeyboard">#1b1b1b</item>
|
||||
<item name="colorKey">#333333</item>
|
||||
<item name="colorKeyActivated">#1b1b1b</item>
|
||||
@@ -31,15 +41,11 @@
|
||||
<item name="colorLabelActivated">#3399ff</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#cccccc</item>
|
||||
<item name="keyBorderRadius">5dp</item>
|
||||
<item name="emoji_button_bg" type="color">#202020</item>
|
||||
<item name="emoji_color" type="color">#ffffff</item>
|
||||
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
|
||||
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
|
||||
</style>
|
||||
<style name="Light">
|
||||
<style name="Light" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="colorKeyboard">#e3e3e3</item>
|
||||
<item name="colorKey">#cccccc</item>
|
||||
<item name="colorKeyActivated">#e3e3e3</item>
|
||||
@@ -47,15 +53,11 @@
|
||||
<item name="colorLabelActivated">#0066cc</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="keyBorderRadius">5dp</item>
|
||||
<item name="emoji_button_bg" type="color">#dedede</item>
|
||||
<item name="emoji_color" type="color">#000000</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="emoji_button_bg">#dedede</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
<style name="Black">
|
||||
<style name="Black" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="colorKeyboard">#000000</item>
|
||||
<item name="colorKey">#000000</item>
|
||||
<item name="colorKeyActivated">#333333</item>
|
||||
@@ -64,9 +66,7 @@
|
||||
<item name="colorLabelLocked">#00ff26</item>
|
||||
<item name="colorSubLabel">#bbbbbb</item>
|
||||
<item name="keyBorderRadius">1dp</item>
|
||||
<item name="emoji_button_bg" type="color">#000000</item>
|
||||
<item name="emoji_color" type="color">#ffffff</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="emoji_button_bg">#000000</item>
|
||||
<item name="emoji_color">#ffffff</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@@ -7,8 +7,6 @@
|
||||
<dimen name="key_vertical_interval">2dp</dimen>
|
||||
<dimen name="key_horizontal_interval">2dp</dimen>
|
||||
<dimen name="key_height">51dp</dimen>
|
||||
<item name="label_text_size" type="integer" format="float">0.33</item>
|
||||
<item name="sublabel_text_size" type="integer" format="float">0.22</item>
|
||||
<dimen name="emoji_type_button_height">56dp</dimen>
|
||||
<dimen name="emoji_grid_height">250dp</dimen>
|
||||
<dimen name="emoji_text_size">28dp</dimen>
|
||||
|
@@ -10,17 +10,17 @@
|
||||
<key key0="u" key2="7" key4="`"/>
|
||||
<key key0="i" key2="8" key3="_" key4="\\"/>
|
||||
<key key0="o" key2="9" key3="\@" key4="f11_placeholder"/>
|
||||
<key key0="p" key1="0" key3="f12_placeholder"/>
|
||||
<key key0="p" key2="0" key3="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="q" key2="tab"/>
|
||||
<key key0="s" key1="accent_ring" key3="ß"/>
|
||||
<key key0="s" key3="loc ß"/>
|
||||
<key key0="d" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="f" key3="{" key4="}"/>
|
||||
<key key0="g" key3="[" key4="]"/>
|
||||
<key key0="h" key3="=" key4="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key3="^"/>
|
||||
<key key0="k" key2="€" key3="$" key4="£"/>
|
||||
<key key0="k" key2="€" key3="$"/>
|
||||
<key key0="l" key2="%"/>
|
||||
<key key0="m" key3="*"/>
|
||||
</row>
|
||||
@@ -31,7 +31,7 @@
|
||||
<key key0="c" key1="accent_cedille" key3="," key4="\?"/>
|
||||
<key key0="v" key3=";" key4="."/>
|
||||
<key key0="b" key3=":" key4="/"/>
|
||||
<key key0="n" key1="accent_tilde" key2="§" key4="!"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2="§" key4="!"/>
|
||||
<key width="2.0" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
40
res/xml/colemak.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="q" key1="esc" key2="loc accent_aigu" key3="loc accent_tilde" shift="0.5"/>
|
||||
<key key0="w" key1="loc accent_grave" key2=" ́" key3="~" />
|
||||
<key key0="f" key1="`" key2="-" key3="+" />
|
||||
<key key0="p" key2="=" key3="%"/>
|
||||
<key key0="g" key1="!" key2="/" key3="\\"/>
|
||||
<key key0="j" key1="loc accent_caron" key2="loc accent_trema" />
|
||||
<key key0="l" key1="f11_placeholder" key2="f12_placeholder"/>
|
||||
<key key0="u" key1="loc accent_double_aigu" key2="loc accent_ring" />
|
||||
<key key0="y" key1=""" key2="'"/>
|
||||
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="1" key4="tab"/>
|
||||
<key key0="r" key1="\@" key2="2" />
|
||||
<key key0="s" key1="\#" key2="3" key4="loc ß"/>
|
||||
<key key0="t" key1="$" key2="4" key4="loc accent_ogonek" />
|
||||
<key key0="d" key1="€" key2="5" key4="loc accent_dot_above"/>
|
||||
<key key0="h" key1="&" key2="6" />
|
||||
<key key0="n" key1="*" key2="7" />
|
||||
<key key0="e" key1="loc accent_circonflexe" key2="8" key4="^"/>
|
||||
<key key0="i" key1="_" key2="9" />
|
||||
<key key0="o" key1="0" key3="loc accent_macron"/>
|
||||
|
||||
</row>
|
||||
<row>
|
||||
<key key0="shift" width="1.5" />
|
||||
<key key0="z" key1="," key2="."/>
|
||||
<key key0="x" key1=">" key2="<"/>
|
||||
<key key0="c" key1="{" key2="}" key3="loc accent_cedille"/>
|
||||
<key key0="v" key1="[" key2="]"/>
|
||||
<key key0="b" key1="(" key2=")"/>
|
||||
<key key0="k" key1=";" key2=":"/>
|
||||
<key key0="m" key1="|" key2="\?" />
|
||||
<key key0="backspace" key1="delete" shift="0.25" width="1.25"/>
|
||||
|
||||
</row>
|
||||
</keyboard>
|
@@ -2,32 +2,32 @@
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="shift" width="1.5" key2="esc" key4="tab"/>
|
||||
<key key0="p" key1="accent_ring" key2="." key3="<" key4="f11_placeholder"/>
|
||||
<key key0="y" key1="accent_grave" key2="," key3=">" key4="f12_placeholder"/>
|
||||
<key key0="f" key4="€"/>
|
||||
<key key0="p" key1="loc accent_ring" key2="." key3="<" key4="f11_placeholder"/>
|
||||
<key key0="y" key1="loc accent_grave" key2="," key3=">" key4="f12_placeholder"/>
|
||||
<key key0="f" key4="loc €"/>
|
||||
<key key0="g" key2="\\" key3="|"/>
|
||||
<key key0="c" key1="accent_trema" key2="accent_circonflexe" key3="{" key4="}"/>
|
||||
<key key0="c" key1="loc accent_trema" key2="loc accent_circonflexe" key3="{" key4="}"/>
|
||||
<key key0="r" key3="[" key4="]"/>
|
||||
<key key0="l" key2="=" key3="+" key4="£"/>
|
||||
<key key0="l" key2="=" key3="+" key4="loc £"/>
|
||||
<key key0="backspace" key2="delete" width="1.5"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="1" key4="!"/>
|
||||
<key key0="o" key1="accent_macron" key2="2" key3="\@"/>
|
||||
<key key0="e" key1="accent_caron" key2="3" key3="\#"/>
|
||||
<key key0="u" key2="4" key3="$"/>
|
||||
<key key0="o" key1="loc accent_macron" key2="2" key3="\@" key4="loc accent_ogonek"/>
|
||||
<key key0="e" key1="loc accent_caron" key2="3" key3="\#" key4="loc accent_dot_above"/>
|
||||
<key key0="u" key2="4" key3="$" key4="loc accent_double_aigu"/>
|
||||
<key key0="i" key2="5" key3="%"/>
|
||||
<key key0="d" key2="6" key3="^"/>
|
||||
<key key0="h" key2="7" key3="&"/>
|
||||
<key key0="t" key2="8" key3="*"/>
|
||||
<key key0="n" key2="9" key3="(" key4=")"/>
|
||||
<key key0="s" key1="0" key3="ß"/>
|
||||
<key key0="s" key2="0" key3="loc ß"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="q" shift="0.5" key1="accent_tilde" key2="`" key3="~"/>
|
||||
<key key0="j" key1="accent_aigu" key2="'" key3="""/>
|
||||
<key key0="q" shift="0.5" key1="loc accent_tilde" key2="`" key3="~"/>
|
||||
<key key0="j" key1="loc accent_aigu" key2="'" key3="""/>
|
||||
<key key0="k" key2=";" key3=":"/>
|
||||
<key key0="x" key1="accent_cedille"/>
|
||||
<key key0="x" key1="loc accent_cedille"/>
|
||||
<key key0="b"/>
|
||||
<key key0="m" key2="/" key3="\?"/>
|
||||
<key key0="w"/>
|
||||
|
@@ -9,28 +9,28 @@
|
||||
<key key0="ъ" key2="6" key3="^" key4="€"/>
|
||||
<key key0="у" key2="7" key3="&" key4="§"/>
|
||||
<key key0="и" key2="8" key3="*"/>
|
||||
<key key0="о" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="п" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="о" key2="9" key3="(" key4=")"/>
|
||||
<key key0="п" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="а" key1="tab" key2="`"/>
|
||||
<key key0="с" key2="£"/>
|
||||
<key key0="д" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="с"/>
|
||||
<key key0="д"/>
|
||||
<key key0="ф"/>
|
||||
<key key0="г" key1="accent_caron" key2="-" key3="_"/>
|
||||
<key key0="г" key2="-" key3="_"/>
|
||||
<key key0="х" key2="=" key3="+"/>
|
||||
<key key0="й" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="й" key4="}" key3="{"/>
|
||||
<key key0="к" key2="ш" key3="[" key4="]"/>
|
||||
<key key0="л" key1="щ" key2="|" key3="\\" key4="ю"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="з"/>
|
||||
<key key0="ь" key1="accent_ring" key3="ѝ"/>
|
||||
<key key0="ц" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="ь" key3="ѝ"/>
|
||||
<key key0="ц" key2="<" key3="."/>
|
||||
<key key0="ж" key2=">" key3=","/>
|
||||
<key key0="б" key2="\?" key3="/"/>
|
||||
<key key0="н" key1="accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="н" key2=":" key3=";"/>
|
||||
<key key0="м" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
|
@@ -6,10 +6,14 @@
|
||||
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty"/>
|
||||
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_es,extra_keys=accent_grave|accent_aigu|accent_tilde|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=azerty,extra_keys=accent_grave|accent_aigu|accent_circonflexe|accent_cedille|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwertz_hu,extra_keys=accent_aigu|accent_trema|accent_ogonek|€"/>
|
||||
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_grave|accent_aigu|€"/>
|
||||
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_ko"/>
|
||||
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_ogonek|accent_caron|accent_dot_above|accent_macron|€"/>
|
||||
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_lv,extra_keys=accent_caron|accent_cedille|accent_macron|€"/>
|
||||
<subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=azerty,extra_keys=accent_grave|accent_aigu|accent_circonflexe|accent_cedille|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_pt,extra_keys=accent_aigu|accent_cedille|accent_circonflexe|accent_grave|accent_tilde|€"/>
|
||||
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=ru_jcuken"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_sv_se,extra_keys=accent_aigu|accent_trema|accent_ring|€"/>
|
||||
<subtype android:label="%s" android:languageTag="tr" android:imeSubtypeLocale="tr_TR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_tr,extra_keys=accent_cedille|accent_trema|₺|ı|ğ"/>
|
||||
</input-method>
|
||||
|
49
res/xml/neo2.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard bottom_row="false">
|
||||
<row>
|
||||
<key key0="x" key1="°" key2="1" key4="…"/>
|
||||
<key key0="v" key1="§" key2="2" key4="_"/>
|
||||
<key key0="l" key2="3" key4="["/>
|
||||
<key key0="c" key2="4" key4="]"/>
|
||||
<key key0="w" key2="5" key4="^"/>
|
||||
<key key0="k" key2="6" key4="!"/>
|
||||
<key key0="h" key2="7" key4="<"/>
|
||||
<key key0="g" key2="8" key4=">"/>
|
||||
<key key0="f" key2="9" key3="f11_placeholder" key4="="/>
|
||||
<key key0="q" key2="0" key3="f12_placeholder" key4="&"/>
|
||||
<key key0="ß" key1="-"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="u" key1="tab" key4="\\"/>
|
||||
<key key0="i" key4="/"/>
|
||||
<key key0="a" key4="{"/>
|
||||
<key key0="e" key4="}"/>
|
||||
<key key0="o" key4="*"/>
|
||||
<key key0="s" key4="\?"/>
|
||||
<key key0="n" key4="("/>
|
||||
<key key0="r" key4=")"/>
|
||||
<key key0="t" key4="-"/>
|
||||
<key key0="d" key4=":"/>
|
||||
<key key0="y" key3="\@"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key1="esc"/>
|
||||
<key key0="ü" key4="\#"/>
|
||||
<key key0="ö" key4="$"/>
|
||||
<key key0="ä" key4="|"/>
|
||||
<key key0="p" key4="~"/>
|
||||
<key key0="z" key4="`"/>
|
||||
<key key0="b" key4="+"/>
|
||||
<key key0="m" key4="%"/>
|
||||
<key key0="." key1="," key3=""" key4="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key2="meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key1="switch_programming" edgekeys="true"/>
|
||||
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
|
||||
<key key0="j" key4=";"/>
|
||||
<key width="1.8" key0="enter" key2="action"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard bottom_row="false">
|
||||
<keyboard bottom_row="false" extra_keys="false">
|
||||
<row>
|
||||
<key width="0.75" key0="esc" key2="~" key4="!"/>
|
||||
<key width="0.75" key0="(" key2="[" key4="{"/>
|
||||
|
@@ -3,34 +3,34 @@
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key1="~" key2="2" key3="\@"/>
|
||||
<key key0="e" key1="!" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="e" key1="!" key2="3" key3="\#" key4="loc €"/>
|
||||
<key key0="r" key2="4" key3="$"/>
|
||||
<key key0="t" key2="5" key3="%"/>
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="o" key1="loc accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="`"/>
|
||||
<key key0="s" key1="accent_ring" key3="ß"/>
|
||||
<key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key1="accent_caron" key2="-" key3="_"/>
|
||||
<key key0="s" key1="loc accent_ring" key3="loc ß" key4="loc accent_ogonek"/>
|
||||
<key key0="d" key1="loc accent_grave" key2="loc £" key3="loc accent_aigu"/>
|
||||
<key key0="f" key1="loc accent_dot_above"/>
|
||||
<key key0="g" key1="loc accent_caron" key2="-" key3="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="j" key1="loc accent_trema" key2="loc accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="k" key1="loc accent_double_aigu" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key1="accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
|
@@ -9,17 +9,17 @@
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="o" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab" key4="`"/>
|
||||
<key key0="s" key1="accent_ring" key2="¡" key3="ß"/>
|
||||
<key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
|
||||
<key key0="s" key2="¡" key3="loc ß"/>
|
||||
<key key0="d" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key1="accent_caron" key2="-" key3="_"/>
|
||||
<key key0="g" key2="-" key3="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="j" key1="accent_trema" key4="}" key3="{"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
<key key0="ñ" key1="·" key3="ç" />
|
||||
@@ -28,7 +28,7 @@
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/" key4="¿"/>
|
||||
<key key0="n" key1="accent_tilde" key2=":" key3=";"/>
|
||||
|
37
res/xml/qwerty_hu.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="q" key2="0" key4="esc"/>
|
||||
<key key0="w" key1="'" key2="1" key4="|"/>
|
||||
<key key0="e" key1=""" key2="2" key4="é"/>
|
||||
<key key0="r" key2="3" key4="^"/>
|
||||
<key key0="t" key1="!" key2="4" key4="f11_placeholder"/>
|
||||
<key key0="y" key1="%" key2="5" key3="°" key4="f12_placeholder"/>
|
||||
<key key0="u" key1="ű" key2="6" key3="ü" key4="ú"/>
|
||||
<key key0="i" key1="=" key2="7" key3="`" key4="í"/>
|
||||
<key key0="o" key1="ő" key2="8" key3="ö" key4="ó"/>
|
||||
<key key0="p" key2="9"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key4="á"/>
|
||||
<key key0="s" key1="§" key2="\\" key3="[" key4="]"/>
|
||||
<key key0="d" key3="{" key4="}"/>
|
||||
<key key0="f" key3="+"/>
|
||||
<key key0="g" key3="*"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j"/>
|
||||
<key key0="k" key3="(" key4=")"/>
|
||||
<key key0="l" key3="/"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="z" key3="<" key4=">"/>
|
||||
<key key0="x" key4="\#"/>
|
||||
<key key0="c" key4="&"/>
|
||||
<key key0="v" key4="\@"/>
|
||||
<key key0="b" key1="\?" key3="," key4=";"/>
|
||||
<key key0="n" key1=":" key3="."/>
|
||||
<key key0="m" key1="_" key3="-"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -3,19 +3,19 @@
|
||||
<row>
|
||||
<key key0="ㅂ" key2="1" key4="esc"/>
|
||||
<key key0="ㅈ" key1="~" key2="2" key3="\@"/>
|
||||
<key key0="ㄷ" key1="!" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="ㄷ" key1="!" key2="3" key3="\#"/>
|
||||
<key key0="ㄱ" key2="4" key3="$"/>
|
||||
<key key0="ㅅ" key2="5" key3="%"/>
|
||||
<key key0="ㅛ" key2="6" key3="^"/>
|
||||
<key key0="ㅕ" key2="7" key3="&"/>
|
||||
<key key0="ㅑ" key2="8" key3="*"/>
|
||||
<key key0="ㅐ" key2="9" key3="(" key4=")"/>
|
||||
<key key0="ㅔ" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="ㅔ" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ㅁ" key1="tab" key2="`"/>
|
||||
<key key0="ㄴ" key3="ß"/>
|
||||
<key key0="ㅇ" key2="£"/>
|
||||
<key key0="ㄴ"/>
|
||||
<key key0="ㅇ"/>
|
||||
<key key0="ㄹ"/>
|
||||
<key key0="ㅎ" key2="-" key3="_"/>
|
||||
<key key0="ㅗ" key2="=" key3="+"/>
|
||||
|
@@ -10,13 +10,13 @@
|
||||
<key key0="u" key1="ū" key2="7" key3="&" key4="*"/>
|
||||
<key key0="i" key1="ī" key2="8" key3="(" key4=")"/>
|
||||
<key key0="o" key1="ō" key2="9" key3="{" key4="}"/>
|
||||
<key key0="p" key1="0"/>
|
||||
<key key0="p" key2="0"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="ā" key2="tab"/>
|
||||
<key key0="s" key1="š" key3="ß"/>
|
||||
<key key0="d" key2="£"/>
|
||||
<key key0="f"/>
|
||||
<key key0="s" key1="š" key3="loc ß" key4="loc accent_ogonek"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f" key1="loc accent_dot_above"/>
|
||||
<key key0="g" key1="ģ"/>
|
||||
<key key0="h" key2="accent_macron" key3="accent_caron" key4="accent_cedille"/>
|
||||
<key key0="j" key1="+" key2="=" key3="-" key4="_"/>
|
||||
|
@@ -3,20 +3,20 @@
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key1="~" key2="2" key3="\@" key4="!"/>
|
||||
<key key0="e" key1="£" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="e" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="r" key2="4" key3="$" key4="f11_placeholder"/>
|
||||
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/>
|
||||
<key key0="y" key1="accent_caron" key2="6" key3="^" key4="accent_trema"/>
|
||||
<key key0="y" key2="6" key3="^" key4="loc accent_trema"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="\\"/>
|
||||
<key key0="p" key2="0" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab" key4="`"/>
|
||||
<key key0="s" key1="'" key3="ß" key4="accent_cedille"/>
|
||||
<key key0="d" key1=""" key2="accent_ring"/>
|
||||
<key key0="f" key2="accent_caron"/>
|
||||
<key key0="s" key1="'" key3="loc ß" key4="accent_cedille"/>
|
||||
<key key0="d" key1="""/>
|
||||
<key key0="f"/>
|
||||
<key key0="g"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j" key1="-" key2="=" key4="+" key3="_"/>
|
||||
|
@@ -15,9 +15,9 @@
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab"/>
|
||||
<key key0="s" key1="accent_ring" key2="accent_cedille" key3="ß" key4="accent_tilde"/>
|
||||
<key key0="d" key1="accent_grave" key2="accent_caron" key3="accent_aigu"/>
|
||||
<key key0="f" key1="accent_trema" key2="accent_circonflexe"/>
|
||||
<key key0="s" key1="accent_ring" key3="loc ß"/>
|
||||
<key key0="d" key3="accent_aigu"/>
|
||||
<key key0="f" key1="accent_trema"/>
|
||||
<key key0="g"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j" key1="{" key4="}"/>
|
||||
|
37
res/xml/qwerty_tr.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key1="~" key2="2" key3="\@"/>
|
||||
<key key0="e" key1="!" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="r" key2="4" key3="$"/>
|
||||
<key key0="t" key2="5" key3="%" key4="₺"/>
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key1="ü" key2="7" key3="&"/>
|
||||
<key key0="i" key1="ı" key2="8" key3="*"/>
|
||||
<key key0="o" key1="ö" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" />
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="`"/>
|
||||
<key key0="s" key1="ş"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key1="ğ" key2="-" key3="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key3="{" key4="}"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="ç" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -10,12 +10,12 @@
|
||||
<key key0="u" key2="7" key3="ü" key4="}"/>
|
||||
<key key0="i" key1="(" key2="8" key3="[" key4="]"/>
|
||||
<key key0="o" key1=")" key2="9" key3="ö" key4="="/>
|
||||
<key key0="p" key1="0" key3="\?"/>
|
||||
<key key0="p" key2="0" key3="\?"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="`" key3="ä"/>
|
||||
<key key0="s" key3="ß"/>
|
||||
<key key0="d" key2="£"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f" key1="~"/>
|
||||
<key key0="g" key3="-"/>
|
||||
<key key0="h" key3="+"/>
|
||||
|
37
res/xml/qwertz_hu.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="q" key2="0" key4="esc"/>
|
||||
<key key0="w" key1="'" key2="1" key4="|"/>
|
||||
<key key0="e" key1=""" key2="2" key4="é"/>
|
||||
<key key0="r" key2="3" key4="^"/>
|
||||
<key key0="t" key1="!" key2="4" key4="f11_placeholder"/>
|
||||
<key key0="z" key1="%" key2="5" key3="°" key4="f12_placeholder"/>
|
||||
<key key0="u" key1="ű" key2="6" key3="ü" key4="ú"/>
|
||||
<key key0="i" key1="=" key2="7" key3="`" key4="í"/>
|
||||
<key key0="o" key1="ő" key2="8" key3="ö" key4="ó"/>
|
||||
<key key0="p" key2="9"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key4="á"/>
|
||||
<key key0="s" key1="§" key2="\\" key3="[" key4="]"/>
|
||||
<key key0="d" key3="{" key4="}"/>
|
||||
<key key0="f" key3="+"/>
|
||||
<key key0="g" key3="*"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j"/>
|
||||
<key key0="k" key3="(" key4=")"/>
|
||||
<key key0="l" key3="/"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="y" key3="<" key4=">"/>
|
||||
<key key0="x" key4="\#"/>
|
||||
<key key0="c" key4="&"/>
|
||||
<key key0="v" key4="\@"/>
|
||||
<key key0="b" key1="\?" key3="," key4=";"/>
|
||||
<key key0="n" key1=":" key3="."/>
|
||||
<key key0="m" key1="_" key3="-"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -21,14 +21,11 @@
|
||||
<CheckBoxPreference android:key="lockable_box" android:title="Box" android:defaultValue="false"/>
|
||||
</PreferenceScreen>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_vibrate">
|
||||
<CheckBoxPreference android:key="vibrate_enabled" android:title="@string/pref_vibrate_title" android:summary="@string/pref_vibrate_summary" android:defaultValue="true"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="vibrate_duration" android:title="@string/pref_vibrate_duration_title" android:summary="%sms" android:defaultValue="20" min="5" max="100"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_style">
|
||||
<ListPreference android:key="theme" android:title="@string/pref_theme" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_theme_entries" android:entryValues="@array/pref_theme_values"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="margin_bottom" android:title="@string/pref_margin_bottom_title" android:summary="%sdp" android:defaultValue="5" min="0" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_keyboard_height_title" android:summary="%s%%" android:defaultValue="35" min="25" max="50"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_height_landscape" android:title="@string/pref_keyboard_height_landscape_title" android:summary="%s%%" android:defaultValue="50" min="35" max="65"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="horizontal_margin" android:title="@string/pref_horizontal_margin_title" android:summary="%sdp" android:defaultValue="3" min="0" max="20"/>
|
||||
<juloo.common.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.8" max="1.2"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_vertical_space" android:title="@string/pref_key_vertical_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
|
@@ -9,6 +9,7 @@ import android.preference.PreferenceManager;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.TypedValue;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -25,8 +26,6 @@ final class Config
|
||||
public int layout; // Or '-1' for the system defaults
|
||||
public int programming_layout; // Or '-1' for none
|
||||
public float swipe_dist_px;
|
||||
public boolean vibrateEnabled;
|
||||
public long vibrateDuration;
|
||||
public long longPressTimeout;
|
||||
public long longPressInterval;
|
||||
public float marginBottom;
|
||||
@@ -35,7 +34,7 @@ final class Config
|
||||
public float keyVerticalInterval;
|
||||
public float keyHorizontalInterval;
|
||||
public boolean preciseRepeat;
|
||||
public int lockable_modifiers;
|
||||
public Set<KeyValue.Modifier> lockable_modifiers = new HashSet<KeyValue.Modifier>();
|
||||
public float characterSize; // Ratio
|
||||
public int accents; // Values are R.values.pref_accents_v_*
|
||||
public int theme; // Values are R.style.*
|
||||
@@ -46,7 +45,7 @@ final class Config
|
||||
public String actionLabel; // Might be 'null'
|
||||
public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
|
||||
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
|
||||
public Set<String> extra_keys; // 'null' means all the keys
|
||||
public Set<KeyValue> extra_keys; // 'null' means all the keys
|
||||
|
||||
public final IKeyEventHandler handler;
|
||||
|
||||
@@ -56,13 +55,11 @@ final class Config
|
||||
// static values
|
||||
marginTop = res.getDimension(R.dimen.margin_top);
|
||||
keyPadding = res.getDimension(R.dimen.key_padding);
|
||||
labelTextSize = res.getFloat(R.integer.label_text_size);
|
||||
sublabelTextSize = res.getFloat(R.integer.sublabel_text_size);
|
||||
labelTextSize = 0.33f;
|
||||
sublabelTextSize = 0.22f;
|
||||
// default values
|
||||
layout = -1;
|
||||
programming_layout = -1;
|
||||
vibrateEnabled = true;
|
||||
vibrateDuration = 20;
|
||||
longPressTimeout = 600;
|
||||
longPressInterval = 65;
|
||||
marginBottom = res.getDimension(R.dimen.margin_bottom);
|
||||
@@ -93,13 +90,17 @@ final class Config
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Resources res = context.getResources();
|
||||
DisplayMetrics dm = res.getDisplayMetrics();
|
||||
// The height of the keyboard is relative to the height of the screen. This
|
||||
// is not the actual size of the keyboard, which will be bigger if the
|
||||
// layout has a fifth row.
|
||||
// The height of the keyboard is relative to the height of the screen.
|
||||
// This is the height of the keyboard if it have 4 rows.
|
||||
int keyboardHeightPercent;
|
||||
// Scale some dimensions depending on orientation
|
||||
float horizontalIntervalScale = 1.f;
|
||||
float characterSizeScale = 1.f;
|
||||
if (res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) // Landscape mode
|
||||
{
|
||||
keyboardHeightPercent = 55;
|
||||
keyboardHeightPercent = prefs.getInt("keyboard_height_landscape", 50);
|
||||
horizontalIntervalScale = 2.f;
|
||||
characterSizeScale = 1.25f;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -114,69 +115,93 @@ final class Config
|
||||
// Take the mean of both dimensions as an approximation of the diagonal.
|
||||
float physical_scaling = (dm.widthPixels + dm.heightPixels) / (dm.xdpi + dm.ydpi);
|
||||
swipe_dist_px = Float.valueOf(prefs.getString("swipe_dist", "15")) * physical_scaling;;
|
||||
vibrateEnabled = prefs.getBoolean("vibrate_enabled", vibrateEnabled);
|
||||
vibrateDuration = prefs.getInt("vibrate_duration", (int)vibrateDuration);
|
||||
longPressTimeout = prefs.getInt("longpress_timeout", (int)longPressTimeout);
|
||||
longPressInterval = prefs.getInt("longpress_interval", (int)longPressInterval);
|
||||
marginBottom = getDipPref(dm, prefs, "margin_bottom", marginBottom);
|
||||
keyVerticalInterval = getDipPref(dm, prefs, "key_vertical_space", keyVerticalInterval);
|
||||
keyHorizontalInterval = getDipPref(dm, prefs, "key_horizontal_space", keyHorizontalInterval);
|
||||
keyHorizontalInterval =
|
||||
getDipPref(dm, prefs, "key_horizontal_space", keyHorizontalInterval)
|
||||
* horizontalIntervalScale;
|
||||
// Do not substract keyVerticalInterval from keyHeight because this is done
|
||||
// during rendered.
|
||||
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
|
||||
horizontalMargin = getDipPref(dm, prefs, "horizontal_margin", horizontalMargin) + res.getDimension(R.dimen.extra_horizontal_margin);
|
||||
horizontalMargin =
|
||||
getDipPref(dm, prefs, "horizontal_margin", horizontalMargin)
|
||||
+ res.getDimension(R.dimen.extra_horizontal_margin);
|
||||
preciseRepeat = prefs.getBoolean("precise_repeat", preciseRepeat);
|
||||
lockable_modifiers =
|
||||
(prefs.getBoolean("lockable_shift", true) ? KeyValue.FLAG_SHIFT : 0)
|
||||
| (prefs.getBoolean("lockable_ctrl", false) ? KeyValue.FLAG_CTRL : 0)
|
||||
| (prefs.getBoolean("lockable_alt", false) ? KeyValue.FLAG_ALT : 0)
|
||||
| (prefs.getBoolean("lockable_fn", false) ? KeyValue.FLAG_FN : 0)
|
||||
| (prefs.getBoolean("lockable_meta", false) ? KeyValue.FLAG_META : 0)
|
||||
| (prefs.getBoolean("lockable_sup", false) ? KeyValue.FLAG_ACCENT_SUPERSCRIPT : 0)
|
||||
| (prefs.getBoolean("lockable_sub", false) ? KeyValue.FLAG_ACCENT_SUBSCRIPT : 0)
|
||||
| (prefs.getBoolean("lockable_box", false) ? KeyValue.FLAG_ACCENT_BOX : 0);
|
||||
characterSize = prefs.getFloat("character_size", characterSize);
|
||||
lockable_modifiers.clear();
|
||||
if (prefs.getBoolean("lockable_shift", true)) lockable_modifiers.add(KeyValue.Modifier.SHIFT);
|
||||
if (prefs.getBoolean("lockable_ctrl", false)) lockable_modifiers.add(KeyValue.Modifier.CTRL);
|
||||
if (prefs.getBoolean("lockable_alt", false)) lockable_modifiers.add(KeyValue.Modifier.ALT);
|
||||
if (prefs.getBoolean("lockable_fn", false)) lockable_modifiers.add(KeyValue.Modifier.FN);
|
||||
if (prefs.getBoolean("lockable_meta", false)) lockable_modifiers.add(KeyValue.Modifier.META);
|
||||
if (prefs.getBoolean("lockable_sup", false)) lockable_modifiers.add(KeyValue.Modifier.SUPERSCRIPT);
|
||||
if (prefs.getBoolean("lockable_sub", false)) lockable_modifiers.add(KeyValue.Modifier.SUBSCRIPT);
|
||||
if (prefs.getBoolean("lockable_box", false)) lockable_modifiers.add(KeyValue.Modifier.BOX);
|
||||
characterSize =
|
||||
prefs.getFloat("character_size", characterSize)
|
||||
* characterSizeScale;
|
||||
accents = Integer.valueOf(prefs.getString("accents", "1"));
|
||||
theme = getThemeId(res, prefs.getString("theme", ""));
|
||||
}
|
||||
|
||||
/** Update the layout according to the configuration.
|
||||
* - Remove the switching key if it isn't needed
|
||||
* - Remove keys from other locales (not in 'extra_keys')
|
||||
* - Remove "localized" keys from other locales (not in 'extra_keys')
|
||||
* - Replace the action key to show the right label
|
||||
* - Swap the enter and action keys
|
||||
*/
|
||||
public KeyboardData modify_layout(KeyboardData kw)
|
||||
public KeyboardData modify_layout(KeyboardData original_kw)
|
||||
{
|
||||
// Update the name to avoid caching in KeyModifier
|
||||
KeyValue action_key = (actionLabel == null) ? null :
|
||||
KeyValue.getKeyByName("action").withNameAndSymbol(actionLabel, actionLabel);
|
||||
return kw.replaceKeys(key -> {
|
||||
if (key == null)
|
||||
return null;
|
||||
switch (key.eventCode)
|
||||
final KeyValue action_key = (actionLabel == null) ? null :
|
||||
KeyValue.getKeyByName("action").withSymbol(actionLabel);
|
||||
// Extra keys are removed from the set as they are encountered during the
|
||||
// first iteration then automatically added.
|
||||
final Set<KeyValue> extra_keys = new HashSet<KeyValue>(this.extra_keys);
|
||||
KeyboardData kw = original_kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key)
|
||||
{
|
||||
case KeyValue.EVENT_CHANGE_METHOD:
|
||||
return shouldOfferSwitchingToNextInputMethod ? key : null;
|
||||
case KeyEvent.KEYCODE_ENTER:
|
||||
return (swapEnterActionKey && action_key != null) ? action_key : key;
|
||||
case KeyValue.EVENT_ACTION:
|
||||
return (swapEnterActionKey && action_key != null) ?
|
||||
KeyValue.getKeyByName("enter") : action_key;
|
||||
case KeyValue.EVENT_SWITCH_PROGRAMMING:
|
||||
return shouldOfferSwitchingToProgramming ? key : null;
|
||||
default:
|
||||
if (key.flags != 0)
|
||||
{
|
||||
if ((key.flags & KeyValue.FLAG_LOCALIZED) != 0 &&
|
||||
extra_keys != null &&
|
||||
!extra_keys.contains(key.name))
|
||||
return null;
|
||||
if ((key.flags & lockable_modifiers) != 0)
|
||||
return key.withFlags(key.flags | KeyValue.FLAG_LOCK);
|
||||
}
|
||||
return key;
|
||||
}});
|
||||
if (key == null)
|
||||
return null;
|
||||
boolean is_extra_key = extra_keys.contains(key);
|
||||
if (is_extra_key)
|
||||
extra_keys.remove(key);
|
||||
int flags = key.getFlags();
|
||||
if ((flags & KeyValue.FLAG_LOCALIZED) != 0 && !is_extra_key)
|
||||
return null;
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Event:
|
||||
switch (key.getEvent())
|
||||
{
|
||||
case CHANGE_METHOD:
|
||||
return shouldOfferSwitchingToNextInputMethod ? key : null;
|
||||
case ACTION:
|
||||
return (swapEnterActionKey && action_key != null) ?
|
||||
KeyValue.getKeyByName("enter") : action_key;
|
||||
case SWITCH_PROGRAMMING:
|
||||
return shouldOfferSwitchingToProgramming ? key : null;
|
||||
}
|
||||
break;
|
||||
case Keyevent:
|
||||
switch (key.getKeyevent())
|
||||
{
|
||||
case KeyEvent.KEYCODE_ENTER:
|
||||
return (swapEnterActionKey && action_key != null) ? action_key : key;
|
||||
}
|
||||
break;
|
||||
case Modifier:
|
||||
if (lockable_modifiers.contains(key.getModifier()))
|
||||
return key.withFlags(flags | KeyValue.FLAG_LOCK);
|
||||
break;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
});
|
||||
if (extra_keys.size() > 0)
|
||||
kw = kw.addExtraKeys(extra_keys.iterator());
|
||||
return kw;
|
||||
}
|
||||
|
||||
private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def)
|
||||
@@ -214,16 +239,21 @@ final class Config
|
||||
{
|
||||
case "azerty": return R.xml.azerty;
|
||||
case "bgph1": return R.xml.local_bgph1;
|
||||
case "colemak": return R.xml.colemak;
|
||||
case "dvorak": return R.xml.dvorak;
|
||||
case "neo2": return R.xml.neo2;
|
||||
case "qwerty_es": return R.xml.qwerty_es;
|
||||
case "qwerty_hu": return R.xml.qwerty_hu;
|
||||
case "qwerty_ko": return R.xml.qwerty_ko;
|
||||
case "qwerty_lv": return R.xml.qwerty_lv;
|
||||
case "qwerty_pt": return R.xml.qwerty_pt;
|
||||
case "qwerty_tr": return R.xml.qwerty_tr;
|
||||
case "qwerty": return R.xml.qwerty;
|
||||
case "qwerty_sv_se": return R.xml.qwerty_sv_se;
|
||||
case "qwertz_hu": return R.xml.qwertz_hu;
|
||||
case "qwertz": return R.xml.qwertz;
|
||||
case "ru_jcuken": return R.xml.local_ru_jcuken;
|
||||
default: throw new IllegalArgumentException("layoutId_of_string: Unknown layout: " + name);
|
||||
default: return R.xml.qwerty; // The config might store an invalid layout, don't crash
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,6 +281,6 @@ final class Config
|
||||
|
||||
public static interface IKeyEventHandler
|
||||
{
|
||||
public void handleKeyUp(KeyValue value, int flags);
|
||||
public void handleKeyUp(KeyValue value, Pointers.Modifiers flags);
|
||||
}
|
||||
}
|
||||
|
@@ -8,19 +8,32 @@ import java.io.BufferedReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Emoji extends KeyValue
|
||||
public class Emoji
|
||||
{
|
||||
private final String _name;
|
||||
private final KeyValue _kv;
|
||||
private final String _desc;
|
||||
|
||||
private static HashMap<String, Emoji> emojis_by_name = new HashMap<String, Emoji>();
|
||||
|
||||
protected Emoji(String name, String bytecode, String desc)
|
||||
{
|
||||
super(name, bytecode, CHAR_NONE, EVENT_NONE, 0);
|
||||
_name = name;
|
||||
_kv = new KeyValue(bytecode, KeyValue.KIND_STRING, 0, 0);
|
||||
_desc = desc;
|
||||
emojis_by_name.put(name, this);
|
||||
}
|
||||
|
||||
public String name()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public KeyValue kv()
|
||||
{
|
||||
return _kv;
|
||||
}
|
||||
|
||||
public String getDescription()
|
||||
{
|
||||
return (_desc);
|
||||
|
@@ -55,7 +55,7 @@ public class EmojiGridView extends GridView
|
||||
Config config = Config.globalConfig();
|
||||
Integer used = _lastUsed.get(_emojiArray[pos]);
|
||||
_lastUsed.put(_emojiArray[pos], (used == null) ? 1 : used.intValue() + 1);
|
||||
config.handler.handleKeyUp(_emojiArray[pos], 0);
|
||||
config.handler.handleKeyUp(_emojiArray[pos].kv(), Pointers.Modifiers.EMPTY);
|
||||
saveLastUsed(); // TODO: opti
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public class EmojiGridView extends GridView
|
||||
HashSet<String> set = new HashSet<String>();
|
||||
|
||||
for (Emoji emoji : _lastUsed.keySet())
|
||||
set.add(String.valueOf(_lastUsed.get(emoji)) + "-" + emoji.name);
|
||||
set.add(String.valueOf(_lastUsed.get(emoji)) + "-" + emoji.name());
|
||||
edit.putStringSet(LAST_USE_PREF, set);
|
||||
edit.apply();
|
||||
}
|
||||
@@ -126,7 +126,7 @@ public class EmojiGridView extends GridView
|
||||
|
||||
public void setEmoji(Emoji emoji)
|
||||
{
|
||||
setText(emoji.symbol);
|
||||
setText(emoji.kv().getString());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -15,7 +15,7 @@ public class EmojiGroupButtonsBar extends LinearLayout
|
||||
for (int i = 0; i < Emoji.num_groups; i++)
|
||||
{
|
||||
Emoji first = Emoji.getEmojisByGroup(i)[0];
|
||||
add_group(i, first.symbol);
|
||||
add_group(i, first.kv().getString());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -15,14 +15,14 @@ public class EmojiKeyButton extends Button
|
||||
super(context, attrs);
|
||||
setOnClickListener(this);
|
||||
_key = KeyValue.getKeyByName(attrs.getAttributeValue(null, "key"));
|
||||
setText(_key.symbol);
|
||||
if ((_key.flags & KeyValue.FLAG_KEY_FONT) != 0)
|
||||
setText(_key.getString());
|
||||
if (_key.hasFlags(KeyValue.FLAG_KEY_FONT))
|
||||
setTypeface(Theme.getSpecialKeyFont(context));
|
||||
}
|
||||
|
||||
public void onClick(View v)
|
||||
{
|
||||
Config config = Config.globalConfig();
|
||||
config.handler.handleKeyUp(_key, 0);
|
||||
config.handler.handleKeyUp(_key, Pointers.Modifiers.EMPTY);
|
||||
}
|
||||
}
|
||||
|
@@ -11,29 +11,36 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
_recv = recv;
|
||||
}
|
||||
|
||||
public void handleKeyUp(KeyValue key, int flags)
|
||||
public void handleKeyUp(KeyValue key, Pointers.Modifiers mods)
|
||||
{
|
||||
if (key == null || (key.flags & KeyValue.FLAG_NOCHAR) != 0)
|
||||
if (key == null)
|
||||
return;
|
||||
switch (key.eventCode)
|
||||
switch (key.getKind())
|
||||
{
|
||||
case KeyValue.EVENT_CONFIG: _recv.showKeyboardConfig(); return;
|
||||
case KeyValue.EVENT_SWITCH_TEXT: _recv.switchMain(); return;
|
||||
case KeyValue.EVENT_SWITCH_NUMERIC: _recv.switchNumeric(); return;
|
||||
case KeyValue.EVENT_SWITCH_EMOJI: _recv.setPane_emoji(); return;
|
||||
case KeyValue.EVENT_SWITCH_BACK_EMOJI: _recv.setPane_normal(); return;
|
||||
case KeyValue.EVENT_CHANGE_METHOD: _recv.switchToNextInputMethod(); return;
|
||||
case KeyValue.EVENT_ACTION: _recv.performAction(); return;
|
||||
case KeyValue.EVENT_SWITCH_PROGRAMMING: _recv.switchProgramming(); return;
|
||||
default:
|
||||
if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0)
|
||||
handleKeyUpWithModifier(key, flags);
|
||||
else if (key.char_ != KeyValue.CHAR_NONE)
|
||||
_recv.commitChar(key.char_);
|
||||
else if (key.eventCode != KeyValue.EVENT_NONE)
|
||||
handleKeyUpWithModifier(key, flags);
|
||||
else
|
||||
_recv.commitText(key.symbol);
|
||||
case Char:
|
||||
_recv.commitChar(key.getChar());
|
||||
break;
|
||||
case String:
|
||||
_recv.commitText(key.getString());
|
||||
break;
|
||||
case Event:
|
||||
switch (key.getEvent())
|
||||
{
|
||||
case CONFIG: _recv.showKeyboardConfig(); break;
|
||||
case SWITCH_TEXT: _recv.switchMain(); break;
|
||||
case SWITCH_NUMERIC: _recv.switchNumeric(); break;
|
||||
case SWITCH_EMOJI: _recv.setPane_emoji(); break;
|
||||
case SWITCH_BACK_EMOJI: _recv.setPane_normal(); break;
|
||||
case CHANGE_METHOD: _recv.switchToNextInputMethod(); break;
|
||||
case ACTION: _recv.performAction(); break;
|
||||
case SWITCH_PROGRAMMING: _recv.switchProgramming(); break;
|
||||
}
|
||||
break;
|
||||
case Keyevent:
|
||||
handleKeyUpWithModifier(key.getKeyevent(), mods);
|
||||
break;
|
||||
case Modifier:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,31 +64,34 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
return updatedMetaState;
|
||||
}
|
||||
|
||||
/* Send key events corresponding to pressed modifier keys. */
|
||||
private int sendMetaKeys(int flags, int metaState, boolean down)
|
||||
private int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_CTRL) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_ALT) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_SHIFT) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_META) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
|
||||
return metaState;
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
|
||||
case ALT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
|
||||
case SHIFT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
|
||||
case META:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
|
||||
default: return metaState;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
|
||||
*/
|
||||
private void handleKeyUpWithModifier(KeyValue key, int flags)
|
||||
private void handleKeyUpWithModifier(int keyCode, Pointers.Modifiers mods)
|
||||
{
|
||||
if (key.eventCode == KeyValue.EVENT_NONE)
|
||||
return ;
|
||||
int metaState = sendMetaKeys(flags, 0, true);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_DOWN, key.eventCode, metaState);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_UP, key.eventCode, metaState);
|
||||
sendMetaKeys(flags, metaState, false);
|
||||
int metaState = 0;
|
||||
for (int i = 0; i < mods.size(); i++)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, true);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_DOWN, keyCode, metaState);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_UP, keyCode, metaState);
|
||||
for (int i = mods.size() - 1; i >= 0; i--)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, false);
|
||||
}
|
||||
|
||||
public static interface IReceiver
|
||||
|
@@ -1,6 +1,5 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.util.SparseArray;
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
@@ -8,75 +7,335 @@ import java.util.HashMap;
|
||||
class KeyModifier
|
||||
{
|
||||
/** Cache key is KeyValue's name */
|
||||
private static HashMap<String, SparseArray<KeyValue>> _cache =
|
||||
new HashMap<String, SparseArray<KeyValue>>();
|
||||
|
||||
/** Represents a removed key, because a cache entry can't be [null]. */
|
||||
private static final KeyValue removed_key = KeyValue.getKeyByName("removed");
|
||||
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache =
|
||||
new HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>>();
|
||||
|
||||
/** Modify a key according to modifiers. */
|
||||
public static KeyValue handleFlags(KeyValue k, int flags)
|
||||
public static KeyValue modify(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
if (k == null)
|
||||
return null;
|
||||
SparseArray<KeyValue> ks = cacheEntry(k);
|
||||
KeyValue r = ks.get(flags);
|
||||
if (r == null) // Cold cache
|
||||
int n_mods = mods.size();
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = cacheEntry(k);
|
||||
KeyValue r = ks.get(mods);
|
||||
if (r == null)
|
||||
{
|
||||
r = k;
|
||||
r = handleFn(r, flags);
|
||||
r = handleShift(r, flags);
|
||||
r = handleAccents(r, flags);
|
||||
ks.put(flags, r);
|
||||
/* Order: Fn, Shift, accents */
|
||||
for (int i = 0; i < n_mods; i++)
|
||||
r = modify(r, mods.get(i));
|
||||
ks.put(mods, r);
|
||||
}
|
||||
return (r == removed_key) ? null : r;
|
||||
/* Keys with an empty string are placeholder keys. */
|
||||
return (r.getString().length() == 0) ? null : r;
|
||||
}
|
||||
|
||||
private static KeyValue handleAccents(KeyValue k, int flags)
|
||||
public static KeyValue modify(KeyValue k, KeyValue.Modifier mod)
|
||||
{
|
||||
if (k.char_ == KeyValue.CHAR_NONE || (flags & KeyValue.FLAGS_ACCENTS) == 0)
|
||||
return k;
|
||||
char c = handleAccentChar(k.char_, flags);
|
||||
if (c == 0 || c == k.char_)
|
||||
return k;
|
||||
return k.withCharAndSymbol(c);
|
||||
}
|
||||
|
||||
private static KeyValue handleShift(KeyValue k, int flags)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
return k;
|
||||
char c = k.char_;
|
||||
if (k.char_ != KeyValue.CHAR_NONE)
|
||||
c = Character.toUpperCase(c);
|
||||
if (c == k.char_) // Used to have more rules if toUpperCase() did nothing
|
||||
return k;
|
||||
return k.withCharAndSymbol(c);
|
||||
}
|
||||
|
||||
private static char handleAccentChar(char c, int flags)
|
||||
{
|
||||
switch ((flags & KeyValue.FLAGS_ACCENTS))
|
||||
switch (mod)
|
||||
{
|
||||
case KeyValue.FLAG_ACCENT1:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02CB', c);
|
||||
case KeyValue.FLAG_ACCENT2:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00B4', c);
|
||||
case KeyValue.FLAG_ACCENT3:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02C6', c);
|
||||
case KeyValue.FLAG_ACCENT4:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02DC', c);
|
||||
case KeyValue.FLAG_ACCENT5:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00B8', c);
|
||||
case KeyValue.FLAG_ACCENT6:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00A8', c);
|
||||
case KeyValue.FLAG_ACCENT_CARON:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02C7', c);
|
||||
case KeyValue.FLAG_ACCENT_RING:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02DA', c);
|
||||
case KeyValue.FLAG_ACCENT_MACRON:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00AF', c);
|
||||
case KeyValue.FLAG_ACCENT_ORDINAL:
|
||||
case CTRL:
|
||||
case ALT:
|
||||
case META: return turn_into_keyevent(k);
|
||||
case FN: return apply_fn(k);
|
||||
case SHIFT: return apply_shift(k);
|
||||
case GRAVE: return apply_dead_char(k, '\u02CB');
|
||||
case AIGU: return apply_dead_char(k, '\u00B4');
|
||||
case CIRCONFLEXE: return apply_dead_char(k, '\u02C6');
|
||||
case TILDE: return apply_dead_char(k, '\u02DC');
|
||||
case CEDILLE: return apply_dead_char(k, '\u00B8');
|
||||
case TREMA: return apply_dead_char(k, '\u00A8');
|
||||
case CARON: return apply_dead_char(k, '\u02C7');
|
||||
case RING: return apply_dead_char(k, '\u02DA');
|
||||
case MACRON: return apply_dead_char(k, '\u00AF');
|
||||
case OGONEK: return apply_dead_char(k, '\u02DB');
|
||||
case DOT_ABOVE: return apply_dead_char(k, '\u02D9');
|
||||
case DOUBLE_AIGU: return apply_map_char(k, map_char_double_aigu);
|
||||
case ORDINAL: return apply_map_char(k, map_char_ordinal);
|
||||
case SUPERSCRIPT: return apply_map_char(k, map_char_superscript);
|
||||
case SUBSCRIPT: return apply_map_char(k, map_char_subscript);
|
||||
case ARROWS: return apply_map_char(k, map_char_arrows);
|
||||
case BOX: return apply_map_char(k, map_char_box);
|
||||
case SLASH: return apply_map_char(k, map_char_slash);
|
||||
case ARROW_RIGHT: return apply_combining(k, "\u20D7");
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_map_char(KeyValue k, Map_char map)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
char kc = k.getChar();
|
||||
char c = map.apply(kc);
|
||||
return (kc == c) ? k : k.withChar(c);
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
char kc = k.getChar();
|
||||
char c = (char)KeyCharacterMap.getDeadChar(dead_char, kc);
|
||||
return (c == 0 || kc == c) ? k : k.withChar(c);
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_combining(KeyValue k, String combining)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
return k.withString(String.valueOf(k.getChar()) + combining);
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_shift(KeyValue k)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
char kc = k.getChar();
|
||||
char c = map_char_shift(kc);
|
||||
if (kc == c)
|
||||
c = Character.toUpperCase(kc);
|
||||
return (kc == c) ? k : k.withChar(c);
|
||||
case String:
|
||||
return k.withString(k.getString().toUpperCase());
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_fn(KeyValue k)
|
||||
{
|
||||
String name = null;
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char: name = apply_fn_char(k.getChar()); break;
|
||||
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
|
||||
case String:
|
||||
switch (k.getString())
|
||||
{
|
||||
case "":
|
||||
if (k == KeyValue.getKeyByName("f11_placeholder"))
|
||||
name = "f11";
|
||||
else if (k == KeyValue.getKeyByName("f12_placeholder"))
|
||||
name = "f12";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (name == null) ? k : KeyValue.getKeyByName(name);
|
||||
}
|
||||
|
||||
private static String apply_fn_keyevent(int code)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case KeyEvent.KEYCODE_DPAD_UP: return "page_up";
|
||||
case KeyEvent.KEYCODE_DPAD_DOWN: return "page_down";
|
||||
case KeyEvent.KEYCODE_DPAD_LEFT: return "home";
|
||||
case KeyEvent.KEYCODE_DPAD_RIGHT: return "end";
|
||||
case KeyEvent.KEYCODE_ESCAPE: return "insert";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** Return the name of modified key, or [null]. */
|
||||
private static String apply_fn_char(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
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 "⇒";
|
||||
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 '€': case '£': return "removed"; // Avoid showing these twice
|
||||
case '\t': return "\\t";
|
||||
case ' ': return "nbsp";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue turn_into_keyevent(KeyValue k)
|
||||
{
|
||||
if (k.getKind() != KeyValue.Kind.Char)
|
||||
return k;
|
||||
int e;
|
||||
switch (k.getChar())
|
||||
{
|
||||
case 'a': e = KeyEvent.KEYCODE_A; break;
|
||||
case 'b': e = KeyEvent.KEYCODE_B; break;
|
||||
case 'c': e = KeyEvent.KEYCODE_C; break;
|
||||
case 'd': e = KeyEvent.KEYCODE_D; break;
|
||||
case 'e': e = KeyEvent.KEYCODE_E; break;
|
||||
case 'f': e = KeyEvent.KEYCODE_F; break;
|
||||
case 'g': e = KeyEvent.KEYCODE_G; break;
|
||||
case 'h': e = KeyEvent.KEYCODE_H; break;
|
||||
case 'i': e = KeyEvent.KEYCODE_I; break;
|
||||
case 'j': e = KeyEvent.KEYCODE_J; break;
|
||||
case 'k': e = KeyEvent.KEYCODE_K; break;
|
||||
case 'l': e = KeyEvent.KEYCODE_L; break;
|
||||
case 'm': e = KeyEvent.KEYCODE_M; break;
|
||||
case 'n': e = KeyEvent.KEYCODE_N; break;
|
||||
case 'o': e = KeyEvent.KEYCODE_O; break;
|
||||
case 'p': e = KeyEvent.KEYCODE_P; break;
|
||||
case 'q': e = KeyEvent.KEYCODE_Q; break;
|
||||
case 'r': e = KeyEvent.KEYCODE_R; break;
|
||||
case 's': e = KeyEvent.KEYCODE_S; break;
|
||||
case 't': e = KeyEvent.KEYCODE_T; break;
|
||||
case 'u': e = KeyEvent.KEYCODE_U; break;
|
||||
case 'v': e = KeyEvent.KEYCODE_V; break;
|
||||
case 'w': e = KeyEvent.KEYCODE_W; break;
|
||||
case 'x': e = KeyEvent.KEYCODE_X; break;
|
||||
case 'y': e = KeyEvent.KEYCODE_Y; break;
|
||||
case 'z': e = KeyEvent.KEYCODE_Z; break;
|
||||
case '0': e = KeyEvent.KEYCODE_0; break;
|
||||
case '1': e = KeyEvent.KEYCODE_1; break;
|
||||
case '2': e = KeyEvent.KEYCODE_2; break;
|
||||
case '3': e = KeyEvent.KEYCODE_3; break;
|
||||
case '4': e = KeyEvent.KEYCODE_4; break;
|
||||
case '5': e = KeyEvent.KEYCODE_5; break;
|
||||
case '6': e = KeyEvent.KEYCODE_6; break;
|
||||
case '7': e = KeyEvent.KEYCODE_7; break;
|
||||
case '8': e = KeyEvent.KEYCODE_8; break;
|
||||
case '9': e = KeyEvent.KEYCODE_9; break;
|
||||
case '`': e = KeyEvent.KEYCODE_GRAVE; break;
|
||||
case '-': e = KeyEvent.KEYCODE_MINUS; break;
|
||||
case '=': e = KeyEvent.KEYCODE_EQUALS; break;
|
||||
case '[': e = KeyEvent.KEYCODE_LEFT_BRACKET; break;
|
||||
case ']': e = KeyEvent.KEYCODE_RIGHT_BRACKET; break;
|
||||
case '\\': e = KeyEvent.KEYCODE_BACKSLASH; break;
|
||||
case ';': e = KeyEvent.KEYCODE_SEMICOLON; break;
|
||||
case '\'': e = KeyEvent.KEYCODE_APOSTROPHE; break;
|
||||
case '/': e = KeyEvent.KEYCODE_SLASH; break;
|
||||
case '@': e = KeyEvent.KEYCODE_AT; break;
|
||||
case '+': e = KeyEvent.KEYCODE_PLUS; break;
|
||||
case ',': e = KeyEvent.KEYCODE_COMMA; break;
|
||||
case '.': e = KeyEvent.KEYCODE_PERIOD; break;
|
||||
case '*': e = KeyEvent.KEYCODE_STAR; break;
|
||||
case '#': e = KeyEvent.KEYCODE_POUND; break;
|
||||
case '(': e = KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN; break;
|
||||
case ')': e = KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN; break;
|
||||
case ' ': e = KeyEvent.KEYCODE_SPACE; break;
|
||||
default: return k;
|
||||
}
|
||||
return k.withKeyevent(e);
|
||||
}
|
||||
|
||||
/* Lookup the cache entry for a key. Create it needed. */
|
||||
private static HashMap<Pointers.Modifiers, KeyValue> cacheEntry(KeyValue k)
|
||||
{
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = _cache.get(k);
|
||||
if (ks == null)
|
||||
{
|
||||
ks = new HashMap<Pointers.Modifiers, KeyValue>();
|
||||
_cache.put(k, ks);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
private static abstract class Map_char
|
||||
{
|
||||
public abstract char apply(char c);
|
||||
}
|
||||
|
||||
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 '║';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
|
||||
private static final Map_char map_char_double_aigu =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
// Composite characters: a̋ e̋ i̋ m̋ ӳ
|
||||
case 'o': return 'ő';
|
||||
case 'u': return 'ű';
|
||||
case ' ': return '˝';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_ordinal =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return 'ª';
|
||||
@@ -93,7 +352,13 @@ class KeyModifier
|
||||
case '*': return '°';
|
||||
default: return c;
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_SUPERSCRIPT:
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_superscript =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '¹';
|
||||
@@ -115,7 +380,13 @@ class KeyModifier
|
||||
case 'n': return 'ⁿ';
|
||||
default: return c;
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_SUBSCRIPT:
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_subscript =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '₁';
|
||||
@@ -139,165 +410,66 @@ class KeyModifier
|
||||
case 'o': return 'ₒ';
|
||||
default: return c;
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_ARROWS:
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '↙';
|
||||
case '2': return '↓';
|
||||
case '3': return '↘';
|
||||
case '4': return '←';
|
||||
case '6': return '→';
|
||||
case '7': return '↖';
|
||||
case '8': return '↑';
|
||||
case '9': return '↗';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '⇙';
|
||||
case '2': return '⇓';
|
||||
case '3': return '⇘';
|
||||
case '4': return '⇐';
|
||||
case '6': return '⇒';
|
||||
case '7': return '⇖';
|
||||
case '8': return '⇑';
|
||||
case '9': return '⇗';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_BOX:
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '└';
|
||||
case '2': return '┴';
|
||||
case '3': return '┘';
|
||||
case '4': return '├';
|
||||
case '5': return '┼';
|
||||
case '6': return '┤';
|
||||
case '7': return '┌';
|
||||
case '8': return '┬';
|
||||
case '9': return '┐';
|
||||
case '0': return '─';
|
||||
case '.': return '│';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '╚';
|
||||
case '2': return '╩';
|
||||
case '3': return '╝';
|
||||
case '4': return '╠';
|
||||
case '5': return '╬';
|
||||
case '6': return '╣';
|
||||
case '7': return '╔';
|
||||
case '8': return '╦';
|
||||
case '9': return '╗';
|
||||
case '0': return '═';
|
||||
case '.': return '║';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
default: return c; // Can't happen
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue handleFn(KeyValue k, int flags)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_FN) == 0)
|
||||
{
|
||||
switch (k.name)
|
||||
{
|
||||
// Remove some keys when Fn is *not* activated
|
||||
case "f11_placeholder":
|
||||
case "f12_placeholder": return removed_key;
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
String name;
|
||||
switch (k.name)
|
||||
{
|
||||
case "1": name = "f1"; break;
|
||||
case "2": name = "f2"; break;
|
||||
case "3": name = "f3"; break;
|
||||
case "4": name = "f4"; break;
|
||||
case "5": name = "f5"; break;
|
||||
case "6": name = "f6"; break;
|
||||
case "7": name = "f7"; break;
|
||||
case "8": name = "f8"; break;
|
||||
case "9": name = "f9"; break;
|
||||
case "0": name = "f10"; break;
|
||||
case "f11_placeholder": name = "f11"; break;
|
||||
case "f12_placeholder": name = "f12"; break;
|
||||
case "up": name = "page_up"; break;
|
||||
case "down": name = "page_down"; break;
|
||||
case "left": name = "home"; break;
|
||||
case "right": name = "end"; break;
|
||||
case "<": name = "«"; break;
|
||||
case ">": name = "»"; break;
|
||||
case "{": name = "‹"; break;
|
||||
case "}": name = "›"; break;
|
||||
case "[": name = "‘"; break;
|
||||
case "]": name = "’"; break;
|
||||
case "(": name = "“"; break;
|
||||
case ")": name = "”"; break;
|
||||
case "'": name = "‚"; break;
|
||||
case "\"": name = "„"; break;
|
||||
case "-": name = "–"; break;
|
||||
case "_": name = "—"; break;
|
||||
case "^": name = "¬"; break;
|
||||
case "%": name = "‰"; break;
|
||||
case "=": name = "≈"; break;
|
||||
case "u": name = "µ"; break;
|
||||
case "a": name = "æ"; break;
|
||||
case "o": name = "œ"; break;
|
||||
case "esc": name = "insert"; break;
|
||||
case "*": name = "°"; break;
|
||||
case ".": name = "…"; break;
|
||||
case ",": name = "·"; break;
|
||||
case "!": name = "¡"; break;
|
||||
case "?": name = "¿"; break;
|
||||
case "tab": name = "\\t"; break;
|
||||
case "space": name = "nbsp"; break;
|
||||
case "↖": name = "⇖"; break;
|
||||
case "↑": name = "⇑"; break;
|
||||
case "↗": name = "⇗"; break;
|
||||
case "←": name = "⇐"; break;
|
||||
case "→": name = "⇒"; break;
|
||||
case "↙": name = "⇙"; break;
|
||||
case "↓": name = "⇓"; break;
|
||||
case "↘": name = "⇘"; break;
|
||||
// Currency symbols
|
||||
case "e": name = "€"; break;
|
||||
case "l": name = "£"; break;
|
||||
case "r": name = "₹"; break;
|
||||
case "y": name = "¥"; break;
|
||||
case "c": name = "¢"; break;
|
||||
case "p": name = "₱"; break;
|
||||
case "€": case "£": return removed_key; // Avoid showing these twice
|
||||
default: return k;
|
||||
}
|
||||
return KeyValue.getKeyByName(name);
|
||||
}
|
||||
};
|
||||
|
||||
/* Lookup the cache entry for a key. Create it needed. */
|
||||
private static SparseArray<KeyValue> cacheEntry(KeyValue k)
|
||||
{
|
||||
SparseArray<KeyValue> ks = _cache.get(k.name);
|
||||
if (ks == null)
|
||||
{
|
||||
ks = new SparseArray<KeyValue>();
|
||||
_cache.put(k.name, ks);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
private static final Map_char map_char_arrows =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '↙';
|
||||
case '2': return '↓';
|
||||
case '3': return '↘';
|
||||
case '4': return '←';
|
||||
case '6': return '→';
|
||||
case '7': return '↖';
|
||||
case '8': return '↑';
|
||||
case '9': return '↗';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_box =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '└';
|
||||
case '2': return '┴';
|
||||
case '3': return '┘';
|
||||
case '4': return '├';
|
||||
case '5': return '┼';
|
||||
case '6': return '┤';
|
||||
case '7': return '┌';
|
||||
case '8': return '┬';
|
||||
case '9': return '┐';
|
||||
case '0': return '─';
|
||||
case '.': return '│';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_slash =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return 'ⱥ';
|
||||
case 'c': return 'ȼ';
|
||||
case 'e': return 'ɇ';
|
||||
case 'g': return 'ꞡ';
|
||||
case 'l': return 'ł';
|
||||
case 'n': return 'ꞥ';
|
||||
case 'o': return 'ø';
|
||||
case ' ': return '/';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@@ -4,101 +4,204 @@ import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
class KeyValue
|
||||
final class KeyValue
|
||||
{
|
||||
public static final int EVENT_NONE = -1;
|
||||
public static final int EVENT_CONFIG = -2;
|
||||
public static final int EVENT_SWITCH_TEXT = -3;
|
||||
public static final int EVENT_SWITCH_NUMERIC = -4;
|
||||
public static final int EVENT_SWITCH_EMOJI = -5;
|
||||
public static final int EVENT_SWITCH_BACK_EMOJI = -6;
|
||||
public static final int EVENT_CHANGE_METHOD = -7;
|
||||
public static final int EVENT_ACTION = -8;
|
||||
public static final int EVENT_SWITCH_PROGRAMMING = -9;
|
||||
public static final char CHAR_NONE = '\0';
|
||||
public static enum Event
|
||||
{
|
||||
CONFIG,
|
||||
SWITCH_TEXT,
|
||||
SWITCH_NUMERIC,
|
||||
SWITCH_EMOJI,
|
||||
SWITCH_BACK_EMOJI,
|
||||
CHANGE_METHOD,
|
||||
ACTION,
|
||||
SWITCH_PROGRAMMING
|
||||
}
|
||||
|
||||
// Behavior flags
|
||||
public static final int FLAG_LATCH = 1;
|
||||
public static final int FLAG_LOCK = (1 << 1);
|
||||
public static final int FLAG_NOREPEAT = (1 << 2);
|
||||
public static final int FLAG_NOCHAR = (1 << 3);
|
||||
public static final int FLAG_PRECISE_REPEAT = (1 << 4);
|
||||
// Must be evaluated in the reverse order of their values.
|
||||
public static enum Modifier
|
||||
{
|
||||
SHIFT,
|
||||
FN,
|
||||
CTRL,
|
||||
ALT,
|
||||
META,
|
||||
DOUBLE_AIGU,
|
||||
DOT_ABOVE,
|
||||
GRAVE,
|
||||
AIGU,
|
||||
CIRCONFLEXE,
|
||||
TILDE,
|
||||
CEDILLE,
|
||||
TREMA,
|
||||
SUPERSCRIPT,
|
||||
SUBSCRIPT,
|
||||
RING,
|
||||
CARON,
|
||||
MACRON,
|
||||
ORDINAL,
|
||||
ARROWS,
|
||||
BOX,
|
||||
OGONEK,
|
||||
SLASH,
|
||||
ARROW_RIGHT
|
||||
}
|
||||
|
||||
// Rendering flags
|
||||
public static final int FLAG_KEY_FONT = (1 << 5);
|
||||
public static final int FLAG_SMALLER_FONT = (1 << 6);
|
||||
// Behavior flags.
|
||||
public static final int FLAG_LATCH = (1 << 20);
|
||||
public static final int FLAG_LOCK = (1 << 21);
|
||||
// Special keys are not repeated and don't clear latched modifiers.
|
||||
public static final int FLAG_SPECIAL = (1 << 22);
|
||||
public static final int FLAG_PRECISE_REPEAT = (1 << 23);
|
||||
// Rendering flags.
|
||||
public static final int FLAG_KEY_FONT = (1 << 24);
|
||||
public static final int FLAG_SMALLER_FONT = (1 << 25);
|
||||
// Used by [Pointers].
|
||||
public static final int FLAG_LOCKED = (1 << 26);
|
||||
// Language specific keys that are removed from the keyboard by default.
|
||||
public static final int FLAG_LOCALIZED = (1 << 27);
|
||||
|
||||
// Internal flags
|
||||
public static final int FLAG_LOCKED = (1 << 8);
|
||||
// Kinds
|
||||
public static final int KIND_CHAR = (0 << 29);
|
||||
public static final int KIND_STRING = (1 << 29);
|
||||
public static final int KIND_KEYEVENT = (2 << 29);
|
||||
public static final int KIND_EVENT = (3 << 29);
|
||||
public static final int KIND_MODIFIER = (4 << 29);
|
||||
|
||||
// Modifier flags
|
||||
public static final int FLAG_CTRL = (1 << 10);
|
||||
public static final int FLAG_SHIFT = (1 << 11);
|
||||
public static final int FLAG_ALT = (1 << 12);
|
||||
public static final int FLAG_FN = (1 << 13);
|
||||
public static final int FLAG_META = (1 << 14);
|
||||
// Ranges for the different components
|
||||
private static final int FLAGS_BITS = (0b111111111 << 20); // 9 bits wide
|
||||
private static final int KIND_BITS = (0b111 << 29); // 3 bits wide
|
||||
private static final int VALUE_BITS = ~(FLAGS_BITS | KIND_BITS); // 20 bits wide
|
||||
static
|
||||
{
|
||||
check((FLAGS_BITS & KIND_BITS) == 0); // No overlap
|
||||
check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes
|
||||
}
|
||||
|
||||
// Accent flags
|
||||
public static final int FLAG_ACCENT1 = (1 << 16); // Grave
|
||||
public static final int FLAG_ACCENT2 = (1 << 17); // Aigu
|
||||
public static final int FLAG_ACCENT3 = (1 << 18); // Circonflexe
|
||||
public static final int FLAG_ACCENT4 = (1 << 19); // Tilde
|
||||
public static final int FLAG_ACCENT5 = (1 << 20); // Cédille
|
||||
public static final int FLAG_ACCENT6 = (1 << 21); // Tréma
|
||||
public static final int FLAG_ACCENT_SUPERSCRIPT = (1 << 22);
|
||||
public static final int FLAG_ACCENT_SUBSCRIPT = (1 << 23);
|
||||
public static final int FLAG_ACCENT_RING = (1 << 24);
|
||||
public static final int FLAG_ACCENT_CARON = (1 << 26);
|
||||
public static final int FLAG_ACCENT_MACRON = (1 << 27);
|
||||
public static final int FLAG_ACCENT_ORDINAL = (1 << 28);
|
||||
public static final int FLAG_ACCENT_ARROWS = (1 << 29);
|
||||
public static final int FLAG_ACCENT_BOX = (1 << 30);
|
||||
private final String _symbol;
|
||||
|
||||
public static final int FLAGS_ACCENTS = FLAG_ACCENT1 | FLAG_ACCENT2 |
|
||||
FLAG_ACCENT3 | FLAG_ACCENT4 | FLAG_ACCENT5 | FLAG_ACCENT6 |
|
||||
FLAG_ACCENT_CARON | FLAG_ACCENT_MACRON | FLAG_ACCENT_SUPERSCRIPT |
|
||||
FLAG_ACCENT_SUBSCRIPT | FLAG_ACCENT_ORDINAL | FLAG_ACCENT_ARROWS |
|
||||
FLAG_ACCENT_BOX | FLAG_ACCENT_RING;
|
||||
/** This field encodes three things:
|
||||
- The kind
|
||||
- The flags
|
||||
- The value for Char, Event and Modifier keys.
|
||||
*/
|
||||
private final int _code;
|
||||
|
||||
// Language specific keys that are removed from the keyboard by default
|
||||
public static final int FLAG_LOCALIZED = (1 << 25);
|
||||
public static enum Kind
|
||||
{
|
||||
Char, String, Keyevent, Event, Modifier
|
||||
}
|
||||
|
||||
public final String name;
|
||||
public final String symbol;
|
||||
public final char char_;
|
||||
public final int eventCode;
|
||||
public final int flags;
|
||||
public Kind getKind()
|
||||
{
|
||||
switch (_code & KIND_BITS)
|
||||
{
|
||||
case KIND_CHAR: return Kind.Char;
|
||||
case KIND_STRING: return Kind.String;
|
||||
case KIND_KEYEVENT: return Kind.Keyevent;
|
||||
case KIND_EVENT: return Kind.Event;
|
||||
case KIND_MODIFIER: return Kind.Modifier;
|
||||
default: throw new RuntimeException("Corrupted kind flags");
|
||||
}
|
||||
}
|
||||
|
||||
public int getFlags()
|
||||
{
|
||||
return (_code & FLAGS_BITS);
|
||||
}
|
||||
|
||||
public boolean hasFlags(int has)
|
||||
{
|
||||
return ((_code & has) == has);
|
||||
}
|
||||
|
||||
/** The string to render on the keyboard.
|
||||
When [getKind() == Kind.String], also the string to send. */
|
||||
public String getString()
|
||||
{
|
||||
return _symbol;
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Char]. */
|
||||
public char getChar()
|
||||
{
|
||||
return (char)(_code & VALUE_BITS);
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Keyevent]. */
|
||||
public int getKeyevent()
|
||||
{
|
||||
return (_code & VALUE_BITS);
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Event]. */
|
||||
public Event getEvent()
|
||||
{
|
||||
return Event.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Modifier]. */
|
||||
public Modifier getModifier()
|
||||
{
|
||||
return Modifier.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/* Update the char and the symbol. */
|
||||
public KeyValue withCharAndSymbol(char c)
|
||||
public KeyValue withChar(char c)
|
||||
{
|
||||
return withCharAndSymbol(String.valueOf(c), c);
|
||||
return new KeyValue(String.valueOf(c), KIND_CHAR, c, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withCharAndSymbol(String s, char c)
|
||||
public KeyValue withString(String s)
|
||||
{
|
||||
return new KeyValue(name, s, c, eventCode, flags);
|
||||
return new KeyValue(s, KIND_STRING, 0, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withNameAndSymbol(String n, String s)
|
||||
public KeyValue withSymbol(String s)
|
||||
{
|
||||
return new KeyValue(n, s, char_, eventCode, flags);
|
||||
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withKeyevent(int code)
|
||||
{
|
||||
return new KeyValue(_symbol, KIND_KEYEVENT, code, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withFlags(int f)
|
||||
{
|
||||
return new KeyValue(name, symbol, char_, eventCode, f);
|
||||
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
KeyValue snd = (KeyValue)obj;
|
||||
return _symbol.equals(snd._symbol) && _code == snd._code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return _symbol.hashCode() + _code;
|
||||
}
|
||||
|
||||
private static HashMap<String, KeyValue> keys = new HashMap<String, KeyValue>();
|
||||
|
||||
public KeyValue(String n, String s, char c, int e, int f)
|
||||
public KeyValue(String s, int kind, int value, int flags)
|
||||
{
|
||||
name = n;
|
||||
symbol = s;
|
||||
char_ = c;
|
||||
eventCode = e;
|
||||
flags = f;
|
||||
check((kind & ~KIND_BITS) == 0);
|
||||
check((flags & ~FLAGS_BITS) == 0);
|
||||
check((value & ~VALUE_BITS) == 0);
|
||||
_symbol = s;
|
||||
_code = kind | flags | value;
|
||||
}
|
||||
|
||||
private static String stripPrefix(String s, String prefix)
|
||||
{
|
||||
if (s.startsWith(prefix))
|
||||
return s.substring(prefix.length());
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static KeyValue getKeyByName(String name)
|
||||
@@ -108,170 +211,127 @@ class KeyValue
|
||||
KeyValue kv = KeyValue.keys.get(name);
|
||||
if (kv != null)
|
||||
return kv;
|
||||
char c = (name.length() == 1) ? name.charAt(0) : CHAR_NONE;
|
||||
return new KeyValue(name, name, c, EVENT_NONE, 0);
|
||||
String localized = stripPrefix(name, "loc ");
|
||||
if (localized != null)
|
||||
{
|
||||
kv = getKeyByName(localized);
|
||||
return kv.withFlags(kv.getFlags() | FLAG_LOCALIZED);
|
||||
}
|
||||
if (name.length() == 1)
|
||||
return new KeyValue(name, KIND_CHAR, name.charAt(0), 0);
|
||||
else
|
||||
return new KeyValue(name, KIND_STRING, 0, 0);
|
||||
}
|
||||
|
||||
private static void addKey(String name, String symbol, char c, int event, int flags)
|
||||
private static void addKey(String name, String symbol, int kind, int code, int flags)
|
||||
{
|
||||
keys.put(name, new KeyValue(name, symbol, c, event, flags));
|
||||
keys.put(name, new KeyValue(symbol, kind, code, flags));
|
||||
}
|
||||
|
||||
private static void addCharKey(char c, int event, int flags)
|
||||
private static void addCharKey(String name, String symbol, char c, int flags)
|
||||
{
|
||||
String name = String.valueOf(c);
|
||||
addKey(name, name, c, event, flags);
|
||||
addKey(name, symbol, KIND_CHAR, c, flags);
|
||||
}
|
||||
|
||||
private static void addCharKey(char c, int event)
|
||||
private static void addModifierKey(String name, String symbol, Modifier m, int extra_flags)
|
||||
{
|
||||
addCharKey(c, event, 0);
|
||||
addKey(name, symbol, KIND_MODIFIER, m.ordinal(),
|
||||
FLAG_LATCH | FLAG_SPECIAL | extra_flags);
|
||||
}
|
||||
|
||||
private static void addModifierKey(String name, String symbol, int extra_flags)
|
||||
private static void addEventKey(String name, String symbol, Event e, int flags)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, EVENT_NONE,
|
||||
FLAG_LATCH | FLAG_NOCHAR | FLAG_NOREPEAT | extra_flags);
|
||||
addKey(name, symbol, KIND_EVENT, e.ordinal(), flags | FLAG_SPECIAL);
|
||||
}
|
||||
|
||||
private static void addSpecialKey(String name, String symbol, int event)
|
||||
private static void addKeyeventKey(String name, String symbol, int code, int flags)
|
||||
{
|
||||
addSpecialKey(name, symbol, event, 0);
|
||||
addKey(name, symbol, KIND_KEYEVENT, code, flags);
|
||||
}
|
||||
|
||||
private static void addSpecialKey(String name, String symbol, int event, int flags)
|
||||
private static void addPlaceholderKey(String name)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, event, flags | FLAG_NOREPEAT);
|
||||
}
|
||||
|
||||
private static void addEventKey(String name, String symbol, int event)
|
||||
{
|
||||
addEventKey(name, symbol, event, 0);
|
||||
}
|
||||
|
||||
private static void addEventKey(String name, String symbol, int event, int flags)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, event, flags);
|
||||
addKey(name, "", KIND_STRING, 0, 0);
|
||||
}
|
||||
|
||||
static
|
||||
{
|
||||
addModifierKey("shift", "\n", // Can't write u000A because Java is stupid
|
||||
FLAG_SHIFT | FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("ctrl", "Ctrl", FLAG_CTRL | FLAG_SMALLER_FONT);
|
||||
addModifierKey("alt", "Alt", FLAG_ALT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("accent_aigu", "\u0050", FLAG_ACCENT2 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_caron", "\u0051", FLAG_ACCENT_CARON | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_cedille", "\u0052", FLAG_ACCENT5 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_circonflexe", "\u0053", FLAG_ACCENT3 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_grave", "\u0054", FLAG_ACCENT1 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_macron", "\u0055", FLAG_ACCENT_MACRON | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_ring", "\u0056", FLAG_ACCENT_RING | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_tilde", "\u0057", FLAG_ACCENT4 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_trema", "\u0058", FLAG_ACCENT6 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("superscript", "Sup", FLAG_ACCENT_SUPERSCRIPT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("subscript", "Sub", FLAG_ACCENT_SUBSCRIPT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("ordinal", "Ord", FLAG_ACCENT_ORDINAL | FLAG_SMALLER_FONT);
|
||||
addModifierKey("arrows", "Arr", FLAG_ACCENT_ARROWS | FLAG_SMALLER_FONT);
|
||||
addModifierKey("box", "Box", FLAG_ACCENT_BOX | FLAG_SMALLER_FONT);
|
||||
addModifierKey("fn", "Fn", FLAG_FN | FLAG_SMALLER_FONT);
|
||||
addModifierKey("meta", "Meta", FLAG_META | FLAG_SMALLER_FONT);
|
||||
Modifier.SHIFT, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("ctrl", "Ctrl", Modifier.CTRL, FLAG_SMALLER_FONT);
|
||||
addModifierKey("alt", "Alt", Modifier.ALT, FLAG_SMALLER_FONT);
|
||||
addModifierKey("accent_aigu", "\u0050", Modifier.AIGU, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_caron", "\u0051", Modifier.CARON, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_cedille", "\u0052", Modifier.CEDILLE, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_circonflexe", "\u0053", Modifier.CIRCONFLEXE, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_grave", "\u0054", Modifier.GRAVE, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_macron", "\u0055", Modifier.MACRON, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_ring", "\u0056", Modifier.RING, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_tilde", "\u0057", Modifier.TILDE, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_trema", "\u0058", Modifier.TREMA, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_ogonek", "\u0059", Modifier.OGONEK, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_dot_above", "\u005a", Modifier.DOT_ABOVE, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_double_aigu", "\u005b", Modifier.DOUBLE_AIGU, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_slash", "\134", // Can't write u005c
|
||||
Modifier.SLASH, FLAG_KEY_FONT);
|
||||
addModifierKey("accent_arrow_right", "\u005d", Modifier.ARROW_RIGHT, FLAG_KEY_FONT);
|
||||
addModifierKey("superscript", "Sup", Modifier.SUPERSCRIPT, FLAG_SMALLER_FONT);
|
||||
addModifierKey("subscript", "Sub", Modifier.SUBSCRIPT, FLAG_SMALLER_FONT);
|
||||
addModifierKey("ordinal", "Ord", Modifier.ORDINAL, FLAG_SMALLER_FONT);
|
||||
addModifierKey("arrows", "Arr", Modifier.ARROWS, FLAG_SMALLER_FONT);
|
||||
addModifierKey("box", "Box", Modifier.BOX, FLAG_SMALLER_FONT);
|
||||
addModifierKey("fn", "Fn", Modifier.FN, FLAG_SMALLER_FONT);
|
||||
addModifierKey("meta", "Meta", Modifier.META, FLAG_SMALLER_FONT);
|
||||
|
||||
addCharKey('a', KeyEvent.KEYCODE_A);
|
||||
addCharKey('b', KeyEvent.KEYCODE_B);
|
||||
addCharKey('c', KeyEvent.KEYCODE_C);
|
||||
addCharKey('d', KeyEvent.KEYCODE_D);
|
||||
addCharKey('e', KeyEvent.KEYCODE_E);
|
||||
addCharKey('f', KeyEvent.KEYCODE_F);
|
||||
addCharKey('g', KeyEvent.KEYCODE_G);
|
||||
addCharKey('h', KeyEvent.KEYCODE_H);
|
||||
addCharKey('i', KeyEvent.KEYCODE_I);
|
||||
addCharKey('j', KeyEvent.KEYCODE_J);
|
||||
addCharKey('k', KeyEvent.KEYCODE_K);
|
||||
addCharKey('l', KeyEvent.KEYCODE_L);
|
||||
addCharKey('m', KeyEvent.KEYCODE_M);
|
||||
addCharKey('n', KeyEvent.KEYCODE_N);
|
||||
addCharKey('o', KeyEvent.KEYCODE_O);
|
||||
addCharKey('p', KeyEvent.KEYCODE_P);
|
||||
addCharKey('q', KeyEvent.KEYCODE_Q);
|
||||
addCharKey('r', KeyEvent.KEYCODE_R);
|
||||
addCharKey('s', KeyEvent.KEYCODE_S);
|
||||
addCharKey('t', KeyEvent.KEYCODE_T);
|
||||
addCharKey('u', KeyEvent.KEYCODE_U);
|
||||
addCharKey('v', KeyEvent.KEYCODE_V);
|
||||
addCharKey('w', KeyEvent.KEYCODE_W);
|
||||
addCharKey('x', KeyEvent.KEYCODE_X);
|
||||
addCharKey('y', KeyEvent.KEYCODE_Y);
|
||||
addCharKey('z', KeyEvent.KEYCODE_Z);
|
||||
addCharKey('0', KeyEvent.KEYCODE_0);
|
||||
addCharKey('1', KeyEvent.KEYCODE_1);
|
||||
addCharKey('2', KeyEvent.KEYCODE_2);
|
||||
addCharKey('3', KeyEvent.KEYCODE_3);
|
||||
addCharKey('4', KeyEvent.KEYCODE_4);
|
||||
addCharKey('5', KeyEvent.KEYCODE_5);
|
||||
addCharKey('6', KeyEvent.KEYCODE_6);
|
||||
addCharKey('7', KeyEvent.KEYCODE_7);
|
||||
addCharKey('8', KeyEvent.KEYCODE_8);
|
||||
addCharKey('9', KeyEvent.KEYCODE_9);
|
||||
addCharKey('`', KeyEvent.KEYCODE_GRAVE);
|
||||
addCharKey('-', KeyEvent.KEYCODE_MINUS);
|
||||
addCharKey('=', KeyEvent.KEYCODE_EQUALS);
|
||||
addCharKey('[', KeyEvent.KEYCODE_LEFT_BRACKET);
|
||||
addCharKey(']', KeyEvent.KEYCODE_RIGHT_BRACKET);
|
||||
addCharKey('\\', KeyEvent.KEYCODE_BACKSLASH);
|
||||
addCharKey(';', KeyEvent.KEYCODE_SEMICOLON);
|
||||
addCharKey('\'', KeyEvent.KEYCODE_APOSTROPHE);
|
||||
addCharKey('/', KeyEvent.KEYCODE_SLASH);
|
||||
addCharKey('@', KeyEvent.KEYCODE_AT);
|
||||
addCharKey('+', KeyEvent.KEYCODE_PLUS);
|
||||
addCharKey(',', KeyEvent.KEYCODE_COMMA);
|
||||
addCharKey('.', KeyEvent.KEYCODE_PERIOD);
|
||||
addCharKey('*', KeyEvent.KEYCODE_STAR);
|
||||
addCharKey('#', KeyEvent.KEYCODE_POUND);
|
||||
addCharKey('(', KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN);
|
||||
addCharKey(')', KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN);
|
||||
addCharKey('ß', EVENT_NONE, FLAG_LOCALIZED);
|
||||
addCharKey('€', EVENT_NONE, FLAG_LOCALIZED);
|
||||
addCharKey('£', EVENT_NONE, FLAG_LOCALIZED);
|
||||
addEventKey("config", "\u0004", Event.CONFIG, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_text", "ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_numeric", "123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_emoji", "\u0001" , Event.SWITCH_EMOJI, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_back_emoji", "ABC", Event.SWITCH_BACK_EMOJI, 0);
|
||||
addEventKey("switch_programming", "Prog", Event.SWITCH_PROGRAMMING, FLAG_SMALLER_FONT);
|
||||
addEventKey("change_method", "\u0009", Event.CHANGE_METHOD, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addEventKey("action", "Action", Event.ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
|
||||
addSpecialKey("config", "\u0004", EVENT_CONFIG, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_text", "ABC", EVENT_SWITCH_TEXT, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_numeric", "123+", EVENT_SWITCH_NUMERIC, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_emoji", "\u0001" , EVENT_SWITCH_EMOJI, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_back_emoji", "ABC", EVENT_SWITCH_BACK_EMOJI);
|
||||
addSpecialKey("switch_programming", "Prog", EVENT_SWITCH_PROGRAMMING, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("change_method", "\u0009", EVENT_CHANGE_METHOD, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("action", "Action", EVENT_ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
addKeyeventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
|
||||
addKeyeventKey("enter", "\u000E", KeyEvent.KEYCODE_ENTER, FLAG_KEY_FONT);
|
||||
addKeyeventKey("up", "\u0005", KeyEvent.KEYCODE_DPAD_UP, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("right", "\u0006", KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("down", "\u0007", KeyEvent.KEYCODE_DPAD_DOWN, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("left", "\u0008", KeyEvent.KEYCODE_DPAD_LEFT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("page_up", "\u0002", KeyEvent.KEYCODE_PAGE_UP, FLAG_KEY_FONT);
|
||||
addKeyeventKey("page_down", "\u0003", KeyEvent.KEYCODE_PAGE_DOWN, FLAG_KEY_FONT);
|
||||
addKeyeventKey("home", "\u000B", KeyEvent.KEYCODE_MOVE_HOME, FLAG_KEY_FONT);
|
||||
addKeyeventKey("end", "\u000C", KeyEvent.KEYCODE_MOVE_END, FLAG_KEY_FONT);
|
||||
addKeyeventKey("backspace", "\u0011", KeyEvent.KEYCODE_DEL, FLAG_KEY_FONT);
|
||||
addKeyeventKey("delete", "\u0010", KeyEvent.KEYCODE_FORWARD_DEL, FLAG_KEY_FONT);
|
||||
addKeyeventKey("insert", "Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
|
||||
addKeyeventKey("f1", "F1", KeyEvent.KEYCODE_F1, 0);
|
||||
addKeyeventKey("f2", "F2", KeyEvent.KEYCODE_F2, 0);
|
||||
addKeyeventKey("f3", "F3", KeyEvent.KEYCODE_F3, 0);
|
||||
addKeyeventKey("f4", "F4", KeyEvent.KEYCODE_F4, 0);
|
||||
addKeyeventKey("f5", "F5", KeyEvent.KEYCODE_F5, 0);
|
||||
addKeyeventKey("f6", "F6", KeyEvent.KEYCODE_F6, 0);
|
||||
addKeyeventKey("f7", "F7", KeyEvent.KEYCODE_F7, 0);
|
||||
addKeyeventKey("f8", "F8", KeyEvent.KEYCODE_F8, 0);
|
||||
addKeyeventKey("f9", "F9", KeyEvent.KEYCODE_F9, 0);
|
||||
addKeyeventKey("f10", "F10", KeyEvent.KEYCODE_F10, 0);
|
||||
addKeyeventKey("f11", "F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
|
||||
addKeyeventKey("f12", "F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
|
||||
addKeyeventKey("tab", "\u000F", KeyEvent.KEYCODE_TAB, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
|
||||
addEventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
|
||||
addEventKey("enter", "\u000E", KeyEvent.KEYCODE_ENTER, FLAG_KEY_FONT);
|
||||
addEventKey("up", "\u0005", KeyEvent.KEYCODE_DPAD_UP, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("right", "\u0006", KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("down", "\u0007", KeyEvent.KEYCODE_DPAD_DOWN, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("left", "\u0008", KeyEvent.KEYCODE_DPAD_LEFT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("page_up", "\u0002", KeyEvent.KEYCODE_PAGE_UP, FLAG_KEY_FONT);
|
||||
addEventKey("page_down", "\u0003", KeyEvent.KEYCODE_PAGE_DOWN, FLAG_KEY_FONT);
|
||||
addEventKey("home", "\u000B", KeyEvent.KEYCODE_MOVE_HOME, FLAG_KEY_FONT);
|
||||
addEventKey("end", "\u000C", KeyEvent.KEYCODE_MOVE_END, FLAG_KEY_FONT);
|
||||
addEventKey("backspace", "\u0011", KeyEvent.KEYCODE_DEL, FLAG_KEY_FONT);
|
||||
addEventKey("delete", "\u0010", KeyEvent.KEYCODE_FORWARD_DEL, FLAG_KEY_FONT);
|
||||
addEventKey("insert", "Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
|
||||
addEventKey("f1", "F1", KeyEvent.KEYCODE_F1);
|
||||
addEventKey("f2", "F2", KeyEvent.KEYCODE_F2);
|
||||
addEventKey("f3", "F3", KeyEvent.KEYCODE_F3);
|
||||
addEventKey("f4", "F4", KeyEvent.KEYCODE_F4);
|
||||
addEventKey("f5", "F5", KeyEvent.KEYCODE_F5);
|
||||
addEventKey("f6", "F6", KeyEvent.KEYCODE_F6);
|
||||
addEventKey("f7", "F7", KeyEvent.KEYCODE_F7);
|
||||
addEventKey("f8", "F8", KeyEvent.KEYCODE_F8);
|
||||
addEventKey("f9", "F9", KeyEvent.KEYCODE_F9);
|
||||
addEventKey("f10", "F10", KeyEvent.KEYCODE_F10);
|
||||
addEventKey("f11", "F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
|
||||
addEventKey("f12", "F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
|
||||
addEventKey("tab", "\u000F", KeyEvent.KEYCODE_TAB, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addCharKey("\\t", "\\t", '\t', 0); // Send the tab character
|
||||
addCharKey("space", "\r", ' ', FLAG_KEY_FONT);
|
||||
addCharKey("nbsp", "\u237d", '\u00a0', FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
|
||||
addKey("\\t", "\\t", '\t', EVENT_NONE, 0); // Send the tab character
|
||||
addKey("space", "\r", ' ', KeyEvent.KEYCODE_SPACE, FLAG_KEY_FONT);
|
||||
addKey("nbsp", "\u237d", '\u00a0', EVENT_NONE, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addPlaceholderKey("removed");
|
||||
addPlaceholderKey("f11_placeholder");
|
||||
addPlaceholderKey("f12_placeholder");
|
||||
}
|
||||
|
||||
// Substitute for [assert], which has no effect on Android.
|
||||
private static void check(boolean b)
|
||||
{
|
||||
if (!b)
|
||||
throw new RuntimeException("Assertion failure");
|
||||
}
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.util.Log;
|
||||
import android.util.LogPrinter;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
@@ -62,7 +63,7 @@ public class Keyboard2 extends InputMethodService
|
||||
for (InputMethodInfo imi : imm.getEnabledInputMethodList())
|
||||
if (imi.getPackageName().equals(pkg))
|
||||
return imm.getEnabledInputMethodSubtypeList(imi, true);
|
||||
return null;
|
||||
return Arrays.asList();
|
||||
}
|
||||
|
||||
private void refreshSubtypeLayout(InputMethodSubtype subtype)
|
||||
@@ -79,23 +80,24 @@ public class Keyboard2 extends InputMethodService
|
||||
_currentTextLayout = l;
|
||||
}
|
||||
|
||||
private void extra_keys_of_subtype(Set<String> dst, InputMethodSubtype subtype)
|
||||
private void extra_keys_of_subtype(Set<KeyValue> dst, InputMethodSubtype subtype)
|
||||
{
|
||||
String extra_keys = subtype.getExtraValueOf("extra_keys");
|
||||
if (extra_keys == null)
|
||||
return;
|
||||
String[] ks = extra_keys.split("\\|");
|
||||
for (int i = 0; i < ks.length; i++)
|
||||
dst.add(ks[i]);
|
||||
dst.add(KeyValue.getKeyByName(ks[i]));
|
||||
}
|
||||
|
||||
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
|
||||
{
|
||||
HashSet<String> extra_keys = new HashSet<String>();
|
||||
HashSet<KeyValue> extra_keys = new HashSet<KeyValue>();
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
switch (_config.accents)
|
||||
{
|
||||
case 1:
|
||||
// '3' was "all accents", now unused
|
||||
case 1: case 3:
|
||||
extra_keys_of_subtype(extra_keys, subtype);
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
extra_keys_of_subtype(extra_keys, s);
|
||||
@@ -103,7 +105,6 @@ public class Keyboard2 extends InputMethodService
|
||||
case 2:
|
||||
extra_keys_of_subtype(extra_keys, subtype);
|
||||
break;
|
||||
case 3: extra_keys = null; break;
|
||||
case 4: break;
|
||||
default: throw new IllegalArgumentException();
|
||||
}
|
||||
@@ -118,7 +119,7 @@ public class Keyboard2 extends InputMethodService
|
||||
switch (_config.accents)
|
||||
{
|
||||
case 1: case 2: case 3: _config.extra_keys = null; break;
|
||||
case 4: _config.extra_keys = new HashSet<String>(); break;
|
||||
case 4: _config.extra_keys = new HashSet<KeyValue>(); break;
|
||||
}
|
||||
// Fallback for the layout option: Use qwerty in the "system settings" case
|
||||
_currentTextLayout = (_config.layout == -1) ? R.xml.qwerty : _config.layout;
|
||||
@@ -294,10 +295,15 @@ public class Keyboard2 extends InputMethodService
|
||||
if (_config.programming_layout == -1)
|
||||
return;
|
||||
KeyboardData layout =
|
||||
getLayout(_config.programming_layout).replaceKeys(key -> {
|
||||
if (key != null && key.eventCode == KeyValue.EVENT_SWITCH_PROGRAMMING)
|
||||
return KeyValue.getKeyByName("switch_text");
|
||||
return key;
|
||||
getLayout(_config.programming_layout).mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key)
|
||||
{
|
||||
if (key != null
|
||||
&& key.getKind() == KeyValue.Kind.Event
|
||||
&& key.getEvent() == KeyValue.Event.SWITCH_PROGRAMMING)
|
||||
return KeyValue.getKeyByName("switch_text");
|
||||
return key;
|
||||
}
|
||||
});
|
||||
_keyboardView.setKeyboard(layout);
|
||||
}
|
||||
|
@@ -1,15 +1,19 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.os.Vibrator;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Build.VERSION;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
|
||||
public class Keyboard2View extends View
|
||||
implements View.OnTouchListener, Pointers.IPointerEventHandler
|
||||
@@ -20,9 +24,8 @@ public class Keyboard2View extends View
|
||||
|
||||
private Pointers _pointers;
|
||||
|
||||
private int _flags = 0;
|
||||
private Pointers.Modifiers _mods;
|
||||
|
||||
private Vibrator _vibratorService;
|
||||
private long _lastVibration = 0;
|
||||
|
||||
private static int _currentWhat = 0;
|
||||
@@ -45,14 +48,38 @@ public class Keyboard2View extends View
|
||||
public Keyboard2View(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
_vibratorService = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
|
||||
_theme = new Theme(getContext(), attrs);
|
||||
_config = Config.globalConfig();
|
||||
_pointers = new Pointers(this, _config);
|
||||
refresh_navigation_bar(context);
|
||||
setOnTouchListener(this);
|
||||
reset();
|
||||
}
|
||||
|
||||
private Window getParentWindow(Context context)
|
||||
{
|
||||
if (context instanceof InputMethodService)
|
||||
return ((InputMethodService)context).getWindow().getWindow();
|
||||
if (context instanceof ContextWrapper)
|
||||
return getParentWindow(((ContextWrapper)context).getBaseContext());
|
||||
return null;
|
||||
}
|
||||
|
||||
public void refresh_navigation_bar(Context context)
|
||||
{
|
||||
if (VERSION.SDK_INT < 21)
|
||||
return;
|
||||
// The intermediate Window is a [Dialog].
|
||||
Window w = getParentWindow(context);
|
||||
int uiFlags = getSystemUiVisibility();
|
||||
if (_theme.isLightNavBar)
|
||||
uiFlags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
else
|
||||
uiFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
w.setNavigationBarColor(_theme.colorNavBar);
|
||||
setSystemUiVisibility(uiFlags);
|
||||
}
|
||||
|
||||
public void setKeyboard(KeyboardData kw)
|
||||
{
|
||||
_keyboard = _config.modify_layout(kw);
|
||||
@@ -61,39 +88,32 @@ public class Keyboard2View extends View
|
||||
|
||||
public void reset()
|
||||
{
|
||||
_flags = 0;
|
||||
_mods = Pointers.Modifiers.EMPTY;
|
||||
_pointers.clear();
|
||||
requestLayout();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public KeyValue onPointerDown(KeyValue k)
|
||||
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
invalidate();
|
||||
if (k != null)
|
||||
vibrate();
|
||||
return k;
|
||||
return KeyModifier.modify(k, mods);
|
||||
}
|
||||
|
||||
public KeyValue onPointerSwipe(KeyValue k)
|
||||
public void onPointerDown(boolean isSwipe)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
invalidate();
|
||||
if (k != null)
|
||||
vibrate();
|
||||
return k;
|
||||
vibrate();
|
||||
}
|
||||
|
||||
public void onPointerUp(KeyValue k)
|
||||
public void onPointerUp(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
_config.handler.handleKeyUp(k, _flags);
|
||||
_config.handler.handleKeyUp(k, mods);
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void onPointerHold(KeyValue k)
|
||||
public void onPointerHold(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
_config.handler.handleKeyUp(k, _flags);
|
||||
_config.handler.handleKeyUp(k, mods);
|
||||
}
|
||||
|
||||
public void onPointerFlagsChanged()
|
||||
@@ -103,7 +123,7 @@ public class Keyboard2View extends View
|
||||
|
||||
private void updateFlags()
|
||||
{
|
||||
_flags = _pointers.getFlags();
|
||||
_mods = _pointers.getModifiers();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -169,19 +189,14 @@ public class Keyboard2View extends View
|
||||
|
||||
private void vibrate()
|
||||
{
|
||||
if (!_config.vibrateEnabled)
|
||||
return ;
|
||||
long now = System.currentTimeMillis();
|
||||
if ((now - _lastVibration) > VIBRATE_MIN_INTERVAL)
|
||||
{
|
||||
_lastVibration = now;
|
||||
try
|
||||
if (VERSION.SDK_INT >= 5)
|
||||
{
|
||||
_vibratorService.vibrate(_config.vibrateDuration);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,7 +261,7 @@ public class Keyboard2View extends View
|
||||
|
||||
private int labelColor(KeyValue k, boolean isKeyDown, int defaultColor)
|
||||
{
|
||||
if (isKeyDown && (k.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
if (isKeyDown && k.hasFlags(KeyValue.FLAG_LATCH))
|
||||
{
|
||||
int flags = _pointers.getKeyFlags(k);
|
||||
if (flags != -1)
|
||||
@@ -262,23 +277,23 @@ public class Keyboard2View extends View
|
||||
|
||||
private void drawLabel(Canvas canvas, KeyValue k, float x, float y, float keyH, boolean isKeyDown)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
k = KeyModifier.modify(k, _mods);
|
||||
if (k == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(k, _config.labelTextSize, keyH);
|
||||
Paint p = _theme.labelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0));
|
||||
Paint p = _theme.labelPaint(k.hasFlags(KeyValue.FLAG_KEY_FONT));
|
||||
p.setColor(labelColor(k, isKeyDown, _theme.labelColor));
|
||||
p.setTextSize(textSize);
|
||||
canvas.drawText(k.symbol, x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
|
||||
canvas.drawText(k.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
|
||||
}
|
||||
|
||||
private void drawSubLabel(Canvas canvas, KeyValue k, float x, float y, float keyW, float keyH, Paint.Align a, Vertical v, boolean isKeyDown)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
k = KeyModifier.modify(k, _mods);
|
||||
if (k == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(k, _config.sublabelTextSize, keyH);
|
||||
Paint p = _theme.subLabelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0), a);
|
||||
Paint p = _theme.subLabelPaint(k.hasFlags(KeyValue.FLAG_KEY_FONT), a);
|
||||
p.setColor(labelColor(k, isKeyDown, _theme.subLabelColor));
|
||||
p.setTextSize(textSize);
|
||||
float subPadding = _config.keyPadding;
|
||||
@@ -290,12 +305,12 @@ public class Keyboard2View extends View
|
||||
x += keyW / 2f;
|
||||
else
|
||||
x += (a == Paint.Align.LEFT) ? subPadding : keyW - subPadding;
|
||||
canvas.drawText(k.symbol, x, y, p);
|
||||
canvas.drawText(k.getString(), x, y, p);
|
||||
}
|
||||
|
||||
private float scaleTextSize(KeyValue k, float rel_size, float keyH)
|
||||
{
|
||||
float smaller_font = ((k.flags & KeyValue.FLAG_SMALLER_FONT) == 0) ? 1.f : 0.75f;
|
||||
float smaller_font = k.hasFlags(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
|
||||
return keyH * rel_size * smaller_font * _config.characterSize;
|
||||
}
|
||||
}
|
||||
|
@@ -3,25 +3,58 @@ package juloo.keyboard2;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import java.util.ArrayList;
|
||||
import java.util.function.Function;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
class KeyboardData
|
||||
{
|
||||
public final List<Row> rows;
|
||||
/* Total width of the keyboard. Unit is abstract. */
|
||||
/** Total width of the keyboard. */
|
||||
public final float keysWidth;
|
||||
/* Total height of the keyboard. Unit is abstract. */
|
||||
/** Total height of the keyboard. */
|
||||
public final float keysHeight;
|
||||
/** Whether to add extra keys. */
|
||||
public final boolean extra_keys;
|
||||
|
||||
public KeyboardData replaceKeys(MapKeys f)
|
||||
public KeyboardData mapKeys(MapKey f)
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>();
|
||||
for (Row r : rows)
|
||||
rows_.add(r.replaceKeys(f));
|
||||
return new KeyboardData(rows_, keysWidth);
|
||||
rows_.add(r.mapKeys(f));
|
||||
return new KeyboardData(rows_, keysWidth, extra_keys);
|
||||
}
|
||||
|
||||
/** Add keys from the given iterator into the keyboard. Extra keys are added
|
||||
* on the empty key4 corner of the second row, from right to left. If there's
|
||||
* not enough room, key3 of the second row is tried then key2 and key1 of the
|
||||
* third row. */
|
||||
public KeyboardData addExtraKeys(Iterator<KeyValue> k)
|
||||
{
|
||||
if (!extra_keys)
|
||||
return this;
|
||||
ArrayList<Row> rows = new ArrayList<Row>(this.rows);
|
||||
addExtraKeys_to_row(rows, k, 1, 4);
|
||||
addExtraKeys_to_row(rows, k, 1, 3);
|
||||
addExtraKeys_to_row(rows, k, 2, 2);
|
||||
addExtraKeys_to_row(rows, k, 2, 1);
|
||||
return new KeyboardData(rows, keysWidth, extra_keys);
|
||||
}
|
||||
|
||||
private static void addExtraKeys_to_row(ArrayList<Row> rows, final Iterator<KeyValue> extra_keys, int row_i, final int d)
|
||||
{
|
||||
if (!extra_keys.hasNext())
|
||||
return;
|
||||
rows.set(row_i, rows.get(row_i).mapKeys(new MapKey(){
|
||||
public Key apply(Key k) {
|
||||
if (k.getKeyValue(d) == null && extra_keys.hasNext())
|
||||
return k.withKeyValue(d, extra_keys.next());
|
||||
else
|
||||
return k;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private static Row _bottomRow = null;
|
||||
@@ -52,13 +85,14 @@ class KeyboardData
|
||||
if (!expect_tag(parser, "keyboard"))
|
||||
throw new Exception("Empty layout file");
|
||||
boolean bottom_row = parser.getAttributeBooleanValue(null, "bottom_row", true);
|
||||
boolean extra_keys = parser.getAttributeBooleanValue(null, "extra_keys", true);
|
||||
ArrayList<Row> rows = new ArrayList<Row>();
|
||||
while (expect_tag(parser, "row"))
|
||||
rows.add(Row.parse(parser));
|
||||
float kw = compute_max_width(rows);
|
||||
if (bottom_row)
|
||||
rows.add(_bottomRow.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw);
|
||||
return new KeyboardData(rows, kw, extra_keys);
|
||||
}
|
||||
|
||||
private static float compute_max_width(List<Row> rows)
|
||||
@@ -76,7 +110,7 @@ class KeyboardData
|
||||
return Row.parse(parser);
|
||||
}
|
||||
|
||||
protected KeyboardData(List<Row> rows_, float kw)
|
||||
protected KeyboardData(List<Row> rows_, float kw, boolean xk)
|
||||
{
|
||||
float kh = 0.f;
|
||||
for (Row r : rows_)
|
||||
@@ -84,16 +118,17 @@ class KeyboardData
|
||||
rows = rows_;
|
||||
keysWidth = kw;
|
||||
keysHeight = kh;
|
||||
extra_keys = xk;
|
||||
}
|
||||
|
||||
public static class Row
|
||||
{
|
||||
public final List<Key> keys;
|
||||
/* Height of the row, without 'shift'. Unit is abstract. */
|
||||
/** Height of the row, without 'shift'. */
|
||||
public final float height;
|
||||
/* Extra empty space on the top. */
|
||||
/** Extra empty space on the top. */
|
||||
public final float shift;
|
||||
/* Total width of the row. Unit is abstract. */
|
||||
/** Total width of the row. */
|
||||
private final float keysWidth;
|
||||
|
||||
protected Row(List<Key> keys_, float h, float s)
|
||||
@@ -117,22 +152,21 @@ class KeyboardData
|
||||
return new Row(keys, h, shift);
|
||||
}
|
||||
|
||||
public Row replaceKeys(MapKeys f)
|
||||
public Row mapKeys(MapKey f)
|
||||
{
|
||||
ArrayList<Key> keys_ = new ArrayList<Key>();
|
||||
for (Key k : keys)
|
||||
keys_.add(k.replaceKeys(f));
|
||||
keys_.add(f.apply(k));
|
||||
return new Row(keys_, height, shift);
|
||||
}
|
||||
|
||||
/** Change the width of every keys so that the row is 's' units wide. */
|
||||
public Row updateWidth(float newWidth)
|
||||
{
|
||||
float s = newWidth / keysWidth;
|
||||
ArrayList<Key> keys_ = new ArrayList<Key>();
|
||||
for (Key k : keys)
|
||||
keys_.add(k.scaleWidth(s));
|
||||
return new Row(keys_, height, shift);
|
||||
final float s = newWidth / keysWidth;
|
||||
return mapKeys(new MapKey(){
|
||||
public Key apply(Key k) { return k.scaleWidth(s); }
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,11 +183,11 @@ class KeyboardData
|
||||
public final KeyValue key3;
|
||||
public final KeyValue key4;
|
||||
|
||||
/* Key width in relative unit. */
|
||||
/** Key width in relative unit. */
|
||||
public final float width;
|
||||
/* Extra empty space on the left of the key. */
|
||||
/** Extra empty space on the left of the key. */
|
||||
public final float shift;
|
||||
/* Put keys 1 to 4 on the edges instead of the corners. */
|
||||
/** Put keys 1 to 4 on the edges instead of the corners. */
|
||||
public final boolean edgekeys;
|
||||
|
||||
protected Key(KeyValue k0, KeyValue k1, KeyValue k2, KeyValue k3, KeyValue k4, float w, float s, boolean e)
|
||||
@@ -183,32 +217,92 @@ class KeyboardData
|
||||
return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys);
|
||||
}
|
||||
|
||||
public Key replaceKeys(MapKeys f)
|
||||
{
|
||||
return new Key(f.apply(key0), f.apply(key1), f.apply(key2),
|
||||
f.apply(key3), f.apply(key4), width, shift, edgekeys);
|
||||
}
|
||||
|
||||
/** New key with the width multiplied by 's'. */
|
||||
public Key scaleWidth(float s)
|
||||
{
|
||||
return new Key(key0, key1, key2, key3, key4, width * s, shift, edgekeys);
|
||||
}
|
||||
|
||||
public KeyValue getValue(int index)
|
||||
public KeyValue getKeyValue(int i)
|
||||
{
|
||||
switch (index)
|
||||
switch (i)
|
||||
{
|
||||
case 0: return key0;
|
||||
case 1: return key1;
|
||||
case 2: return key2;
|
||||
case 3: return key3;
|
||||
case 4: return key4;
|
||||
default: case 0: return key0;
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Key withKeyValue(int i, KeyValue kv)
|
||||
{
|
||||
KeyValue k0 = key0, k1 = key1, k2 = key2, k3 = key3, k4 = key4;
|
||||
switch (i)
|
||||
{
|
||||
case 0: k0 = kv; break;
|
||||
case 1: k1 = kv; break;
|
||||
case 2: k2 = kv; break;
|
||||
case 3: k3 = kv; break;
|
||||
case 4: k4 = kv; break;
|
||||
}
|
||||
return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys);
|
||||
}
|
||||
|
||||
/**
|
||||
* See Pointers.onTouchMove() for the represented direction.
|
||||
*/
|
||||
public KeyValue getAtDirection(int direction)
|
||||
{
|
||||
if (edgekeys)
|
||||
{
|
||||
// \ 1 /
|
||||
// \ /
|
||||
// 3 0 2
|
||||
// / \
|
||||
// / 4 \
|
||||
switch (direction)
|
||||
{
|
||||
case 2: case 3: return key1;
|
||||
case 4: case 5: return key2;
|
||||
case 6: case 7: return key4;
|
||||
case 8: case 1: return key3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 1 | 2
|
||||
// |
|
||||
// --0--
|
||||
// |
|
||||
// 3 | 4
|
||||
switch (direction)
|
||||
{
|
||||
case 1: case 2: return key1;
|
||||
case 3: case 4: return key2;
|
||||
case 5: case 6: return key4;
|
||||
case 7: case 8: return key3;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract interface MapKeys extends Function<KeyValue, KeyValue> { }
|
||||
// Not using Function<KeyValue, KeyValue> to keep compatibility with Android 6.
|
||||
public static abstract interface MapKey {
|
||||
public Key apply(Key k);
|
||||
}
|
||||
|
||||
public static abstract class MapKeyValues implements MapKey {
|
||||
abstract public KeyValue apply(KeyValue kv);
|
||||
|
||||
public Key apply(Key k)
|
||||
{
|
||||
return new Key(apply(k.key0), apply(k.key1), apply(k.key2),
|
||||
apply(k.key3), apply(k.key4), k.width, k.shift, k.edgekeys);
|
||||
}
|
||||
}
|
||||
|
||||
/** Parsing utils */
|
||||
|
||||
|
@@ -2,6 +2,7 @@ package juloo.keyboard2;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
@@ -22,12 +23,27 @@ public final class Pointers implements Handler.Callback
|
||||
_config = c;
|
||||
}
|
||||
|
||||
public int getFlags()
|
||||
/** Return the list of modifiers currently activated. */
|
||||
public Modifiers getModifiers()
|
||||
{
|
||||
int flags = 0;
|
||||
for (Pointer p : _ptrs)
|
||||
flags |= p.flags;
|
||||
return flags;
|
||||
return getModifiers(false);
|
||||
}
|
||||
|
||||
/** When [skip_latched] is true, don't take flags of latched keys into account. */
|
||||
private Modifiers getModifiers(boolean skip_latched)
|
||||
{
|
||||
int n_ptrs = _ptrs.size();
|
||||
KeyValue.Modifier[] mods = new KeyValue.Modifier[n_ptrs];
|
||||
int n_mods = 0;
|
||||
for (int i = 0; i < n_ptrs; i++)
|
||||
{
|
||||
Pointer p = _ptrs.get(i);
|
||||
if (p.value != null && p.value.getKind() == KeyValue.Kind.Modifier
|
||||
&& !(skip_latched && p.pointerId == -1
|
||||
&& (p.flags & KeyValue.FLAG_LOCKED) == 0))
|
||||
mods[n_mods++] = p.value.getModifier();
|
||||
}
|
||||
return Modifiers.ofArray(mods, n_mods);
|
||||
}
|
||||
|
||||
public void clear()
|
||||
@@ -52,10 +68,8 @@ public final class Pointers implements Handler.Callback
|
||||
*/
|
||||
public int getKeyFlags(KeyValue kv)
|
||||
{
|
||||
// Use physical equality because the key might have been modified.
|
||||
String name = kv.name;
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.value != null && p.value.name == name)
|
||||
if (p.value != null && p.value.equals(kv))
|
||||
return p.flags;
|
||||
return -1;
|
||||
}
|
||||
@@ -80,7 +94,7 @@ public final class Pointers implements Handler.Callback
|
||||
else // Otherwise, unlatch
|
||||
{
|
||||
removePtr(latched);
|
||||
_handler.onPointerUp(ptr.value);
|
||||
_handler.onPointerUp(ptr.value, ptr.modifiers);
|
||||
}
|
||||
}
|
||||
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
@@ -93,7 +107,7 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
clearLatched();
|
||||
removePtr(ptr);
|
||||
_handler.onPointerUp(ptr.value);
|
||||
_handler.onPointerUp(ptr.value, ptr.modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,6 +121,15 @@ public final class Pointers implements Handler.Callback
|
||||
_handler.onPointerFlagsChanged();
|
||||
}
|
||||
|
||||
/* Whether an other pointer is down on a non-special key. */
|
||||
private boolean isOtherPointerDown()
|
||||
{
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.pointerId != -1 && (p.flags & KeyValue.FLAG_SPECIAL) == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void onTouchDown(float x, float y, int pointerId, KeyboardData.Key key)
|
||||
{
|
||||
// Ignore new presses while a modulated key is active. On some devices,
|
||||
@@ -114,11 +137,40 @@ public final class Pointers implements Handler.Callback
|
||||
// keys.
|
||||
if (isModulatedKeyPressed())
|
||||
return;
|
||||
KeyValue value = _handler.onPointerDown(key.key0);
|
||||
Pointer ptr = new Pointer(pointerId, key, 0, value, x, y);
|
||||
// Don't take latched modifiers into account if an other key is pressed.
|
||||
// The other key already "own" the latched modifiers and will clear them.
|
||||
Modifiers mods = getModifiers(isOtherPointerDown());
|
||||
KeyValue value = _handler.modifyKey(key.key0, mods);
|
||||
Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
|
||||
_ptrs.add(ptr);
|
||||
if (value != null && (value.flags & KeyValue.FLAG_NOREPEAT) == 0)
|
||||
if (value != null && !value.hasFlags(KeyValue.FLAG_SPECIAL))
|
||||
startKeyRepeat(ptr);
|
||||
_handler.onPointerDown(false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the KeyValue at the given direction. In case of swipe (!= 0), get the
|
||||
* nearest KeyValue that is not key0.
|
||||
* Take care of applying [_handler.onPointerSwipe] to the selected key, this
|
||||
* must be done at the same time to be sure to treat removed keys correctly.
|
||||
* Return [null] if no key could be found in the given direction or if the
|
||||
* selected key didn't change.
|
||||
*/
|
||||
private KeyValue getKeyAtDirection(Pointer ptr, int direction)
|
||||
{
|
||||
if (direction == 0)
|
||||
return _handler.modifyKey(ptr.key.key0, ptr.modifiers);
|
||||
KeyValue k;
|
||||
for (int i = 0; i > -3; i = (~i>>31) - i)
|
||||
{
|
||||
int d = Math.floorMod(direction + i - 1, 8) + 1;
|
||||
// Don't make the difference between a key that doesn't exist and a key
|
||||
// that is removed by [_handler]. Triggers side effects.
|
||||
k = _handler.modifyKey(ptr.key.getAtDirection(d), ptr.modifiers);
|
||||
if (k != null)
|
||||
return k;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void onTouchMove(float x, float y, int pointerId)
|
||||
@@ -126,45 +178,52 @@ public final class Pointers implements Handler.Callback
|
||||
Pointer ptr = getPtr(pointerId);
|
||||
if (ptr == null)
|
||||
return;
|
||||
|
||||
// The position in a IME windows is clampled to view.
|
||||
// For a better up swipe behaviour, set the y position to a negative value when clamped.
|
||||
if (y == 0.0) y = -400;
|
||||
|
||||
float dx = x - ptr.downX;
|
||||
float dy = y - ptr.downY;
|
||||
float dist = Math.abs(dx) + Math.abs(dy);
|
||||
ptr.ptrDist = dist;
|
||||
int newIndex;
|
||||
|
||||
int direction;
|
||||
if (dist < _config.swipe_dist_px)
|
||||
{
|
||||
newIndex = 0;
|
||||
}
|
||||
else if (ptr.key.edgekeys)
|
||||
{
|
||||
if (Math.abs(dy) > Math.abs(dx)) // vertical swipe
|
||||
newIndex = (dy < 0) ? 1 : 4;
|
||||
else // horizontal swipe
|
||||
newIndex = (dx < 0) ? 3 : 2;
|
||||
direction = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dx < 0) // left side
|
||||
newIndex = (dy < 0) ? 1 : 3;
|
||||
else // right side
|
||||
newIndex = (dy < 0) ? 2 : 4;
|
||||
// One of the 8 directions:
|
||||
// |\2|3/|
|
||||
// |1\|/4|
|
||||
// |-----|
|
||||
// |8/|\5|
|
||||
// |/7|6\|
|
||||
direction = 1;
|
||||
if (dx > 0) direction += 2;
|
||||
if (dx > Math.abs(dy) || (dx < 0 && dx > -Math.abs(dy))) direction += 1;
|
||||
if (dy > 0) direction = 9 - direction;
|
||||
}
|
||||
if (newIndex != ptr.value_index)
|
||||
|
||||
if (direction != ptr.selected_direction)
|
||||
{
|
||||
ptr.value_index = newIndex;
|
||||
KeyValue newValue = _handler.onPointerSwipe(ptr.key.getValue(newIndex));
|
||||
if (newValue != null)
|
||||
ptr.selected_direction = direction;
|
||||
KeyValue newValue = getKeyAtDirection(ptr, direction);
|
||||
if (newValue != null && (ptr.value == null || !newValue.equals(ptr.value)))
|
||||
{
|
||||
int old_flags = ptr.flags;
|
||||
ptr.value = newValue;
|
||||
ptr.flags = newValue.flags;
|
||||
ptr.flags = newValue.getFlags();
|
||||
// Keep the keyrepeat going between modulated keys.
|
||||
if ((old_flags & newValue.flags & KeyValue.FLAG_PRECISE_REPEAT) == 0)
|
||||
if ((old_flags & ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) == 0)
|
||||
{
|
||||
stopKeyRepeat(ptr);
|
||||
if ((newValue.flags & KeyValue.FLAG_NOREPEAT) == 0)
|
||||
if ((ptr.flags & KeyValue.FLAG_SPECIAL) == 0)
|
||||
startKeyRepeat(ptr);
|
||||
}
|
||||
_handler.onPointerDown(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -187,9 +246,11 @@ public final class Pointers implements Handler.Callback
|
||||
private Pointer getLatched(Pointer target)
|
||||
{
|
||||
KeyboardData.Key k = target.key;
|
||||
int vi = target.value_index;
|
||||
KeyValue v = target.value;
|
||||
if (v == null)
|
||||
return null;
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.key == k && p.value_index == vi && p.pointerId == -1)
|
||||
if (p.key == k && p.pointerId == -1 && p.value != null && p.value.equals(v))
|
||||
return p;
|
||||
return null;
|
||||
}
|
||||
@@ -237,7 +298,7 @@ public final class Pointers implements Handler.Callback
|
||||
nextInterval = (long)((float)nextInterval / modulatePreciseRepeat(ptr));
|
||||
}
|
||||
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what, nextInterval);
|
||||
_handler.onPointerHold(ptr.value);
|
||||
_handler.onPointerHold(ptr.value, ptr.modifiers);
|
||||
return (true);
|
||||
}
|
||||
}
|
||||
@@ -278,56 +339,110 @@ public final class Pointers implements Handler.Callback
|
||||
return Math.min(8.f, Math.max(0.1f, accel));
|
||||
}
|
||||
|
||||
private final class Pointer
|
||||
private static final class Pointer
|
||||
{
|
||||
/** -1 when latched. */
|
||||
public int pointerId;
|
||||
/** The Key pressed by this Pointer */
|
||||
public final KeyboardData.Key key;
|
||||
public int value_index;
|
||||
/** Modified value. Not equal to [key.getValue(value_index)]. */
|
||||
/** Current direction. */
|
||||
public int selected_direction;
|
||||
/** Selected value with [modifiers] applied. */
|
||||
public KeyValue value;
|
||||
public float downX;
|
||||
public float downY;
|
||||
/** Distance of the pointer to the initial press. */
|
||||
public float ptrDist;
|
||||
/** Modifier flags at the time the key was pressed. */
|
||||
public Modifiers modifiers;
|
||||
/** Flags of the value. Latch, lock and locked flags are updated. */
|
||||
public int flags;
|
||||
/** Identify timeout messages. */
|
||||
public int timeoutWhat;
|
||||
/** ptrDist at the first repeat, -1 otherwise. */
|
||||
public float repeatingPtrDist;
|
||||
|
||||
public Pointer(int p, KeyboardData.Key k, int vi, KeyValue v, float x, float y)
|
||||
public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m)
|
||||
{
|
||||
pointerId = p;
|
||||
key = k;
|
||||
value_index = vi;
|
||||
selected_direction = 0;
|
||||
value = v;
|
||||
downX = x;
|
||||
downY = y;
|
||||
ptrDist = 0.f;
|
||||
flags = (v == null) ? 0 : v.flags;
|
||||
modifiers = m;
|
||||
flags = (v == null) ? 0 : v.getFlags();
|
||||
timeoutWhat = -1;
|
||||
repeatingPtrDist = -1.f;
|
||||
}
|
||||
}
|
||||
|
||||
/** Represent modifiers currently activated.
|
||||
Sorted in the order they should be evaluated. */
|
||||
public static final class Modifiers
|
||||
{
|
||||
private final KeyValue.Modifier[] _mods;
|
||||
private final int _size;
|
||||
|
||||
private Modifiers(KeyValue.Modifier[] m, int s)
|
||||
{
|
||||
_mods = m; _size = s;
|
||||
}
|
||||
|
||||
public KeyValue.Modifier get(int i) { return _mods[_size - 1 - i]; }
|
||||
public int size() { return _size; }
|
||||
|
||||
@Override
|
||||
public int hashCode() { return Arrays.hashCode(_mods); }
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
return Arrays.equals(_mods, ((Modifiers)obj)._mods);
|
||||
}
|
||||
|
||||
public static final Modifiers EMPTY =
|
||||
new Modifiers(new KeyValue.Modifier[0], 0);
|
||||
|
||||
protected static Modifiers ofArray(KeyValue.Modifier[] mods, int size)
|
||||
{
|
||||
// Sort and remove duplicates and nulls.
|
||||
if (size > 1)
|
||||
{
|
||||
Arrays.sort(mods, 0, size);
|
||||
int j = 0;
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
KeyValue.Modifier m = mods[i];
|
||||
if (m != null && (i + 1 >= size || m != mods[i + 1]))
|
||||
{
|
||||
mods[j] = m;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
size = j;
|
||||
}
|
||||
return new Modifiers(mods, size);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IPointerEventHandler
|
||||
{
|
||||
/** A key is pressed. Key can be modified or removed by returning [null].
|
||||
[getFlags()] is not uptodate. */
|
||||
public KeyValue onPointerDown(KeyValue k);
|
||||
/** Key can be modified or removed by returning [null]. */
|
||||
public KeyValue modifyKey(KeyValue k, Modifiers flags);
|
||||
|
||||
/** Pointer swipes into a corner. Key can be modified or removed. */
|
||||
public KeyValue onPointerSwipe(KeyValue k);
|
||||
/** A key is pressed. [getModifiers()] is uptodate. Might be called after a
|
||||
press or a swipe to a different value. */
|
||||
public void onPointerDown(boolean isSwipe);
|
||||
|
||||
/** Key is released. [k] is the key that was returned by [onPointerDown] or
|
||||
[onPointerSwipe]. */
|
||||
public void onPointerUp(KeyValue k);
|
||||
/** Key is released. [k] is the key that was returned by
|
||||
[modifySelectedKey] or [modifySelectedKey]. */
|
||||
public void onPointerUp(KeyValue k, Modifiers flags);
|
||||
|
||||
/** Flags changed because latched or locked keys or cancelled pointers. */
|
||||
public void onPointerFlagsChanged();
|
||||
|
||||
/** Key is repeating. */
|
||||
public void onPointerHold(KeyValue k);
|
||||
public void onPointerHold(KeyValue k, Modifiers flags);
|
||||
}
|
||||
}
|
||||
|
@@ -18,6 +18,9 @@ public class Theme
|
||||
|
||||
public final float keyBorderRadius;
|
||||
|
||||
public final int colorNavBar;
|
||||
public final boolean isLightNavBar;
|
||||
|
||||
private final Paint _keyLabelPaint;
|
||||
private final Paint _specialKeyLabelPaint;
|
||||
private final Paint _keySubLabelPaint;
|
||||
@@ -29,6 +32,8 @@ public class Theme
|
||||
keyBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKey, 0));
|
||||
keyDownBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKeyActivated, 0));
|
||||
// colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0);
|
||||
colorNavBar = s.getColor(R.styleable.keyboard_navigationBarColor, 0);
|
||||
isLightNavBar = s.getBoolean(R.styleable.keyboard_windowLightNavigationBar, false);
|
||||
labelColor = s.getColor(R.styleable.keyboard_colorLabel, 0);
|
||||
activatedColor = s.getColor(R.styleable.keyboard_colorLabelActivated, 0);
|
||||
lockedColor = s.getColor(R.styleable.keyboard_colorLabelLocked, 0);
|
||||
|
@@ -1,12 +1,14 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-19 0 1167 2048">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931 1003l-69 -70q-112 86 -250 99v99q176 -12 319 -128zM517 1032q-133 -10 -250 -101q0 1 -72 74l3 -2q143 116 319 128v-99zM198 860q-90 -103 -108 -246h-99q17 182 137 319l-6 6l4 -3l41 -43q31 -32 31 -33zM1138 614h-100q-17 141 -107 249l70 70
|
||||
q120 -137 137 -319zM1138 518q-14 -190 -130 -327l-69 70q86 111 99 257h100zM190 264q-76 -77 -75 -77l4 4q-115 137 -128 327h99q14 -147 100 -254zM939 121q-146 -124 -327 -136v100q140 12 258 106zM517 -15q-180 12 -327 136l69 70q118 -90 258 -106v-100zM687 0
|
||||
q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154q0 80 60.5 152t187.5 128z" />
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM623 -9l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57l-7 109q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.5 KiB |
13
srcs/special_font/59.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM987 0q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154q0 80 60.5 152t187.5 128z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
13
srcs/special_font/5A.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM648 1283h-218v201h218v-201z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
13
srcs/special_font/5B.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1184 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM856 1545h229l3 -6l-300 -260h-171l-2 5zM530 1545h211l2 -5l-240 -261h-157z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
10
srcs/special_font/5C.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 2068 2048">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 533.22l-69.3145 69.3145q-112.472 -86.3154 -249.792 -98.0859v-99.3945q176.555 11.7715 319.106 128.166v0zM516.679 504.45q-133.396 10.4619 -249.792 100.701q0 -1.30859 -71.9297 -74.5449l2.61523 2.61523q142.554 -116.396 319.106 -128.166v99.3945v0z
|
||||
M197.572 675.771q-90.2393 103.316 -107.24 245.867h-99.3936q17.001 -181.786 137.32 -319.104l-6.53906 -5.23145l3.92285 2.61523l41.8506 43.1582q30.0791 31.3867 30.0791 32.6953v0zM1137.89 921.639h-99.3936q-17.001 -141.242 -107.239 -248.483l69.3135 -70.6211
|
||||
q120.318 137.319 137.319 319.104v0zM1137.89 1018.42q-14.3857 189.633 -129.474 326.953l-69.3135 -70.6221q86.3154 -111.164 99.3936 -256.331h99.3936v0zM189.726 1272.13h0.000976562q-86.3154 -107.239 -99.3936 -253.716h-99.3945q13.0781 189.633 128.165 326.953
|
||||
l-3.92285 3.92383q-1.30762 0 74.5449 -77.1611zM939.103 1414.68q-146.476 124.242 -326.952 136.014v-99.3945q139.935 -11.7705 257.639 -105.934zM516.679 1550.7q-180.478 -11.7715 -326.953 -136.013l69.3145 -69.3145q117.703 90.2383 257.64 105.933v99.3945
|
||||
h-0.000976562zM198 1670l661 -1343h129zM990 330l-665 1341h-129z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
15
srcs/special_font/5D.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 2068 2048">
|
||||
<path fill="currentColor"
|
||||
d="M197.832 205.612h538.118q-61.2705 -48.0928 -87.4463 -102.807h38.8799q75.3359 77.7539 209.951 112.332v18.6455q-134.406 34.6621 -209.951 112.332h-38.8799q26.4688 -54.8193 87.4463 -103.197h-538.118v-37.3057zM931.256 533.22l-69.3145 69.3145
|
||||
q-112.472 -86.3154 -249.792 -98.0859v-99.3945q176.555 11.7715 319.106 128.166v0zM516.679 504.45q-133.396 10.4619 -249.792 100.701q0 -1.30859 -71.9297 -74.5449l2.61523 2.61523q142.554 -116.396 319.106 -128.166v99.3945v0zM197.572 675.771
|
||||
q-90.2393 103.316 -107.24 245.867h-99.3936q17.001 -181.786 137.32 -319.104l-6.53906 -5.23145l3.92285 2.61523l41.8506 43.1582q30.0791 31.3867 30.0791 32.6953v0zM1137.89 921.639h-99.3936q-17.001 -141.242 -107.239 -248.483l69.3135 -70.6211
|
||||
q120.318 137.319 137.319 319.104v0zM1137.89 1018.42q-14.3857 189.633 -129.474 326.953l-69.3135 -70.6221q86.3154 -111.164 99.3936 -256.331h99.3936v0zM189.726 1272.13h0.000976562q-86.3154 -107.239 -99.3936 -253.716h-99.3945q13.0781 189.633 128.165 326.953
|
||||
l-3.92285 3.92383q-1.30762 0 74.5449 -77.1611zM939.103 1414.68q-146.476 124.242 -326.952 136.014v-99.3945q139.935 -11.7705 257.639 -105.934zM516.679 1550.7q-180.478 -11.7715 -326.953 -136.013l69.3145 -69.3145q117.703 90.2383 257.64 105.933v99.3945
|
||||
h-0.000976562zM931.256 533.22l-69.3145 69.3145q-112.472 -86.3154 -249.792 -98.0859v-99.3945q176.555 11.7715 319.106 128.166v0zM516.679 504.45q-133.396 10.4619 -249.792 100.701q0 -1.30859 -71.9297 -74.5449l2.61523 2.61523q142.554 -116.396 319.106 -128.166
|
||||
v99.3945v0zM197.572 675.771q-90.2393 103.316 -107.24 245.867h-99.3936q17.001 -181.786 137.32 -319.104l-6.53906 -5.23145l3.92285 2.61523l41.8506 43.1582q30.0791 31.3867 30.0791 32.6953v0zM1137.89 921.639h-99.3936q-17.001 -141.242 -107.239 -248.483
|
||||
l69.3135 -70.6211q120.318 137.319 137.319 319.104v0zM1137.89 1018.42q-14.3857 189.633 -129.474 326.953l-69.3135 -70.6221q86.3154 -111.164 99.3936 -256.331h99.3936v0zM189.726 1272.13h0.000976562q-86.3154 -107.239 -99.3936 -253.716h-99.3945
|
||||
q13.0781 189.633 128.165 326.953l-3.92285 3.92383q-1.30762 0 74.5449 -77.1611zM939.103 1414.68q-146.476 124.242 -326.952 136.014v-99.3945q139.935 -11.7705 257.639 -105.934zM516.679 1550.7q-180.478 -11.7715 -326.953 -136.013l69.3145 -69.3145
|
||||
q117.703 90.2383 257.64 105.933v99.3945h-0.000976562z" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
@@ -3,7 +3,7 @@
|
||||
New()
|
||||
|
||||
# Imports glyphs, file name is position in the font.
|
||||
i = 2
|
||||
i = 1
|
||||
while (i < $argc)
|
||||
Select(Strtol($argv[i]:t:r, 16))
|
||||
Import($argv[i], 0, 0, 4.0, 0.1)
|
||||
@@ -11,4 +11,4 @@ while (i < $argc)
|
||||
i++
|
||||
endloop
|
||||
|
||||
Generate($1)
|
||||
Generate("result.ttf")
|
||||
|