Compare commits

...

138 commits

Author SHA1 Message Date
Maximilian Friedersdorff
caad39421c Merge remote-tracking branch 'upstream/master' 2024-07-04 15:20:50 +01:00
Maximilian Friedersdorff
87c8bb668c Add print screen to layout 2024-07-04 15:17:45 +01:00
tmk
abc61783da hhkb: Update prebuilt firmware files 2024-03-19 21:06:49 +09:00
tmk
71c347df57 hhkb: Add eject key EJCT to default keymap 2024-03-19 19:53:26 +09:00
tmk
b5e5bfc0bd core: Add action code AC_STEJ 2024-03-19 19:51:41 +09:00
tmk
96f7be8642 core: Sort consumer usages 2024-03-19 19:50:52 +09:00
tmk
9eb9ccdb93 hhkb: Add EJCT to hasu keymap 2024-03-19 16:26:29 +09:00
tmk
3a0bad28ce core: Change Consumer Page usage for EJCT key #774
Consumer Page usage: 0xCC -> 0xB8
`[K|A]C_EJCT` sends same usage as Apple Magic Keyboard Eject key does.
2024-03-19 16:14:33 +09:00
tmk
943ae8c29d usb_usb: Update prebuilt firmware files 2024-03-08 08:52:41 +09:00
tmk
5ed16b1445 usb_hid: Fix for Unicomp Mini M #773
The keyboard sends 10 byte report, not 8.
2024-03-07 11:08:28 +09:00
a486aec34c Add a qwerty layer 2021-04-26 13:16:16 +01:00
2df1b4f9c2 Add end and home keys 2021-04-13 14:44:12 +01:00
2599c852eb Make a few more modifications to layout 2021-04-12 13:10:38 +01:00
32da16d6c8 Move arrow keys over wasd 2021-04-11 11:01:40 +01:00
3e8289b53c Add my keymap 2021-04-11 10:57:55 +01:00
Mark Sikora
7544754df4 Merge remote-tracking branch 'tmk/master' 2021-03-23 13:19:56 -04:00
Mark Sikora
9bb5b42a46 Merge remote-tracking branch 'tmk/master' 2020-11-15 15:42:11 -05:00
Mark Sikora
df8e7d58d9 Merge remote-tracking branch 'tmk/master' 2020-08-05 00:53:13 -04:00
Mark Sikora
43a46c8d28 Merge remote-tracking branch 'tmk/master' 2020-07-06 13:09:25 -04:00
Mark Sikora
574fc5e2e8 Merge remote-tracking branch 'tmk/master' 2020-06-08 15:52:01 -04:00
Mark Sikora
41c36024ba Merge remote-tracking branch 'tmk/master' 2020-05-03 20:55:11 -04:00
Mark Sikora
e1cbd227cc Merge remote-tracking branch 'tmk/master' 2020-04-06 11:21:23 -04:00
Mark Sikora
fc40073bbc Merge remote-tracking branch 'tmk/master' 2020-03-15 14:22:09 -04:00
Mark Sikora
2ac00aa8a1 Merge remote-tracking branch 'tmk/master' 2020-01-12 14:23:17 -05:00
Mark Sikora
eeb596b283 Merge remote-tracking branch 'tmk/master' 2019-05-05 17:22:43 -04:00
Mark Sikora
791611add5 Merge remote-tracking branch 'tmk/master' 2019-03-05 01:06:40 -05:00
Mark Sikora
5f4412a1a4 Inline functions need to be declared as static 2018-04-14 17:24:16 -04:00
Mark Sikora
69a2a92f9d Add include guards 2018-04-14 17:19:39 -04:00
Mark Sikora
fd38f04ead Merge remote-tracking branch 'tmk/master' 2018-04-14 17:08:42 -04:00
Mark Sikora
79159729cd Update I2C library 2017-04-23 20:12:22 -04:00
Mark Sikora
f7b0c6f1fc fn_actions is now of type action_t 2017-04-23 17:10:39 -04:00
Mark Sikora
34f376868e Merge remote-tracking branch 'tmk/master' 2017-04-23 16:59:18 -04:00
Mark Sikora
a13f6b8f2a Full symbol layer for blazak layout 2017-04-23 16:49:40 -04:00
Paul Williamson
163c66d019 Merge pull request #36 from squarefrog/colemak
Add colemak layout
2016-06-20 09:18:36 +01:00
Mark Sikora
ad1c559492 Merge remote-tracking branch 'tmk/master' 2016-06-18 18:22:19 -04:00
Mark Sikora
f852668691 Missing headers in dvorak layout 2016-06-18 16:15:04 -04:00
Paul Williamson
cbf4e5b6ff Update dvorak to new layout scheme 2016-06-07 19:49:08 +01:00
Paul Williamson
6b4ce8606c Remove duplicated keymap 2016-06-07 19:31:58 +01:00
Paul Williamson
95577a6430 Merge branch 'Xyverz-master'
* Xyverz-master:
  Dvorak Keymap Layout
  Xyverz's Dvorak Layout
  keymap_xyvers.h
2016-06-07 19:31:40 +01:00
Paul Williamson
545edfee92 Merge branch 'master' of https://github.com/Xyverz/tmk_keyboard into Xyverz-master
* 'master' of https://github.com/Xyverz/tmk_keyboard:
  Dvorak Keymap Layout
  Xyverz's Dvorak Layout
  keymap_xyvers.h
2016-06-07 19:28:46 +01:00
Paul Williamson
5e1d5a8f42 Add colemak layout 2016-06-07 11:29:43 +01:00
Mark Sikora
0c0e620319 Merge pull request #34 from cub-uanic/cleanup
Cleanup file structure to more closely match tmk
2016-05-29 13:39:12 -04:00
Xyverz
6edd0fff37 Dvorak Keymap Layout 2016-05-28 22:56:26 -07:00
Xyverz
1e0d8bf6b7 Xyverz's Dvorak Layout 2016-05-28 19:52:33 -07:00
Xyverz
2c88850bea keymap_xyvers.h
My Dvorak layout
2016-05-28 19:51:30 -07:00
Mark Sikora
3eeb7ca9f9 Cleanup whitespace 2016-05-28 20:49:40 -04:00
Mark Sikora
5b30bb5343 Cleanup file structure to more closely match tmk 2016-05-28 19:51:38 -04:00
Mark Sikora
6d1ac77109 Fix compiler warning 2016-05-28 19:27:14 -04:00
Mark Sikora
40e24e7ee9 Merge pull request #24 from marknsikora/master
Merge upstream changes
2016-04-14 11:26:21 -04:00
Mark Sikora
62c9e3af63 Merge remote-tracking branch 'tmk/master' 2016-02-07 16:30:46 -05:00
Mark Sikora
9d440fc01b Change TMK_DIR setting 2015-07-19 16:12:22 -04:00
Mark Sikora
9a451a5b1c Change TOP_DIR to TMK_DIR in makefiles 2015-07-19 16:10:13 -04:00
Mark Sikora
e1f1a65d6b Merge remote-tracking branch 'tmk/master' 2015-07-19 14:56:30 -04:00
Oleg Kostyuk
a620448e7b Merge remote-tracking branch 'tmk/master'
Conflicts:
	README.md
2015-02-10 02:22:26 +02:00
Oleg Kostyuk
c375334bf5 Updates to Ergodox-FAQ.md 2015-01-04 05:42:29 +02:00
Oleg Kostyuk
1b58b13e30 Updates to local gitignore 2015-01-03 15:36:29 +02:00
Oleg Kostyuk
4478c7cb95 Updates to Ergodox-FAQ.md 2015-01-03 15:13:31 +02:00
Oleg Kostyuk
de5fe82386 Include $(TOP_DIR)/protocol.mk 2015-01-03 13:55:52 +02:00
Oleg Kostyuk
eeb6463091 Change key_t to keypos_t - follow Hasu's style 2015-01-03 00:12:17 +02:00
Oleg Kostyuk
77815a2959 Merge remote-tracking branch 'tmk/master' into cub_layout 2015-01-02 23:55:55 +02:00
Oleg Kostyuk
c5d3988e7a Merge remote-tracking branch 'tmk/master' into cub_layout 2014-12-18 03:34:34 +02:00
Oleg Kostyuk
0c95282d3d Updates to CUB's layout 2014-12-18 03:08:47 +02:00
Oleg Kostyuk
7c1ed424f1 Merge pull request #11 from quantentunnels/cub_layout
Fixed a bug in default keymap
2014-11-21 00:09:15 +02:00
Marius Hintsche
4094fc62da fixed bug in numpadlayer in default keymap
there was no way to leave that layer
2014-11-14 23:34:08 +01:00
Oleg Kostyuk
5748f1af6a Updates to CUB's layout 2014-09-18 20:17:35 +03:00
Oleg Kostyuk
ed8a8114d9 Updates to CUB's layout 2014-09-04 19:49:51 +03:00
Oleg Kostyuk
8ecb3e9e44 Merge remote-tracking branch 'tmk/master' into cub_layout 2014-09-04 19:47:33 +03:00
Oleg Kostyuk
39ff9ac3d2 Updates to Ergodox-FAQ.md 2014-08-03 13:38:21 +03:00
Oleg Kostyuk
ff5f1b0552 Updates to Ergodox-FAQ.md 2014-07-29 01:51:00 +03:00
Oleg Kostyuk
5d8b9cb1c6 Initial version of Ergodox-FAQ.md 2014-07-26 02:49:14 +03:00
Oleg Kostyuk
89b2e49b1e Updates to CUB's layout - improvements on Layer9 2014-07-16 00:13:34 +03:00
Oleg Kostyuk
190dd9a18c Updates to CUB's layout - improvements on Layer9 2014-07-15 23:07:16 +03:00
Oleg Kostyuk
4603cdf134 Updates to CUB's layout - improvements on Layer9 2014-07-15 17:41:59 +03:00
Oleg Kostyuk
f2791c2e37 Updates to CUB's layout - created Layer9 (app-specific shortcuts) 2014-07-15 17:28:37 +03:00
Oleg Kostyuk
53030f1b65 Updates to CUB's layout - change TAPPING_TERM 2014-07-01 13:20:34 +03:00
Oleg Kostyuk
0a4cc0db31 Merge remote-tracking branch 'tmk/master' into cub_layout 2014-07-01 13:17:09 +03:00
Oleg Kostyuk
76c7ebebd7 Updates to CUB's layout - improvements on Layer8 2014-06-22 02:03:43 +03:00
Oleg Kostyuk
1ed80a9a67 Updates to CUB's layout - improvements on Layer4 2014-06-21 00:35:22 +03:00
Oleg Kostyuk
a26af7ca07 Merge remote-tracking branch 'tmk/master' into cub_layout 2014-04-23 01:47:47 +03:00
Oleg Kostyuk
7cd04d97b5 Added support for per-layer FN-translations 2014-04-23 01:39:51 +03:00
Oleg Kostyuk
2405c989b0 Added example how to handle custom keys 2014-04-23 01:22:07 +03:00
Oleg Kostyuk
2381945e30 Updates to CUB's layout - rearrange FN-keys 2014-04-22 20:50:20 +03:00
Oleg Kostyuk
793e6dc1a2 Updates to CUB's layout 2014-04-16 05:03:30 +03:00
Oleg Kostyuk
1cf2ea29dc Updates to CUB's layout - redefined mouse constants 2014-04-16 04:41:00 +03:00
Oleg Kostyuk
77e946432e Updates to CUB's layout - added media keys 2014-04-16 04:28:27 +03:00
Oleg Kostyuk
897daee456 Updates to CUB's layouts 2014-04-16 04:17:37 +03:00
Oleg Kostyuk
b08d4e7f69 Change PRODUCT_ID to custom value 2014-04-16 04:14:51 +03:00
Oleg Kostyuk
139ab7a418 Reimplement FN21/FN22 - same Layer5/Layer6 but with permanent CTRL+ALT 2014-04-16 03:54:43 +03:00
Oleg Kostyuk
4bc8e4018d Lower delay for reboot by TEENSY_KEY 2014-04-16 03:53:00 +03:00
Oleg Kostyuk
eb9c38ff94 Remove unused code 2014-04-16 03:51:47 +03:00
Oleg Kostyuk
b236b2c616 Fix compiler warning 2014-04-16 03:50:23 +03:00
Oleg Kostyuk
5ddefef79f Updates to keyboard layout switcher script 2014-04-16 02:09:52 +03:00
Oleg Kostyuk
15516618e1 Added keyboard definition file for KTouch 2014-03-30 22:07:24 +03:00
Oleg Kostyuk
57c6b597ea Merge remote-tracking branch 'tmk/master' into cub_layout 2014-03-30 05:49:58 +03:00
Oleg Kostyuk
d2427380e3 Update of IS_COMMAND (thanks to ibm4704 branch) 2014-03-30 05:49:01 +03:00
Oleg Kostyuk
8a91d0e90c Switch fn_actions[] to use position-independent syntax 2014-03-30 05:25:24 +03:00
Oleg Kostyuk
91bd988d6e Rename DEBUG_MATRIX_FREQ to more appropriate DEBUG_MATRIX_SCAN_RATE 2014-03-30 05:04:21 +03:00
Oleg Kostyuk
976b595c2e Update TODO file 2014-03-30 05:02:44 +03:00
Oleg Kostyuk
142820c687 Updates to CUB's layouts 2014-03-30 04:30:32 +03:00
Oleg Kostyuk
fc78fac72b Updates to CUB's layouts 2013-11-04 04:17:53 +02:00
Oleg Kostyuk
f3f7f0e1e2 Updates to CUB's layouts 2013-10-28 15:17:05 +02:00
Oleg Kostyuk
33c4f039d1 Refactor mcp23018_status and give possibility to re-attach left side 2013-10-17 04:11:24 +03:00
Oleg Kostyuk
0a554052b4 Updates to CUB's layouts 2013-10-14 23:31:13 +03:00
Oleg Kostyuk
04949711f4 Bugfix: wrong order during init
All credits to Tensor@geekhack
http://geekhack.org/index.php?topic=48106.msg1076661#msg1076661
2013-10-14 23:06:36 +03:00
Oleg Kostyuk
06dbf89043 Added MicroDox layout
Inspired by MicroDox:
  http://geekhack.org/index.php?topic=42231.msg1062851#msg1062851
  https://www.massdrop.com/ext/ergodox/?referer=CTL63V&hash=9ff8ddbb75e03e517aaa39acabc81669
2013-10-08 12:58:54 +03:00
Oleg Kostyuk
e93188021c Merge remote-tracking branch 'tmk/master' into cub_layout 2013-10-08 10:36:18 +03:00
Oleg Kostyuk
cdd19b95dd Updates to CUB's layouts 2013-10-07 16:53:01 +03:00
Oleg Kostyuk
a051019642 Typo fix 2013-10-07 16:52:26 +03:00
Oleg Kostyuk
7a3ad79b0a Updates to CUB's layouts 2013-09-25 22:21:50 +03:00
Oleg Kostyuk
1867cd48f9 Updates to CUB's layouts 2013-09-25 22:13:27 +03:00
Oleg Kostyuk
e56edbfe90 Updates to CUB's layouts 2013-09-25 22:05:13 +03:00
Oleg Kostyuk
a6146082fb Updates to CUB's layouts 2013-09-25 18:28:13 +03:00
Oleg Kostyuk
27e3da508e Update Makefile.lufa per Hasu recommendation 2013-09-25 17:03:33 +03:00
Oleg Kostyuk
3be39e436d Merge remote-tracking branch 'tmk/master' into cub_layout 2013-09-25 14:38:39 +03:00
Oleg Kostyuk
221af6bffb Experimental additions to LUFA makefile 2013-09-20 22:07:50 +03:00
Oleg Kostyuk
3b1e5a9ce9 Experimenting with layout and layout indication 2013-09-20 22:06:30 +03:00
Oleg Kostyuk
b32f56dff9 Typo fix 2013-09-20 22:05:22 +03:00
Oleg Kostyuk
f5f7a1793a Added makefile for LUFA stack 2013-09-16 13:38:04 +03:00
Oleg Kostyuk
41845b485f TODO updated 2013-09-16 13:38:04 +03:00
Oleg Kostyuk
fb7dba08a3 Split Layer2 into two independent layers 2013-09-16 13:38:04 +03:00
Oleg Kostyuk
1f7cd390ae Remove unused layer 2013-09-16 05:56:21 +03:00
Oleg Kostyuk
065e4e3dd5 Layers reordered, according to Hasu's reccomendation + minor tweaks 2013-09-16 05:56:21 +03:00
Oleg Kostyuk
d30fba8ce2 Additional optimization, reach speed 368 scans/second 2013-09-16 05:22:06 +03:00
Oleg Kostyuk
a84df046df Updates to CUB's layouts
This update is mainly needed because Ergodox's layout should be as much
possible closer to original QWERTY layout, to not break XKB layout in
XOrg for Russian language.

Also, because Ergodox's switches SW5.7 and SW5.8 are not as convenient
as I'd like to - additional mappings were added on Layer7 for following
symbols: ^ ' " \
2013-09-10 04:30:46 +03:00
Oleg Kostyuk
c119ccaf72 Decreasing default TAPPING_TERM 2013-09-09 20:05:09 +03:00
Oleg Kostyuk
ea5bf49b89 New layer for F* keys 2013-09-09 19:58:53 +03:00
Oleg Kostyuk
c1f7bb00b2 Additional switch to L2 2013-09-09 19:52:46 +03:00
Oleg Kostyuk
3478abd6bf Added tap ESC on LGui - handy for Vim 2013-09-09 19:27:38 +03:00
Oleg Kostyuk
5aaf797455 Updates to CUB's layouts 2013-09-09 05:46:46 +03:00
Oleg Kostyuk
260d7b7707 Change I2C clock speed to 444 kHz 2013-09-09 02:54:24 +03:00
Oleg Kostyuk
5329bbefee Optimizing I2C 2013-09-09 02:04:20 +03:00
Oleg Kostyuk
777d1fba76 Switch TWI library to use 400kHz 2013-09-09 01:33:29 +03:00
Oleg Kostyuk
39da065913 Converting files to Unix-like format 2013-09-09 01:30:44 +03:00
Oleg Kostyuk
6b7921f91b Added debug counter of matrix scan frequency 2013-09-08 18:26:38 +03:00
Oleg Kostyuk
e6ad104bd8 Added handy switching for RShift and RCtrl 2013-09-05 23:51:55 +03:00
Oleg Kostyuk
5a7330dde4 Added handy switching to L2 to use Mouse keys 2013-09-05 01:12:48 +03:00
Oleg Kostyuk
9a673adb27 Modified CUB layout 2013-09-05 00:03:42 +03:00
Oleg Kostyuk
cfc23836e5 Implementation for Ergodox project 2013-09-04 23:55:43 +03:00
46 changed files with 19282 additions and 13058 deletions

145
README.md
View file

@ -19,3 +19,148 @@ License
**GPLv2** or later. Some protocol files are under **Modified BSD License**.
Third party libraries like LUFA, PJRC and V-USB have their own license respectively.
Build Firmware and Program Controller
-------------------------------------
See [tmk_core/doc/build.md](tmk_core/doc/build.md).
Change your keymap
------------------
See [tmk_core/doc/keymap.md](tmk_core/doc/keymap.md).
Magic Commands
--------------
To see help press `Magic` + `H`.
`Magic` key combination is `LShift` + `RShift` in many projects, but `Power` key on ADB converter.
`Magic` keybind can be vary on each project, check `config.h` in project directory.
Following commands can be also executed with `Magic` + key. In console mode `Magic` keybind is not needed.
----- Command Help -----
c: enter console mode
d: toggle debug enable
x: toggle matrix debug
k: toggle keyboard debug
m: toggle mouse debug
v: print device version & info
t: print timer count
s: print status
e: print eeprom config
n: toggle NKRO
0/F10: switch to Layer0
1/F1: switch to Layer1
2/F2: switch to Layer2
3/F3: switch to Layer3
4/F4: switch to Layer4
PScr: power down/remote wake-up
Caps: Lock Keyboard(Child Proof)
Paus: jump to bootloader
Boot Magic Configuration - Virtual DIP Switch
---------------------------------------------
Boot Magic are executed during boot up time. Press Magic key below then plug in keyboard cable.
Note that you must use keys of **Layer 0** as Magic keys. These settings are stored in EEPROM so that retain your configure over power cycles.
To avoid configuring accidentally additive salt key `KC_SPACE` also needs to be pressed along with the following configuration keys. The salt key is configurable in `config.h`. See [tmk_core/common/bootmagic.h](tmk_core/common/bootmagic.h).
#### General
- Skip reading EEPROM to start with default configuration(`ESC`)
- Clear configuration stored in EEPROM to reset configuration(`Backspace`)
#### Bootloader
- Kick up Bootloader(`B`)
#### Debug
- Debug enable(`D`)
- Debug matrix enable(`D`+`X`)
- Debug keyboard enable(`D`+`K`)
- Debug mouse enable(`D`+`M`)
#### Keymap
- Swap Control and CapsLock(`Left Control`)
- Change CapsLock to Control(`Caps Lock`)
- Swap LeftAlt and Gui(`Left Alt`)
- Swap RightAlt and Gui(`Right Alt`)
- Disable Gui(`Left Gui`)
- Swap Grave and Escape(`Grave`)
- Swap BackSlash and BackSpace(`Back Slash`)
- Enable NKRO on boot(`N`)
#### Default Layer
- Set Default Layer to 0(`0`)
- Set Default Layer to 1(`1`)
- Set Default Layer to 2(`2`)
- Set Default Layer to 3(`3`)
- Set Default Layer to 4(`4`)
- Set Default Layer to 5(`5`)
- Set Default Layer to 6(`6`)
- Set Default Layer to 7(`7`)
Mechanical Locking support
--------------------------
This feature makes it possible for you to use mechanical locking switch for `CapsLock`, `NumLock`
or `ScrollLock`. To enable this feature define these macros in `config.h` and use `KC_LCAP`, `KC_LN
UM` or `KC_LSCR` in keymap for locking key instead of normal `KC_CAPS`, `KC_NLCK` or `KC_SLCK`. Res
ync option tries to keep switch state consistent with keyboard LED state.
#define LOCKING_SUPPORT_ENABLE
#define LOCKING_RESYNC_ENABLE
Start Your Own Project
-----------------------
1. Add `tmk_core` into your repository using `git submodule` or `git subtree`.
2. Copy files from `tmk_keybaord` or other project similar to yours
3. Edit those files to support your keyboard.
See these as examples.
- https://github.com/tmk/infinity_ergodox
- https://github.com/tmk/whitefox
Debugging
--------
Use PJRC's `hid_listen` to see debug messages. You can use xprintf() to display debug info, see `tmk_core/common/xprintf.h`.
- https://www.pjrc.com/teensy/hid_listen.html
Files and Directories
-------------------
### Top
* keyboard/ - keyboard projects
* converter/ - protocol converter projects
* tmk_core/ - core library
* tmk_core/doc/ - documents
Contribution
------------
- Report bugs in github **[Issues](https://github.com/tmk/tmk_keyboard/issues)**.
- Pull requets are also welcomed.
Coding Style
-------------
- Doesn't use Tab to indent, use 4-spaces instead.
Other Keyboard Firmware Projects
------------------
You can learn a lot about keyboard firmware from these. See [Other Projects](https://github.com/tmk/tmk_keyboard/wiki/Other-Protjects) other than TMK.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

2
keyboard/ergodox/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
keymap_passwords.h
keymap_passwords_cub.h

View file

@ -0,0 +1,72 @@
# TMK Generic
* I'm not sure what the Magic + H does.
Is this a menu that will pop up regardless of what platform and program is open?
Yes, this is sort of debugging.
Use PJRC's [hid_listen](https://www.pjrc.com/teensy/hid_listen.html) to see debug messages.
# TMK/Ergodox specific
* I would like to configure my leds to indicate the active layer.
I read that can be done, but I haven't seen an example for this firmware.
Can someone please post an example or a link?
TMK for Ergodox have support for seven (!) led's:
- three on right
- three on left (see http://geekhack.org/index.php?topic=22780.msg873819#msg873819 for more details)
- Teensy onboard led as well
Any of these leds can be used as layer indicator or NumLock/CapsLock/ScrollLock led.
[Here is example](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/matrix.c#L121-167)
how you can assign some meaning to each led.
In this code only left leds are used to show layers, but you can
[change `led_set()`](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/led.c)
and do anything you want with all leds.
# Firmware
#### Where to get binaries?
https://github.com/cub-uanic/tmk_keyboard/releases
#### Where to get sources?
https://github.com/cub-uanic/tmk_keyboard/tree/master
#### How to compile?
cd tmk_keyboard/keyboard/ergodox
# just to be safe
make -f Makefile.lufa clean
# use one of these
make -f Makefile.lufa
make -f Makefile.lufa dvorak
make -f Makefile.lufa colemak
make -f Makefile.lufa workman
make -f Makefile.lufa micro
make -f Makefile.lufa cub
# Layouts
TODO description of layouts in base firmware binaries
# Things TO-DO
- [ ] Flash NumLock led only when "numpad" layer is active
- [ ] Command (in terms of IS_COMMAND) to switch to no-leds mode
- [ ] Increase count of ACTION keys
- [ ] Fix command_state() onboard led: it should flash only when kbd in some specific mode (CONSOLE || MOUSE)
- [ ] ergodox_blink_all_leds() should save current state of leds, and restore after blink. initial state of all leds == off
- [ ] add support for pseudo-backlight (reversed LEDs) + docs/photo
- [ ] command to debug all LEDs (on/off/blink)
- [ ] proper (in-core) implementation of DEBUG_MATRIX_SCAN_RATE (non-Ergodox specific)
- [ ] proper (in-core) support for per-layer fn_actions[]
- [ ] create one-handed layouts, see
http://half-qwerty.com/
https://geekhack.org/index.php?topic=60165.0
https://www.massdrop.com/ext/ergodox/?hash=e097c3b9932179055023d47e48b25f1d

View file

@ -0,0 +1,129 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = ergodox_lufa
# Directory common source filess exist
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# project specific files
SRC = keymap_common.c \
matrix.c \
led.c \
ergodox.c \
twimaster.c
ifdef KEYMAP
SRC := keymap_$(KEYMAP).c $(SRC)
else
SRC := keymap_blazak.c $(SRC)
endif
CONFIG_H = config.h
# MCU name, you MUST set this to match the board you are using
# type "make clean" after changing this, so all files will be rebuilt
MCU = atmega32u4
#MCU = at90usb1286
# Processor frequency.
# Normally the first thing your program should do is set the clock prescaler,
# so your program will run at the correct speed. You should also set this
# variable to same clock speed. The _delay_ms() macro uses this, and many
# examples use this variable to calculate timings. Do not add a "UL" here.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Atmel DFU loader 4096
# LUFA bootloader 4096
OPT_DEFS += -DBOOTLOADER_SIZE=512
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover (+500)
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
INVERT_NUMLOCK = yes # invert state of NumLock led
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TMK_DIR)
include $(TMK_DIR)/protocol.mk
include $(TMK_DIR)/protocol/lufa.mk
include $(TMK_DIR)/common.mk
include $(TMK_DIR)/rules.mk

View file

@ -0,0 +1,108 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = ergodox_pjrc
# Directory common source filess exist
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# project specific files
SRC = keymap_common.c \
matrix.c \
led.c \
ergodox.c \
twimaster.c
ifdef KEYMAP
SRC := keymap_$(KEYMAP).c $(SRC)
else
SRC := keymap_blazak.c $(SRC)
endif
CONFIG_H = config.h
# MCU name, you MUST set this to match the board you are using
# type "make clean" after changing this, so all files will be rebuilt
MCU = atmega32u4
#MCU = at90usb1286
# Processor frequency.
# Normally the first thing your program should do is set the clock prescaler,
# so your program will run at the correct speed. You should also set this
# variable to same clock speed. The _delay_ms() macro uses this, and many
# examples use this variable to calculate timings. Do not add a "UL" here.
F_CPU = 16000000
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Atmel DFU loader 4096
# LUFA bootloader 4096
OPT_DEFS += -DBOOTLOADER_SIZE=512 -DFLASH_SIZE_BYTES=0x8000
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover (+500)
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
INVERT_NUMLOCK = yes # invert state of NumLock led
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TMK_DIR)
include $(TMK_DIR)/protocol.mk
include $(TMK_DIR)/protocol/pjrc.mk
include $(TMK_DIR)/common.mk
include $(TMK_DIR)/rules.mk

View file

@ -0,0 +1,18 @@
#!/bin/sh
if [ "`id -u`" = "0" ]; then
[ -d /usr/share/kde4/apps/ktouch/ ] && cp ~/etc/layout/ktouch/workman* /usr/share/kde4/apps/ktouch/
cp ~/etc/layout/xkb/workman /usr/share/X11/xkb/symbols/workman
cat /usr/share/X11/xkb/symbols.dir | grep -v workman > /usr/share/X11/xkb/symbols.dir.new
cat ~/etc/layout/xkb/symbols.dir.workman >> /usr/share/X11/xkb/symbols.dir.new
mv /usr/share/X11/xkb/symbols.dir.new /usr/share/X11/xkb/symbols.dir
echo "Now you could run these command to set Workman-Dvorak-P, Workman-Cub-P, Dvorak-P or QWERTY layouts:"
echo " setxkbmap -layout workman,ru -variant wdp,"
echo " setxkbmap -layout workman,ru -variant wcp, # for usual keyboard"
echo " setxkbmap -layout workman,ru -variant wce, # for Ergodox keyboard"
echo " setxkbmap -layout us,ru -variant dvp,"
echo " setxkbmap -layout us,ru -variant ,"
else
echo "You should run this from root account"
exit 1
fi

View file

@ -0,0 +1,26 @@
#!/bin/sh
xset r rate 350 80
opts='-model pc104 -option grp:caps_toggle,grp_led:scroll'
case "$1" in
dvorak)
setxkbmap $opts -layout us,ru -variant dvp,
;;
carpalx)
setxkbmap $opts -layout carpalx,ru -variant qgmlwb-p,
;;
workman)
variant='wcp,'
lsusb | grep -qi FEED:1307 && variant='wce,'
[ -e ~/.force_ergodox ] && variant='wce,'
[ -e ~/.force_plain ] && variant='wcp,'
setxkbmap $opts -layout workman,ru -variant "$variant"
;;
*)
# US or unknown layout - setting US
setxkbmap $opts -layout us,ru
;;
esac

View file

@ -0,0 +1,294 @@
<KTouchKeyboard>
<Title>English Workman layout for programmers from cub@uanic (old)</Title>
<Comment>English Workman layout for programmers from cub@uanic (old)</Comment>
<Language>en (English)</Language>
<Keys>
<Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
<Char Unicode="65" Position="TopLeft">A</Char>
</Key>
<Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
<Char Unicode="83" Position="TopLeft">S</Char>
</Key>
<Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
<Char Unicode="72" Position="TopLeft">H</Char>
</Key>
<Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
<Char Unicode="84" Position="TopLeft">T</Char>
</Key>
<Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
<Char Unicode="78" Position="TopLeft">N</Char>
</Key>
<Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
<Char Unicode="69" Position="TopLeft">E</Char>
</Key>
<Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
<Char Unicode="79" Position="TopLeft">O</Char>
</Key>
<Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
<Char Unicode="73" Position="TopLeft">I</Char>
</Key>
<Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
<Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
<Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
<Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
<Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
<Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
<Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
<Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="96" Position="TopLeft">`</Char>
<Char Unicode="126" Position="BottomLeft">~</Char>
</Key>
<Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="49" Position="TopLeft">1</Char>
<Char Unicode="33" Position="BottomLeft">!</Char>
</Key>
<Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="50" Position="TopLeft">2</Char>
<Char Unicode="123" Position="BottomLeft">{</Char>
</Key>
<Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="51" Position="TopLeft">3</Char>
<Char Unicode="35" Position="BottomLeft">#</Char>
</Key>
<Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="52" Position="TopLeft">4</Char>
<Char Unicode="59" Position="BottomLeft">;</Char>
</Key>
<Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="53" Position="TopLeft">5</Char>
<Char Unicode="125" Position="BottomLeft">}</Char>
</Key>
<Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="54" Position="TopLeft">6</Char>
<Char Unicode="91" Position="BottomLeft">[</Char>
</Key>
<Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="55" Position="TopLeft">7</Char>
<Char Unicode="38" Position="BottomLeft">&amp;</Char>
</Key>
<Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="56" Position="TopLeft">8</Char>
<Char Unicode="42" Position="BottomLeft">*</Char>
</Key>
<Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="57" Position="TopLeft">9</Char>
<Char Unicode="40" Position="BottomLeft">(</Char>
</Key>
<Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="48" Position="TopLeft">0</Char>
<Char Unicode="41" Position="BottomLeft">)</Char>
</Key>
<Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="37" Position="TopLeft">%</Char>
<Char Unicode="93" Position="BottomLeft">]</Char>
</Key>
<Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="43" Position="TopLeft">+</Char>
<Char Unicode="61" Position="BottomLeft">=</Char>
</Key>
<Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="81" Position="TopLeft">Q</Char>
</Key>
<Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="68" Position="TopLeft">D</Char>
</Key>
<Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="82" Position="TopLeft">R</Char>
</Key>
<Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="87" Position="TopLeft">W</Char>
</Key>
<Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="66" Position="TopLeft">B</Char>
</Key>
<Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="74" Position="TopLeft">J</Char>
</Key>
<Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="70" Position="TopLeft">F</Char>
</Key>
<Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="85" Position="TopLeft">U</Char>
</Key>
<Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="80" Position="TopLeft">P</Char>
</Key>
<Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="64" Position="TopLeft">@</Char>
<Char Unicode="36" Position="BottomLeft">$</Char>
</Key>
<Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="94" Position="TopLeft">^</Char>
<Char Unicode="58" Position="BottomLeft">:</Char>
</Key>
<Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="34" Position="TopLeft">"</Char>
<Char Unicode="39" Position="BottomLeft">'</Char>
</Key>
<Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="71" Position="TopLeft">G</Char>
</Key>
<Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="89" Position="TopLeft">Y</Char>
</Key>
<Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="95" Position="TopLeft">_</Char>
<Char Unicode="45" Position="BottomLeft">-</Char>
</Key>
<Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="124" Position="TopLeft">|</Char>
<Char Unicode="92" Position="BottomLeft">\</Char>
</Key>
<Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="62" Position="BottomLeft">></Char>
</Key>
<Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="90" Position="TopLeft">Z</Char>
</Key>
<Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="88" Position="TopLeft">X</Char>
</Key>
<Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="77" Position="TopLeft">M</Char>
</Key>
<Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="67" Position="TopLeft">C</Char>
</Key>
<Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="86" Position="TopLeft">V</Char>
</Key>
<Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="75" Position="TopLeft">K</Char>
</Key>
<Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="76" Position="TopLeft">L</Char>
</Key>
<Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="44" Position="BottomLeft">,</Char>
</Key>
<Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="62" Position="TopLeft">></Char>
<Char Unicode="46" Position="BottomLeft">.</Char>
</Key>
<Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="63" Position="TopLeft">?</Char>
<Char Unicode="47" Position="BottomLeft">/</Char>
</Key>
</Keys>
<Connections>
<KeyConnector TargetKeyIndex="0" KeyUnicode="97" />
<KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="4" KeyUnicode="110"/>
<KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
<KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
<KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
<KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
<KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
<KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
<KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
<KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
<KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
<KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
<KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
<KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
<KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="20" KeyUnicode="33" />
<KeyConnector TargetKeyIndex="20" KeyUnicode="49" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="21" KeyUnicode="123"/>
<KeyConnector TargetKeyIndex="21" KeyUnicode="50" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
<KeyConnector TargetKeyIndex="22" KeyUnicode="51" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="23" KeyUnicode="59" />
<KeyConnector TargetKeyIndex="23" KeyUnicode="52" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
<KeyConnector TargetKeyIndex="24" KeyUnicode="53" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
<KeyConnector TargetKeyIndex="25" KeyUnicode="54" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="26" KeyUnicode="38" />
<KeyConnector TargetKeyIndex="26" KeyUnicode="55" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
<KeyConnector TargetKeyIndex="27" KeyUnicode="56" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
<KeyConnector TargetKeyIndex="28" KeyUnicode="57" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
<KeyConnector TargetKeyIndex="29" KeyUnicode="48" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="30" KeyUnicode="93" />
<KeyConnector TargetKeyIndex="30" KeyUnicode="37" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
<KeyConnector TargetKeyIndex="31" KeyUnicode="43" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
<KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
<KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
<KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
<KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
<KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
<KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
<KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
<KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
<KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
<KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
<KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
<KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
<KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
<KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
<KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
</Connections>
</KTouchKeyboard>

View file

@ -0,0 +1,285 @@
<KTouchKeyboard>
<Title>English Workman/Ergodox/Cub</Title>
<Comment>English Workman/Ergodox/Cub for programmers</Comment>
<Language>en (English)</Language>
<Keys>
<Key Width="80" X="100" Y="200" Height="80" Type="FINGER">
<Char Unicode="65" Position="TopLeft">A</Char>
</Key>
<Key Width="80" X="200" Y="200" Height="80" Type="FINGER">
<Char Unicode="83" Position="TopLeft">S</Char>
</Key>
<Key Width="80" X="300" Y="200" Height="80" Type="FINGER">
<Char Unicode="72" Position="TopLeft">H</Char>
</Key>
<Key Width="80" X="400" Y="200" Height="80" Type="FINGER">
<Char Unicode="84" Position="TopLeft">T</Char>
</Key>
<Key Width="80" X="930" Y="200" Height="80" Type="FINGER">
<Char Unicode="78" Position="TopLeft">N</Char>
</Key>
<Key Width="80" X="1030" Y="200" Height="80" Type="FINGER">
<Char Unicode="69" Position="TopLeft">E</Char>
</Key>
<Key Width="80" X="1130" Y="200" Height="80" Type="FINGER">
<Char Unicode="79" Position="TopLeft">O</Char>
</Key>
<Key Width="80" X="1230" Y="200" Height="80" Type="FINGER">
<Char Unicode="73" Position="TopLeft">I</Char>
</Key>
<Key Width="80" X="0" Y="100" Height="80" Type="TAB"/>
<Key Width="130" X="750" Y="480" Height="80" Type="ENTER"/>
<Key Width="80" X="750" KeyText="AltGr" Y="570" Height="80" Type="OTHER"/>
<Key Width="80" X="580" KeyText="Alt" Y="570" Height="80" Type="OTHER"/>
<Key Width="80" X="0" KeyText="Ctrl" Y="300" Height="80" Type="OTHER"/>
<Key Width="160" X="750" Y="390" Height="80" Type="SPACE"/>
<Key Width="80" X="0" Y="200" Height="80" Type="SHIFT"/>
<Key Width="130" X="530" Y="480" Height="80" Type="SHIFT"/>
<Key Width="160" X="500" Y="390" Height="80" Type="BACKSPACE"/>
<Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="126" Position="TopLeft">~</Char>
<Char Unicode="96" Position="BottomLeft">`</Char>
</Key>
<Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="59" Position="TopLeft">;</Char>
<Char Unicode="49" Position="BottomLeft">1</Char>
</Key>
<Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="33" Position="TopLeft">!</Char>
<Char Unicode="50" Position="BottomLeft">2</Char>
</Key>
<Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="35" Position="TopLeft">#</Char>
<Char Unicode="51" Position="BottomLeft">3</Char>
</Key>
<Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="123" Position="TopLeft">{</Char>
<Char Unicode="52" Position="BottomLeft">4</Char>
</Key>
<Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="125" Position="TopLeft">}</Char>
<Char Unicode="53" Position="BottomLeft">5</Char>
</Key>
<Key Width="80" X="830" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="91" Position="TopLeft">[</Char>
<Char Unicode="54" Position="BottomLeft">6</Char>
</Key>
<Key Width="80" X="930" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="93" Position="TopLeft">]</Char>
<Char Unicode="55" Position="BottomLeft">7</Char>
</Key>
<Key Width="80" X="1030" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="42" Position="TopLeft">*</Char>
<Char Unicode="56" Position="BottomLeft">8</Char>
</Key>
<Key Width="80" X="1130" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="40" Position="TopLeft">(</Char>
<Char Unicode="57" Position="BottomLeft">9</Char>
</Key>
<Key Width="80" X="1230" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="41" Position="TopLeft">)</Char>
<Char Unicode="48" Position="BottomLeft">0</Char>
</Key>
<Key Width="80" X="1330" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="61" Position="TopLeft">=</Char>
<Char Unicode="43" Position="BottomLeft">+</Char>
</Key>
<Key Width="80" X="100" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="81" Position="TopLeft">Q</Char>
</Key>
<Key Width="80" X="200" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="68" Position="TopLeft">D</Char>
</Key>
<Key Width="80" X="300" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="82" Position="TopLeft">R</Char>
</Key>
<Key Width="80" X="400" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="87" Position="TopLeft">W</Char>
</Key>
<Key Width="80" X="500" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="66" Position="TopLeft">B</Char>
</Key>
<Key Width="80" X="830" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="74" Position="TopLeft">J</Char>
</Key>
<Key Width="80" X="930" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="70" Position="TopLeft">F</Char>
</Key>
<Key Width="80" X="1030" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="85" Position="TopLeft">U</Char>
</Key>
<Key Width="80" X="1130" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="80" Position="TopLeft">P</Char>
</Key>
<Key Width="80" X="1230" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="36" Position="TopLeft">$</Char>
<Char Unicode="64" Position="BottomLeft">@</Char>
</Key>
<Key Width="80" X="1330" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="58" Position="TopLeft">:</Char>
<Char Unicode="37" Position="BottomLeft">%</Char>
</Key>
<Key Width="80" X="500" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="71" Position="TopLeft">G</Char>
</Key>
<Key Width="80" X="830" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="89" Position="TopLeft">Y</Char>
</Key>
<Key Width="80" X="1330" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="45" Position="TopLeft">-</Char>
<Char Unicode="95" Position="BottomLeft">_</Char>
</Key>
<Key Width="80" X="1330" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="124" Position="TopLeft">|</Char>
<Char Unicode="38" Position="BottomLeft">&amp;</Char>
</Key>
<Key Width="80" X="100" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="90" Position="TopLeft">Z</Char>
</Key>
<Key Width="80" X="200" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="88" Position="TopLeft">X</Char>
</Key>
<Key Width="80" X="300" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="77" Position="TopLeft">M</Char>
</Key>
<Key Width="80" X="400" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="67" Position="TopLeft">C</Char>
</Key>
<Key Width="80" X="500" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="86" Position="TopLeft">V</Char>
</Key>
<Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="75" Position="TopLeft">K</Char>
</Key>
<Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="76" Position="TopLeft">L</Char>
</Key>
<Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="44" Position="BottomLeft">,</Char>
</Key>
<Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="62" Position="TopLeft">></Char>
<Char Unicode="46" Position="BottomLeft">.</Char>
</Key>
<Key Width="80" X="1230" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="63" Position="TopLeft">?</Char>
<Char Unicode="47" Position="BottomLeft">/</Char>
</Key>
<Key Width="80" X="590" KeyText="" Y="100" Height="130" Type="OTHER"/>
<Key Width="80" X="590" KeyText="" Y="250" Height="130" Type="OTHER"/>
<Key Width="80" X="740" KeyText="" Y="100" Height="130" Type="OTHER"/>
<Key Width="80" X="740" KeyText="" Y="250" Height="130" Type="OTHER"/>
<Key Width="80" X="400" KeyText="ESC" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="300" Y="400" Height="80" Type="SPACE"/>
<Key Width="80" X="100" KeyText="L2" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="200" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="0" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="930" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="1030" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="1130" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="1230" KeyText="" Y="400" Height="80" Type="OTHER"/>
<Key Width="80" X="1330" KeyText="" Y="400" Height="80" Type="OTHER"/>
</Keys>
<Connections>
<KeyConnector KeyUnicode="8" TargetKeyIndex="16"/>
<KeyConnector KeyUnicode="13" TargetKeyIndex="9"/>
<KeyConnector KeyUnicode="32" TargetKeyIndex="13"/>
<KeyConnector KeyUnicode="33" TargetKeyIndex="19"/>
<KeyConnector KeyUnicode="35" TargetKeyIndex="20"/>
<KeyConnector KeyUnicode="36" TargetKeyIndex="38"/>
<KeyConnector KeyUnicode="40" TargetKeyIndex="26"/>
<KeyConnector KeyUnicode="41" TargetKeyIndex="27"/>
<KeyConnector KeyUnicode="42" TargetKeyIndex="25"/>
<KeyConnector KeyUnicode="43" TargetKeyIndex="28"/>
<KeyConnector KeyUnicode="44" TargetKeyIndex="51"/>
<KeyConnector KeyUnicode="45" TargetKeyIndex="42"/>
<KeyConnector KeyUnicode="46" TargetKeyIndex="52"/>
<KeyConnector KeyUnicode="47" TargetKeyIndex="53"/>
<KeyConnector KeyUnicode="48" TargetKeyIndex="27"/>
<KeyConnector KeyUnicode="49" TargetKeyIndex="18" ModifierIndex="14"/>
<KeyConnector KeyUnicode="50" TargetKeyIndex="19" ModifierIndex="14"/>
<KeyConnector KeyUnicode="51" TargetKeyIndex="20" ModifierIndex="14"/>
<KeyConnector KeyUnicode="52" TargetKeyIndex="21" ModifierIndex="14"/>
<KeyConnector KeyUnicode="53" TargetKeyIndex="22" ModifierIndex="14"/>
<KeyConnector KeyUnicode="54" TargetKeyIndex="23"/>
<KeyConnector KeyUnicode="55" TargetKeyIndex="24"/>
<KeyConnector KeyUnicode="56" TargetKeyIndex="25"/>
<KeyConnector KeyUnicode="57" TargetKeyIndex="26"/>
<KeyConnector KeyUnicode="58" TargetKeyIndex="39"/>
<KeyConnector KeyUnicode="59" TargetKeyIndex="18"/>
<KeyConnector KeyUnicode="60" TargetKeyIndex="51"/>
<KeyConnector KeyUnicode="61" TargetKeyIndex="28"/>
<KeyConnector KeyUnicode="62" TargetKeyIndex="52"/>
<KeyConnector KeyUnicode="63" TargetKeyIndex="53"/>
<KeyConnector KeyUnicode="64" TargetKeyIndex="38"/>
<KeyConnector KeyUnicode="65" TargetKeyIndex="0" ModifierIndex="14"/>
<KeyConnector KeyUnicode="66" TargetKeyIndex="33" ModifierIndex="14"/>
<KeyConnector KeyUnicode="67" TargetKeyIndex="47" ModifierIndex="14"/>
<KeyConnector KeyUnicode="68" TargetKeyIndex="30" ModifierIndex="14"/>
<KeyConnector KeyUnicode="69" TargetKeyIndex="5" ModifierIndex="14"/>
<KeyConnector KeyUnicode="70" TargetKeyIndex="35" ModifierIndex="14"/>
<KeyConnector KeyUnicode="71" TargetKeyIndex="40" ModifierIndex="14"/>
<KeyConnector KeyUnicode="72" TargetKeyIndex="2" ModifierIndex="14"/>
<KeyConnector KeyUnicode="73" TargetKeyIndex="7" ModifierIndex="14"/>
<KeyConnector KeyUnicode="74" TargetKeyIndex="34" ModifierIndex="14"/>
<KeyConnector KeyUnicode="75" TargetKeyIndex="49" ModifierIndex="14"/>
<KeyConnector KeyUnicode="76" TargetKeyIndex="50" ModifierIndex="14"/>
<KeyConnector KeyUnicode="77" TargetKeyIndex="46" ModifierIndex="14"/>
<KeyConnector KeyUnicode="78" TargetKeyIndex="4" ModifierIndex="14"/>
<KeyConnector KeyUnicode="79" TargetKeyIndex="6" ModifierIndex="14"/>
<KeyConnector KeyUnicode="80" TargetKeyIndex="37" ModifierIndex="14"/>
<KeyConnector KeyUnicode="81" TargetKeyIndex="29" ModifierIndex="14"/>
<KeyConnector KeyUnicode="82" TargetKeyIndex="31" ModifierIndex="14"/>
<KeyConnector KeyUnicode="83" TargetKeyIndex="1" ModifierIndex="14"/>
<KeyConnector KeyUnicode="84" TargetKeyIndex="3" ModifierIndex="14"/>
<KeyConnector KeyUnicode="85" TargetKeyIndex="36" ModifierIndex="14"/>
<KeyConnector KeyUnicode="86" TargetKeyIndex="48" ModifierIndex="14"/>
<KeyConnector KeyUnicode="87" TargetKeyIndex="32" ModifierIndex="14"/>
<KeyConnector KeyUnicode="88" TargetKeyIndex="45" ModifierIndex="14"/>
<KeyConnector KeyUnicode="89" TargetKeyIndex="41" ModifierIndex="14"/>
<KeyConnector KeyUnicode="90" TargetKeyIndex="44" ModifierIndex="14"/>
<KeyConnector KeyUnicode="91" TargetKeyIndex="23"/>
<KeyConnector KeyUnicode="92" TargetKeyIndex="43"/>
<KeyConnector KeyUnicode="93" TargetKeyIndex="24"/>
<KeyConnector KeyUnicode="94" TargetKeyIndex="39"/>
<KeyConnector KeyUnicode="95" TargetKeyIndex="42"/>
<KeyConnector KeyUnicode="96" TargetKeyIndex="17" ModifierIndex="14"/>
<KeyConnector KeyUnicode="97" TargetKeyIndex="0"/>
<KeyConnector KeyUnicode="98" TargetKeyIndex="33"/>
<KeyConnector KeyUnicode="99" TargetKeyIndex="47"/>
<KeyConnector KeyUnicode="100" TargetKeyIndex="30"/>
<KeyConnector KeyUnicode="101" TargetKeyIndex="5"/>
<KeyConnector KeyUnicode="102" TargetKeyIndex="35"/>
<KeyConnector KeyUnicode="103" TargetKeyIndex="40"/>
<KeyConnector KeyUnicode="104" TargetKeyIndex="2"/>
<KeyConnector KeyUnicode="105" TargetKeyIndex="7"/>
<KeyConnector KeyUnicode="106" TargetKeyIndex="34"/>
<KeyConnector KeyUnicode="107" TargetKeyIndex="49"/>
<KeyConnector KeyUnicode="108" TargetKeyIndex="50"/>
<KeyConnector KeyUnicode="109" TargetKeyIndex="46"/>
<KeyConnector KeyUnicode="110" TargetKeyIndex="4"/>
<KeyConnector KeyUnicode="111" TargetKeyIndex="6"/>
<KeyConnector KeyUnicode="112" TargetKeyIndex="37"/>
<KeyConnector KeyUnicode="113" TargetKeyIndex="29"/>
<KeyConnector KeyUnicode="114" TargetKeyIndex="31"/>
<KeyConnector KeyUnicode="115" TargetKeyIndex="1"/>
<KeyConnector KeyUnicode="116" TargetKeyIndex="3"/>
<KeyConnector KeyUnicode="117" TargetKeyIndex="36"/>
<KeyConnector KeyUnicode="118" TargetKeyIndex="48"/>
<KeyConnector KeyUnicode="119" TargetKeyIndex="32"/>
<KeyConnector KeyUnicode="120" TargetKeyIndex="45"/>
<KeyConnector KeyUnicode="121" TargetKeyIndex="41"/>
<KeyConnector KeyUnicode="122" TargetKeyIndex="44"/>
<KeyConnector KeyUnicode="123" TargetKeyIndex="21"/>
<KeyConnector KeyUnicode="124" TargetKeyIndex="43"/>
<KeyConnector KeyUnicode="125" TargetKeyIndex="22"/>
<KeyConnector KeyUnicode="126" TargetKeyIndex="17"/>
<KeyConnector KeyUnicode="258" TargetKeyIndex="14"/>
<KeyConnector KeyUnicode="259" TargetKeyIndex="15"/>
<KeyConnector KeyUnicode="260" TargetKeyIndex="8"/>
<KeyConnector KeyUnicode="262" TargetKeyIndex="12"/>
<KeyConnector KeyUnicode="263" TargetKeyIndex="11"/>
<KeyConnector KeyUnicode="264" TargetKeyIndex="10"/>
</Connections>
</KTouchKeyboard>

View file

@ -0,0 +1,294 @@
<KTouchKeyboard>
<Title>English Workman layout for programmers from cub@uanic</Title>
<Comment>English Workman layout for programmers from cub@uanic</Comment>
<Language>en (English)</Language>
<Keys>
<Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
<Char Unicode="65" Position="TopLeft">A</Char>
</Key>
<Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
<Char Unicode="83" Position="TopLeft">S</Char>
</Key>
<Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
<Char Unicode="72" Position="TopLeft">H</Char>
</Key>
<Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
<Char Unicode="84" Position="TopLeft">T</Char>
</Key>
<Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
<Char Unicode="78" Position="TopLeft">N</Char>
</Key>
<Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
<Char Unicode="69" Position="TopLeft">E</Char>
</Key>
<Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
<Char Unicode="79" Position="TopLeft">O</Char>
</Key>
<Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
<Char Unicode="73" Position="TopLeft">I</Char>
</Key>
<Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
<Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
<Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
<Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
<Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
<Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
<Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
<Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="96" Position="TopLeft">`</Char>
<Char Unicode="126" Position="BottomLeft">~</Char>
</Key>
<Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="49" Position="TopLeft">1</Char>
<Char Unicode="59" Position="BottomLeft">;</Char>
</Key>
<Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="50" Position="TopLeft">2</Char>
<Char Unicode="33" Position="BottomLeft">!</Char>
</Key>
<Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="51" Position="TopLeft">3</Char>
<Char Unicode="35" Position="BottomLeft">#</Char>
</Key>
<Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="52" Position="TopLeft">4</Char>
<Char Unicode="123" Position="BottomLeft">{</Char>
</Key>
<Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="53" Position="TopLeft">5</Char>
<Char Unicode="125" Position="BottomLeft">}</Char>
</Key>
<Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="54" Position="TopLeft">6</Char>
<Char Unicode="91" Position="BottomLeft">[</Char>
</Key>
<Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="55" Position="TopLeft">7</Char>
<Char Unicode="93" Position="BottomLeft">]</Char>
</Key>
<Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="56" Position="TopLeft">8</Char>
<Char Unicode="42" Position="BottomLeft">*</Char>
</Key>
<Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="57" Position="TopLeft">9</Char>
<Char Unicode="40" Position="BottomLeft">(</Char>
</Key>
<Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="48" Position="TopLeft">0</Char>
<Char Unicode="41" Position="BottomLeft">)</Char>
</Key>
<Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="37" Position="TopLeft">%</Char>
<Char Unicode="38" Position="BottomLeft">&amp;</Char>
</Key>
<Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="43" Position="TopLeft">+</Char>
<Char Unicode="61" Position="BottomLeft">=</Char>
</Key>
<Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="81" Position="TopLeft">Q</Char>
</Key>
<Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="68" Position="TopLeft">D</Char>
</Key>
<Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="82" Position="TopLeft">R</Char>
</Key>
<Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="87" Position="TopLeft">W</Char>
</Key>
<Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="66" Position="TopLeft">B</Char>
</Key>
<Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="74" Position="TopLeft">J</Char>
</Key>
<Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="70" Position="TopLeft">F</Char>
</Key>
<Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="85" Position="TopLeft">U</Char>
</Key>
<Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="80" Position="TopLeft">P</Char>
</Key>
<Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="64" Position="TopLeft">@</Char>
<Char Unicode="36" Position="BottomLeft">$</Char>
</Key>
<Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="94" Position="TopLeft">^</Char>
<Char Unicode="58" Position="BottomLeft">:</Char>
</Key>
<Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="34" Position="TopLeft">"</Char>
<Char Unicode="39" Position="BottomLeft">'</Char>
</Key>
<Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="71" Position="TopLeft">G</Char>
</Key>
<Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="89" Position="TopLeft">Y</Char>
</Key>
<Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="95" Position="TopLeft">_</Char>
<Char Unicode="45" Position="BottomLeft">-</Char>
</Key>
<Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="124" Position="TopLeft">|</Char>
<Char Unicode="92" Position="BottomLeft">\</Char>
</Key>
<Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="62" Position="BottomLeft">></Char>
</Key>
<Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="90" Position="TopLeft">Z</Char>
</Key>
<Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="88" Position="TopLeft">X</Char>
</Key>
<Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="77" Position="TopLeft">M</Char>
</Key>
<Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="67" Position="TopLeft">C</Char>
</Key>
<Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="86" Position="TopLeft">V</Char>
</Key>
<Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="75" Position="TopLeft">K</Char>
</Key>
<Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="76" Position="TopLeft">L</Char>
</Key>
<Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="44" Position="BottomLeft">,</Char>
</Key>
<Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="62" Position="TopLeft">></Char>
<Char Unicode="46" Position="BottomLeft">.</Char>
</Key>
<Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="63" Position="TopLeft">?</Char>
<Char Unicode="47" Position="BottomLeft">/</Char>
</Key>
</Keys>
<Connections>
<KeyConnector TargetKeyIndex="0" KeyUnicode="97" />
<KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="4" KeyUnicode="110"/>
<KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
<KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
<KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
<KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
<KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
<KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
<KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
<KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
<KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
<KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
<KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
<KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
<KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
<KeyConnector TargetKeyIndex="20" KeyUnicode="49" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="21" KeyUnicode="33" />
<KeyConnector TargetKeyIndex="21" KeyUnicode="50" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
<KeyConnector TargetKeyIndex="22" KeyUnicode="51" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="23" KeyUnicode="123"/>
<KeyConnector TargetKeyIndex="23" KeyUnicode="52" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
<KeyConnector TargetKeyIndex="24" KeyUnicode="53" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
<KeyConnector TargetKeyIndex="25" KeyUnicode="54" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="26" KeyUnicode="93" />
<KeyConnector TargetKeyIndex="26" KeyUnicode="55" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
<KeyConnector TargetKeyIndex="27" KeyUnicode="56" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
<KeyConnector TargetKeyIndex="28" KeyUnicode="57" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
<KeyConnector TargetKeyIndex="29" KeyUnicode="48" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="30" KeyUnicode="38" />
<KeyConnector TargetKeyIndex="30" KeyUnicode="37" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
<KeyConnector TargetKeyIndex="31" KeyUnicode="43" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
<KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
<KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
<KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
<KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
<KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
<KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
<KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
<KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
<KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
<KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
<KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
<KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
<KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
<KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
<KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
</Connections>
</KTouchKeyboard>

View file

@ -0,0 +1,585 @@
<KTouchLecture>
<Title>Fast Workman + symbols from Dvorak for programme</Title>
<FontSuggestions>Courier 10 Pitch</FontSuggestions>
<Levels>
<Level>
<NewCharacters>ashtneoi</NewCharacters>
<Line>than oath tone tints tees nth hoe hahs tea eat ions</Line>
<Line>taint ho ass hoses ash test tan hot toes s ts soot one</Line>
<Line>hahs ion sises ash hosts ton hot tee tints taint shies</Line>
<Line>hen seas teen he tot hint the hoses son tost sine into</Line>
<Line>ho tens the noon sin hes shin shoo soon tins sit</Line>
<Line>hoot a ts ah neon tit heat toss sis in s host ions ton</Line>
<Line>nests note neat oaten nit sons inti inane shah soot</Line>
<Line>h inn is i nit he sets o this note test sans hash ton</Line>
<Line>stone neath those oh none sons sit tins tins ha</Line>
<Line>oath e sheen hos tee hosts ate neath hint ate h</Line>
<Line>snits tans tone h notes tie hes noons note tease shoe</Line>
<Line>tots ante thin s tot s tho aeon eon hits shin hat tine</Line>
<Line>is satin shoos sits sanes too sine es those shine neat</Line>
<Line>inane too thee sh hath the noes sass tee sots test</Line>
<Line>shins inns snot onto es an ten then shoo tons tees tine</Line>
<Line>tins ions sit ten stone s those son oh hoses on</Line>
<Line>tins aha tats state ate i o oaten noons is senna satin</Line>
<Line>sises sat tees sit hone teat sat shot neath that</Line>
<Line>stone sat tan ate ha tote shoe ton anti hoot shat</Line>
<Line>sat tea ani as sh test tea the ate thine sits t too</Line>
<Line>ins sises an tots thee shat ion sass nits hoses nose</Line>
<Line>hen in ahas the eh shine hens oath at he tine hoses noses</Line>
<Line>noon sites aeon eon at tints nits hes shes thine inane</Line>
<Line>this hes sate at hit eon tens hoot ion eons hies</Line>
<Line>tote ts shit shit ahas seas o non sane ease at not</Line>
<Line>sasses shit soon teat ah totes nannies sties sites tho</Line>
<Line>notes oats shins ions stats tin tonnes shits stats</Line>
<Line>inset sashes shoots host a anion tens hashes tenets</Line>
<Line>anoint ohos tee saith shone hats sh hostess ease</Line>
<Line>hash hoes hashes neat insist anoints hoists sanest</Line>
<Line>es ts anti sea theists asses sateen notion sane hen</Line>
<Line>shits shoot aeon nets hats sass hot hit session nests</Line>
<Line>attain son hose eats oaten sits seasons otiose sans</Line>
<Line>hate nets toes stoats sot settees nits not titan noes</Line>
<Line>sonatas toot tost tosses ante tins sons teens hoist</Line>
<Line>oh asses season soon antenna sashes steins oath</Line>
<Line>hits hoes heat the o toot tinnies sass hoots snoots tat</Line>
<Line>tents neat hotshot noshes snot satiate inti stoat</Line>
<Line>tie stoats tents sent sonata stones hints hate sises</Line>
<Line>sites testate then oat neatest sonnet noshes ohos</Line>
<Line>honest teethes soot satiate tattoo titan noses sass</Line>
<Line>anoint tans ah not neatest notion onion ass onsets</Line>
<Line>tees easies anti he tint nits sit saith anion note</Line>
<Line>henna hoists ants snoots tines siestas ten sonata tie</Line>
<Line>sites easiest sonnies anons session hoe theist ani</Line>
<Line>notions sties sheets ants insane estate hie in</Line>
<Line>hos noise teethes assets intense assents sat hoot</Line>
<Line>stash thee thee one teethes sheathe so seas tinnies his</Line>
<Line>sonata toot oh thin toss tattoos shines sheath nosies</Line>
<Line>inti hoists noons shoo toniest tint teats noose anise</Line>
</Level>
<Level>
<NewCharacters>qdrwfup$</NewCharacters>
<Line>thrush stride super apt $ups foe hairs trout wrests erupts</Line>
<Line>pita $pisses seres dons seeped dread option $feuded thus</Line>
<Line>praise pots pupa $pear drones swords runts preps prefer</Line>
<Line>snouts added unfit $theft rifted $front info$ winner</Line>
<Line>unset porn rosin troth opines swine operas $west rares</Line>
<Line>iffier opera heeded ware finest hers arrows atria</Line>
<Line>fifes panda quotas were rewire dots sadder aided wins</Line>
<Line>thrift nun dun psst queen $sorer piers frets dares</Line>
<Line>$ires darned $potato pared$ hue undies duffer errs reused</Line>
<Line>sweep earned ended touts poises shorts uteri fainer free</Line>
<Line>widows pips hide roared $arson pas doffs frond parent shadow</Line>
<Line>dunno purr$ putt west weds$ tauter swaps teed truth</Line>
<Line>pupas quip rips strop purse sored sered trod whited</Line>
<Line>aria dried $paths shorts did pees $haws whoops hewn</Line>
<Line>runt pepper stow wanna woofs hut shined aft rod what</Line>
<Line>dense aides air$ $outed $whets pea$ sands herpes$ raped</Line>
<Line>dote stows quips pips pets quasar sores twos urea</Line>
<Line>upon shiner $spades dotted roofs post $niter $dared darned</Line>
<Line>heeded$ $warned sifts twee tared dread$ fond$ apes</Line>
<Line>soup puff $troop panda report osiers $puffs eddies redrew</Line>
<Line>nutted strap$ weired udder wind fetid fain rapes sear</Line>
<Line>swats rotate entrap waders$ or hue nu road eased reran</Line>
<Line>feta tutors sander $shows for eddied $hoofs rs herons</Line>
<Line>truer theed sowed fores fern dope nadirs fat aerate pis</Line>
<Line>few turner purrs darn peers sauted tauter dated$ show</Line>
<Line>$warrior airs sprier quitted adepter potter niftier pouted</Line>
<Line>wadi rhea$ froth quire sups pet opined firsts redound</Line>
<Line>$footed dirties forties arrows$ snorer present fiesta</Line>
<Line>appease shape noshed seeded$ winded $urns swoops outs</Line>
<Line>rifted outdid perhaps hairpin ratio fended heir$ wrap</Line>
<Line>$pundit spade hasp adopts fains suture suers refuted</Line>
<Line>dint thrifts $partied $squads renter tied turnout roded</Line>
<Line>arid whiffed power$ terrors opinion $poops nippier hearth</Line>
<Line>denier fiestas suited nearest waif horses tore</Line>
<Line>hairdo frond fades dodo soprano sinew fattier downed</Line>
<Line>disused persist pariah roaster arrears $soups owned</Line>
<Line>feeders orates errata fear senders snipers hither upped</Line>
<Line>waif teethed $shodden sun$ renter sue poises doff dwarfed</Line>
<Line>troupes rinds earths append draft rooster peeper</Line>
<Line>rereads finner upsets potpies stopped $showers sprites</Line>
<Line>teeters radios roofed twits radiant $wears steers fritter</Line>
<Line>sworded swap diets$ hosed honors won arouse weirder speed</Line>
<Line>dare nerds pendent $protons poohed tardies$ $stripe shade</Line>
<Line>outers hooted ids psst hosted sour editors pewters sered</Line>
<Line>edition weirs $truer tented unison spriest opus peons</Line>
<Line>outwit quiet writhed readies peso swatter tape$ pennon</Line>
<Line>$snorts spats ships harpist town $swathes shapes fa</Line>
<Line>trotter aspirin odds $iffier howdah sortied pains wand</Line>
<Line>$sorts $entwine turrets tartars unstop inner$ inside prior</Line>
<Line>who trades starter duh intoned$ artiste sensors fain</Line>
</Level>
<Level>
<NewCharacters>bjgycvkl</NewCharacters>
<Line>$creek fjord leans eureka rowel vagued cage pickup holler</Line>
<Line>ogre lanced $churls bidets cots glow $chows bean satiny</Line>
<Line>bags capons bulbed$ ulcer beech bogey going vials novel</Line>
<Line>dusk jabbed $cysts dactyl covert herb forgo belied buffet</Line>
<Line>$foray abbeys$ avows lubing tawny chant loudly$ last</Line>
<Line>hack stork$ divan cleans sight ebbed venal$ flower pal</Line>
<Line>$darken growl vacant ballad cased scab yonder pickup</Line>
<Line>beeves $leans hyphen beck scoop chart$ dyer guff beers</Line>
<Line>casks lovely piker junta $cannon panel horsy wackos</Line>
<Line>convoy dales tank claws lavish subdue birth fluffy jaguar</Line>
<Line>alone bonier region lever $cellar paltry kicks hooked ribald</Line>
<Line>livens rights$ $boater gouty gooks ballad gosh leans</Line>
<Line>$ranks belief ghoul pulls punch cops wry coyote weaver</Line>
<Line>loans nil surrey dicks tyrant awoke kabob glided bribe</Line>
<Line>surrey $donkey elide$ welds ruby$ pilaf cleat story uncle</Line>
<Line>dewlap$ $petrol lushes ceded lush blahs jury$ slob gofers</Line>
<Line>above dweeb$ chaste knives rung leggy ploys richer vices</Line>
<Line>rakish $hubs treks swirl wall life appal evils$ greys</Line>
<Line>arrays $longs cloths squawk viands ironic plows fitful</Line>
<Line>flown $bouts relays$ pilaff doled citric trench hailed</Line>
<Line>dauber bind $cost avasts $befit petal flea hoagie colic</Line>
<Line>edging geckos etcher cyclic$ typed jack splays reckon</Line>
<Line>cuss alter you lieges cools wage taco gaping$ dahlia</Line>
<Line>juts rabbit panty pinked trowel unsay cubit bounty</Line>
<Line>lisp$ knave hanky drub agave$ shrank dodge $baboon jags</Line>
<Line>flunked $ogres ravaged $enrols tikes sickles flee parolee</Line>
<Line>brain avid legatee$ ethnic nailing blanch cawing$ solve</Line>
<Line>nesting fury avenges swanky placers delete berried taller</Line>
<Line>sorrels befalls pueblos janitor gnaw bright glueing$ facts</Line>
<Line>griped justify bounty sloe$ clatter$ chichi cyanide weedy</Line>
<Line>flub scion piggies$ lisped succor shivery $doings charge</Line>
<Line>etched opting higher nick advents $chains $equably join</Line>
<Line>geodes clarion detects gable $lassie scythes eerily</Line>
<Line>says cubs things dowager gaping$ viewing$ scraped wiliest</Line>
<Line>fateful scorn brinks collude drills beside ovoid stilt</Line>
<Line>$victory glut savvier $leach such$ $rubiest concord jape</Line>
<Line>vagary burps rifled barred retract rooting ranks glad</Line>
<Line>auburn losing swirly burgles ascends rabbles canine dove</Line>
<Line>curing throngs fueling wangles balls relied gas cloths</Line>
<Line>repays quoting creates browner carpi nils stooges scuttle</Line>
<Line>slakes hibachi $wetland gayer corsage revues clue</Line>
<Line>falters staled recur frolic palsied splashy evils geckos</Line>
<Line>bloc kisser slued gluts browser$ fluent pullets pile</Line>
<Line>caterer $bearish lagoon target chicory wingers ocelots</Line>
<Line>serials blob lessor quirked gods $intake coaling kneeing</Line>
<Line>unlikes viol winging brogues loving booting bonkers</Line>
<Line>socks $slanted $stacks thongs cite $ranking whalers$ unwary</Line>
<Line>henpeck chairs foetal$ sausage shyness vegans laciest</Line>
<Line>snitch$ $acres lacked sleek $entail ilks budge recoils</Line>
<Line>florae aspic deject kookier gain cleanse ingot rising</Line>
</Level>
<Level>
<NewCharacters>zxm,./:'\-</NewCharacters>
<Line>clump manges moth raceme tuxes empire ,mashes mowers fixed</Line>
<Line>blazes, mid/ -monks fixity chimps hansom \hoaxes merged</Line>
<Line>opium .dioxin emir grazes lament, times chomp 'atom sexes</Line>
<Line>smit moo gamed zed /jammed stumps monger\ rummy mute</Line>
<Line>groom- impede rhombi lumber mores seized omelet moder</Line>
<Line>eczema/ mosque' crazy miler/ damp hymn maizes thumbs' mantis</Line>
<Line>meeker clime prom' \blintz .molder mapped atom miffs domain</Line>
<Line>.zodiac humors/ champ boom$ 'hemmed cameo -dams mimosa</Line>
<Line>emirs manics atom caroms pygmy hoaxed. stanza dogmas</Line>
<Line>expert- jazzed- macing medics gram' muggy -mull makeup</Line>
<Line>mammas:: vamped$ emoted:: merely oxbow sambas, semi</Line>
<Line>bums\ bums' thymus barman\ blooms- farm malign smiles</Line>
<Line>spumed \rime gambit -scuzzy femur mull/ .scrimp chrome</Line>
<Line>swampy \make marshy zinc sums rumble nixed calmed dimes</Line>
<Line>smells tumble ,name klutz, jumbos blame\ muting. numbly</Line>
<Line>ampuls- disarm stumps ::motor mar. medal 'slalom flaxen</Line>
<Line>\ermine -amaze micra cervix -aroma more $mainly disarm</Line>
<Line>::morn timbre/ forums manned lump mucks, grime named</Line>
<Line>topaz, zeta .dame slum\ hum roomer /limns sizing ritzy</Line>
<Line>mashed fluxes ,qualm ,minis humors' ::gyms mussed' misdo</Line>
<Line>mutts .demote manner amazes umped minxes manned x</Line>
<Line>ampuls -hexing ,exert -crimp muter' amused storm$ bimbo</Line>
<Line>bamboo exodus chrome macro remark merger$ monies carom</Line>
<Line>scummy. macing ::ms taxies\ smote laxer ::shames murky</Line>
<Line>mart' spume mocked/ flux shames hoaxes lambs ohm hammed</Line>
<Line>theme. domains. toolbox\ miters ,fizz murk /theism madly</Line>
<Line>amends mood flume hoaxes woodmen $musky plumage myopics</Line>
<Line>mufti ashram$ eminent ::poxes mangoes tumble ::expound motors</Line>
<Line>plazas meeker exit$ /jam airman homier mutter customs vizor</Line>
<Line>latex$ $marts myopics cameos anthem mooring lament damper</Line>
<Line>,merrier zero $sextant sputum\ ashamed/ animus' emitted</Line>
<Line>'makings muffler dualism' symbols froze meaning$ gizmos</Line>
<Line>amigos -clomps spumed noncom acme ::drummed misters comedy</Line>
<Line>$totemic malign' claimed himself norms. mange' immense</Line>
<Line>razzing tumbled dimness rumored slums mains magpies gunman</Line>
<Line>mucus dustmen mas- crumbed -hemlock \moulted bombed exacter</Line>
<Line>program. dam airmen\ becalm bronze diatom$ masts morsel</Line>
<Line>rimed morns 'moister umped rumbles clomps:: .gamin bombed</Line>
<Line>menfolk$ citizen midwife\ bramble capsize cameoed\ maze</Line>
<Line>mutants regimen temper roam dualism booze zonked, gummy</Line>
<Line>jasmine exiles .admiral damping- simile' mattock frogman</Line>
<Line>laments- denims zoom ampules mouse maiden:: boozier me</Line>
<Line>primed monitor mazes$ rhizome/ sixteen many- mammals mild</Line>
<Line>message motley\ purism milch sax barroom anytime romance</Line>
<Line>admirer mourned' limed doormat timpani simmer$ game</Line>
<Line>phloem womanly amasses merits -lama \limes 'newsmen reforms</Line>
<Line>$next midwife ,nomadic wizened vamps matures$ mousse mar</Line>
<Line>gourmet azimuth permute movies:: charms:: damp smoke</Line>
<Line>mooring similes zed -emerged plumb mummify /midway tamper</Line>
<Line>legmen ,waltz hertz, mowed emits waltz amber claims boatman</Line>
</Level>
<Level>
<NewCharacters>~;[{}(=*)+]%!</NewCharacters>
<Line>{fudge will cruets copse gash fumes town armies+ tannin</Line>
<Line>plunks! mauled. censer ravens .future tripe\ treed mu</Line>
<Line>gruels enrol dishes merry% oceans gouge ;while stars</Line>
<Line>+ploys edicts limber{ pounce =retain shove heath bonds</Line>
<Line>edgy allure clue arc scouts( hones\ bloods )titted purged</Line>
<Line>quark vector past; royals flaxen creed rowed [vising notice</Line>
<Line>-goose nooned bated whens }turf grub opted pluses iguana</Line>
<Line>lumps gnat! hoist ruffle! yore* -turfs gown entice guilt</Line>
<Line>aces{ metes sods slyly .easels \peps gamins law whets</Line>
<Line>]deeded job pokes cocoas %storey *thighs talker saw</Line>
<Line>nixed acrid $swells )hub toggle~ edicts grudge youth} perts</Line>
<Line>hid ducts pooh denim shoon wiggle~ stirs /bruins butte</Line>
<Line>opens\ !marts bravos discs man whited= taxis manner. mars</Line>
<Line>herons\ +tugs berms; lean flawed rifts aster worth outage</Line>
<Line>sold- axle liner) bolled blinds welled [enrage thwart boxers</Line>
<Line>]bugs =pooh .rheas tack [debts narks) baud %exes chumps</Line>
<Line>~fights rivals dines zonked toll stump melon flog gurus</Line>
<Line>brandy) divvy mien rosier, jurist quotes quiche stud</Line>
<Line>states tryout gobble !torso market tyros} plaque nobles</Line>
<Line>.wrong sloes) ports:: types sheave* depend obeys bother</Line>
<Line>trench saner pixy feuds deicer\ spud -stanks amiss r</Line>
<Line>%grad hexes joys plate crouch] pranks cede hype slink) duel</Line>
<Line>snotty- cunt bevel every% videos level- ~envoy seven hilly</Line>
<Line>holed{ }vowing humors coccis lilt vex[ ]fuse still rids</Line>
<Line>soiled ::shirk heal caplet] pearly) )soppy %outset coat</Line>
<Line>lacunae bans mods towered program' visuals whites titted</Line>
<Line>coheres- !ageing rent outwit\ largo, gambol bedroll= cagily</Line>
<Line>muumuu% tangier amassed leagued weeping- battens! leg</Line>
<Line>volley% guitars toying markups cupolas$ rawer ninepin% clique</Line>
<Line>rise} begged tramped roused) emblem. !gougers both strafes</Line>
<Line>hurrays herself daubing:: volt/ lubbers ,seek dampens reread</Line>
<Line>}twilled surname duck% %fulling ravels; outputs) vamps</Line>
<Line>satiate bodice /bits ::nighest foolish doffs graving badges</Line>
<Line>purveys fretful several shaker +pizzas sellers handle</Line>
<Line>+include likable towered ,tic airfare ;painful infidel</Line>
<Line>burgs egoists wasps reputed[ rafting (editor %scrams karate</Line>
<Line>alluvia bounty coifed }rescued guise( {sects /nomads true</Line>
<Line>}craning violet }settee foremen elitist homer jigging laser</Line>
<Line>teeter timider vale. spinner~ %holder \swerved rein</Line>
<Line>*chirrup excite guffaw wobbly (jetties -awaked waifing</Line>
<Line>afloat day% weirds \various ideally depend bosom spiffy</Line>
<Line>quarto quavery[ 'revenue )ankh whoops! 'hissing silkier</Line>
<Line>exhales/ diorama thins belched wash ionizes! 'woozy paddies</Line>
<Line>{bolts germ hammed oaken) imbibed wenches:: juncos decade</Line>
<Line>$calked dryly babes elitism[ outlets slave:: scenery fief</Line>
<Line>garnish) weeks) deigned tabling ~reduce chived reused</Line>
<Line>$impetus dithers+ aspics~ =troths fags gyros vagrant reared</Line>
<Line>tunics[ =golfer endure forcing' curd .yuckier }rhizome gazette</Line>
<Line>'armorer clicked} siding sinning hernias +munches caudal</Line>
<Line>}wiled renewal coffer furled pigskin; !valley pistil</Line>
</Level>
<Level>
<NewCharacters>0123456789</NewCharacters>
<Line>(saved moss tint:: tomb )cowers neath gosh; booty+ chive</Line>
<Line>pity canes ankhs( ~spoken cabal- moons$ poring laking froze</Line>
<Line>plugs toughs dilled [putty email 6vices harks alters% attar</Line>
<Line>sells pagers\ habit fest %cars yucked whited canine bahs</Line>
<Line>calked rehab hours. paunch sour{ trace, =pate mimosa props</Line>
<Line>harass tamer5 fa ::renown !mopes firms6 naive -motive clasp</Line>
<Line>dunks cubing found homier troupe blur gnarls drills8 trucks</Line>
<Line>sonic raze +rhyme \hymns rank salves boots ate knew clots</Line>
<Line>looter5 avasts {amigo stun, voled taut )vanned traces</Line>
<Line>1icier comas states/ crown black whams* apse inch/ kicked</Line>
<Line>byes. blent, burrs hotbed foist moats. egg neon4 splint</Line>
<Line>,cameo .annual raved sludge' {snit thrust foul absurd operas</Line>
<Line>amid soul except+ icebox owning single kiddo% socks9 braced</Line>
<Line>~hoping ulcers2 quake wades $tan fates 7blabs 5yogurt masks</Line>
<Line>rabid clumps (downed coital 3blue avian gotta+ runt cocoas</Line>
<Line>nomad %ridges huhs {victim stains9 twee hammed 5corn wish</Line>
<Line>cell:: ampuls dammed2 osprey 9moaned latent adorn goo</Line>
<Line>sagest 1dammed dim jinnis tents exits5 3ratios 4milieu gains</Line>
<Line>lining$ ~pangs knew yawed% pawed join= begs% honey prize</Line>
<Line>4erupts lowly= %lids unsaid stymie gaunts depend lousy</Line>
<Line>shoon rifest 1unpin sunny! slick wooer writer mail making</Line>
<Line>tire mentor* cans) tined brays% germ$ huff2 hymen coded</Line>
<Line>flaks ~deck dreary 7stud dizzy menial phone taps of</Line>
<Line>flanks:: .scary deeps] 3primp mainly[ 5areas 7hornet cabals</Line>
<Line>testes 4inure cheat pecan jest thaws brinks }fill abhor</Line>
<Line>'superb tares 7densest 7feign fiats1 ~hardens ::equines bums</Line>
<Line>pillbox= doused \pinch sonata pisses supine0 !woolier smears</Line>
<Line>petted (toiler wag jackets forgive peeves, pore enthuse</Line>
<Line>localed hawser begin excuse cancans celled \runner drags</Line>
<Line>lustily$ rottens carboys *livable japes= -framer maw</Line>
<Line>link heal touched ingrain attest romaine' gaging bobcat</Line>
<Line>oodles nicks tackles throne% z (bosser ashram gluts ringing</Line>
<Line>hideous] *bowls nutrias }hid thinly% radiate- bung( balk</Line>
<Line>example ::carpet layout 3sonny %read plot contact! fairway</Line>
<Line>-hardtop bops+ gruels surety !oddity 4trothed *partner grit</Line>
<Line>sulky} -demise gollies =afoot japan jollied elope reputed</Line>
<Line>comings lockets jape 7chisel jinxed( vagues \balder giving</Line>
<Line>wend groovy airways jinn* preppie ;sicks yogis( needs</Line>
<Line>jollies ;wizard [however hiss] }lions bones hollow- shaves</Line>
<Line>bun! 7gathers smooth' (eddy arches kopeks casket poured</Line>
<Line>dolling$ kidneys4 4bredes smile' infests discos$ sleazy</Line>
<Line>}revoked 1barred comic+ 1mutable ]jesters suiting[ rations</Line>
<Line>\hotter mu server. cartel salads 7teethed drills reused</Line>
<Line>lows hahs scenes satchel moonlit desires %bows inseams chops</Line>
<Line>chagrin; brutish{ [hurried cobbler thorn wagoner endowed</Line>
<Line>fount fuzes cricks pans studded5 recall woofers cupped</Line>
<Line>rack5 clerk chain =bronzes miller *masking 6maids tariffs</Line>
<Line>::rumpled sputum blacken (kneecap phonier= midland6 cupolas</Line>
<Line>pitches~ avoided 2niggle hitter{ totemic- nobody answers</Line>
<Line>meeter9 scarred$ inmates6 /lessees rhymed miser[ tabooed</Line>
</Level>
<Level>
<NewCharacters>&lt;>?#@^"|</NewCharacters>
<Line>fucker2 whams7 5drum 0wipes rewire ~outwit wander peer</Line>
<Line>laced wusses vivas his 7pluses mushes frugal goo bed</Line>
<Line>legs shorts 1poor threat fondly oil @basks skeet pimps</Line>
<Line>hooped 9brunt throe~ fir @fiver topped:: ages ]scald loaned</Line>
<Line>parry feint8 hoed:: hutch hominy mering4 {hydra fiver</Line>
<Line>globes >cusps makes jib ,uproar stout" sprig$ spare jives</Line>
<Line>grave gybe1 sheiks chile facets( 0ponder )amok enact</Line>
<Line>}diva pulsar *finger !laurel noted )pared jilt barren undue</Line>
<Line>odd aortae* sang +rest site .singe wile~ musky goof theed</Line>
<Line>ground razz &lt;bevels brogue cadre moral) sushi castle/ humbly</Line>
<Line>|saber linage 'killed piking baning mufti^ rude mambos</Line>
<Line>robing &lt;joked floor ]coccis stoats oaths) pupil pairs</Line>
<Line>tunnel 'sinker latent 6bursar 5clones hulks pith auk</Line>
<Line>size ?griefs pangs% murk chili cox tore tinges decode( foxes</Line>
<Line>0bland fetter taunt{ /ruins wisp= teat waive jinni. faced</Line>
<Line>undoes 0rears belie %la drawn. -nodule slime:: eking monks</Line>
<Line>;arctic 7slake =bumped ruler8 cabbie .angled 7rattan swipe</Line>
<Line>liens eels' 8prying pylon &lt;vanes .flap "funded nubs[ walls</Line>
<Line>shouts =poised evokes pied dub yacht:: hep larder{ yessed</Line>
<Line>churl payer prank scoff exist2 sulky wines +lid mazes. specs</Line>
<Line>under tramp posit drew larva0 4supply skit =common curs</Line>
<Line>"tumor flared jurist( pop milky 1glen whewed 3dots imbeds</Line>
<Line>rouse whirrs cohort pupil }cachet twill %heresy bogus</Line>
<Line>fa moose% bored{ seeks inside} =chinos 1lead slued| shekel</Line>
<Line>]smack $mashes ]tests harem layoff> bully ochre sexing</Line>
<Line>saucily4 anklet chiles >relapse crack+ sises( 5guyed crumby</Line>
<Line>7lees corpses neuron jets [puberty 9wighted baneful daunt</Line>
<Line>knack toggled5 bicker muse, caped momma. freeway* preen</Line>
<Line>seating, slink. lotus+ %quoits styes7 gel tone mists vagrant</Line>
<Line>pompous3 ranches .wimples /hived freak garbing fluent</Line>
<Line>mastoid 'recta salvo risky mining rife excites pacific" bulk</Line>
<Line>"maestro pundits- wittier. rudder= orbited/ tramped sprig</Line>
<Line>rents pains vowel +gill peeking moos| bottoms dubious isobars</Line>
<Line>2outrank croaked gabbed circle resume&lt; velvety- taring</Line>
<Line>(deputy nasal raffles6 loudest ooze* %chic waspish+ tusks</Line>
<Line>~cokes "gimme nobly dulled* #durably serener forums all</Line>
<Line>leavens 7settee davit guzzles mud&lt; =travels 'gawky creams</Line>
<Line>>imbeds snip bulky gee 4draftee cause meteors6 scone deep</Line>
<Line>"waxen 1retypes already- gimlet3 smart {upswing exempts</Line>
<Line>fusible 5wiled 8blessed behold manhunt bloomer pastes</Line>
<Line>rinsed" +terms gosling> 5sandbox 'stirrer ruddied pileup</Line>
<Line>hoot tripod blown{ imagery3 dignity] quaking fez9 slain</Line>
<Line>ivies fazed softens# anise mantis maps carver! gear lancers</Line>
<Line>imply lids ~gulling phoenix torques crocked coughs- busies</Line>
<Line>.finds pet 7fright pokeys layaway| making$ 6weirdos rawest</Line>
<Line>1comedic #intuit tumors toddle ,lighter =found paced</Line>
<Line>spider [yawing |stamp trusses 5zipper stable excite| maroon</Line>
<Line>2kopecks reams pocks lineup carmine wick {sices stank</Line>
<Line>|biggie echoes elides pupils; !timbres laundry! outlook</Line>
<Line>[grubby wittier punster/ cups pulpit( studio turnkey busses</Line>
</Level>
<Level>
<NewCharacters>Everything</NewCharacters>
<Line>bloat Avery cliffs heir's5 whacks onset( }lusty shod</Line>
<Line>gorier oboes Lyra's lonely amok/ cs's[ Niobe @odors timid</Line>
<Line>matzo Tiber odium koalas body's 1evenly dotes. musing- Han</Line>
<Line>Walden% smites Easter- tango &lt;bus's seeded %tinkle savior</Line>
<Line>spies emery mutual5 Allan, _hides garble= muffle tackle</Line>
<Line>hasps 7Allie massed twang 3racism dress% Hymen Gall</Line>
<Line>York deuces ::Eu's Abe's0 Lie hare shunts dyer's half</Line>
<Line>shanty3 spicy Zelma entrap .poke /propel loathe| flail</Line>
<Line>snob- ant bike/ baton 1roamed ::nickel hazing [toked vs</Line>
<Line>Katie )Billie piling. duff lied6 bowel strews sleigh= Andean</Line>
<Line>outset root's -Olive 4smoke pool's, shrink Brant jailor</Line>
<Line>luaus 2clam 1vend truism befoul[ duct doted known Mouthe</Line>
<Line>chic_ %Roxy's @Gd autism&lt; Ladoga 8Willis slunk9 poorer</Line>
<Line>Lean] bone's( wroth- nobly' rumple cord's county shock</Line>
<Line>eves} =rim (spud's manors+ tramp 2Nieves \fained Josue</Line>
<Line>pave' 7sizing feints6 anode socket' 3ruler Aisha1 Yale</Line>
<Line>Left 4Tuscon lops= semen weed $Cody's humbly, larynx maizes</Line>
<Line>gooey Tagus spoof Nita mailed5 evils_ woo Nile's deigns</Line>
<Line>tumble- racers claw >doubt bowl's5 5Sepoy bulb's darn</Line>
<Line>lobes Sister+ Lee hawker7 gulag Henson Efren )Gloria grow</Line>
<Line>pose gopher. |twang vital. smash deeply blow6 ,Slavs Sung's</Line>
<Line>cilia |cons wives Baez 6cowed ragtag =Eula spars Prut's</Line>
<Line>sot. {ramps )madras remit $deploy tonal brews 3avians bleach</Line>
<Line>F's 9geode kin's perm mole coops Olen ,Gary's lo0 ticks</Line>
<Line>vial yolks riots yeti's7 &lt;Sm Gina8 ::world Klimt Subaru</Line>
<Line>tattoos burnout/ rid [pilots wingtip Ci. fascism whitest</Line>
<Line>wiretap combing rupee grottos8 razing9 Boston\ Nehru's</Line>
<Line>bellow propane jetsam fray's sped/ pans flyover reissue</Line>
<Line>cycle mutter 'broncos laud sphinx cabal's2 tardier Julies</Line>
<Line>sanders Lowe's_ Grimm Kitty pointer pawls ::dowries Huerta</Line>
<Line>sting Poles traffic layaway )Rocha's Horatio [vagued scorn's</Line>
<Line>fang's riles7 bolero arbiter torched6 ]hamster runt's</Line>
<Line>phylae0 sills gazers flambes tanager 6wholes ,Holbein fib</Line>
<Line>juice's Freddie&lt; 0dosages cruised necking ::Aron lens</Line>
<Line>ampere+ graved torched 5Urdu {unitary Dilbert chill's</Line>
<Line>Kinko's] }wieners celli6 _will Helga morgue scores color's</Line>
<Line>Burt drover pealed{ blast's- galoshe{ Grafton gasket Niobe</Line>
<Line>Jilin Occam wills9 Saran's {hats 5minding infuses foyer's</Line>
<Line>::boiled bedtime> carboy {bossy emperor$ unstop Tbilisi</Line>
<Line>figures %Owens men 2sops anyone, epic's( dew liar- undo</Line>
<Line>%alertly 4goddamn vets 2powwows upset &lt;Terkel Stan's:: gazing</Line>
<Line>papery _expects disbars 4malaise donated &lt;balsas cooker</Line>
<Line>shamans ]plume Mimosa excepts Zukor's[ ask Cajun penal</Line>
<Line>veals fines -loosely ::seven }pummels bills 6majorly chant</Line>
<Line>4buckram machine =regions Karin's spikier %autoing planing</Line>
<Line>friends facile@ Wotan{ impurer+ @counter narcs@ cattail</Line>
<Line>)Jayne \speck genres akin:: hello> 6cocoa's wraiths) loci's</Line>
<Line>Muir [dunging Mani\ Cairo's Rita's stages =messy Osbert</Line>
<Line>-Douglas Kharkov whiner- slue threw( tempera, axises evading</Line>
<Line>brood's coursed 5lea's idea )McKee /horsed Nate pivotal</Line>
<Line>milker +Roy's weeded weird vet Elbe's1 3blown 7calves Rome's</Line>
<Line>four% [bade razzes vial 6Lawson chalk7 _wholly fluid jostle</Line>
<Line>-rind's Dylan agree Kitty bootee2 Ty toasts %mussed ninety</Line>
<Line>creep 2final bassi omen's/ |girdle diary9 Shinto Selma</Line>
<Line>shiver gait huge} fends genie hump's raze It 3masks vinyls</Line>
<Line>arrows turds Hess's( 6muzzle cocky8 chose brandy easies</Line>
<Line>laces fuzzes Ike godly@ civic \ebb 4maven herb- notary snare</Line>
<Line>Dave junior/ 2furrow trap's +Dick's prior) Juan's pocked</Line>
<Line>goofy 'racily élan clever clangs gunny Sean beat lad</Line>
<Line>.data's curb\ 7bitmap Haney Lu's] glance arbors Olav's</Line>
<Line>|Amalia Millay_ pedals1 9elite gulags husks umbel lithe</Line>
<Line>paunch Dorcas oblige% riser) 3moist ,Annam }Oprah bunny</Line>
<Line>8Elroy yaws[ pouts| /Tuscan (waging brigs lacks. coax</Line>
<Line>foetid\ Trina Eula sued6 slew@ &lt;shahs =Myers echo Euclid</Line>
<Line>Dix's) Taiwan batty/ nuke's} $ascots -Keven Kurile Nice</Line>
<Line>Sal's[ abject LyX verify) Louis backup:: ruses Leakey yelped</Line>
<Line>1yell widest tarpon butte tire Ira's 1sadism pols bay</Line>
<Line>bodkin jinnis -dills warden% thud 1wont's jerkin calyx</Line>
<Line>{panty 6Marcel larvae weer 0pi /gadget leeks flan[ jest's</Line>
<Line>0lynch refuse) Medea( Paul sword6 6rafter divert Aspell</Line>
<Line>surtax( Tubman )damped )solo's 8seduce tuxedo wigged0 risks</Line>
<Line>7Todd $living lash's eras siesta3 Jeeps kopek> Eva Nb's</Line>
<Line>bummed lewdly lamer }hared -Bettye oats Helios |floras weirs</Line>
<Line>3Jean facing$ pod Rob 5Siva's Kim's% /slump defers pubbed</Line>
<Line>[Nair's Creon_ data's\ orgasm bank's hats realty reef's</Line>
<Line>bib's fast }rewires probe, Elsie sitar's] Ypres's infer</Line>
<Line>bedded hep culture beacons [stabler 2sanely /Samar's rhea</Line>
<Line>seceded removal3 +Malacca eery coolers Miami [Co's nosegay</Line>
<Line>zoom Berlin desires_ glacier Betty4 =alright wrist's donors</Line>
<Line>8costar poesies:: brimful snowy Brandi 3rounder cult's</Line>
<Line>unlike+ heaven Marc's$ ratify5 tearful@ Frankie4 audit</Line>
<Line>adviser1 rose's buildup, 9legated spruces primes, Brno</Line>
<Line>'N's Wonder} Crystal befalls Ziploc5 elixir amours wrinkle</Line>
<Line>2decide gluier snubs Lille's Clare's -wasn't =sincere resend</Line>
<Line>Leigh's Brokaw suede- ]pillion 0yoga garages soon supper</Line>
<Line>iamb's drooled skirt's' (icing Carey's pinions hotshot</Line>
<Line>senders] Fatima fury's Lear's blurry squad carbide/ Erato's</Line>
<Line>Ricky Demeter{ tasted5 Jenkins( Lloyd- knitted boldly</Line>
<Line>%Arctic passels@ 7expends wives's morgues] dimmers postman</Line>
<Line>Murat4 absorb:: Wyeth lance5 fleeced gushed corded triage</Line>
<Line>Tarazed 2hernias )hula caroms rubber 3pothook Pl plot's</Line>
<Line>dramas) Alps drools Balkan' gos| Lysenko- &lt;pixel spouse</Line>
<Line>allayed+ champed rails 0Jimenez dived helps markups+ denims</Line>
<Line>6monitor basemen [sledges kabob Tutsi> Ben's &lt;encored Knapp</Line>
<Line>spool= absinth {hoard Pooh's hijacks+ collude Z's Midwest</Line>
<Line>shocker bright/ mender1 prep:: paces\ lily braids&lt; ridge</Line>
<Line>payable Paris's Tojo's jailers booming 'mileage trap's</Line>
<Line>Saab's swarms lip's/ okaying8 Ariz's aerials &lt;plume Crimean</Line>
<Line>_rum's %enrols hanging hospice&lt; 4urging Gipsy 1roaring bias</Line>
<Line>salvo8 schemes 2mien's briny sprites +Park refuges galling</Line>
</Level>
<Level>
<NewCharacters>PERL: {}()[]&lt;>\#</NewCharacters>
<Line>if ($line=~/^[^ ]+\s+\(([^)]+)\)\s/) {</Line>
<Line>$this->conffiles([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qcp $file")]);</Line>
<Line>$this->conffiles([]);</Line>
<Line>$this->filelist([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qpl $file")]);</Line>
<Line>$this->filelist([]);</Line>
<Line>arch group slpkgversion}];</Line>
<Line>Label => [],</Line>
<Line>Comment => [],</Line>
<Line>Attachment => [],</Line>
<Line>DependsOn => [],</Line>
<Line>Precedes => [],</Line>
<Line>my $self = bless [], $class;</Line>
<Line>@{ $var->[$zero] || [] }</Line>
<Line>@{ defined $var->[$zero] ? $var->[$zero] : [] }</Line>
<Line>$fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x$n\xt$m\xe/xgo;</Line>
<Line>Convert::ASNI::_dec_integer({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
<Line>Convert::ASNI::_dec_boolean({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
<Line>Convert::ASNI::_dec_string({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
<Line>$_[$one]->[cLOOP] &amp;&amp; ($_[$three]=[]), #loop</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-$e]);</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-$d], [$yyvs[$yyvsp-$h]], $r, $yyvs[$yyvsp-$l]);</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-$c]);</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-$b]);</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-$a]);</Line>
<Line>@{$yyval = []}[cTYPE] = ('ENUM');</Line>
<Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$a];</Line>
<Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$b];</Line>
<Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$c];</Line>
<Line>@{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-$z]);</Line>
<Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$d];</Line>
<Line>{ $yyval = [];</Line>
<Line>([,{}]|::=)</Line>
<Line>io => [qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],</Line>
<Line>debug => [qw(asn_dump asn_hexdump)],</Line>
<Line>ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],</Line>
<Line>tag => [qw(asn_tag asn_decode_tag asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]</Line>
<Line>eval { _encode($self->{options}, $self->{script}, $stash, [], $buf) }</Line>
<Line>my $me = ref($pkg) ? $pkg : bless [];</Line>
<Line>my $me = ref($pkg) ? $pkg : bless [], $pkg;</Line>
<Line>bless [], $type;</Line>
<Line>$$self{'data'}{'sections'}{'events'} = [];</Line>
<Line>$$self{'data'}{'sections'}{'holidays'} = [];</Line>
<Line>$$self{'data'}{'sections'}{$sect} = [];</Line>
<Line>'date' => [], # the parsed date split</Line>
<Line>'offset' => [], # The offset from GMT</Line>
<Line>'gmt' => [], # the date converted to GMT</Line>
<Line>'loc' => [], # the date converted to local timezone</Line>
<Line>$$dmb{'data'}{'holidays'}{'hols'} = [];</Line>
<Line>return [];</Line>
</Level>
<Level>
<NewCharacters>PERL: {}()[]&lt;>\# + 0123456789</NewCharacters>
<Line>if ($path !~ m|^/[^;\(\)]+|) {</Line>
<Line>if ($line =~ m/^tcp:\s+\[(\S+)\]\s+\S+\s+(\S+)\s*$/) {</Line>
<Line>my $storage_list = [];</Line>
<Line>my $cmd = ['/sbin/vgchange', '-aln', $scfg->{vgname}];</Line>
<Line>my $slist = [];</Line>
<Line>my $devlist = [];</Line>
<Line>while ($tmpl =~ m/([^{]+)?({([^}]+)})?/g) {</Line>
<Line>#'et' => [], # Ethopia or Estonia ??</Line>
<Line>#'th' => [],</Line>
<Line>my $kvmkeymaparray = [];</Line>
<Line>return $str ? [ Text::ParseWords::shellwords($str) ] : [];</Line>
<Line>my $lines = [];</Line>
<Line>my $cmd = ['lvremove', '-f', $di->{snapdev}];</Line>
<Line>return [];</Line>
<Line>my $res = [];</Line>
<Line>$skiplist = [] if !$skiplist;</Line>
<Line>my $bklist = [];</Line>
<Line>my $tasklist = [];</Line>
<Line>$task->{disks} = [];</Line>
<Line>my $vollist = [];</Line>
<Line>=item B&lt;shell_quote> [I&lt;string>]...</Line>
<Line>=item B&lt;shell_quote_best_effort> [I&lt;string>]...</Line>
<Line>=item B&lt;shell_comment_quote> [I&lt;string>]</Line>
<Line>RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,</Line>
<Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
<Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
<Line>return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;</Line>
<Line># gopher://&lt;host>[:&lt;port>]/&lt;gopher-path></Line>
<Line>'us' => [qw(www.ACME.gov www.ACME.mil)],</Line>
<Line>'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],</Line>
<Line>'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],</Line>
<Line>'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],</Line>
<Line>m,^[a-zA-Z]:[/\\],) # dosish file name</Line>
<Line>$reserved = q(;/?:@&amp;=+$,[]);</Line>
<Line>$u->query_param($key, []);</Line>
<Line>$key =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
<Line>$val =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
<Line>for (@copy) { s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }</Line>
<Line>$old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)</Line>
<Line>bless [URI::file->new_abs(shift)], $class;</Line>
<Line>return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;</Line>
<Line>my $self = bless [], $class;</Line>
<Line>return [] if $string eq '[]';</Line>
<Line>$hash->{$key} = [];</Line>
<Line>$lines[-1] .= ' []';</Line>
<Line>$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;</Line>
<Line>$line .= ' []';</Line>
<Line>$line .= ' []';</Line>
<Line>and mappings, support for the constructs [] (empty sequence) and {}</Line>
<Line>--- []</Line>
</Level>
</Levels>
</KTouchLecture>

View file

@ -0,0 +1,294 @@
<KTouchKeyboard>
<Title>English Workman with Dvorak-for-Programmers</Title>
<Comment>English Workman WDP Keyboard Layout</Comment>
<Language>en (English)</Language>
<Keys>
<Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
<Char Unicode="65" Position="TopLeft">A</Char>
</Key>
<Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
<Char Unicode="83" Position="TopLeft">S</Char>
</Key>
<Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
<Char Unicode="72" Position="TopLeft">H</Char>
</Key>
<Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
<Char Unicode="84" Position="TopLeft">T</Char>
</Key>
<Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
<Char Unicode="78" Position="TopLeft">N</Char>
</Key>
<Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
<Char Unicode="69" Position="TopLeft">E</Char>
</Key>
<Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
<Char Unicode="79" Position="TopLeft">O</Char>
</Key>
<Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
<Char Unicode="73" Position="TopLeft">I</Char>
</Key>
<Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
<Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
<Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
<Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
<Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
<Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
<Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
<Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
<Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
<Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="96" Position="TopLeft">`</Char>
<Char Unicode="126" Position="BottomLeft">~</Char>
</Key>
<Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="38" Position="TopLeft">&amp;</Char>
<Char Unicode="59" Position="BottomLeft">;</Char>
</Key>
<Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="55" Position="TopLeft">7</Char>
<Char Unicode="91" Position="BottomLeft">[</Char>
</Key>
<Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="53" Position="TopLeft">5</Char>
<Char Unicode="123" Position="BottomLeft">{</Char>
</Key>
<Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="51" Position="TopLeft">3</Char>
<Char Unicode="125" Position="BottomLeft">}</Char>
</Key>
<Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="49" Position="TopLeft">1</Char>
<Char Unicode="40" Position="BottomLeft">(</Char>
</Key>
<Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="57" Position="TopLeft">9</Char>
<Char Unicode="61" Position="BottomLeft">=</Char>
</Key>
<Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="48" Position="TopLeft">0</Char>
<Char Unicode="42" Position="BottomLeft">*</Char>
</Key>
<Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="50" Position="TopLeft">2</Char>
<Char Unicode="41" Position="BottomLeft">)</Char>
</Key>
<Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="52" Position="TopLeft">4</Char>
<Char Unicode="43" Position="BottomLeft">+</Char>
</Key>
<Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="54" Position="TopLeft">6</Char>
<Char Unicode="93" Position="BottomLeft">]</Char>
</Key>
<Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="56" Position="TopLeft">8</Char>
<Char Unicode="37" Position="BottomLeft">%</Char>
</Key>
<Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="35" Position="TopLeft">#</Char>
<Char Unicode="33" Position="BottomLeft">!</Char>
</Key>
<Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="81" Position="TopLeft">Q</Char>
</Key>
<Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="68" Position="TopLeft">D</Char>
</Key>
<Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="82" Position="TopLeft">R</Char>
</Key>
<Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="87" Position="TopLeft">W</Char>
</Key>
<Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="66" Position="TopLeft">B</Char>
</Key>
<Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="74" Position="TopLeft">J</Char>
</Key>
<Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="70" Position="TopLeft">F</Char>
</Key>
<Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="85" Position="TopLeft">U</Char>
</Key>
<Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="80" Position="TopLeft">P</Char>
</Key>
<Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="64" Position="TopLeft">@</Char>
<Char Unicode="36" Position="BottomLeft">$</Char>
</Key>
<Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="94" Position="TopLeft">^</Char>
<Char Unicode="58" Position="BottomLeft">:</Char>
</Key>
<Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="34" Position="TopLeft">"</Char>
<Char Unicode="39" Position="BottomLeft">'</Char>
</Key>
<Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="71" Position="TopLeft">G</Char>
</Key>
<Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="89" Position="TopLeft">Y</Char>
</Key>
<Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="95" Position="TopLeft">_</Char>
<Char Unicode="45" Position="BottomLeft">-</Char>
</Key>
<Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="124" Position="TopLeft">|</Char>
<Char Unicode="92" Position="BottomLeft">\</Char>
</Key>
<Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="62" Position="BottomLeft">></Char>
</Key>
<Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
<Char Unicode="90" Position="TopLeft">Z</Char>
</Key>
<Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
<Char Unicode="88" Position="TopLeft">X</Char>
</Key>
<Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
<Char Unicode="77" Position="TopLeft">M</Char>
</Key>
<Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="67" Position="TopLeft">C</Char>
</Key>
<Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
<Char Unicode="86" Position="TopLeft">V</Char>
</Key>
<Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="75" Position="TopLeft">K</Char>
</Key>
<Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
<Char Unicode="76" Position="TopLeft">L</Char>
</Key>
<Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
<Char Unicode="60" Position="TopLeft">&lt;</Char>
<Char Unicode="44" Position="BottomLeft">,</Char>
</Key>
<Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
<Char Unicode="62" Position="TopLeft">></Char>
<Char Unicode="46" Position="BottomLeft">.</Char>
</Key>
<Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
<Char Unicode="63" Position="TopLeft">?</Char>
<Char Unicode="47" Position="BottomLeft">/</Char>
</Key>
</Keys>
<Connections>
<KeyConnector TargetKeyIndex="0" KeyUnicode="97"/>
<KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
<KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
<KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
<KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="4" KeyUnicode="110" />
<KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
<KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
<KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
<KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
<KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
<KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
<KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
<KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
<KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
<KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
<KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
<KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
<KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
<KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
<KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
<KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
<KeyConnector TargetKeyIndex="20" KeyUnicode="38" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="21" KeyUnicode="91" />
<KeyConnector TargetKeyIndex="21" KeyUnicode="55" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="22" KeyUnicode="123"/>
<KeyConnector TargetKeyIndex="22" KeyUnicode="53" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="23" KeyUnicode="125"/>
<KeyConnector TargetKeyIndex="23" KeyUnicode="51" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="24" KeyUnicode="40" />
<KeyConnector TargetKeyIndex="24" KeyUnicode="49" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="25" KeyUnicode="61" />
<KeyConnector TargetKeyIndex="25" KeyUnicode="57" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="26" KeyUnicode="42" />
<KeyConnector TargetKeyIndex="26" KeyUnicode="48" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="27" KeyUnicode="41" />
<KeyConnector TargetKeyIndex="27" KeyUnicode="50" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="28" KeyUnicode="43" />
<KeyConnector TargetKeyIndex="28" KeyUnicode="52" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="29" KeyUnicode="93" />
<KeyConnector TargetKeyIndex="29" KeyUnicode="54" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="30" KeyUnicode="37" />
<KeyConnector TargetKeyIndex="30" KeyUnicode="56" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="31" KeyUnicode="35" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="31" KeyUnicode="33" />
<KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
<KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
<KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
<KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
<KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="36" KeyUnicode="98"/>
<KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="37" KeyUnicode="106" />
<KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
<KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
<KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
<KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
<KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
<KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
<KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
<KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
<KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
<KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
<KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
<KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
<KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
<KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="51" KeyUnicode="109" />
<KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="52" KeyUnicode="99"/>
<KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
<KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
<KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
<KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
<KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
<KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
<KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
<KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
</Connections>
</KTouchKeyboard>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
-dp----- a------- workman(wkm)
--p----- a------- workman(wco)
--p----- a------- workman(wcp)
--p----- a------- workman(wce)
--p----- a------- workman(wdp)

View file

@ -0,0 +1,180 @@
// workman layouts
// see http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/
// xkb keymap prepared by Oleg Kostyuk <cub@cub.org.ua>
// copyright 2012, bsd license
// to use, copy to /usr/share/X11/xkb/symbols/workman and add the following
// lines to /usr/share/X11/xkb/symbols.dir:
//
// -dp----- a------- workman(wkm)
// --p----- a------- workman(wcp)
// --p----- a------- workman(wco)
// --p----- a------- workman(wdp)
//
// then load with, e.g.
//
// setxkbmap workman # default layout
// setxkbmap -layout workman -variant wdp # to select other variants
default
partial alphanumeric_keys
xkb_symbols "wkm" {
name[Group1] = "The Workman Keyboard Layout";
include "latin"
include "latin(nodeadkeys)"
name[Group1] = "QFMLWY - full optimization, QWERTY lettermask";
// Unmodified Shift AltGr Shift+AltGr
key <AD01> { [ q, Q, at, Greek_OMEGA ] };
key <AD02> { [ d, D, dstroke, ordfeminine ] };
key <AD03> { [ r, R, mu, masculine ] };
key <AD04> { [ w, W, lstroke, Lstroke ] };
key <AD05> { [ b, B, lstroke, Lstroke ] };
key <AD06> { [ j, J, leftarrow, yen ] };
key <AD07> { [ f, F, downarrow, uparrow ] };
key <AD08> { [ u, U, oslash, Ooblique ] };
key <AD09> { [ p, P, rightdoublequotemark, rightsinglequotemark ] };
key <AD10> { [ semicolon, colon, rightdoublequotemark, rightsinglequotemark ] };
// Unmodified Shift AltGr Shift+AltGr
key <AC01> { [ a, A, eth, ETH ] };
key <AC02> { [ s, S, ssharp, section ] };
key <AC03> { [ h, H, tslash, Tslash ] };
key <AC04> { [ t, T ] };
key <AC05> { [ g, G, paragraph, registered ] };
key <AC06> { [ y, Y, rightarrow, idotless ] };
key <AC07> { [ n, N, ae, AE ] };
key <AC08> { [ e, E, EuroSign ] };
key <AC09> { [ o, O, hstroke, Hstroke ] };
key <AC10> { [ i, I, hstroke, Hstroke ] };
// Unmodified Shift AltGr Shift+AltGr
key <AB01> { [ z, Z, guillemotleft, less ] };
key <AB02> { [ x, X, leftdoublequotemark, leftsinglequotemark ] };
key <AB03> { [ m, M, eng, ENG ] };
key <AB04> { [ c, C, cent, copyright ] };
key <AB05> { [ v, V, guillemotright, greater ] };
key <AB06> { [ k, K, thorn, THORN ] };
key <AB07> { [ l, L, kra, ampersand ] };
};
partial alphanumeric_keys
xkb_symbols "wco" {
include "workman(wkm)"
name[Group1] = "Workman for Programmers, with light modifications from cub@uanic (old)";
// Unmodified Shift AltGr Shift+AltGr
// symbols row, left side
key <TLDE> { [ asciitilde, grave, dead_grave ] };
key <AE01> { [ exclam, 1, exclamdown ] };
key <AE02> { [ braceleft, 2, currency ] };
key <AE03> { [ numbersign, 3, cent ] };
key <AE04> { [ semicolon, 4, yen ] };
key <AE05> { [ braceright, 5, EuroSign ] };
key <AE06> { [ bracketleft, 6, sterling ] };
// symbols row, right side
key <AE07> { [ ampersand, 7 ] };
key <AE08> { [ asterisk, 8, onehalf ] };
key <AE09> { [ parenleft, 9 ] };
key <AE10> { [ parenright, 0 ] };
key <AE11> { [ bracketright, percent ] };
key <AE12> { [ equal, plus ] };
key <BKSP> { [ BackSpace ] };
// upper row, right side
key <AD10> { [ dollar, at, dead_acute, dead_doubleacute ] };
key <AD11> { [ colon, asciicircum, dead_circumflex, dead_caron ] };
key <AD12> { [ apostrophe, quotedbl ] };
// home row, right side
key <AC11> { [ minus, underscore, hyphen ] };
// lower row, left side
key <LSGT> { [ greater, less, bar, brokenbar ] };
};
partial alphanumeric_keys
xkb_symbols "wcp" {
include "workman(wco)"
name[Group1] = "Workman for Programmers, with light modifications from cub@uanic";
// Unmodified Shift AltGr Shift+AltGr
// symbols row, left side
key <AE01> { [ semicolon, 1, exclamdown ] };
key <AE02> { [ exclam, 2, currency ] };
key <AE04> { [ braceleft, 4, yen ] };
// symbols row, right side
key <AE07> { [ bracketright, 7 ] };
key <AE11> { [ ampersand, percent ] };
};
partial alphanumeric_keys
xkb_symbols "wce" {
include "workman(wcp)"
name[Group1] = "Workman for Programmers, with light modifications from cub@uanic, for Ergodox";
// Unmodified Shift AltGr Shift+AltGr
key <BKSL> { [ apostrophe, quotedbl ] };
key <AE11> { [ asciicircum, backslash ] };
key <AD11> { [ colon, percent ] };
key <AC11> { [ minus, underscore, hyphen ] };
key <AD12> { [ bar, ampersand ] };
};
partial alphanumeric_keys
xkb_symbols "wdp" {
include "workman(wkm)"
name[Group1] = "Workman for Programmers, with modifications from Dvorak for programmers";
// Unmodified Shift AltGr Shift+AltGr
// symbols row, left side
key <TLDE> { [ asciitilde, grave, dead_grave ] };
key <AE01> { [ semicolon, ampersand ] };
key <AE02> { [ bracketleft, 7, currency ] };
key <AE03> { [ braceleft, 5, cent ] };
key <AE04> { [ braceright, 3, yen ] };
key <AE05> { [ parenleft, 1, EuroSign ] };
key <AE06> { [ equal, 9, sterling ] };
// symbols row, right side
key <AE07> { [ asterisk, 0 ] };
key <AE08> { [ parenright, 2, onehalf ] };
key <AE09> { [ plus, 4 ] };
key <AE10> { [ bracketright, 6 ] };
key <AE11> { [ percent, 8 ] };
key <AE12> { [ exclam, numbersign, exclamdown ] };
key <BKSP> { [ BackSpace ] };
// upper row, right side
key <AD10> { [ dollar, at, dead_acute, dead_doubleacute ] };
key <AD11> { [ colon, asciicircum, dead_circumflex, dead_caron ] };
key <AD12> { [ apostrophe, quotedbl ] };
// home row, right side
key <AC11> { [ minus, underscore, hyphen ] };
// lower row, left side
key <LSGT> { [ greater, less, bar, brokenbar ] };
};

93
keyboard/ergodox/config.h Normal file
View file

@ -0,0 +1,93 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
This work is heavily based on initial firmware for Ergodox keyboard.
Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (see "doc/licenses/MIT.md")
Project located at <https://github.com/benblazak/ergodox-firmware>
*/
#ifndef CONFIG_H
#define CONFIG_H
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x1307
#define DEVICE_VER 0x0001
#define MANUFACTURER TMK/Cub
#define PRODUCT Ergodox
#define DESCRIPTION t.m.k. keyboard firmware for Ergodox
#define MATRIX_ROWS 14
#define MATRIX_COLS 6
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_MAX_SPEED 3
#define MOUSEKEY_TIME_TO_MAX 10
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
/*
* This constant define not debouncing time in msecs, but amount of matrix
* scan loops which should be made to get stable debounced results.
*
* On Ergodox matrix scan rate is relatively low, because of slow I2C.
* Now it's only 317 scans/second, or about 3.15 msec/scan.
* According to Cherry specs, debouncing time is 5 msec.
*
* And so, there is no sense to have DEBOUNCE higher than 2.
*/
#define DEBOUNCE 2
#define TAPPING_TERM 230
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
)
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
//#define DEBUG_MATRIX_SCAN_RATE
#endif

136
keyboard/ergodox/ergodox.c Normal file
View file

@ -0,0 +1,136 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
This work is heavily based on initial firmware for Ergodox keyboard.
Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (see "doc/licenses/MIT.md")
Project located at <https://github.com/benblazak/ergodox-firmware>
Most used files are located at
<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "action.h"
#include "command.h"
#include "print.h"
#include "debug.h"
#include "ergodox.h"
#include "i2cmaster.h"
bool i2c_initialized = 0;
uint8_t mcp23018_status = 0x20;
bool ergodox_left_led_1 = 0; // left top
bool ergodox_left_led_2 = 0; // left middle
bool ergodox_left_led_3 = 0; // left bottom
void init_ergodox(void)
{
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
TCCR1A = 0b10101001; // set and configure fast PWM
TCCR1B = 0b00001001; // set and configure fast PWM
// (tied to Vcc for hardware convenience)
DDRB &= ~(1<<4); // set B(4) as input
PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
// unused pins - C7, D4, D5, D7, E6
// set as input with internal pull-ip enabled
DDRC &= ~(1<<7);
DDRD &= ~(1<<7 | 1<<5 | 1<<4);
DDRE &= ~(1<<6);
PORTC |= (1<<7);
PORTD |= (1<<7 | 1<<5 | 1<<4);
PORTE |= (1<<6);
}
void ergodox_blink_all_leds(void)
{
ergodox_led_all_off();
ergodox_led_all_set(LED_BRIGHTNESS_HI);
ergodox_led_all_on();
_delay_ms(333);
ergodox_led_all_off();
}
uint8_t init_mcp23018(void) {
mcp23018_status = 0x20;
// I2C subsystem
if (i2c_initialized == 0) {
i2c_init(); // on pins D(1,0)
i2c_initialized++;
_delay_ms(1000);
}
// set pin direction
// - unused : input : 1
// - input : input : 1
// - driving : output : 0
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
i2c_stop();
// set pull-up
// - unused : on : 1
// - input : on : 1
// - driving : off : 0
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
out:
i2c_stop();
if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
return mcp23018_status;
}
uint8_t ergodox_left_leds_update(void) {
if (mcp23018_status) { // if there was an error
return mcp23018_status;
}
// set logical value (doesn't matter on inputs)
// - unused : hi-Z : 1
// - input : hi-Z : 1
// - driving : hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(OLATA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
); if (mcp23018_status) goto out;
out:
i2c_stop();
return mcp23018_status;
}

120
keyboard/ergodox/ergodox.h Normal file
View file

@ -0,0 +1,120 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (see "doc/licenses/MIT.md")
Project located at <https://github.com/benblazak/ergodox-firmware>
Most used files are located at
<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
*/
#ifndef ERGODOX_H
#define ERGODOX_H
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include "i2cmaster.h"
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
#define CPU_16MHz 0x00
// I2C aliases and register addresses (see "mcp23018.md")
#define I2C_ADDR 0b0100000
#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
#define IODIRA 0x00 // i/o direction register
#define IODIRB 0x01
#define GPPUA 0x0C // GPIO pull-up resistor register
#define GPPUB 0x0D
#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
#define GPIOB 0x13
#define OLATA 0x14 // output latch register
#define OLATB 0x15
extern uint8_t mcp23018_status;
void init_ergodox(void);
void ergodox_blink_all_leds(void);
uint8_t init_mcp23018(void);
uint8_t ergodox_left_leds_update(void);
#define LED_BRIGHTNESS_LO 31
#define LED_BRIGHTNESS_HI 255
#define LEFT_LED_1_SHIFT 7 // in MCP23018 port B
#define LEFT_LED_2_SHIFT 6 // in MCP23018 port B
#define LEFT_LED_3_SHIFT 7 // in MCP23018 port A
extern bool ergodox_left_led_1; // left top
extern bool ergodox_left_led_2; // left middle
extern bool ergodox_left_led_3; // left bottom
static inline void ergodox_board_led_on(void) { DDRD |= (1<<6); PORTD |= (1<<6); }
static inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
static inline void ergodox_right_led_2_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); }
static inline void ergodox_right_led_3_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); }
static inline void ergodox_left_led_1_on(void) { ergodox_left_led_1 = 1; }
static inline void ergodox_left_led_2_on(void) { ergodox_left_led_2 = 1; }
static inline void ergodox_left_led_3_on(void) { ergodox_left_led_3 = 1; }
static inline void ergodox_board_led_off(void) { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
static inline void ergodox_right_led_1_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
static inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
static inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
static inline void ergodox_left_led_1_off(void) { ergodox_left_led_1 = 0; }
static inline void ergodox_left_led_2_off(void) { ergodox_left_led_2 = 0; }
static inline void ergodox_left_led_3_off(void) { ergodox_left_led_3 = 0; }
static inline void ergodox_led_all_on(void)
{
ergodox_board_led_on();
ergodox_right_led_1_on();
ergodox_right_led_2_on();
ergodox_right_led_3_on();
ergodox_left_led_1_on();
ergodox_left_led_2_on();
ergodox_left_led_3_on();
ergodox_left_leds_update();
}
static inline void ergodox_led_all_off(void)
{
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
ergodox_left_led_1_off();
ergodox_left_led_2_off();
ergodox_left_led_3_off();
ergodox_left_leds_update();
}
static inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }
static inline void ergodox_right_led_2_set(uint8_t n) { OCR1B = n; }
static inline void ergodox_right_led_3_set(uint8_t n) { OCR1C = n; }
static inline void ergodox_led_all_set(uint8_t n)
{
ergodox_right_led_1_set(n);
ergodox_right_led_2_set(n);
ergodox_right_led_3_set(n);
}
#endif

View file

@ -0,0 +1,178 @@
#ifndef _I2CMASTER_H
#define _I2CMASTER_H
/*************************************************************************
* Title: C include file for the I2C master interface
* (i2cmaster.S or twimaster.c)
* Author: Peter Fleury <pfleury@gmx.ch>
* File: $Id: i2cmaster.h,v 1.12 2015/09/16 09:27:58 peter Exp $
* Software: AVR-GCC 4.x
* Target: any AVR device
* Usage: see Doxygen manual
**************************************************************************/
/**
@file
@defgroup pfleury_ic2master I2C Master library
@code #include <i2cmaster.h> @endcode
@brief I2C (TWI) Master Software Library
Basic routines for communicating with I2C slave devices. This single master
implementation is limited to one bus master on the I2C bus.
This I2c library is implemented as a compact assembler software implementation of the I2C protocol
which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
Since the API for these two implementations is exactly the same, an application can be linked either against the
software I2C implementation or the hardware I2C implementation.
Use 4.7k pull-up resistor on the SDA and SCL pin.
Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
i2cmaster.S to your target when using the software I2C implementation !
Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
@note
The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
to GNU assembler and AVR-GCC C call interface.
Replaced the incorrect quarter period delays found in AVR300 with
half period delays.
@author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
@copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
@par API Usage Example
The following code shows typical usage of this library, see example test_i2cmaster.c
@code
#include <i2cmaster.h>
#define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet
int main(void)
{
unsigned char ret;
i2c_init(); // initialize I2C library
// write 0x75 to EEPROM address 5 (Byte Write)
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_write(0x75); // write value 0x75 to EEPROM
i2c_stop(); // set stop conditon = release bus
// read previously written value back from EEPROM address 5
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
}
@endcode
*/
/**@{*/
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
#include <avr/io.h>
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_READ 1
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_WRITE 0
/**
@brief initialize the I2C master interace. Need to be called only once
@return none
*/
extern void i2c_init(void);
/**
@brief Terminates the data transfer and releases the I2C bus
@return none
*/
extern void i2c_stop(void);
/**
@brief Issues a start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_start(unsigned char addr);
/**
@brief Issues a repeated start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_rep_start(unsigned char addr);
/**
@brief Issues a start condition and sends address and transfer direction
If device is busy, use ack polling to wait until device ready
@param addr address and transfer direction of I2C device
@return none
*/
extern void i2c_start_wait(unsigned char addr);
/**
@brief Send one byte to I2C device
@param data byte to be transfered
@retval 0 write successful
@retval 1 write failed
*/
extern unsigned char i2c_write(unsigned char data);
/**
@brief read one byte from the I2C device, request more data from device
@return byte read from I2C device
*/
extern unsigned char i2c_readAck(void);
/**
@brief read one byte from the I2C device, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_readNak(void);
/**
@brief read one byte from the I2C device
Implemented as a macro, which calls either @ref i2c_readAck or @ref i2c_readNak
@param ack 1 send ack, request more data from device<br>
0 send nak, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_read(unsigned char ack);
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
/**@}*/
#endif

View file

@ -0,0 +1,186 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <util/delay.h>
#include "bootloader.h"
#include "keymap_common.h"
// Aliases for shifted symbols
// Names from QMK
#define KC_TILD KC_FN11
#define KC_EXLM KC_FN12
#define KC_AT KC_FN13
#define KC_HASH KC_FN14
#define KC_DLR KC_FN15
#define KC_PERC KC_FN16
#define KC_CIRC KC_FN17
#define KC_AMPR KC_FN18
#define KC_ASTR KC_FN19
#define KC_LPRN KC_FN20
#define KC_RPRN KC_FN21
#define KC_UNDS KC_FN22
#define KC_PLUS KC_FN23
#define KC_LCBR KC_FN24
#define KC_RCBR KC_FN25
#define KC_LABK KC_FN26
#define KC_RABK KC_FN27
#define KC_COLN KC_FN28
#define KC_PIPE KC_FN29
#define KC_QUES KC_FN30
#define KC_DQT KC_FN31
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KEYMAP( // layer 0 : default
// left hand
EQL, 1, 2, 3, 4, 5, ESC,
BSLS,Q, W, E, R, T, FN2,
TAB, A, S, D, F, G,
LSFT,Z, X, C, V, B, FN1,
LGUI,GRV, BSLS,LEFT,RGHT,
LCTL,LALT,
HOME,
BSPC,DEL, END,
// right hand
FN3, 6, 7, 8, 9, 0, MINS,
LBRC,Y, U, I, O, P, RBRC,
H, J, K, L, SCLN,QUOT,
FN1, N, M, COMM,DOT, SLSH,RSFT,
LEFT,DOWN,UP, RGHT,RGUI,
RALT,RCTL,
PGUP,
PGDN,ENT, SPC
),
KEYMAP( // layer 1 : function and symbol keys
// left hand
NO, F1, F2, F3, F4, F5, F11,
TRNS,LCBR,RCBR,LBRC,RBRC,NO, FN4,
TRNS,SCLN,SLSH,MINS,P0, COLN,
TRNS,P6, P7, P8, P9, PLUS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F12, F6, F7, F8, F9, F10, PWR,
TRNS,NO, MINS,LABK,RABK,DLR ,VOLU,
BSLS,P1, LPRN,RPRN,PLUS,VOLD,
TRNS,ASTR,P2, P3, P4, P5, MUTE,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layer 2 : keyboard functions
// left hand
FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
FN4, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layer 3: numpad
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
TRNS,NO, P7, P8, P9, PMNS,BSPC,
NO, P4, P5, P6, PPLS,PENT,
TRNS,NO, P1, P2, P3, PPLS,PENT,
P0, PDOT,SLSH,PENT,PENT,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
};
/* id for user defined functions */
enum function_id {
TEENSY_KEY,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
ACTION_LAYER_MOMENTARY(1), // FN1 - switch to Layer1
ACTION_LAYER_SET(2, ON_PRESS), // FN2 - set Layer2
ACTION_LAYER_TOGGLE(3), // FN3 - toggle Layer3 aka Numpad layer
ACTION_LAYER_SET(0, ON_PRESS), // FN4 - set Layer0
// Reserved for user actions
ACTION_NO,
ACTION_NO,
ACTION_NO,
ACTION_NO,
ACTION_NO,
ACTION_NO,
// Shifted keys
ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // FN11 - ~
ACTION_MODS_KEY(MOD_LSFT, KC_1), // FN12 - !
ACTION_MODS_KEY(MOD_LSFT, KC_2), // FN13 - @
ACTION_MODS_KEY(MOD_LSFT, KC_3), // FN14 - #
ACTION_MODS_KEY(MOD_LSFT, KC_4), // FN15 - $
ACTION_MODS_KEY(MOD_LSFT, KC_5), // FN16 - %
ACTION_MODS_KEY(MOD_LSFT, KC_6), // FN17 - ^
ACTION_MODS_KEY(MOD_LSFT, KC_7), // FN18 - &
ACTION_MODS_KEY(MOD_LSFT, KC_8), // FN19 - *
ACTION_MODS_KEY(MOD_LSFT, KC_9), // FN20 - (
ACTION_MODS_KEY(MOD_LSFT, KC_0), // FN21 - )
ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN22 - _
ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // FN23 - +
ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // FN24 - {
ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // FN25 - }
ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN26 - <
ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN27 - >
ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), // FN28 - :
ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN29 - |
ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN30 - ?
ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), // FN31 - "
};
void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(250);
bootloader_jump(); // should not return
print("not supported.\n");
}
}

View file

@ -0,0 +1,203 @@
/*
Copyright 2016 Paul Williamson <squarefrog@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <util/delay.h>
#include "bootloader.h"
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap 0: Default Colemak Layer
*
* This is a general purpose Colemak layout which should serve as a good
* basis for your own custom layout. Mac users may want to swap the
* position of the Alt and GUI keys.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | ~ | | - | 6 | 7 | 8 | 9 | 0 | + |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | F | P | G | [ | | ] | J | L | U | Y | ; | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | CpsLk | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
* |--------+------+------+------+------+------| +L2 | | |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | LCtrl| LGui | LAlt | Left | Rght | | Up | Dn | RAlt | RGui | RCtrl |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |CpsLck| Del | | PgUp | PgDn |
* ,------|------|------| |------+------+------.
* | | | LAlt | | RAlt | | |
* | BkSp | ~L1 |------| |------| Enter| Space|
* | | | LCtrl| | RCtrl| | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
ESC, 1, 2, 3, 4, 5, GRV,
TAB, Q, W, F, P, G, LBRC,
CAPS,A, R, S, T, D,
LSFT,Z, X, C, V, B, FN2,
LCTL,LGUI,LALT,LEFT,RGHT,
CAPS,DEL,
LALT,
BSPC,FN1, LCTL,
// right hand
MINS,6, 7, 8, 9, 0, EQL,
RBRC,J, L, U, Y, SCLN,BSLS,
H, N, E, I, O, QUOT,
NO, K, M, COMM,DOT, SLSH,RSFT,
UP, DOWN,RALT,RGUI,RCTL,
PGUP,PGDN,
RALT,
RCTL,ENT, SPC
),
/*
* Layer 1: Function keys
*
* This layer contains function keys, and media keys. Additionally, there
* are QWERTY-style Vim arrow keys. I could never get used to Colemak's
* rearranged Vim arrow placements.
*
* Most of the non-modifier keys are marked as NO, so it's immediately
* obvious if you start typing on a secondary layer.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Teensy | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | TRNS |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TRNS | | | | | | TRNS | | TRNS | | | | | | TRNS |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | TRNS | | | | | |------| |------| Left | Down | Up | Right| | TRNS |
* |--------+------+------+------+------+------| +L2 | | |------+------+------+------+------+--------|
* | TRNS | | | | | | | | | | | | | | TRNS |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | TRNS | TRNS | Play | RW | FF | | Mute | Vol- | Vol+ | TRNS | TRNS |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | HOME | END |
* ,------|------|------| |------+------+------.
* | | | TRNS | | TRNS | | |
* | TRNS | |------| |------| TRNS | TRNS |
* | | | TRNS | | TRNS | | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
FN31,F1, F2, F3, F4, F5, F11,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, FN2,
TRNS,TRNS,MPLY,MPRV,MNXT,
NO, NO,
TRNS,
TRNS,NO, TRNS,
// right hand
F12, F6, F7, F8, F9, F10, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
LEFT,DOWN,UP, RGHT,NO, TRNS,
NO, NO, NO, NO, NO, NO, TRNS,
MUTE,VOLD,VOLU,TRNS,TRNS,
HOME,END,
TRNS,
TRNS,TRNS,TRNS
),
/*
* Layer 2: Number Pad
*
* This layer has a number pad for quicker number entry. As with layer 1,
* most of the non-modifier keys are marked as NO, so it's immediately
* obvious if you start typing on a secondary layer.
*
* Inspired by Ben Blazak QWERTY num pad.
* https://git.io/voIeY
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | | | | | | | | | | NmLk | / | * | - | Bkspc |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TRNS | | | | | | TRNS | | TRNS | | 7 | 8 | 9 | + | Bkspc |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | TRNS | | | | | |------| |------| | 4 | 5 | 6 | + | Enter |
* |--------+------+------+------+------+------| | | -L0 |------+------+------+------+------+--------|
* | TRNS | | | | | | | | | | 1 | 2 | 3 | Enter| Enter |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | TRNS | TRNS | LALT | | | | 0 | 0 | . | Enter| Enter|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | TRNS | TRNS |
* ,------|------|------| |------+------+------.
* | | | TRNS | | TRNS | | |
* | Bkspc| |------| |------| Enter| |
* | | | TRNS | | TRNS | | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
ESC, NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,TRNS,LALT,NO, NO,
NO, NO,
TRNS,
BSPC,NO, TRNS,
// right hand
NO, NO, NLCK,SLSH,PAST,PMNS,BSPC,
TRNS,NO, P7, P8, P9, PPLS,BSPC,
NO, P4, P5, P6, PPLS,PENT,
FN0, NO, P1, P2, P3, PENT,PENT,
P0, P0, PDOT,PENT,PENT,
TRNS,TRNS,
TRNS,
TRNS,ENT, TRNS
),
};
/* id for user defined functions */
enum function_id {
TEENSY_KEY,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
// Layer shifting
[0] = ACTION_LAYER_SET(0, ON_PRESS), // Switch to Layer 0
[1] = ACTION_LAYER_MOMENTARY(1), // Momentarily switch to layer 1
[2] = ACTION_LAYER_SET(2, ON_PRESS), // Switch to Layer 2
// Teensy
[31] = ACTION_FUNCTION(TEENSY_KEY),
};
void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(250);
bootloader_jump(); // should not return
print("not supported.\n");
}
}

View file

@ -0,0 +1,33 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
Copyright 2016 Mark Sikora <marknsikora@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "keymap_common.h"
/* translates key to keycode */
__attribute__ ((weak))
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
}
/* translates Fn keycode to action */
__attribute__ ((weak))
action_t keymap_fn_to_action(uint8_t keycode)
{
return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
}

View file

@ -0,0 +1,80 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
Copyright 2016 Mark Sikora <marknsikora@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEYMAP_COMMON_H
#define KEYMAP_COMMON_H
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
extern const action_t fn_actions[];
/* ErgoDox keymap definition macro */
#define KEYMAP( \
\
/* left hand, spatial positions */ \
k00,k01,k02,k03,k04,k05,k06, \
k10,k11,k12,k13,k14,k15,k16, \
k20,k21,k22,k23,k24,k25, \
k30,k31,k32,k33,k34,k35,k36, \
k40,k41,k42,k43,k44, \
k55,k56, \
k54, \
k53,k52,k51, \
\
/* right hand, spatial positions */ \
k07,k08,k09,k0A,k0B,k0C,k0D, \
k17,k18,k19,k1A,k1B,k1C,k1D, \
k28,k29,k2A,k2B,k2C,k2D, \
k37,k38,k39,k3A,k3B,k3C,k3D, \
k49,k4A,k4B,k4C,k4D, \
k57,k58, \
k59, \
k5C,k5B,k5A ) \
\
/* matrix positions */ \
{ \
{ KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO }, \
{ KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51}, \
{ KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52}, \
{ KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53}, \
{ KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54}, \
{ KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO, KC_##k55}, \
{ KC_##k06,KC_##k16,KC_NO, KC_##k36,KC_NO, KC_##k56}, \
\
{ KC_##k07,KC_##k17,KC_NO, KC_##k37,KC_NO, KC_##k57}, \
{ KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO, KC_##k58}, \
{ KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59}, \
{ KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A}, \
{ KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B}, \
{ KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C}, \
{ KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO } \
}
#endif

View file

@ -0,0 +1,602 @@
#include <util/delay.h>
#include "action_layer.h"
#include "action_util.h"
#include "bootloader.h"
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap: Default Layer in QWERTY
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | \ | | - | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | ~L5 | | ~L6 | Y | U | I | O | P | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| L0 | | ~L7 |------+------+------+------+------+--------|
* | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | ] |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | +L2 | Home | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | End | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
*
*
****************************************************************************************************
*
* Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
* See XOrg files in ./addons/ subdirectory.
*
* I have to do so, because of two things:
* 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
* 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
*
* And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
* keys), then (1) can't be solved at firmware level at all.
*
* So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
* But sometimes I have to input something when XOrg is not active - for example, in Linux console,
* or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
*
* For such cases I have Layer1 :)
* // hint: switch to Layer1 is only at Layer6
*
****************************************************************************************************
*
*
*
* Keymap: Default Layer in Workman
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | $ | : |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | L0 | +L2 | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | NO | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
* Keymap: Default Layer in Workman / with Shift
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | @ | % |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | L0 | +L2 | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | NO | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
*/
KEYMAP( // Layer0: default, leftled:none
// left hand
GRV, 1, 2, 3, 4, 5, BSLS,
FN2, Q, W, E, R, T, FN23,
FN11,FN28,FN29,FN30,FN31,G,
FN12,FN24,FN25,FN26,FN27,B, HOME,
FN21,FN20,CAPS,FN13,FN14,
FN17,FN19,
NO,
FN5, FN6, FN7,
// right hand
MINS,6, 7, 8, 9, 0, EQL,
FN23,Y, U, I, O, P, LBRC,
H, J, K, L, SCLN,FN15,
END, N, M, COMM,DOT, SLSH,FN16,
LEFT,UP, DOWN,RGHT,FN22,
PGUP,DEL,
PGDN,
FN8, FN9, FN10
),
KEYMAP( // Layer1: Workman layout, leftled:all
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,Q, D, R, W, B, TRNS,
TRNS,A, S, H, T, G,
TRNS,Z, X, M, C, V, TRNS,
TRNS,TRNS,FN17,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,J, F, U, P, 4, TRNS,
Y, N, E, O, I, TRNS,
TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer2: numpad, leftled:mid/blue
// left hand
TRNS,NO, NO, NO, NO, PAUS,PSCR,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, TRNS,NO,
TRNS,NO, NO, NO, TRNS,NO, TRNS,
TRNS,TRNS,FN17,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
TRNS,NO, P7, P8, P9, PMNS,PGUP,
NO, P4, P5, P6, PPLS,PGDN,
TRNS,NO, P1, P2, P3, PPLS,PENT,
P0, PDOT,SLSH,PENT,PENT,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, TRNS,NO, NO, NO,
TRNS,NO, TRNS,NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, F1, F2, F3, F4, PGUP,
NO, F5, F6, F7, F8, PGDN,
TRNS,NO, F9, F10, F11, F12, APP,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,NO, NO, NO, NO,
TRNS,TRNS,NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
/* in Workman right hand will be:
{ } ( ) +
^ ! ? =
' ! $ " ; \
# [ < > ] \
*/
// right hand
NO, NO, 4, 5, 9, 0, PPLS,
TRNS,MINS,2, FN5, 9, 0, EQL,
BSLS,2, P, FN1, 1, FN2,
TRNS,3, 6, FN3, FN4, 7, FN2,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
// left hand
TRNS,F1, F2, F3, F4, F5, F6,
TRNS,P1, P2, P3, P4, P5, TRNS,
TRNS,TRNS,TRNS,E, TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, TRNS,
TRNS,P6, P7, P8, P9, P0, TRNS,
TRNS,U, TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
// left hand
FN0, F1, F2, F3, F4, F5, F6,
TRNS,P1, P2, P3, P4, P5, TRNS,
TRNS,TRNS,TRNS,E, TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
FN18,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, FN0,
TRNS,P6, P7, P8, P9, P0, TRNS,
TRNS,U, TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
//
// rarely used
//
KEYMAP( // Layer7: F-keys only, leftled:top/white
// left hand
FN0, NO, NO, NO, NO, NO, NO,
FN1, F13, F14, F15, F16, NO, TRNS,
TRNS,F17, F18, F19, F20, NO,
TRNS,F21, F22, F23, F24, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, F1, F2, F3, F4, TRNS,
NO, F5, F6, F7, F8, TRNS,
TRNS,NO, F9, F10, F11, F12, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
SLEP,TRNS,TRNS
),
KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, ACL0,NO, TRNS,
TRNS,NO, NO, TRNS,ACL1,NO,
TRNS,NO, NO, TRNS,ACL2,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
F15, BTN3,HOME,END, DEL, INS, NO,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, TRNS,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, FN12,FN13,FN14,FN15,FN10,
FN1, FN2, FN3, FN4, FN5, FN11,
TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
/*
// templates to copy from
KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // LayerN: fully transparent
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
*/
};
/* id for user defined functions & macros */
enum function_id {
TEENSY_KEY,
CUSTOM_KEY,
L_CTRL_ALT_ENT,
R_CTRL_ALT_ENT,
};
enum macro_id {
XMONAD_RESET,
PASSWORD1,
PASSWORD2,
PASSWORD3,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
[2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
[3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
[4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
[5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
[6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
[7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
[8] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_INS), // FN8 = RGui with tap Ins
[9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
[10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
[11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
[12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
[13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
[14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
[15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
[16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
[17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
[18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
[19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
[21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
[22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
[28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
[29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
[30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
[31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
// i'd like to remove this - will try to get used to live without this and convert them to usual keys
[20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
// or
// [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
[23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
[24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
[25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
[26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
[27] = ACTION_LAYER_TAP_KEY(9, KC_V), // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
};
const action_t PROGMEM fn_actions_4[] = {
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
[2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
[3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
[4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
[5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
};
const action_t PROGMEM fn_actions_7[] = {
[0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
[1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
[2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
[3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
};
const action_t PROGMEM fn_actions_9[] = {
[0] = ACTION_MODS_KEY(MOD_LCTL, KC_P0), // FN0 = Ctrl+0
[1] = ACTION_MODS_KEY(MOD_LALT, KC_P1), // FN1 = Alt+1
[2] = ACTION_MODS_KEY(MOD_LALT, KC_P2), // FN2 = Alt+2
[3] = ACTION_MODS_KEY(MOD_LALT, KC_P3), // FN3 = Alt+3
[4] = ACTION_MODS_KEY(MOD_LALT, KC_P4), // FN4 = Alt+4
[5] = ACTION_MODS_KEY(MOD_LALT, KC_P5), // FN5 = Alt+5
[6] = ACTION_MODS_KEY(MOD_LALT, KC_P6), // FN6 = Alt+6
[7] = ACTION_MODS_KEY(MOD_LALT, KC_P7), // FN7 = Alt+7
[8] = ACTION_MODS_KEY(MOD_LALT, KC_P8), // FN8 = Alt+8
[9] = ACTION_MODS_KEY(MOD_LALT, KC_P9), // FN9 = Alt+9
[10] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB), // FN10 = Ctrl+Shift+Tab
[11] = ACTION_MODS_KEY(MOD_LCTL, KC_TAB), // FN11 = Ctrl+Tab
[12] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP), // FN12 = Ctrl+Shift+PgUp
[13] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN), // FN13 = Ctrl+Shift+PgDn
[14] = ACTION_MODS_KEY(MOD_LCTL, KC_PMNS), // FN14 = Ctrl+Pad Minus
[15] = ACTION_MODS_KEY(MOD_LCTL, KC_PPLS), // FN15 = Ctrl+Pad Plus
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// print("action_function called\n");
// print("id = "); phex(id); print("\n");
// print("opt = "); phex(opt); print("\n");
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(50);
bootloader_jump(); // should not return
print("not supported.\n");
}
if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
if (record->tap.count == 0 || record->tap.interrupted) {
uint8_t weak_mods;
uint8_t layer;
if (id == L_CTRL_ALT_ENT) {
weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
layer = 5;
} else {
weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
layer = 6;
}
if (record->event.pressed) {
layer_on(layer);
add_weak_mods(weak_mods);
} else {
del_weak_mods(weak_mods);
layer_off(layer);
}
} else {
if (record->event.pressed) {
add_key(KC_ENT);
send_keyboard_report();
} else {
del_key(KC_ENT);
send_keyboard_report();
}
}
}
/*
* just an example of custom key implementation
* not really needed with custom keymap_fn_to_action(),
* because it will allow you to have 32 FN** keys on EACH layer
*/
/*
keyevent_t event = record->event;
if (id == CUSTOM_KEY) {
uint8_t layer = biton32(layer_state);
uint8_t col = event.key.col;
uint8_t row = event.key.row;
uint8_t handled = 0;
if (event.pressed) {
if (layer == XXX && col == XXX && row == XXX) {
action_macro_play(
MACRO(
...........
END)
);
handled++;
}
}
}
if (!handled) {
print("custom key not handled");
print(": layer "); pdec(layer);
print(", col "); pdec(col);
print(", row "); pdec(row);
print("\n");
}
}
*/
}
#include "keymap_passwords.h"
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
if (record->event.pressed) {
switch (id) {
case XMONAD_RESET: return MACRO_XMONAD_RESET;
case PASSWORD1: return MACRO_PASSWORD1;
}
}
return MACRO_NONE;
}
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
#define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
#define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
#define FN_ACTIONS_9_SIZE (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
/*
* translates Fn keycode to action
* for some layers, use different translation table
*/
action_t keymap_fn_to_action(uint8_t keycode)
{
uint8_t layer = biton32(layer_state);
action_t action;
action.code = ACTION_NO;
if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
}
if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
}
if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
}
// by default, use fn_actions from default layer 0
// this is needed to get mapping for same key, that was used switch to some layer,
// to have possibility to switch layers back
if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
}
return action;
}

View file

@ -0,0 +1,232 @@
#include "bootloader.h"
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap: Default Layer in Dvorak (Layer 0)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | + | 1 | 2 | 3 | 4 | 5 | Esc | | ESC | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | ' | , | . | Y | Y |(Null)| |(Null)| F | G | C | R | L | / |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | \ |
* |--------+------+------+------+------+------| FN1 | | FN2 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | X | | | | B | M | W | V | Z | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LCtr | LAlt | | Ralt | RCtr |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*
*
*****************************************************************************************************
* This Dvorak keyboard layout stems from my early Kinesis years, using the Contour PS/2 with a Dvorak
* software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the cor-
* ner keys. I've decided to continue using this layout with my ErgoDox.
*/
KEYMAP( // layer 0 : default
// left hand
EQL, 1, 2, 3, 4, 5, ESC,
TAB, QUOT, COMM, DOT, P, Y, NO,
CAPS, A, O, E, U, I,
LSFT, SCLN, Q, J, K, X, FN1,
LGUI, GRV, INS,LEFT,RGHT,
LCTL,LALT,
HOME,
BSPC,DEL, END,
// right hand
ESC, 6, 7, 8, 9, 0, MINS,
NO, F, G, C, R, L, SLSH,
D, H, T, N, S, BSLS,
FN2, B, M, W, V, Z, RSFT,
UP,DOWN,RBRC,LBRC, RGUI,
RALT,RCTL,
PGUP,
PGDN,ENT, SPC
),
/*
* Keymap: Function and Media Keys Layer (Layer 1)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | TEENSY | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | Mute |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | FN4 | | FN6 | | PrSc | ScLk | Paus | | Vol Up |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| Stop | Prev | Play | Next | Sel | Vol Dn |
* |--------+------+------+------+------+------| FN4 | | FN7 |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*
*
*/
KEYMAP( // layer 1 : function and media keys
// left hand
FN0, F1, F2, F3, F4, F5, F11,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F12, F6, F7, F8, F9, F10, MUTE,
FN6, TRNS,PSCR,SLCK,PAUS,TRNS,VOLU,
MSTP,MPRV,MPLY,MNXT,MSEL,VOLD,
FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
/*
* Keymap: Numpad Layer (Layer 2)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Power | | | | | | | | | | NmLk | KP / | KP * | KP - | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Sleep | | | | | | FN5 | | FN4 | | KP 7 | KP 8 | KP 9 | KP + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Wake | | | | | |------| |------| | KP 4 | KP 5 | KP 6 | KP + | |
* |--------+------+------+------+------+------| FN7 | | FN4 |------+------+------+------+------+--------|
* | | | | | | | | | | | KP 1 | KP 2 | KP 3 |KP Ent| |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | KP 0 | | KP . |KP Ent| |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*
*/
KEYMAP( // layer 2: numpad
// left hand
PWR, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
SLEP,TRNS,TRNS,TRNS,TRNS,TRNS, FN5,
WAKE,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN7,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,NLCK,PSLS,PAST,PMNS,TRNS,
FN4,NO, P7, P8, P9, PPLS,TRNS,
NO, P4, P5, P6, PPLS,TRNS,
FN4,NO, P1, P2, P3, PENT,TRNS,
P0, TRNS,PDOT,PENT,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
/*
* Keymap: QWERTY Gaming Layer (Layer 3)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | Fn4 | | Fn4 | Y | U | I | O | P | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | CapsLk | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| Fn1 | | Fn2 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LCtr | LAlt | | Ralt | RCtr |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*
*/
KEYMAP( // layer 3 : QWERTY Gaming
// left hand
EQL, 1, 2, 3, 4, 5, ESC,
TAB, Q, W, E, R, T, FN4,
CAPS,A, S, D, F, G,
LSFT,Z, X, C, V, B, FN1,
LGUI,GRV, INS,LEFT,RGHT,
LCTL,LALT,
HOME,
BSPC,DEL, END,
// right hand
ESC, 6, 7, 8, 9, 0, MINS,
FN4, Y, U, I, O, P, BSLS,
H, J, K, L, SCLN,QUOT,
FN2, N, M, COMM,DOT, SLSH,RSFT,
UP,DOWN,LBRC,RBRC,RGUI,
RALT,RCTL,
PGUP,
PGDN,ENT, SPC
),
};
/* id for user defined functions & macros */
enum function_id {
TEENSY_KEY,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
ACTION_LAYER_MOMENTARY(1), // FN1 - switch to Layer1
ACTION_LAYER_MOMENTARY(2), // FN2 - switch to Layer2
ACTION_LAYER_MOMENTARY(3), // FN3 - switch to Layer3
ACTION_LAYER_SET_CLEAR(0), // FN4 - set Layer0
ACTION_LAYER_SET(1, ON_PRESS), // FN5 - set Layer1
ACTION_LAYER_SET(2, ON_PRESS), // FN6 - set Layer2
ACTION_LAYER_SET(3, ON_PRESS), // FN7 - set Layer3
};
/*
* Defining the Teensy Key action_function
*/
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// print("action_function called\n");
// print("id = "); phex(id); print("\n");
// print("opt = "); phex(opt); print("\n");
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(50);
bootloader_jump(); // should not return
print("not supported.\n");
}
}

View file

@ -0,0 +1,199 @@
/*
Copyright 2016 Paul Williamson <squarefrog@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <util/delay.h>
#include "bootloader.h"
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap 0: Default Colemak Layer
*
* This is a general purpose Colemak layout which should serve as a good
* basis for your own custom layout. Mac users may want to swap the
* position of the Alt and GUI keys.
*
* ,--------------------------------------------------. ,-------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | ~# | | | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | F | P | G | [ | | ] | J | L | U | Y | ; | + |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LShift | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | \ | Z | X | C | V | B | | | | K | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | PScrn| | LAlt | Home | BkSp | | Del | End | RAlt | | RCtrl |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | L1 | | PgUp | PgDn |
* ,------|------|------| |------+------+------.
* | | | | | RAlt | | |
* |Space | LCtrl|------| |------| LAlt | Enter|
* | | | LGui | | ~L2 | | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
ESC, 1, 2, 3, 4, 5, NUHS,
TAB, Q, W, F, P, G, LBRC,
LSFT,A, R, S, T, D,
NUBS,Z, X, C, V, B, NO,
PSCREEN, NO, LALT, HOME ,BSPC,
NO, FN1,
NO,
SPC,LCTL, LGUI,
// right hand
NO,6, 7, 8, 9, 0, MINS,
RBRC,J, L, U, Y, SCLN,EQL,
H, N, E, I, O, QUOT,
NO, K, M, COMM,DOT, SLSH,RSFT,
DEL, END, RALT,NO, RCTL,
PGUP,PGDN,
RALT,
FN2,LALT, ENT
),
/*
* Keymap 1: Default qwerty Layer
*
* This is a general purpose Colemak layout which should serve as a good
* basis for your own custom layout. Mac users may want to swap the
* position of the Alt and GUI keys.
*
* ,--------------------------------------------------. ,-------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | ~# | | | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | + |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | \ | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | LAlt | Home | BkSp | | Del | End | RAlt | | RCtrl |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | L0 | | PgUp | PgDn |
* ,------|------|------| |------+------+------.
* | | | | | RAlt | | |
* |Space | LCtrl|------| |------| LAlt | Enter|
* | | | LGui | | ~L2 | | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
ESC, 1, 2, 3, 4, 5, NUHS,
TAB, Q, W, E, R, T, LBRC,
LSFT,A, S, D, F, G,
NUBS,Z, X, C, V, B, NO,
NO, NO, LALT, HOME ,BSPC,
NO, FN0,
NO,
SPC,LCTL, LGUI,
// right hand
NO, 6, 7, 8, 9, 0, MINS,
RBRC,Y, U, I, O, P, EQL,
H, J, K, L, SCLN,QUOT,
NO, N, M, COMM,DOT, SLSH,RSFT,
DEL, END, RALT,NO, RCTL,
PGUP,PGDN,
RALT,
FN2,LALT, ENT
),
/*
* Layer 2: Function keys
*
* This layer contains function keys, and media keys. *
* Most of the non-modifier keys are marked as NO, so it's immediately
* obvious if you start typing on a secondary layer.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | TRNS |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TRNS | | UP | | | | TRNS | | TRNS | | | | | | TRNS |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | TRNS | LEFT | DOWN |RIGHT | | |------| |------| | | | | | TRNS |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | TRNS | | | | | | | | | | | | | | TRNS |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | TRNS | TRNS | Play | RW | FF | | Mute | Vol- | Vol+ | TRNS | TRNS |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | HOME | END |
* ,------|------|------| |------+------+------.
* | | | TRNS | | TRNS | | |
* | TRNS | |------| |------| TRNS | TRNS |
* | | | TRNS | | TRNS | | |
* `--------------------' `--------------------'
*/
KEYMAP(
// left hand
GRV ,F1, F2, F3, F4, F5, F11,
TRNS,NO, UP, NO, NO, NO, TRNS,
TRNS,LEFT,DOWN,RIGHT,NO, NO,
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,TRNS,MPLY,MPRV,MNXT,
NO, NO,
TRNS,
TRNS,NO, TRNS,
// right hand
F12, F6, F7, F8, F9, F10, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
NO,NO,NO, NO,NO, TRNS,
NO, NO, NO, NO, NO, NO, TRNS,
MUTE,VOLD,VOLU,TRNS,TRNS,
HOME,END,
TRNS,
TRNS,TRNS,TRNS
)
};
/* id for user defined functions */
enum function_id {
TEENSY_KEY,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
// Layer shifting
[0] = ACTION_LAYER_SET(0, ON_PRESS), // Switch to Layer 0
[1] = ACTION_LAYER_SET(1, ON_PRESS), // Switch to Layer 1
[2] = ACTION_LAYER_MOMENTARY(2), // Momentarily switch to layer 2
// Teensy
[31] = ACTION_FUNCTION(TEENSY_KEY),
};
void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(250);
bootloader_jump(); // should not return
print("not supported.\n");
}
}

View file

@ -0,0 +1,428 @@
//
// Inspired by MicroDox:
// http://geekhack.org/index.php?topic=42231.msg1062851#msg1062851
// https://www.massdrop.com/ext/ergodox/?referer=CTL63V&hash=9ff8ddbb75e03e517aaa39acabc81669
//
#include <util/delay.h>
#include "bootloader.h"
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap: Default Layer in QWERTY
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LCtrl/~| Z | X | C | V | B | | | | N | M | , | . | / | ] |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | Caps | LAlt | LGui | | RGui | | | | |
* | | | | Spc | Esc | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | Esc | | Ins | | |
* | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
* `--------------------' `--------------------'
*
*
*
****************************************************************************************************
*
* Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
* See XOrg files in ./addons/ subdirectory.
*
* I have to do so, because of two things:
* 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
* 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
*
* And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
* keys), then (1) can't be solved at firmware level at all.
*
* So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
* But sometimes I have to input something when XOrg is not active - for example, in Linux console,
* or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
*
* For such cases I have Layer1 :)
* // hint: switch to Layer1 is only at Layer6
*
****************************************************************************************************
*
*
*
* Keymap: Default Layer in Workman
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | | | | J | F | U | P | $ | : |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | Caps | LAlt | LGui | | RGui | | | | |
* | | | | Spc | Esc | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | Esc | | Ins | | |
* | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
* `--------------------' `--------------------'
*
* Keymap: Default Layer in Workman / with Shift
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | | | | J | F | U | P | @ | % |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | Caps | LAlt | LGui | | RGui | | | | |
* | | | | Spc | Esc | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | Esc | | Ins | | |
* | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
* `--------------------' `--------------------'
*
* | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
* | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
*/
KEYMAP( // Layer0: default, leftled:none
// left hand
NO, NO, NO, NO, NO, NO, NO,
TAB, Q, W, E, R, T, NO,
FN11,FN28,FN29,FN30,FN21,G,
FN12,FN24,FN25,FN26,FN27,B, NO,
NO, NO, CAPS,FN13,FN14,
NO, NO,
NO,
FN5, FN6, FN7,
// right hand
NO, NO, NO, NO, NO, NO, NO,
NO, Y, U, I, O, P, LBRC,
H, J, K, L, FN22,FN15,
NO, N, M, COMM,DOT, SLSH,FN16,
RGUI,FN17,NO, NO, NO,
NO, NO,
NO,
FN8, FN9, FN10
),
KEYMAP( // Layer1: Workman layout, leftled:all
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,Q, D, R, W, B, TRNS,
TRNS,A, S, H, T, G,
TRNS,Z, X, M, C, V, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,J, F, U, P, 4, TRNS,
Y, N, E, O, I, TRNS,
TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer2: numpad, leftled:blue
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, TRNS,NO,
TRNS,NO, NO, NO, TRNS,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NLCK,P7, P8, P9, PMNS,PGUP,
PAST,P4, P5, P6, PPLS,PGDN,
TRNS,FN17,P1, P2, P3, PSLS,PENT,
P0, PDOT,SLSH,NO, NO,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:green
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, TRNS,NO, NO, NO,
TRNS,NO, TRNS,NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,LALT,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,PSCR,F1, F2, F3, F4, PGUP,
SLCK,F5, F6, F7, F8, PGDN,
TRNS,PAUS,F9, F10, F11, F12, APP,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
RALT,RSFT,RCTL
),
KEYMAP( // Layer4: unconvenient keys on right hand, leftled:red
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,NO, NO, NO, NO,
TRNS,TRNS,NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
/* in Workman right hand will be:
*
* ^ { } ( ) +
* ' ! $ " ; =
* # [ < > ] \
*/
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,MINS,4, 5, 9, 0, PPLS,
BSLS,2, P, FN1, 1, EQL,
TRNS,3, 6, FN3, FN4, 7, FN2,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer5: cursor, leftled:red
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, TRNS,NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,PGUP,HOME,END, DEL, INS, PGUP,
PGDN,LEFT,UP, DOWN,RGHT,PGDN,
TRNS,NO, HOME,END, DEL, INS, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer6: F1-F10, Workman-layer switch, Teensy, layer switches, leftled:red+onboard
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
FN0, F1, F2, F3, F4, F5, TRNS,
TRNS,FN18,NO, NO, FN19,NO,
TRNS,NO, NO, NO, FN19,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,F6, F7, F8, F9, F10, FN0,
FN0, NO, NO, NO, TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
//
// rarely used
//
KEYMAP( // Layer7: F-keys only, leftled:red
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,F13, F14, F15, F16, NO, TRNS,
TRNS,F17, F18, F19, F20, NO,
TRNS,F21, F22, F23, F24, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, F1, F2, F3, F4, TRNS,
NO, F5, F6, F7, F8, TRNS,
TRNS,NO, F9, F10, F11, F12, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer8: mouse and navigation, leftled:blue and green
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, TRNS,NO, NO,
TRNS,NO, NO, TRNS,NO, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
TRNS,BTN3,HOME,END, DEL, INS, NO,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
/*
// templates to copy from
KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // LayerN: fully transparent
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
*/
};
/* id for user defined functions */
enum function_id {
TEENSY_KEY,
};
/*
* Fn action definition
*/
const action_t PROGMEM fn_actions[] = {
ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
// Layer4: unconvenient keys on right hand
ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
// Dual-role keys on thumbs
ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
// Dual-role keys on pinkies
ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
// Layers switching
ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
ACTION_LAYER_MOMENTARY(2), // UNUSED: FN20 - momentary Layer2, to use with Numpad keys
ACTION_LAYER_TAP_KEY(5, KC_F), // FN21 - momentary Layer5, to use with cursor
ACTION_LAYER_TAP_KEY(6, KC_SCLN), // FN22 - tapping ; Layer6, to use with F1-F10, Workman-layer switch, Teensy, layer switches
ACTION_LAYER_MOMENTARY(7), // UNUSED: FN23 - momentary Layer7, to use with F* keys (F1-F24)
ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
ACTION_LAYER_TAP_KEY(2, KC_V), // FN27 = momentary Layer2 on V key, to use with Numpad keys
// i'd like to remove this - will try to get used to live without this and convert them to usual keys
ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
ACTION_LAYER_TAP_KEY(2, KC_F), // UNUSED: FN31 = momentary Layer2 on F key, to use with Numpad keys
};
void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
print("action_function called\n");
print("id = "); phex(id); print("\n");
print("opt = "); phex(opt); print("\n");
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(250);
bootloader_jump(); // should not return
print("not supported.\n");
}
}

View file

@ -0,0 +1,21 @@
#define MACRO_XMONAD_RESET MACRO( \
I(15), \
D(LCTL), D(LALT), T(F2), W(255), U(LALT), U(LCTL), W(255), \
T(X), T(M), T(O), T(N), T(UP), T(ENT), W(255), \
D(LCTL), D(LALT), T(F5), W(255), U(LALT), U(LCTL), W(255), \
END) \
#define MACRO_PASSWORD1 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \
#define MACRO_PASSWORD2 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \
#define MACRO_PASSWORD2 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \

56
keyboard/ergodox/led.c Normal file
View file

@ -0,0 +1,56 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <avr/io.h>
#include "print.h"
#include "debug.h"
#include "led.h"
#include "ergodox.h"
void led_set(uint8_t usb_led)
{
// topmost - NumLock
#ifndef INVERT_NUMLOCK
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
ergodox_right_led_1_on();
} else {
ergodox_right_led_1_off();
}
#else
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
ergodox_right_led_1_off();
} else {
ergodox_right_led_1_on();
}
#endif
// middle - CapsLock
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
ergodox_right_led_2_on();
} else {
ergodox_right_led_2_off();
}
// bottommost - ScrollLock
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
ergodox_right_led_3_on();
} else {
ergodox_right_led_3_off();
}
}

369
keyboard/ergodox/matrix.c Normal file
View file

@ -0,0 +1,369 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* scan matrix
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "action_layer.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "ergodox.h"
#include "i2cmaster.h"
#ifdef DEBUG_MATRIX_SCAN_RATE
#include "timer.h"
#endif
#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif
static uint8_t debouncing = DEBOUNCE;
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static matrix_row_t read_cols(uint8_t row);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);
static uint8_t mcp23018_reset_loop;
#ifdef DEBUG_MATRIX_SCAN_RATE
uint32_t matrix_timer;
uint32_t matrix_scan_count;
#endif
inline
uint8_t matrix_rows(void)
{
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void)
{
return MATRIX_COLS;
}
void matrix_init(void)
{
// initialize row and col
init_ergodox();
mcp23018_status = init_mcp23018();
ergodox_blink_all_leds();
unselect_rows();
init_cols();
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
#ifdef DEBUG_MATRIX_SCAN_RATE
matrix_timer = timer_read32();
matrix_scan_count = 0;
#endif
}
uint8_t matrix_scan(void)
{
if (mcp23018_status) { // if there was an error
if (++mcp23018_reset_loop == 0) {
// since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
// this will be approx bit more frequent than once per second
print("trying to reset mcp23018\n");
mcp23018_status = init_mcp23018();
if (mcp23018_status) {
print("left side not responding\n");
} else {
print("left side attached\n");
ergodox_blink_all_leds();
}
}
}
#ifdef DEBUG_MATRIX_SCAN_RATE
matrix_scan_count++;
uint32_t timer_now = timer_read32();
if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) {
print("matrix scan frequency: ");
pdec(matrix_scan_count);
print("\n");
matrix_timer = timer_now;
matrix_scan_count = 0;
}
#endif
#ifdef KEYMAP_CUB
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_left_led_1_off();
ergodox_left_led_2_off();
ergodox_left_led_3_off();
switch (layer) {
case 1:
// all
ergodox_left_led_1_on();
ergodox_left_led_2_on();
ergodox_left_led_3_on();
break;
case 2:
// blue
ergodox_left_led_2_on();
break;
case 8:
// blue and green
ergodox_left_led_2_on();
// break missed intentionally
case 3:
// green
ergodox_left_led_3_on();
break;
case 6:
ergodox_board_led_on();
// break missed intentionally
case 4:
case 5:
case 7:
// white
ergodox_left_led_1_on();
break;
case 9:
// white+green
ergodox_left_led_1_on();
ergodox_left_led_3_on();
break;
default:
// none
break;
}
mcp23018_status = ergodox_left_leds_update();
#endif
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_row(i);
matrix_row_t cols = read_cols(i);
if (matrix_debouncing[i] != cols) {
matrix_debouncing[i] = cols;
if (debouncing) {
debug("bounce!: "); debug_hex(debouncing); debug("\n");
}
debouncing = DEBOUNCE;
}
unselect_rows();
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
return 1;
}
bool matrix_is_modified(void)
{
if (debouncing) return false;
return true;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print("\nr/c 0123456789ABCDEF\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
pbin_reverse16(matrix_get_row(row));
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += bitpop16(matrix[i]);
}
return count;
}
/* Column pin configuration
*
* Teensy
* col: 0 1 2 3 4 5
* pin: F0 F1 F4 F5 F6 F7
*
* MCP23018
* col: 0 1 2 3 4 5
* pin: B5 B4 B3 B2 B1 B0
*/
static void init_cols(void)
{
// init on mcp23018
// not needed, already done as part of init_mcp23018()
// init on teensy
// Input with pull-up(DDR:0, PORT:1)
DDRF &= ~(1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
PORTF |= (1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
}
static matrix_row_t read_cols(uint8_t row)
{
if (row < 7) {
if (mcp23018_status) { // if there was an error
return 0;
} else {
uint8_t data = 0;
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out;
mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out;
data = i2c_readNak();
data = ~data;
out:
i2c_stop();
return data;
}
} else {
_delay_us(30); // without this wait read unstable value.
// read from teensy
return
(PINF&(1<<0) ? 0 : (1<<0)) |
(PINF&(1<<1) ? 0 : (1<<1)) |
(PINF&(1<<4) ? 0 : (1<<2)) |
(PINF&(1<<5) ? 0 : (1<<3)) |
(PINF&(1<<6) ? 0 : (1<<4)) |
(PINF&(1<<7) ? 0 : (1<<5)) ;
}
}
/* Row pin configuration
*
* Teensy
* row: 7 8 9 10 11 12 13
* pin: B0 B1 B2 B3 D2 D3 C6
*
* MCP23018
* row: 0 1 2 3 4 5 6
* pin: A0 A1 A2 A3 A4 A5 A6
*/
static void unselect_rows(void)
{
// unselect on mcp23018
if (mcp23018_status) { // if there was an error
// do nothing
} else {
// set all rows hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write( 0xFF
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
); if (mcp23018_status) goto out;
out:
i2c_stop();
}
// unselect on teensy
// Hi-Z(DDR:0, PORT:0) to unselect
DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
PORTB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
DDRD &= ~(1<<2 | 1<<3);
PORTD &= ~(1<<2 | 1<<3);
DDRC &= ~(1<<6);
PORTC &= ~(1<<6);
}
static void select_row(uint8_t row)
{
if (row < 7) {
// select on mcp23018
if (mcp23018_status) { // if there was an error
// do nothing
} else {
// set active row low : 0
// set other rows hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write( 0xFF & ~(1<<row)
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
); if (mcp23018_status) goto out;
out:
i2c_stop();
}
} else {
// select on teensy
// Output low(DDR:1, PORT:0) to select
switch (row) {
case 7:
DDRB |= (1<<0);
PORTB &= ~(1<<0);
break;
case 8:
DDRB |= (1<<1);
PORTB &= ~(1<<1);
break;
case 9:
DDRB |= (1<<2);
PORTB &= ~(1<<2);
break;
case 10:
DDRB |= (1<<3);
PORTB &= ~(1<<3);
break;
case 11:
DDRD |= (1<<2);
PORTD &= ~(1<<3);
break;
case 12:
DDRD |= (1<<3);
PORTD &= ~(1<<3);
break;
case 13:
DDRC |= (1<<6);
PORTC &= ~(1<<6);
break;
}
}
}

View file

@ -0,0 +1,202 @@
/*************************************************************************
* Title: I2C master library using hardware TWI interface
* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
* File: $Id: twimaster.c,v 1.4 2015/01/17 12:16:05 peter Exp $
* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
* Target: any AVR device with hardware TWI
* Usage: API compatible with I2C Software Library i2cmaster.h
**************************************************************************/
#include <inttypes.h>
#include <compat/twi.h>
#include <i2cmaster.h>
/* define CPU frequency in hz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 4000000UL
#endif
/* I2C clock in Hz */
#define SCL_CLOCK 100000L
/*************************************************************************
Initialization of the I2C bus interface. Need to be called only once
*************************************************************************/
void i2c_init(void)
{
/* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
TWSR = 0; /* no prescaler */
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */
}/* i2c_init */
/*************************************************************************
Issues a start condition and sends address and transfer direction.
return 0 = device accessible, 1= failed to access device
*************************************************************************/
unsigned char i2c_start(unsigned char address)
{
uint8_t twst;
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed and ACK/NACK has been received
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
return 0;
}/* i2c_start */
/*************************************************************************
Issues a start condition and sends address and transfer direction.
If device is busy, use ack polling to wait until device is ready
Input: address and transfer direction of I2C device
*************************************************************************/
void i2c_start_wait(unsigned char address)
{
uint8_t twst;
while ( 1 )
{
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
{
/* device busy, send stop condition to terminate write operation */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));
continue;
}
//if( twst != TW_MT_SLA_ACK) return 1;
break;
}
}/* i2c_start_wait */
/*************************************************************************
Issues a repeated start condition and sends address and transfer direction
Input: address and transfer direction of I2C device
Return: 0 device accessible
1 failed to access device
*************************************************************************/
unsigned char i2c_rep_start(unsigned char address)
{
return i2c_start( address );
}/* i2c_rep_start */
/*************************************************************************
Terminates the data transfer and releases the I2C bus
*************************************************************************/
void i2c_stop(void)
{
/* send stop condition */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));
}/* i2c_stop */
/*************************************************************************
Send one byte to I2C device
Input: byte to be transfered
Return: 0 write successful
1 write failed
*************************************************************************/
unsigned char i2c_write( unsigned char data )
{
uint8_t twst;
// send data to the previously addressed device
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits
twst = TW_STATUS & 0xF8;
if( twst != TW_MT_DATA_ACK) return 1;
return 0;
}/* i2c_write */
/*************************************************************************
Read one byte from the I2C device, request more data from device
Return: byte read from I2C device
*************************************************************************/
unsigned char i2c_readAck(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}/* i2c_readAck */
/*************************************************************************
Read one byte from the I2C device, read is followed by a stop condition
Return: byte read from I2C device
*************************************************************************/
unsigned char i2c_readNak(void)
{
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}/* i2c_readNak */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -62,7 +62,7 @@ const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
[1] = UNIMAP_HHKB(
PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, TRNS,
TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT,
TRNS,VOLD,VOLU,MUTE,EJCT,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT,
TRNS, BRTD,BRTI,SLEP,WAKE,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS,
TRNS,TRNS, TRNS, TRNS,TRNS),

View file

@ -35,7 +35,7 @@ const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
[1] = UNIMAP_HHKB(
PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, TRNS,
TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT,
TRNS,VOLD,VOLU,MUTE,EJCT,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT,
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS,
TRNS,TRNS, TRNS, TRNS,TRNS),
};

View file

@ -271,7 +271,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define AC_MEDIA_REWIND ACTION_USAGE_CONSUMER(TRANSPORT_REWIND)
#define AC_MEDIA_STOP ACTION_USAGE_CONSUMER(TRANSPORT_STOP)
#define AC_MEDIA_PLAY_PAUSE ACTION_USAGE_CONSUMER(TRANSPORT_PLAY_PAUSE)
#define AC_MEDIA_EJECT ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT)
#define AC_MEDIA_EJECT ACTION_USAGE_CONSUMER(TRANSPORT_EJECT)
#define AC_MEDIA_SELECT ACTION_USAGE_CONSUMER(APPLAUNCH_CC_CONFIG)
#define AC_MAIL ACTION_USAGE_CONSUMER(APPLAUNCH_EMAIL)
#define AC_CALCULATOR ACTION_USAGE_CONSUMER(APPLAUNCH_CALCULATOR)
@ -285,6 +285,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define AC_WWW_FAVORITES ACTION_USAGE_CONSUMER(APPCONTROL_BOOKMARKS)
#define AC_BRIGHTNESS_INC ACTION_USAGE_CONSUMER(BRIGHTNESS_INCREMENT)
#define AC_BRIGHTNESS_DEC ACTION_USAGE_CONSUMER(BRIGHTNESS_DECREMENT)
#define AC_MEDIA_STOP_EJECT ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT)
/* Mousekey */
#define AC_MS_UP ACTION_KEY(KC_MS_UP)
@ -418,7 +419,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define AC_MRWD ACTION_USAGE_CONSUMER(TRANSPORT_REWIND)
#define AC_MSTP ACTION_USAGE_CONSUMER(TRANSPORT_STOP)
#define AC_MPLY ACTION_USAGE_CONSUMER(TRANSPORT_PLAY_PAUSE)
#define AC_EJCT ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT)
#define AC_EJCT ACTION_USAGE_CONSUMER(TRANSPORT_EJECT)
#define AC_MSEL ACTION_USAGE_CONSUMER(APPLAUNCH_CC_CONFIG)
#define AC_MAIL ACTION_USAGE_CONSUMER(APPLAUNCH_EMAIL)
#define AC_CALC ACTION_USAGE_CONSUMER(APPLAUNCH_CALCULATOR)
@ -432,6 +433,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define AC_WFAV ACTION_USAGE_CONSUMER(APPCONTROL_BOOKMARKS)
#define AC_BRTI ACTION_USAGE_CONSUMER(BRIGHTNESS_INCREMENT)
#define AC_BRTD ACTION_USAGE_CONSUMER(BRIGHTNESS_DECREMENT)
#define AC_STEJ ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT)
/* Transparent */
#define AC_TRNS ACTION_KEY(KC_TRANSPARENT)

View file

@ -47,14 +47,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* Consumer Page(0x0C)
* https://github.com/tmk/tmk_keyboard/issues/370
*/
#define AUDIO_MUTE 0x00E2
#define AUDIO_VOL_UP 0x00E9
#define AUDIO_VOL_DOWN 0x00EA
/* Display Brightness Controls https://www.usb.org/sites/default/files/hutrr41_0.pdf */
#define BRIGHTNESS_INCREMENT 0x006F
#define BRIGHTNESS_DECREMENT 0x0070
#define TRANSPORT_FAST_FORWARD 0x00B3
#define TRANSPORT_REWIND 0x00B4
#define TRANSPORT_NEXT_TRACK 0x00B5
#define TRANSPORT_PREV_TRACK 0x00B6
#define TRANSPORT_STOP 0x00B7
#define TRANSPORT_EJECT 0x00B8
#define TRANSPORT_STOP_EJECT 0x00CC
#define TRANSPORT_PLAY_PAUSE 0x00CD
#define AUDIO_MUTE 0x00E2
#define AUDIO_VOL_UP 0x00E9
#define AUDIO_VOL_DOWN 0x00EA
/* application launch */
#define APPLAUNCH_CC_CONFIG 0x0183
#define APPLAUNCH_EMAIL 0x018A
@ -71,13 +77,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* supplement for Bluegiga iWRAP HID(not supported by Windows?) */
#define APPLAUNCH_LOCK 0x019E
#define TRANSPORT_RECORD 0x00B2
#define TRANSPORT_FAST_FORWARD 0x00B3
#define TRANSPORT_REWIND 0x00B4
#define TRANSPORT_EJECT 0x00B8
#define APPCONTROL_MINIMIZE 0x0206
/* Display Brightness Controls https://www.usb.org/sites/default/files/hutrr41_0.pdf */
#define BRIGHTNESS_INCREMENT 0x006F
#define BRIGHTNESS_DECREMENT 0x0070
/*
* Generic Desktop Page(0x01) - system power control
@ -189,7 +189,7 @@ typedef struct {
(key == KC_MEDIA_FAST_FORWARD ? TRANSPORT_FAST_FORWARD : \
(key == KC_MEDIA_REWIND ? TRANSPORT_REWIND : \
(key == KC_MEDIA_STOP ? TRANSPORT_STOP : \
(key == KC_MEDIA_EJECT ? TRANSPORT_STOP_EJECT : \
(key == KC_MEDIA_EJECT ? TRANSPORT_EJECT : \
(key == KC_MEDIA_PLAY_PAUSE ? TRANSPORT_PLAY_PAUSE : \
(key == KC_MEDIA_SELECT ? APPLAUNCH_CC_CONFIG : \
(key == KC_MAIL ? APPLAUNCH_EMAIL : \

@ -1 +1 @@
Subproject commit df8e64d0500c012c47b637522d0c1b33c3683e91
Subproject commit b6128f252700a8dd2d12400c55680ef67cdcac86

View file

@ -12,11 +12,14 @@ void KBDReportParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *b
}
xprintf("\r\n");
/* Keyboard can send report in size other than 8 bytes
* https://github.com/tmk/tmk_keyboard/issues/773
// boot keyboard report length should be 8
if (len != 8) {
xprintf(" ignored\r\n");
return;
}
*/
// Rollover error
// Cherry: 0101010101010101