diff options
| author | tmk <nobody@nowhere> | 2013-07-21 10:44:21 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-07-21 10:44:21 +0900 | 
| commit | 25aec56c082936a463d609357a04332c97c9940b (patch) | |
| tree | 5c3813a5391b9b10f1dc07b259d075729f9c6344 | |
| parent | 86623f57247c92242751ceae4cb291e7f3d19540 (diff) | |
| parent | 3e023e5b0cf15d3008346c6b946ae3adc51f7f18 (diff) | |
| download | firmware-25aec56c082936a463d609357a04332c97c9940b.tar.gz firmware-25aec56c082936a463d609357a04332c97c9940b.tar.bz2 firmware-25aec56c082936a463d609357a04332c97c9940b.zip | |
Merge branch 'bob_fix'
| -rw-r--r-- | common/action.c | 6 | ||||
| -rw-r--r-- | common/action_code.h | 10 | ||||
| -rw-r--r-- | common/action_tapping.c | 71 | 
3 files changed, 53 insertions, 34 deletions
| diff --git a/common/action.c b/common/action.c index b1fa0e31c..a42a7a4ae 100644 --- a/common/action.c +++ b/common/action.c @@ -237,7 +237,7 @@ void process_action(keyrecord_t *record)              break;      #ifndef NO_ACTION_TAPPING          case ACT_LAYER_TAP: -        case ACT_LAYER_TAP1: +        case ACT_LAYER_TAP_EXT:              switch (action.layer_tap.code) {                  case OP_TAP_TOGGLE:                      /* tap toggle */ @@ -458,7 +458,7 @@ bool is_tap_key(key_t key)          case ACT_LMODS_TAP:          case ACT_RMODS_TAP:          case ACT_LAYER_TAP: -        case ACT_LAYER_TAP1: +        case ACT_LAYER_TAP_EXT:              return true;          case ACT_MACRO:          case ACT_FUNCTION: @@ -496,7 +496,7 @@ void debug_action(action_t action)          case ACT_MOUSEKEY:          dprint("ACT_MOUSEKEY");          break;          case ACT_LAYER:             dprint("ACT_LAYER");             break;          case ACT_LAYER_TAP:         dprint("ACT_LAYER_TAP");         break; -        case ACT_LAYER_TAP1:        dprint("ACT_LAYER_TAP1");        break; +        case ACT_LAYER_TAP_EXT:     dprint("ACT_LAYER_TAP_EXT");     break;          case ACT_MACRO:             dprint("ACT_MACRO");             break;          case ACT_COMMAND:           dprint("ACT_COMMAND");           break;          case ACT_FUNCTION:          dprint("ACT_FUNCTION");          break; diff --git a/common/action_code.h b/common/action_code.h index 2272091cc..df6ce9998 100644 --- a/common/action_code.h +++ b/common/action_code.h @@ -62,8 +62,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   * 1000|ooee|pppE BBBB   Layer Bitwise Operation   *   oo:    operation(00:AND, 01:OR, 10:XOR, 11:SET)   *   ppp:   4-bit chunk part(0-7) - *   eBBBB: bits and extra bit - *   ee:    on event(00:default layer, 01:press, 10:release, 11:both) + *   EBBBB: bits and extra bit + *   ee:    on event(01:press, 10:release, 11:both)   *   * 1001|xxxx|xxxx xxxx   (reserved)   * 1001|oopp|BBBB BBBB   8-bit Bitwise Operation??? @@ -76,7 +76,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   * 101E|LLLL|1111 0010   Off/On   * 101E|LLLL|1111 0011   Set/Clear   * 101E|LLLL|1111 xxxx   Reserved(0xF4-FF) - *   ELLLL: layer(0-31) + *   ELLLL: layer 0-31(E: extra bit for layer 16-31)   *   *   * Extensions(11xx) @@ -108,8 +108,8 @@ enum action_kind_id {      ACT_MOUSEKEY        = 0b0101,      /* Layer Actions */      ACT_LAYER           = 0b1000, -    ACT_LAYER_TAP       = 0b1010, -    ACT_LAYER_TAP1      = 0b1011, +    ACT_LAYER_TAP       = 0b1010, /* Layer  0-15 */ +    ACT_LAYER_TAP_EXT   = 0b1011, /* Layer 16-31 */      /* Extensions */      ACT_MACRO           = 0b1100,      ACT_BACKLIGHT       = 0b1101, diff --git a/common/action_tapping.c b/common/action_tapping.c index 8b466079d..9b5512a8e 100644 --- a/common/action_tapping.c +++ b/common/action_tapping.c @@ -88,16 +88,16 @@ bool process_tapping(keyrecord_t *keyp)                      // first tap!                      debug("Tapping: First tap(0->1).\n");                      tapping_key.tap.count = 1; -                    tapping_key.tap.interrupted  = (waiting_buffer_has_anykey_pressed() ? true : false);                      debug_tapping_key();                      process_action(&tapping_key); -                    // enqueue +                    // copy tapping state                      keyp->tap = tapping_key.tap; +                    // enqueue                      return false;                  }  #if TAPPING_TERM >= 500 -                /* This can prevent from typing some tap keys in a row at a time. */ +                /* This can settle mod/fn state fast but may prevent from typing fast. */                  else if (!event.pressed && waiting_buffer_typed(event)) {                      // other key typed. not tap.                      debug("Tapping: End. No tap. Interfered by typing key\n"); @@ -110,7 +110,11 @@ bool process_tapping(keyrecord_t *keyp)                  }  #endif                  else { -                    // other key events shall be enq'd till tapping state settles. +                    // set interrupted flag when other key preesed during tapping +                    if (event.pressed) { +                        tapping_key.tap.interrupted = true; +                    } +                    // enqueue                       return false;                  }              } @@ -124,7 +128,7 @@ bool process_tapping(keyrecord_t *keyp)                      debug_tapping_key();                      return true;                  } -                else if (is_tap_key(keyp->event.key) && event.pressed) { +                else if (is_tap_key(event.key) && event.pressed) {                      if (tapping_key.tap.count > 1) {                          debug("Tapping: Start new tap with releasing last tap(>1).\n");                          // unregister key @@ -143,7 +147,7 @@ bool process_tapping(keyrecord_t *keyp)                      return true;                  }                  else { -                    if (!IS_NOEVENT(keyp->event)) { +                    if (!IS_NOEVENT(event)) {                          debug("Tapping: key event while last tap(>0).\n");                      }                      process_action(keyp); @@ -168,7 +172,7 @@ bool process_tapping(keyrecord_t *keyp)                      tapping_key = (keyrecord_t){};                      return true;                  } -                else if (is_tap_key(keyp->event.key) && event.pressed) { +                else if (is_tap_key(event.key) && event.pressed) {                      if (tapping_key.tap.count > 1) {                          debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");                          // unregister key @@ -187,7 +191,7 @@ bool process_tapping(keyrecord_t *keyp)                      return true;                  }                  else { -                    if (!IS_NOEVENT(keyp->event)) { +                    if (!IS_NOEVENT(event)) {                          debug("Tapping: key event while last timeout tap(>0).\n");                      }                      process_action(keyp); @@ -197,28 +201,43 @@ bool process_tapping(keyrecord_t *keyp)          }      } else if (IS_TAPPING_RELEASED()) {          if (WITHIN_TAPPING_TERM(event)) { -            if (tapping_key.tap.count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) { -                // sequential tap. -                keyp->tap = tapping_key.tap; -                keyp->tap.count += 1; -                debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n"); -                process_action(keyp); -                tapping_key = *keyp; -                debug_tapping_key(); -                return true; -            } else if (event.pressed && is_tap_key(event.key)) { -                // Sequential tap can be interfered with other tap key. -                debug("Tapping: Start with interfering other tap.\n"); -                tapping_key = *keyp; -                waiting_buffer_scan_tap(); -                debug_tapping_key(); -                return true; +            if (event.pressed) { +                if (IS_TAPPING_KEY(event.key)) { +                    if (!tapping_key.tap.interrupted && tapping_key.tap.count > 0) { +                        // sequential tap. +                        keyp->tap = tapping_key.tap; +                        keyp->tap.count += 1; +                        debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n"); +                        process_action(keyp); +                        tapping_key = *keyp; +                        debug_tapping_key(); +                        return true; +                    } else { +                        // FIX: start new tap again +                        tapping_key = *keyp; +                        return true; +                    } +                } else if (is_tap_key(event.key)) { +                    // Sequential tap can be interfered with other tap key. +                    debug("Tapping: Start with interfering other tap.\n"); +                    tapping_key = *keyp; +                    waiting_buffer_scan_tap(); +                    debug_tapping_key(); +                    return true; +                } else { +                    // should none in buffer +                    // FIX: interrupted when other key is pressed +                    tapping_key.tap.interrupted = true; +                    process_action(keyp); +                    return true; +                }              } else { -                if (!IS_NOEVENT(keyp->event)) debug("Tapping: other key just after tap.\n"); +                if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");                  process_action(keyp);                  return true;              }          } else { +            // FIX: process_aciton here?              // timeout. no sequential tap.              debug("Tapping: End(Timeout after releasing last tap): ");              debug_event(event); debug("\n"); @@ -227,7 +246,7 @@ bool process_tapping(keyrecord_t *keyp)              return false;          }      } -    // not tapping satate +    // not tapping state      else {          if (event.pressed && is_tap_key(event.key)) {              debug("Tapping: Start(Press tap key).\n"); | 
