diff options
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/common/action.c | 37 | ||||
| -rw-r--r-- | tmk_core/common/action.h | 7 | ||||
| -rw-r--r-- | tmk_core/common/action_layer.c | 77 | ||||
| -rw-r--r-- | tmk_core/common/action_layer.h | 11 | ||||
| -rw-r--r-- | tmk_core/common/avr/suspend.c | 5 | ||||
| -rw-r--r-- | tmk_core/common/command.c | 353 | ||||
| -rw-r--r-- | tmk_core/common/command.h | 121 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 6 | 
8 files changed, 500 insertions, 117 deletions
| diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 4197c53ed..f9e6c17dc 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -53,6 +53,25 @@ void action_exec(keyevent_t event)  #endif  } +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +bool disable_action_cache = false; + +void process_action_nocache(keyrecord_t *record) +{ +    disable_action_cache = true; +    process_action(record); +    disable_action_cache = false; +} +#else +void process_action_nocache(keyrecord_t *record) +{ +    process_action(record); +} +#endif + +__attribute__ ((weak)) +void process_action_kb(keyrecord_t *record) {} +  void process_action(keyrecord_t *record)  {      keyevent_t event = record->event; @@ -62,7 +81,9 @@ void process_action(keyrecord_t *record)      if (IS_NOEVENT(event)) { return; } -    action_t action = layer_switch_get_action(event.key); +    process_action_kb(record); + +    action_t action = store_or_get_action(event.pressed, event.key);      dprint("ACTION: "); debug_action(action);  #ifndef NO_ACTION_LAYER      dprint(" layer_state: "); layer_debug(); @@ -83,14 +104,24 @@ void process_action(keyrecord_t *record)                                                                  action.key.mods<<4;                  if (event.pressed) {                      if (mods) { -                        add_weak_mods(mods); +                        if (IS_MOD(action.key.code)) { +                            // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless. +                            // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT) +                            add_mods(mods); +                        } else { +                            add_weak_mods(mods); +                        }                          send_keyboard_report();                      }                      register_code(action.key.code);                  } else {                      unregister_code(action.key.code);                      if (mods) { -                        del_weak_mods(mods); +                        if (IS_MOD(action.key.code)) { +                            del_mods(mods); +                        } else { +                            del_weak_mods(mods); +                        }                          send_keyboard_report();                      }                  } diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 8a4736d7b..44ec3047b 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -58,7 +58,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);  /* user defined special function */  void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); +/* keyboard-specific key event (pre)processing */ +void process_action_kb(keyrecord_t *record); +  /* Utilities for actions.  */ +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +extern bool disable_action_cache; +#endif +void process_action_nocache(keyrecord_t *record);  void process_action(keyrecord_t *record);  void register_code(uint8_t code);  void unregister_code(uint8_t code); diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index c535615f4..fc721a732 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -110,9 +110,71 @@ void layer_debug(void)  }  #endif +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +uint8_t source_layers_cache[MAX_LAYER_BITS][(MATRIX_ROWS * MATRIX_COLS + 7) / 8] = {0}; +void update_source_layers_cache(keypos_t key, uint8_t layer) +{ +    const uint8_t key_number = key.col + (key.row * MATRIX_COLS); +    const uint8_t storage_row = key_number / 8; +    const uint8_t storage_bit = key_number % 8; -action_t layer_switch_get_action(keypos_t key) +    for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { +        source_layers_cache[bit_number][storage_row] ^= +            (-((layer & (1U << bit_number)) != 0) +             ^ source_layers_cache[bit_number][storage_row]) +            & (1U << storage_bit); +    } +} + +uint8_t read_source_layers_cache(keypos_t key) +{ +    const uint8_t key_number = key.col + (key.row * MATRIX_COLS); +    const uint8_t storage_row = key_number / 8; +    const uint8_t storage_bit = key_number % 8; +    uint8_t layer = 0; + +    for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { +        layer |= +            ((source_layers_cache[bit_number][storage_row] +              & (1U << storage_bit)) != 0) +            << bit_number; +    } + +    return layer; +} +#endif + +/* + * Make sure the action triggered when the key is released is the same + * one as the one triggered on press. It's important for the mod keys + * when the layer is switched after the down event but before the up + * event as they may get stuck otherwise. + */ +action_t store_or_get_action(bool pressed, keypos_t key) +{ +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +    if (disable_action_cache) { +        return layer_switch_get_action(key); +    } + +    uint8_t layer; + +    if (pressed) { +        layer = layer_switch_get_layer(key); +        update_source_layers_cache(key, layer); +    } +    else { +        layer = read_source_layers_cache(key); +    } +    return action_for_key(layer, key); +#else +    return layer_switch_get_action(key); +#endif +} + + +int8_t layer_switch_get_layer(keypos_t key)  {      action_t action;      action.code = ACTION_TRANSPARENT; @@ -124,15 +186,18 @@ action_t layer_switch_get_action(keypos_t key)          if (layers & (1UL<<i)) {              action = action_for_key(i, key);              if (action.code != ACTION_TRANSPARENT) { -                return action; +                return i;              }          }      }      /* fall back to layer 0 */ -    action = action_for_key(0, key); -    return action; +    return 0;  #else -    action = action_for_key(biton32(default_layer_state), key); -    return action; +    return biton32(default_layer_state);  #endif  } + +action_t layer_switch_get_action(keypos_t key) +{ +    return action_for_key(layer_switch_get_layer(key), key); +} diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index b6da353cf..3a4b1e334 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -70,6 +70,17 @@ void layer_xor(uint32_t state);  #define layer_debug()  #endif +/* pressed actions cache */ +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +/* The number of bits needed to represent the layer number: log2(32). */ +#define MAX_LAYER_BITS 5 +void update_source_layers_cache(keypos_t key, uint8_t layer); +uint8_t read_source_layers_cache(keypos_t key); +#endif +action_t store_or_get_action(bool pressed, keypos_t key); + +/* return the topmost non-transparent layer currently associated with key */ +int8_t layer_switch_get_layer(keypos_t key);  /* return action depending on current layer status */  action_t layer_switch_get_action(keypos_t key); diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index caf0b0625..c07c2801d 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -66,9 +66,12 @@ static void power_down(uint8_t wdto)      wdt_intr_enable(wdto);  #ifdef BACKLIGHT_ENABLE -backlight_set(0); +	backlight_set(0);  #endif +	// Turn off LED indicators +	led_set(0); +      // TODO: more power saving      // See PicoPower application note      // - I/O port input with pullup diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index d59bb01bb..b4cd3ca56 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -52,6 +52,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  static bool command_common(uint8_t code);  static void command_common_help(void); +static void print_version(void); +static void print_status(void);  static bool command_console(uint8_t code);  static void command_console_help(void);  #ifdef MOUSEKEY_ENABLE @@ -112,35 +114,140 @@ bool command_console_extra(uint8_t code)   ***********************************************************/  static void command_common_help(void)  { -    print("\n\t- Magic -\n" -          "d:	debug\n" -          "x:	debug matrix\n" -          "k:	debug keyboard\n" -          "m:	debug mouse\n" -          "v:	version\n" -          "s:	status\n" -          "c:	console mode\n" -          "0-4:	layer0-4(F10-F4)\n" -          "Paus:	bootloader\n" +	print(                            "\n\t- Magic -\n" +		STR(MAGIC_KEY_DEBUG       ) ":	Debug Message Toggle\n" +		STR(MAGIC_KEY_DEBUG_MATRIX) ":	Matrix Debug Mode Toggle - Show keypresses in matrix grid\n" +		STR(MAGIC_KEY_DEBUG_KBD   ) ":	Keyboard Debug Toggle - Show keypress report\n" +		STR(MAGIC_KEY_DEBUG_MOUSE ) ":	Debug Mouse Toggle\n" +		STR(MAGIC_KEY_VERSION     ) ":	Version\n" +		STR(MAGIC_KEY_STATUS      ) ":	Status\n" +		STR(MAGIC_KEY_CONSOLE     ) ":	Activate Console Mode\n" +		 +#if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +		STR(MAGIC_KEY_LAYER0      ) ":	Switch to Layer 0\n" +		STR(MAGIC_KEY_LAYER1      ) ":	Switch to Layer 1\n" +		STR(MAGIC_KEY_LAYER2      ) ":	Switch to Layer 2\n" +		STR(MAGIC_KEY_LAYER3      ) ":	Switch to Layer 3\n" +		STR(MAGIC_KEY_LAYER4      ) ":	Switch to Layer 4\n" +		STR(MAGIC_KEY_LAYER5      ) ":	Switch to Layer 5\n" +		STR(MAGIC_KEY_LAYER6      ) ":	Switch to Layer 6\n" +		STR(MAGIC_KEY_LAYER7      ) ":	Switch to Layer 7\n" +		STR(MAGIC_KEY_LAYER8      ) ":	Switch to Layer 8\n" +		STR(MAGIC_KEY_LAYER9      ) ":	Switch to Layer 9\n" +#endif + +#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS							 +		                            "F1-F10:	Switch to Layer 0-9 (F10 = L0)\n" +#endif + +#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS							 +		                            "0-9:	Switch to Layer 0-9\n" +#endif + +		STR(MAGIC_KEY_LAYER0_ALT1 ) ":	Switch to Layer 0 (alternate key 1)\n" +		STR(MAGIC_KEY_LAYER0_ALT2 ) ":	Switch to Layer 0 (alternate key 2)\n" +		STR(MAGIC_KEY_BOOTLOADER  ) ":	Jump to Bootloader (Reset)\n"  #ifdef KEYBOARD_LOCK_ENABLE -          "Caps:	Lock\n" +		STR(MAGIC_KEY_LOCK        ) ":	Lock\n"  #endif  #ifdef BOOTMAGIC_ENABLE -          "e:	eeprom\n" +		STR(MAGIC_KEY_EEPROM      ) ":	Print EEPROM Settings\n"  #endif  #ifdef NKRO_ENABLE -          "n:	NKRO\n" +		STR(MAGIC_KEY_NKRO        ) ":	NKRO Toggle\n"  #endif  #ifdef SLEEP_LED_ENABLE -          "z:	sleep LED test\n" +		STR(MAGIC_KEY_SLEEP_LED   ) ":	Sleep LED Test\n"  #endif      );  } +static void print_version(void) +{ +	// print version & information +    print("\n\t- Version -\n"); +    print("DESC: " STR(DESCRIPTION) "\n"); +    print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") " +          "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") " +          "VER: " STR(DEVICE_VER) "\n"); +    print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n"); + +    /* build options */ +    print("OPTIONS:" + +#ifdef PROTOCOL_PJRC +	    " PJRC" +#endif +#ifdef PROTOCOL_LUFA +	    " LUFA" +#endif +#ifdef PROTOCOL_VUSB +	    " VUSB" +#endif +#ifdef BOOTMAGIC_ENABLE +	    " BOOTMAGIC" +#endif +#ifdef MOUSEKEY_ENABLE +	    " MOUSEKEY" +#endif +#ifdef EXTRAKEY_ENABLE +	    " EXTRAKEY" +#endif +#ifdef CONSOLE_ENABLE +	    " CONSOLE" +#endif +#ifdef COMMAND_ENABLE +	    " COMMAND" +#endif +#ifdef NKRO_ENABLE +	    " NKRO" +#endif +#ifdef KEYMAP_SECTION_ENABLE +	    " KEYMAP_SECTION" +#endif + +	    " " STR(BOOTLOADER_SIZE) "\n"); + +    print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__) +          " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__ +          " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n"); + +	return; +} + +static void print_status(void) +{ + +    print("\n\t- Status -\n"); + +    print_val_hex8(host_keyboard_leds()); +    print_val_hex8(keyboard_protocol); +    print_val_hex8(keyboard_idle); +#ifdef NKRO_ENABLE +    print_val_hex8(keyboard_nkro); +#endif +    print_val_hex32(timer_count); + +#ifdef PROTOCOL_PJRC +    print_val_hex8(UDCON); +    print_val_hex8(UDIEN); +    print_val_hex8(UDINT); +    print_val_hex8(usb_keyboard_leds); +    print_val_hex8(usb_keyboard_idle_count); +#endif + +#ifdef PROTOCOL_PJRC +#   if USB_COUNT_SOF +    print_val_hex8(usbSofCount); +#   endif +#endif +	return; +} +  #ifdef BOOTMAGIC_ENABLE  static void print_eeconfig(void)  { @@ -178,24 +285,36 @@ static void print_eeconfig(void)  static bool command_common(uint8_t code)  { + +#ifdef KEYBOARD_LOCK_ENABLE      static host_driver_t *host_driver = 0; +#endif +      switch (code) { +  #ifdef SLEEP_LED_ENABLE -        case KC_Z: -            // test breathing sleep LED -            print("Sleep LED test\n"); + +		// test breathing sleep LED +        case MAGIC_KC(MAGIC_KEY_SLEEP_LED): +            print("Sleep LED Test\n");              sleep_led_toggle();              led_set(host_keyboard_leds());              break;  #endif +  #ifdef BOOTMAGIC_ENABLE -        case KC_E: + +		// print stored eeprom config +        case MAGIC_KC(MAGIC_KEY_EEPROM):                      print("eeconfig:\n");              print_eeconfig();              break;  #endif +  #ifdef KEYBOARD_LOCK_ENABLE -        case KC_CAPSLOCK: + +		// lock/unlock keyboard +        case MAGIC_KC(MAGIC_KEY_LOCK):              if (host_get_driver()) {                  host_driver = host_get_driver();                  clear_keyboard(); @@ -207,11 +326,15 @@ static bool command_common(uint8_t code)              }              break;  #endif -        case KC_H: -        case KC_SLASH: /* ? */ + +		// print help +        case MAGIC_KC(MAGIC_KEY_HELP1): +        case MAGIC_KC(MAGIC_KEY_HELP2):              command_common_help();              break; -        case KC_C: + +		// activate console +        case MAGIC_KC(MAGIC_KEY_CONSOLE):              debug_matrix   = false;              debug_keyboard = false;              debug_mouse    = false; @@ -220,25 +343,33 @@ static bool command_common(uint8_t code)              print("C> ");              command_state = CONSOLE;              break; -        case KC_PAUSE: -            clear_keyboard(); -            print("\n\nbootloader... "); + +        // jump to bootloader +        case MAGIC_KC(MAGIC_KEY_BOOTLOADER): +            clear_keyboard(); // clear to prevent stuck keys +            print("\n\nJumping to bootloader... ");              _delay_ms(1000);              bootloader_jump(); // not return              break; -        case KC_D: + +        // debug toggle +        case MAGIC_KC(MAGIC_KEY_DEBUG): +            debug_enable = !debug_enable;              if (debug_enable) { +                print("\ndebug: on\n"); +                debug_matrix   = true; +                debug_keyboard = true; +                debug_mouse    = true; +            } else {                  print("\ndebug: off\n");                  debug_matrix   = false;                  debug_keyboard = false;                  debug_mouse    = false; -                debug_enable   = false; -            } else { -                print("\ndebug: on\n"); -                debug_enable   = true;              }              break; -        case KC_X: // debug matrix toggle + +        // debug matrix toggle +        case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX):               debug_matrix = !debug_matrix;              if (debug_matrix) {                  print("\nmatrix: on\n"); @@ -247,7 +378,9 @@ static bool command_common(uint8_t code)                  print("\nmatrix: off\n");              }              break; -        case KC_K: // debug keyboard toggle + +        // debug keyboard toggle +        case MAGIC_KC(MAGIC_KEY_DEBUG_KBD):               debug_keyboard = !debug_keyboard;              if (debug_keyboard) {                  print("\nkeyboard: on\n"); @@ -256,87 +389,33 @@ static bool command_common(uint8_t code)                  print("\nkeyboard: off\n");              }              break; -        case KC_M: // debug mouse toggle + +        // debug mouse toggle +        case MAGIC_KC(MAGIC_KEY_DEBUG_MOUSE):              debug_mouse = !debug_mouse;              if (debug_mouse) {                  print("\nmouse: on\n");                  debug_enable = true;              } else { -                print("\nmouse: off\n"); +				print("\nmouse: off\n");              }              break; -        case KC_V: // print version & information -            print("\n\t- Version -\n"); -            print("DESC: " STR(DESCRIPTION) "\n"); -            print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") " -                  "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") " -                  "VER: " STR(DEVICE_VER) "\n"); -            print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n"); -            /* build options */ -            print("OPTIONS:" -#ifdef PROTOCOL_PJRC -            " PJRC" -#endif -#ifdef PROTOCOL_LUFA -            " LUFA" -#endif -#ifdef PROTOCOL_VUSB -            " VUSB" -#endif -#ifdef BOOTMAGIC_ENABLE -            " BOOTMAGIC" -#endif -#ifdef MOUSEKEY_ENABLE -            " MOUSEKEY" -#endif -#ifdef EXTRAKEY_ENABLE -            " EXTRAKEY" -#endif -#ifdef CONSOLE_ENABLE -            " CONSOLE" -#endif -#ifdef COMMAND_ENABLE -            " COMMAND" -#endif -#ifdef NKRO_ENABLE -            " NKRO" -#endif -#ifdef KEYMAP_SECTION_ENABLE -            " KEYMAP_SECTION" -#endif -            " " STR(BOOTLOADER_SIZE) "\n"); -            print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__) -                  " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__ -                  " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n"); -            break; -        case KC_S: -            print("\n\t- Status -\n"); -            print_val_hex8(host_keyboard_leds()); -            print_val_hex8(keyboard_protocol); -            print_val_hex8(keyboard_idle); -#ifdef NKRO_ENABLE -            print_val_hex8(keyboard_nkro); -#endif -            print_val_hex32(timer_count); - -#ifdef PROTOCOL_PJRC -            print_val_hex8(UDCON); -            print_val_hex8(UDIEN); -            print_val_hex8(UDINT); -            print_val_hex8(usb_keyboard_leds); -            print_val_hex8(usb_keyboard_idle_count); -#endif +		// print version +        case MAGIC_KC(MAGIC_KEY_VERSION): +        	print_version(); +		    break; -#ifdef PROTOCOL_PJRC -#   if USB_COUNT_SOF -            print_val_hex8(usbSofCount); -#   endif -#endif +		// print status +		case MAGIC_KC(MAGIC_KEY_STATUS): +			print_status();              break; +  #ifdef NKRO_ENABLE -        case KC_N: -            clear_keyboard(); //Prevents stuck keys. + +		// NKRO toggle +        case MAGIC_KC(MAGIC_KEY_NKRO): +            clear_keyboard(); // clear to prevent stuck keys              keyboard_nkro = !keyboard_nkro;              if (keyboard_nkro)                  print("NKRO: on\n"); @@ -344,18 +423,78 @@ static bool command_common(uint8_t code)                  print("NKRO: off\n");              break;  #endif -        case KC_ESC: -        case KC_GRV: -        case KC_0: + +		// switch layers + +		case MAGIC_KC(MAGIC_KEY_LAYER0_ALT1): +		case MAGIC_KC(MAGIC_KEY_LAYER0_ALT2): +            switch_default_layer(0); +            break; + +#if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM + +		case MAGIC_KC(MAGIC_KEY_LAYER0): +            switch_default_layer(0); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER1): +            switch_default_layer(1); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER2): +            switch_default_layer(2); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER3): +            switch_default_layer(3); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER4): +            switch_default_layer(4); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER5): +            switch_default_layer(5); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER6): +            switch_default_layer(6); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER7): +            switch_default_layer(7); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER8): +            switch_default_layer(8); +            break; + +		case MAGIC_KC(MAGIC_KEY_LAYER9): +            switch_default_layer(9); +            break; +#endif + + +#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS + +        case KC_F1 ... KC_F9: +            switch_default_layer((code - KC_F1) + 1); +            break;          case KC_F10:              switch_default_layer(0);              break; +#endif + +#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +          case KC_1 ... KC_9:              switch_default_layer((code - KC_1) + 1);              break; -        case KC_F1 ... KC_F9: -            switch_default_layer((code - KC_F1) + 1); +        case KC_0: +            switch_default_layer(0);              break; +#endif +          default:              print("?");              return false; diff --git a/tmk_core/common/command.h b/tmk_core/common/command.h index b57a6c1ce..92b18849b 100644 --- a/tmk_core/common/command.h +++ b/tmk_core/common/command.h @@ -32,4 +32,125 @@ bool command_proc(uint8_t code);  #define command_proc(code)      false  #endif + +#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS  true +#endif + +#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS  true +#endif + +#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false +#endif + +#ifndef MAGIC_KEY_HELP1 +#define MAGIC_KEY_HELP1          H +#endif + +#ifndef MAGIC_KEY_HELP2 +#define MAGIC_KEY_HELP2          SLASH +#endif + +#ifndef MAGIC_KEY_DEBUG +#define MAGIC_KEY_DEBUG          D +#endif + +#ifndef MAGIC_KEY_DEBUG_MATRIX +#define MAGIC_KEY_DEBUG_MATRIX   X +#endif + +#ifndef MAGIC_KEY_DEBUG_KBD +#define MAGIC_KEY_DEBUG_KBD      K +#endif + +#ifndef MAGIC_KEY_DEBUG_MOUSE +#define MAGIC_KEY_DEBUG_MOUSE    M +#endif + +#ifndef MAGIC_KEY_VERSION +#define MAGIC_KEY_VERSION        V +#endif + +#ifndef MAGIC_KEY_STATUS +#define MAGIC_KEY_STATUS         S +#endif + +#ifndef MAGIC_KEY_CONSOLE +#define MAGIC_KEY_CONSOLE        C +#endif + +#ifndef MAGIC_KEY_LAYER0_ALT1 +#define MAGIC_KEY_LAYER0_ALT1    ESC +#endif + +#ifndef MAGIC_KEY_LAYER0_ALT2 +#define MAGIC_KEY_LAYER0_ALT2    GRAVE +#endif + +#ifndef MAGIC_KEY_LAYER0 +#define MAGIC_KEY_LAYER0         0 +#endif + +#ifndef MAGIC_KEY_LAYER1 +#define MAGIC_KEY_LAYER1         1 +#endif + +#ifndef MAGIC_KEY_LAYER2 +#define MAGIC_KEY_LAYER2         2 +#endif + +#ifndef MAGIC_KEY_LAYER3 +#define MAGIC_KEY_LAYER3         3 +#endif + +#ifndef MAGIC_KEY_LAYER4 +#define MAGIC_KEY_LAYER4         4 +#endif + +#ifndef MAGIC_KEY_LAYER5 +#define MAGIC_KEY_LAYER5         5 +#endif + +#ifndef MAGIC_KEY_LAYER6 +#define MAGIC_KEY_LAYER6         6 +#endif + +#ifndef MAGIC_KEY_LAYER7 +#define MAGIC_KEY_LAYER7         7 +#endif + +#ifndef MAGIC_KEY_LAYER8 +#define MAGIC_KEY_LAYER8         8  #endif + +#ifndef MAGIC_KEY_LAYER9 +#define MAGIC_KEY_LAYER9         9 +#endif + +#ifndef MAGIC_KEY_BOOTLOADER +#define MAGIC_KEY_BOOTLOADER     PAUSE +#endif + +#ifndef MAGIC_KEY_LOCK +#define MAGIC_KEY_LOCK           CAPS +#endif + +#ifndef MAGIC_KEY_EEPROM +#define MAGIC_KEY_EEPROM         E +#endif + +#ifndef MAGIC_KEY_NKRO +#define MAGIC_KEY_NKRO           N +#endif + +#ifndef MAGIC_KEY_SLEEP_LED +#define MAGIC_KEY_SLEEP_LED      Z + +#endif + +#define XMAGIC_KC(key) KC_##key +#define MAGIC_KC(key) XMAGIC_KC(key) + +#endif
\ No newline at end of file diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eb7b096be..302b3ec87 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -70,6 +70,7 @@ void keyboard_setup(void)  void keyboard_init(void)  { +      timer_init();      matrix_init();  #ifdef PS2_MOUSE_ENABLE @@ -90,6 +91,11 @@ void keyboard_init(void)  #ifdef BACKLIGHT_ENABLE      backlight_init();  #endif + +#if defined(NKRO_ENABLE) && defined(FORCE_NKRO) +	keyboard_nkro = true; +#endif +  }  /* | 
