]> git.donarmstrong.com Git - qmk_firmware.git/blob - users/edvorakjp/edvorakjp_process_record.c
Keymap: Refactor edvorakjp user library (#4480)
[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 and right hand's right side
41     case KC_X:
42     case KC_C:
43     case KC_V:
44     case KC_Z:
45     case KC_Y:
46     case KC_P:
47     case KC_W:
48     case KC_Q:
49     case KC_S:
50     case KC_M:
51     case KC_K:
52     case KC_L:
53       if (record->event.pressed) {
54         layer_on(_EDVORAKJ2);
55       }
56       return true;
57   }
58
59   // vowel keys, symbol keys and modifier keys
60   if (record->event.pressed) {
61     dvorakj_layer_off();
62   }
63   switch (keycode) {
64     // combination vowel keys
65     case KC_AI:
66       if (record->event.pressed) {
67         SEND_STRING("ai");
68       }
69       return false;
70     case KC_OU:
71       if (record->event.pressed) {
72         SEND_STRING("ou");
73       }
74       return false;
75     case KC_EI:
76       if (record->event.pressed) {
77         SEND_STRING("ei");
78       }
79       return false;
80     case KC_ANN:
81       if (record->event.pressed) {
82         SEND_STRING("ann");
83       }
84       return false;
85     case KC_ONN:
86       if (record->event.pressed) {
87         SEND_STRING("onn");
88       }
89       return false;
90     case KC_ENN:
91       if (record->event.pressed) {
92         SEND_STRING("enn");
93       }
94       return false;
95     case KC_INN:
96       if (record->event.pressed) {
97         SEND_STRING("inn");
98       }
99       return false;
100     case KC_UNN:
101       if (record->event.pressed) {
102         SEND_STRING("unn");
103       }
104       return false;
105   }
106   // AOEIU and other (symbol, modifier) keys
107   return true;
108 }
109
110 bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) {
111 #ifdef SWAP_SCLN
112   static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT);
113   static uint8_t last_mods_status;
114   if (keycode == KC_SCLN) {
115     if (record->event.pressed) {
116       last_mods_status = get_mods();
117
118       // invert shift_bits
119       if (last_mods_status & shift_bits) {
120         set_mods(last_mods_status & ~shift_bits);
121       } else {
122         set_mods(last_mods_status | MOD_BIT(KC_LSFT));
123       }
124     } else {
125       set_mods(last_mods_status);
126       last_mods_status = 0;
127     }
128   }
129 #endif
130   return true;
131 }
132
133 bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
134   switch (keycode) {
135     case KC_MAC:
136     case KC_WIN:
137       if (record->event.pressed) {
138         set_enable_kc_lang(keycode == KC_MAC);
139       }
140       return false;
141     case KC_EXTON:
142     case KC_EXTOFF:
143       if (record->event.pressed) {
144         set_enable_jp_extra_layer(keycode == KC_EXTON);
145       }
146       return false;
147   }
148   return true;
149 }
150
151 bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
152   switch (keycode) {
153     case EDVORAK:
154       if (record->event.pressed) {
155         set_single_persistent_default_layer(_EDVORAK);
156       }
157       return false;
158     case QWERTY:
159       if (record->event.pressed) {
160         dvorakj_layer_off();
161         set_single_persistent_default_layer(_QWERTY);
162       }
163       return false;
164 #if TAP_DANCE_ENABLE != yes
165     case LOWER:
166       if (record->event.pressed) {
167         layer_on(_LOWER);
168         time_on_pressed = record->event.time;
169       } else {
170         layer_off(_LOWER);
171
172         if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
173           set_japanese_mode(false);
174         }
175         time_on_pressed = 0;
176       }
177       return false;
178     case RAISE:
179       if (record->event.pressed) {
180         layer_on(_RAISE);
181         time_on_pressed = record->event.time;
182       } else {
183         layer_off(_RAISE);
184
185         if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
186           set_japanese_mode(true);
187         }
188         time_on_pressed = 0;
189       }
190       return false;
191 #endif
192   }
193   return true;
194 }
195
196 bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
197   switch (keycode) {
198     case KC_JPN:
199     case KC_ENG:
200       if (record->event.pressed) {
201         set_japanese_mode(keycode == KC_JPN);
202       }
203       return false;
204   }
205   return true;
206 }