# from discord: and about the layers getting stuck, i found out that if you accidentally hit two keys that are layer keys, and they dont have a combo between them, they gonna get stuck import os import board from kmk.kmk_keyboard import KMKKeyboard from kmk.keys import KC from ardux.chord import ArduxChord # FIXME: Need to fix ArduxChord / sort layer filters for combos from kmk.modules.layers import Layers from kmk.modules.combos import Combos, Chord from kmk.modules.holdtap import HoldTap from kmk.modules.oneshot import OneShot from kmk.modules.mouse_keys import MouseKeys from kmk.extensions.media_keys import MediaKeys # constants LAYER_ID_BASE = 0 LAYER_ID_PARENS = 1 LAYER_ID_NUMBERS = 2 LAYER_ID_NAVIGATION = 3 LAYER_ID_SYMBOLS = 4 LAYER_ID_CUSTOM = 5 LAYER_ID_MOUSE = 6 class _ArduxKeyboard(KMKKeyboard): coord_mapping = [ 0, 1, 2, 3, 4, 5, 6, 7, ] keymap = [] # Switch to ABC python3 stl abstract class methods # See https://stackoverflow.com/a/4382964 for detail (the accepted answer) def setup_physical_config(self): raise NotImplementedError('Please define the physical config for your keyboard') # Init / constructor / setup def __init__(self): # Enable debugging if appropriate if os.getenv('ARDUX_KMK_DEBUGGING'): self.debug_enabled = True # setup modules/extensions arrays self.modules = [] self.extensions = [] # Call setup hook -- matrix/direct wire config self.setup_physical_config() # Layers self.layers_module = Layers() self.layers_module.prefer_hold=False self.layers_module.tap_interrupted=True self.modules.append(self.layers_module) # Combos self.combo_module = Combos() self.combo_module.prefer_hold = True self.combo_module.tap_interrupted = False self.modules.append(self.combo_module) # HoldTap self.holdtap_module = HoldTap() self.holdtap_module.tap_time = 50 self.holdtap_module.prefer_hold = True self.modules.append(self.holdtap_module) # One Shot self.modules.append(OneShot()) # Media Keys self.extensions.append(MediaKeys()) # Mouse Keys self.modules.append(MouseKeys()) # Setup kemap as last step self.setup_keymap() # Setup combos self.setup_combos() # Define keymap def setup_keymap(self): self.base_s_numbers = KC.LT(LAYER_ID_NUMBERS, KC.S) self.base_a_parens = KC.LT(LAYER_ID_PARENS, KC.A) self.base_o_custom = KC.LT(LAYER_ID_CUSTOM, KC.O) self.base_e_symbols = KC.LT(LAYER_ID_SYMBOLS, KC.E) self.keymap = [ # std - left - base [self.base_s_numbers, KC.T, KC.R, self.base_a_parens, self.base_o_custom, KC.I, KC.Y, self.base_e_symbols], # std - left - parenthesis [KC.RIGHT_CURLY_BRACE, KC.LEFT_PAREN, KC.RIGHT_PAREN, KC.TRANSPARENT, KC.LEFT_CURLY_BRACE, KC.LBRACKET, KC.RBRACKET, KC.NO], # std - left - number [KC.TRANSPARENT, KC.N3, KC.N2, KC.N1, KC.NO, KC.N6, KC.N5, KC.N4], # std - left - navigation [KC.PGUP, KC.HOME, KC.UP, KC.END, KC.PGDOWN, KC.LEFT, KC.DOWN, KC.RIGHT], # std - left - symbols [KC.GRAVE, KC.SCOLON, KC.BSLASH, KC.EXCLAIM, KC.EQUAL, KC.MINUS, KC.QUESTION, KC.TRANSPARENT], # std - left - custom [KC.NO, KC.AUDIO_VOL_UP, KC.INSERT, KC.AUDIO_MUTE, KC.TRANSPARENT, KC.AUDIO_VOL_DOWN, KC.PSCREEN, KC.RSHIFT], # std - left - mouse [KC.MW_UP, KC.MB_RMB, KC.MS_UP, KC.MB_LMB, KC.MW_DOWN, KC.MS_LEFT, KC.MS_DN, KC.MS_RIGHT] ] # Define combos for ardux def setup_combos(self): self.combo_module.combos = [] ##### # std - base # layers self.combo_module.combos.append(Chord((KC.R, KC.I, self.base_e_symbols), KC.TO(LAYER_ID_NAVIGATION))) self.combo_module.combos.append(Chord((KC.T, KC.Y, self.base_a_parens), KC.TO(LAYER_ID_MOUSE))) # mods self.combo_module.combos.append(Chord((self.base_s_numbers, self.base_e_symbols), KC.OS(KC.LCTRL))) self.combo_module.combos.append(Chord((KC.Y, self.base_s_numbers), KC.OS(KC.LGUI))) self.combo_module.combos.append(Chord((KC.I, self.base_s_numbers), KC.OS(KC.LALT))) self.combo_module.combos.append(Chord((self.base_s_numbers, KC.R, KC.T, self.base_e_symbols), KC.OS(KC.LSHIFT))) # control sequences self.combo_module.combos.append(Chord((self.base_o_custom, KC.I, KC.Y, self.base_e_symbols), KC.SPACE)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R, self.base_o_custom), KC.ESCAPE)) self.combo_module.combos.append(Chord((self.base_e_symbols, KC.R), KC.BSPACE)) self.combo_module.combos.append(Chord((KC.R, KC.I), KC.DELETE)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R, KC.T, self.base_o_custom), KC.TAB)) self.combo_module.combos.append(Chord((self.base_a_parens, self.base_e_symbols), KC.ENTER)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.Y, KC.I, self.base_o_custom), KC.CAPSLOCK)) # symbols self.combo_module.combos.append(Chord((self.base_a_parens, KC.Y), KC.DOT)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.I), KC.COMMA)) self.combo_module.combos.append(Chord((self.base_a_parens, self.base_o_custom), KC.SLASH)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.Y, KC.I), KC.QUOTE)) # ansi self.combo_module.combos.append(Chord((self.base_o_custom, self.base_e_symbols), KC.B)) self.combo_module.combos.append(Chord((self.base_e_symbols, KC.Y), KC.C)) self.combo_module.combos.append(Chord((KC.I, self.base_o_custom), KC.N)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R), KC.F)) self.combo_module.combos.append(Chord((KC.R, KC.T), KC.G)) self.combo_module.combos.append(Chord((KC.Y, KC.I), KC.U)) self.combo_module.combos.append(Chord((self.base_e_symbols, KC.I), KC.H)) self.combo_module.combos.append(Chord((KC.R, self.base_s_numbers), KC.V)) self.combo_module.combos.append(Chord((KC.T, self.base_s_numbers), KC.J)) self.combo_module.combos.append(Chord((self.base_a_parens, self.base_s_numbers), KC.W)) self.combo_module.combos.append(Chord((KC.Y, self.base_o_custom), KC.K)) self.combo_module.combos.append(Chord((KC.Y, KC.I, self.base_o_custom), KC.M)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R, KC.T), KC.D)) self.combo_module.combos.append(Chord((self.base_o_custom, KC.I, self.base_e_symbols), KC.P)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.T, self.base_s_numbers), KC.Q)) self.combo_module.combos.append(Chord((KC.R, KC.T, self.base_s_numbers), KC.X)) self.combo_module.combos.append(Chord((KC.I, KC.Y, self.base_e_symbols), KC.L)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R, KC.T, self.base_s_numbers), KC.Z)) ##### # std - nav self.combo_module.combos.append(Chord((KC.UP, KC.LEFT, KC.RIGHT), KC.TO(LAYER_ID_BASE))) self.combo_module.combos.append(Chord((KC.END, KC.RIGHT), KC.ENTER)) self.combo_module.combos.append(Chord((KC.END, KC.UP, KC.PGDOWN), KC.ESCAPE)) self.combo_module.combos.append(Chord((KC.RIGHT, KC.UP), KC.BSPACE)) self.combo_module.combos.append(Chord((KC.UP, KC.LEFT), KC.DELETE)) self.combo_module.combos.append(Chord((KC.END, KC.UP, KC.HOME, KC.PGDOWN), KC.TAB)) self.combo_module.combos.append(Chord((KC.RIGHT, KC.DOWN, KC.LEFT, KC.PGDOWN), KC.SPACE)) self.combo_module.combos.append(Chord((KC.RIGHT, KC.PGUP), KC.OS(KC.LCTRL))) self.combo_module.combos.append(Chord((KC.DOWN, KC.PGUP), KC.OS(KC.LGUI))) self.combo_module.combos.append(Chord((KC.LEFT, KC.PGUP), KC.OS(KC.LALT))) self.combo_module.combos.append(Chord((KC.RIGHT, KC.UP, KC.HOME, KC.PGUP), KC.OS(KC.LSHIFT))) ##### # std - number self.combo_module.combos.append(Chord((KC.N1, KC.N2), KC.N7)) self.combo_module.combos.append(Chord((KC.N2, KC.N3), KC.N8)) self.combo_module.combos.append(Chord((KC.N4, KC.N5), KC.N9)) self.combo_module.combos.append(Chord((KC.N5, KC.N6), KC.N0)) self.combo_module.combos.append(Chord((KC.N1, KC.N5), KC.DOT)) self.combo_module.combos.append(Chord((KC.N1, KC.N6), KC.COMMA)) self.combo_module.combos.append(Chord((KC.N1, KC.N4), KC.ENTER)) self.combo_module.combos.append(Chord((KC.N2, KC.N6), KC.DELETE)) self.combo_module.combos.append(Chord((KC.N4, KC.N2), KC.BSPACE)) ##### # std - mouse self.combo_module.combos.append(Chord((KC.MB_RMB, KC.MS_DN, KC.MB_LMB), KC.TO(LAYER_ID_BASE))) # work around a bug with combo handling and layer selections in kmk # these combos should be removed if/when kmk stops 'going hayware' or 'getting stuck' when these key combos are pressed when the below are not in the code self.combo_module.combos.append(Chord((self.base_o_custom, KC.Y, self.base_e_symbols), KC.NO)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.R, self.base_s_numbers), KC.NO)) self.combo_module.combos.append(Chord((self.base_a_parens, KC.T), KC.NO)) self.combo_module.combos.append(Chord((self.base_o_custom, KC.T), KC.NO)) self.combo_module.combos.append(Chord((self.base_o_custom, self.base_s_numbers), KC.NO)) self.combo_module.combos.append(Chord((self.base_s_numbers, KC.Y), KC.NO))