qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

process_repeat_key.c (3673B)


      1 // Copyright 2022-2023 Google LLC
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     https://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #include "process_repeat_key.h"
     16 #include "repeat_key.h"
     17 #include "keycodes.h"
     18 #include "quantum_keycodes.h"
     19 #include "action_util.h"
     20 
     21 // Default implementation of remember_last_key_user().
     22 __attribute__((weak)) bool remember_last_key_user(uint16_t keycode, keyrecord_t* record, uint8_t* remembered_mods) {
     23     return true;
     24 }
     25 
     26 static bool remember_last_key(uint16_t keycode, keyrecord_t* record, uint8_t* remembered_mods) {
     27     switch (keycode) {
     28         // Ignore MO, TO, TG, TT, and TL layer switch keys.
     29         case QK_MOMENTARY ... QK_MOMENTARY_MAX:
     30         case QK_TO ... QK_TO_MAX:
     31         case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
     32         case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
     33         // Ignore mod keys.
     34         case KC_LCTL ... KC_RGUI:
     35         case KC_HYPR:
     36         case KC_MEH:
     37 #ifndef NO_ACTION_ONESHOT // Ignore one-shot keys.
     38         case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
     39         case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
     40 #endif                  // NO_ACTION_ONESHOT
     41 #ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys.
     42         case QK_TRI_LAYER_LOWER:
     43         case QK_TRI_LAYER_UPPER:
     44 #endif                   // TRI_LAYER_ENABLE
     45 #ifdef LAYER_LOCK_ENABLE // Ignore Layer Lock key.
     46         case QK_LAYER_LOCK:
     47 #endif // LAYER_LOCK_ENABLE
     48             return false;
     49 
     50             // Ignore hold events on tap-hold keys.
     51 #ifndef NO_ACTION_TAPPING
     52         case QK_MOD_TAP ... QK_MOD_TAP_MAX:
     53 #    ifndef NO_ACTION_LAYER
     54         case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
     55 #    endif // NO_ACTION_LAYER
     56             if (record->tap.count == 0) {
     57                 return false;
     58             }
     59             break;
     60 #endif // NO_ACTION_TAPPING
     61 
     62 #ifdef SWAP_HANDS_ENABLE
     63         case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
     64             if (IS_SWAP_HANDS_KEYCODE(keycode) || record->tap.count == 0) {
     65                 return false;
     66             }
     67             break;
     68 #endif // SWAP_HANDS_ENABLE
     69 
     70         case QK_REPEAT_KEY:
     71 #ifndef NO_ALT_REPEAT_KEY
     72         case QK_ALT_REPEAT_KEY:
     73 #endif // NO_ALT_REPEAT_KEY
     74             return false;
     75     }
     76 
     77     return remember_last_key_user(keycode, record, remembered_mods);
     78 }
     79 
     80 bool process_last_key(uint16_t keycode, keyrecord_t* record) {
     81     if (get_repeat_key_count()) {
     82         return true;
     83     }
     84 
     85     if (record->event.pressed) {
     86         uint8_t remembered_mods = get_mods() | get_weak_mods();
     87 #ifndef NO_ACTION_ONESHOT
     88         remembered_mods |= get_oneshot_mods();
     89 #endif // NO_ACTION_ONESHOT
     90 
     91         if (remember_last_key(keycode, record, &remembered_mods)) {
     92             set_last_record(keycode, record);
     93             set_last_mods(remembered_mods);
     94         }
     95     }
     96 
     97     return true;
     98 }
     99 
    100 bool process_repeat_key(uint16_t keycode, keyrecord_t* record) {
    101     if (get_repeat_key_count()) {
    102         return true;
    103     }
    104 
    105     if (keycode == QK_REPEAT_KEY) {
    106         repeat_key_invoke(&record->event);
    107         return false;
    108 #ifndef NO_ALT_REPEAT_KEY
    109     } else if (keycode == QK_ALT_REPEAT_KEY) {
    110         alt_repeat_key_invoke(&record->event);
    111         return false;
    112 #endif // NO_ALT_REPEAT_KEY
    113     }
    114 
    115     return true;
    116 }