@@ 19,6 19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H
#include "quantum.h"
+#include "os_detection.h"
// Home row mods
#define HR_A KC_A
@@ 26,7 27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define HR_D MT(MOD_LSFT, KC_D)
#define HR_F MT(MOD_LCTL, KC_F)
-#define HR_J MT(MOD_RCTL, KC_J)
+#define HR_J MT(MOD_LCTL, KC_J)
#define HR_K MT(MOD_RSFT, KC_K)
#define HR_L MT(MOD_RALT, KC_L)
#define HR_SCLN KC_SCLN
@@ 41,6 42,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
enum {
TD_UNDO,
+ TD_NAV,
};
// Combo for caps word
@@ 50,8 52,48 @@ combo_t key_combos[] = {
COMBO(capsword_combo, QK_CAPS_WORD_TOGGLE),
};
+// Advanced tap dance for bottom-left thumb key: hold = momentary layer 5, double tap = toggle layer 1
+typedef enum {
+ TD_NAV_NONE,
+ TD_NAV_SINGLE_HOLD,
+ TD_NAV_DOUBLE_TAP,
+} td_nav_state_t;
+
+static td_nav_state_t nav_tap_state = TD_NAV_NONE;
+
+td_nav_state_t nav_cur_dance(tap_dance_state_t *state) {
+ if (state->count == 1) {
+ return state->pressed ? TD_NAV_SINGLE_HOLD : TD_NAV_NONE;
+ } else if (state->count == 2) {
+ return TD_NAV_DOUBLE_TAP;
+ }
+ return TD_NAV_NONE;
+}
+
+void nav_finished(tap_dance_state_t *state, void *user_data) {
+ nav_tap_state = nav_cur_dance(state);
+ switch (nav_tap_state) {
+ case TD_NAV_SINGLE_HOLD:
+ layer_on(5);
+ break;
+ case TD_NAV_DOUBLE_TAP:
+ layer_invert(1);
+ break;
+ default:
+ break;
+ }
+}
+
+void nav_reset(tap_dance_state_t *state, void *user_data) {
+ if (nav_tap_state == TD_NAV_SINGLE_HOLD) {
+ layer_off(5);
+ }
+ nav_tap_state = TD_NAV_NONE;
+}
+
tap_dance_action_t tap_dance_actions[] = {
[TD_UNDO] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_EUNDO),
+ [TD_NAV] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, nav_finished, nav_reset),
};
// clang-format off
@@ 61,15 103,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , TD(TD_UNDO), KC_I , KC_O , KC_P ,
HR_A , HR_S , HR_D , HR_F , KC_G , KC_H , HR_J , HR_K , HR_L , HR_SCLN ,
KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH ,
- MO(5) , KC_TAB , KC_ESC , LT(3,KC_TAB), LT(4,KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(4,KC_SPC), _______, _______, _______, KC_QUOT
+ TD(TD_NAV), KC_TAB , KC_ESC , LT(3,KC_TAB), LT(4,KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(4,KC_SPC), _______, _______, _______, KC_QUOT
),
- // Transparent layer for HR_L GUI+N behavior
+ // Transparent layer for HR_L GUI+N behavior; GUI thumb keys become RCTL, RCTL home row mod becomes LCTL
[1] = LAYOUT_universal(
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , MT(MOD_LCTL, KC_J), _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
- _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
- _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______
+ _______ , _______ , _______ , _______ , _______ , KC_RCTL, MT(MOD_RCTL, KC_ENT), _______ , _______ , _______ , _______ , _______
),
// Gaming layer (removes home row mods via layer toggle)
@@ 135,6 177,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
+bool process_detected_host_os_user(os_variant_t detected_os) {
+ if (detected_os == OS_WINDOWS)
+ layer_on(1);
+ else
+ layer_off(1);
+ return true;
+}
+
bool caps_word_press_user(uint16_t keycode) {
switch (keycode) {
// Keycodes that continue Caps Word, with shift applied.