Compare commits

...

243 Commits

Author SHA1 Message Date
Patrick Goldinger
fac7dde5f3 Release v0.3.11-beta01 2021-04-13 15:48:40 +02:00
Patrick Goldinger
e9ef11f2fb Update translations from Crowdin 2021-04-13 15:38:59 +02:00
Patrick Goldinger
068768fc05 Improve haptic feedback experience (#138, #324, #610) 2021-04-13 15:30:36 +02:00
Patrick Goldinger
a00e9e1a68 Fix TextInputManager glide post effect status (#249) 2021-04-13 00:48:46 +02:00
Patrick Goldinger
22a3b07fe5 Merge pull request #634 from majso/patch-2
Update of SK layout
2021-04-13 00:18:00 +02:00
Patrick Goldinger
27959b7d29 Fix Persian half-space for URI (#249) 2021-04-13 00:09:02 +02:00
majso
b8e49674bb Update of SK layout
- adding ä character
2021-04-12 20:46:14 +02:00
Patrick Goldinger
2534601116 Improve French popups (#615) 2021-04-12 20:10:43 +02:00
Patrick Goldinger
5426a0e5fb Add Undo, Redo and Cycle keyboard mode gestures (#215) 2021-04-12 19:55:21 +02:00
Patrick Goldinger
41e91410e7 Fix space bar up gesture (#627, #545) 2021-04-12 19:01:10 +02:00
Patrick Goldinger
3be3be8e9d Merge pull request #625 from X-yl/gesture-typing
Some gesture typing enhancements
2021-04-12 18:24:06 +02:00
Patrick Goldinger
1e7deebd23 Merge pull request #600 from Glitchy-Tozier/patch-1
Make version more generic so that it doesn't seem out of date.
2021-04-12 18:14:08 +02:00
Patrick Goldinger
a3aef0de31 Merge pull request #622 from stefan-misik/central-european-layouts
Add Central European layouts (SK and CZ (CS))
2021-04-12 18:10:06 +02:00
Patrick Goldinger
8933a03c3b Merge pull request #585 from 33kk/master
Move hard sign to extended popup in Russian layout, add Ukrainian layout
2021-04-12 18:03:29 +02:00
x-yl
a8df9892c2 Change github workflows back 2021-04-12 18:15:40 +04:00
x-yl
6414f94bd0 Space for numbers also 2021-04-12 17:41:01 +04:00
x-yl
7fb4c9ba00 Exceptions to space rules for some symbol 2021-04-12 17:34:42 +04:00
x-yl
a7fe421661 Cache word data
Temp fix while dictionaries aren't working yet.
2021-04-12 17:32:34 +04:00
x-yl
4cecbc4d5e make glide trail length customizable 2021-04-12 17:32:34 +04:00
x-yl
829fcbf468 Don't initialize gesture detector in theme preview 2021-04-12 17:32:34 +04:00
x-yl
00d0f778d2 Set correct time for glide typing suggestions 2021-04-12 17:32:34 +04:00
X-yl
22c35b7e99 Use historical X/Y as well 2021-04-12 17:32:34 +04:00
x-yl
87fa236d1e Return only one gesture if there are no loops 2021-04-12 17:32:33 +04:00
x-yl
158f2d33ae make distance threshold dynamic 2021-04-12 17:32:33 +04:00
Štefan Mišík
e55be5ca03 Add Central European layouts (SK and CZ (CS))
Add Slovak and Czech layouts.
2021-04-12 11:37:49 +02:00
Patrick Goldinger
b3413535f7 Fix popup position for rtl mode (#536) 2021-04-11 12:43:09 +02:00
Patrick Goldinger
21cabe1d92 Display clipboard row in numeric/phone input fields (#603) 2021-04-11 12:16:24 +02:00
Glitchy-Tozier
c6a30b1905 Update bug_report.md 2021-04-10 19:05:13 +02:00
Patrick Goldinger
9fa702fde7 Merge pull request #609 from florisboard/adaptive-theme-glide-trail
Improve adaptive theme for capslock and glide trail
2021-04-10 17:47:58 +02:00
Patrick Goldinger
9bd2b80949 Improve adaptive theme for capslock and glide trail (#591) 2021-04-10 17:43:09 +02:00
Patrick Goldinger
0e91003a68 Merge pull request #608 from florisboard/fix-glide-logic
Fix glide logic in TextInputManager
2021-04-10 17:23:39 +02:00
Patrick Goldinger
e42f69cc2e Fix glide logic in TextInputManager (#581, #595, #604) 2021-04-10 16:28:15 +02:00
Glitchy-Tozier
f6045a5c4f Make version more generic so that it doesn't seem out of date.
I'm torn between a big `x` and a small one.
2021-04-09 17:34:00 +02:00
Patrick Goldinger
a8213d2e2a Release v0.3.10 2021-04-08 20:37:35 +02:00
Patrick Goldinger
a88e04c8f3 Merge pull request #580 from UltimateOmega/Improve-Persian-popup-for-آ
Improve Persian popup (آ)
2021-04-07 23:45:56 +02:00
Marko
d3240c9db5 Move hard sign to extended popup in Russian layout, add Ukrainian 2021-04-07 16:22:24 +03:00
UltimateOmega
3dde47710d Improve Persian popup for آ
With this rearrange, when Accent is prioritized in hinted symbols, آ is the first option in the popup.
آ is one of the most used alphabets in Persian language.
2021-04-07 09:55:30 +04:30
Patrick Goldinger
36229136ec Release v0.3.10-beta06 2021-04-06 23:59:00 +02:00
Patrick Goldinger
00424055b5 Update translations from Crowdin 2021-04-06 23:41:10 +02:00
Patrick Goldinger
cba5a756f8 Merge pull request #578 from florisboard/improve-fa-popups
Improve Persian popups
2021-04-06 23:34:31 +02:00
Patrick Goldinger
fc401359a7 Improve Persian popups 2021-04-06 23:29:44 +02:00
Patrick Goldinger
546dad8b71 Merge pull request #576 from X-yl/master
Fix #571: Set paste key enabled when attached
2021-04-06 20:16:47 +02:00
Patrick Goldinger
b30e3b8093 Update CONTRIBUTING.md for new layout+config system 2021-04-06 01:25:33 +02:00
Patrick Goldinger
b415afe6e4 Add funding info (#257) 2021-04-06 00:56:08 +02:00
Patrick Goldinger
b69be1ab46 Merge pull request #575 from florisboard/combining-diacritical-marks
Add support for proper display of Combining Diacritical Marks
2021-04-05 20:07:14 +02:00
Patrick Goldinger
c5cf8efe82 Add support for proper display of Combining Diacritical Marks 2021-04-05 19:48:16 +02:00
x-yl
ae0ec65ce0 Fix #571: Set paste key enabled when attached 2021-04-05 21:08:30 +04:00
Patrick Goldinger
7ac3e45b34 Adjust ckb default subtype for eastern symbol layouts (#565) 2021-04-05 18:02:43 +02:00
Patrick Goldinger
5a71793f1a Merge PR #530 manually 2021-04-05 17:57:29 +02:00
Patrick Goldinger
ed040ca49b Resolve merge conflicts and adapt config.json for Kurdí layouts 2021-04-05 17:55:49 +02:00
Patrick Goldinger
c0f90a7ea4 Merge pull request #544 from X-yl/gesture-typing
Implement gesture typing
2021-04-05 16:21:05 +02:00
x-yl
2d9651da8c Make preview refresh delay be less ridiculous
A range of 50ms-1500ms was just kinda comical.
2021-04-05 15:20:43 +04:00
x-yl
9f5a126c1f Cancel gesture properly 2021-04-05 14:53:22 +04:00
x-yl
182e6c58e1 Simplify GlideTypingGesture by only tracking a single touch 2021-04-05 14:53:03 +04:00
x-yl
c7b36829df Don't cancel gesture when tapping on keys 2021-04-05 08:58:45 +04:00
Patrick Goldinger
790fd16682 Merge pull request #560 from Huy-Ngo/ipa
Add IPA keyboard layout
2021-04-04 18:54:08 +02:00
Patrick Goldinger
a2c9699c7e Merge pull request #539 from GabiK65/GabiK65-patch
Some cleanup in hungarian layout
2021-04-04 17:59:27 +02:00
Patrick Goldinger
fff8e7dab9 Merge branch 'master' into GabiK65-patch 2021-04-04 17:58:49 +02:00
Ngô Ngọc Đức Huy
9887f38b4f Rearrange symbol keys 2021-04-04 22:17:50 +07:00
x-yl
b5c2acb328 make GlideTypingClassifier work with KeyView instead of KeyData 2021-04-04 18:51:55 +04:00
x-yl
6469324572 minor fixes 2021-04-04 18:50:28 +04:00
Ngô Ngọc Đức Huy
6227e6d1a9 Add IPA symbols 2021-04-04 21:43:38 +07:00
Patrick Goldinger
80bfe03c0b Merge pull request #556 from Mahmoudk1000/master
Qwertz German layout
2021-04-03 22:31:24 +02:00
mahmoudk1000
8a82bc713b qwertz german layout 2021-04-03 17:06:31 +02:00
GoRaN
e3137db9b4 Update kurdish_standard.json 2021-04-03 17:21:57 +03:00
GoRaN
35d351c596 Update kurdish_standard.json 2021-04-03 17:21:32 +03:00
GoRaN
2163eacfbe Update kurdish_kurmanci.json
Added the Label name :)
2021-04-03 17:18:14 +03:00
x-yl
798f449cc1 Switch back to strings because char arrays broke it 2021-04-03 15:25:44 +04:00
Patrick Goldinger
0d2d560950 Merge pull request #564 from florisboard/fix-number-row-not-showing
Fix number row not displaying on characters
2021-04-03 12:33:36 +02:00
Patrick Goldinger
a4e31d0f50 Fix number row not displaying on characters (#563) 2021-04-03 12:16:04 +02:00
x-yl
96d2043ed8 Fix merge conflicts.. 2021-04-03 13:51:25 +04:00
Ngô Ngọc Đức Huy
5b3033c6da Add some modifiers 2021-04-03 16:50:16 +07:00
Ngô Ngọc Đức Huy
50b1f65f18 Remove Shift keys 2021-04-03 16:50:16 +07:00
Ngô Ngọc Đức Huy
56058d2c4b Fix JSON 2021-04-03 16:50:16 +07:00
Ngô Ngọc Đức Huy
aeb10293c6 Add IPA keyboard layout
Not all symbols are mapped yet.
2021-04-03 16:50:10 +07:00
x-yl
7132ac2479 Reduce memory usage (by a lot)
Switched out every String for a CharArray. Also got rid of the ideal
gesture cache. It had a minimal impact on performance and was taking up
a ridiculous amount of memory.
2021-04-03 12:46:46 +04:00
x-yl
d688549310 Have multiple possible ideal gestures.
This allows for words with double letters to be typed without adding a
loop, while still allowing words like feel and fell to be
differentiated.
2021-04-03 08:25:47 +04:00
x-yl
a763d38304 change multithreading lock logic 2021-04-03 07:46:08 +04:00
Patrick Goldinger
62eb97cd16 Release v0.3.10-beta05 2021-04-03 04:03:41 +02:00
Patrick Goldinger
6813616355 Fix number layout not reliably showing up (#532) 2021-04-03 03:32:55 +02:00
Patrick Goldinger
ee2d574f46 Merge pull request #562 from florisboard/suggestions-ui-bug-fixing
Suggestions UI bug fixing / minor improvements
2021-04-03 03:25:22 +02:00
Patrick Goldinger
945a57d6d8 Fix dynamic width display mode not filling in suggestions (#533) 2021-04-03 03:13:56 +02:00
Patrick Goldinger
e62ba9d156 Add auto-hide clipboard suggestion after usage (#538) 2021-04-03 02:54:30 +02:00
Patrick Goldinger
d3a4136050 Fix content provider authority clash for different tracks (#535) 2021-04-03 02:44:43 +02:00
Patrick Goldinger
7a6d95e250 Merge PR #529 manually 2021-04-03 02:24:15 +02:00
Patrick Goldinger
6fe585a7aa Resolve merge conflicts 2021-04-03 02:16:50 +02:00
Patrick Goldinger
7b25381850 Merge pull request #561 from florisboard/subtype-specific-layouts
Add subtype specific symobol / numeric layouts & currency sets
2021-04-03 01:41:54 +02:00
Patrick Goldinger
409922c3e9 Fix old subtype pref remaining causing crash 2021-04-02 19:40:55 +02:00
Patrick Goldinger
2acabf9c4a Polish UI of subtype add/edit dialog 2021-04-02 19:22:55 +02:00
X-yl
61f7abf43d Merge branch 'master' into gesture-typing 2021-04-02 21:21:58 +04:00
Patrick Goldinger
d29c753c6d Add arabic & persian symbol layouts 2021-04-02 19:10:06 +02:00
Patrick Goldinger
f25e20714c Add subtype specific currency sets 2021-04-02 18:16:26 +02:00
x-yl
2fdec33b1f Improve performance, bugfix
Increased default preview time, and added options to adjust it.
Reduced number of points on the gesture drawn.
Fixed some teeny tiny bugs which caused gesture typing to not work.
2021-04-02 17:59:57 +04:00
x-yl
64f5aea163 Fixed bug where sometimes gestures didn't work 2021-04-02 15:09:57 +04:00
x-yl
847ed1041b Made glide trail themeable 2021-04-02 12:02:58 +04:00
x-yl
74cca0bc4c Added trail fade 2021-04-02 10:02:43 +04:00
x-yl
534dd0a594 Fix case issues 2021-04-02 08:27:51 +04:00
x-yl
f84612ed75 Fix crash on non english layouts 2021-04-02 08:04:38 +04:00
x-yl
9b2b2c06e5 another hacky suggestion fix 2021-04-01 19:15:08 +04:00
x-yl
cf1c18aa70 Small suggestion bugfix 2021-04-01 17:00:54 +04:00
x-yl
418b012550 Fix bug in one handed and landscape mode 2021-04-01 16:45:21 +04:00
x-yl
af4016db43 Minor bug fixes
1. gesture suggestions don't clear after you pressed space
2. space was inserted before word when gesture typing on new line
2021-04-01 16:01:00 +04:00
x-yl
efbda2a758 Removed unnecessary change 2021-04-01 15:39:33 +04:00
x-yl
a7028d4c62 Minor pref fix 2021-04-01 15:36:43 +04:00
x-yl
fd272faebd Remove debug logging, some docs 2021-04-01 15:20:31 +04:00
x-yl
a0cbf65f24 One handed and landscape support 2021-04-01 15:11:34 +04:00
x-yl
1a4a3eb07d Docs 2021-04-01 13:38:25 +04:00
x-yl
a24e626e00 Compatibility with swipe gestures 2021-04-01 13:38:24 +04:00
x-yl
1b86f519a0 Make preferences functional.
Minor changes: Added more points to trail so it looks smoother, some
caching, and made some stuff async.
2021-04-01 13:38:24 +04:00
x-yl
72d15f1dc1 Make preferences functional.
Minor changes: Added more points to trail so it looks smoother, some
caching, and made some stuff async.
2021-04-01 11:50:12 +04:00
Patrick Goldinger
c53a6847fe Add Eastern Arabic and Persian number row 2021-04-01 01:15:05 +02:00
x-yl
a41c1b3493 Fixed issue where nothing was entered when typing quickly 2021-03-31 18:35:15 +04:00
x-yl
dd03bb1ca2 Make naming consistent 2021-03-31 18:26:06 +04:00
x-yl
a9519ceca1 Delete word when gliding 2021-03-31 18:24:13 +04:00
x-yl
ddc72042a1 Integrate suggestions 2021-03-31 18:14:17 +04:00
x-yl
a95b2a23df begin work on integrating with suggestions 2021-03-31 16:36:25 +04:00
x-yl
99187c808d Refactoring for clarity 2021-03-31 15:34:46 +04:00
x-yl
653f34cb3b Show suggestions & performance improvements
Show suggestions while gesturing. Also performance improvements like
implementing a cache, and limiting the trail size
2021-03-31 13:54:35 +04:00
x-yl
08eeea4eb4 Visual improvements
Improved the way trails look by using circles instead of lines.
2021-03-31 10:58:23 +04:00
x-yl
7477e573a5 Bug fixes
Namely, a crash that occured when a word starts and end on the same
letter (due to incorrect behaviour of resample) and also an issue where
gestures weren't reset while typing
2021-03-31 10:17:01 +04:00
x-yl
720a47920f performance improvements 2021-03-31 10:15:49 +04:00
GabiK65
d686f6f5a8 Update hu.json 2021-03-31 01:48:34 +02:00
GabiK65
c382f0bbf8 Update hungarian.json 2021-03-31 01:42:12 +02:00
Patrick Goldinger
2790052e9b Adapt existing layout files & IME config to new syntax 2021-03-31 01:28:20 +02:00
Patrick Goldinger
218a057110 Add base for subtype specific options for all layouts 2021-03-31 01:27:43 +02:00
x-yl
27e6d58ffc Revert back to old resampling method.
Seems like my method (i.e dynamically sample instead of create a whole new gesture)
has an issue with it.
2021-03-30 17:54:32 +04:00
x-yl
4c2c993f3f Added full dictionary (broken commit) 2021-03-30 16:49:54 +04:00
x-yl
faca221699 Prettied up the trail effect 2021-03-30 13:56:17 +04:00
x-yl
f4d8bdbf0f Light refactoring.
Moved Gesture to be part of StatisticalGestureTypingClassifier, cleaned
up some initialization code.
2021-03-30 13:24:59 +04:00
BinFlush
aa909d3135 Update fo.json 2021-03-30 09:30:56 +02:00
Goran Gharib
cdf5a566c6 Fix and correction on Kurdish layout
fixed the popup extended words
2021-03-30 04:43:43 +03:00
Goran Gharib
807b99ae51 Added new kurdish layouts
Added new kurdish kurmanci layout with kurdish standard layout with some correction of current layout.
2021-03-30 04:35:04 +03:00
Jakup Lutzen
d93f09078e added faroese layout 2021-03-30 01:18:03 +02:00
x-yl
cc12798a87 Naive port of the gesturing algorithm. 2021-03-29 18:21:24 +04:00
Patrick Goldinger
02b1a1d278 Merge pull request #512 from icyphox/workman-layout
Add the Workman keyboard layout
2021-03-29 15:54:49 +02:00
Patrick Goldinger
d978cdf845 Fix code of "L" key 2021-03-29 15:49:23 +02:00
Patrick Goldinger
b2ec115505 Release v0.3.10-beta04 2021-03-29 14:46:14 +02:00
x-yl
d5c0b11dbe Tweak gesture detection 2021-03-29 12:08:51 +04:00
x-yl
2a8ba07040 Unrelated change but seeing it basically reimplement Math.atan2 was just so sad. 2021-03-29 08:23:38 +04:00
Anirudh Oppiliappan
f8c9a52be5 Fix Unicode code points 2021-03-29 08:31:06 +05:30
Patrick Goldinger
670e6ca5e1 Fix emoji ABC button not leading back to characters (#521) 2021-03-29 02:55:23 +02:00
Patrick Goldinger
f2403d00e5 Add long-press caps-lock activation vibration (#523) 2021-03-29 02:46:46 +02:00
Patrick Goldinger
224d3e00e3 Merge pull request #518 from florisboard/fix-popup-width-landscape
Adjust popups in landscape mode
2021-03-28 19:47:40 +02:00
Patrick Goldinger
e89a374ce0 Adjust popup width in landscape (#504) 2021-03-28 19:35:43 +02:00
Patrick Goldinger
538e2dd9a2 Merge pull request #514 from florisboard/suggestions-phase2-frontend
Suggestions frontend rework
2021-03-28 19:15:37 +02:00
Patrick Goldinger
1d3d85c211 Fix crash for image clipboard suggestions 2021-03-28 19:08:49 +02:00
Patrick Goldinger
d6121baca9 Polish and document candidate view 2021-03-28 18:16:59 +02:00
x-yl
d6f5789659 Utilize gesture class 2021-03-28 18:09:48 +04:00
x-yl
e7b7df6987 Added Gesture class 2021-03-28 18:09:25 +04:00
Patrick Goldinger
8c0337d6c9 Fix suggestions not resetting when switching apps (#429) 2021-03-27 19:53:51 +01:00
Patrick Goldinger
563a4a919d Add new candidate+clipboard suggestion view (#38, #424, #425, #426) 2021-03-27 19:45:53 +01:00
Anirudh Oppiliappan
7d6666f7f3 Add the Workman keyboard layout 2021-03-27 20:22:12 +05:30
Patrick Goldinger
2f0d607d02 Potential fix for #484 2021-03-24 20:20:01 +01:00
Patrick Goldinger
65ae6c2b66 Merge pull request #491 from X-yl/clipboard-stuff
Fix for #481
2021-03-24 19:21:33 +01:00
x-yl
14513ec0f1 kotlin-ify 2021-03-24 18:07:07 +04:00
x-yl
3c58144a3d fix #481 2021-03-24 17:52:12 +04:00
Patrick Goldinger
d65b706f78 Release v0.3.10-beta03 2021-03-23 20:00:49 +01:00
Patrick Goldinger
9d820677db Update translations from Crowdin 2021-03-23 19:50:06 +01:00
Patrick Goldinger
69c52c00f6 Fix Ž key not available in Dvorak/Serbian (#381) 2021-03-23 19:43:41 +01:00
Patrick Goldinger
c8cf256577 Merge pull request #488 from florisboard/turkish-layouts
Add Turkish-Q / Turkish-F layouts
2021-03-23 14:35:11 +01:00
Patrick Goldinger
386a0999c4 Add Turkish-Q / Turkish-F layouts (#182) 2021-03-23 14:07:42 +01:00
Patrick Goldinger
d4ef2ea827 Merge pull request #486 from Netscaping/patch-1
Create gboard_night.json
2021-03-22 15:28:11 +01:00
Patrick Goldinger
381ec68e6c Merge pull request #482 from florisboard/rework-symbols-sizing
Rework symbols sizing when number row is enabled
2021-03-22 15:18:40 +01:00
Netscaping
a5706167b2 Create gboard_night.json
Since there is a Gboard Day theme I added the night version.
2021-03-22 15:17:46 +01:00
Patrick Goldinger
660871d6c8 Rework symbols sizing when number row is enabled 2021-03-22 00:55:47 +01:00
Patrick Goldinger
6607ad1739 Fix language selector size for keyboard height greater than 125% 2021-03-22 00:01:56 +01:00
Patrick Goldinger
55c1bc05f2 Add auto-switching to characters in symbols (#347) 2021-03-21 19:12:10 +01:00
Patrick Goldinger
7eb7f0ef80 Release v0.3.10-beta02 2021-03-19 19:42:08 +01:00
Patrick Goldinger
78e5e417ce Update README.md to include new beta track 2021-03-19 18:49:40 +01:00
Patrick Goldinger
ffbf7f8ea7 Merge pull request #454 from X-yl/clipboard-stuff
Added support for private clipboard and clipboard history
2021-03-19 17:49:16 +01:00
Patrick Goldinger
27cc4897c3 Merge pull request #479 from florisboard/fix-import-theme-crash
Fix import theme crash for big files
2021-03-19 17:18:49 +01:00
Patrick Goldinger
e5111a8efe Fix import theme crash for big files (#465) 2021-03-19 17:04:48 +01:00
Patrick Goldinger
80fd5ca84a Add beta metadata 2021-03-19 00:57:11 +01:00
x-yl
e8f2c6ce74 fix bug when history size is reduced 2021-03-18 23:21:50 +04:00
x-yl
5676cbf18e Stupid telegram, not using ContentResolver... smh 2021-03-18 17:50:48 +04:00
x-yl
2bdaea6189 revoke URI permissions, support API <25 2021-03-18 17:10:28 +04:00
Patrick Goldinger
da2287a739 Fix symbols layouts applying the caps state once again (#298) 2021-03-17 23:29:58 +01:00
Patrick Goldinger
3fafe0fac8 Release v0.3.10-beta01 2021-03-17 14:48:31 +01:00
x-yl
86042bb1e1 make popup buttons extend to the edge of popup 2021-03-17 15:30:22 +04:00
x-yl
c99673ff1d mime type fixes, remove from history after pressing delete 2021-03-17 15:20:12 +04:00
x-yl
8b89b27fb0 Misc. fixes 2021-03-17 10:57:56 +04:00
x-yl
b56c976fa0 code cleanup 2021-03-17 10:26:22 +04:00
x-yl
08889fdc60 docs 2021-03-17 10:20:21 +04:00
x-yl
e8d657e81c free storage after images leave clipboard 2021-03-17 09:38:03 +04:00
Patrick Goldinger
e581d6cbc4 Release v0.3.9 2021-03-16 20:15:45 +01:00
Patrick Goldinger
ec13d008fb Fix Greek uppercase bug (#452) 2021-03-16 20:03:51 +01:00
Patrick Goldinger
edfea1afcb Merge pull request #461 from florisboard/metadata-refresh
App Store presence metadata update
2021-03-16 16:45:10 +01:00
Patrick Goldinger
25fc23d721 Update store presence metadata to represent all implemented features 2021-03-16 16:34:54 +01:00
x-yl
bfcea8b718 Make pins persistent 2021-03-16 18:58:14 +04:00
Patrick Goldinger
c701141be2 Remove Italian store metadata 2021-03-16 15:15:04 +01:00
x-yl
7f07686b6c added proper mime type support to content provider 2021-03-16 16:38:01 +04:00
Patrick Goldinger
e5b956857e Merge pull request #459 from florisboard/beta-track-prep
Beta track preperation / App icon revamp
2021-03-16 11:53:12 +01:00
Patrick Goldinger
67236ef58d Add beta build variant 2021-03-16 03:17:34 +01:00
Patrick Goldinger
2da17a0654 Add new app icons for all build variants 2021-03-16 03:16:56 +01:00
Patrick Goldinger
1f3221a886 Merge pull request #457 from florisboard/one-handed-improvements
Add one-handed width option / Improve one-handed code
2021-03-15 20:13:02 +01:00
Patrick Goldinger
47f80d00c4 Add one-handed width option / Improve one-handed code 2021-03-15 17:49:18 +01:00
x-yl
e4ecc63b9d Added an abstraction around ClipData 2021-03-15 15:12:30 +04:00
Patrick Goldinger
d648c480b5 Merge pull request #455 from florisboard/theme-import-export
Add theme import/export / Fix theme editor jumping to top
2021-03-15 09:33:18 +01:00
Patrick Goldinger
9e26720674 Fix export UI not requesting to create document 2021-03-15 01:51:11 +01:00
Patrick Goldinger
a20c6bf148 Fix theme editor jumping to top (#379) 2021-03-15 00:57:35 +01:00
Patrick Goldinger
d2df5cfcdf Switch to Kotlin Result 2021-03-15 00:08:10 +01:00
Patrick Goldinger
93b5503dfc Fix file write bug and improve UI 2021-03-14 23:39:57 +01:00
Patrick Goldinger
4d4b54074a Improve import/export feature stability 2021-03-14 19:44:13 +01:00
Patrick Goldinger
904fd9b85a Add simple theme import/export functionality 2021-03-14 02:15:47 +01:00
x-yl
aacb33bd5d fixed issue when floris clipboard is disabled 2021-03-13 20:46:27 +04:00
x-yl
a0aa446988 Change back button 2021-03-13 18:06:10 +04:00
x-yl
fe086ed6d8 removed some debug logging 2021-03-13 17:39:11 +04:00
x-yl
64ddd0f421 fixed a stupid bug somehow 2021-03-13 17:35:35 +04:00
x-yl
40fe72e33c fix a few bugs 2021-03-13 14:55:58 +04:00
x-yl
b229970ec3 cleanup and documentation 2021-03-13 13:04:34 +04:00
x-yl
ec32c211f1 added delete and paste. pretty much feature complete now. 2021-03-12 23:39:23 +04:00
x-yl
e66b8a052a Pin/unpin support 2021-03-12 22:18:40 +04:00
x-yl
4a22c2698c added more ways to open clipboard context, fixed popups, refactored some code 2021-03-12 21:50:24 +04:00
x-yl
ae95bbd7c4 Added a mock popup 2021-03-11 18:03:08 +04:00
x-yl
0bdeeaa340 VERY work in progress 2021-03-11 10:24:40 +04:00
x-yl
92a885a34c Little bit of preference stuff 2021-03-11 10:24:35 +04:00
x-yl
bc2f03a920 light refactoring, some theme stuff 2021-03-11 10:24:26 +04:00
x-yl
f60827b634 small theme fix 2021-03-11 10:23:59 +04:00
x-yl
dcf81b27a0 Fixed animations, added image support, some documentation 2021-03-11 10:23:59 +04:00
x-yl
0d8601cb15 Text-only clipboard history implemented 2021-03-11 10:23:59 +04:00
x-yl
ecf3c6bf27 All clipboard actions now use FlorisClipboardManager. Added support for commiting non-text content. Added simple clipboard history layout. 2021-03-11 10:23:46 +04:00
Patrick Goldinger
e4f5fcf74b Merge pull request #451 from florisboard/alternate-shift-code
Add option for an alternate key code when caps state is active
2021-03-10 23:15:19 +01:00
Patrick Goldinger
15f0316839 Add shift variants for Colemak and Dvorak (#145) 2021-03-10 19:38:11 +01:00
Patrick Goldinger
93654c4f88 Add alternate key code option for FlorisKeyData (#145) 2021-03-10 19:37:50 +01:00
Patrick Goldinger
62fc549ea9 Fix crash on setup when no other IME is installed (#423) 2021-03-10 18:37:27 +01:00
Patrick Goldinger
d0dbd1cd4e Merge pull request #444 from florisboard/input-logic-rework
Input logic rework
2021-03-10 16:08:10 +01:00
Patrick Goldinger
af28f84b69 Fix delete precise char selection init value always 2 units (#448) 2021-03-10 12:09:18 +01:00
Patrick Goldinger
db7ee52029 Fix label text size decreasing bug in selection keyboard 2021-03-10 11:59:51 +01:00
Patrick Goldinger
7343617792 Fix space bar arrow movement initial count always 2 (#448) 2021-03-10 11:31:23 +01:00
Patrick Goldinger
5898d7006b Add internal batch edit level to prevent stuttering UI 2021-03-09 20:17:30 +01:00
Patrick Goldinger
058be7a169 Fix editor instance commit text logic 2021-03-09 02:03:17 +01:00
Patrick Goldinger
e6f2a25021 Improve input event logic / Fix extended popup bug 2021-03-08 19:51:37 +01:00
Patrick Goldinger
3a485a1574 Fix bugs and improve code 2021-03-08 01:09:43 +01:00
Patrick Goldinger
0ee0f24119 Add shift slide behavior / Improve performance of input logic 2021-03-07 19:35:08 +01:00
Patrick Goldinger
004e999259 Document InputEventDispatcher 2021-03-07 16:26:45 +01:00
Patrick Goldinger
11775c4619 Separate input event dispatcher logic into another file 2021-03-07 15:27:20 +01:00
Patrick Goldinger
177bad95b3 Clean up static KeyData object definitions 2021-03-06 19:33:53 +01:00
Patrick Goldinger
610526d845 Add multi-pointer support for gestures 2021-03-06 14:19:30 +01:00
Patrick Goldinger
55e489bc07 Complete overhaul of core input logic 2021-03-05 20:13:35 +01:00
Patrick Goldinger
589063be61 Rework cursor/selection implementation 2021-03-03 23:43:27 +01:00
Patrick Goldinger
aa73ac706a Update target SDK to API 30 (Android 11) 2021-03-01 20:13:59 +01:00
Goran Gharib
5c83583149 Merge branch 'master' of https://github.com/kurdikeyboard/florisboard 2021-02-15 04:20:47 +03:00
Goran Gharib
0fb73ece9a Update README.md
Added Kurdish language to the list of Non-latin characters into readme file.
2021-02-15 04:20:40 +03:00
337 changed files with 12291 additions and 2275 deletions

View File

@@ -11,3 +11,7 @@ trim_trailing_whitespace = true
[{*.har,*.json}]
indent_size = 2
[*.kt]
ij_kotlin_name_count_to_use_star_import = 99
ij_kotlin_name_count_to_use_star_import_for_members = 99

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
github: [patrickgold]
custom: ["https://paypal.me/devpatrickgold", "https://explorer.bitcoin.com/btc/address/1GKPJuRTZbVM7L8Kd3wtrqzc259Sjmoh9x"]

View File

@@ -25,7 +25,7 @@ Describe the bug in a short but concise way.
4. See error
#### Environment information
- FlorisBoard Version: <!-- e.g. 0.3.6 -->
- FlorisBoard Version: <!-- e.g. 0.X.X -->
- Install Source: <!-- Google PlayStore/F-Droid/GitHub/? -->
- Device: <!-- e.g. OnePlus 7T -->
- Android version, ROM: <!-- e.g. 10, Stock -->

View File

@@ -9,7 +9,10 @@ provides some general guidelines for each type of contribution.
Either use the review function within Google Play or email me at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I
love to hear from you!
love to hear from you! Note, that the amount of feedback emails I get
is overwhelmingly high - so if I don't answer or answer really late, I
apologize - I guarantee though that I read through every email and that
I will use every feedback to improve FlorisBoard :)
## Translations
@@ -30,23 +33,52 @@ enables both you and the dev team that we are on the same page before
you start on working on your change. If you have any questions, feel
free to ask for help at any time!
## Adding a new keyboard layout / dictionary for locale
## Adding a new keyboard layout
You can now officially add layouts to FlorisBoard as described below.
FlorisBoard's core has stabilized enough that adding new content is
safe, although there will be some changes in the future.
Adding a layout to FlorisBoard is very simple and does not require any
coding skills, although you should understand the basics of the JSON
syntax (it is very easy though by just looking at some other layout files).
There are two main steps in adding new layouts, though the config step can
be skipped if you only add a layout without a new default language support.
Currently you need to modify `app/src/main/assets/ime/config.json` to
add the filename of the language/layout to the `characterLayouts`
section and the `defaultSubtypes` section, making sure to include
the language's IETF BCP 47 code ([ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
and [ISO 3166-1 region code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)).
For example, Dutch as spoken in Belgium is `nl-be`. Use a unique value
for `id` to avoid possible crahses caused by duplicate ids.
### The config file (`app/src/main/assets/ime/config.json`)
Add the keyboard layout at `app/src/main/assets/ime/text/characters/<preferredLayout_name_here>.json`,
with `code` referring to the characters codepoint and `label` being the
respective unicode character.
This file is very important, as it defines all default currency sets as
well as all default subtypes available in the Settings Subtype UI. Note
that you don't have to modify this file if you add a layout for an already
pre-configured language.
- `currencySets`: This is a list of all currency sets, which can be chosen
for each subtype. If you consider adding a new one, make sure that the
first currency symbol matches the name of the currency set and also
ensure that you have exactly 6 currency symbols. This is important as the
symbol layouts have exactly 6 slots available to fill these defined
currency symbols in.
- `defaultSubtyes`: This is a list of all pre-made subtypes. Each time the
user selects a language in the `Subtype Add`-dialog, all options configured
here will get pre-selected. The language tag must adhere to the IETF BCP
47 code ([ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
and [ISO 3166-1 region code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)).
For example, Dutch as spoken in Belgium is `nl-be`. Use a unique value
for `id` to avoid possible crashes caused by duplicate ids.
### Adding the layout
Since v0.3.10-beta05 it is possible to add custom layouts for all types.
To add a new layout, head to `app/src/main/assets/ime/text` and then select
the correct sub-directory for the type of layout you want to add. In most cases
this will be `characters` to add a layout like QWERTY etc.
For the `code` field of each key, make sure to use the UTF-8 code. An
useful tool for finding the correct code is [unicode-table.com](https://unicode-table.com/en/).
From there, you search for your letter and then use the HTML code, but without the `&#;`
For internal codes of functional or UI keys, see
`app/src/main/java/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt`.
The label is equally important and should always match up with the defined
code. If `code` and `label` don't match up, FlorisBoard won't crash but
it will most likely lead to confusion in the key processing logic.
Any accents or diacritics that should be exposed via long press can be
added at `assets/ime/text/characters/extended_popups/<languageTag_name_here>.json`.
@@ -56,12 +88,21 @@ you add. The main field is used for determining if a hint or an accent
should take priority, so please make sure to leave main empty and just
use relevant for accents which are not-so important.
For popups of non-`characters` layout, simply add the popup directly to
each key via the `popup` field.
## Adding a new dictionary for a language
Currently the suggestions implementation is highly experimental and will
get a major if not complete rework, so dictionaries are currently not
accepted.
## Bug reporting
This kind of contribution is the most important, as it tells where
FlorisBoard has flaws and thus should be improved to maximize stability
and user experience. To make this process as smooth as possible, please
use the premade [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
use the pre-made [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
for bug reporting. This makes it easy for us to understand what the bug
is and how to solve it.
@@ -73,3 +114,10 @@ preferred way to capture logs.
Alternatively, you can also use ADB (Android Debug Bridge) to capture
the error log. This is recommended for experienced users only.
## Donating
If none of the above options are feasible for you but you still want to
show your support, you can also buy me a coffee, so I can stay up all night
and chase away bugs or add new cool stuff :)
See the `Sponsors` button for available options!

View File

@@ -1,14 +1,15 @@
<img align="left" width="80" height="80"
src="fastlane/metadata/android/en-US/images/icon.png" alt="App icon">
# FlorisBoard [![Release](https://img.shields.io/github/v/release/florisboard/florisboard)](https://github.com/florisboard/florisboard/releases) [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.patrickgold.dev) ![FlorisBoard CI](https://github.com/florisboard/florisboard/workflows/FlorisBoard%20CI/badge.svg?event=push)
# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.patrickgold.dev) ![FlorisBoard CI](https://github.com/florisboard/florisboard/workflows/FlorisBoard%20CI/badge.svg?event=push)
**FlorisBoard** is a free and open-source keyboard for Android 6.0+
devices. It aims at being modern, user-friendly and customizable while
fully respecting your privacy. Currently in alpha/early-beta state.
fully respecting your privacy. Currently in early-beta state.
## Public Alpha Test Programme
Wanna try it out on your device? Use one of the following options:
### Stable [![Latest stable release](https://img.shields.io/github/v/release/florisboard/florisboard)](https://github.com/florisboard/florisboard/releases/latest)
Releases on this track are in general stable and ready for everyday use, except for features marked as experimental. Use one of the following options to receive FlorisBoard's stable releases:
_A. Get it on F-Droid_:
@@ -36,6 +37,16 @@ for and download FlorisBoard without prior joining the alpha group.
_C. Use the APK provided in the release section of this repo_
### Beta [![Latest beta release](https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases)](https://github.com/florisboard/florisboard/releases)
Releases on this track are also in general stable and should be ready for everyday use, though crashes and bugs are more likely to occur. Use releases from this track if you want to get new features faster and give feedback for brand-new stuff. Options to get beta releases:
_A. IzzySoft's repo for F-Droid_:
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" height="64" alt="IzzySoft repo badge">](https://apt.izzysoft.de/fdroid/index/apk/dev.patrickgold.florisboard.beta)
_B. Use the APK provided in the release section of this repo_
### Giving feedback
If you want to give feedback to FlorisBoard, there are several ways to
do so, as listed [here](CONTRIBUTING.md#giving-general-feedback).
@@ -62,11 +73,9 @@ milestones, please refer to the [Feature roadmap](#feature-roadmap).
* [x] Landscape orientation support (needs tweaks)
### Layouts
* [x] Latin character layouts (QWERTY, QWERTZ, AZERTY, Swiss, Spanish,
Norwegian, Swedish/Finnish, Icelandic, Danish, Hungarian,
Croatian, Polish, Romanian, Colemak, Dvorak); more coming in future versions
* [x] Non-latin character layouts (Arabic, Persian, Greek, Russian
(JCUKEN))
* [x] Latin character layouts (QWERTY, QWERTZ, AZERTY, Swiss, Spanish, Norwegian, Swedish/Finnish, Icelandic, Danish,
Hungarian, Croatian, Polish, Romanian, Colemak, Dvorak, Turkish-Q, Turkish-F, ...)
* [x] Non-latin character layouts (Arabic, Persian, Kurdish, Greek, Russian (JCUKEN))
* [x] Adapt to situation in app (password, url, text, etc. )
* [x] Special character layout(s)
* [x] Numeric layout
@@ -88,6 +97,7 @@ milestones, please refer to the [Feature roadmap](#feature-roadmap).
### Other useful features
* [x] One-handed mode
* [x] Clipboard/cursor tools
* [x] Clipboard manager/history
* [x] Integrated number row / symbols in character layouts
* [x] Gesture support
* [x] Full integration in IME service list of Android (xml/method)
@@ -138,6 +148,7 @@ close as possible.
and `Follow time`)
- Define a separate theme both for day and night theme
- Adapt to app theme if possible
- Theme import/export
### [v0.5.0](https://github.com/florisboard/florisboard/milestone/5)
There's no exact roadmap yet but it is planned that the media part of
@@ -150,7 +161,6 @@ passes...
Backlog (currently not assigned to any milestone):
- Theme import/export
- Floating keyboard
[#91]: https://github.com/florisboard/florisboard/pull/91
@@ -179,8 +189,6 @@ to get more information on this topic.
[Jared Rummler](https://github.com/jaredrummler)
* [Timber](https://github.com/JakeWharton/timber) by
[JakeWharton](https://github.com/JakeWharton)
* [kotlin-result](https://github.com/michaelbull/kotlin-result) by
[Michael Bull](https://github.com/michaelbull)
* [expandable-fab](https://github.com/nambicompany/expandable-fab) by
[Nambi](https://github.com/nambicompany)

View File

@@ -1,11 +1,13 @@
plugins {
id("com.android.application") version "4.1.2"
kotlin("android") version "1.4.30"
kotlin("kapt") version "1.4.30"
}
android {
compileSdkVersion(29)
buildToolsVersion("29.0.2")
compileSdkVersion(30)
buildToolsVersion("30.0.3")
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -20,9 +22,9 @@ android {
defaultConfig {
applicationId = "dev.patrickgold.florisboard"
minSdkVersion(23)
targetSdkVersion(29)
versionCode(27)
versionName("0.3.8")
targetSdkVersion(30)
versionCode(36)
versionName("0.3.11")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
@@ -34,11 +36,29 @@ android {
buildTypes {
named("debug").configure {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round")
resValue("string", "floris_app_name", "FlorisBoard Debug")
}
create("beta") // Needed because by default the "beta" BuildType does not exist
named("beta").configure {
applicationIdSuffix = ".beta"
versionNameSuffix = "-beta01"
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_beta_round")
resValue("string", "floris_app_name", "FlorisBoard Beta")
}
named("release").configure {
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_release")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_release_round")
resValue("string", "floris_app_name", "@string/app_name")
}
}
@@ -54,11 +74,15 @@ android {
}
}
dependencies {
implementation("androidx.activity", "activity-ktx", "1.2.1")
implementation("androidx.appcompat", "appcompat", "1.2.0")
implementation("androidx.core", "core-ktx", "1.3.2")
implementation("androidx.fragment", "fragment-ktx", "1.3.0")
implementation("androidx.preference", "preference-ktx", "1.1.1")
implementation("androidx.constraintlayout", "constraintlayout", "2.0.4")
implementation("androidx.lifecycle", "lifecycle-service", "2.2.0")
implementation("com.google.android", "flexbox", "2.0.1") // requires jcenter as of version 2.0.1
implementation("com.squareup.moshi", "moshi-kotlin", "1.11.0")
implementation("com.squareup.moshi", "moshi-adapters", "1.11.0")
@@ -66,8 +90,9 @@ dependencies {
implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-android", "1.4.2")
implementation("com.jaredrummler", "colorpicker", "1.1.0")
implementation("com.jakewharton.timber", "timber", "4.7.1")
implementation("com.michael-bull.kotlin-result", "kotlin-result", "1.1.10")
implementation("com.nambimobile.widgets", "expandable-fab", "1.0.2")
implementation("androidx.room", "room-runtime", "2.2.6")
kapt("androidx.room", "room-compiler","2.2.6")
testImplementation("junit", "junit", "4.13.1")
testImplementation("org.mockito", "mockito-inline", "3.7.7")

View File

@@ -23,9 +23,9 @@
<application
android:name=".ime.core.FlorisApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/floris_app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:supportsRtl="true"
android:theme="@style/SettingsTheme">
@@ -46,19 +46,19 @@
<!-- Settings Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.SettingsMainActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:launchMode="singleTask"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:theme="@style/SettingsTheme"/>
<!-- Using an activity alias to disable/enable the app icon in the launcher -->
<activity-alias
android:name="dev.patrickgold.florisboard.SettingsLauncherAlias"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/floris_app_name"
android:launchMode="singleTask"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:targetActivity="dev.patrickgold.florisboard.setup.SetupActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@@ -69,48 +69,55 @@
<!-- Theme Selector Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.ThemeManagerActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:theme="@style/SettingsTheme"/>
<!-- Theme Editor Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.ThemeEditorActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__theme_editor__title"
android:theme="@style/SettingsTheme"/>
<!-- About Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.AboutActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/about__title"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:theme="@style/SettingsTheme"/>
<!-- Advanced Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.AdvancedActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__advanced__title"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:theme="@style/SettingsTheme"/>
<!-- Setup Activity -->
<activity
android:name="dev.patrickgold.florisboard.setup.SetupActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/setup__title"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/floris_app_icon_round"
android:theme="@style/SettingsTheme"/>
<!-- Crash Dialog Activity -->
<activity
android:name="dev.patrickgold.florisboard.crashutility.CrashDialogActivity"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/floris_app_icon"
android:label="@string/crash_dialog__title"
android:theme="@style/CrashDialogTheme"/>
<provider
android:name="dev.patrickgold.florisboard.ime.clip.provider.FlorisContentProvider"
android:authorities="${applicationId}.provider.clip"
android:grantUriPermissions="true"
android:exported="false">
</provider>
</application>
</manifest>

View File

@@ -1,225 +1,610 @@
{
"package": "dev.patrickgold.florisboard",
"characterLayouts": {
"qwerty": "QWERTY",
"qwertz": "QWERTZ",
"azerty": "AZERTY",
"bepo": "BÉPO",
"bulgarian_bds": "Bulgarian (BDS)",
"bulgarian_phonetic": "Bulgarian (Phonetic)",
"spanish": "Spanish (QWERTY)",
"norwegian": "Norwegian (QWERTY)",
"swedish_finnish": "Swedish/Finnish (QWERTY)",
"danish": "Danish (QWERTY)",
"icelandic": "Icelandic (QWERTY)",
"swiss_german": "Swiss German (QWERTZ)",
"swiss_french": "Swiss French (QWERTZ)",
"swiss_italian": "Swiss Italian (QWERTZ)",
"hungarian": "Hungarian (QWERTZ)",
"persian": "Persian",
"arabic": "Arabic",
"esperanto": "Esperanto",
"esperanto_with_hx": "Esperanto with 'ĥ'",
"colemak": "Colemak",
"dvorak": "Dvorak",
"jcuken_russian": "Russian (JCUKEN)",
"canadian_french": "Canadian French (QWERTY)",
"greek": "Ελληνικά",
"hebrew": "עברית",
"serbian_latin": "Serbian (QWERTZ)",
"serbian_cyrillic": "Serbian (ЉЊЕРТЗ)",
"kurdish": "کوردی"
},
"currencySets": [
{
"name": "azerbaijani_manat",
"label": "Azerbaijani manat (₼)",
"slots": [
{ "code": 8380, "label": "₼" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "bitcoin",
"label": "Bitcoin (₿)",
"slots": [
{ "code": 8383, "label": "₿" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "dollar",
"label": "Dollar ($)",
"slots": [
{ "code": 36, "label": "$" },
{ "code": 162, "label": "¢" },
{ "code": 8364, "label": "€" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" },
{ "code": 8369, "label": "₱" }
]
},
{
"name": "euro",
"label": "Euro (€)",
"slots": [
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 36, "label": "$" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" },
{ "code": 8369, "label": "₱" }
]
},
{
"name": "indian_rupee",
"label": "Indian rupee (₹)",
"slots": [
{ "code": 8377, "label": "₹" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "iranian_rial",
"label": "Iranian rial (﷼)",
"slots": [
{ "code":65020, "label": "﷼" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "israeli_new_shekel",
"label": "Israeli new shekel (₪)",
"slots": [
{ "code": 8362, "label": "₪" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "kazakhstani_tenge",
"label": "Kazakhstani tenge (₸)",
"slots": [
{ "code": 8380, "label": "₸" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "lao_kip",
"label": "Lao kip (₭)",
"slots": [
{ "code": 8365, "label": "₭" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "mongolian_togrog",
"label": "Mongolian tögrög (₮)",
"slots": [
{ "code": 8366, "label": "₮" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "nigerian_naira",
"label": "Nigerian naira (₦)",
"slots": [
{ "code": 8358, "label": "₦" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "pakistani_rupee",
"label": "Pakistani rupee (₨)",
"slots": [
{ "code": 8360, "label": "₨" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "paraguayan_guarani",
"label": "Paraguayan guaraní (₲)",
"slots": [
{ "code": 8370, "label": "₲" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "peso",
"label": "Peso (₱)",
"slots": [
{ "code": 8369, "label": "₱" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "pound",
"label": "Pound (£)",
"slots": [
{ "code": 163, "label": "£" },
{ "code": 162, "label": "¢" },
{ "code": 8364, "label": "€" },
{ "code": 36, "label": "$" },
{ "code": 165, "label": "¥" },
{ "code": 8369, "label": "₱" }
]
},
{
"name": "russian_ruble",
"label": "Russian ruble (₽)",
"slots": [
{ "code": 8381, "label": "₽" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "south_korean_won",
"label": "South Korean won (₩)",
"slots": [
{ "code": 8361, "label": "₩" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "turkish_lira",
"label": "Turkish lira (₺)",
"slots": [
{ "code": 8378, "label": "₺" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "ukrainian_hryvnia",
"label": "Ukrainian hryvnia (₴)",
"slots": [
{ "code": 8372, "label": "₴" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "yen",
"label": "Yen (¥)",
"slots": [
{ "code": 165, "label": "¥" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 8369, "label": "₱" }
]
}
],
"defaultSubtypes": [
{
"id": 101,
"languageTag": "en-US",
"preferredLayout": "qwerty"
"currencySet": "dollar",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 102,
"languageTag": "en-UK",
"preferredLayout": "qwerty"
"currencySet": "pound",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 103,
"languageTag": "en-CA",
"preferredLayout": "qwerty"
"currencySet": "dollar",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 104,
"languageTag": "en-AU",
"preferredLayout": "qwerty"
"currencySet": "dollar",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 201,
"languageTag": "de-DE",
"preferredLayout": "qwertz"
"currencySet": "euro",
"preferred": {
"characters": "qwertz"
}
},
{
"id": 202,
"languageTag": "de-AT",
"preferredLayout": "qwertz"
"currencySet": "euro",
"preferred": {
"characters": "qwertz"
}
},
{
"id": 203,
"languageTag": "de-CH",
"preferredLayout": "swiss_german"
"currencySet": "euro",
"preferred": {
"characters": "swiss_german"
}
},
{
"id": 301,
"languageTag": "fr-FR",
"preferredLayout": "azerty"
"currencySet": "euro",
"preferred": {
"characters": "azerty"
}
},
{
"id": 302,
"languageTag": "fr-CA",
"preferredLayout": "canadian_french"
"currencySet": "dollar",
"preferred": {
"characters": "canadian_french"
}
},
{
"id": 303,
"languageTag": "fr-CH",
"preferredLayout": "swiss_french"
"currencySet": "euro",
"preferred": {
"characters": "swiss_french"
}
},
{
"id": 401,
"languageTag": "it-IT",
"preferredLayout": "qwerty"
"currencySet": "euro",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 402,
"languageTag": "it-CH",
"preferredLayout": "swiss_italian"
"currencySet": "euro",
"preferred": {
"characters": "swiss_italian"
}
},
{
"id": 501,
"languageTag": "es-ES",
"preferredLayout": "spanish"
"currencySet": "euro",
"preferred": {
"characters": "spanish"
}
},
{
"id": 502,
"languageTag": "es-US",
"preferredLayout": "spanish"
"currencySet": "dollar",
"preferred": {
"characters": "spanish"
}
},
{
"id": 503,
"languageTag": "es-419",
"preferredLayout": "spanish"
"currencySet": "dollar",
"preferred": {
"characters": "spanish"
}
},
{
"id": 601,
"languageTag": "pt-PT",
"preferredLayout": "qwerty"
"currencySet": "euro",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 602,
"languageTag": "pt-BR",
"preferredLayout": "qwerty"
"currencySet": "dollar",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 701,
"languageTag": "nb-NO",
"preferredLayout": "norwegian"
"currencySet": "dollar",
"preferred": {
"characters": "norwegian"
}
},
{
"id": 702,
"languageTag": "nn-NO",
"preferredLayout": "norwegian"
"currencySet": "dollar",
"preferred": {
"characters": "norwegian"
}
},
{
"id": 711,
"languageTag": "sv-SE",
"preferredLayout": "swedish_finnish"
"currencySet": "dollar",
"preferred": {
"characters": "swedish_finnish"
}
},
{
"id": 721,
"languageTag": "fi-FI",
"preferredLayout": "swedish_finnish"
"currencySet": "euro",
"preferred": {
"characters": "swedish_finnish"
}
},
{
"id": 731,
"languageTag": "da-DK",
"preferredLayout": "danish"
"currencySet": "dollar",
"preferred": {
"characters": "danish"
}
},
{
"id": 741,
"languageTag": "is-IS",
"preferredLayout": "icelandic"
"currencySet": "dollar",
"preferred": {
"characters": "icelandic"
}
},
{
"id": 751,
"languageTag": "fo",
"currencySet": "dollar",
"preferred": {
"characters": "faroese"
}
},
{
"id": 801,
"languageTag": "fa-FA",
"preferredLayout": "persian"
"currencySet": "iranian_rial",
"preferred": {
"characters": "persian",
"symbols": "persian",
"symbols2": "persian",
"numericRow": "persian"
}
},
{
"id": 901,
"languageTag": "ar",
"preferredLayout": "arabic"
"currencySet": "dollar",
"preferred": {
"characters": "arabic",
"symbols": "eastern",
"symbols2": "eastern",
"numericRow": "eastern_arabic"
}
},
{
"id": 1001,
"languageTag": "hu",
"preferredLayout": "hungarian"
"currencySet": "euro",
"preferred": {
"characters": "hungarian"
}
},
{
"id": 1101,
"languageTag": "eo",
"preferredLayout": "esperanto"
"currencySet": "dollar",
"preferred": {
"characters": "esperanto"
}
},
{
"id": 1201,
"languageTag": "hr",
"preferredLayout": "qwertz"
"currencySet": "euro",
"preferred": {
"characters": "qwertz"
}
},
{
"id": 1301,
"languageTag": "ru",
"preferredLayout": "jcuken_russian"
"currencySet": "russian_ruble",
"preferred": {
"characters": "jcuken_russian"
}
},
{
"id": 1351,
"languageTag": "uk",
"currencySet": "ukrainian_hryvnia",
"preferred": {
"characters": "jcuken_ukrainian"
}
},
{
"id": 1401,
"languageTag": "el",
"preferredLayout": "greek"
"currencySet": "euro",
"preferred": {
"characters": "greek"
}
},
{
"id": 1501,
"languageTag": "ro",
"preferredLayout": "qwerty"
"currencySet": "euro",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 1601,
"languageTag": "pl",
"preferredLayout": "qwerty"
"currencySet": "euro",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 1701,
"languageTag": "bg-bg",
"preferredLayout": "bulgarian_phonetic"
"currencySet": "dollar",
"preferred": {
"characters": "bulgarian_phonetic"
}
},
{
"id": 1801,
"languageTag": "tr",
"preferredLayout": "qwerty"
"currencySet": "turkish_lira",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 1901,
"languageTag": "iw-IL",
"preferredLayout": "hebrew"
"currencySet": "israeli_new_shekel",
"preferred": {
"characters": "hebrew"
}
},
{
"id": 2001,
"languageTag": "ckb",
"preferredLayout": "kurdish"
"currencySet": "dollar",
"preferred": {
"characters": "kurdish",
"symbols": "eastern",
"symbols2": "eastern",
"numericRow": "eastern_arabic"
}
},
{
"id": 2101,
"languageTag": "sr-RS",
"preferredLayout": "serbian_cyrillic"
"currencySet": "dollar",
"preferred": {
"characters": "serbian_cyrillic"
}
},
{
"id": 2201,
"languageTag": "lv-LV",
"preferredLayout": "qwerty"
"currencySet": "euro",
"preferred": {
"characters": "qwerty"
}
},
{
"id": 2301,
"languageTag": "ku",
"currencySet": "dollar",
"preferred": {
"characters": "kurdish_kurmanci"
}
},
{
"id": 2601,
"languageTag": "IPA-IPA",
"currencySet": "dollar",
"preferred": {
"characters": "ipa",
"symbols": "ipa",
"symbols2": "ipa"
}
},
{
"id": 2701,
"languageTag": "sk",
"currencySet": "euro",
"preferred": {
"characters": "qwertz"
}
},
{
"id": 2801,
"languageTag": "cs",
"currencySet": "euro",
"preferred": {
"characters": "qwertz"
}
}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "arabic",
"label": "Arabic",
"authors": [ "HeiWiper" ],
"direction": "rtl",
"modifier": "arabic",

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "azerty",
"label": "AZERTY",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "bepo",
"label": "BÉPO",
"authors": [ "salamandar" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "bulgarian_bds",
"label": "Bulgarian (BDS)",
"authors": [ "iorvethe" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "bulgarian_phonetic",
"label": "Bulgarian (Phonetic)",
"authors": [ "iorvethe" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "canadian_french",
"label": "Canadian French (QWERTY)",
"authors": [ "The-Quantum-Alpha" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "colemak",
"label": "Colemak",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
@@ -18,7 +19,7 @@
"relevant": [
{ "code": 58, "label": ":" }
]
} }
}, "shift": { "code": 58, "label": ":" } }
],
[
{ "code": 97, "label": "a" },

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "danish",
"label": "Danish (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "dvorak",
"label": "Dvorak",
"authors": [ "patrickgold" ],
"direction": "ltr",
"modifier": "dvorak",
@@ -12,25 +13,25 @@
{ "code": 33, "label": "!" },
{ "code": 34, "label": "\"" }
]
} },
}, "shift": { "code": 34, "label": "\"" } },
{ "code": 39, "label": "'", "groupId": 101, "variation": "password", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 34, "label": "\"" }
]
} },
}, "shift": { "code": 34, "label": "\"" } },
{ "code": 47, "label": "/", "groupId": 101, "variation": "uri" },
{ "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 63, "label": "?" }
]
} },
}, "shift": { "code": 60, "label": "<" } },
{ "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 62, "label": ">" }
]
} },
}, "shift": { "code": 62, "label": ">" } },
{ "code": 112, "label": "p" },
{ "code": 121, "label": "y" },
{ "code": 102, "label": "f" },

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "esperanto",
"label": "Esperanto",
"authors": [ "jeremiah-miller", "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "esperanto_with_hx",
"label": "Esperanto with 'ĥ'",
"authors": [ "jeremiah-miller", "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -7,7 +7,8 @@
"~enter": {
"main": { "code": -213, "label": "switch_to_media_context", "type": "system_gui" },
"relevant": [
{ "code": -216, "label": "toggle_one_handed_mode_right", "type": "system_gui" }
{ "code": -216, "label": "toggle_one_handed_mode_right", "type": "system_gui" },
{ "code": -214, "label": "switch_to_clipboard_context", "type": "system_gui"}
]
},
"~left": {

View File

@@ -4,17 +4,8 @@
"authors": [ "GoRaN" ],
"mapping": {
"all": {
"ق": {
"relevant": [
{ "code": 1647, "label": "ٯ" }
]
},
"ئ": {
"relevant": [
{"code": 1569, "label": "ء" }
]
},
"ە": {
"": {
"relevant": [
{ "code": 1577, "label": "ة" },
{ "code": 1729, "label": "ـہ" }
@@ -26,45 +17,70 @@
{ "code": 1682, "label": "ڒ" }
]
},
"ف": {
"ی": {
"relevant": [
{ "code": 1701, "label": "ڥ" },
{ "code": 1698, "label": "ڢ" },
{ "code": 1700, "label": "ڤ" },
{ "code": 1697, "label": "ڡ" }
{ "code": 1746, "label": "ے" },
{ "code": 1610, "label": "ي" },
{ "code": 1744, "label": "ې" },
{ "code": 1741, "label": "ۍ" },
{ "code": 1742, "label": "ێ" },
{ "code": 1597, "label": "ؽ" }
]
},
"": {
"ﺋ": {
"relevant": [
{ "code": 65163, "label": "ﺋ" },
{ "code": 1569, "label": "ء" },
{ "code": 65139, "label": "ﹳ" }
]
},
"ع": {
"relevant": [
{ "code": 1551, "label": "؏" },
{ "code": 1594, "label": "غ" }
{ "code": 1551, "label": "؏" }
]
},
"ۆ": {
"relevant": [
{ "code": 1743, "label": "ۏ" },
{ "code": 1735, "label": "ۇ" },
{ "code": 1737, "label": "ۉ" },
{ "code": 1738, "label": "ۊ" },
{ "code": 1572, "label": "ؤ" },
{ "code": 1739, "label": "ۋ" }
]
},
"ف": {
"relevant": [
{ "code": 1701, "label": "ڥ" },
{ "code": 1700, "label": "ڤ" },
{ "code": 1698, "label": "ڢ" },
{ "code": 1697, "label": "ڡ" }
]
},
"د": {
"relevant": [
{ "code": 1676, "label": "ڌ" },
{ "code": 64390, "label": "ﮆ" },
{ "code": 1584, "label": "ذ" },
{ "code": 64390, "label": "ﮆ" },
{ "code": 1774, "label": "ۮ" }
]
},
"ه": {
"ھ": {
"relevant": [
{ "code": 1726, "label": "ھ" }
]
},
"خ": {
"relevant": [
{ "code": 1567, "label": "؟" }
]
},
"س": {
"relevant": [
{ "code": 1589, "label": "ص" }
@@ -110,42 +126,23 @@
{ "code": 1603, "label": "ك"}
]
},
"ی": {
"relevant": [
{ "code": 1746, "label": "ے" },
{ "code": 1610, "label": "ي" },
{ "code": 1744, "label": "ې" },
{ "code": 1741, "label": "ۍ" },
{ "code": 1742, "label": "ێ" },
{ "code": 1597, "label": "ؽ" }
]
},
"ۆ": {
"relevant": [
{ "code": 1743, "label": "ۏ" },
{ "code": 1735, "label": "ۇ" },
{ "code": 1737, "label": "ۉ" },
{ "code": 1738, "label": "ۊ" },
{ "code": 1572, "label": "ؤ" },
{ "code": 1739, "label": "ۋ" }
]
},
"~right": {
"main": { "code": 1567, "label": "؟" },
"relevant": [
{ "code": 1600, "label": "ــ" },
{ "code": 33, "label": "!" },
{ "code": 1548, "label": "،" },
{ "code": 44, "label": "," },
{ "code": 1549, "label": "؍" },
{ "code": 1563, "label": "؛" },
{ "code": 59, "label": ";" },
{ "code": 58, "label": ":" },
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#" },
{ "code": 42, "label": "*" },
{ "code": 1563, "label": "؛" },
{ "code": 59, "label": ";" },
{ "code": 58, "label": ":" },
{ "code": 44, "label": "," },
{ "code": 1549, "label": "؍" },
{ "code": 45, "label": "-" },
{ "code": 95, "label": "_" },
{ "code": 45, "label": "-" }
{ "code": 1600, "label": "" },
{ "code": 33, "label": "!" },
{ "code": 1548, "label": "،" }
]
}
},

View File

@@ -0,0 +1,115 @@
{
"type": "characters/extended_popups",
"name": "cs",
"authors": [ "stefan-misik" ],
"mapping": {
"all": {
"e": {
"relevant": [
{ "code": 283, "label": "ě" },
{ "code": 233, "label": "é" }
]
},
"r": {
"relevant": [
{ "code": 345, "label": "ř" },
{ "code": 341, "label": "ŕ" }
]
},
"t": {
"relevant": [
{ "code": 357, "label": "ť" }
]
},
"y": {
"relevant": [
{ "code": 253, "label": "ý" }
]
},
"u": {
"relevant": [
{ "code": 367, "label": "ů" },
{ "code": 250, "label": "ú" }
]
},
"i": {
"relevant": [
{ "code": 237, "label": "í" }
]
},
"o": {
"relevant": [
{ "code": 243, "label": "ó" },
{ "code": 244, "label": "ô" }
]
},
"a": {
"relevant": [
{ "code": 225, "label": "á" }
]
},
"s": {
"relevant": [
{ "code": 353, "label": "š" }
]
},
"d": {
"relevant": [
{ "code": 271, "label": "ď" }
]
},
"l": {
"relevant": [
{ "code": 318, "label": "ľ" },
{ "code": 314, "label": "ĺ" }
]
},
"z": {
"relevant": [
{ "code": 382, "label": "ž" }
]
},
"c": {
"relevant": [
{ "code": 269, "label": "č" }
]
},
"n": {
"relevant": [
{ "code": 328, "label": "ň" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".cz" },
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}
}

View File

@@ -4,69 +4,27 @@
"authors": [ "PHELAT" ],
"mapping": {
"all": {
"ض": {
"relevant": [
{ "code": 1777, "label": "۱" }
]
},
"ص": {
"relevant": [
{ "code": 1778, "label": "۲" }
]
},
"ث": {
"relevant": [
{ "code": 1779, "label": "۳" }
]
},
"ق": {
"relevant": [
{ "code": 1780, "label": "۴" }
]
},
"ف": {
"relevant": [
{ "code": 1781, "label": "۵" }
]
},
"غ": {
"relevant": [
{ "code": 1782, "label": "۶" }
]
},
"ع": {
"relevant": [
{ "code": 1783, "label": "۷" }
]
},
"ه": {
"relevant": [
{ "code": 1784, "label": "۸" }
]
},
"خ": {
"relevant": [
{ "code": 1785, "label": "۹" }
]
},
"ح": {
"relevant": [
{ "code": 1776, "label": "۰" }
]
},
"ی": {
"relevant": [
{ "code": 1574, "label": "ئ" },
{ "code": 1610, "label": "ي" }
{ "code": 1610, "label": "ي" },
{ "code": 1746, "label": "ے" }
]
},
"ا": {
"relevant": [
{ "code": 1570, "label": "آ" },
{ "code": 1649, "label": "ٱ" },
{ "code": 1569, "label": "ء" },
{ "code": 1571, "label": "أ" },
{ "code": 1573, "label": "إ" }
{ "code": 1573, "label": "إ" },
{ "code": 1570, "label": "آ" }
]
},
"ه": {
"relevant": [
{ "code": 1729, "label": "ہ" },
{ "code": 1728, "label": "ۀ" },
{ "code": 1726, "label": "ھ" }
]
},
"ت": {
@@ -76,8 +34,7 @@
},
"ک": {
"relevant": [
{ "code": 1706, "label": "ڪ"},
{ "code": 1603, "label": "ك" }
{ "code": 1706, "label": "ڪ"}
]
},
"ز": {
@@ -114,9 +71,9 @@
"main": { "code": -255, "label": ".ir"},
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".com" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}

View File

@@ -0,0 +1,138 @@
{
"type": "characters/extended_popups",
"name": "fo",
"authors": [ "BinFlush" ],
"mapping": {
"all": {
"a": {
"main": { "code": 225, "label": "á" },
"relevant": [
{ "code": 224, "label": "à" },
{ "code": 226, "label": "â" },
{ "code": 227, "label": "ã" },
{ "code": 257, "label": "ā" },
{ "code": 229, "label": "å" },
{ "code": 230, "label": "æ" },
{ "code": 228, "label": "ä" }
]
},
"e": {
"relevant": [
{ "code": 233, "label": "é" },
{ "code": 275, "label": "ē" },
{ "code": 281, "label": "ę" },
{ "code": 279, "label": "ė" },
{ "code": 232, "label": "è" },
{ "code": 235, "label": "ë" },
{ "code": 234, "label": "ê" }
]
},
"i": {
"main": { "code": 237, "label": "í" },
"relevant": [
{ "code": 299, "label": "ī" },
{ "code": 236, "label": "ì" },
{ "code": 303, "label": "į" },
{ "code": 238, "label": "î" },
{ "code": 239, "label": "ï" }
]
},
"l": {
"relevant": [
{ "code": 322, "label": "ł" }
]
},
"n": {
"relevant": [
{ "code": 241, "label": "ñ" },
{ "code": 324, "label": "ń" }
]
},
"o": {
"main": { "code": 243, "label": "ó" },
"relevant": [
{ "code": 248, "label": "ø" },
{ "code": 333, "label": "ō" },
{ "code": 339, "label": "œ" },
{ "code": 242, "label": "ò" },
{ "code": 245, "label": "õ" },
{ "code": 244, "label": "ô" },
{ "code": 246, "label": "ö" }
]
},
"t": {
"relevant": [
{ "code": 254, "label": "þ" }
]
},
"s": {
"relevant": [
{ "code": 223, "label": "ß" },
{ "code": 347, "label": "ś" },
{ "code": 353, "label": "š" }
]
},
"u": {
"main": { "code": 250, "label": "ú" },
"relevant": [
{ "code": 363, "label": "ū" },
{ "code": 251, "label": "û" },
{ "code": 252, "label": "ü" },
{ "code": 249, "label": "ù" }
]
},
"y": {
"main": { "code": 253, "label": "ý" },
"relevant": [
{ "code": 255, "label": "ÿ" }
]
},
"æ": {
"relevant": [
{ "code": 228, "label": "ä" }
]
},
"ð": {
"relevant": [
{ "code": 254, "label": "þ" }
]
},
"ø": {
"relevant": [
{ "code": 246, "label": "ö" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".fo" },
{ "code": -255, "label": ".dk" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}
}

View File

@@ -5,39 +5,39 @@
"mapping": {
"all": {
"a": {
"main": { "code": 224, "label": "à" },
"relevant": [
{ "code": 224, "label": "à" },
{ "code": 228, "label": "ä" },
{ "code": 227, "label": "ã" },
{ "code": 229, "label": "å" },
{ "code": 257, "label": "ā" },
{ "code": 170, "label": "ª" },
{ "code": 226, "label": "â" },
{ "code": 230, "label": "æ" },
{ "code": 225, "label": "á" },
{ "code": 228, "label": "ä" }
{ "code": 225, "label": "á" }
]
},
"c": {
"main": { "code": 231, "label": "ç" },
"relevant": [
{ "code": 231, "label": "ç" },
{ "code": 269, "label": "č" },
{ "code": 263, "label": "ć" }
]
},
"e": {
"main": { "code": 233, "label": "é" },
"relevant": [
{ "code": 233, "label": "é" },
{ "code": 275, "label": "ē" },
{ "code": 281, "label": "ę" },
{ "code": 279, "label": "ė" },
{ "code": 281, "label": "ę" },
{ "code": 275, "label": "ē" },
{ "code": 234, "label": "ê" },
{ "code": 232, "label": "è" },
{ "code": 235, "label": "ë" }
]
},
"i": {
"main": { "code": 238, "label": "î" },
"relevant": [
{ "code": 238, "label": "î" },
{ "code": 299, "label": "ī" },
{ "code": 237, "label": "í" },
{ "code": 303, "label": "į" },
@@ -52,12 +52,12 @@
]
},
"o": {
"main": { "code": 244, "label": "ô" },
"relevant": [
{ "code": 244, "label": "ô" },
{ "code": 186, "label": "º" },
{ "code": 333, "label": "ō" },
{ "code": 245, "label": "õ" },
{ "code": 248, "label": "ø" },
{ "code": 245, "label": "õ" },
{ "code": 243, "label": "ó" },
{ "code": 242, "label": "ò" },
{ "code": 246, "label": "ö" },
@@ -72,12 +72,12 @@
]
},
"u": {
"main": { "code": 249, "label": "ù" },
"relevant": [
{ "code": 249, "label": "ù" },
{ "code": 363, "label": "ū" },
{ "code": 252, "label": "ü" },
{ "code": 251, "label": "û" },
{ "code": 250, "label": "ú" }
{ "code": 250, "label": "ú" },
{ "code": 251, "label": "û" }
]
},
"y": {

View File

@@ -1,7 +1,7 @@
{
"type": "characters/extended_popups",
"name": "hu",
"authors": [ "zoli111" ],
"authors": [ "zoli111, gabik65" ],
"mapping": {
"all": {
"a": {
@@ -26,11 +26,6 @@
{ "code": 337, "label": "ő" }
]
},
"ö": {
"relevant": [
{ "code": 337, "label": "ő" }
]
},
"u": {
"relevant": [
{ "code": 250, "label": "ú" },
@@ -38,11 +33,6 @@
{ "code": 369, "label": "ű" }
]
},
"ü": {
"relevant": [
{ "code": 369, "label": "ű" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [

View File

@@ -0,0 +1,132 @@
{
"type": "characters/extended_popups",
"name": "ku",
"authors": [ "GoRaN" ],
"mapping": {
"all": {
"a": {
"relevant": [
{ "code": 229, "label": "å" },
{ "code": 225, "label": "á" },
{ "code": 226, "label": "â" },
{ "code": 227, "label": "ã" },
{ "code": 257, "label": "ā" },
{ "code": 230, "label": "æ" },
{ "code": 228, "label": "ä" },
{ "code": 224, "label": "à" }
]
},
"c": {
"main": { "code": 231, "label": "ç" },
"relevant": [
{ "code": 269, "label": "č" },
{ "code": 265, "label": "ĉ" },
{ "code": 263, "label": "ć" }
]
},
"e": {
"relevant": [
{ "code": 233, "label": "é" },
{ "code": 275, "label": "ē" },
{ "code": 281, "label": "ę" },
{ "code": 279, "label": "ė" },
{ "code": 234, "label": "ê" },
{ "code": 232, "label": "è" },
{ "code": 235, "label": "ë" }
]
},
"r": {
"main": { "code": 345, "label": "ř" }
},
"g": {
"main": { "code": 285, "label": "ĝ" }
},
"h": {
"main": { "code": 293, "label": "ĥ" }
}
},
"j": {
"main": { "code": 309, "label": "ĵ" }
},
"n": {
"relevant": [
{ "code": 328, "label": "ň" },
{ "code": 241, "label": "ñ" }
]
},
"o": {
"main": { "code": 246, "label": "ö" },
"relevant": [
{ "code": 333, "label": "ō" },
{ "code": 248, "label": "ø" },
{ "code": 243, "label": "ó" },
{ "code": 245, "label": "õ" },
{ "code": 242, "label": "ò" },
{ "code": 339, "label": "œ" },
{ "code": 244, "label": "ô" }
]
},
"s": {
"main": { "code": 219, "label": "ș" },
"relevant": [
{ "code": 347, "label": "ś" },
{ "code": 349, "label": "ŝ" },
{ "code": 353, "label": "š" }
]
},
"u": {
"main": { "code": 251, "label": "û" },
"relevant": [
{ "code": 363, "label": "ū" },
{ "code": 249, "label": "ù" },
{ "code": 250, "label": "ú" },
{ "code": 252, "label": "ü" }
]
},
"y": {
"relevant": [
{ "code": 253, "label": "ý" }
]
},
"z": {
"relevant": [
{ "code": 382, "label": "ž" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".krd" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".com" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -1,7 +1,7 @@
{
"type": "characters/extended_popups",
"name": "ru",
"authors": [ "williamtheaker" ],
"authors": [ "williamtheaker", "33kk" ],
"mapping": {
"all": {
"е": {
@@ -9,6 +9,11 @@
{ "code": 1105, "label": "ё" }
]
},
"ь": {
"relevant": [
{ "code": 1098, "label": "ъ" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [

View File

@@ -0,0 +1,116 @@
{
"type": "characters/extended_popups",
"name": "sk",
"authors": [ "stefan-misik", "majso" ],
"mapping": {
"all": {
"e": {
"relevant": [
{ "code": 233, "label": "é" },
{ "code": 283, "label": "ě" }
]
},
"r": {
"relevant": [
{ "code": 341, "label": "ŕ" },
{ "code": 345, "label": "ř" }
]
},
"t": {
"relevant": [
{ "code": 357, "label": "ť" }
]
},
"y": {
"relevant": [
{ "code": 253, "label": "ý" }
]
},
"u": {
"relevant": [
{ "code": 250, "label": "ú" },
{ "code": 367, "label": "ů" }
]
},
"i": {
"relevant": [
{ "code": 237, "label": "í" }
]
},
"o": {
"relevant": [
{ "code": 243, "label": "ó" },
{ "code": 244, "label": "ô" }
]
},
"a": {
"relevant": [
{ "code": 225, "label": "á" },
{ "code": 228, "label": "ä" }
]
},
"s": {
"relevant": [
{ "code": 353, "label": "š" }
]
},
"d": {
"relevant": [
{ "code": 271, "label": "ď" }
]
},
"l": {
"relevant": [
{ "code": 318, "label": "ľ" },
{ "code": 314, "label": "ĺ" }
]
},
"z": {
"relevant": [
{ "code": 382, "label": "ž" }
]
},
"c": {
"relevant": [
{ "code": 269, "label": "č" }
]
},
"n": {
"relevant": [
{ "code": 328, "label": "ň" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".sk" },
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}
}

View File

@@ -21,9 +21,7 @@
]
},
"z": {
"relevant": [
{ "code": 382, "label": "ž" }
]
"main": { "code": 382, "label": "ž" }
},
"~right": {
"main": { "code": 44, "label": "," },
@@ -50,9 +48,9 @@
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".rs" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}

View File

@@ -1,46 +1,100 @@
{
"type": "characters/extended_popups",
"name": "tr",
"authors": [ "kisekinopureya" ],
"authors": [ "kisekinopureya", "patrickgold" ],
"mapping": {
"all": {
"a": {
"relevant": [
{ "code": 226, "label": "â" }
{ "code": 226, "label": "â" },
{ "code": 228, "label": "ä" },
{ "code": 225, "label": "á" }
]
},
"c": {
"main": { "code": 231, "label": "ç" },
"relevant": [
{ "code": 231, "label": "ç" }
{ "code": 269, "label": "č" },
{ "code": 263, "label": "ć" }
]
},
"e": {
"relevant": [
{ "code": 233, "label": "é" },
{ "code": 601, "label": "ə" },
{ "code": 234, "label": "ê" }
]
},
"g": {
"relevant": [
{ "code": 287, "label": "ğ" }
]
"main": { "code": 287, "label": "ğ" }
},
"i": {
"main": { "code": 305, "label": "ı" },
"relevant": [
{ "code": 303, "label": "į" },
{ "code": 236, "label": "ì" },
{ "code": 237, "label": "í" },
{ "code": 299, "label": "ī" },
{ "code": 238, "label": "î" },
{ "code": 305, "label": "ı" }
{ "code": 239, "label": "ï" }
]
},
"ı": {
"main": { "code": 105, "label": "i" },
"relevant": [
{ "code": 303, "label": "į" },
{ "code": 236, "label": "ì" },
{ "code": 237, "label": "í" },
{ "code": 299, "label": "ī" },
{ "code": 238, "label": "î" },
{ "code": 239, "label": "ï" }
]
},
"n": {
"relevant": [
{ "code": 328, "label": "ň" },
{ "code": 241, "label": "ñ" }
]
},
"o": {
"main": { "code": 246, "label": "ö" },
"relevant": [
{ "code": 246, "label": "ö" }
{ "code": 333, "label": "ō" },
{ "code": 248, "label": "ø" },
{ "code": 243, "label": "ó" },
{ "code": 245, "label": "õ" },
{ "code": 242, "label": "ò" },
{ "code": 339, "label": "œ" },
{ "code": 244, "label": "ô" }
]
},
"s": {
"main": { "code": 351, "label": "ş" },
"relevant": [
{ "code": 351, "label": "ş" }
{ "code": 347, "label": "ś" },
{ "code": 223, "label": "ß" },
{ "code": 353, "label": "š" }
]
},
"u": {
"main": { "code": 252, "label": "ü" },
"relevant": [
{ "code": 252, "label": "ü" },
{ "code": 363, "label": "ū" },
{ "code": 249, "label": "ù" },
{ "code": 250, "label": "ú" },
{ "code": 251, "label": "û" }
]
},
"y": {
"relevant": [
{ "code": 253, "label": "ý" }
]
},
"z": {
"relevant": [
{ "code": 382, "label": "ž" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
@@ -67,9 +121,9 @@
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".tr" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}

View File

@@ -0,0 +1,45 @@
{
"type": "characters/extended_popups",
"name": "uk",
"authors": [ "williamtheaker", "33kk" ],
"mapping": {
"all": {
"і": {
"relevant": [
{ "code": 1111, "label": "ї" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".ua" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}
}

View File

@@ -0,0 +1,44 @@
{
"type": "characters",
"name": "faroese",
"label": "Faroese (QWERTY)",
"authors": [ "BinFlush" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 113, "label": "q" },
{ "code": 119, "label": "w" },
{ "code": 101, "label": "e" },
{ "code": 114, "label": "r" },
{ "code": 116, "label": "t" },
{ "code": 121, "label": "y" },
{ "code": 117, "label": "u" },
{ "code": 105, "label": "i" },
{ "code": 111, "label": "o" },
{ "code": 112, "label": "p" },
{ "code": 240, "label": "ð" }
],
[
{ "code": 97, "label": "a" },
{ "code": 115, "label": "s" },
{ "code": 100, "label": "d" },
{ "code": 102, "label": "f" },
{ "code": 103, "label": "g" },
{ "code": 104, "label": "h" },
{ "code": 106, "label": "j" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" },
{ "code": 230, "label": "æ" },
{ "code": 248, "label": "ø" }
],
[
{ "code": 122, "label": "z" },
{ "code": 120, "label": "x" },
{ "code": 99, "label": "c" },
{ "code": 118, "label": "v" },
{ "code": 98, "label": "b" },
{ "code": 110, "label": "n" },
{ "code": 109, "label": "m" }
]
]
}

View File

@@ -0,0 +1,46 @@
{
"type": "characters",
"name": "german",
"label": "German (QWERTZ)",
"authors": [ "mahmoudk1000" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 113, "label": "q" },
{ "code": 119, "label": "w" },
{ "code": 101, "label": "e" },
{ "code": 114, "label": "r" },
{ "code": 116, "label": "t" },
{ "code": 122, "label": "z" },
{ "code": 117, "label": "u" },
{ "code": 105, "label": "i" },
{ "code": 111, "label": "o" },
{ "code": 112, "label": "p" },
{ "code": 252, "label": "ü" }
],
[
{ "code": 97, "label": "a" },
{ "code": 115, "label": "s" },
{ "code": 100, "label": "d" },
{ "code": 102, "label": "f" },
{ "code": 103, "label": "g" },
{ "code": 104, "label": "h" },
{ "code": 106, "label": "j" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" },
{ "code": 246, "label": "ö" },
{ "code": 228, "label": "ä" }
],
[
{ "code": 121, "label": "y" },
{ "code": 120, "label": "x" },
{ "code": 99, "label": "c" },
{ "code": 118, "label": "v" },
{ "code": 98, "label": "b" },
{ "code": 110, "label": "n" },
{ "code": 109, "label": "m" },
{ "code": 223, "label": "ß", "popup": {
}, "shift": { "code": 7838, "label": "ẞ" } }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "greek",
"label": "Ελληνικά",
"authors": [ "tsiflimagas" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "hebrew",
"label": "עברית",
"authors": [ "Antony" ],
"direction": "rtl",
"modifier": "hebrew",

View File

@@ -1,7 +1,8 @@
{
"type": "characters",
"name": "hungarian",
"authors": [ "zoli111" ],
"label": "Hungarian (QWERTZ)",
"authors": [ "zoli111, gabik65" ],
"direction": "ltr",
"arrangement": [
[
@@ -14,8 +15,7 @@
{ "code": 117, "label": "u" },
{ "code": 105, "label": "i" },
{ "code": 111, "label": "o" },
{ "code": 112, "label": "p" },
{ "code": 246, "label": "ö" }
{ "code": 112, "label": "p" }
],
[
{ "code": 97, "label": "a" },
@@ -26,9 +26,7 @@
{ "code": 104, "label": "h" },
{ "code": 106, "label": "j" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" },
{ "code": 233, "label": "é" },
{ "code": 225, "label": "á" }
{ "code": 108, "label": "l" }
],
[
{ "code": 121, "label": "y" },
@@ -37,8 +35,7 @@
{ "code": 118, "label": "v" },
{ "code": 98, "label": "b" },
{ "code": 110, "label": "n" },
{ "code": 109, "label": "m" },
{ "code": 252, "label": "ü" }
{ "code": 109, "label": "m" }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "icelandic",
"label": "Icelandic (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,285 @@
{
"type": "characters",
"name": "ipa",
"label": "International Phonetic Alphabet",
"authors": [
"Huy-Ngo"
],
"direction": "ltr",
"arrangement": [
[
{
"code": 113, "label": "q"
},
{
"code": 119, "label": "w",
"popup": {
"relevant": [
{ "code": 695, "label": "◌ʷ" },
{ "code": 653, "label": "ʍ" }
]
}
},
{
"code": 101, "label": "e",
"popup": {
"relevant": [
{ "code": 600, "label": "ɘ" },
{ "code": 604, "label": "ɜ" },
{ "code": 601, "label": "ə" },
{ "code": 602, "label": "ɚ" },
{ "code": 7498, "label": "◌ᵊ" },
{ "code": 603, "label": "ɛ" }
]
}
},
{
"code": 114, "label": "r",
"popup": {
"relevant": [
{ "code": 637, "label": "ɽ" },
{ "code": 633, "label": "ɹ" },
{ "code": 638, "label": "ɾ" },
{ "code": 635, "label": "ɻ" },
{ "code": 641, "label": "ʁ" },
{ "code": 734, "label": "◌˞" },
{ "code": 640, "label": "ʀ" }
]
}
},
{
"code": 116, "label": "t",
"popup": {
"relevant": [
{ "code": 648, "label": "ʈ" },
{ "code": 7615, "label": "◌ᶿ" },
{ "code": 952, "label": "θ" }
]
}
},
{
"code": 121, "label": "y",
"popup": {
"relevant": [
{ "code": 612, "label": "ɤ" },
{ "code": 655, "label": "ʏ" }
]
}
},
{
"code": 117, "label": "u",
"popup": {
"relevant": [
{ "code": 7551, "label": "ᵿ" },
{ "code": 649, "label": "ʉ" },
{ "code": 650, "label": "ʊ" }
]
}
},
{
"code": 105, "label": "i",
"popup": {
"relevant": [
{ "code": 7574, "label": "ᵻ" },
{ "code": 616, "label": "ɨ" },
{ "code": 618, "label": "ɪ" }
]
}
},
{
"code": 111, "label": "o",
"popup": {
"relevant": [
{ "code": 664, "label": "ʘ" },
{ "code": 248, "label": "ø" },
{ "code": 606, "label": "ɞ" },
{ "code": 339, "label": "œ" },
{ "code": 629, "label": "ɵ" },
{ "code": 630, "label": "ɶ" },
{ "code": 596, "label": "ɔ" }
]
}
},
{
"code": 112, "label": "p"
}
],
[
{
"code": 97, "label": "a",
"popup": {
"relevant": [
{ "code": 230, "label": "æ" },
{ "code": 594, "label": "ɒ" },
{ "code": 592, "label": "ɐ" },
{ "code": 593, "label": "ɑ" }
]
}
},
{
"code": 115, "label": "s",
"popup": {
"relevant": [
{ "code": 642, "label": "ʂ" },
{ "code": 597, "label": "ɕ" },
{ "code": 643, "label": "ʃ" }
]
}
},
{
"code": 100, "label": "d",
"popup": {
"relevant": [
{ "code": 598, "label": "ɖ" },
{ "code": 599, "label": "ɗ" },
{ "code": 240, "label": "ð" }
]
}
},
{
"code": 102, "label": "f",
"popup": {
"relevant": [
{ "code": 632, "label": "ɸ" }
]
}
},
{
"code": 609, "label": "ɡ",
"popup": {
"main": { "code": 103, "label": "g" },
"relevant": [
{ "code": 608, "label": "ɠ" },
{ "code": 610, "label": "ɢ" },
{ "code": 667, "label": "ʛ" },
{ "code": 667, "label": "ʛ" },
{ "code": 736, "label": "◌ˠ" },
{ "code": 611, "label": "ɣ" }
]
}
},
{
"code": 104, "label": "h",
"popup": {
"relevant": [
{ "code": 614, "label": "ɦ" },
{ "code": 615, "label": "ɧ" },
{ "code": 295, "label": "ħ" },
{ "code": 613, "label": "ɥ" },
{ "code": 688, "label": "◌ʰ" },
{ "code": 668, "label": "ʜ" }
]
}
},
{
"code": 106, "label": "j",
"popup": {
"relevant": [
{ "code": 668, "label": "ʝ" },
{ "code": 607, "label": "ɟ" },
{ "code": 690, "label": "◌ʲ" },
{ "code": 664, "label": "ʄ" }
]
}
},
{
"code": 107, "label": "k"
},
{
"code": 108, "label": "l",
"popup": {
"relevant": [
{ "code": 620, "label": "ɬ" },
{ "code": 634, "label": "ɺ" },
{ "code": 671, "label": "ʟ" },
{ "code": 654, "label": "ʎ" },
{ "code": 737, "label": "◌ˡ" },
{ "code": 622, "label": "ɮ" }
]
}
},
{
"code": 660, "label": "ʔ",
"popup": {
"relevant": [
{ "code": 661, "label": "ʕ" },
{ "code": 674, "label": "ʢ" },
{ "code": 740, "label": "◌ˤ" },
{ "code": 673, "label": "ʡ" }
]
}
}
],
[
{
"code": 122, "label": "z",
"popup": {
"relevant": [
{ "code": 656, "label": "ʐ" },
{ "code": 657, "label": "ʑ" },
{ "code": 658, "label": "ʒ" }
]
}
},
{
"code": 120, "label": "x",
"popup": {
"relevant": [
{ "code": 739, "label": "◌ˣ" },
{ "code": 967, "label": "χ" }
]
}
},
{
"code": 99, "label": "c",
"popup": {
"relevant": [
{ "code": 231, "label": "ç" }
]
}
},
{
"code": 118, "label": "v",
"popup": {
"relevant": [
{ "code": 651, "label": "ʋ" },
{ "code": 652, "label": "ʌ" }
]
}
},
{
"code": 98, "label": "b",
"popup": {
"relevant": [
{ "code": 595, "label": "ɓ" },
{ "code": 665, "label": "ʙ" },
{ "code": 946, "label": "β" }
]
}
},
{
"code": 110, "label": "n",
"popup": {
"relevant": [
{ "code": 626, "label": "ɲ" },
{ "code": 627, "label": "ɳ" },
{ "code": 628, "label": "ɴ" },
{ "code": 8319, "label": "◌ⁿ" },
{ "code": 771, "label": "◌̃" },
{ "code": 631, "label": "ŋ" }
]
}
},
{
"code": 109, "label": "m",
"popup": {
"relevant": [
{ "code": 625, "label": "ɱ" },
{ "code": 624, "label": "ɰ" },
{ "code": 623, "label": "ɯ" }
]
}
}
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "jcuken_russian",
"label": "Russian (JCUKEN)",
"authors": [ "williamtheaker" ],
"direction": "ltr",
"arrangement": [
@@ -15,8 +16,7 @@
{ "code": 1096, "label": "ш" },
{ "code": 1097, "label": "щ" },
{ "code": 1079, "label": "з" },
{ "code": 1093, "label": "х" },
{ "code": 1098, "label": "ъ" }
{ "code": 1093, "label": "х" }
],
[
{ "code": 1092 , "label": "ф" },

View File

@@ -0,0 +1,46 @@
{
"type": "characters",
"name": "jcuken_ukrainian",
"label": "Ukrainian (JCUKEN)",
"authors": [ "williamtheaker", "33kk" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 1081, "label": "й" },
{ "code": 1094, "label": "ц" },
{ "code": 1091, "label": "у" },
{ "code": 1082, "label": "к" },
{ "code": 1077, "label": "е" },
{ "code": 1085, "label": "н" },
{ "code": 1075, "label": "г" },
{ "code": 1096, "label": "ш" },
{ "code": 1097, "label": "щ" },
{ "code": 1079, "label": "з" },
{ "code": 1093, "label": "х" }
],
[
{ "code": 1092 , "label": "ф" },
{ "code": 1110 , "label": "і" },
{ "code": 1074 , "label": "в" },
{ "code": 1072 , "label": "а" },
{ "code": 1087 , "label": "п" },
{ "code": 1088 , "label": "р" },
{ "code": 1086 , "label": "о" },
{ "code": 1083 , "label": "л" },
{ "code": 1076 , "label": "д" },
{ "code": 1078 , "label": "ж" },
{ "code": 1108 , "label": "є" }
],
[
{ "code": 1103 , "label": "я" },
{ "code": 1095 , "label": "ч" },
{ "code": 1089 , "label": "с" },
{ "code": 1084 , "label": "м" },
{ "code": 1080 , "label": "и" },
{ "code": 1090 , "label": "т" },
{ "code": 1100 , "label": "ь" },
{ "code": 1073 , "label": "б" },
{ "code": 1102 , "label": "ю" }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "kurdish",
"label": "کوردی",
"authors": [ "GoRaN" ],
"direction": "rtl",
"modifier": "kurdish",
@@ -12,19 +13,21 @@
{ "code": 1608, "label": "و", "popup": {
"main": { "code": -255, "label": "وو" }
} },
{ "code": 1749, "label": "", "popup": {
"main": { "code": 1577, "label": "ة" }
} },
{ "code": 1749, "label": "" },
{ "code": 1585, "label": "ر" },
{ "code": 1578, "label": "ت", "popup": {
"main": { "code": 1591, "label": "ط" }
} },
{ "code": 1740, "label": "ی" },
{ "code": 1574, "label": "ﺋ", "popup": {
"main": { "code": 1569, "label": "ء" }
{ "code": 1574, "label": ""},
{ "code": 1593, "label": "ع", "popup": {
"main": { "code": 1594, "label": "غ" }
} },
{ "code": 1593, "label": "ع" },
{ "code": 1734, "label": "ۆ" },
{ "code": 1662, "label": "پ", "popup": {
"main": { "code": 1579, "label": "ث" }
} }

View File

@@ -0,0 +1,46 @@
{
"type": "characters",
"name": "kurdish_kurmanci",
"label": "Kurdî",
"authors": [ "GoRaN" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 113, "label": "q" },
{ "code": 119, "label": "w" },
{ "code": 101, "label": "e" },
{ "code": 114, "label": "r" },
{ "code": 116, "label": "t" },
{ "code": 121, "label": "y" },
{ "code": 117, "label": "u" },
{ "code": 305, "label": "ı" },
{ "code": 111, "label": "o" },
{ "code": 112, "label": "p" },
{ "code": 251, "label": "û" }
],
[
{ "code": 97, "label": "a" },
{ "code": 115, "label": "s" },
{ "code": 100, "label": "d" },
{ "code": 102, "label": "f" },
{ "code": 103, "label": "g" },
{ "code": 104, "label": "h" },
{ "code": 106, "label": "j" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" },
{ "code": 234, "label": "ê" },
{ "code": 238, "label": "î" }
],
[
{ "code": 122, "label": "z" },
{ "code": 120, "label": "x" },
{ "code": 99, "label": "c" },
{ "code": 118, "label": "v" },
{ "code": 98, "label": "b" },
{ "code": 110, "label": "n" },
{ "code": 109, "label": "m" },
{ "code": 231, "label": "ç" },
{ "code": 351, "label": "ş" }
]
]
}

View File

@@ -0,0 +1,72 @@
{
"type": "characters",
"name": "kurdish_standard",
"label": "کوردی - ستاندارد",
"authors": [ "GoRaN" ],
"direction": "rtl",
"modifier": "kurdish",
"arrangement": [
[
{ "code": 1602, "label": "ق", "popup": {
"main": { "code": 1647, "label": "ٯ" }
} },
{ "code": 1700, "label": "ڤ", "popup": {
"main": { "code": 1701, "label": "ڥ" }
} },
{ "code": 1601, "label": "ف", "popup": {
"main": { "code": 1698, "label": "ڢ" }
} },
{ "code": 1594, "label": "غ" },
{ "code": 1593, "label": "ع"},
{ "code": 1607, "label": "ھ" },
{ "code": 1749, "label": "" },
{ "code": 1578, "label": "ت", "popup": {
"main": { "code": 1591, "label": "ط" }
} },
{ "code": 1581, "label": "ح" },
{ "code": 1582, "label": "خ" }
],
[
{ "code": 1588, "label": "ش" },
{ "code": 1587, "label": "س" },
{ "code": 1740, "label": "ی" },
{ "code": 1742, "label": "ێ" },
{ "code": 1604, "label": "ل" },
{ "code": 1717, "label": "ڵ" },
{ "code": 1575, "label": "ا" },
{ "code": 1606, "label": "ن" },
{ "code": 1580, "label": "ج" },
{ "code": 1670, "label": "چ" }
],
[
{ "code": 1576, "label": "ب" },
{ "code": 1586, "label": "ز", "popup": {
"main": {"code": 1592, "label": "ظ" }
} },
{ "code": 1585, "label": "ر" },
{ "code": 1685, "label": "ڕ" },
{ "code": 1583, "label": "د" },
{ "code": -255, "label": "وو" },
{ "code": 1608, "label": "و" },
{ "code": 1734, "label": "ۆ" },
{ "code": 1705, "label": "ک" },
{ "code": 1711, "label": "گ" }
],
[
{ "code": 1600, "label": "kashida", "variation": "normal" },
{ "code": 1574, "label": "ﺋ"},
{ "code": 1662, "label": "پ", "popup": {
"main": { "code": 1579, "label": "ث" }
} },
{ "code": 1688, "label": "ژ" },
{ "code": 1605, "label": "م" },
{ "code": 1567, "label": "؟" },
{ "code": 1548, "label": "،" },
{ "code": 46, "label": "." }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "default",
"name": "$default",
"label": "Default",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "arabic",
"label": "Arabic",
"authors": [ "HeiWiper" ],
"direction": "rtl",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "dvorak",
"label": "Dvorak",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "hebrew",
"label": "עברית",
"authors": [ "Antony" ],
"direction": "rtl",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "kurdish",
"label": "کوردی",
"authors": [ "GoRaN" ],
"direction": "rtl",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters/mod",
"name": "persian",
"label": "Persian",
"authors": [ "PHELAT" ],
"direction": "rtl",
"arrangement": [
@@ -19,8 +20,10 @@
{ "code": 32, "label": "space" },
{ "code": 8204, "label": "half_space", "variation": "normal" },
{ "code": 8204, "label": "half_space", "variation": "password" },
{ "code": 8204, "label": "half_space", "variation": "uri" },
{ "code": 1600, "label": "kashida", "variation": "normal" },
{ "code": 1600, "label": "kashida", "variation": "password" },
{ "code": 1600, "label": "kashida", "variation": "uri" },
{ "code": 46, "label": ".", "groupId": 2, "variation": "email_address" },
{ "code": 46, "label": ".", "groupId": 2, "variation": "normal" },
{ "code": 46, "label": ".", "groupId": 2, "variation": "password" },

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "norwegian",
"label": "Norwegian (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "persian",
"label": "Persian",
"authors": [ "PHELAT" ],
"direction": "rtl",
"modifier": "persian",

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "qwerty",
"label": "QWERTY",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "qwertz",
"label": "QWERTZ",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "serbian_cyrillic",
"label": "Serbian (ЉЊЕРТЗ)",
"authors": ["GrbavaCigla"],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "serbian_latin",
"label": "Serbian (QWERTZ)",
"authors": ["GrbavaCigla"],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "spanish",
"label": "Spanish (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "swedish_finnish",
"label": "Swedish/Finnish (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "swiss_french",
"label": "Swiss French (QWERTZ)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "swiss_german",
"label": "Swiss German (QWERTZ)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "characters",
"name": "swiss_italian",
"label": "Swiss Italian (QWERTZ)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,47 @@
{
"type": "characters",
"name": "turkish_f",
"label": "Turkish-F",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 102, "label": "f" },
{ "code": 103, "label": "g" },
{ "code": 287, "label": "ğ" },
{ "code": 305, "label": "ı" },
{ "code": 111, "label": "o" },
{ "code": 100, "label": "d" },
{ "code": 114, "label": "r" },
{ "code": 110, "label": "n" },
{ "code": 104, "label": "h" },
{ "code": 112, "label": "p" },
{ "code": 113, "label": "q" },
{ "code": 119, "label": "w" }
],
[
{ "code": 117, "label": "u" },
{ "code": 105, "label": "i" },
{ "code": 101, "label": "e" },
{ "code": 97, "label": "a" },
{ "code": 252, "label": "ü" },
{ "code": 116, "label": "t" },
{ "code": 107, "label": "k" },
{ "code": 109, "label": "m" },
{ "code": 108, "label": "l" },
{ "code": 121, "label": "y" },
{ "code": 351, "label": "ş" }
],
[
{ "code": 106, "label": "j" },
{ "code": 246, "label": "ö" },
{ "code": 118, "label": "v" },
{ "code": 99, "label": "c" },
{ "code": 231, "label": "ç" },
{ "code": 122, "label": "z" },
{ "code": 115, "label": "s" },
{ "code": 98, "label": "b" },
{ "code": 120, "label": "x" }
]
]
}

View File

@@ -0,0 +1,47 @@
{
"type": "characters",
"name": "turkish_q",
"label": "Turkish-Q",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 113, "label": "q" },
{ "code": 119, "label": "w" },
{ "code": 101, "label": "e" },
{ "code": 114, "label": "r" },
{ "code": 116, "label": "t" },
{ "code": 121, "label": "y" },
{ "code": 117, "label": "u" },
{ "code": 305, "label": "ı" },
{ "code": 111, "label": "o" },
{ "code": 112, "label": "p" },
{ "code": 287, "label": "ğ" },
{ "code": 252, "label": "ü" }
],
[
{ "code": 97, "label": "a" },
{ "code": 115, "label": "s" },
{ "code": 100, "label": "d" },
{ "code": 102, "label": "f" },
{ "code": 103, "label": "g" },
{ "code": 104, "label": "h" },
{ "code": 106, "label": "j" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" },
{ "code": 351, "label": "ş" },
{ "code": 105, "label": "i" }
],
[
{ "code": 122, "label": "z" },
{ "code": 120, "label": "x" },
{ "code": 99, "label": "c" },
{ "code": 118, "label": "v" },
{ "code": 98, "label": "b" },
{ "code": 110, "label": "n" },
{ "code": 109, "label": "m" },
{ "code": 246, "label": "ö" },
{ "code": 231, "label": "ç" }
]
]
}

View File

@@ -0,0 +1,46 @@
{
"type": "characters",
"name": "workman",
"label": "Workman",
"authors": [ "icyphox" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 113, "label": "q" },
{ "code": 100, "label": "d" },
{ "code": 114, "label": "r" },
{ "code": 119, "label": "w" },
{ "code": 98, "label": "b" },
{ "code": 106, "label": "j" },
{ "code": 102, "label": "f" },
{ "code": 117, "label": "u" },
{ "code": 112, "label": "p" },
{ "code": 59, "label": ";", "popup": {
"relevant": [
{ "code": 58, "label": ":" }
]
}, "shift": { "code": 58, "label": ":" } }
],
[
{ "code": 97, "label": "a" },
{ "code": 115, "label": "s" },
{ "code": 104, "label": "h" },
{ "code": 116, "label": "t" },
{ "code": 103, "label": "g" },
{ "code": 121, "label": "y" },
{ "code": 110, "label": "n" },
{ "code": 101, "label": "e" },
{ "code": 111, "label": "o" },
{ "code": 105, "label": "i" }
],
[
{ "code": 122, "label": "z" },
{ "code": 120, "label": "x" },
{ "code": 109, "label": "m" },
{ "code": 99, "label": "c" },
{ "code": 118, "label": "v" },
{ "code": 107, "label": "k" },
{ "code": 108, "label": "l" }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "extension",
"name": "clipboard_cursor_row",
"label": "Clipboard Cursor Row",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
@@ -10,7 +11,8 @@
{ "code": -20, "label": "arrow_left", "type": "navigation" },
{ "code": -21, "label": "arrow_right", "type": "navigation" },
{ "code": -131, "label": "clipboard_cut", "type": "enter_editing" },
{ "code": -132, "label": "clipboard_paste", "type": "enter_editing" }
{ "code": -132, "label": "clipboard_paste", "type": "enter_editing" },
{ "code": -214, "label": "switch_to_clipboard_context", "type": "system_gui"}
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "numeric_advanced",
"name": "default",
"name": "western_arabic",
"label": "Western Arabic",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,91 @@
{
"type": "numeric_row",
"name": "eastern_arabic",
"label": "Eastern Arabic",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 1633, "label": "١", "type": "numeric", "popup": {
"main": { "code": 49, "label": "1" },
"relevant": [
{ "code": 8537, "label": "⅙" },
{ "code": 8528, "label": "⅐" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "⅒" },
{ "code": 185, "label": "¹" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "⅕" }
]
} },
{ "code": 1634, "label": "٢", "type": "numeric", "popup": {
"main": { "code": 50, "label": "2" },
"relevant": [
{ "code": 8532, "label": "⅔" },
{ "code": 178, "label": "²" },
{ "code": 8534, "label": "⅖" }
]
} },
{ "code": 1635, "label": "٣", "type": "numeric", "popup": {
"main": { "code": 51, "label": "3" },
"relevant": [
{ "code": 8535, "label": "⅗" },
{ "code": 190, "label": "¾" },
{ "code": 179, "label": "³" },
{ "code": 8540, "label": "⅜" }
]
} },
{ "code": 1636, "label": "٤", "type": "numeric", "popup": {
"main": { "code": 52, "label": "4" },
"relevant": [
{ "code": 8536, "label": "⅘" },
{ "code": 8308, "label": "⁴" }
]
} },
{ "code": 1637, "label": "٥", "type": "numeric", "popup": {
"main": { "code": 53, "label": "5" },
"relevant": [
{ "code": 8538, "label": "⅚" },
{ "code": 8309, "label": "⁵" },
{ "code": 8541, "label": "⅝" }
]
} },
{ "code": 1638, "label": "٦", "type": "numeric", "popup": {
"main": { "code": 54, "label": "6" },
"relevant": [
{ "code": 8310, "label": "⁶" }
]
} },
{ "code": 1639, "label": "٧", "type": "numeric", "popup": {
"main": { "code": 55, "label": "7" },
"relevant": [
{ "code": 8542, "label": "⅞" },
{ "code": 8311, "label": "⁷" }
]
} },
{ "code": 1640, "label": "٨", "type": "numeric", "popup": {
"main": { "code": 56, "label": "8" },
"relevant": [
{ "code": 8312, "label": "⁸" }
]
} },
{ "code": 1641, "label": "٩", "type": "numeric", "popup": {
"main": { "code": 57, "label": "9" },
"relevant": [
{ "code": 8313, "label": "⁹" }
]
} },
{ "code": 1632, "label": "٠", "type": "numeric", "popup": {
"main": { "code": 48, "label": "0" },
"relevant": [
{ "code": 8319, "label": "ⁿ" },
{ "code": 8709, "label": "∅" },
{ "code": 8304, "label": "⁰" }
]
} }
]
]
}

View File

@@ -0,0 +1,91 @@
{
"type": "numeric_row",
"name": "persian",
"label": "Persian",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 1777, "label": "۱", "type": "numeric", "popup": {
"main": { "code": 49, "label": "1" },
"relevant": [
{ "code": 8537, "label": "⅙" },
{ "code": 8528, "label": "⅐" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "⅒" },
{ "code": 185, "label": "¹" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "⅕" }
]
} },
{ "code": 1778, "label": "۲", "type": "numeric", "popup": {
"main": { "code": 50, "label": "2" },
"relevant": [
{ "code": 8532, "label": "⅔" },
{ "code": 178, "label": "²" },
{ "code": 8534, "label": "⅖" }
]
} },
{ "code": 1779, "label": "۳", "type": "numeric", "popup": {
"main": { "code": 51, "label": "3" },
"relevant": [
{ "code": 8535, "label": "⅗" },
{ "code": 190, "label": "¾" },
{ "code": 179, "label": "³" },
{ "code": 8540, "label": "⅜" }
]
} },
{ "code": 1780, "label": "۴", "type": "numeric", "popup": {
"main": { "code": 52, "label": "4" },
"relevant": [
{ "code": 8536, "label": "⅘" },
{ "code": 8308, "label": "⁴" }
]
} },
{ "code": 1781, "label": "۵", "type": "numeric", "popup": {
"main": { "code": 53, "label": "5" },
"relevant": [
{ "code": 8538, "label": "⅚" },
{ "code": 8309, "label": "⁵" },
{ "code": 8541, "label": "⅝" }
]
} },
{ "code": 1782, "label": "۶", "type": "numeric", "popup": {
"main": { "code": 54, "label": "6" },
"relevant": [
{ "code": 8310, "label": "⁶" }
]
} },
{ "code": 1783, "label": "۷", "type": "numeric", "popup": {
"main": { "code": 55, "label": "7" },
"relevant": [
{ "code": 8542, "label": "⅞" },
{ "code": 8311, "label": "⁷" }
]
} },
{ "code": 1784, "label": "۸", "type": "numeric", "popup": {
"main": { "code": 56, "label": "8" },
"relevant": [
{ "code": 8312, "label": "⁸" }
]
} },
{ "code": 1785, "label": "۹", "type": "numeric", "popup": {
"main": { "code": 57, "label": "9" },
"relevant": [
{ "code": 8313, "label": "⁹" }
]
} },
{ "code": 1776, "label": "۰", "type": "numeric", "popup": {
"main": { "code": 48, "label": "0" },
"relevant": [
{ "code": 8319, "label": "ⁿ" },
{ "code": 8709, "label": "∅" },
{ "code": 8304, "label": "⁰" }
]
} }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "extension",
"name": "number_row",
"type": "numeric_row",
"name": "western_arabic",
"label": "Western Arabic",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "numeric",
"name": "default",
"name": "western_arabic",
"label": "Western Arabic",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "phone",
"name": "default",
"name": "telpad",
"label": "Telephone Pad",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -1,6 +1,7 @@
{
"type": "phone2",
"name": "default",
"name": "telpad",
"label": "Telephone Pad",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,15 @@
[
")",
"}",
"]",
">",
"&",
".",
",",
"?",
"!",
";",
":"
]

View File

@@ -0,0 +1,102 @@
{
"type": "symbols",
"name": "eastern",
"label": "Eastern",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 1642, "label": "٪", "popup": {
"main": { "code": 37, "label": "%" },
"relevant": [
{ "code": 8453, "label": "℅" },
{ "code": 8240, "label": "‰" }
]
} },
{ "code": 38, "label": "&" },
{ "code": 45, "label": "-", "popup": {
"main": { "code": 95, "label": "_" },
"relevant": [
{ "code": 8212, "label": "—" },
{ "code": 8211, "label": "" },
{ "code": 183, "label": "·" }
]
} },
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 47, "label": "/" }
],
[
{ "code": 42, "label": "*", "popup": {
"main": { "code": 9733, "label": "★" },
"relevant": [
{ "code": 1645, "label": "٭" }
]
} },
{ "code": 34, "label": "\"", "popup": {
"main": { "code": 8221, "label": "”" },
"relevant": [
{ "code": 8222, "label": "„" },
{ "code": 8220, "label": "“" },
{ "code": 171, "label": "«" },
{ "code": 187, "label": "»" }
]
} },
{ "code": 39, "label": "'", "popup": {
"main": { "code": 8217, "label": "" },
"relevant": [
{ "code": 8218, "label": "" },
{ "code": 8216, "label": "" },
{ "code": 8249, "label": "" },
{ "code": 8250, "label": "" }
]
} },
{ "code": 58, "label": ":", "popup": {
"main": { "code": 8942, "label": "⋮" }
} },
{ "code": 1563, "label": "؛", "popup": {
"main": { "code": 59, "label": ";" }
} },
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "code": 1567, "label": "؟", "popup": {
"main": { "code": 63, "label": "?" },
"relevant": [
{ "code": 191, "label": "¿" },
{ "code": 8253, "label": "‽" }
]
} }
]
]
}

View File

@@ -0,0 +1,97 @@
{
"type": "symbols",
"name": "ipa",
"label": "International Phonetic Alphabet",
"authors": [ "Huy-Ngo" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 712, "label": "ˈ", "popup": {
"main": { "code": 716, "label": "ˌ" }
} },
{ "code": 720, "label": "ː", "popup": {
"main": { "code": 721, "label": "ˑ" },
"relevant": [
{ "code": 774, "label": "◌̆" }
]
} },
{ "code": 8599, "label": "↗︎", "popup": {
"main": { "code": 42779, "label": "ꜛ" }
} },
{ "code": 8600, "label": "↘︎", "popup": {
"main": { "code": 42780, "label": "ꜜ" }
} },
{ "code": 745, "label": "˩", "popup": {
"main": { "code": 783, "label": "◌̏" }
} },
{ "code": 744, "label": "˨", "popup": {
"main": { "code": 768, "label": "◌̀" },
"relevant": [
{ "code": 780, "label": "◌̌" }
]
} },
{ "code": 743, "label": "˧", "popup": {
"main": { "code": 772, "label": "◌̄" }
} },
{ "code": 742, "label": "˦", "popup": {
"main": { "code": 769, "label": "◌́" },
"relevant": [
{ "code": 770, "label": "◌̂" }
]
} },
{ "code": 741, "label": "˥", "popup": {
"main": { "code": 779, "label": "◌̋" }
} },
{ "code": 865, "label": "◌͡", "popup": {
"main": { "code": 8255, "label": "‿" }
} }
],
[
{ "code": 776, "label": "◌̈" },
{ "code": 825, "label": "◌̹", "popup": {
"main": { "code": 855, "label": "◌͗" },
"relevant": [
{ "code": 796, "label": "◌̜" },
{ "code": 849, "label": "◌͑" }
]
} },
{ "code": 800, "label": "◌̠", "popup": {
"main": { "code": 727, "label": "◌˗" }
} },
{ "code": 771, "label": "◌̃", "popup": {
"main": { "code": 820, "label": "◌̴" },
"relevant": [
{ "code": 734, "label": "◌˞" }
]
} },
{ "code": 91, "label": "[", "popup": {
"relevant": [
{ "code": 40, "label": "(" },
{ "code": 11816, "label": "⸨" },
{ "code": 10214, "label": "⟦" },
{ "code": 10216, "label": "⟨" },
{ "code": 10218, "label": "⟩" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 93, "label": "]", "popup": {
"relevant": [
{ "code": 41, "label": ")" },
{ "code": 11817, "label": "⸩" },
{ "code": 10215, "label": "⟦" },
{ "code": 10217, "label": "⟩" },
{ "code": 10219, "label": "⟫" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 47, "label": "/", "popup": {
"main": { "code": 92, "label": "\\" },
"relevant": [
{ "code": 11005, "label": "⫽" },
{ "code": 8214, "label": "‖" },
{ "code": 124, "label": "|" }
]
} }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "symbols/mod",
"name": "default",
"name": "$default",
"label": "Default",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,102 @@
{
"type": "symbols",
"name": "persian",
"label": "Persian",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 1642, "label": "٪", "popup": {
"main": { "code": 37, "label": "%" },
"relevant": [
{ "code": 8453, "label": "℅" },
{ "code": 8240, "label": "‰" }
]
} },
{ "code": 38, "label": "&" },
{ "code": 45, "label": "-", "popup": {
"main": { "code": 95, "label": "_" },
"relevant": [
{ "code": 8212, "label": "—" },
{ "code": 8211, "label": "" },
{ "code": 183, "label": "·" }
]
} },
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 1643, "label": "٫", "popup": {
"main": { "code": 1644, "label": "٬" },
"relevant": [
{ "code": 42, "label": "*" },
{ "code": 34, "label": "\"" },
{ "code": 39, "label": "'" }
]
} }
],
[
{ "code": 47, "label": "/" },
{ "code": 171, "label": "«", "popup": {
"main": { "code": 8249, "label": "" },
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 8804, "label": "≤" },
{ "code":10216, "label": "⟨" }
]
} },
{ "code": 187, "label": "»", "popup": {
"main": { "code": 8250, "label": "" },
"relevant": [
{ "code":10217, "label": "⟩" },
{ "code": 8805, "label": "≥" },
{ "code": 62, "label": ">" }
]
} },
{ "code": 58, "label": ":", "popup": {
"main": { "code": 8942, "label": "⋮" }
} },
{ "code": 1563, "label": "؛", "popup": {
"main": { "code": 59, "label": ";" }
} },
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "code": 1567, "label": "؟", "popup": {
"main": { "code": 63, "label": "?" },
"relevant": [
{ "code": 191, "label": "¿" },
{ "code": 8253, "label": "‽" }
]
} }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "symbols",
"name": "western_default",
"name": "western",
"label": "Western",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
@@ -9,13 +10,13 @@
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": 36, "label": "$", "popup": {
"main": { "code": 8364, "label": "" },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": 8369, "label": "" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 37, "label": "%", "popup": {

View File

@@ -1,6 +1,7 @@
{
"type": "symbols2",
"name": "western_default",
"name": "eastern",
"label": "Eastern",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
@@ -36,10 +37,10 @@
{ "code": 8710, "label": "∆" }
],
[
{ "code": 163, "label": "£" },
{ "code": 162, "label": "¢" },
{ "code": 8364, "label": "" },
{ "code": 165, "label": "¥" },
{ "code": -805, "label": "currency_slot_5" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -802, "label": "currency_slot_2" },
{ "code": 94, "label": "^", "popup": {
"main": { "code": 8593, "label": "↑" },
"relevant": [

View File

@@ -0,0 +1,117 @@
{
"type": "symbols2",
"name": "ipa",
"label": "International Phonetic Alphabet",
"authors": [ "Huy-Ngo" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 809, "label": "◌̩", "popup": {
"main": { "code": 781, "label": "◌̍" }
} },
{ "code": 815, "label": "◌̯", "popup": {
"main": { "code": 785, "label": "◌̑" }
} },
{ "code": 794, "label": "◌̚" },
{ "code": 805, "label": "◌̥", "popup": {
"main": { "code": 778, "label": "◌̊" }
} },
{ "code": 828, "label": "◌̼" },
{ "code": 827, "label": "◌̻" },
{ "code": 804, "label": "◌̤" },
{ "code": 797, "label": "◌̝", "popup": {
"main": { "code": 724, "label": "◌˔" },
"relevant": [
{ "code": 798, "label": "◌̞" },
{ "code": 725, "label": "◌˕" },
{ "code": 792, "label": "◌̘" },
{ "code": 793, "label": "◌̙" }
]
} },
{ "code": 812, "label": "◌̬" },
{ "code": 829, "label": "◌̽" },
{ "code": 826, "label": "◌̺" }
],
[
{ "code": 816, "label": "◌̰" },
{ "code": 810, "label": "◌̪", "popup": {
"main": { "code": 838, "label": "◌͆" }
} },
{ "code": 826, "label": "◌̺" },
{ "code": 799, "label": "◌̟", "popup": {
"main": { "code": 726, "label": "◌˖" }
} },
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 37, "label": "%", "popup": {
"main": { "code": 8240, "label": "‰" },
"relevant": [
{ "code": 8453, "label": "℅" }
]
} },
{ "code": 38, "label": "&" },
{ "code": 45, "label": "-", "popup": {
"main": { "code": 95, "label": "_" },
"relevant": [
{ "code": 8212, "label": "—" },
{ "code": 8211, "label": "" },
{ "code": 183, "label": "·" }
]
} },
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} }
],
[
{ "code": 42, "label": "*", "popup": {
"main": { "code": 664, "label": "ʘ" },
"relevant": [
{ "code": 450, "label": "ǂ" }
]
} },
{ "code": 34, "label": "\"", "popup": {
"main": { "code": 8221, "label": "”" },
"relevant": [
{ "code": 8222, "label": "„" },
{ "code": 8220, "label": "“" },
{ "code": 171, "label": "«" },
{ "code": 187, "label": "»" }
]
} },
{ "code": 39, "label": "'", "popup": {
"main": { "code": 700, "label": "ʼ" },
"relevant": [
{ "code": 8218, "label": "" },
{ "code": 8216, "label": "" },
{ "code": 8217, "label": "" },
{ "code": 8249, "label": "" },
{ "code": 8250, "label": "" }
]
} },
{ "code": 58, "label": ":", "popup": {
"main": { "code": 8942, "label": "⋮" }
} },
{ "code": 59, "label": ";" },
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "code": 63, "label": "?", "popup": {
"main": { "code": 191, "label": "¿" },
"relevant": [
{ "code": 8253, "label": "‽" }
]
} }
]
]
}

View File

@@ -1,6 +1,7 @@
{
"type": "symbols2/mod",
"name": "default",
"name": "$default",
"label": "Default",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [

View File

@@ -0,0 +1,83 @@
{
"type": "symbols2",
"name": "persian",
"label": "Persian",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 126, "label": "~" },
{ "code": 96, "label": "`" },
{ "code": 124, "label": "|" },
{ "code": 8226, "label": "•", "popup": {
"main": { "code": 9834, "label": "♪" },
"relevant": [
{ "code": 9827, "label": "♣" },
{ "code": 9824, "label": "♠" },
{ "code": 9829, "label": "♥" },
{ "code": 9830, "label": "♦" }
]
} },
{ "code": 8730, "label": "√" },
{ "code": 960, "label": "π", "popup": {
"main": { "code": 928, "label": "Π" },
"relevant": [
{ "code": 969, "label": "ω" },
{ "code": 945, "label": "α" },
{ "code": 946, "label": "β" },
{ "code": 937, "label": "Ω" },
{ "code": 956, "label": "μ" }
]
} },
{ "code": 247, "label": "÷" },
{ "code": 215, "label": "×" },
{ "code": 182, "label": "¶", "popup": {
"main": { "code": 167, "label": "§" }
} },
{ "code": 8710, "label": "∆" }
],
[
{ "code": -805, "label": "currency_slot_5" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -802, "label": "currency_slot_2" },
{ "code": 94, "label": "^", "popup": {
"main": { "code": 8593, "label": "↑" },
"relevant": [
{ "code": 8592, "label": "←" },
{ "code": 8595, "label": "↓" },
{ "code": 8594, "label": "→" }
]
} },
{ "code": 176, "label": "°", "popup": {
"main": { "code": 8242, "label": "" },
"relevant": [
{ "code": 8243, "label": "″" }
]
} },
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8800, "label": "≠" },
"relevant": [
{ "code": 8734, "label": "∞" },
{ "code": 8776, "label": "≈" }
]
} },
{ "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
{ "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
{ "code": 92, "label": "\\" }
],
[
{ "code": 95, "label": "_" },
{ "code": 169, "label": "©" },
{ "code": 174, "label": "®" },
{ "code": 8482, "label": "™" },
{ "code": 10003, "label": "✓" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" }
]
]
}

View File

@@ -0,0 +1,83 @@
{
"type": "symbols2",
"name": "western",
"label": "Western",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 126, "label": "~" },
{ "code": 96, "label": "`" },
{ "code": 124, "label": "|" },
{ "code": 8226, "label": "•", "popup": {
"main": { "code": 9834, "label": "♪" },
"relevant": [
{ "code": 9827, "label": "♣" },
{ "code": 9824, "label": "♠" },
{ "code": 9829, "label": "♥" },
{ "code": 9830, "label": "♦" }
]
} },
{ "code": 8730, "label": "√" },
{ "code": 960, "label": "π", "popup": {
"main": { "code": 928, "label": "Π" },
"relevant": [
{ "code": 969, "label": "ω" },
{ "code": 945, "label": "α" },
{ "code": 946, "label": "β" },
{ "code": 937, "label": "Ω" },
{ "code": 956, "label": "μ" }
]
} },
{ "code": 247, "label": "÷" },
{ "code": 215, "label": "×" },
{ "code": 182, "label": "¶", "popup": {
"main": { "code": 167, "label": "§" }
} },
{ "code": 8710, "label": "∆" }
],
[
{ "code": -805, "label": "currency_slot_5" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -802, "label": "currency_slot_2" },
{ "code": 94, "label": "^", "popup": {
"main": { "code": 8593, "label": "↑" },
"relevant": [
{ "code": 8592, "label": "←" },
{ "code": 8595, "label": "↓" },
{ "code": 8594, "label": "→" }
]
} },
{ "code": 176, "label": "°", "popup": {
"main": { "code": 8242, "label": "" },
"relevant": [
{ "code": 8243, "label": "″" }
]
} },
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8800, "label": "≠" },
"relevant": [
{ "code": 8734, "label": "∞" },
{ "code": 8776, "label": "≈" }
]
} },
{ "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
{ "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
{ "code": 92, "label": "\\" }
],
[
{ "code": 95, "label": "_" },
{ "code": 169, "label": "©" },
{ "code": 174, "label": "®" },
{ "code": 8482, "label": "™" },
{ "code": 10003, "label": "✓" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" }
]
]
}

View File

@@ -68,6 +68,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#20388E3C"}
}
}

View File

@@ -71,6 +71,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#20388E3C"}
}
}

View File

@@ -68,6 +68,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#204CAF50"}
}
}

View File

@@ -72,6 +72,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#204CAF50"}
}
}

View File

@@ -68,6 +68,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#204CAF50"}
}
}

View File

@@ -72,6 +72,7 @@
"extractActionButton": {
"background": "@smartbarButton/background",
"foreground": "@smartbarButton/foreground"
}
},
"glideTrail": {"foreground": "#204CAF50"}
}
}

View File

@@ -59,6 +59,7 @@
"smartbarButton": {
"background": "@key/background",
"foreground": "@key/foreground"
}
},
"glideTrail": {"foreground": "#200479ed"}
}
}

View File

@@ -0,0 +1,65 @@
{
"$type": "dev.patrickgold.florisboard.ime.theme.Theme",
"name": "gboard_night",
"label": "Gboard Night",
"authors": [ "Netscaping" ],
"isNightTheme": true,
"attributes": {
"window": {
"colorPrimary": "#5e97f6",
"colorPrimaryDark": "#4285f4",
"colorAccent": "#FF9800",
"navigationBarColor": "@keyboard/background",
"navigationBarLight": "false",
"semiTransparentColor": "#20FFFFFF",
"textColor": "#FFFFFF"
},
"keyboard": {
"background": "#292e33"
},
"key": {
"background": "#484c4f",
"backgroundPressed": "#5e5e60",
"foreground": "@window/textColor",
"foregroundPressed": "@window/textColor",
"showBorder": "true"
},
"key:enter": {
"background": "@window/colorPrimary",
"backgroundPressed": "@window/colorPrimaryDark",
"foreground": "#FFFFFF",
"foregroundPressed": "#FFFFFF"
},
"key:shift:capslock": {
"foreground": "@window/colorAccent",
"foregroundPressed": "@window/colorAccent"
},
"media": {
"foreground": "@window/textColor",
"foregroundAlt": "#BDBDBD"
},
"oneHanded": {
"background": "#373c41",
"foreground": "#9b9da0"
},
"popup": {
"background": "#373c41",
"backgroundActive": "#5a5e60",
"foreground": "@window/textColor"
},
"privateMode": {
"background": "#A000FF",
"foreground": "#FFFFFF"
},
"smartbar": {
"background": "transparent",
"foreground": "#d4d5d6",
"foregroundAlt": "#73FFFFFF"
},
"smartbarButton": {
"background": "#FFFFFF",
"foreground": "#686868"
},
"glideTrail": {"foreground": "#205e97f6"}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,114 @@
package dev.patrickgold.florisboard.ime.clip
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.clip.provider.ClipboardItem
import dev.patrickgold.florisboard.ime.clip.provider.ItemType
import dev.patrickgold.florisboard.ime.core.FlorisBoard
class ClipboardHistoryItemAdapter(
private val dataSet: ArrayDeque<FlorisClipboardManager.TimedClipData>,
private val pins: ArrayDeque<ClipboardItem>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
class ClipboardHistoryTextViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(R.id.clipboard_history_item_text)
}
class ClipboardHistoryImageViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val imgView: ImageView = view.findViewById(R.id.clipboard_history_item_img)
}
companion object {
private const val MAX_SIZE: Int = 256
}
override fun getItemViewType(position: Int): Int {
return if (position < pins.size) {
// is a pin
pins[position].type.value
}else {
// regular history item
dataSet[position - pins.size].data.type.value
}
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
// Create a new view, which defines the UI of the list item
val vh = when (viewType) {
ItemType.IMAGE.value -> {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.clipboard_history_item_image, viewGroup, false)
ClipboardHistoryImageViewHolder(view)
}
ItemType.TEXT.value -> {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.clipboard_history_item_text, viewGroup, false)
ClipboardHistoryTextViewHolder(view)
}
else -> null
}!!
val clipboardInputManager = ClipboardInputManager.getInstance()
(vh.itemView as ClipboardHistoryItemView).keyboardView = clipboardInputManager.getClipboardHistoryView()
return vh
}
// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
when (viewHolder) {
is ClipboardHistoryTextViewHolder -> {
var text = if (position < pins.size) {
(viewHolder.itemView as ClipboardHistoryItemView).setPinned()
pins[position].text
}else {
(viewHolder.itemView as ClipboardHistoryItemView).setUnpinned()
dataSet[position - pins.size].data.text
}
if (text!!.length > MAX_SIZE) {
text = text.subSequence(0 until MAX_SIZE).toString() + "..."
}
viewHolder.textView.text = text
}
is ClipboardHistoryImageViewHolder -> {
val uri = if (position < pins.size) {
(viewHolder.itemView as ClipboardHistoryItemView).setPinned()
pins[position].uri
}else {
(viewHolder.itemView as ClipboardHistoryItemView).setUnpinned()
dataSet[position - pins.size].data.uri
}
viewHolder.imgView.clipToOutline = true
viewHolder.imgView.visibility = GONE
// For very large images, this can take a bit
FlorisClipboardManager.getInstance().executor.execute {
val resolver = FlorisBoard.getInstance().context.contentResolver
val inputStream = resolver.openInputStream(uri!!)
val drawable = Drawable.createFromStream(inputStream, "clipboard URI")
viewHolder.itemView.post {
viewHolder.imgView.setImageDrawable(drawable)
viewHolder.imgView.visibility = VISIBLE
}
}
}
}
}
override fun getItemCount() = pins.size + dataSet.size
}

View File

@@ -0,0 +1,86 @@
package dev.patrickgold.florisboard.ime.clip
import android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.FlorisBoard
import dev.patrickgold.florisboard.ime.theme.Theme
import dev.patrickgold.florisboard.ime.theme.ThemeManager
class ClipboardHistoryItemView: ConstraintLayout, ThemeManager.OnThemeUpdatedListener {
lateinit var keyboardView: ClipboardHistoryView
constructor(context: Context) : this(context, null as AttributeSet?)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
private var popupManager: ClipboardPopupManager? = null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
popupManager = ClipboardPopupManager(keyboardView, FlorisBoard.getInstance().popupLayerView, this)
setOnClickListener{
onClickItem()
}
setOnLongClickListener{
onLongClickItem()
}
val themeManager = ThemeManager.default()
themeManager.registerOnThemeUpdatedListener(this)
}
override fun onThemeUpdated(theme: Theme) {
background.setTint(theme.getAttr(Theme.Attr.KEY_BACKGROUND).toSolidColor().color)
val pin = findViewById<ImageView>(R.id.clipboard_pin).drawable
pin?.setTint(theme.getAttr(Theme.Attr.KEY_FOREGROUND).toSolidColor().color)
}
private fun onLongClickItem() : Boolean {
popupManager?.show(this)
return true
}
private fun onClickItem(){
val position = ClipboardInputManager.getInstance().getPositionOfView(this)
val instance = FlorisClipboardManager.getInstance()
val canPaste = instance.canBePasted(instance.peekHistoryOrPin(position))
if (canPaste) {
instance.pasteItem(position)
}else {
Toast.makeText(context, context.getString(R.string.clip__cant_paste), Toast.LENGTH_SHORT).show()
}
}
fun setPinned() {
val view = findViewById<TextView>(R.id.clipboard_history_item_text)
view?.run {
val params = layoutParams as LayoutParams
params.marginEnd = resources.getDimensionPixelSize(R.dimen.clipboard_text_item_pin_margin)
layoutParams = params
}
findViewById<ImageView>(R.id.clipboard_pin).visibility = VISIBLE
invalidate()
val themeManager = ThemeManager.default()
onThemeUpdated(themeManager.activeTheme)
}
fun setUnpinned(){
val view = findViewById<TextView>(R.id.clipboard_history_item_text)
// if text view, also update margin.
view?.run {
val params = layoutParams as LayoutParams
params.marginEnd = 0
layoutParams = params
invalidate()
}
findViewById<ImageView>(R.id.clipboard_pin).visibility = INVISIBLE
}
}

View File

@@ -0,0 +1,71 @@
package dev.patrickgold.florisboard.ime.clip
import android.content.Context
import android.util.AttributeSet
import android.widget.ImageButton
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.FlorisBoard
import dev.patrickgold.florisboard.ime.theme.Theme
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import kotlin.math.roundToInt
class ClipboardHistoryView : LinearLayout, FlorisBoard.EventListener,
ThemeManager.OnThemeUpdatedListener {
private val florisboard: FlorisBoard? = FlorisBoard.getInstanceOrNull()
private val themeManager: ThemeManager = ThemeManager.default()
var backButton: ImageButton? = null
private set
var clipText: TextView? = null
private set
var clipboardBar: LinearLayout? = null
private set
private var clipboardHistory: RecyclerView? = null
private var clearAll: ImageButton? = null
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onAttachedToWindow() {
super.onAttachedToWindow()
florisboard?.addEventListener(this)
themeManager.registerOnThemeUpdatedListener(this)
backButton = findViewById(R.id.back_to_keyboard_button)
clipText = findViewById(R.id.clipboard_text)
clipboardBar = findViewById(R.id.clipboard_bar)
clipboardHistory = findViewById(R.id.clipboard_history_items)
clearAll = findViewById(R.id.clear_clipboard_history)
onApplyThemeAttributes()
// lord alone knows why it doesn't work without this..
onThemeUpdated(themeManager.activeTheme)
}
override fun onDetachedFromWindow() {
themeManager.unregisterOnThemeUpdatedListener(this)
florisboard?.removeEventListener(this)
super.onDetachedFromWindow()
}
override fun onThemeUpdated(theme: Theme) {
val fgColor = theme.getAttr(Theme.Attr.KEY_FOREGROUND).toSolidColor().color
clipText?.setTextColor(fgColor)
backButton?.drawable?.setTint(fgColor)
clearAll?.setColorFilter(fgColor)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val height = florisboard?.inputView?.desiredMediaKeyboardViewHeight ?: 0.0f
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height.roundToInt(), MeasureSpec.EXACTLY))
}
}

View File

@@ -0,0 +1,218 @@
package dev.patrickgold.florisboard.ime.clip
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.view.MotionEvent
import android.view.View
import android.widget.*
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import dev.patrickgold.florisboard.BuildConfig
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.clip.provider.ClipboardItem
import dev.patrickgold.florisboard.ime.core.FlorisBoard
import dev.patrickgold.florisboard.ime.core.InputKeyEvent
import dev.patrickgold.florisboard.ime.core.InputView
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.key.KeyData
import kotlinx.coroutines.*
import kotlin.math.pow
/**
* Handles the clipboard view and allows for communication between UI and logic.
*/
class ClipboardInputManager private constructor() : CoroutineScope by MainScope(),
FlorisBoard.EventListener{
private val florisboard = FlorisBoard.getInstance()
private var repeatedKeyPressHandler: Handler? = null
private var recyclerView: RecyclerView? = null
private var adapter: ClipboardHistoryItemAdapter? = null
companion object {
private var instance: ClipboardInputManager? = null
@Synchronized
fun getInstance(): ClipboardInputManager {
if (instance == null) {
instance = ClipboardInputManager()
}
return instance!!
}
}
init {
florisboard.addEventListener(this)
}
override fun onCreateInputView() {
super.onCreateInputView()
repeatedKeyPressHandler = Handler(florisboard.context.mainLooper)
}
/**
* Called when a new input view has been registered. Used to initialize all media-relevant
* views and layouts.
*/
@SuppressLint("ClickableViewAccessibility")
override fun onRegisterInputView(inputView: InputView) {
launch(Dispatchers.Default) {
inputView.findViewById<ImageButton>(R.id.back_to_keyboard_button)
.setOnTouchListener { view, event -> onButtonPressEvent(view, event) }
inputView.findViewById<ImageButton>(R.id.clear_clipboard_history)
.setOnTouchListener { view, event -> onButtonPressEvent(view, event) }
recyclerView = inputView.findViewById(R.id.clipboard_history_items)
if (BuildConfig.DEBUG && adapter == null) {
error("initClipboard() not called")
}
recyclerView!!.adapter = adapter
val manager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
recyclerView!!.layoutManager = manager
}
}
/**
* Clean-up of resources and stopping all coroutines.
*/
override fun onDestroy() {
cancel()
instance = null
}
/**
* Returns a reference to the [ClipboardHistoryView]
*/
fun getClipboardHistoryView() : ClipboardHistoryView{
return FlorisBoard.getInstance().inputView?.mainViewFlipper?.getChildAt(2) as ClipboardHistoryView
}
/**
* Returns the adapter position of the view, i.e the position that the item is displayed at (including pins and
* history items).
*
* @param view The ClipboardHistoryItemView whose position is to be determined.
* @return The adapter position of the view
*/
fun getPositionOfView(view: View): Int {
return recyclerView?.getChildLayoutPosition(view)!!
}
/**
* Notify adapter that an item was inserted.
*
* @param position The position the item was inserted at
*/
fun notifyItemInserted(position: Int) = adapter?.notifyItemInserted(position)
/**
* Notify adapter that an item was removed
* @param position The position the item was removed from
*/
fun notifyItemRemoved(position: Int) = adapter?.notifyItemRemoved(position)
/**
* Notify adapter that an item range was removed.
* @param start The index the range starts at (inclusive)
* @param numberOfItems The number of items removed
*/
fun notifyItemRangeRemoved(start: Int, numberOfItems: Int) = adapter?.notifyItemRangeRemoved(start, numberOfItems)
/**
* Notify adapter that an item was moved
* @param from The original position
* @param to The final position
*/
fun notifyItemMoved(from: Int, to: Int) = adapter?.notifyItemMoved(from, to)
/**
* Notify adapter that an item was changed.
*
* @param i The position of the item
*/
fun notifyItemChanged(i: Int) = adapter?.notifyItemChanged(i)
/**
* Handles clicks on the back to keyboard button.
*/
private fun onButtonPressEvent(view: View, event: MotionEvent?): Boolean {
event ?: return false
val data = when (view.id) {
R.id.back_to_keyboard_button -> KeyData(code = KeyCode.SWITCH_TO_TEXT_CONTEXT)
R.id.clear_clipboard_history -> KeyData(code = KeyCode.CLEAR_CLIPBOARD_HISTORY)
else -> null
}!!
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
florisboard.keyPressVibrate()
florisboard.keyPressSound(data)
florisboard.textInputManager.inputEventDispatcher.send(InputKeyEvent.down(data))
}
MotionEvent.ACTION_UP -> {
florisboard.textInputManager.inputEventDispatcher.send(InputKeyEvent.up(data))
}
MotionEvent.ACTION_CANCEL -> {
florisboard.textInputManager.inputEventDispatcher.send(InputKeyEvent.cancel(data))
}
}
// MUST return false here so the background selector for showing a transparent bg works
return false
}
/**
* [recyclerView] will be linked to [dataSet] and [pins] when initialized.
*
* @param dataSet the data set to link to
* @param pins The pins to link to
*/
fun initClipboard(dataSet: ArrayDeque<FlorisClipboardManager.TimedClipData>, pins: ArrayDeque<ClipboardItem>) {
this.adapter = ClipboardHistoryItemAdapter(dataSet = dataSet, pins= pins)
}
/**
* Plays an animation of all items moving off the the clipboard from the top.
*
* @param start The index to start at (to ignore pins)
* @param size The size of the clipboard
* @return The time in millis till the last animation will complete.
*/
fun clearClipboardWithAnimation(start: Int, size: Int): Long {
// list of views to animate
val views = arrayListOf<View>()
for(i in 0 until size){
recyclerView?.findViewHolderForLayoutPosition(i + start)?.let {
views.add(it.itemView)
}
}
// animate the views
var delay = 1L
for (view in views) {
delay += (10 * delay.toDouble().pow(0.1)).toLong()
val an = view.animate().translationX(1500f)
an.startDelay = delay
an.duration = 250
}
// a little while later we reset the views so they can be reused.
Handler(Looper.getMainLooper()).postDelayed({
for (view in views) {
view.translationX = 0f
}
}, 450 + delay)
return 280 + delay
}
}

View File

@@ -0,0 +1,127 @@
package dev.patrickgold.florisboard.ime.clip
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import android.widget.LinearLayout
import android.widget.Space
import android.widget.TextView
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.FlorisBoard
import dev.patrickgold.florisboard.ime.popup.PopupLayerView
import kotlin.math.max
class ClipboardPopupManager(private val keyboardView: ClipboardHistoryView,
private val popupLayerView: PopupLayerView?,
private val clipboardHistoryItem: ClipboardHistoryItemView) {
private val popupView: ClipboardPopupView = LayoutInflater.from(keyboardView.context).inflate(R.layout.clip_popup_layout, null) as ClipboardPopupView
private var width = 0
private var height = 0
private var xOffset = 0
private var yOffset = 0
init {
popupLayerView?.addView(popupView)
}
private fun pinButtonListener() {
val pos = ClipboardInputManager.getInstance().getPositionOfView(clipboardHistoryItem)
val pinned = FlorisClipboardManager.getInstance().isPinned(pos)
if (pinned) {
FlorisClipboardManager.getInstance().unpinClip(pos)
hide()
} else {
FlorisClipboardManager.getInstance().pinClip(pos)
hide()
}
}
/**
* Show a popup.
*/
fun show(view: ClipboardHistoryItemView) {
val pinButton = popupView.findViewById<LinearLayout>(R.id.pin_clip_item)
pinButton.setOnClickListener {
pinButtonListener()
}
val pos = ClipboardInputManager.getInstance().getPositionOfView(clipboardHistoryItem)
val pinned = FlorisClipboardManager.getInstance().isPinned(pos)
if (pinned) {
pinButton.findViewById<TextView>(R.id.pin_clip_item_text).text = view.context.getString(R.string.clip__unpin_item)
}
val delete = popupView.findViewById<LinearLayout>(R.id.remove_from_history)
delete.setOnClickListener {
FlorisClipboardManager.getInstance().removeClip(pos)
hide()
}
val clipboardManager = FlorisClipboardManager.getInstance()
val clipItem = clipboardManager.peekHistoryOrPin(pos)
val pasteShouldBeEnabled = FlorisClipboardManager.getInstance().canBePasted(clipItem)
// the clipboard item has any of the supported mime types of the editor OR is plain text.
val paste = popupView.findViewById<LinearLayout>(R.id.paste_clip_item)
if (pasteShouldBeEnabled) {
paste.setOnClickListener {
FlorisClipboardManager.getInstance().pasteItem(pos)
hide()
}
popupView.findViewById<Space>(R.id.paste_clip_item_space).visibility = VISIBLE
paste.visibility = VISIBLE
}else {
popupView.findViewById<Space>(R.id.paste_clip_item_space).visibility = GONE
paste.visibility = GONE
}
FlorisBoard.getInstance().isClipboardContextMenuShown = true
popupLayerView?.clipboardPopupManager = this
popupLayerView?.intercept = popupView
calc(view)
popupView.properties.let {
it.width = this.width
it.height = this.height
it.xOffset = this.xOffset
it.yOffset = this.yOffset
}
popupView.show(keyboardView)
}
/**
* Calculate sizes of popup.
*/
private fun calc(view: ClipboardHistoryItemView) {
val widthMeasureSpec: Int = View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.AT_MOST)
val heightMeasureSpec: Int = View.MeasureSpec.makeMeasureSpec(100000, View.MeasureSpec.AT_MOST)
popupView.invalidate()
popupView.measure(widthMeasureSpec, heightMeasureSpec)
width = view.width * 4 / 5
height = popupView.measuredHeight
xOffset = view.x.toInt() + (view.width - width) / 2
// y offset is either where the top of the item is OR if the top is off screen, the top of the keyboard.
yOffset = max(view.y.toInt() - keyboardView.height - height / 2 - 20, keyboardView.y.toInt() - keyboardView.height - height / 2 - 20)
}
/**
* Hides a popup.
*/
fun hide() {
popupView.hide()
popupLayerView?.intercept = null
popupLayerView?.clipboardPopupManager = null
FlorisBoard.getInstance().isClipboardContextMenuShown = false
popupView.apply {
visibility = GONE
}
}
}

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