diff options
Diffstat (limited to 'tmk_core/common')
| -rw-r--r-- | tmk_core/common/action.c | 47 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 58 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.h | 1 | 
3 files changed, 90 insertions, 16 deletions
| diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 4ba1cc251..cffc0b9eb 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -26,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "action_macro.h"  #include "action_util.h"  #include "action.h" +#include "wait.h"  #ifdef DEBUG_ACTION  #include "debug.h" @@ -33,6 +34,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "nodebug.h"  #endif +int tp_buttons; +  #ifdef FAUXCLICKY_ENABLE  #include <fauxclicky.h>  #endif @@ -310,9 +313,35 @@ void process_action(keyrecord_t *record, action_t action)          /* Mouse key */          case ACT_MOUSEKEY:              if (event.pressed) { +                switch (action.key.code) { +                    case KC_MS_BTN1: +                        tp_buttons |= (1<<0); +                        break; +                    case KC_MS_BTN2: +                        tp_buttons |= (1<<1); +                        break; +                    case KC_MS_BTN3: +                        tp_buttons |= (1<<2); +                        break; +                    default: +                        break; +                }                  mousekey_on(action.key.code);                  mousekey_send();              } else { +                switch (action.key.code) { +                    case KC_MS_BTN1: +                        tp_buttons &= ~(1<<0); +                        break; +                    case KC_MS_BTN2: +                        tp_buttons &= ~(1<<1); +                        break; +                    case KC_MS_BTN3: +                        tp_buttons &= ~(1<<2); +                        break; +                    default: +                        break; +                }                  mousekey_off(action.key.code);                  mousekey_send();              } @@ -438,6 +467,9 @@ void process_action(keyrecord_t *record, action_t action)                      } else {                          if (tap_count > 0) {                              dprint("KEYMAP_TAP_KEY: Tap: unregister_code\n"); +                            if (action.layer_tap.code == KC_CAPS) { +                                wait_ms(80); +                            }                              unregister_code(action.layer_tap.code);                          } else {                              dprint("KEYMAP_TAP_KEY: No tap: Off on release\n"); @@ -537,6 +569,21 @@ void process_action(keyrecord_t *record, action_t action)              break;      } +#ifndef NO_ACTION_LAYER +    // if this event is a layer action, update the leds +    switch (action.kind.id) { +        case ACT_LAYER: +        #ifndef NO_ACTION_TAPPING +        case ACT_LAYER_TAP: +        case ACT_LAYER_TAP_EXT: +        #endif +            led_set(host_keyboard_leds()); +            break; +        default: +            break; +    } +#endif +  #ifndef NO_ACTION_ONESHOT      /* Because we switch layers after a oneshot event, we need to release the       * key before we leave the layer or no key up event will be generated. diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eac1f1dd8..97a8f1cd8 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -61,23 +61,51 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #   include "visualizer/visualizer.h"  #endif +#ifdef MATRIX_HAS_GHOST +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ +    matrix_row_t out = 0; +    for (uint8_t col = 0; col < MATRIX_COLS; col++) { +        //read each key in the row data and check if the keymap defines it as a real key +        if (pgm_read_byte(&keymaps[0][row][col]) && (rowdata & (1<<col))){ +            //this creates new row data, if a key is defined in the keymap, it will be set here +            out |= 1<<col; +        } +    } +    return out; +} +static inline bool popcount_more_than_one(matrix_row_t rowdata) +{ +    rowdata &= rowdata-1; //if there are less than two bits (keys) set, rowdata will become zero +    return rowdata; +} -#ifdef MATRIX_HAS_GHOST -static bool has_ghost_in_row(uint8_t row) +static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata)  { -    matrix_row_t matrix_row = matrix_get_row(row); -    // No ghost exists when less than 2 keys are down on the row -    if (((matrix_row - 1) & matrix_row) == 0) +    /* No ghost exists when less than 2 keys are down on the row. +    If there are "active" blanks in the matrix, the key can't be pressed by the user, +    there is no doubt as to which keys are really being pressed. +    The ghosts will be ignored, they are KC_NO.   */ +    rowdata = get_real_keys(row, rowdata); +    if ((popcount_more_than_one(rowdata)) == 0){          return false; - -    // Ghost occurs when the row shares column line with other row +    } +    /* Ghost occurs when the row shares a column line with other row, +    and two columns are read on each row. Blanks in the matrix don't matter, +    so they are filtered out. +    If there are two or more real keys pressed and they match columns with +    at least two of another row's real keys, the row will be ignored. Keep in mind, +    we are checking one row at a time, not all of them at once. +    */      for (uint8_t i=0; i < MATRIX_ROWS; i++) { -        if (i != row && (matrix_get_row(i) & matrix_row)) +        if (i != row && popcount_more_than_one(get_real_keys(i, matrix_get_row(i)) & rowdata)){              return true; +        }      }      return false;  } +  #endif  __attribute__ ((weak)) @@ -127,7 +155,7 @@ void keyboard_task(void)  {      static matrix_row_t matrix_prev[MATRIX_ROWS];  #ifdef MATRIX_HAS_GHOST -    static matrix_row_t matrix_ghost[MATRIX_ROWS]; +  //  static matrix_row_t matrix_ghost[MATRIX_ROWS];  #endif      static uint8_t led_status = 0;      matrix_row_t matrix_row = 0; @@ -139,18 +167,18 @@ void keyboard_task(void)          matrix_change = matrix_row ^ matrix_prev[r];          if (matrix_change) {  #ifdef MATRIX_HAS_GHOST -            if (has_ghost_in_row(r)) { +            if (has_ghost_in_row(r, matrix_row)) {                  /* Keep track of whether ghosted status has changed for                   * debugging. But don't update matrix_prev until un-ghosted, or                   * the last key would be lost.                   */ -                if (debug_matrix && matrix_ghost[r] != matrix_row) { -                    matrix_print(); -                } -                matrix_ghost[r] = matrix_row; +                //if (debug_matrix && matrix_ghost[r] != matrix_row) { +                //    matrix_print(); +                //} +                //matrix_ghost[r] = matrix_row;                  continue;              } -            matrix_ghost[r] = matrix_row; +            //matrix_ghost[r] = matrix_row;  #endif              if (debug_matrix) matrix_print();              for (uint8_t c = 0; c < MATRIX_COLS; c++) { diff --git a/tmk_core/common/keyboard.h b/tmk_core/common/keyboard.h index 7738251b6..f17003c2f 100644 --- a/tmk_core/common/keyboard.h +++ b/tmk_core/common/keyboard.h @@ -57,7 +57,6 @@ static inline bool IS_RELEASED(keyevent_t event) { return (!IS_NOEVENT(event) &&      .time = (timer_read() | 1)                          \  } -  /* it runs once at early stage of startup before keyboard_init. */  void keyboard_setup(void);  /* it runs once after initializing host side protocol, debug and MCU peripherals. */ | 
