Compare commits

..

35 Commits

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

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

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

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

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

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

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

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

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

fixed by overriding the jdk version for gradle to openjdk17

* layouts/latn_bone: fix layout

- fix alignment with tabs mess
- make like actual bone layout, instead of trying to fit it into a 10 key
  wide keyboard
  - fixes missing üäö
  - fix missing $
  - moves q and ß where they belong
  - remove all of the diacritic keys (they can be added through the
    settings as extra keys)
  - kept the number row extra keys integration into top row
  - kept the idea of compressing , and . into the swipe actions of the
    bottom row
  - kept the number keys as key4 in the layer4 positions (instead of
    moving them to a number row, which i also considered)
2024-09-19 23:57:26 +02:00
Spike
7454389f48
doc: Point to code for built-in bottom row and number row for use as starting points (#756) 2024-09-19 23:48:56 +02:00
Jules Aguillon
b61e9db21e compose: Deduplicate end states
Make compose sequences ending in the same character to share the ending
state.
This reduce the compiled compose key data size from 33kB to 27kB.
2024-09-14 15:13:04 +02:00
Jules Aguillon
24d6b96ad7 Add Serbian to method.xml 2024-09-14 14:28:56 +02:00
Jules Aguillon
13ad05c0b0 doc: Mention switch_clipboard 2024-09-14 14:26:34 +02:00
Jules Aguillon
a8e331c322 Define the Shift modifier using the compose mechanism 2024-09-10 22:50:39 +02:00
Jules Aguillon
b600332595 Define the Fn modifier using the compose mechanism
This removes 100Kb from the app.
2024-09-10 22:43:40 +02:00
Jules Aguillon
e734d1d0e2 compose: Allow c-style comments in json files
Useful to manager growing the collection of sequences.
2024-09-10 22:43:05 +02:00
Jules Aguillon
c57ae83bfa Compose sequences can end in internal key names
This adds the '\n' and '\t' sequences to showcase the new feature.
2024-09-10 22:16:49 +02:00
Jules Aguillon
c886a89b11 Update autocapitalisation on Enter 2024-09-10 21:53:52 +02:00
113 changed files with 3099 additions and 699 deletions

View File

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

Binary file not shown.

View File

@ -2,6 +2,10 @@ plugins {
id 'com.android.application' version '8.1.1'
}
dependencies {
testImplementation "junit:junit:4.13.2"
}
android {
namespace 'juloo.keyboard2'
compileSdk 34
@ -17,10 +21,14 @@ android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['srcs']
java.srcDirs = ['srcs/juloo.keyboard2']
res.srcDirs = ['res', 'build/generated-resources']
assets.srcDirs = ['assets']
}
test {
java.srcDirs = ['test']
}
}
signingConfigs {
@ -84,9 +92,6 @@ android {
}
}
dependencies {
}
tasks.register('buildKeyboardFont') {
println "\nBuilding assets/special_font.ttf"
mkdir "$buildDir"

View File

@ -36,6 +36,15 @@ Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >
# cyrl_yaverti
Layout includes some ASCII punctuation but not all, missing: ~
1 warnings
# cyrl_yqukeng_tj
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
2 warnings
# cyrl_yxukeng_os
Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
3 warnings
# deva_alt
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
Layout doesn't define some important keys, missing: loc esc, loc tab
@ -59,14 +68,12 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
# hebr_2_il
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
1 warnings
# kana_jis_jp
0 warnings
# latn_azerty_fr
0 warnings
# latn_bepo_fr
0 warnings
# latn_bone
Layout includes some ASCII punctuation but not all, missing: $
Layout doesn't define some important keys, missing: loc esc, loc tab
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
2 warnings
# latn_colemak

View File

@ -34,11 +34,19 @@ Here is a complete keyboard file with a single row containing an "a" key on the
</keyboard>
## Keyboard metadata
The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses the whole keyboard. The following properties may be used (The first two appear in the example above):
* `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”.
* `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`.
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`.
* `bottom_row`: Whether or not to show the common bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
* `bottom_row`: Whether or not to show the built-in bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
+ We recommend your layout use the built-in bottom row, because it is still evolving and your layout will incorporate innovations in future versions. However, to define your own, the current definition of the bottom row is in [bottom_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/bottom_row.xml). You can copypaste this XML into your custom layout as a starting point.
+ Likewise, the current definition of the top (number) row is in [number_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/number_row.xml).
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

View File

@ -71,6 +71,7 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_theme_e_monet">Monet (dle systému)</string>
<string name="pref_theme_e_monetlight">Monet (Světlý)</string>
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
<string name="pref_swipe_dist_e_short">Krátká</string>
<string name="pref_swipe_dist_e_default">Běžná</string>
@ -120,6 +121,7 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Správce schránky</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
<string name="clipboard_pin_heading">Připnout</string>
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>

View File

@ -71,6 +71,7 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Hell)</string>
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
<string name="pref_swipe_dist_e_short">Kurz</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -120,6 +121,7 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="key_descr_home">Pos1</string>
<string name="key_descr_end">Ende</string>
<string name="key_descr_clipboard">Clipboard-Manager</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
<string name="clipboard_pin_heading">Angeheftet</string>
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>

View File

@ -71,6 +71,7 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_theme_e_monet">Monet (de sistema)</string>
<string name="pref_theme_e_monetlight">Monet (claro)</string>
<string name="pref_theme_e_monetdark">Monet (oscuro)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
<string name="pref_swipe_dist_e_short">Corta</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -120,6 +121,7 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="key_descr_home">Inicio</string>
<string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Arreglar portapapeles</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Textos recién copiados</string>
<string name="clipboard_pin_heading">Pegado</string>
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>

View File

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

View File

@ -71,6 +71,7 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_theme_e_monet">Monet (Système)</string>
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Très courte</string>
<string name="pref_swipe_dist_e_short">Courte</string>
<string name="pref_swipe_dist_e_default">Normale</string>
@ -120,6 +121,7 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="key_descr_home">Début</string>
<string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Presse-papiers</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Texte récemment copié</string>
<string name="clipboard_pin_heading">Épinglé</string>
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>

View File

@ -71,6 +71,7 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
<string name="pref_swipe_dist_e_short">Breve</string>
<string name="pref_swipe_dist_e_default">Normale</string>
@ -120,6 +121,7 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->

View File

@ -72,6 +72,7 @@ PCキーボードでの半角入力を再現しています。日本語入力、
<string name="pref_theme_e_monet">Monet (システム)</string>
<string name="pref_theme_e_monetlight">Monet (ライト)</string>
<string name="pref_theme_e_monetdark">Monet (ダーク)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">短い</string>
<string name="pref_swipe_dist_e_short">やや短い</string>
<string name="pref_swipe_dist_e_default">普通</string>
@ -121,6 +122,7 @@ PCキーボードでの半角入力を再現しています。日本語入力、
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">クリップボード</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
<string name="clipboard_pin_heading">お気に入り</string>
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>

View File

@ -71,6 +71,7 @@
<string name="pref_theme_e_monet">모네트 (시스템)</string>
<string name="pref_theme_e_monetlight">모네트 (라이트)</string>
<string name="pref_theme_e_monetdark">모네트 (다크)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
<string name="pref_swipe_dist_e_short">짧음</string>
<string name="pref_swipe_dist_e_default">보통</string>
@ -120,6 +121,7 @@
<string name="key_descr_home"></string>
<string name="key_descr_end">종료</string>
<string name="key_descr_clipboard">클립보드 관리자</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
<string name="clipboard_pin_heading">고정</string>
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>

View File

@ -71,6 +71,7 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_theme_e_monet">Monē (sistēmas)</string>
<string name="pref_theme_e_monetlight">Monē (gaišs)</string>
<string name="pref_theme_e_monetdark">Monē (tumšs)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
<string name="pref_swipe_dist_e_short">Tuvs</string>
<string name="pref_swipe_dist_e_default">Vidējs</string>
@ -122,6 +123,7 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="key_descr_home">Sākums</string>
<string name="key_descr_end">Beigas</string>
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
<string name="clipboard_pin_heading">Piesprausts</string>
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>

View File

@ -71,6 +71,7 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_theme_e_monet">Monet (Systemowy)</string>
<string name="pref_theme_e_monetlight">Monet (Jasny)</string>
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
<string name="pref_swipe_dist_e_short">Mała</string>
<string name="pref_swipe_dist_e_default">Normalna</string>
@ -120,6 +121,7 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Zarządzanie schowkiem</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
<string name="clipboard_pin_heading">Przypięte</string>
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>

View File

@ -71,6 +71,7 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Bem curto</string>
<string name="pref_swipe_dist_e_short">Curto</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -120,6 +121,7 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->

View File

@ -71,6 +71,7 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
<string name="pref_swipe_dist_e_short">Apropiată</string>
<string name="pref_swipe_dist_e_default">Normală</string>
@ -120,6 +121,7 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->

View File

@ -71,6 +71,7 @@
<string name="pref_theme_e_monet">Моне (системная)</string>
<string name="pref_theme_e_monetlight">Моне (светлая)</string>
<string name="pref_theme_e_monetdark">Моне (темная)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Очень короткая</string>
<string name="pref_swipe_dist_e_short">Короткая</string>
<string name="pref_swipe_dist_e_default">Обычная</string>
@ -120,6 +121,7 @@
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обмена</string>
<string name="key_descr_combining">Сочетание диакритических знаков</string>
<string name="clipboard_history_heading">Недавно скопированный текст</string>
<string name="clipboard_pin_heading">Закреплено</string>
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>

View File

@ -71,6 +71,7 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
<string name="pref_theme_e_monetlight">Monet (Açık)</string>
<string name="pref_theme_e_monetdark">Monet (Koyu)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
<string name="pref_swipe_dist_e_short">Kısa</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -120,6 +121,7 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
<string name="key_descr_end">SON(Sağ yön tuşu)</string>
<string name="key_descr_clipboard">Pano</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="clipboard_history_heading">Son kopyalanan metin</string>
<string name="clipboard_pin_heading">Sabitlendi</string>
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>

View File

@ -71,6 +71,7 @@
<string name="pref_theme_e_monet">Моне (Системна)</string>
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
<string name="pref_swipe_dist_e_short">Коротка</string>
<string name="pref_swipe_dist_e_default">Звичайна</string>
@ -120,6 +121,7 @@
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
<string name="key_descr_combining">Комбінування діакритики</string>
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
<string name="clipboard_pin_heading">Закріплено</string>
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>

View File

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

View File

@ -71,6 +71,7 @@
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">非常短</string>
<string name="pref_swipe_dist_e_short"></string>
<string name="pref_swipe_dist_e_default">中(默认)</string>
@ -120,6 +121,7 @@
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->

View File

@ -31,6 +31,7 @@
<item>@string/pref_theme_e_monet</item>
<item>@string/pref_theme_e_monetlight</item>
<item>@string/pref_theme_e_monetdark</item>
<item>@string/pref_theme_e_rosepine</item>
</string-array>
<string-array name="pref_theme_values">
<item>system</item>
@ -45,6 +46,7 @@
<item>monet</item>
<item>monetlight</item>
<item>monetdark</item>
<item>rosepine</item>
</string-array>
<string-array name="pref_swipe_dist_entries">
<item>@string/pref_swipe_dist_e_very_short</item>

View File

@ -20,6 +20,8 @@
<item>cyrl_lynyertz_sr</item>
<item>cyrl_ueishsht</item>
<item>cyrl_yaverti</item>
<item>cyrl_yqukeng_tj</item>
<item>cyrl_yxukeng_os</item>
<item>deva_alt</item>
<item>deva_inscript</item>
<item>grek_qwerty</item>
@ -27,7 +29,6 @@
<item>hang_dubeolsik_kr</item>
<item>hebr_1_il</item>
<item>hebr_2_il</item>
<item>kana_jis_jp</item>
<item>latn_azerty_fr</item>
<item>latn_bepo_fr</item>
<item>latn_bone</item>
@ -79,6 +80,8 @@
<item>ЉЊЕРТЗ (Српски)</item>
<item>УЕИШЩ (Български, БДС)</item>
<item>ЯВЕРТЪ</item>
<item>Tajiki Persian (Тоҷикӣ)</item>
<item>Old Church Slavonic (Црькъвьнословѣньскъ ѩзыкъ)</item>
<item>देवनागरी (हिंदी)-2</item>
<item>देवनागरी (हिंदी)-1</item>
<item>QWERTY (Greek)</item>
@ -86,7 +89,6 @@
<item>두벌식 (Korean)</item>
<item>Hebrew 1</item>
<item>Hebrew 2</item>
<item>かな入力 (日本)</item>
<item>AZERTY (Français)</item>
<item>BEPO (Français)</item>
<item>Bone</item>
@ -138,6 +140,8 @@
<item>@xml/cyrl_lynyertz_sr</item>
<item>@xml/cyrl_ueishsht</item>
<item>@xml/cyrl_yaverti</item>
<item>@xml/cyrl_yqukeng_tj</item>
<item>@xml/cyrl_yxukeng_os</item>
<item>@xml/deva_alt</item>
<item>@xml/deva_inscript</item>
<item>@xml/grek_qwerty</item>
@ -145,7 +149,6 @@
<item>@xml/hang_dubeolsik_kr</item>
<item>@xml/hebr_1_il</item>
<item>@xml/hebr_2_il</item>
<item>@xml/kana_jis_jp</item>
<item>@xml/latn_azerty_fr</item>
<item>@xml/latn_bepo_fr</item>
<item>@xml/latn_bone</item>

View File

@ -71,6 +71,7 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Light)</string>
<string name="pref_theme_e_monetdark">Monet (Dark)</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_swipe_dist_e_very_short">Very short</string>
<string name="pref_swipe_dist_e_short">Short</string>
<string name="pref_swipe_dist_e_default">Normal</string>
@ -120,6 +121,7 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Clipboard manager</string>
<string name="key_descr_combining">Combining diacritic</string>
<string name="clipboard_history_heading">Recently copied text</string>
<string name="clipboard_pin_heading">Pinned</string>
<string name="clipboard_remove_confirm">Remove this clipboard?</string>

View File

@ -56,5 +56,12 @@
<item name="android:layout_marginHorizontal">16dp</item>
<item name="android:layout_gravity">center</item>
</style>
<style name="anim">
<item name="android:layout_width">100dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginVertical">16dp</item>
<item name="android:layout_gravity">center</item>
<item name="android:adjustViewBounds">true</item>
</style>
<style name="appTheme" parent="@android:style/Theme.DeviceDefault.DayNight"/>
</resources>

View File

@ -203,4 +203,23 @@
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">@android:color/system_accent1_900</item>
</style>
<style name="RosePine" parent="BaseTheme">
<item name="android:isLightTheme">false</item>
<item name="colorKeyboard">#191724</item>
<item name="colorKey">#26233a</item>
<item name="colorKeyActivated">#403d52</item>
<item name="keyBorderWidth">0dp</item>
<item name="keyBorderWidthActivated">1dp</item>
<item name="keyBorderColorLeft">#6e6a86</item>
<item name="keyBorderColorTop">#6e6a86</item>
<item name="keyBorderColorRight">#6e6a86</item>
<item name="keyBorderColorBottom">#6e6a86</item>
<item name="colorLabel">#e0def4</item>
<item name="colorLabelActivated">#c4a7e7</item>
<item name="colorLabelLocked">#31748f</item>
<item name="colorSubLabel">#6e6a86</item>
<item name="keyBorderRadius">1dp</item>
<item name="emoji_button_bg">#26233a</item>
<item name="emoji_color">#e0def4</item>
</style>
</resources>

View File

@ -10,6 +10,7 @@
<subtype android:label="%s" android:languageTag="da" android:imeSubtypeLocale="da_DK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_da,extra_keys=€|æ|å|ø"/>
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/>
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
<subtype android:label="%s" android:languageTag="en-AU" android:imeSubtypeLocale="en_AU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
@ -36,6 +37,7 @@
<subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/>
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/>
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/>
<subtype android:label="%s" android:languageTag="sr" android:imeSubtypeLocale="sr_" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_lynyertz_sr"/>
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á@d|accent_trema:ä:ö@o|accent_ring:å@s|€"/>
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -90,11 +90,21 @@ def parse_sequences_file_xkb(fname, xkb_char_extra_names):
seqs.append(s)
return seqs
# Basic support for comments in json files. Reads a file
def strip_cstyle_comments(inp):
def strip_line(line):
i = line.find("//")
return line[:i] + "\n" if i >= 0 else line
return "".join(map(strip_line, inp))
# Parse from a json file containing a dictionary sequence → result string.
def parse_sequences_file_json(fname):
with open(fname, "r") as inp:
seqs = json.load(inp)
return list(seqs.items())
try:
with open(fname, "r") as inp:
seqs = json.loads(strip_cstyle_comments(inp))
return list(seqs.items())
except Exception as e:
print("Failed parsing '%s': %s" % (fname, str(e)), file=sys.stderr)
# Format of the sequences file is determined by its extension
def parse_sequences_file(fname, xkb_char_extra_names={}):
@ -146,8 +156,10 @@ def add_sequences_to_trie(seqs, trie):
# Compile the trie into a state machine.
def make_automata(tries):
previous_leafs = {} # Deduplicate leafs
states = []
def add_tree(t):
this_node_index = len(states)
# Index and size of the new node
i = len(states)
s = len(t.keys())
@ -159,11 +171,14 @@ def make_automata(tries):
states.append((None, None))
# Add nested nodes and fill the current node
for c in sorted(t.keys()):
node_i = len(states)
add_node(t[c])
states[i] = (c, node_i)
states[i] = (c, add_node(t[c]))
i += 1
return this_node_index
def add_leaf(c):
if c in previous_leafs:
return previous_leafs[c]
this_node_index = len(states)
previous_leafs[c] = this_node_index
# There are two encoding for leafs: character final state for 15-bit
# characters and string final state for the rest.
if len(c) > 1 or ord(c[0]) > 32767: # String final state
@ -173,16 +188,14 @@ def make_automata(tries):
states.append((c, 0))
else: # Character final state
states.append((c, 1))
return this_node_index
def add_node(n):
if type(n) == str:
add_leaf(n)
return add_leaf(n)
else:
add_tree(n)
return add_tree(n)
states.append((1, 1)) # Add an empty state at the beginning.
entry_states = {}
for tname, tree_root in tries.items():
entry_states[tname] = len(states)
add_tree(tree_root)
entry_states = { n: add_tree(root) for n, root in tries.items() }
return entry_states, states
# Debug

View File

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

View File

@ -1,44 +0,0 @@
{
"う": { "゛": "ゔ" },
"か": { "゛": "が" },
"き": { "゛": "ぎ" },
"く": { "゛": "ぐ" },
"け": { "゛": "げ" },
"こ": { "゛": "ご" },
"さ": { "゛": "ざ" },
"し": { "゛": "じ" },
"す": { "゛": "ず" },
"せ": { "゛": "ぜ" },
"そ": { "゛": "ぞ" },
"た": { "゛": "だ" },
"ち": { "゛": "ぢ" },
"つ": { "゛": "づ" },
"て": { "゛": "で" },
"と": { "゛": "ど" },
"は": { "゛": "ば", "゜": "ぱ" },
"ひ": { "゛": "び", "゜": "ぴ" },
"ふ": { "゛": "ぶ", "゜": "ぷ" },
"へ": { "゛": "べ", "゜": "ぺ" },
"ほ": { "゛": "ぼ", "゜": "ぽ" },
"ウ": { "゛": "ヴ" },
"カ": { "゛": "ガ" },
"キ": { "゛": "ギ" },
"ク": { "゛": "グ" },
"ケ": { "゛": "ゲ" },
"コ": { "゛": "ゴ" },
"サ": { "゛": "ザ" },
"シ": { "゛": "ジ" },
"ス": { "゛": "ズ" },
"セ": { "゛": "ゼ" },
"ソ": { "゛": "ゾ" },
"タ": { "゛": "ダ" },
"チ": { "゛": "ヂ" },
"ツ": { "゛": "ヅ" },
"テ": { "゛": "デ" },
"ト": { "゛": "ド" },
"ハ": { "゛": "バ", "゜": "パ" },
"ヒ": { "゛": "ビ", "゜": "ピ" },
"フ": { "゛": "ブ", "゜": "プ" },
"ヘ": { "゛": "ベ", "゜": "ペ" },
"ホ": { "゛": "ボ", "゜": "ポ" }
}

View File

@ -3,5 +3,9 @@
"s": "Š",
"c": "Č",
"z": "Ž"
},
"\\": {
"n": "\\n",
"t": "\\t"
}
}

View File

@ -1,44 +0,0 @@
{
"う": "ゔ",
"か": "が",
"き": "ぎ",
"く": "ぐ",
"け": "げ",
"こ": "ご",
"さ": "ざ",
"し": "じ",
"す": "ず",
"せ": "ぜ",
"そ": "ぞ",
"た": "だ",
"ち": "ぢ",
"つ": "づ",
"て": "で",
"と": "ど",
"は": "ば",
"ひ": "び",
"ふ": "ぶ",
"へ": "べ",
"ほ": "ぼ",
"ウ": "ヴ",
"カ": "ガ",
"キ": "ギ",
"ク": "グ",
"ケ": "ゲ",
"コ": "ゴ",
"サ": "ザ",
"シ": "ジ",
"ス": "ズ",
"セ": "ゼ",
"ソ": "ゾ",
"タ": "ダ",
"チ": "ヂ",
"ツ": "ヅ",
"テ": "デ",
"ト": "ド",
"ハ": "バ",
"ヒ": "ビ",
"フ": "ブ",
"ヘ": "ベ",
"ホ": "ボ"
}

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

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

View File

@ -1,12 +0,0 @@
{
"は": "ぱ",
"ひ": "ぴ",
"ふ": "ぷ",
"へ": "ぺ",
"ほ": "ぽ",
"ハ": "パ",
"ヒ": "ピ",
"フ": "プ",
"ヘ": "ペ",
"ホ": "ポ"
}

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

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

View File

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

View File

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

View File

@ -175,7 +175,7 @@ public final class Config
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
characterSize =
_prefs.getFloat("character_size", 1.f)
_prefs.getFloat("character_size", 1.15f)
* characterSizeScale;
theme = getThemeId(res, _prefs.getString("theme", ""));
autocapitalisation = _prefs.getBoolean("autocapitalisation", true);
@ -210,8 +210,7 @@ public final class Config
KeyValue action_key()
{
// Update the name to avoid caching in KeyModifier
return (actionLabel == null) ? null :
KeyValue.getKeyByName("action").withSymbol(actionLabel);
return (actionLabel == null) ? null : KeyValue.makeActionKey(actionLabel);
}
/** Update the layout according to the configuration.
@ -302,10 +301,10 @@ public final class Config
});
if (show_numpad)
kw = kw.addNumPad(modify_numpad(num_pad, kw));
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
if (extra_keys.size() > 0)
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
return kw;
}
@ -422,6 +421,7 @@ public final class Config
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
return R.style.MonetLight;
return R.style.MonetDark;
case "rosepine": return R.style.RosePine;
default:
case "system":
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)

View File

@ -60,10 +60,10 @@ public final class KeyEventHandler
{
if (key == null)
return;
// Stop auto capitalisation when pressing some keys
switch (key.getKind())
{
case Modifier:
// Stop auto capitalisation when activating a system modifier
switch (key.getModifier())
{
case CTRL:
@ -73,6 +73,9 @@ public final class KeyEventHandler
break;
}
break;
case Compose_pending:
_autocap.stop();
break;
default: break;
}
}
@ -97,6 +100,7 @@ public final class KeyEventHandler
_recv.set_compose_pending(true);
break;
case Cursor_move: move_cursor(key.getCursorMove()); break;
case Complex: send_complex_key(key.getComplexKind(), key.getComplex()); break;
}
update_meta_state(old_mods);
}
@ -215,6 +219,16 @@ public final class KeyEventHandler
conn.performContextMenuAction(id);
}
void send_complex_key(KeyValue.Complex.Kind kind, KeyValue.Complex val)
{
switch (kind)
{
case StringWithSymbol:
send_text(((KeyValue.Complex.StringWithSymbol)val).str);
break;
}
}
@SuppressLint("InlinedApi")
void handle_editing_key(KeyValue.Editing ev)
{

View File

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

View File

@ -44,8 +44,6 @@ public final class KeyValue implements Comparable<KeyValue>
TREMA,
HORN,
HOOK_ABOVE,
DAKUTEN,
HANDAKUTEN,
SUPERSCRIPT,
SUBSCRIPT,
RING,
@ -93,7 +91,8 @@ public final class KeyValue implements Comparable<KeyValue>
{
Char, String, Keyevent, Event, Compose_pending, Hangul_initial,
Hangul_medial, Modifier, Editing, Placeholder,
Cursor_move // Value is encoded as a 16-bit integer
Cursor_move, // Value is encoded as a 16-bit integer.
Complex, // [_payload] is a [KeyValue.Complex], value is [Complex.Kind].
}
private static final int FLAGS_OFFSET = 19;
@ -131,7 +130,13 @@ public final class KeyValue implements Comparable<KeyValue>
check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0);
}
private final String _symbol;
/**
* The symbol that is rendered on the keyboard as a [String].
* Except for keys of kind:
* - [String], this is also the string to output.
* - [Complex], this is an instance of [KeyValue.Complex].
*/
private final Object _payload;
/** This field encodes three things: Kind, flags and value. */
private final int _code;
@ -155,7 +160,9 @@ public final class KeyValue implements Comparable<KeyValue>
When [getKind() == Kind.String], also the string to send. */
public String getString()
{
return _symbol;
if (getKind() == Kind.Complex)
return ((Complex)_payload).getSymbol();
return (String)_payload;
}
/** Defined only when [getKind() == Kind.Char]. */
@ -213,25 +220,32 @@ public final class KeyValue implements Comparable<KeyValue>
return (short)(_code & VALUE_BITS);
}
/** Defined only when [getKind() == Kind.Complex]. */
public Complex getComplex()
{
return (Complex)_payload;
}
/** Defined only when [getKind() == Kind.Complex]. */
public Complex.Kind getComplexKind()
{
return Complex.Kind.values()[(_code & VALUE_BITS)];
}
/* Update the char and the symbol. */
public KeyValue withChar(char c)
{
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
}
public KeyValue withSymbol(String s)
{
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
}
public KeyValue withKeyevent(int code)
{
return new KeyValue(_symbol, Kind.Keyevent, code, getFlags());
return new KeyValue(getString(), Kind.Keyevent, code, getFlags());
}
public KeyValue withFlags(int f)
{
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), f);
return new KeyValue(_payload, (_code & KIND_BITS), (_code & VALUE_BITS), f);
}
@Override
@ -249,7 +263,9 @@ public final class KeyValue implements Comparable<KeyValue>
d = _code - snd._code;
if (d != 0)
return d;
return _symbol.compareTo(snd._symbol);
if (getKind() == Kind.Complex)
return ((Complex)_payload).compareTo((Complex)snd._payload);
return ((String)_payload).compareTo((String)snd._payload);
}
/** Type-safe alternative to [equals]. */
@ -257,24 +273,36 @@ public final class KeyValue implements Comparable<KeyValue>
{
if (snd == null)
return false;
return _symbol.equals(snd._symbol) && _code == snd._code;
return _code == snd._code && _payload.equals(snd._payload);
}
@Override
public int hashCode()
{
return _symbol.hashCode() + _code;
return _payload.hashCode() + _code;
}
public KeyValue(String s, int kind, int value, int flags)
public String toString()
{
_symbol = s;
int value = _code & VALUE_BITS;
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
}
private KeyValue(Object p, int kind, int value, int flags)
{
_payload = p;
_code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS);
}
public KeyValue(String s, Kind k, int v, int f)
public KeyValue(Complex p, Complex.Kind value, int flags)
{
this(s, (k.ordinal() << KIND_OFFSET), v, f);
this((Object)p, (Kind.Complex.ordinal() << KIND_OFFSET), value.ordinal(),
flags);
}
public KeyValue(String p, Kind k, int v, int f)
{
this(p, (k.ordinal() << KIND_OFFSET), v, f);
}
private static KeyValue charKey(String symbol, char c, int flags)
@ -300,15 +328,10 @@ public final class KeyValue implements Comparable<KeyValue>
return modifierKey(String.valueOf((char)symbol), m, flags | FLAG_KEY_FONT);
}
private static KeyValue diacritic(String symbol, Modifier m, int flags)
{
return new KeyValue(symbol, Kind.Modifier, m.ordinal(),
FLAG_LATCH | FLAG_SPECIAL | flags);
}
private static KeyValue diacritic(int symbol, Modifier m)
{
return diacritic(String.valueOf((char)symbol), m, FLAG_KEY_FONT);
return new KeyValue(String.valueOf((char)symbol), Kind.Modifier, m.ordinal(),
FLAG_LATCH | FLAG_SPECIAL | FLAG_KEY_FONT);
}
private static KeyValue eventKey(String symbol, Event e, int flags)
@ -370,7 +393,19 @@ public final class KeyValue implements Comparable<KeyValue>
public static KeyValue makeCharKey(char c)
{
return new KeyValue(String.valueOf(c), Kind.Char, c, 0);
return makeCharKey(c, null, 0);
}
public static KeyValue makeCharKey(char c, String symbol, int flags)
{
if (symbol == null)
symbol = String.valueOf(c);
return new KeyValue(symbol, Kind.Char, c, flags);
}
public static KeyValue makeCharKey(int symbol, char c, int flags)
{
return makeCharKey(c, String.valueOf((char)symbol), flags | FLAG_KEY_FONT);
}
public static KeyValue makeComposePending(String symbol, int state, int flags)
@ -404,6 +439,11 @@ public final class KeyValue implements Comparable<KeyValue>
return KeyValue.makeCharKey((char)precomposed);
}
public static KeyValue makeActionKey(String symbol)
{
return eventKey(symbol, Event.ACTION, FLAG_SMALLER_FONT);
}
/** Make a key that types a string. A char key is returned for a string of
length 1. */
public static KeyValue makeStringKey(String str, int flags)
@ -414,12 +454,36 @@ public final class KeyValue implements Comparable<KeyValue>
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
}
public static KeyValue makeStringKeyWithSymbol(String str, String symbol, int flags)
{
return new KeyValue(new Complex.StringWithSymbol(str, symbol),
Complex.Kind.StringWithSymbol, flags);
}
/** Make a modifier key for passing to [KeyModifier]. */
public static KeyValue makeInternalModifier(Modifier mod)
{
return new KeyValue("", Kind.Modifier, mod.ordinal(), 0);
}
public static KeyValue parseKeyDefinition(String str)
{
if (str.length() < 2 || str.charAt(0) != ':')
return makeStringKey(str);
try
{
return KeyValueParser.parse(str);
}
catch (KeyValueParser.ParseError _e)
{
return makeStringKey(str);
}
}
/**
* Return a key by its name. If the given name doesn't correspond to a key
* defined in this function, it is passed to [parseStringKey] as a fallback.
*/
public static KeyValue getKeyByName(String name)
{
switch (name)
@ -455,8 +519,6 @@ public final class KeyValue implements Comparable<KeyValue>
case "accent_dot_below": return diacritic(0xE060, Modifier.DOT_BELOW);
case "accent_horn": return diacritic(0xE061, Modifier.HORN);
case "accent_hook_above": return diacritic(0xE062, Modifier.HOOK_ABOVE);
case "dakuten": return diacritic("", Modifier.DAKUTEN, 0);
case "handakuten": return diacritic("", Modifier.HANDAKUTEN, 0);
case "superscript": return modifierKey("Sup", Modifier.SUPERSCRIPT, 0);
case "subscript": return modifierKey("Sub", Modifier.SUBSCRIPT, 0);
case "ordinal": return modifierKey("Ord", Modifier.ORDINAL, 0);
@ -465,6 +527,38 @@ public final class KeyValue implements Comparable<KeyValue>
case "fn": return modifierKey("Fn", Modifier.FN, 0);
case "meta": return modifierKey("Meta", Modifier.META, 0);
/* Combining diacritics */
/* Glyphs is the corresponding dead-key + 0x0100. */
case "combining_dot_above": return makeCharKey(0xE15A, '\u0307', 0);
case "combining_double_aigu": return makeCharKey(0xE15B, '\u030B', 0);
case "combining_slash": return makeCharKey(0xE15C, '\u0337', 0);
case "combining_arrow_right": return makeCharKey(0xE15D, '\u20D7', 0);
case "combining_breve": return makeCharKey(0xE15E, '\u0306', 0);
case "combining_bar": return makeCharKey(0xE15F, '\u0335', 0);
case "combining_aigu": return makeCharKey(0xE150, '\u0301', 0);
case "combining_caron": return makeCharKey(0xE151, '\u030C', 0);
case "combining_cedille": return makeCharKey(0xE152, '\u0327', 0);
case "combining_circonflexe": return makeCharKey(0xE153, '\u0302', 0);
case "combining_grave": return makeCharKey(0xE154, '\u0300', 0);
case "combining_macron": return makeCharKey(0xE155, '\u0304', 0);
case "combining_ring": return makeCharKey(0xE156, '\u030A', 0);
case "combining_tilde": return makeCharKey(0xE157, '\u0303', 0);
case "combining_trema": return makeCharKey(0xE158, '\u0308', 0);
case "combining_ogonek": return makeCharKey(0xE159, '\u0328', 0);
case "combining_dot_below": return makeCharKey(0xE160, '\u0323', 0);
case "combining_horn": return makeCharKey(0xE161, '\u031B', 0);
case "combining_hook_above": return makeCharKey(0xE162, '\u0309', 0);
/* Combining diacritics that do not have a corresponding dead keys start
at 0xE200. */
case "combining_vertical_tilde": return makeCharKey(0xE200, '\u033E', 0);
case "combining_inverted_breve": return makeCharKey(0xE201, '\u0311', 0);
case "combining_pokrytie": return makeCharKey(0xE202, '\u0487', 0);
case "combining_slavonic_psili": return makeCharKey(0xE203, '\u0486', 0);
case "combining_slavonic_dasia": return makeCharKey(0xE204, '\u0485', 0);
case "combining_payerok": return makeCharKey(0xE205, '\uA67D', 0);
case "combining_titlo": return makeCharKey(0xE206, '\u0483', 0);
case "combining_vzmet": return makeCharKey(0xE207, '\uA66F', 0);
/* Special event keys */
case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT);
case "switch_text": return eventKey("ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT);
@ -492,8 +586,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, 0);
case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0);
case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, 0);
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, 0);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT);
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, FLAG_SMALLER_FONT);
case "backspace": return keyeventKey(0xE011, KeyEvent.KEYCODE_DEL, 0);
case "delete": return keyeventKey(0xE010, KeyEvent.KEYCODE_FORWARD_DEL, 0);
case "insert": return keyeventKey("Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
@ -511,6 +605,7 @@ public final class KeyValue implements Comparable<KeyValue>
case "f12": return keyeventKey("F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
case "tab": return keyeventKey(0xE00F, KeyEvent.KEYCODE_TAB, FLAG_SMALLER_FONT);
case "menu": return keyeventKey("Menu", KeyEvent.KEYCODE_MENU, FLAG_SMALLER_FONT);
case "scroll_lock": return keyeventKey("Scrl", KeyEvent.KEYCODE_SCROLL_LOCK, FLAG_SMALLER_FONT);
/* Spaces */
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
@ -608,8 +703,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "": return makeHangulInitial("", 17);
case "": return makeHangulInitial("", 18);
/* Fallback to a string key that types its name */
default: return makeStringKey(name);
/* The key is not one of the special ones. */
default: return parseKeyDefinition(name);
}
}
@ -619,4 +714,49 @@ public final class KeyValue implements Comparable<KeyValue>
if (!b)
throw new RuntimeException("Assertion failure");
}
public static abstract class Complex
{
public abstract String getSymbol();
/** [compareTo] can assume that [snd] is an instance of the same class. */
public abstract int compareTo(Complex snd);
public boolean equals(Object snd)
{
if (snd instanceof Complex)
return compareTo((Complex)snd) == 0;
return false;
}
/** [hashCode] will be called on this class. */
/** The kind is stored in the [value] field of the key. */
public static enum Kind
{
StringWithSymbol,
}
public static final class StringWithSymbol extends Complex
{
public final String str;
private final String _symbol;
public StringWithSymbol(String _str, String _sym)
{
str = _str;
_symbol = _sym;
}
public String getSymbol() { return _symbol; }
public int compareTo(Complex _snd)
{
StringWithSymbol snd = (StringWithSymbol)_snd;
int d = str.compareTo(snd.str);
if (d != 0) return d;
return _symbol.compareTo(snd._symbol);
}
}
};
}

View File

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

View File

@ -193,21 +193,22 @@ public final class KeyboardData
/** Load a layout from a resource ID. Returns [null] on error. */
public static KeyboardData load(Resources res, int id)
{
KeyboardData l = _layoutCache.get(id);
if (l == null)
if (_layoutCache.containsKey(id))
return _layoutCache.get(id);
KeyboardData l = null;
XmlResourceParser parser = null;
try
{
try
{
XmlResourceParser parser = res.getXml(id);
l = parse_keyboard(parser);
parser.close();
_layoutCache.put(id, l);
}
catch (Exception e)
{
e.printStackTrace();
}
parser = res.getXml(id);
l = parse_keyboard(parser);
}
catch (Exception e)
{
Logs.exn("Failed to load layout id " + id, e);
}
if (parser != null)
parser.close();
_layoutCache.put(id, l);
return l;
}

View File

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

View File

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

View File

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

View File

@ -72,6 +72,34 @@ public class ExtraKeysPreference extends PreferenceCategory
"f11_placeholder",
"f12_placeholder",
"menu",
"scroll_lock",
"combining_dot_above",
"combining_double_aigu",
"combining_slash",
"combining_arrow_right",
"combining_breve",
"combining_bar",
"combining_aigu",
"combining_caron",
"combining_cedille",
"combining_circonflexe",
"combining_grave",
"combining_macron",
"combining_ring",
"combining_tilde",
"combining_trema",
"combining_ogonek",
"combining_dot_below",
"combining_horn",
"combining_hook_above",
"combining_vertical_tilde",
"combining_inverted_breve",
"combining_pokrytie",
"combining_slavonic_psili",
"combining_slavonic_dasia",
"combining_payerok",
"combining_titlo",
"combining_vzmet"
};
/** Whether an extra key is enabled by default. */
@ -121,6 +149,36 @@ public class ExtraKeysPreference extends PreferenceCategory
case "ª": id = R.string.key_descr_ª; break;
case "º": id = R.string.key_descr_º; break;
case "switch_clipboard": id = R.string.key_descr_clipboard; break;
case "combining_dot_above":
case "combining_double_aigu":
case "combining_slash":
case "combining_arrow_right":
case "combining_breve":
case "combining_bar":
case "combining_aigu":
case "combining_caron":
case "combining_cedille":
case "combining_circonflexe":
case "combining_grave":
case "combining_macron":
case "combining_ring":
case "combining_tilde":
case "combining_trema":
case "combining_ogonek":
case "combining_dot_below":
case "combining_horn":
case "combining_hook_above":
case "combining_vertical_tilde":
case "combining_inverted_breve":
case "combining_pokrytie":
case "combining_slavonic_psili":
case "combining_slavonic_dasia":
case "combining_payerok":
case "combining_titlo":
case "combining_vzmet":
id = R.string.key_descr_combining;
break;
}
if (id == 0)
return null;

View File

@ -11,7 +11,7 @@
<key key0="ه" key2="۸" key3="*"/>
<key key0="خ" key2="۹" key3="(" key4=")"/>
<key key0="ح" key2="۰"/>
<key key0="ج" key2="چ"/>
<key key0="ج"/>
</row>
<row>
<key key0="ش" key2="loc tab"/>
@ -29,13 +29,13 @@
<row>
<key shift="0.5" key0="ظ"/>
<key key0="ط"/>
<key key0="ز" key2="«"/>
<key key0="ر" key2="»"/>
<key key0="ژ" key2="."/>
<key key0="ز" key1="«" key2="»"/>
<key key0="ر" key1="ژ" key2="."/>
<key key0="ذ" key2=":"/>
<key key0="د" key2="؛"/>
<key key0="پ" key2="&#1567;"/>
<key key0="و"/>
<key key0="چ"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@ -8,32 +8,32 @@
<fn a="у" b="у̂" />
<fn a="cursor_left" b="home" />
<fn a="cursor_right" b="end" />
<ctrl a="љ" b="q" />
<ctrl a="њ" b="w" />
<ctrl a="е" b="e" />
<ctrl a="р" b="r" />
<ctrl a="т" b="t" />
<ctrl a="ж" b="y" />
<ctrl a="у" b="u" />
<ctrl a="и" b="i" />
<ctrl a="о" b="o" />
<ctrl a="п" b="p" />
<ctrl a="а" b="a" />
<ctrl a="с" b="s" />
<ctrl a="д" b="d" />
<ctrl a="ф" b="f" />
<ctrl a="г" b="g" />
<ctrl a="х" b="h" />
<ctrl a="ј" b="j" />
<ctrl a="к" b="k" />
<ctrl a="л" b="l" />
<ctrl a="з" b="z" />
<ctrl a="џ" b="x" />
<ctrl a="ц" b="c" />
<ctrl a="в" b="v" />
<ctrl a="б" b="b" />
<ctrl a="н" b="n" />
<ctrl a="м" b="m" />
<ctrl a="љ" b=":char symbol='љ':q" />
<ctrl a="њ" b=":char symbol='њ':w" />
<ctrl a="е" b=":char symbol='е':e" />
<ctrl a="р" b=":char symbol='р':r" />
<ctrl a="т" b=":char symbol='т':t" />
<ctrl a="ж" b=":char symbol='ж':y" />
<ctrl a="у" b=":char symbol='у':u" />
<ctrl a="и" b=":char symbol='и':i" />
<ctrl a="о" b=":char symbol='о':o" />
<ctrl a="п" b=":char symbol='п':p" />
<ctrl a="а" b=":char symbol='а':a" />
<ctrl a="с" b=":char symbol='с':s" />
<ctrl a="д" b=":char symbol='д':d" />
<ctrl a="ф" b=":char symbol='ф':f" />
<ctrl a="г" b=":char symbol='г':g" />
<ctrl a="х" b=":char symbol='х':h" />
<ctrl a="ј" b=":char symbol='ј':j" />
<ctrl a="к" b=":char symbol='к':k" />
<ctrl a="л" b=":char symbol='л':l" />
<ctrl a="з" b=":char symbol='з':z" />
<ctrl a="џ" b=":char symbol='џ':x" />
<ctrl a="ц" b=":char symbol='ц':c" />
<ctrl a="в" b=":char symbol='в':v" />
<ctrl a="б" b=":char symbol='б':b" />
<ctrl a="н" b=":char symbol='н':n" />
<ctrl a="м" b=":char symbol='м':m" />
</modmap>
<row>
<key key0="љ" ne="1" se="loc esc"/>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="Tajiki Persian (Тоҷикӣ)" script="cyrillic">
<row>
<key key0="й" key7="esc" key4="delete" />
<key key0="қ" key7="-" key8="_" />
<key key0="у" key7="\@" key8="ӯ" />
<key key0="к" key7="=" key8="+" />
<key key0="е" key8="ё" key7="!" />
<key key0="н" key7="$" key8="%"/>
<key key0="г" key7="^" key8="ғ" />
<key key0="ш" key3="(" key2=")" />
<key key0="ҳ" key3="[" key2="]" />
<key key0="з" key3="{" key2="}" />
<key key0="х" key7="tab" key3="backspace" />
</row>
<row>
<key key0="ф" key7="1" />
<key key0="ҷ" key7="2" />
<key key0="в" key7="3" />
<key key0="а" key7="4" />
<key key0="п" key7="5" />
<key key0="р" key7="6" />
<key key0="о" key7="7" />
<key key0="л" key7="8" />
<key key0="д" key7="9" key8="f11_placeholder" />
<key key0="ж" key7="0" key8="f12_placeholder" />
<key key0="э" key7="\?" key3="/" />
</row>
<row>
<key width="1.18" key0="shift" key2="loc capslock" />
<key width="0.96" key0="я" key7="`" key8=";" />
<key width="0.96" key0="ч" key7="*" key8=":" />
<key width="0.96" key0="с" key7="&amp;" key8="\#" />
<key width="0.96" key0="м" key7="|" key8="\\" />
<key width="0.96" key0="и" key7="~" />
<key width="0.96" key0="т" key7="ц" />
<key width="0.96" key0="ӣ" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key7="ъ" key8="ы" />
<key width="0.96" key0="ю" key7="&quot;" key8="'"/>
<key width="1.18" key0="." key7="," />
</row>
</keyboard>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="Old Church Slavonic (Црькъвьнословѣньскъ ѩзыкъ)" script="cyrillic">
<row>
<key key0="й" key7="esc" key4="delete" />
<key key0="ѯ" key7="=" key8="+" />
<key key0="у" key8="ѵ" key7="!" />
<key key0="к" key7="%" key8="*" />
<key key0="е" key7="ё" key8="combining_trema" />
<key key0="н" key7="ѩ" key8="combining_titlo" />
<key key0="г" key7="^" key8="combining_payerok" />
<key key0="ш" key7="щ" key8="combining_vzmet" />
<key key0="ѳ" key3="combining_slavonic_dasia" key2="combining_slavonic_psili" />
<key key0="з" key3="combining_grave" key2="combining_aigu" />
<key key0="х" key7="ҁ" key3="backspace" />
</row>
<row>
<key key0="ф" key7="1" key4="tab" />
<key key0="ꙉ" key7="2" key8="ъ" />
<key key0="в" key7="3" key8="ꙑ" />
<key key0="а" key7="4" key8="ь" />
<key key0="п" key7="5" />
<key key0="р" key7="6" />
<key key0="о" key7="7" key8="ѡ" />
<key key0="л" key7="8" />
<key key0="д" key7="9" key8="f11_placeholder" />
<key key0="ж" key7="0" key8="f12_placeholder" />
<key key0="э" key7="/" key8="|" />
</row>
<row>
<key width="1.18" key0="shift" />
<key width="0.96" key0="ꙗ" key7="combining_breve" key8=";" />
<key width="0.96" key0="ч" key7="combining_pokrytie" key8=":" />
<key width="0.96" key0="с" key7="combining_inverted_breve" key8="`" />
<key width="0.96" key0="м" key7="ѭ" />
<key width="0.96" key0="и" key7="combining_vertical_tilde" key8="-" />
<key width="0.96" key0="т" key7="\?" key8="\\" />
<key width="0.96" key0="ц" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key3="(" key2=")" />
<key width="0.96" key0="ю" key3="{" key2="}" />
<key width="1.18" key0="." key7="," key8="_" />
</row>
</keyboard>

View File

@ -1,118 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<keyboard name="かな入力 (日本)" script="kana">
<modmap>
<shift a="あ" b="ア"/>
<shift a="い" b="イ"/>
<shift a="う" b="ウ"/>
<shift a="え" b="エ"/>
<shift a="お" b="オ"/>
<shift a="か" b="カ"/>
<shift a="き" b="キ"/>
<shift a="く" b="ク"/>
<shift a="け" b="ケ"/>
<shift a="こ" b="コ"/>
<shift a="さ" b="サ"/>
<shift a="し" b="シ"/>
<shift a="す" b="ス"/>
<shift a="せ" b="セ"/>
<shift a="そ" b="ソ"/>
<shift a="た" b="タ"/>
<shift a="ち" b="チ"/>
<shift a="つ" b="ツ"/>
<shift a="て" b="テ"/>
<shift a="と" b="ト"/>
<shift a="な" b="ナ"/>
<shift a="に" b="ニ"/>
<shift a="ぬ" b="ヌ"/>
<shift a="ね" b="ネ"/>
<shift a="の" b=""/>
<shift a="は" b="ハ"/>
<shift a="ひ" b="ヒ"/>
<shift a="ふ" b="フ"/>
<shift a="へ" b="ヘ"/>
<shift a="ほ" b="ホ"/>
<shift a="ま" b="マ"/>
<shift a="み" b="ミ"/>
<shift a="む" b="ム"/>
<shift a="め" b="メ"/>
<shift a="も" b="モ"/>
<shift a="や" b="ヤ"/>
<shift a="ゆ" b="ユ"/>
<shift a="よ" b="ヨ"/>
<shift a="ら" b="ラ"/>
<shift a="り" b="リ"/>
<shift a="る" b="ル"/>
<shift a="れ" b="レ"/>
<shift a="ろ" b="ロ"/>
<shift a="わ" b="ワ"/>
<shift a="を" b="ヲ"/>
<shift a="ん" b="ン"/>
<shift a="ぁ" b="ァ"/>
<shift a="ぃ" b="ィ"/>
<shift a="ぅ" b="ゥ"/>
<shift a="ぇ" b="ェ"/>
<shift a="ぉ" b="ォ"/>
<shift a="っ" b="ッ"/>
<shift a="ゃ" b="ャ"/>
<shift a="ゅ" b="ュ"/>
<shift a="ょ" b="ョ"/>
</modmap>
<row>
<key key0="ぬ" key1="!" key3="1" key4="loc esc"/>
<key key0="ふ" key1="&quot;" key3="2"/>
<key key0="あ" key1="\#" key2="ぁ" key3="3"/>
<key key0="う" key1="$" key2="ぅ" key3="4"/>
<key key0="え" key1="%" key2="ぇ" key3="5"/>
<key key0="お" key1="&amp;" key2="ぉ" key3="6"/>
<key key0="や" key1="'" key2="ゃ" key3="7"/>
<key key0="ゆ" key1="(" key2="ゅ" key3="8"/>
<key key0="よ" key1=")" key2="ょ" key3="9"/>
<key key0="わ" key2="を" key3="0"/>
<key key0="ほ" key1="=" key3="-"/>
<key key0="へ" key1="~" key3="^"/>
<key key0="ー" key1="|" key3="¥"/>
</row>
<row>
<key shift="0.5" key0="た" key1="q" key3="loc tab"/>
<key key0="て" key1="w"/>
<key key0="い" key1="e" key2="ぃ"/>
<key key0="す" key1="r"/>
<key key0="か" key1="t"/>
<key key0="ん" key1="y"/>
<key key0="な" key1="u"/>
<key key0="に" key1="i"/>
<key key0="ら" key1="o"/>
<key key0="せ" key1="p"/>
<key key0="dakuten" key1="`" key3="\@"/>
<key key0="handakuten" key1="{" key2="「" key3="["/>
</row>
<row>
<key shift="0.5" key0="ち" key1="a"/>
<key key0="と" key1="s"/>
<key key0="し" key1="d"/>
<key key0="は" key1="f"/>
<key key0="き" key1="g"/>
<key key0="く" key1="h"/>
<key key0="ま" key1="j"/>
<key key0="の" key1="k"/>
<key key0="り" key1="l"/>
<key key0="れ" key1="+" key3=";"/>
<key key0="け" key1="*" key3=":"/>
<key key0="む" key1="}" key2="」" key3="]"/>
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key key0="つ" key1="z" key2="っ"/>
<key key0="さ" key1="x"/>
<key key0="そ" key1="c"/>
<key key0="ひ" key1="v"/>
<key key0="こ" key1="b"/>
<key key0="み" key1="n"/>
<key key0="も" key1="m"/>
<key key0="ね" key1="&lt;" key2="、" key3=","/>
<key key0="る" key1=">" key2="。" key3="."/>
<key key0="め" key1="\?" key2="・" key3="/"/>
<key key0="ろ" key1="_" key3="\\"/>
<key key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@ -1,46 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://neo-layout.org/Layouts/bone/ -->
<keyboard name="Bone" bottom_row="false" script="latin">
<!-- first row + characters from number row:
jduaxphlmwß
…_[]^!<>=&ſ
°§ℓ»«$€„“”—
›‹¢¥‚‘’
-->
<row>
<key key0="j" key2="loc esc" key4="…"/>
<key key0="d" key2="°" key4="_"/>
<key key0="u" key2="§" key4="["/>
<key key0="a" key4="]"/>
<key key0="x" key4="^"/>
<key key0="p" key3="!" key4="7"/>
<key key0="h" key3="&lt;" key4="8"/>
<key key0="l" key1="" key3="&gt;" key4="9"/>
<key key0="m" key1="≠" key3="="/>
<key key0="w" key3="&amp;"/>
<!--left side-->
<key key0="j" key2="°" key4="…"/>
<key key0="d" key2="§" key4="_"/>
<key key0="u" key2="" key4="["/>
<key key0="a" key2="»" key4="]" key1=""/>
<key key0="x" key2="«" key4="^" key1=""/>
<!--middle-->
<key key0="p" key7="¢" key8="!"/>
<!--right side-->
<key key0="h" key1="€" key3="&lt;" key4="7" key2="¥"/>
<key key0="l" key1="„" key3="&gt;" key4="8" key2=""/>
<key key0="m" key1="“" key3="=" key4="9" key2=""/>
<key key0="w" key1="”" key3="&amp;" key2=""/>
<key key0="ß" key1="—" key3="ſ"/>
</row>
<!--second row:
ctieobnrsgq
\/{}*?()-:@
-->
<row>
<key key0="c" key2="loc tab" key4="\\"/>
<key key0="t" key1="accent_circonflexe" key2="accent_caron" key4="/"/>
<key key0="i" key1="accent_aigu" key2="accent_grave" key4="{"/>
<key key0="e" key1="accent_cedille" key2="accent_ogonek" key4="}"/>
<key key0="o" key1="accent_ring" key2="accent_dot_above" key4="*"/>
<key key0="b" key2="accent_macron" key3="\?" key4="4"/>
<key key0="n" key2="accent_tilde" key3="(" key4="5"/>
<key key0="r" key2="accent_trema" key3=")" key4="6"/>
<key key0="s" key2="accent_slash" key3="-"/>
<key key0="g" key1="\@" key3=":"/>
<!--left side-->
<key key0="c" key4="\\"/>
<key key0="t" key4="/"/>
<key key0="i" key4="{"/>
<key key0="e" key4="}"/>
<key key0="o" key4="*"/>
<!--middle-->
<key key0="b" key8="\?"/>
<!--right side-->
<key key0="n" key3="(" key4="4"/>
<key key0="r" key3=")" key4="5"/>
<key key0="s" key3="-" key4="6"/>
<key key0="g" key3=":"/>
<key key0="q" key3="@"/>
</row>
<!--third row -> compressed to also fit shift and backspace:
fvüäöyz,.k
#$|~`+%"';
-->
<row>
<key width="1.5" key0="shift" key4="\#" key2="loc capslock"/>
<key key0="f" key4="|"/>
<key key0="v" key4="~"/>
<key key0="ß" key4="`"/>
<key key0="y" key3="%" key4="1"/>
<key key0="z" key1="&quot;" key3="+" key4="2"/>
<key key0="q" key1="&apos;" key3="," key4="3"/>
<key key0="k" key3="."/>
<key width="1.5" key0="backspace" key1="delete" key3=";"/>
<!--left side-->
<key width="1.5" key0="shift" key4="\#"/>
<key key0="f" key4="$"/>
<key key0="v" key4="|"/>
<key key0="ü" key4="~"/>
<key key0="ä" key4="`"/>
<!--right side-->
<key key0="ö" key3="+"/>
<key key0="y" key3="%" key4="1"/>
<key key0="z" key3="," key1="&quot;" key4="2"/>
<key key0="k" key3="." key1="&apos;" key4="3"/>
<key width="1.5" key0="backspace" key3=";" key1="delete"/>
</row>
<!--bottom row-->
<row height="0.95">
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.0" key0="space" key7="switch_forward" key8="0"/>
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
<key width="1.8" key0="enter" key3="action"/>
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="5.0" key0="space" key7="switch_forward" key8="0"/>
<key width="1.2" key5="left" key6="right" key7="up" key8="down"/>
<key width="1.8" key0="enter" key3="action"/>
</row>
</keyboard>

32
srcs/res/SvgToVector.java Normal file
View File

@ -0,0 +1,32 @@
package srcs.res;
import com.android.ide.common.vectordrawable.Svg2Vector;
import java.io.File;
import java.io.FileOutputStream;
/** Inspired from Bernard Ladenthin's answer:
https://stackoverflow.com/a/78898372 */
public class SvgToVector
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.out.println("Usage: svg_to_vector <input_file> <output_file>");
return;
}
try
{
File input_file = new File(args[0]);
FileOutputStream output_stream = new FileOutputStream(args[1]);
String warnings;
warnings = Svg2Vector.parseSvgToXml(input_file, output_stream);
System.err.println(warnings);
}
catch (Exception e)
{
e.printStackTrace();
System.exit(2);
}
}
}

192
srcs/res/doc_key.svg Normal file
View File

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="35mm"
height="40mm"
viewBox="0 0 35 40"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="doc_key.svg"
inkscape:export-filename="key_u.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#1b1b1b"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#1b1b1b"
inkscape:document-units="mm"
inkscape:zoom="4.6038101"
inkscape:cx="160.95364"
inkscape:cy="75.69817"
inkscape:window-width="2560"
inkscape:window-height="1440"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2">
<inkscape:page
x="0"
y="0"
width="35"
height="40"
id="page1"
margin="0"
bleed="0"
inkscape:label="g" />
<inkscape:page
x="45"
y="0"
width="35"
height="40"
id="page2"
margin="0"
bleed="0"
inkscape:label="u" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="U"
style="display:inline">
<g
inkscape:label="Background"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(42.916821,-9.9998472)">
<rect
style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
id="rect1"
width="14.749311"
height="19.74971"
x="12.208678"
y="20.125347"
ry="1.1332803"
inkscape:label="rect1" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="59.864403"
y="22.246796"
id="text1"
inkscape:label="text1"
inkscape:transform-center-x="-0.00074323194"
inkscape:transform-center-y="-0.001350474"
transform="scale(1.0003873,0.99961285)"><tspan
id="tspan1"
sodipodi:role="line"
x="59.864403"
y="22.246796"
style="stroke-width:0.265729">u</tspan><tspan
id="tspan2"
sodipodi:role="line"
x="59.864403"
y="32.859245"
style="stroke-width:0.265729" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="55.882885"
y="28.802013"
id="text3"
transform="scale(1.0003873,0.99961285)"
inkscape:label="text3"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
x="55.882885"
y="28.802013"
id="tspan4">&amp;</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="65.686905"
y="15.189408"
id="text5"
transform="scale(1.0003873,0.99961285)"><tspan
sodipodi:role="line"
id="tspan5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
x="65.686905"
y="15.189408">7</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="G"
style="display:inline">
<g
inkscape:label="Background"
inkscape:groupmode="layer"
id="g2"
style="display:inline">
<rect
style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
id="rect2"
width="14.749311"
height="19.74971"
x="10.125345"
y="10.125347"
ry="1.1332803"
inkscape:label="rect1" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="10.887006"
y="27.77977"
id="text3-3"
transform="scale(1.0003873,0.99961285)"
inkscape:label="text3"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
x="10.887006"
y="27.77977"
id="tspan4-7">_</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="14.868526"
y="22.204519"
id="text1-2"
inkscape:label="text1"
inkscape:transform-center-x="-0.00074323194"
inkscape:transform-center-y="-0.001350474"
transform="scale(1.0003873,0.99961285)"><tspan
id="tspan1-0"
sodipodi:role="line"
x="14.868526"
y="22.204519"
style="stroke-width:0.265729">g</tspan><tspan
id="tspan2-2"
sodipodi:role="line"
x="14.868526"
y="32.816971"
style="stroke-width:0.265729" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
x="20.691027"
y="15.147132"
id="text5-5"
transform="scale(1.0003873,0.99961285)"><tspan
sodipodi:role="line"
id="tspan5-9"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729"
x="20.691027"
y="15.147132">-</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -e
cd "$(dirname $0)"
DRAWABLE_DIR=../../res/drawable
ANDROID_LIB=$ANDROID_SDK_ROOT/tools/lib
first () { echo "$1"; }
JAVA_ARGS=(
-classpath
"$(first $ANDROID_LIB/sdk-common-*.jar):$(first $ANDROID_LIB/common-*.jar)"
)
svg_to_vector ()
{
java "${JAVA_ARGS[@]}" SvgToVector.java "$@"
}
TMP=`mktemp -d`
trap "rm -r '$TMP'" EXIT
set -x
inkscape doc_key.svg -o "$TMP/doc_key_u.svg" -C --export-page 2 --export-plain-svg --export-text-to-path
svg_to_vector "$TMP/doc_key_u.svg" "$DRAWABLE_DIR/doc_key_u.xml"

View File

@ -1,9 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="-10 0 750 1000"
fill="currentColor">
<!-- created by @sdrapha - https://github.com/sdrapha/IconFontSVG
License - LICENSE: CC BY-SA 4.0 -->
<!-- derived from Entypo+ arrow-left-bold by Daniel Bruce -->
<title>arrow-home</title>
<path d="M0 165h50v669h-50v-669zM378 830l-328 -330l328 -330v190h352v278h-352v192z" />
<?xml version="1.0" standalone="no"?>
<!-- Modified from DejaVuSans -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-10 0 1726 2048">
<path fill="currentColor"
d="M1613 63v169h-1322v1324h-169v-1493h1491zM412 416l63 -63h556v169h-330l862 862l-120 120l-862 -862v330h-169v-556z" />
</svg>

Before

Width:  |  Height:  |  Size: 381 B

After

Width:  |  Height:  |  Size: 450 B

View File

@ -1,9 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="-10 0 750 1000"
fill="currentColor">
<!-- created by @sdrapha - https://github.com/sdrapha/IconFontSVG
License - LICENSE: CC BY-SA 4.0 -->
<!-- derived from Entypo+ arrow-right-bold by Daniel Bruce -->
<title>arrow-end</title>
<path d="M680 170h50v660h-50v-660zM350 170l330 330l-330 330v-192h-350v-278h350v-190z" />
<?xml version="1.0" standalone="no"?>
<!-- Modified from DejaVuSans -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-10 0 1726 2048">
<path fill="currentColor"
d="M122 1556v-169h1322v-1324h169v1493h-1491zM1323 1203l-63 63h-556v-169h330l-862 -862l120 -120l862 862v-330h169v556z" />
</svg>

Before

Width:  |  Height:  |  Size: 384 B

After

Width:  |  Height:  |  Size: 453 B

41
srcs/special_font/150.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="50.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.43103287"
inkscape:cx="573.04214"
inkscape:cy="259.84097"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 650 1541 L 465 1275 L 613 1275 L 882 1535 L 880 1541 L 650 1541 z M 788.03711 1185.2168 L 788.03711 834.99219 L 884.67969 834.99219 L 884.67969 1185.2168 L 788.03711 1185.2168 z M 516.67773 1130.7461 C 398.97689 1122.8994 292.60787 1080.177 197.57227 1002.5801 L 194.95703 1005.1953 C 242.90998 956.37142 266.88672 931.52279 266.88672 930.65039 C 344.48318 990.80911 427.7482 1024.3767 516.67773 1031.3516 L 516.67773 1130.7461 z M 121.71875 938.49805 L 127.9043 933.55078 L 125.64258 935.88281 L 121.71875 938.49805 z M 127.9043 933.55078 L 128.2207 933.22461 C 128.2327 933.23861 128.24581 933.25358 128.25781 933.26758 L 127.9043 933.55078 z M 128.2207 933.22461 C 48.031653 841.68937 2.2696687 735.33339 -9.0625 614.16211 L 90.332031 614.16211 C 101.6658 709.19571 137.41295 791.15224 197.57227 860.0293 C 197.57227 860.90169 187.54483 871.80024 167.49219 892.72461 L 128.2207 933.22461 z M 788.03711 733.03516 L 788.03711 382.8125 L 884.67969 382.8125 L 884.67969 733.03516 L 788.03711 733.03516 z M -9.0605469 517.38281 C -0.34667559 391.03054 42.335595 282.09919 118.98047 190.58398 C 123.06104 195.44428 144.50061 217.66171 189.72656 263.66797 C 132.18314 335.1603 99.052766 419.73181 90.333984 517.38281 L -9.0605469 517.38281 z M 118.98047 190.58398 C 118.49847 190.00988 115.08964 186.50781 115.18164 186.50781 L 119.10352 190.43164 C 119.06152 190.48164 119.02242 190.53368 118.98047 190.58398 z M 788.03711 280.85547 L 788.03711 -69.369141 L 884.67969 -69.369141 L 884.67969 280.85547 L 788.03711 280.85547 z M 259.04102 190.43164 L 189.72656 121.11719 C 287.37616 38.28987 396.36145 -7.0487922 516.67969 -14.896484 L 516.67969 84.498047 C 423.38876 94.961136 337.50938 130.2728 259.04102 190.43164 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

41
srcs/special_font/151.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="51.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.32224737"
inkscape:cx="1238.1792"
inkscape:cy="301.01099"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 240 1543 L 240 1523 L 494 1280 L 613 1280 L 870 1525 L 870 1543 L 700 1543 L 553 1395 L 406 1543 L 240 1543 z M 788.03711 1185.4141 L 788.03711 835.18945 L 884.67969 835.18945 L 884.67969 1185.4141 L 788.03711 1185.4141 z M 516.67773 1130.9434 C 398.97689 1123.0967 292.60787 1080.3743 197.57227 1002.7773 L 194.95703 1005.3926 C 242.90998 956.56869 266.88672 931.72006 266.88672 930.84766 C 344.48318 991.00638 427.7482 1024.5739 516.67773 1031.5488 L 516.67773 1130.9434 z M 121.71875 938.69531 L 127.9043 933.74805 L 125.64258 936.08008 L 121.71875 938.69531 z M 127.9043 933.74805 L 128.2207 933.42188 C 128.2327 933.43587 128.24581 933.45084 128.25781 933.46484 L 127.9043 933.74805 z M 128.2207 933.42188 C 48.031653 841.88664 2.2696687 735.53065 -9.0625 614.35938 L 90.332031 614.35938 C 101.6658 709.39298 137.41295 791.3495 197.57227 860.22656 C 197.57227 861.09895 187.54483 871.99751 167.49219 892.92188 L 128.2207 933.42188 z M 788.03711 733.23242 L 788.03711 383.00977 L 884.67969 383.00977 L 884.67969 733.23242 L 788.03711 733.23242 z M -9.0605469 517.58008 C -0.34667559 391.2278 42.335595 282.29646 118.98047 190.78125 C 123.06104 195.64155 144.50061 217.85898 189.72656 263.86523 C 132.18314 335.35756 99.052766 419.92908 90.333984 517.58008 L -9.0605469 517.58008 z M 118.98047 190.78125 C 118.49847 190.20715 115.08964 186.70508 115.18164 186.70508 L 119.10352 190.62891 C 119.06152 190.67891 119.02242 190.73095 118.98047 190.78125 z M 788.03711 281.05273 L 788.03711 -69.171875 L 884.67969 -69.171875 L 884.67969 281.05273 L 788.03711 281.05273 z M 259.04102 190.62891 L 189.72656 121.31445 C 287.37616 38.487136 396.36145 -6.8515266 516.67969 -14.699219 L 516.67969 84.695312 C 423.38876 95.158402 337.50938 130.47007 259.04102 190.62891 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

41
srcs/special_font/152.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="52.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.28469254"
inkscape:cx="1053.7684"
inkscape:cy="540.93444"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 788.03711 1185.3613 L 788.03711 835.13672 L 884.67969 835.13672 L 884.67969 1185.3613 L 788.03711 1185.3613 z M 516.67773 1130.8906 C 398.97689 1123.0439 292.60787 1080.3215 197.57227 1002.7246 L 194.95703 1005.3398 C 242.90998 956.51595 266.88672 931.66732 266.88672 930.79492 C 344.48318 990.95364 427.7482 1024.5212 516.67773 1031.4961 L 516.67773 1130.8906 z M 121.71875 938.64258 L 127.9043 933.69531 L 125.64258 936.02734 L 121.71875 938.64258 z M 127.9043 933.69531 L 128.2207 933.36914 C 128.2327 933.38314 128.24581 933.39811 128.25781 933.41211 L 127.9043 933.69531 z M 128.2207 933.36914 C 48.031653 841.8339 2.2696687 735.47792 -9.0625 614.30664 L 90.332031 614.30664 C 101.6658 709.34025 137.41295 791.29677 197.57227 860.17383 C 197.57227 861.04622 187.54483 871.94477 167.49219 892.86914 L 128.2207 933.36914 z M 788.03711 733.17969 L 788.03711 382.95703 L 884.67969 382.95703 L 884.67969 733.17969 L 788.03711 733.17969 z M -9.0605469 517.52734 C -0.34667559 391.17507 42.335595 282.24372 118.98047 190.72852 C 123.06104 195.58881 144.50061 217.80625 189.72656 263.8125 C 132.18314 335.30483 99.052766 419.87634 90.333984 517.52734 L -9.0605469 517.52734 z M 118.98047 190.72852 C 118.49847 190.15442 115.08964 186.65234 115.18164 186.65234 L 119.10352 190.57617 C 119.06152 190.62617 119.02242 190.67822 118.98047 190.72852 z M 788.03711 281 L 788.03711 -69.224609 L 884.67969 -69.224609 L 884.67969 281 L 788.03711 281 z M 259.04102 190.57617 L 189.72656 121.26172 C 278.02009 46.370309 375.61486 2.2381133 482.44141 -11.353516 L 451 -144 C 508.99994 -148.66667 550.00002 -157.33334 574 -170 C 597.99998 -182.66666 610 -205.00003 610 -237 C 610 -269.66664 595.3333 -294.16669 566 -310.5 C 536.6667 -326.83331 497.99995 -335 450 -335 L 457 -444 C 554.9999 -444 630.33338 -424.99996 683 -387 C 735.66662 -349.00004 762 -297.99994 762 -234 C 762 -180.66672 747.66664 -140.3333 719 -113 C 690.33336 -85.666694 654.33329 -68.333326 611 -61 L 623 -9 L 516.67969 -9 L 516.67969 84.642578 C 423.38876 95.105668 337.50938 130.41733 259.04102 190.57617 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

41
srcs/special_font/153.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="53.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.43330418"
inkscape:cx="964.68028"
inkscape:cy="925.44687"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 495 1542 L 249 1305 L 249 1279 L 409 1279 L 555 1427 L 702 1279 L 863 1279 L 863 1304 L 615 1542 L 495 1542 z M 788.03711 1186.0098 L 788.03711 835.78516 L 884.67969 835.78516 L 884.67969 1186.0098 L 788.03711 1186.0098 z M 516.67773 1131.5391 C 398.97689 1123.6924 292.60787 1080.97 197.57227 1003.373 L 194.95703 1005.9883 C 242.90998 957.16439 266.88672 932.31576 266.88672 931.44336 C 344.48318 991.60208 427.7482 1025.1696 516.67773 1032.1445 L 516.67773 1131.5391 z M 121.71875 939.29102 L 127.9043 934.34375 L 125.64258 936.67578 L 121.71875 939.29102 z M 127.9043 934.34375 L 128.2207 934.01758 C 128.2327 934.03158 128.24581 934.04655 128.25781 934.06055 L 127.9043 934.34375 z M 128.2207 934.01758 C 48.031653 842.48234 2.2696687 736.12636 -9.0625 614.95508 L 90.332031 614.95508 C 101.6658 709.98868 137.41295 791.9452 197.57227 860.82227 C 197.57227 861.69465 187.54483 872.59321 167.49219 893.51758 L 128.2207 934.01758 z M 788.03711 733.82812 L 788.03711 383.60547 L 884.67969 383.60547 L 884.67969 733.82812 L 788.03711 733.82812 z M -9.0605469 518.17578 C -0.34667559 391.82351 42.335595 282.89216 118.98047 191.37695 C 123.06104 196.23725 144.50061 218.45468 189.72656 264.46094 C 132.18314 335.95327 99.052766 420.52478 90.333984 518.17578 L -9.0605469 518.17578 z M 118.98047 191.37695 C 118.49847 190.80285 115.08964 187.30078 115.18164 187.30078 L 119.10352 191.22461 C 119.06152 191.27461 119.02242 191.32665 118.98047 191.37695 z M 788.03711 281.64844 L 788.03711 -68.576172 L 884.67969 -68.576172 L 884.67969 281.64844 L 788.03711 281.64844 z M 259.04102 191.22461 L 189.72656 121.91016 C 287.37616 39.082839 396.36145 -6.2558235 516.67969 -14.103516 L 516.67969 85.291016 C 423.38876 95.754105 337.50938 131.06577 259.04102 191.22461 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

41
srcs/special_font/154.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="54.combined.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.43113456"
inkscape:cx="354.87761"
inkscape:cy="635.53245"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 233 1545 L 230 1539 L 480 1279 L 638 1279 L 463 1545 L 233 1545 z M 788.03711 1185.8887 L 788.03711 835.66406 L 884.67969 835.66406 L 884.67969 1185.8887 L 788.03711 1185.8887 z M 516.67773 1131.418 C 398.97701 1123.5713 292.60777 1080.8489 197.57227 1003.252 L 194.95703 1005.8672 C 242.90993 957.04333 266.88672 932.19466 266.88672 931.32227 C 344.4831 991.48093 427.74829 1025.0485 516.67773 1032.0234 L 516.67773 1131.418 z M 121.71875 939.16992 L 127.9043 934.22266 L 125.64258 936.55469 L 121.71875 939.16992 z M 127.9043 934.22266 L 128.2207 933.89648 C 128.2327 933.91048 128.24581 933.92545 128.25781 933.93945 L 127.9043 934.22266 z M 128.2207 933.89648 C 48.031733 842.36134 2.2696587 736.00514 -9.0625 614.83398 L 90.332031 614.83398 C 101.66579 709.86749 137.41301 791.82417 197.57227 860.70117 C 197.57227 861.57355 187.54481 872.47214 167.49219 893.39648 L 128.2207 933.89648 z M 788.03711 733.70703 L 788.03711 383.48438 L 884.67969 383.48438 L 884.67969 733.70703 L 788.03711 733.70703 z M -9.0605469 518.05469 C -0.34668559 391.70251 42.335665 282.77107 118.98047 191.25586 C 123.06103 196.11615 144.50066 218.33369 189.72656 264.33984 C 132.1832 335.83217 99.052766 420.40379 90.333984 518.05469 L -9.0605469 518.05469 z M 118.98047 191.25586 C 118.49847 190.68176 115.08964 187.17969 115.18164 187.17969 L 119.10352 191.10352 C 119.06152 191.15352 119.02242 191.20556 118.98047 191.25586 z M 788.03711 281.52734 L 788.03711 -68.697266 L 884.67969 -68.697266 L 884.67969 281.52734 L 788.03711 281.52734 z M 259.04102 191.10352 L 189.72656 121.78906 C 287.37606 38.961745 396.36157 -6.3769172 516.67969 -14.224609 L 516.67969 85.169922 C 423.38885 95.633011 337.5093 130.94478 259.04102 191.10352 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

41
srcs/special_font/155.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="55.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.30430685"
inkscape:cx="433.77268"
inkscape:cy="368.04955"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 204.5 1464 L 204.5 1318 L 925.5 1318 L 925.5 1464 L 204.5 1464 z M 788.03711 1185.3613 L 788.03711 835.13672 L 884.67969 835.13672 L 884.67969 1185.3613 L 788.03711 1185.3613 z M 516.67773 1130.8906 C 398.97713 1123.0439 292.60767 1080.3214 197.57227 1002.7246 L 194.95703 1005.3398 C 242.90988 956.51602 266.88672 931.66731 266.88672 930.79492 C 344.48302 990.95352 427.74838 1024.5212 516.67773 1031.4961 L 516.67773 1130.8906 z M 121.71875 938.64258 L 127.9043 933.69531 L 125.64258 936.02734 L 121.71875 938.64258 z M 127.9043 933.69531 L 128.2207 933.36914 C 128.2327 933.38314 128.24581 933.39811 128.25781 933.41211 L 127.9043 933.69531 z M 128.2207 933.36914 C 48.031813 841.83409 2.2696487 735.47762 -9.0625 614.30664 L 90.332031 614.30664 C 101.66578 709.34005 137.41307 791.2969 197.57227 860.17383 C 197.57227 861.04621 187.54479 871.94482 167.49219 892.86914 L 128.2207 933.36914 z M 788.03711 733.17969 L 788.03711 382.95703 L 884.67969 382.95703 L 884.67969 733.17969 L 788.03711 733.17969 z M -9.0605469 517.52734 C -0.34669559 391.17527 42.335735 282.24362 118.98047 190.72852 C 123.06102 195.58871 144.50071 217.80645 189.72656 263.8125 C 132.18326 335.30483 99.052766 419.87654 90.333984 517.52734 L -9.0605469 517.52734 z M 118.98047 190.72852 C 118.49847 190.15442 115.08964 186.65234 115.18164 186.65234 L 119.10352 190.57617 C 119.06152 190.62617 119.02242 190.67822 118.98047 190.72852 z M 788.03711 281 L 788.03711 -69.224609 L 884.67969 -69.224609 L 884.67969 281 L 788.03711 281 z M 259.04102 190.57617 L 189.72656 121.26172 C 287.37596 38.434402 396.36169 -6.904261 516.67969 -14.751953 L 516.67969 84.642578 C 423.38894 95.105668 337.50922 130.41753 259.04102 190.57617 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

41
srcs/special_font/156.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="56.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.53396301"
inkscape:cx="475.68839"
inkscape:cy="1151.7652"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 554 1581 C 505.33338 1581 463.8333 1564.8333 429.5 1532.5 C 395.1667 1500.1667 378 1460 378 1412 C 378 1364 395.00003 1324.6667 429 1294 C 462.99997 1263.3333 504.66672 1248 554 1248 C 601.99995 1248 642.83336 1263.1667 676.5 1293.5 C 710.16664 1323.8333 727 1363.3333 727 1412 C 727 1460 710.16664 1500.1667 676.5 1532.5 C 642.83336 1564.8333 601.99995 1581 554 1581 z M 554 1489 C 573.99998 1489 591.16668 1481.5 605.5 1466.5 C 619.83332 1451.5 627 1433.3333 627 1412 C 627 1390.6667 619.83332 1373 605.5 1359 C 591.16668 1345 573.99998 1338 554 1338 C 533.33335 1338 515.49999 1345.1667 500.5 1359.5 C 485.50002 1373.8333 478 1391.3333 478 1412 C 478 1433.3333 485.33334 1451.5 500 1466.5 C 514.66666 1481.5 532.66669 1489 554 1489 z M 788.03711 1185.4902 L 788.03711 835.26562 L 884.67969 835.26562 L 884.67969 1185.4902 L 788.03711 1185.4902 z M 516.67773 1131.0195 C 398.97725 1123.1728 292.60757 1080.4502 197.57227 1002.8535 L 194.95703 1005.4688 C 242.90983 956.64502 266.88672 931.79622 266.88672 930.92383 C 344.48294 991.08237 427.74852 1024.6501 516.67773 1031.625 L 516.67773 1131.0195 z M 121.71875 938.77148 L 127.9043 933.82422 L 125.64258 936.15625 L 121.71875 938.77148 z M 127.9043 933.82422 L 128.2207 933.49805 C 128.2327 933.51205 128.24581 933.52702 128.25781 933.54102 L 127.9043 933.82422 z M 128.2207 933.49805 C 48.031893 841.96309 2.2696387 735.60645 -9.0625 614.43555 L 90.332031 614.43555 C 101.66577 709.4689 137.41313 791.42587 197.57227 860.30273 C 197.57227 861.17511 187.54477 872.07375 167.49219 892.99805 L 128.2207 933.49805 z M 788.03711 733.30859 L 788.03711 383.08594 L 884.67969 383.08594 L 884.67969 733.30859 L 788.03711 733.30859 z M -9.0605469 517.65625 C -0.34670559 391.30438 42.335805 282.37243 118.98047 190.85742 C 123.06101 195.71762 144.50076 217.93535 189.72656 263.94141 C 132.18332 335.43363 99.052766 420.00555 90.333984 517.65625 L -9.0605469 517.65625 z M 118.98047 190.85742 C 118.49847 190.28332 115.08964 186.78125 115.18164 186.78125 L 119.10352 190.70508 C 119.06152 190.75508 119.02242 190.80712 118.98047 190.85742 z M 788.03711 281.12891 L 788.03711 -69.095703 L 884.67969 -69.095703 L 884.67969 281.12891 L 788.03711 281.12891 z M 259.04102 190.70508 L 189.72656 121.39062 C 287.37586 38.563408 396.36181 -6.7753547 516.67969 -14.623047 L 516.67969 84.771484 C 423.38898 95.234574 337.50914 130.54644 259.04102 190.70508 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

41
srcs/special_font/157.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="57.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.39618502"
inkscape:cx="355.89432"
inkscape:cy="224.64252"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 794 1554 C 794 1522.6667 783.99998 1496.1667 764 1474.5 C 744.00002 1452.8333 720.3333 1442 693 1442 C 658.33336 1442 612.99994 1457.6667 557 1489 C 501.00006 1520.3333 454.33329 1536 417 1536 C 356.33339 1536 306.33329 1513.1667 267 1467.5 C 227.66671 1421.8333 208 1367.9999 208 1306 L 316 1280 C 316 1310.6667 325.66669 1336.8333 345 1358.5 C 364.33331 1380.1667 388.33336 1391 417 1391 C 450.99997 1391 493.66672 1375.5 545 1344.5 C 596.33328 1313.5 645.66672 1298 693 1298 C 752.99994 1298 802.83337 1319.6667 842.5 1363 C 882.16663 1406.3333 902 1459.3334 902 1522 L 794 1554 z M 788.03711 1185.2617 L 788.03711 835.03711 L 884.67969 835.03711 L 884.67969 1185.2617 L 788.03711 1185.2617 z M 516.67773 1130.791 C 398.97725 1122.9443 292.60757 1080.2217 197.57227 1002.625 L 194.95703 1005.2402 C 242.90983 956.4165 266.88672 931.5677 266.88672 930.69531 C 344.48294 990.85385 427.74847 1024.4216 516.67773 1031.3965 L 516.67773 1130.791 z M 121.71875 938.54297 L 127.9043 933.5957 L 125.64258 935.92773 L 121.71875 938.54297 z M 127.9043 933.5957 L 128.2207 933.26953 C 128.2327 933.28353 128.24581 933.2985 128.25781 933.3125 L 127.9043 933.5957 z M 128.2207 933.26953 C 48.031893 841.73457 2.2696387 735.37793 -9.0625 614.20703 L 90.332031 614.20703 C 101.66577 709.24044 137.41313 791.19736 197.57227 860.07422 C 197.57227 860.9466 187.54477 871.84523 167.49219 892.76953 L 128.2207 933.26953 z M 788.03711 733.08008 L 788.03711 382.85742 L 884.67969 382.85742 L 884.67969 733.08008 L 788.03711 733.08008 z M -9.0605469 517.42773 C -0.34670859 391.07586 42.335805 282.14391 118.98047 190.62891 C 123.06101 195.4891 144.50076 217.70684 189.72656 263.71289 C 132.18332 335.20512 99.052766 419.77703 90.333984 517.42773 L -9.0605469 517.42773 z M 118.98047 190.62891 C 118.49847 190.05481 115.08964 186.55273 115.18164 186.55273 L 119.10352 190.47656 C 119.06152 190.52656 119.02242 190.57861 118.98047 190.62891 z M 788.03711 280.90039 L 788.03711 -69.324219 L 884.67969 -69.324219 L 884.67969 280.90039 L 788.03711 280.90039 z M 259.04102 190.47656 L 189.72656 121.16211 C 287.37586 38.334892 396.36181 -7.0038703 516.67969 -14.851562 L 516.67969 84.542969 C 423.38903 95.006058 337.50914 130.31792 259.04102 190.47656 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

41
srcs/special_font/158.svg Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="58.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.45672531"
inkscape:cx="477.31097"
inkscape:cy="821.06244"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 211 1483 L 211 1283 L 430 1283 L 430 1483 L 211 1483 z M 681 1483 L 681 1283 L 900 1283 L 900 1483 L 681 1483 z M 788.03711 1185.3984 L 788.03711 835.17383 L 884.67969 835.17383 L 884.67969 1185.3984 L 788.03711 1185.3984 z M 516.67773 1130.9277 C 398.97725 1123.081 292.60757 1080.3584 197.57227 1002.7617 L 194.95703 1005.377 C 242.90983 956.55322 266.88672 931.70442 266.88672 930.83203 C 344.48294 990.99057 427.74847 1024.5583 516.67773 1031.5332 L 516.67773 1130.9277 z M 121.71875 938.67969 L 127.9043 933.73242 L 125.64258 936.06445 L 121.71875 938.67969 z M 127.9043 933.73242 L 128.2207 933.40625 C 128.2327 933.42025 128.24581 933.43522 128.25781 933.44922 L 127.9043 933.73242 z M 128.2207 933.40625 C 48.031893 841.87129 2.2696387 735.51465 -9.0625 614.34375 L 90.332031 614.34375 C 101.66577 709.37715 137.41313 791.33408 197.57227 860.21094 C 197.57227 861.08332 187.54477 871.98195 167.49219 892.90625 L 128.2207 933.40625 z M 788.03711 733.2168 L 788.03711 382.99414 L 884.67969 382.99414 L 884.67969 733.2168 L 788.03711 733.2168 z M -9.0605469 517.56445 C -0.34670859 391.21258 42.335805 282.28063 118.98047 190.76562 C 123.06101 195.62582 144.50076 217.84356 189.72656 263.84961 C 132.18332 335.34184 99.052766 419.91375 90.333984 517.56445 L -9.0605469 517.56445 z M 118.98047 190.76562 C 118.49847 190.19153 115.08964 186.68945 115.18164 186.68945 L 119.10352 190.61328 C 119.06152 190.66328 119.02242 190.71533 118.98047 190.76562 z M 788.03711 281.03711 L 788.03711 -69.1875 L 884.67969 -69.1875 L 884.67969 281.03711 L 788.03711 281.03711 z M 259.04102 190.61328 L 189.72656 121.29883 C 287.37586 38.471611 396.36181 -6.8671516 516.67969 -14.714844 L 516.67969 84.679688 C 423.38903 95.142777 337.50914 130.45464 259.04102 190.61328 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

39
srcs/special_font/159.svg Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="59.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.46013612"
inkscape:cx="608.51559"
inkscape:cy="660.67407"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 788.03711 1185.4375 L 788.03711 835.21289 L 884.67969 835.21289 L 884.67969 1185.4375 L 788.03711 1185.4375 z M 516.67773 1130.9668 C 398.97725 1123.1201 292.60757 1080.3975 197.57227 1002.8008 L 194.95703 1005.416 C 242.90983 956.59228 266.88672 931.74348 266.88672 930.87109 C 344.48294 991.02963 427.74847 1024.5974 516.67773 1031.5723 L 516.67773 1130.9668 z M 121.71875 938.71875 L 127.9043 933.77148 L 125.64258 936.10352 L 121.71875 938.71875 z M 127.9043 933.77148 L 128.2207 933.44531 C 128.2327 933.45931 128.24581 933.47428 128.25781 933.48828 L 127.9043 933.77148 z M 128.2207 933.44531 C 48.031893 841.91036 2.2696387 735.55369 -9.0625 614.38281 L 90.332031 614.38281 C 101.66577 709.41622 137.41313 791.37317 197.57227 860.25 C 197.57227 861.1224 187.54477 872.02103 167.49219 892.94531 L 128.2207 933.44531 z M 788.03711 733.25586 L 788.03711 383.0332 L 884.67969 383.0332 L 884.67969 733.25586 L 788.03711 733.25586 z M -9.0605469 517.60352 C -0.34670859 391.25164 42.335805 282.3197 118.98047 190.80469 C 123.06101 195.66488 144.50076 217.88262 189.72656 263.88867 C 132.18332 335.3809 99.052766 419.95281 90.333984 517.60352 L -9.0605469 517.60352 z M 118.98047 190.80469 C 118.49847 190.23059 115.08964 186.72852 115.18164 186.72852 L 119.10352 190.65234 C 119.06152 190.70234 119.02242 190.75439 118.98047 190.80469 z M 788.03711 281.07617 L 788.03711 -14.900391 C 764.18598 -32.716589 743.96402 -51.406452 727.5 -71 C 687.16671 -118.99995 667 -169.66672 667 -223 C 667 -288.99993 687.16671 -340.33337 727.5 -377 C 767.83329 -413.66663 819.66673 -432 883 -432 C 922.99996 -432 957.50003 -427.83332 986.5 -419.5 C 1015.5 -411.16668 1042 -400.66666 1066 -388 L 1033 -265 C 1015.6667 -272.33332 999.33331 -278.50001 984 -283.5 C 968.66669 -288.49999 951.99998 -291 934 -291 C 900.00003 -291 875.49999 -282.99998 860.5 -267 C 845.50001 -251.00002 838 -228.99997 838 -201 C 838 -165.00004 851.1667 -131.16664 877.5 -99.5 C 903.8333 -67.833365 940.33338 -34.666632 987 0 L 915 57 C 904.55355 52.39369 894.45123 47.70424 884.67969 42.935547 L 884.67969 281.07617 L 788.03711 281.07617 z M 259.04102 190.65234 L 189.72656 121.33789 C 287.37586 38.510673 396.36181 -6.8280891 516.67969 -14.675781 L 516.67969 84.71875 C 423.38903 95.18184 337.50914 130.4937 259.04102 190.65234 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

40
srcs/special_font/15A.svg Normal file
View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="5A.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.37732464"
inkscape:cx="-129.86165"
inkscape:cy="667.85991"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 430 1484 L 430 1283 L 648 1283 L 648 1484 L 430 1484 z M 788.03711 1185.416 L 788.03711 835.19141 L 884.67969 835.19141 L 884.67969 1185.416 L 788.03711 1185.416 z M 516.67773 1130.9453 C 398.97652 1123.0986 292.60817 1080.3765 197.57227 1002.7793 L 194.95703 1005.3945 C 242.91011 956.57037 266.88672 931.722 266.88672 930.84961 C 344.48341 991.00851 427.74788 1024.5759 516.67773 1031.5508 L 516.67773 1130.9453 z M 121.71875 938.69727 L 127.9043 933.75 L 125.64258 936.08203 L 121.71875 938.69727 z M 127.9043 933.75 L 128.2207 933.42383 C 128.23324 933.43814 128.24527 933.45248 128.25781 933.4668 L 127.9043 933.75 z M 128.2207 933.42383 C 48.031429 841.88827 2.2697163 735.53293 -9.0625 614.36133 L 90.332031 614.36133 C 101.66582 709.39523 137.4128 791.35125 197.57227 860.22852 C 197.57227 861.10091 187.5449 871.99938 167.49219 892.92383 L 128.2207 933.42383 z M 788.03711 733.23438 L 788.03711 383.01172 L 884.67969 383.01172 L 884.67969 733.23438 L 788.03711 733.23438 z M -9.0605469 517.58203 C -0.34660748 391.22954 42.335356 282.29867 118.98047 190.7832 C 123.06106 195.64351 144.50052 217.86093 189.72656 263.86719 C 132.18302 335.35979 99.052776 419.9308 90.333984 517.58203 L -9.0605469 517.58203 z M 118.98047 190.7832 C 118.49846 190.20909 115.08955 186.70703 115.18164 186.70703 L 119.10352 190.63086 C 119.06141 190.6811 119.02256 190.73295 118.98047 190.7832 z M 788.03711 281.05469 L 788.03711 -69.169922 L 884.67969 -69.169922 L 884.67969 281.05469 L 788.03711 281.05469 z M 259.04102 190.63086 L 189.72656 121.31641 C 287.37646 38.488822 396.36114 -6.8496068 516.67969 -14.697266 L 516.67969 84.697266 C 423.38845 95.160388 337.50961 130.47205 259.04102 190.63086 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

39
srcs/special_font/15B.svg Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 1184 2048"
id="svg1"
sodipodi:docname="5B.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.58198807"
inkscape:cx="-51.547448"
inkscape:cy="554.99419"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 530 1545 L 346 1279 L 503 1279 L 743 1540 L 741 1545 L 530 1545 z M 856 1545 L 615 1284 L 617 1279 L 788 1279 L 1088 1539 L 1085 1545 L 856 1545 z M 788.03711 1185.6328 L 788.03711 835.4082 L 884.67969 835.4082 L 884.67969 1185.6328 L 788.03711 1185.6328 z M 516.67773 1131.1621 C 398.97665 1123.3154 292.60807 1080.5932 197.57227 1002.9961 L 194.95703 1005.6113 C 242.91008 956.78728 266.88672 931.93881 266.88672 931.06641 C 344.48334 991.22525 427.74802 1024.7927 516.67773 1031.7676 L 516.67773 1131.1621 z M 121.71875 938.91406 L 127.9043 933.9668 L 125.64258 936.29883 L 121.71875 938.91406 z M 127.9043 933.9668 L 128.2207 933.64062 C 128.2327 933.65462 128.24581 933.66959 128.25781 933.68359 L 127.9043 933.9668 z M 128.2207 933.64062 C 48.031483 842.10519 2.2696887 735.7496 -9.0625 614.57812 L 90.332031 614.57812 C 101.66582 709.61193 137.41283 791.56811 197.57227 860.44531 C 197.57227 861.3177 187.54487 872.2162 167.49219 893.14062 L 128.2207 933.64062 z M 788.03711 733.45117 L 788.03711 383.22852 L 884.67969 383.22852 L 884.67969 733.45117 L 788.03711 733.45117 z M -9.0605469 517.79883 C -0.34665559 391.44635 42.335445 282.51541 118.98047 191 C 123.06106 195.8603 144.50051 218.07773 189.72656 264.08398 C 132.18302 335.57651 99.052776 420.14763 90.333984 517.79883 L -9.0605469 517.79883 z M 118.98047 191 C 118.49847 190.4259 115.08964 186.92383 115.18164 186.92383 L 119.10352 190.84766 C 119.06152 190.89766 119.02247 190.9497 118.98047 191 z M 788.03711 281.27148 L 788.03711 -68.953125 L 884.67969 -68.953125 L 884.67969 281.27148 L 788.03711 281.27148 z M 259.04102 190.84766 L 189.72656 121.5332 C 287.37636 38.705686 396.36121 -6.6327766 516.67969 -14.480469 L 516.67969 84.914062 C 423.38858 95.377152 337.50954 130.68882 259.04102 190.84766 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

35
srcs/special_font/15C.svg Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 2068 2048"
id="svg1"
sodipodi:docname="5C.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.35727934"
inkscape:cx="487.01389"
inkscape:cy="1116.7732"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 859 327 L 847.23828 350.84375 L 788.03711 350.84375 L 788.03711 470.84766 L 332.91602 1393.4121 C 307.63186 1379.6959 282.94923 1363.9585 259.04102 1345.6289 L 189.72656 1414.9434 C 221.4138 1441.8208 254.31629 1464.6838 288.39062 1483.666 L 195.91211 1671.127 L 325 1671 L 395.0625 1528.9902 C 434.23639 1540.8294 474.75335 1548.2224 516.67969 1550.957 L 516.67969 1451.5625 C 490.70085 1448.6488 465.35862 1443.6034 440.5293 1436.8359 L 803.53125 701.06836 L 884.67969 701.06836 L 884.67969 536.58789 L 988.02539 327.11719 L 859 327 z M 516.67773 405.31445 C 398.97685 413.16115 292.60797 455.88345 197.57227 533.48047 L 194.95703 530.86523 C 242.91008 579.68919 266.88672 604.53776 266.88672 605.41016 C 344.48324 545.25142 427.74812 511.68388 516.67773 504.70898 L 516.67773 405.31445 z M 121.71875 597.5625 L 127.9043 602.50977 L 125.64258 600.17773 L 121.71875 597.5625 z M 127.9043 602.50977 L 128.2207 602.83594 C 128.2327 602.82194 128.24581 602.80697 128.25781 602.79297 L 127.9043 602.50977 z M 128.2207 602.83594 C 48.031583 694.37125 2.2696887 800.72706 -9.0625 921.89844 L 90.332031 921.89844 C 101.66582 826.86473 137.41283 744.90838 197.57227 676.03125 C 197.57227 675.15885 187.54487 664.26032 167.49219 643.33594 L 128.2207 602.83594 z M 788.03711 803.02539 L 788.03711 1153.248 L 884.67969 1153.248 L 884.67969 803.02539 L 788.03711 803.02539 z M -9.0605469 1018.6777 C -0.34675559 1145.0301 42.335445 1253.9613 118.98047 1345.4766 C 123.06106 1340.6163 144.50051 1318.3988 189.72656 1272.3926 C 132.18302 1200.9001 99.052776 1116.3288 90.333984 1018.6777 L -9.0605469 1018.6777 z M 118.98047 1345.4766 C 118.49847 1346.0507 115.08964 1349.5527 115.18164 1349.5527 L 119.10352 1345.6289 C 119.06152 1345.5789 119.02247 1345.5269 118.98047 1345.4766 z M 788.03711 1255.2051 L 788.03711 1605.4297 L 884.67969 1605.4297 L 884.67969 1255.2051 L 788.03711 1255.2051 z " />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

35
srcs/special_font/15D.svg Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 2068 2048"
id="svg1"
sodipodi:docname="5D.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.62756232"
inkscape:cx="627.8261"
inkscape:cy="640.57383"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 648.50391 102.80469 C 665.95442 139.28078 695.10226 173.54949 735.94922 205.61133 L 197.83203 205.61133 L 197.83203 242.91797 L 735.94922 242.91797 C 695.29759 275.16974 666.14976 309.56907 648.50391 346.11523 L 687.38281 346.11523 C 737.74609 294.33536 807.73007 256.89125 897.33398 233.7832 L 897.33398 215.13672 C 807.59067 192.08467 737.60669 154.64057 687.38281 102.80469 L 648.50391 102.80469 z M 788.03711 350.66797 L 788.03711 700.89258 L 884.67969 700.89258 L 884.67969 350.66797 L 788.03711 350.66797 z M 516.67773 405.13867 C 398.97677 412.98536 292.60797 455.70767 197.57227 533.30469 L 194.95703 530.68945 C 242.91003 579.51342 266.88672 604.36198 266.88672 605.23438 C 344.48326 545.0756 427.74811 511.5081 516.67773 504.5332 L 516.67773 405.13867 z M 121.71875 597.38672 L 127.9043 602.33398 L 125.64258 600.00195 L 121.71875 597.38672 z M 127.9043 602.33398 L 128.2207 602.66016 C 128.2327 602.64616 128.24581 602.63119 128.25781 602.61719 L 127.9043 602.33398 z M 128.2207 602.66016 C 48.031563 694.19549 2.2696777 800.5513 -9.0625 921.72266 L 90.332031 921.72266 C 101.66581 826.68894 137.41289 744.7326 197.57227 675.85547 C 197.57227 674.98308 187.54485 664.08456 167.49219 643.16016 L 128.2207 602.66016 z M 788.03711 802.84961 L 788.03711 1153.0723 L 884.67969 1153.0723 L 884.67969 802.84961 L 788.03711 802.84961 z M -9.0605469 1018.502 C -0.34666459 1144.8543 42.335515 1253.7855 118.98047 1345.3008 C 123.06105 1340.4405 144.50056 1318.2231 189.72656 1272.2168 C 132.18308 1200.7244 99.052776 1116.1531 90.333984 1018.502 L -9.0605469 1018.502 z M 118.98047 1345.3008 C 118.49847 1345.8749 115.08964 1349.377 115.18164 1349.377 L 119.10352 1345.4531 C 119.06152 1345.4031 119.02242 1345.3511 118.98047 1345.3008 z M 788.03711 1255.0293 L 788.03711 1605.2539 L 884.67969 1605.2539 L 884.67969 1255.0293 L 788.03711 1255.0293 z M 259.04102 1345.4531 L 189.72656 1414.7676 C 287.37626 1497.595 396.36133 1542.9336 516.67969 1550.7812 L 516.67969 1451.3867 C 423.38867 1440.9236 337.50946 1405.612 259.04102 1345.4531 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

39
srcs/special_font/15E.svg Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-20 0 1168 2048"
id="svg1"
sodipodi:docname="5E.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.40851537"
inkscape:cx="851.86512"
inkscape:cy="670.72139"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<g
transform="matrix(1 0 0 -1 0 1536)"
id="g1">
<path
id="path1"
d="M 282 1496 C 282 1416.0001 309.66673 1351.3333 365 1302 C 420.33327 1252.6667 492.66676 1228 582 1228 C 671.33324 1228 743.50005 1252.5 798.5 1301.5 C 853.49995 1350.5 881 1415.3334 881 1496 L 731 1496 C 731 1448.6667 717.8333 1412 691.5 1386 C 665.1667 1360 628.66662 1347 582 1347 C 533.33338 1347 496.3333 1360.1667 471 1386.5 C 445.6667 1412.8333 433 1449.3333 433 1496 L 282 1496 z M 788.03711 1185.3828 L 788.03711 835.1582 L 884.67969 835.1582 L 884.67969 1185.3828 L 788.03711 1185.3828 z M 516.67773 1130.9121 C 398.97677 1123.0654 292.60797 1080.3431 197.57227 1002.7461 L 194.95703 1005.3613 C 242.91003 956.53736 266.88672 931.68881 266.88672 930.81641 C 344.48326 990.97519 427.74811 1024.5427 516.67773 1031.5176 L 516.67773 1130.9121 z M 121.71875 938.66406 L 127.9043 933.7168 L 125.64258 936.04883 L 121.71875 938.66406 z M 127.9043 933.7168 L 128.2207 933.39062 C 128.2327 933.40462 128.24581 933.41959 128.25781 933.43359 L 127.9043 933.7168 z M 128.2207 933.39062 C 48.031566 841.85529 2.2696787 735.49948 -9.0625 614.32812 L 90.332031 614.32812 C 101.66581 709.36184 137.41289 791.31818 197.57227 860.19531 C 197.57227 861.0677 187.54485 871.96623 167.49219 892.89062 L 128.2207 933.39062 z M 788.03711 733.20117 L 788.03711 382.97852 L 884.67969 382.97852 L 884.67969 733.20117 L 788.03711 733.20117 z M -9.0605469 517.54883 C -0.34666559 391.19645 42.33552 282.26531 118.98047 190.75 C 123.06105 195.6103 144.50056 217.82773 189.72656 263.83398 C 132.18308 335.32641 99.052768 419.89773 90.333984 517.54883 L -9.0605469 517.54883 z M 118.98047 190.75 C 118.49847 190.1759 115.08964 186.67383 115.18164 186.67383 L 119.10352 190.59766 C 119.06152 190.64766 119.02242 190.6997 118.98047 190.75 z M 788.03711 281.02148 L 788.03711 -69.203125 L 884.67969 -69.203125 L 884.67969 281.02148 L 788.03711 281.02148 z M 259.04102 190.59766 L 189.72656 121.2832 C 287.37626 38.455786 396.36133 -6.8827766 516.67969 -14.730469 L 516.67969 84.664062 C 423.38867 95.127152 337.50946 130.43882 259.04102 190.59766 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

35
srcs/special_font/15F.svg Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="-55 0 2103 2048"
id="svg1"
sodipodi:docname="5F.combining.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.25394675"
inkscape:cx="-94.508002"
inkscape:cy="1764.1494"
inkscape:window-width="2736"
inkscape:window-height="1744"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 787.98633 350.56836 L 787.98633 700.79297 L 884.62891 700.79297 L 884.62891 350.56836 L 787.98633 350.56836 z M 516.62695 405.03906 C 398.92614 412.88575 292.55709 455.60816 197.52148 533.20508 L 194.90625 530.58984 C 242.8592 579.41373 266.83594 604.26237 266.83594 605.13477 C 344.4324 544.97605 427.69745 511.40849 516.62695 504.43359 L 516.62695 405.03906 z M 121.66797 597.28711 L 127.85352 602.23438 L 125.5918 599.90234 L 121.66797 597.28711 z M 127.85352 602.23438 L 128.16992 602.56055 C 128.18192 602.54655 128.19503 602.53158 128.20703 602.51758 L 127.85352 602.23438 z M 128.16992 602.56055 C 81.861876 655.42086 47.107033 713.25568 23.761719 776 L -45 776 L -45 926 L 787.98633 926 L 787.98633 1152.9727 L 884.62891 1152.9727 L 884.62891 926 L 1180 926 L 1180 776 L 131.81445 776 C 148.94241 740.02777 170.65788 706.51229 197.52148 675.75586 C 197.52148 674.88347 187.49405 663.98492 167.44141 643.06055 L 128.16992 602.56055 z M -9.1113281 1018.4023 C -0.39745673 1144.7546 42.284816 1253.686 118.92969 1345.2012 C 123.01026 1340.3409 144.44983 1318.1234 189.67578 1272.1172 C 132.13236 1200.6249 99.001984 1116.0533 90.283203 1018.4023 L -9.1113281 1018.4023 z M 118.92969 1345.2012 C 118.44769 1345.7753 115.03886 1349.2773 115.13086 1349.2773 L 119.05273 1345.3535 C 119.01073 1345.3035 118.97164 1345.2515 118.92969 1345.2012 z M 787.98633 1254.9297 L 787.98633 1605.1543 L 884.62891 1605.1543 L 884.62891 1254.9297 L 787.98633 1254.9297 z M 258.99023 1345.3535 L 189.67578 1414.668 C 287.32538 1497.4953 396.31066 1542.8339 516.62891 1550.6816 L 516.62891 1451.2871 C 423.33797 1440.824 337.4586 1405.5124 258.99023 1345.3535 z " />
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

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