-
-
Save joeynguyen/c09a5f7cfed683e5db9af6c4cc5c0167 to your computer and use it in GitHub Desktop.
/* -*- mode: c++ -*- | |
* Atreus -- Chrysalis-enabled Sketch for the Keyboardio Atreus | |
* Copyright (C) 2018, 2019 Keyboard.io, Inc | |
* | |
* 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, write to the Free Software Foundation, Inc., | |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
*/ | |
#ifndef BUILD_INFORMATION | |
#define BUILD_INFORMATION "locally built" | |
#endif | |
#include "Kaleidoscope.h" | |
#include "Kaleidoscope-EEPROM-Settings.h" | |
#include "Kaleidoscope-EEPROM-Keymap.h" | |
#include "Kaleidoscope-FocusSerial.h" | |
#include "Kaleidoscope-Macros.h" | |
#include "Kaleidoscope-MouseKeys.h" | |
// #include "Kaleidoscope-OneShot.h" | |
#include "Kaleidoscope-Qukeys.h" | |
// #include "Kaleidoscope-SpaceCadet.h" | |
// #include "Kaleidoscope-ShapeShifter.h" | |
/* -*- mode: c++ -*- | |
* Keymaps typically consist mostly of `Key_` definitions. There are many, many keys | |
* defined as part of the USB HID Keyboard specification. You can find the names | |
* (if not yet the explanations) for all the standard `Key_` defintions offered by | |
* Kaleidoscope in these files: | |
* https://github.com/keyboardio/Kaleidoscope/blob/master/src/key_defs_keyboard.h | |
* https://github.com/keyboardio/Kaleidoscope/blob/master/src/key_defs_consumerctl.h | |
* https://github.com/keyboardio/Kaleidoscope/blob/master/src/key_defs_sysctl.h | |
* https://github.com/keyboardio/Kaleidoscope/blob/master/src/key_defs_keymaps.h | |
* | |
* Additional things that should be documented here include: | |
* using ___ to let keypresses fall through to the previously active layer | |
* using XXX to mark a keyswitch as 'blocked' on this layer | |
* keeping NUM and FN consistent and accessible on all layers | |
*/ | |
#define MO(n) ShiftToLayer(n) | |
#define TG(n) LockLayer(n) | |
enum { | |
MACRO_QWERTY, | |
MACRO_VERSION_INFO | |
}; | |
#define Key_Exclamation LSHIFT(Key_1) | |
#define Key_At LSHIFT(Key_2) | |
#define Key_Hash LSHIFT(Key_3) | |
#define Key_Dollar LSHIFT(Key_4) | |
#define Key_Percent LSHIFT(Key_5) | |
#define Key_Caret LSHIFT(Key_6) | |
#define Key_And LSHIFT(Key_7) | |
#define Key_Star LSHIFT(Key_8) | |
#define Key_Plus LSHIFT(Key_Equals) | |
#define Key_PrevTrack Consumer_ScanPreviousTrack | |
#define Key_NextTrack Consumer_ScanNextTrack | |
#define Key_PlayPause Consumer_PlaySlashPause | |
#define Key_VolumeDown Consumer_VolumeDecrement | |
#define Key_VolumeUp Consumer_VolumeIncrement | |
#define Key_Mute Consumer_Mute | |
enum { | |
QWERTY, | |
FUN, | |
UPPER | |
}; | |
/* *INDENT-OFF* */ | |
KEYMAPS( | |
[QWERTY] = KEYMAP_STACKED | |
( | |
// Left | |
Key_Q, Key_W, Key_E, Key_R, Key_T, | |
Key_A, Key_S, Key_D, Key_F, Key_G, | |
Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Tab, | |
MO(FUN), Key_Backtick, Key_LeftShift, Key_Space, Key_LeftGui, Key_Esc, | |
// Right | |
Key_Y, Key_U, Key_I, Key_O, Key_P, | |
Key_H, Key_J, Key_K, Key_L, Key_Semicolon, | |
Key_Enter, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, | |
Key_Home, Key_End, Key_Backspace, Key_Minus, Key_Backslash, Key_Quote | |
), | |
[FUN] = KEYMAP_STACKED | |
( | |
// Left | |
Key_F1, Key_F2, Key_F3, Key_F4, Key_F5, | |
XXX, Key_mouseUp, XXX, Key_mouseBtnR, Key_mouseWarpEnd, | |
Key_mouseL, Key_mouseDn, Key_mouseR, Key_mouseBtnL, Key_mouseWarpNW, Key_mouseWarpNE, | |
___, ___, ___, Key_mouseBtnM, Key_mouseWarpSW, Key_mouseWarpSE, | |
// Right | |
Key_F6, Key_F7, Key_F8, Key_F9, Key_F10, | |
___, ___, ___, Key_F11, Key_F12, | |
Key_PageUp, ___, ___, ___, ___, ___, | |
Key_PageDown, ___, Key_Delete, ___, ___, ___ | |
), | |
[UPPER] = KEYMAP_STACKED | |
( | |
// Left | |
Key_1, Key_2, Key_3, Key_4, Key_5, | |
___, ___, ___, ___, ___, | |
___, Key_PrevTrack, Key_NextTrack, Key_PlayPause, ___, Key_LeftShift, | |
Key_PrintScreen, Key_Mute, Key_VolumeDown, Key_VolumeUp, Key_LeftGui, Key_LeftControl, | |
// Right | |
Key_6, Key_7, Key_8, Key_9, Key_0, | |
Key_LeftArrow, Key_DownArrow, Key_UpArrow, Key_RightArrow, Key_Equals, | |
LGUI(Key_Enter), Key_LeftCurlyBracket, Key_RightCurlyBracket, Key_LeftBracket, Key_RightBracket, Key_Plus, | |
___, ___, ___, ___, ___, ___ | |
) | |
) | |
/* *INDENT-ON* */ | |
KALEIDOSCOPE_INIT_PLUGINS( | |
EEPROMSettings, | |
EEPROMKeymap, | |
Focus, | |
FocusEEPROMCommand, | |
FocusSettingsCommand, | |
Qukeys, | |
// OneShot, | |
// ShapeShifter, | |
// SpaceCadet, | |
MouseKeys, | |
Macros | |
); | |
const macro_t *macroAction(uint8_t macroIndex, uint8_t keyState) { | |
switch (macroIndex) { | |
case MACRO_QWERTY: | |
// This macro is currently unused, but is kept around for compatibility | |
// reasons. We used to use it in place of `MoveToLayer(QWERTY)`, but no | |
// longer do. We keep it so that if someone still has the old layout with | |
// the macro in EEPROM, it will keep working after a firmware update. | |
Layer.move(QWERTY); | |
break; | |
case MACRO_VERSION_INFO: | |
if (keyToggledOn(keyState)) { | |
Macros.type(PSTR("Keyboardio Atreus - Kaleidoscope ")); | |
Macros.type(PSTR(BUILD_INFORMATION)); | |
} | |
break; | |
default: | |
break; | |
} | |
return MACRO_NONE; | |
} | |
void setup() { | |
Kaleidoscope.setup(); | |
// SpaceCadet.disable(); | |
EEPROMKeymap.setup(10); | |
/** | |
* Qukeys configs | |
* format Qukey(layer, row, col, alt_keycode) | |
* (layers, rows and columns are all zero-indexed, | |
* rows are top to bottom and columns are left to right) | |
* For the Keyboardio Atreus 2, key coordinates refer to this header file: | |
* https://github.com/keyboardio/Kaleidoscope/blob/d7e0f49fef92b6f516c991a927ddac79b44fbd5d/src/kaleidoscope/device/keyboardio/Atreus2.h | |
*/ | |
Qukeys.setOverlapThreshold(100); // default is 80 | |
Qukeys.setHoldTimeout(500); // default is 250 | |
QUKEYS( | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 1), Key_LeftAlt), // S / Alt | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 2), Key_LeftShift), // D / Shift | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 3), Key_LeftControl), // F / Control | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 4), Key_LeftGui), // G / Super | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 7), Key_LeftGui), // H / Super | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 8), Key_LeftControl), // J / Control | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 9), Key_LeftShift), // K / Shift | |
kaleidoscope::plugin::Qukey(0, KeyAddr(1, 10), Key_LeftAlt), // L / Alt | |
kaleidoscope::plugin::Qukey(0, KeyAddr(2, 5), Key_LeftShift), // Tab / Shift | |
kaleidoscope::plugin::Qukey(0, KeyAddr(3, 5), Key_LeftControl), // Esc / Control | |
kaleidoscope::plugin::Qukey(0, KeyAddr(3, 6), Key_LeftAlt), // Home / Alt | |
kaleidoscope::plugin::Qukey(0, KeyAddr(3, 7), MO(UPPER)), // End / ShiftToLayer(Upper) | |
) | |
} | |
void loop() { | |
Kaleidoscope.loop(); | |
} |
yea I totally understand how important command
is on Macs. I owned an MBA and MBP from 2008-2017 and only switched to Linux/Windows recently. Seeing as how rarely used control
is on Macs, I would actually suggest: shift
, gui
, alt
, control
(index to pinky) instead since the pinky is the weakest finger. And if you look at my code, you'll actually notice I don't use the pinky finger at all. Instsead of ASDF, I do SDFG and slide my finger(s) over when needed to reduce usage of the pinky finger.
I did notice the shift. I don't like it, myself, because it complicated modifier combos (and because I have no problem using my pinkies). I actually use control
at least as often as command
on macOS, mainly because I use Emacs. I agree that those are the ones most likely to get swapped depending on OS, though.
I will keep you in mind. With a number of other people having similar issues, I might want to revive my research project on rollover, which could be very helpful to me in finding the best algorithm. Thanks for volunteering!
I prefer the order to be
shift
,control
,alt
,gui
(from index finger to pinky finger), myself. The index finger isn't strongest, but it doesn't share a tendon (unlike the middle two fingers), so it's easier to use on its own, so that the one where I haveshift
. And I work on macOS most often, so I very rarely needcontrol
andcommand
(gui
) in combination. The most difficult combo is middle finger and pinky without the ring finger (which is the least independent of all four).