]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/mt980/keymaps/walker/keymap.c
Update KBD67 readme so that it mentions the KBD65 PCB (#5143)
[qmk_firmware.git] / keyboards / mt980 / keymaps / walker / keymap.c
1 #include "mt980.h"
2
3 bool numlock_on = true;
4
5 typedef struct {
6   bool is_press_action;
7   int state;
8 } tap;
9
10 enum {
11   SINGLE_TAP = 1,
12   SINGLE_HOLD = 2,
13   DOUBLE_TAP = 3,
14   DOUBLE_HOLD = 4,
15   TRIPLE_TAP = 5,
16   TRIPLE_HOLD = 6
17 };
18
19 enum {
20   ALT_L1 = 0
21 };
22
23 int cur_dance (qk_tap_dance_state_t *state);
24 void alt_finished (qk_tap_dance_state_t *state, void *user_data);
25 void alt_reset (qk_tap_dance_state_t *state, void *user_data);
26
27 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
28
29   [0] = LAYOUT(
30     KC_ESC,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_NO,              KC_INS,   KC_PSCR,  KC_PGUP,  KC_PGDN, 
31     KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_BSPC,  KC_NLCK,  KC_PSLS,  KC_PAST,  KC_PMNS,
32     KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,            KC_P7,    KC_P8,    KC_P9,    KC_PPLS,
33     KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,  KC_ENT,                       KC_P4,    KC_P5,    KC_P6,    KC_PPLS,
34     KC_LSFT,  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,  KC_UP,              KC_P1,    KC_P2,    KC_P3,    KC_PENT,
35     KC_LCTL,  KC_LGUI,  TD(ALT_L1),                   KC_SPC,                                 KC_RALT,  MO(1),    KC_RCTL,  KC_LEFT,  KC_DOWN,  KC_RGHT,            KC_P0,    KC_PDOT,  KC_PENT),
36
37   [1] = LAYOUT(
38     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_PAUSE, KC_SLCK,  KC_HOME,  KC_END,   
39     KC_TRNS,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   RGB_TOG,  RESET,    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   
40     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   
41     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                      KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   
42     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_VAI,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   
43     KC_TRNS,  KC_TRNS,  KC_TRNS,                      RESET,                                  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_RMOD, RGB_VAD,  RGB_MOD,            KC_TRNS,  KC_TRNS,  KC_TRNS)  
44
45 };
46
47 int cur_dance (qk_tap_dance_state_t *state) {
48   if (state->count == 1) {
49     if (state->pressed) return SINGLE_HOLD;
50     else return SINGLE_TAP;
51   }
52   else if (state->count == 2) {
53     if (state->pressed) return DOUBLE_HOLD;
54     else return DOUBLE_TAP;
55   }
56   else if (state->count == 3) {
57     if (state->interrupted || !state->pressed)  return TRIPLE_TAP;
58     else return TRIPLE_HOLD;
59   }
60   else return 8;
61 }
62
63 static tap alttap_state = {
64   .is_press_action = true,
65   .state = 0
66 };
67
68 void alt_finished (qk_tap_dance_state_t *state, void *user_data) {
69   alttap_state.state = cur_dance(state);
70   switch (alttap_state.state) {
71     case SINGLE_TAP: set_oneshot_layer(1, ONESHOT_START); clear_oneshot_layer_state(ONESHOT_PRESSED); break;
72     case SINGLE_HOLD: register_code(KC_LALT); break;
73     case DOUBLE_TAP: set_oneshot_layer(1, ONESHOT_START); set_oneshot_layer(1, ONESHOT_PRESSED); break;
74     case DOUBLE_HOLD: register_code(KC_LALT); layer_on(1); break;
75   }
76 }
77
78 void alt_reset (qk_tap_dance_state_t *state, void *user_data) {
79   switch (alttap_state.state) {
80     case SINGLE_TAP: break;
81     case SINGLE_HOLD: unregister_code(KC_LALT); break;
82     case DOUBLE_TAP: break;
83     case DOUBLE_HOLD: layer_off(1); unregister_code(KC_LALT); break;
84   }
85   alttap_state.state = 0;
86 }
87
88 qk_tap_dance_action_t tap_dance_actions[] = {
89   [ALT_L1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,alt_finished, alt_reset)
90 };
91
92 void led_set_keymap(uint8_t usb_led) {
93   if (usb_led & (1<<USB_LED_NUM_LOCK)) {
94     numlock_on = true;
95   }
96   else {
97     numlock_on = false;
98   }
99 }
100
101 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
102
103   switch (keycode) {
104     case KC_TRNS:
105     case KC_NO:
106       /* Always cancel one-shot layer when another key gets pressed */
107       if (record->event.pressed && is_oneshot_layer_active())
108       clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
109       return true;
110     case RESET:
111       /* Don't allow reset from oneshot layer state */
112       if (record->event.pressed && is_oneshot_layer_active()) {
113         clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
114         return false;
115       }
116       return true;
117     case KC_PPLS:
118       if (!numlock_on) {
119         if (is_oneshot_layer_active() || layer_state & 0x2) {
120           if (record->event.pressed)
121             register_code(KC_HOME);
122           else
123             unregister_code(KC_HOME);
124           clear_oneshot_layer_state(ONESHOT_START);
125         }
126         else {
127           if (record->event.pressed)
128             register_code(KC_PGUP);
129           else
130             unregister_code(KC_PGUP);
131         }
132         return false;
133       }
134       return true;
135     case KC_PENT:
136       if (!numlock_on) {
137         if (is_oneshot_layer_active() || layer_state & 0x2) {
138           if (record->event.pressed)
139             register_code(KC_END);
140           else
141             unregister_code(KC_END);
142           clear_oneshot_layer_state(ONESHOT_START);
143         }
144         else {
145           if (record->event.pressed)
146             register_code(KC_PGDN);
147           else
148             unregister_code(KC_PGDN);
149         }
150         return false;
151       }
152       return true;
153     case KC_NLCK:
154       /* Shift + NumLock will be treated as shift-Insert */
155       if ((keyboard_report->mods & MOD_BIT (KC_LSFT)) || (keyboard_report->mods & MOD_BIT (KC_RSFT))) {
156         if (record->event.pressed) {
157           register_code(KC_INS);
158           unregister_code(KC_INS);
159         }
160         return false;
161       }
162       else
163         return true;
164     default:
165       return true;
166   }
167   return true;
168 }