diff options
Diffstat (limited to 'keyboards/ergodox_ez/keymaps/algernon/keymap.c')
| -rw-r--r-- | keyboards/ergodox_ez/keymaps/algernon/keymap.c | 165 |
1 files changed, 138 insertions, 27 deletions
diff --git a/keyboards/ergodox_ez/keymaps/algernon/keymap.c b/keyboards/ergodox_ez/keymaps/algernon/keymap.c index 09d8dffd5..c12087292 100644 --- a/keyboards/ergodox_ez/keymaps/algernon/keymap.c +++ b/keyboards/ergodox_ez/keymaps/algernon/keymap.c | |||
| @@ -95,7 +95,9 @@ enum { | |||
| 95 | /* Custom keycodes */ | 95 | /* Custom keycodes */ |
| 96 | 96 | ||
| 97 | enum { | 97 | enum { |
| 98 | CT_CLN = 0 | 98 | CT_CLN = 0, |
| 99 | CT_MNS, | ||
| 100 | CT_TA, | ||
| 99 | }; | 101 | }; |
| 100 | 102 | ||
| 101 | /* States & timers */ | 103 | /* States & timers */ |
| @@ -115,7 +117,11 @@ uint16_t oh_left_blink_timer = 0; | |||
| 115 | uint8_t oh_right_blink = 0; | 117 | uint8_t oh_right_blink = 0; |
| 116 | uint16_t oh_right_blink_timer = 0; | 118 | uint16_t oh_right_blink_timer = 0; |
| 117 | 119 | ||
| 120 | #if KEYLOGGER_ENABLE | ||
| 118 | bool log_enable = false; | 121 | bool log_enable = false; |
| 122 | #endif | ||
| 123 | |||
| 124 | bool time_travel = false; | ||
| 119 | 125 | ||
| 120 | /* The Keymap */ | 126 | /* The Keymap */ |
| 121 | 127 | ||
| @@ -146,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 146 | // left hand | 152 | // left hand |
| 147 | KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) | 153 | KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) |
| 148 | ,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC | 154 | ,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC |
| 149 | ,LT(ARRW,KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I | 155 | ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I |
| 150 | ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN | 156 | ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN |
| 151 | ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) | 157 | ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) |
| 152 | 158 | ||
| @@ -155,11 +161,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 155 | ,KC_BSPC,F(F_SFT),M(A_ESC) | 161 | ,KC_BSPC,F(F_SFT),M(A_ESC) |
| 156 | 162 | ||
| 157 | // right hand | 163 | // right hand |
| 158 | ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 | 164 | ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 |
| 159 | ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS | 165 | ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS |
| 160 | ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL) | 166 | ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL |
| 161 | ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP | 167 | ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP |
| 162 | ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO | 168 | ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO |
| 163 | 169 | ||
| 164 | ,OSL(NMDIA),M(OH_LEFT) | 170 | ,OSL(NMDIA),M(OH_LEFT) |
| 165 | ,KC_LEAD | 171 | ,KC_LEAD |
| @@ -191,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 191 | // left hand | 197 | // left hand |
| 192 | KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) | 198 | KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) |
| 193 | ,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC | 199 | ,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC |
| 194 | ,LT(ARRW, KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U | 200 | ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U |
| 195 | ,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN | 201 | ,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN |
| 196 | ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) | 202 | ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) |
| 197 | 203 | ||
| @@ -200,11 +206,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 200 | ,KC_BSPC,F(F_SFT),M(A_ESC) | 206 | ,KC_BSPC,F(F_SFT),M(A_ESC) |
| 201 | 207 | ||
| 202 | // right hand | 208 | // right hand |
| 203 | ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 | 209 | ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 |
| 204 | ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS | 210 | ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS |
| 205 | ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL) | 211 | ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL |
| 206 | ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP | 212 | ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP |
| 207 | ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO | 213 | ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO |
| 208 | 214 | ||
| 209 | ,OSL(NMDIA),M(OH_LEFT) | 215 | ,OSL(NMDIA),M(OH_LEFT) |
| 210 | ,KC_LEAD | 216 | ,KC_LEAD |
| @@ -892,24 +898,92 @@ void ang_tap (uint16_t codes[]) { | |||
| 892 | register_code (code); \ | 898 | register_code (code); \ |
| 893 | unregister_code (code) | 899 | unregister_code (code) |
| 894 | 900 | ||
| 895 | void ang_tap_dance (qk_tap_dance_state_t *state) { | 901 | void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) { |
| 896 | switch (state->keycode) { | 902 | if (state->count == 1) { |
| 897 | case TD(CT_CLN): | 903 | register_code (KC_RSFT); |
| 898 | if (state->count == 1) { | 904 | register_code (KC_SCLN); |
| 899 | register_code (KC_RSFT); | 905 | } else if (state->count == 2) { |
| 900 | register_code (KC_SCLN); | 906 | register_code (KC_SCLN); |
| 901 | unregister_code (KC_SCLN); | 907 | } |
| 902 | unregister_code (KC_RSFT); | 908 | } |
| 903 | } else if (state->count == 2) { | 909 | |
| 904 | register_code (KC_SCLN); | 910 | void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) { |
| 905 | unregister_code (KC_SCLN); | 911 | if (state->count == 1) { |
| 906 | reset_tap_dance (state); | 912 | unregister_code (KC_SCLN); |
| 907 | } | 913 | unregister_code (KC_RSFT); |
| 914 | } else if (state->count == 2) { | ||
| 915 | unregister_code (KC_SCLN); | ||
| 908 | } | 916 | } |
| 909 | } | 917 | } |
| 910 | 918 | ||
| 919 | void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) { | ||
| 920 | if (state->count == 1) { | ||
| 921 | register_code (KC_MINS); | ||
| 922 | } else if (state->count == 2) { | ||
| 923 | register_code (KC_RSFT); | ||
| 924 | register_code (KC_MINS); | ||
| 925 | } | ||
| 926 | } | ||
| 927 | |||
| 928 | void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) { | ||
| 929 | if (state->count == 1) { | ||
| 930 | unregister_code (KC_MINS); | ||
| 931 | } else if (state->count == 2) { | ||
| 932 | unregister_code (KC_RSFT); | ||
| 933 | unregister_code (KC_MINS); | ||
| 934 | } | ||
| 935 | } | ||
| 936 | |||
| 937 | typedef struct { | ||
| 938 | bool layer_toggle; | ||
| 939 | bool sticky; | ||
| 940 | bool finished_once; | ||
| 941 | } td_ta_state_t; | ||
| 942 | |||
| 943 | void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) { | ||
| 944 | td_ta_state_t *td_ta = (td_ta_state_t *) user_data; | ||
| 945 | |||
| 946 | if (td_ta->finished_once) { | ||
| 947 | return; | ||
| 948 | } | ||
| 949 | |||
| 950 | if (td_ta->sticky) { | ||
| 951 | td_ta->sticky = false; | ||
| 952 | td_ta->layer_toggle = false; | ||
| 953 | layer_off (ARRW); | ||
| 954 | return; | ||
| 955 | } | ||
| 956 | |||
| 957 | td_ta->finished_once = true; | ||
| 958 | if (state->count == 1 && !state->pressed) { | ||
| 959 | register_code (KC_TAB); | ||
| 960 | td_ta->sticky = false; | ||
| 961 | td_ta->layer_toggle = false; | ||
| 962 | } else { | ||
| 963 | td_ta->layer_toggle = true; | ||
| 964 | layer_on (ARRW); | ||
| 965 | td_ta->sticky = (state->count == 2); | ||
| 966 | } | ||
| 967 | } | ||
| 968 | |||
| 969 | void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) { | ||
| 970 | td_ta_state_t *td_ta = (td_ta_state_t *) user_data; | ||
| 971 | |||
| 972 | if (!td_ta->layer_toggle) | ||
| 973 | unregister_code (KC_TAB); | ||
| 974 | if (!td_ta->sticky) | ||
| 975 | layer_off (ARRW); | ||
| 976 | |||
| 977 | td_ta->finished_once = false; | ||
| 978 | } | ||
| 979 | |||
| 911 | const qk_tap_dance_action_t tap_dance_actions[] = { | 980 | const qk_tap_dance_action_t tap_dance_actions[] = { |
| 912 | [CT_CLN] = ACTION_TAP_DANCE_FN (ang_tap_dance) | 981 | [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset) |
| 982 | ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset) | ||
| 983 | ,[CT_TA] = { | ||
| 984 | .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset }, | ||
| 985 | .user_data = (void *)&((td_ta_state_t) { false, false, false }) | ||
| 986 | } | ||
| 913 | }; | 987 | }; |
| 914 | 988 | ||
| 915 | // Runs constantly in the background, in a loop. | 989 | // Runs constantly in the background, in a loop. |
| @@ -1002,9 +1076,18 @@ void matrix_scan_user(void) { | |||
| 1002 | leading = false; | 1076 | leading = false; |
| 1003 | leader_end (); | 1077 | leader_end (); |
| 1004 | 1078 | ||
| 1079 | #if KEYLOGGER_ENABLE | ||
| 1005 | SEQ_ONE_KEY (KC_D) { | 1080 | SEQ_ONE_KEY (KC_D) { |
| 1081 | ergodox_led_all_on(); | ||
| 1082 | _delay_ms(100); | ||
| 1083 | ergodox_led_all_off(); | ||
| 1006 | log_enable = !log_enable; | 1084 | log_enable = !log_enable; |
| 1007 | } | 1085 | } |
| 1086 | #endif | ||
| 1087 | |||
| 1088 | SEQ_ONE_KEY (KC_T) { | ||
| 1089 | time_travel = !time_travel; | ||
| 1090 | } | ||
| 1008 | 1091 | ||
| 1009 | SEQ_ONE_KEY (KC_U) { | 1092 | SEQ_ONE_KEY (KC_U) { |
| 1010 | ang_do_unicode (); | 1093 | ang_do_unicode (); |
| @@ -1093,13 +1176,41 @@ void matrix_scan_user(void) { | |||
| 1093 | } | 1176 | } |
| 1094 | } | 1177 | } |
| 1095 | 1178 | ||
| 1179 | static uint16_t last4[4]; | ||
| 1180 | |||
| 1096 | bool process_record_user (uint16_t keycode, keyrecord_t *record) { | 1181 | bool process_record_user (uint16_t keycode, keyrecord_t *record) { |
| 1182 | #if KEYLOGGER_ENABLE | ||
| 1097 | uint8_t layer = biton32(layer_state); | 1183 | uint8_t layer = biton32(layer_state); |
| 1098 | 1184 | ||
| 1099 | if (log_enable && layer == BASE) { | 1185 | if (log_enable && layer == BASE) { |
| 1100 | xprintf ("KL: col=%d, row=%d\n", record->event.key.col, | 1186 | xprintf ("KL: col=%d, row=%d\n", record->event.key.col, |
| 1101 | record->event.key.row); | 1187 | record->event.key.row); |
| 1102 | } | 1188 | } |
| 1189 | #endif | ||
| 1190 | |||
| 1191 | if (time_travel && !record->event.pressed) { | ||
| 1192 | uint8_t p; | ||
| 1193 | |||
| 1194 | // shift cache one to the left | ||
| 1195 | for (p = 0; p < 3; p++) { | ||
| 1196 | last4[p] = last4[p + 1]; | ||
| 1197 | } | ||
| 1198 | last4[3] = keycode; | ||
| 1199 | |||
| 1200 | if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) { | ||
| 1201 | uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0}; | ||
| 1202 | ang_tap (codes); | ||
| 1203 | register_code (KC_RSFT); | ||
| 1204 | register_code (KC_EQL); | ||
| 1205 | unregister_code (KC_EQL); | ||
| 1206 | unregister_code (KC_RSFT); | ||
| 1207 | |||
| 1208 | uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0}; | ||
| 1209 | ang_tap (codes2); | ||
| 1210 | |||
| 1211 | return false; | ||
| 1212 | } | ||
| 1213 | } | ||
| 1103 | 1214 | ||
| 1104 | return true; | 1215 | return true; |
| 1105 | } | 1216 | } |
