]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware into modifier...
authorWojciech Siewierski <wojciech.siewierski@onet.pl>
Sun, 3 Apr 2016 09:14:08 +0000 (11:14 +0200)
committerWojciech Siewierski <wojciech.siewierski@onet.pl>
Sun, 3 Apr 2016 09:23:00 +0000 (11:23 +0200)
1  2 
README.md
tmk_core/common/action.c
tmk_core/common/action.h

diff --cc README.md
Simple merge
index 78596a69cfd9236746d98b898100c7766be384b2,2ccc0e0b947bdd79342e3b31e02b89a02de72397..20e1fc6149f232912846f5db789952440a315faa
@@@ -53,63 -53,9 +53,66 @@@ void action_exec(keyevent_t event
  #endif
  }
  
 +#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
 +bool disable_action_cache = false;
 +uint8_t source_layers_cache[5][(MATRIX_ROWS * MATRIX_COLS + 7) / 8] = {0};
 +
 +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
 +
 +/*
 + * 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);
 +    }
 +    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;
 +    if (pressed) {
 +        layer = layer_switch_get_layer(key);
 +        for (uint8_t bit_number = 0; bit_number < 5; bit_number++) {
 +            source_layers_cache[bit_number][storage_row] ^=
 +                (-((layer & (1U << bit_number)) != 0)
 +                 ^ source_layers_cache[bit_number][storage_row])
 +                & (1U << storage_bit);
 +        }
 +    }
 +    else {
 +        layer = 0;
 +        for (uint8_t bit_number = 0; bit_number < 5; bit_number++) {
 +            layer |=
 +                ((source_layers_cache[bit_number][storage_row]
 +                  & (1U << storage_bit)) != 0)
 +                << bit_number;
 +        }
 +    }
 +    return action_for_key(layer, key);
 +#else
 +    return layer_switch_get_action(key);
 +#endif
 +}
 +
+ __attribute__ ((weak))
+ void process_action_kb(keyrecord_t *record) {}
  void process_action(keyrecord_t *record)
  {
      keyevent_t event = record->event;
  
      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();
index 533e5d1a011d62c4196c750179dcfa63b81fae7b,9f528af4b98ddd5603f17efaeb59038baa60f285..44ec3047ba5a03a0fdb33c39edee4085c7b7e92c
@@@ -58,11 -58,10 +58,14 @@@ const macro_t *action_get_macro(keyreco
  /* 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);