]> git.donarmstrong.com Git - qmk_firmware.git/blob - users/edvorakjp/edvorakjp_process_record.c
Update keyboards/kbdfans/kbd67/readme.md
[qmk_firmware.git] / users / edvorakjp / edvorakjp_process_record.c
1 #include "edvorakjp.h"
2
3 #if TAP_DANCE_ENABLE != yes
4 static uint16_t time_on_pressed;
5 #endif
6 /*
7  * Each process_record_* methods defined here are
8  * return false if handle edvorak_keycodes, or return true others.
9  */
10 bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) {
11   if (!(default_layer_state == 1UL<<_EDVORAK &&
12         get_enable_jp_extra_layer() && get_japanese_mode())) {
13     return true;
14   }
15
16   // consonant keys
17   // layer_on(J1) or layer_on(J2) are defined based on key positions.
18   switch (keycode) {
19     // right hand's left side w/o N
20     case KC_F:
21     case KC_G:
22     case KC_R:
23     case KC_D:
24     case KC_T:
25     case KC_B:
26     case KC_H:
27     case KC_J:
28       if (record->event.pressed) {
29         layer_on(_EDVORAKJ1);
30       }
31       return true;
32
33     // N: toggle layer
34     case KC_N:
35       if (record->event.pressed) {
36         biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off();
37       }
38       return true;
39
40     // left hand up and right hand's right side
41     case KC_Y:
42     case KC_P:
43     case KC_W:
44     case KC_Q:
45     case KC_S:
46     case KC_M:
47     case KC_K:
48     case KC_L:
49       if (record->event.pressed) {
50         layer_on(_EDVORAKJ2);
51       }
52       return true;
53     // left hand down
54     // If return true, QMK sends keycode in new layer,
55     // but these keys are only available in old layer.
56     case KC_X:
57     case KC_C:
58     case KC_V:
59     case KC_Z:
60       if (record->event.pressed) {
61         layer_on(_EDVORAKJ2);
62         tap_code(keycode);
63       }
64       return false;
65   }
66
67   // vowel keys, symbol keys and modifier keys
68   if (record->event.pressed) {
69     dvorakj_layer_off();
70   }
71   switch (keycode) {
72     // combination vowel keys
73     case KC_AI:
74       if (record->event.pressed) {
75         SEND_STRING("ai");
76       }
77       return false;
78     case KC_OU:
79       if (record->event.pressed) {
80         SEND_STRING("ou");
81       }
82       return false;
83     case KC_EI:
84       if (record->event.pressed) {
85         SEND_STRING("ei");
86       }
87       return false;
88     case KC_ANN:
89       if (record->event.pressed) {
90         SEND_STRING("ann");
91       }
92       return false;
93     case KC_ONN:
94       if (record->event.pressed) {
95         SEND_STRING("onn");
96       }
97       return false;
98     case KC_ENN:
99       if (record->event.pressed) {
100         SEND_STRING("enn");
101       }
102       return false;
103     case KC_INN:
104       if (record->event.pressed) {
105         SEND_STRING("inn");
106       }
107       return false;
108     case KC_UNN:
109       if (record->event.pressed) {
110         SEND_STRING("unn");
111       }
112       return false;
113   }
114   // AOEIU and other (symbol, modifier) keys
115   return true;
116 }
117
118 bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) {
119 #ifdef SWAP_SCLN
120   static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT);
121   static uint8_t last_mods_status;
122   if (keycode == KC_SCLN) {
123     if (record->event.pressed) {
124       last_mods_status = get_mods();
125
126       // invert shift_bits
127       if (last_mods_status & shift_bits) {
128         set_mods(last_mods_status & ~shift_bits);
129       } else {
130         set_mods(last_mods_status | MOD_BIT(KC_LSFT));
131       }
132     } else {
133       set_mods(last_mods_status);
134       last_mods_status = 0;
135     }
136   }
137 #endif
138   return true;
139 }
140
141 bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
142   switch (keycode) {
143     case KC_MAC:
144     case KC_WIN:
145       if (record->event.pressed) {
146         set_enable_kc_lang(keycode == KC_MAC);
147       }
148       return false;
149     case KC_EXTON:
150     case KC_EXTOFF:
151       if (record->event.pressed) {
152         set_enable_jp_extra_layer(keycode == KC_EXTON);
153       }
154       return false;
155   }
156   return true;
157 }
158
159 bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
160   switch (keycode) {
161     case EDVORAK:
162       if (record->event.pressed) {
163         set_single_persistent_default_layer(_EDVORAK);
164       }
165       return false;
166     case QWERTY:
167       if (record->event.pressed) {
168         dvorakj_layer_off();
169         set_single_persistent_default_layer(_QWERTY);
170       }
171       return false;
172 #if TAP_DANCE_ENABLE != yes
173     case LOWER:
174       if (record->event.pressed) {
175         layer_on(_LOWER);
176         time_on_pressed = record->event.time;
177       } else {
178         layer_off(_LOWER);
179
180         if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
181           set_japanese_mode(false);
182         }
183         time_on_pressed = 0;
184       }
185       return false;
186     case RAISE:
187       if (record->event.pressed) {
188         layer_on(_RAISE);
189         time_on_pressed = record->event.time;
190       } else {
191         layer_off(_RAISE);
192
193         if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
194           set_japanese_mode(true);
195         }
196         time_on_pressed = 0;
197       }
198       return false;
199 #endif
200   }
201   return true;
202 }
203
204 bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
205   switch (keycode) {
206     case KC_JPN:
207     case KC_ENG:
208       if (record->event.pressed) {
209         set_japanese_mode(keycode == KC_JPN);
210       }
211       return false;
212   }
213   return true;
214 }