diff options
Diffstat (limited to 'tmk_core/common')
| -rw-r--r-- | tmk_core/common/action.c | 16 | ||||
| -rw-r--r-- | tmk_core/common/action_code.h | 10 | ||||
| -rw-r--r-- | tmk_core/common/action_macro.h | 26 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 1 | ||||
| -rw-r--r-- | tmk_core/common/matrix.h | 2 | ||||
| -rw-r--r-- | tmk_core/common/report.h | 7 | 
6 files changed, 41 insertions, 21 deletions
| diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index d485b46c7..f03670a7f 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -49,6 +49,13 @@ void action_exec(keyevent_t event)      keyrecord_t record = { .event = event }; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) +    if (has_oneshot_layer_timed_out()) { +        dprintf("Oneshot layer: timeout\n"); +        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); +    } +#endif +  #ifndef NO_ACTION_TAPPING      action_tapping_process(record);  #else @@ -100,7 +107,7 @@ bool process_record_quantum(keyrecord_t *record) {      return true;  } -void process_record(keyrecord_t *record)  +void process_record(keyrecord_t *record)  {      if (IS_NOEVENT(record->event)) { return; } @@ -126,13 +133,6 @@ void process_action(keyrecord_t *record, action_t action)      uint8_t tap_count = record->tap.count;  #endif -#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) -    if (has_oneshot_layer_timed_out()) { -        dprintf("Oneshot layer: timeout\n"); -        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); -    } -#endif -      if (event.pressed) {          // clear the potential weak mods left by previously pressed keys          clear_weak_mods(); diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index 33da35f35..b15aaa0eb 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -47,10 +47,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   * 0100|10| usage(10)     (reserved)   * 0100|11| usage(10)     (reserved)   * - * ACT_MOUSEKEY(0110): TODO: Not needed? + * + * ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space?   * 0101|xxxx| keycode     Mouse key   * - * 011x|xxxx xxxx xxxx    (reseved) + * ACT_SWAP_HANDS(0110): + * 0110|xxxx| keycode     Swap hands (keycode on tap, or options) + * + * + * 0111|xxxx xxxx xxxx    (reserved)   *   *   * Layer Actions(10xx) @@ -67,7 +72,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   *   ee:    on event(01:press, 10:release, 11:both)   *   * 1001|xxxx|xxxx xxxx   (reserved) - * 1001|oopp|BBBB BBBB   8-bit Bitwise Operation???   *   * ACT_LAYER_TAP(101x):   * 101E|LLLL| keycode    On/Off with tap key    (0x00-DF)[TAP] diff --git a/tmk_core/common/action_macro.h b/tmk_core/common/action_macro.h index aedc32ec6..f373f5068 100644 --- a/tmk_core/common/action_macro.h +++ b/tmk_core/common/action_macro.h @@ -20,11 +20,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "progmem.h" -#define MACRO_NONE      0 + +typedef uint8_t macro_t; + +#define MACRO_NONE      (macro_t*)0  #define MACRO(...)      ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })  #define MACRO_GET(p)    pgm_read_byte(p) -typedef uint8_t macro_t; +// Sends press when the macro key is pressed, release when release, or tap_macro when the key has been tapped +#define MACRO_TAP_HOLD(record, press, release, tap_macro) ( ((record)->event.pressed) ? \ +     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? (press) : MACRO_NONE ) : \ +     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (tap_macro) : (release) ) ) + +// Holds down the modifier mod when the macro key is held, or sends macro instead when tapped +#define MACRO_TAP_HOLD_MOD(record, macro, mod) MACRO_TAP_HOLD(record, (MACRO(D(mod), END)), MACRO(U(mod), END), macro) + +// Holds down the modifier mod when the macro key is held, or pressed a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_MOD(record, key, mod) MACRO_TAP_HOLD_MOD(record, (MACRO(I(10), D(LSFT), T(key), U(LSFT), END)), mod) + + +// Momentary switch layer when held, sends macro if tapped +#define MACRO_TAP_HOLD_LAYER(record, macro, layer) ( ((record)->event.pressed) ? \ +     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? ({layer_on((layer)); MACRO_NONE; }) : MACRO_NONE ) : \ +     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : ({layer_off((layer)); MACRO_NONE; }) ) ) + +// Momentary switch layer when held, presses a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, key, layer) MACRO_TAP_HOLD_LAYER(record, MACRO(I(10), D(LSFT), T(key), U(LSFT), END), layer) +       #ifndef NO_ACTION_MACRO diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 765350792..3aa82231b 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -14,6 +14,7 @@ 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, see <http://www.gnu.org/licenses/>.  */ +  #include <stdint.h>  #include "keyboard.h"  #include "matrix.h" diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h index cee3593ee..2543f5abc 100644 --- a/tmk_core/common/matrix.h +++ b/tmk_core/common/matrix.h @@ -50,7 +50,7 @@ void matrix_init(void);  uint8_t matrix_scan(void);  /* whether modified from previous scan. used after matrix_scan. */  bool matrix_is_modified(void) __attribute__ ((deprecated)); -/* whether a swtich is on */ +/* whether a switch is on */  bool matrix_is_on(uint8_t row, uint8_t col);  /* matrix state on row */  matrix_row_t matrix_get_row(uint8_t row); diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 0c799eca3..8fb28b6ce 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -134,13 +134,6 @@ typedef union {      } nkro;  #endif  } __attribute__ ((packed)) report_keyboard_t; -/* -typedef struct { -    uint8_t mods; -    uint8_t reserved; -    uint8_t keys[REPORT_KEYS]; -} __attribute__ ((packed)) report_keyboard_t; -*/  typedef struct {      uint8_t buttons; | 
