Skip to content

Instantly share code, notes, and snippets.

@i5ar
Last active March 28, 2021 17:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save i5ar/4a69d078e3d14879cfc4ed754b66d92a to your computer and use it in GitHub Desktop.
Save i5ar/4a69d078e3d14879cfc4ed754b66d92a to your computer and use it in GitHub Desktop.
Parrot 60

Parrot Mechanical Keyboard

Preamble

Parrot 60 is a mechanical keyboard based on the Parrot physical layout and the Parrot function layer.
Parrot 60 ANSI is a mechanical keyboard based on the ANSI physical layout and the Parrot function layer.

Every reputable pirate has a Parrot...

Layers

Parrot function layer makes it lovely to use 60% keyboards.

Principal design

The principal design of the function layer is based on Vi style commands easy to remember.

Virtual key Physical key Note
Arrows h, j, k, l The arrow keys are the same for Vi arrow keys (ADM-3A terminals)
Escape `
Insert i
Delete x The Delete key is the same for Vi delete key
Home b The Home key mostly means begin
End e
Page Up u
Page Down d
Print Screen Enter
Scroll Lock Caps Lock The Scroll Lock key can use the same LED
Pause Space
Calculator c
Mail m
Profile p
Reset r
Fn f
Play/Pause ' The " character looks like the Pause character ()
Stop ;
Previous Track « The « character looks like the Previous Track character ()
Next Track » The » character looks like the Next Track character ()
Volume Down [ The [ character looks like the begin of a bar
Volume Up ] The ] character looks like the end of a bar
Mute \ The \ character looks like the Mute character (🔇)
Select Media /

Profiles

The combination Fn+p toggles the profile;
The combination Fn+r (5 sec.) resets the custom profile.

Parrot mimics.

Add a custom key:

  • Press Fn+p to toggle into the custom profile;
  • Press Fn+App for 5 seconds to enter the programming mode (turn on the LED);
  • Enter the key (start blinking the LED);
  • Assign the keys;
  • Press Fn+Enter to save the key (stop blinking the LED);
  • Press Fn+App to exit the programming mode (turn off the LED).

Restore a custom key:

  • Press Fn+App to enter the programming mode (turn on the LED);
  • Enter the key (start blinking the LED);
  • Press Fn+Backspace to restore the key (stop blinking the LED);
  • Press Fn+App to exit the programming mode (turn off the LED).

Features

Indicator lights

The Space bar uses a white light for programming mode. Lock light indicators use RGB light:

  • The Caps Lock key toggles a blue light (Caps Lock);
  • The Scroll Lock key toggles a red light (Fn+Caps Lock);
  • The Num Lock key toggles a green light (Fn+Alt Gr+Caps Lock);
  • The Caps Lock and Scroll Lock keys toggle a magenta light;
  • The Caps Lock and Num Lock keys toggle a cyan light;
  • The Scroll Lock and Num Lock keys toggle a yellow light.

Extra arrows

Parrot function layer aims to increase comfort while using Vi arrow keys.
The extra arrows are easy to remember and ergonomic to use.

Virtual key Physical key Note
Left arrow , The < character looks like the left arrow
Right arrow . The > character looks like the right arrow

Advantaged keystrokes

Swap keys

The combination Shift+Space swaps the keys for one-shot.

Space Cadet keys

Parentheses are also accessible from the Shift keys with single tapping.

DIP switch

Switch Off On
1 Windows and GNU/Linux physical layout Mac physical layout
2 Extra non-US Backslash and Pipe key Extra non-US Hash and Tilde key
3 Backtick key Escape key
  1. Invert position of Win (Windows), Super (GNU/Linux), Cmd (Mac) keys with Alt key;
  2. Change non-US keys;
  3. Switch Escape key and Backtick.

Colors

Parrot is colorful.

The function layer control and media keys are easily discernable.

FAQ

  1. Why Parrot physical layout comes with 62 keys instead of 61
  2. Why Parrot function layer have extra arrow keys

Why Parrot physical layout comes with 62 keys instead of 61

Parrot physical layout is designed to work well with both ANSI and ISO layouts and many have 62 keys.

Why Parrot function layer have extra arrow keys

Parrot function layer have extra arrow keys to leverage ergonomics. The left/right arrows are easier to press using a lower row.

Layout

Open keyboard-layout-editor and upload keyboard-layout-ansi.json from the Raw data tab.

Unicode symbols

Arrows Layout Macro Media
🔈
🔇
🔉
🔊
🎶

Disclaimer

The overall designed is inspired by memorable pieces of hardware, including the Space Cadet keyboard and the ADM-3A display terminal. The original mechanical prototype was based on the GH60.

{"unique_id": "GH60SATAN_003", "layout_mod": "POKER", "keymap": [[[["HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE", 0, "HID_KEYBOARD_SC_ESCAPE", 0], ["HID_KEYBOARD_SC_1_AND_EXCLAMATION", 0, "0", 0], ["HID_KEYBOARD_SC_2_AND_AT", 0, "0", 0], ["HID_KEYBOARD_SC_3_AND_HASHMARK", 0, "0", 0], ["HID_KEYBOARD_SC_4_AND_DOLLAR", 0, "0", 0], ["HID_KEYBOARD_SC_5_AND_PERCENTAGE", 0, "0", 0], ["HID_KEYBOARD_SC_6_AND_CARET", 0, "0", 0], ["HID_KEYBOARD_SC_7_AND_AND_AMPERSAND", 0, "0", 0], ["HID_KEYBOARD_SC_8_AND_ASTERISK", 0, "0", 0], ["HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS", 0, "0", 0], ["HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS", 0, "0", 0], ["HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE", 0, "0", 0], ["HID_KEYBOARD_SC_EQUAL_AND_PLUS", 0, "0", 0], ["HID_KEYBOARD_SC_BACKSPACE", 0, "0", 0]], [["HID_KEYBOARD_SC_TAB", 0, "0", 0], ["HID_KEYBOARD_SC_Q", 0, "0", 0], ["HID_KEYBOARD_SC_W", 0, "0", 0], ["HID_KEYBOARD_SC_E", 0, "0", 0], ["HID_KEYBOARD_SC_R", 0, "0", 0], ["HID_KEYBOARD_SC_T", 0, "0", 0], ["HID_KEYBOARD_SC_Y", 0, "0", 0], ["HID_KEYBOARD_SC_U", 0, "0", 0], ["HID_KEYBOARD_SC_I", 0, "0", 0], ["HID_KEYBOARD_SC_O", 0, "0", 0], ["HID_KEYBOARD_SC_P", 0, "0", 0], ["HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE", 0, "0", 0], ["HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE", 0, "0", 0], ["HID_KEYBOARD_SC_BACKSLASH_AND_PIPE", 0, "0", 0]], [["HID_KEYBOARD_SC_CAPS_LOCK", 0, "HID_KEYBOARD_SC_CAPS_LOCK", 0], ["HID_KEYBOARD_SC_A", 0, "0", 0], ["HID_KEYBOARD_SC_S", 0, "0", 0], ["HID_KEYBOARD_SC_D", 0, "0", 0], ["HID_KEYBOARD_SC_F", 0, "0", 0], ["HID_KEYBOARD_SC_G", 0, "0", 0], ["HID_KEYBOARD_SC_H", 0, "0", 0], ["HID_KEYBOARD_SC_J", 0, "0", 0], ["HID_KEYBOARD_SC_K", 0, "0", 0], ["HID_KEYBOARD_SC_L", 0, "0", 0], ["HID_KEYBOARD_SC_SEMICOLON_AND_COLON", 0, "0", 0], ["HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_ENTER", 0, "0", 0]], [["HID_KEYBOARD_SC_LEFT_SHIFT", 4, "HID_KEYBOARD_SC_ESCAPE", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_Z", 0, "0", 0], ["HID_KEYBOARD_SC_X", 0, "0", 0], ["HID_KEYBOARD_SC_C", 0, "0", 0], ["HID_KEYBOARD_SC_V", 0, "0", 0], ["HID_KEYBOARD_SC_B", 0, "0", 0], ["HID_KEYBOARD_SC_N", 0, "0", 0], ["HID_KEYBOARD_SC_M", 0, "0", 0], ["HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN", 0, "0", 0], ["HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN", 0, "0", 0], ["HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_SHIFT", 4, "HID_KEYBOARD_SC_ESCAPE", 0]], [["HID_KEYBOARD_SC_LEFT_CONTROL", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_GUI", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_ALT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_SPACE", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_ALT", 0, "0", 0], ["SCANCODE_FN1", 2, "0", 0], ["HID_KEYBOARD_SC_APPLICATION", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_CONTROL", 0, "0", 0]]], [[["HID_KEYBOARD_SC_ESCAPE", 0, "0", 0], ["HID_KEYBOARD_SC_F1", 0, "0", 0], ["HID_KEYBOARD_SC_F2", 0, "0", 0], ["HID_KEYBOARD_SC_F3", 0, "0", 0], ["HID_KEYBOARD_SC_F4", 0, "0", 0], ["HID_KEYBOARD_SC_F5", 0, "0", 0], ["HID_KEYBOARD_SC_F6", 0, "0", 0], ["HID_KEYBOARD_SC_F7", 0, "0", 0], ["HID_KEYBOARD_SC_F8", 0, "0", 0], ["HID_KEYBOARD_SC_F9", 0, "0", 0], ["HID_KEYBOARD_SC_F10", 0, "0", 0], ["HID_KEYBOARD_SC_F11", 0, "0", 0], ["HID_KEYBOARD_SC_F12", 0, "0", 0], ["HID_KEYBOARD_SC_BACKSPACE", 0, "0", 0]], [["HID_KEYBOARD_SC_PRINT_SCREEN", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_END", 0, "0", 0], ["SCANCODE_BOOT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_PAGE_UP", 0, "0", 0], ["HID_KEYBOARD_SC_INSERT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["SCANCODE_VOL_DEC", 0, "0", 0], ["SCANCODE_VOL_INC", 0, "0", 0], ["SCANCODE_MUTE", 0, "0", 0]], [["HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_PAGE_DOWN", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_DOWN_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_UP_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_ARROW", 0, "0", 0], ["SCANCODE_STOP", 0, "0", 0], ["SCANCODE_PLAY_PAUSE", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_ENTER", 0, "0", 0]], [["HID_KEYBOARD_SC_LEFT_SHIFT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_DELETE", 0, "0", 0], ["SCANCODE_CALC", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_HOME", 0, "0", 0], ["0", 0, "0", 0], ["SCANCODE_MAIL", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_ARROW", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_SHIFT", 0, "0", 0]], [["HID_KEYBOARD_SC_LEFT_CONTROL", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_GUI", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_ALT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_PAUSE", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["SCANCODE_FN2", 2, "0", 0], ["SCANCODE_FN1", 0, "0", 0], ["HID_KEYBOARD_SC_APPLICATION", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_CONTROL", 0, "0", 0]]], [[["HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_1_AND_END", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_5", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_7_AND_HOME", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_MINUS", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_PLUS", 0, "0", 0], ["HID_KEYBOARD_SC_ESCAPE", 0, "0", 0]], [["HID_KEYBOARD_SC_TAB", 0, "0", 0], ["HID_KEYBOARD_SC_Q", 0, "0", 0], ["HID_KEYBOARD_SC_W", 0, "0", 0], ["SCANCODE_M2", 0, "0", 0], ["HID_KEYBOARD_SC_R", 0, "0", 0], ["HID_KEYBOARD_SC_T", 0, "0", 0], ["HID_KEYBOARD_SC_Y", 0, "0", 0], ["SCANCODE_M5", 0, "0", 0], ["SCANCODE_M3", 0, "0", 0], ["SCANCODE_M4", 0, "0", 0], ["HID_KEYBOARD_SC_P", 0, "0", 0], ["SCANCODE_PREV_TRACK", 0, "0", 0], ["SCANCODE_NEXT_TRACK", 0, "0", 0], ["HID_KEYBOARD_SC_BACKSLASH_AND_PIPE", 0, "0", 0]], [["HID_KEYBOARD_SC_NUM_LOCK", 0, "0", 0], ["SCANCODE_M1", 0, "0", 0], ["HID_KEYBOARD_SC_S", 0, "0", 0], ["HID_KEYBOARD_SC_D", 0, "0", 0], ["HID_KEYBOARD_SC_F", 0, "0", 0], ["HID_KEYBOARD_SC_G", 0, "0", 0], ["HID_KEYBOARD_SC_H", 0, "0", 0], ["HID_KEYBOARD_SC_J", 0, "0", 0], ["HID_KEYBOARD_SC_K", 0, "0", 0], ["HID_KEYBOARD_SC_L", 0, "0", 0], ["HID_KEYBOARD_SC_SEMICOLON_AND_COLON", 0, "0", 0], ["HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_ENTER", 0, "0", 0]], [["HID_KEYBOARD_SC_LEFT_SHIFT", 0, "HID_KEYBOARD_SC_ESCAPE", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_Z", 0, "0", 0], ["HID_KEYBOARD_SC_X", 0, "0", 0], ["HID_KEYBOARD_SC_C", 0, "0", 0], ["HID_KEYBOARD_SC_V", 0, "0", 0], ["HID_KEYBOARD_SC_B", 0, "0", 0], ["HID_KEYBOARD_SC_N", 0, "0", 0], ["HID_KEYBOARD_SC_M", 0, "0", 0], ["HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN", 0, "0", 0], ["HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE", 0, "0", 0], ["HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_SHIFT", 0, "HID_KEYBOARD_SC_ESCAPE", 0]], [["HID_KEYBOARD_SC_LEFT_CONTROL", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_GUI", 0, "0", 0], ["HID_KEYBOARD_SC_LEFT_ALT", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_SPACE", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["SCANCODE_FN2", 0, "0", 0], ["0", 0, "0", 0], ["HID_KEYBOARD_SC_APPLICATION", 0, "0", 0], ["HID_KEYBOARD_SC_RIGHT_CONTROL", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]], [[["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]], [["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0], ["0", 0, "0", 0]]]], "macros": ["$ALT(133)", "$ALT(138)", "$ALT(141)", "$ALT(149)", "$ALT(151)", "", "", "", "", "", "", "", "", "", "", ""], "led_modes": [1], "led_funcs": [[255, 0], [0, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0], [255, 0]], "led_layers": [0, 0, 0, 0, 0]}
[{"backcolor":"#e1dbd1","name":"Parrot ANSI 60","author":"iSar","radii":"12px","switchMount":"cherry","switchBrand":"gateron","switchType":"KS-3-Black","plate":true,"pcb":false},[{"c":"#8d242f","t":"#c87e74","p":"OEM","a":0,"f":4},"~\n`\n\n\nEsc","!\n1\n\n\nF1\n1","@\n2\n\n\nF2\n2","#\n3\n\n\nF3\n3","$\n4\n\n\nF4\n4","%\n5\n\n€\nF5\n5","^\n6\n\n\nF6\n6",{"c":"#00627a","t":"#00a4a9"},"&\n7\n\n\nF7\n7","*\n8\n\n\nF8\n8","(\n9\n\n\nF9\n9",")\n0\n\n\nF10\n0","_\n-\n\n\nF11\n-","+\n=\n\n\nF12\n+",{"w":2},"\nBackspace\n\n\nDel\nEsc"],[{"c":"#8d242f","t":"#c87e74","w":1.5},"\nTab\n\n\nMeh",{"a":4},"Q","W",{"a":0},"E\n\n\n\nEnd","R\n\n\n\nReset",{"a":4},"T",{"c":"#00627a","t":"#00a4a9"},"Y",{"a":0},"U\n\n\n\nPage Up","I\n\n\n\nIns",{"a":4},"O","P",{"c":"#00a4a9","t":"#00627a","a":0},"{\n[\n\n«\n🔈-\n⏮","}\n]\n\n»\n🔈+\n⏭",{"w":1.5},"|\n\\\n¦\n¬\n🔇"],[{"c":"#8d242f","t":"#c87e74","w":1.75},"\nCaps Lock\n\n\nScroll Lock",{"a":4},"A","S",{"a":0},"D\n\n\n\nPage Down",{"a":4},"F","G",{"c":"#00627a","t":"#00a4a9","a":0},"H\n\n\n\n←","J\n\n\n\n↓","K\n\n\n\n↑","L\n\n\n\n→",{"c":"#00a4a9","t":"#00627a"},":\n;\n\n\n⏹","\"\n'\n\n´\n⏯",{"c":"#00627a","t":"#00a4a9","w":2.25},"\nEnter\n\n\nPrint Screen"],[{"c":"#8d242f","t":"#c87e74","a":4,"w":2.25},"\nShift","Z",{"a":0},"X\n\n\n\nDel","C\n\n\n\nCal",{"a":4},"V",{"a":0},"B\n\n\n\nHome",{"c":"#00627a","t":"#00a4a9","a":4},"N",{"a":0},"M\n\n\n\nMail","<\n,\n\n\n←",">\n.\n\n\n→",{"c":"#00a4a9","t":"#00627a"},"?\n/\n\n\n🎶",{"c":"#00627a","t":"#00a4a9","a":4,"w":2.75},"\nShift"],[{"c":"#8d242f","t":"#c87e74","w":1.25},"\nCtrl",{"w":1.25},"\nSuper",{"w":1.25},"\nAlt",{"c":"#e1dbd1","t":"#8d242f","a":3,"w":6.25},"\n\n\n\nPause",{"c":"#00627a","t":"#00a4a9","a":4,"w":1.25},"\nAlt Gr",{"w":1.25},"\nFn",{"w":1.25},"\nApp",{"w":1.25},"\nCtrl"]]
[{"backcolor":"#e1dbd1","name":"Parrot 60","radii":"12px","switchMount":"cherry","switchBrand":"gateron","switchType":"KS-3-Black","plate":true},[{"c":"#8d242f","t":"#e5a100","p":"OEM","sm":"cherry","a":0,"f":4},"~\n`\n\n\nEsc",{"c":"#e1dbd1","t":"#393b3b"},"!\n1\n\n\nF1","@\n2\n\n\nF2","#\n3\n\n\nF3","$\n4\n\n\nF4","%\n5\n\n€\nF5","^\n6\n\n\nF6","&\n7\n\n\nF7","*\n8\n\n\nF8","(\n9\n\n\nF9",")\n0\n\n\nF10","_\n-\n\n\nF11","+\n=\n\n\nF12","|\n\\\n\n\n🔇",{"c":"#e5a100"},">\n<\n\n\nEsc"],[{"c":"#67635b","t":"#e5a100","w":1.5},"Tab\n↹\n\n\nMeh",{"c":"#e1dbd1","t":"#393b3b","a":4},"Q","W",{"a":0},"E\n\n\n\nEnd",{"a":4},"R","T","Y",{"a":0},"U\n\n\n\nPage Up","I\n\n\n\nIns",{"a":4},"O","P",{"a":0},"{\n[\n\n«\n🔈-\n⏮","}\n]\n\n»\n🔈+\n⏭",{"c":"#67635b","t":"#e5a100","w":1.5},"\n⌫\n\n\nDel"],[{"w":1.75},"Caps Lock\n⇪\n\n\nScroll Lock",{"c":"#e1dbd1","t":"#393b3b","a":4},"A","S",{"a":0},"D\n\n\n\nPage Down",{"a":4},"F","G",{"a":0},"H\n\n\n\n←","J\n\n\n\n↓","K\n\n\n\n↑","L\n\n\n\n→",":\n;\n\n\n⏹","\"\n'\n\n´\n⏯",{"c":"#8d242f","t":"#e5a100","w":2.25},"Enter\n⏎\n\n\nPrint Screen"],[{"c":"#67635b","a":4,"w":2.25},"Shift\n⇧",{"c":"#e1dbd1","t":"#393b3b"},"Z",{"a":0},"X\n\n\n\nDel",{"a":4},"C","V",{"a":0},"B\n\n\n\nHome",{"a":4},"N","M",{"a":0},"<\n,\n\n\n←",">\n.\n\n\n→\n.","?\n/\n\n\n🎶",{"c":"#67635b","t":"#e5a100","a":4,"w":2.75},"Shift\n⇧"],[{"c":"#393b3b","w":1.25},"Ctrl",{"w":1.25},"Super",{"w":1.25},"Alt",{"c":"#e5a100","t":"#393b3b","a":3,"w":6.25},"\n\n\n\nPause",{"c":"#393b3b","t":"#e5a100","a":4,"w":1.25},"Alt Gr",{"w":1.25},"Fn",{"w":1.25},"App",{"w":1.25},"Ctrl"]]
#include "satan.h"
#define _BL 0
#define _FL 1
#define _AL 2
#define _______ KC_TRNS
// Get the Escape key from the Shift keys with a single tap
#define LESC LSFT_T(KC_ESC)
#define RESC RSFT_T(KC_ESC)
enum planck_keycodes {
FN = SAFE_RANGE,
RALT,
LCTL,
LSHIFT,
SPACE
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: Base Layer */
[_BL] = LAYOUT_all(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_NUBS, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, _______, KC_ENT, \
LSHIFT, _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, _______, \
LCTL, KC_LGUI, KC_LALT, SPACE, RALT, FN, KC_APP, KC_RCTL),
/* Keymap _FL: Function Layer */
[_FL] = LAYOUT_all(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_ESC, \
KC_HYPR, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_INS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_DEL, \
KC_SLCK, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_MSTP, KC_MPLY, _______, KC_PSCR, \
KC_LSFT, _______, KC_TRNS, KC_DEL, KC_CALC, KC_TRNS, KC_HOME, KC_TRNS, KC_MAIL, KC_LEFT, KC_RGHT, KC_MSEL, KC_RSFT, _______, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
/* Keymap _AL: Alternate Function Layer */
[_AL] = LAYOUT_all(
KC_GRV, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSLS, KC_NUBS, \
KC_TAB, KC_BTN1, KC_WH_U, KC_BTN2, RESET, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MPRV, KC_MNXT, KC_BSPC, \
KC_NLCK, KC_WH_L, KC_WH_D, KC_WH_R, KC_F, KC_G, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_SCLN, KC_QUOT, _______, KC_ENT, \
KC_LSFT, _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_PDOT, KC_SLSH, KC_RSFT, _______, \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_TRNS, KC_TRNS, KC_APP , KC_RCTL),
};
// Add `SWAP_HANDS_ENABLE = yes` to rules.mk
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
{{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
{{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
{{11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},
{{13, 3}, {12, 3}, {11, 3}, {10, 3}, {9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}},
};
void matrix_init_user(void)
{
backlight_level(0);
}
uint32_t layer_state_set_user(uint32_t state)
{
switch (biton32(state)) {
case _BL:
backlight_set(0);
break;
case _FL:
backlight_set(4);
break;
}
return state;
}
static bool ralt_down = false;
static bool fn_down = false;
static bool lsft_down = false;
static bool lctl_down = false;
static bool spc_down = false;
static bool one_shot_layer_on = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record)
{
switch (keycode)
{
case RALT:
if (record->event.pressed)
{
if (fn_down)
{
layer_on(_AL);
}
else
{
register_code(KC_RALT);
}
ralt_down = true;
}
else
{
layer_off(_AL);
unregister_code(KC_RALT);
ralt_down = false;
}
return false;
break;
case FN:
if (record->event.pressed)
{
if (ralt_down)
{
unregister_code(KC_RALT);
layer_on(_AL);
}
else
{
layer_on(_FL);
}
fn_down = true;
}
else
{
layer_off(_AL);
layer_off(_FL);
fn_down = false;
}
return false;
break;
case LCTL:
// One-shot FL
if (record->event.pressed)
{
lctl_down = true;
register_code(KC_LCTL);
}
else
{
lctl_down = false;
unregister_code(KC_LCTL);
}
return false;
break;
case SPACE:
// One-shot SWAP
if (record->event.pressed)
{
spc_down = true;
if (lsft_down && !lctl_down)
{
swap_hands = true;
}
else if (lctl_down && !lsft_down)
{
one_shot_layer_on = true;
layer_on(_FL);
}
else
{
register_code(KC_SPACE);
}
}
else
{
spc_down = false;
unregister_code(KC_SPACE);
}
return false;
break;
case LSHIFT:
// One-shot SWAP
if (record->event.pressed)
{
lsft_down = true;
register_code(KC_LSFT);
}
else
{
lsft_down = false;
unregister_code(KC_LSFT);
}
return false;
break;
default:
if (!record->event.pressed)
{
// One-shot SWAP
if (swap_hands && !spc_down)
{
swap_hands = false;
}
// One-shot FL
if (one_shot_layer_on && !lctl_down)
{
one_shot_layer_on = false;
layer_off(_FL);
}
}
return true;
break;
}
return true;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment