aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2013-01-09 22:33:33 +0900
committertmk <nobody@nowhere>2013-01-09 22:33:33 +0900
commit411de9cc22e927313a5a768f3bf41f2f99bca126 (patch)
treecff699c11ec293df8375566e7a3d186712e72e74
parent4324e163360db4c6ebd25cab74d09d42b3021278 (diff)
downloadqmk_firmware-411de9cc22e927313a5a768f3bf41f2f99bca126.tar.gz
qmk_firmware-411de9cc22e927313a5a768f3bf41f2f99bca126.zip
Add new layer actions.
-rw-r--r--common/action.c394
-rw-r--r--common/action.h152
-rw-r--r--common/keyboard.c5
-rw-r--r--common/keyboard.h8
-rw-r--r--common/keymap.h1
-rw-r--r--keyboard/hhkb/keymap.c78
6 files changed, 323 insertions, 315 deletions
diff --git a/common/action.c b/common/action.c
index 45e2276e7..425a2b00f 100644
--- a/common/action.c
+++ b/common/action.c
@@ -1,6 +1,6 @@
1#include "host.h" 1#include "host.h"
2#include "timer.h" 2#include "timer.h"
3//#include "keymap.h" 3#include "keymap.h"
4#include "keycode.h" 4#include "keycode.h"
5#include "keyboard.h" 5#include "keyboard.h"
6#include "mousekey.h" 6#include "mousekey.h"
@@ -78,8 +78,6 @@ typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
78 78
79static kbdstate_t kbdstate = IDLE; 79static kbdstate_t kbdstate = IDLE;
80static uint8_t fn_state_bits = 0; 80static uint8_t fn_state_bits = 0;
81static keyrecord_t delayed_fn = {};
82static keyrecord_t waiting_key = {};
83 81
84static const char *state_str(kbdstate_t state) 82static const char *state_str(kbdstate_t state)
85{ 83{
@@ -96,17 +94,6 @@ static bool anykey_sent_to_host(void)
96} 94}
97 95
98 96
99
100/*
101static void layer_switch_on(uint8_t code);
102static void layer_switch_off(uint8_t code);
103static void key_action(uint8_t code, keyevent_t event);
104static void key_pressed(uint8_t code, keyevent_t event);
105static void key_released(uint8_t code, keyevent_t event);
106static void mod_pressed(uint8_t code, keyevent_t event);
107static void mod_released(uint8_t code, keyevent_t event);
108*/
109
110static void register_code(uint8_t code); 97static void register_code(uint8_t code);
111static void unregister_code(uint8_t code); 98static void unregister_code(uint8_t code);
112static void register_mods(uint8_t mods); 99static void register_mods(uint8_t mods);
@@ -118,6 +105,7 @@ static void layer_switch(uint8_t new_layer);
118 105
119/* tap */ 106/* tap */
120#define TAP_TIME 200 107#define TAP_TIME 200
108#define LAYER_DELAY 200
121static keyevent_t last_event = {}; 109static keyevent_t last_event = {};
122static uint16_t last_event_time = 0; 110static uint16_t last_event_time = 0;
123static uint8_t tap_count = 0; 111static uint8_t tap_count = 0;
@@ -125,10 +113,10 @@ static uint8_t tap_count = 0;
125/* layer */ 113/* layer */
126uint8_t default_layer = 0; 114uint8_t default_layer = 0;
127uint8_t current_layer = 0; 115uint8_t current_layer = 0;
128uint8_t waiting_layer = 0; 116keyrecord_t delaying_layer = {};
129 117
130 118
131void action_exec(action_t action, keyevent_t event) 119void action_exec(keyevent_t event)
132{ 120{
133 /* count tap when key is up */ 121 /* count tap when key is up */
134 if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) { 122 if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) {
@@ -137,6 +125,20 @@ void action_exec(action_t action, keyevent_t event)
137 tap_count = 0; 125 tap_count = 0;
138 } 126 }
139 127
128 /* layer switch after LAYER_DELAY */
129 if (delaying_layer.action.code && timer_elapsed(delaying_layer.event.time) > LAYER_DELAY) {
130 switch (delaying_layer.action.kind.id) {
131 case ACT_LAYER_PRESSED:
132 layer_switch(delaying_layer.action.layer.opt);
133 break;
134 case ACT_LAYER_BIT:
135 layer_switch(current_layer | delaying_layer.action.layer.opt);
136 break;
137 }
138 delaying_layer = (keyrecord_t){};
139 }
140 action_t action = keymap_get_action(current_layer, event.key.row, event.key.col);
141
140 debug("action: "); debug_hex16(action.code); debug("\n"); 142 debug("action: "); debug_hex16(action.code); debug("\n");
141 debug("kind.id: "); debug_hex(action.kind.id); debug("\n"); 143 debug("kind.id: "); debug_hex(action.kind.id); debug("\n");
142 debug("kind.param: "); debug_hex16(action.kind.param); debug("\n"); 144 debug("kind.param: "); debug_hex16(action.kind.param); debug("\n");
@@ -145,6 +147,7 @@ void action_exec(action_t action, keyevent_t event)
145 147
146 switch (action.kind.id) { 148 switch (action.kind.id) {
147 case ACT_LMODS: 149 case ACT_LMODS:
150 // normal key or key plus mods
148 if (event.pressed) { 151 if (event.pressed) {
149 register_mods(action.key.mods); 152 register_mods(action.key.mods);
150 register_code(action.key.code); 153 register_code(action.key.code);
@@ -162,94 +165,207 @@ void action_exec(action_t action, keyevent_t event)
162 unregister_mods(action.key.mods<<4); 165 unregister_mods(action.key.mods<<4);
163 } 166 }
164 break; 167 break;
165 case ACT_LAYER: 168 case ACT_LMOD_TAP:
166 switch (action.layer_key.code) { 169 break;
167 case 0x00: // Momentary switch 170 case ACT_RMOD_TAP:
168 // TODO: history of layer switch 171 break;
172 case ACT_USAGE:
173#ifdef EXTRAKEY_ENABLE
174 switch (action.usage.page) {
175 case ACTION_USAGE_PAGE_SYSTEM:
169 if (event.pressed) { 176 if (event.pressed) {
170 layer_switch(action.layer_key.layer); 177 host_system_send(action.usage.code);
171 } else { 178 } else {
172 layer_switch(default_layer); 179 host_system_send(0);
173 } 180 }
174 break; 181 break;
175 case 0x01: // Oneshot switch 182 case ACTION_USAGE_PAGE_CONSUMER:
176 // TODO: 183 if (event.pressed) {
184 host_consumer_send(action.usage.code);
185 } else {
186 host_consumer_send(0);
187 }
177 break; 188 break;
178 case 0x02: // reserved 189 }
179 case 0x03: // reserved 190#endif
191 break;
192 case ACT_MOUSEKEY:
193#ifdef MOUSEKEY_ENABLE
194 if (event.pressed) {
195 mousekey_on(action.key.code);
196 mousekey_send();
197 } else {
198 mousekey_off(action.key.code);
199 mousekey_send();
200 }
201#endif
202 break;
203 case ACT_LAYER_PRESSED:
204 // layer action when pressed
205 switch (action.layer.code) {
206 case 0x00:
207 if (event.pressed) {
208 layer_switch(action.layer.opt);
209 }
180 break; 210 break;
181 case 0xF0 ... 0xF7: // Tap to enable/disable 211 case 0xF0:
182 case 0xF8 ... 0xFF: // Tap to toggle layer 212 // TODO: tap toggle
183 // TODO:
184 break; 213 break;
185 default: // with keycode for tap 214 case 0xFF:
215 if (event.pressed) {
216 default_layer = action.layer.opt;
217 layer_switch(default_layer);
218 }
219 break;
220 default:
221 // with tap key
186 debug("tap: "); debug_hex(tap_count); debug("\n"); 222 debug("tap: "); debug_hex(tap_count); debug("\n");
187 // TODO: layer switch
188 // TODO: in case tap is interrupted by other key
189
190
191 if (event.pressed) { 223 if (event.pressed) {
192 // when any key down
193 if (host_has_anykey()) {
194 if (tap_count == 0)
195 register_code(action.layer_key.code);
196 } else {
197 }
198
199 if (tap_count == 0) { 224 if (tap_count == 0) {
200 if (host_has_anykey()) { 225 if (host_has_anykey()) {
201 register_code(action.layer_key.code); 226 register_code(action.layer.code);
202 } else { 227 } else {
203 waiting_layer = action.layer_key.layer; 228 delaying_layer = (keyrecord_t){
229 .event = event,
230 .action = action,
231 .mods = keyboard_report->mods
232 };
204 } 233 }
205 } 234 } else if (tap_count > 0) {
206 // register key when press after a tap 235 register_code(action.layer.code);
207 if (tap_count > 0) {
208 register_code(action.layer_key.code);
209 } 236 }
210 } else { 237 } else {
211 // type key after tap 238 // type key after tap
212 if (tap_count == 1) { 239 if (tap_count == 1) {
213 register_code(action.layer_key.code); 240 delaying_layer = (keyrecord_t){};
241 register_code(action.layer.code);
214 } 242 }
215 unregister_code(action.layer_key.code); 243 unregister_code(action.layer.code);
216 } 244 }
217 break; 245 break;
218 } 246 }
219 break; 247 break;
220 case ACT_USAGE: 248 case ACT_LAYER_RELEASED:
221#ifdef EXTRAKEY_ENABLE 249 switch (action.layer.code) {
222 switch (action.usage.page) { 250 case 0x00:
223 case ACTION_USAGE_PAGE_SYSTEM:
224 if (event.pressed) { 251 if (event.pressed) {
225 host_system_send(action.usage.code); 252 layer_switch(action.layer.opt);
253 }
254 break;
255 case 0xF0:
256 // Ignored. LAYER_RELEASED with tap toggle is invalid action.
257 break;
258 case 0xFF:
259 if (!event.pressed) {
260 default_layer = action.layer.opt;
261 layer_switch(default_layer);
262 }
263 break;
264 default:
265 // Ignored. LAYER_RELEASED with tap key is invalid action.
266 break;
267 }
268 break;
269 case ACT_LAYER_BIT:
270 switch (action.layer.code) {
271 case 0x00:
272 if (event.pressed) {
273 layer_switch(current_layer | action.layer.opt);
226 } else { 274 } else {
227 host_system_send(0); 275 layer_switch(current_layer & ~action.layer.opt);
228 } 276 }
229 break; 277 break;
230 case ACTION_USAGE_PAGE_CONSUMER: 278 case 0xF0:
279 // TODO: tap toggle
280 break;
281 case 0xFF:
282 // change default layer
231 if (event.pressed) { 283 if (event.pressed) {
232 host_consumer_send(action.usage.code); 284 default_layer = current_layer | action.layer.opt;
285 layer_switch(default_layer);
233 } else { 286 } else {
234 host_consumer_send(0); 287 default_layer = current_layer & ~action.layer.opt;
288 layer_switch(default_layer);
289 }
290 break;
291 default:
292 // with tap key
293 debug("tap: "); debug_hex(tap_count); debug("\n");
294 if (event.pressed) {
295 if (tap_count == 0) {
296 if (host_has_anykey()) {
297 register_code(action.layer.code);
298 } else {
299 delaying_layer = (keyrecord_t){
300 .event = event,
301 .action = action,
302 .mods = keyboard_report->mods
303 };
304 }
305 } else if (tap_count > 0) {
306 register_code(action.layer.code);
307 }
308 } else {
309 if (tap_count == 0) {
310 // no tap
311 layer_switch(current_layer & ~action.layer.opt);
312 } else if (tap_count == 1) {
313 // tap
314 register_code(action.layer.code);
315 }
316 unregister_code(action.layer.code);
235 } 317 }
236 break; 318 break;
237 } 319 }
238#endif 320 case ACT_LAYER_EXT:
239 break; 321 switch (action.layer.opt) {
240 case ACT_MOUSEKEY: 322 case 0x00:
241#ifdef MOUSEKEY_ENABLE 323 // set default layer when pressed
242 if (event.pressed) { 324 switch (action.layer.code) {
243 mousekey_on(action.key.code); 325 case 0x00:
244 mousekey_send(); 326 if (event.pressed) {
245 } else { 327 layer_switch(default_layer);
246 mousekey_off(action.key.code); 328 }
247 mousekey_send(); 329 break;
330 case 0xF0:
331 // TODO: tap toggle
332 break;
333 case 0xFF:
334 if (event.pressed) {
335 default_layer = current_layer;
336 layer_switch(default_layer);
337 }
338 break;
339 default:
340 // TODO: tap key
341 break;
342 }
343 break;
344 case 0x01:
345 // set default layer when released
346 switch (action.layer.code) {
347 case 0x00:
348 if (!event.pressed) {
349 layer_switch(default_layer);
350 }
351 break;
352 case 0xFF:
353 if (!event.pressed) {
354 default_layer = current_layer;
355 layer_switch(default_layer);
356 }
357 break;
358 case 0xF0:
359 default:
360 // Ignore tap.
361 if (!event.pressed) {
362 layer_switch(default_layer);
363 }
364 break;
365 }
366 break;
248 } 367 }
249#endif
250 break; 368 break;
251 case ACT_LMOD_TAP:
252 case ACT_RMOD_TAP:
253 case ACT_MACRO: 369 case ACT_MACRO:
254 case ACT_COMMAND: 370 case ACT_COMMAND:
255 case ACT_FUNCTION: 371 case ACT_FUNCTION:
@@ -263,142 +379,6 @@ void action_exec(action_t action, keyevent_t event)
263} 379}
264 380
265 381
266#if 0
267/* Key Action */
268inline
269static void key_action(uint8_t code, keyevent_t event)
270{
271 if (event.pressed)
272 key_pressed(code, event);
273 else
274 key_released(code, event);
275}
276
277void fn_action(uint8_t code, keyevent_t event)
278{
279}
280
281/* Key */
282inline static void key_pressed(uint8_t code, keyevent_t event)
283{
284 uint8_t tmp_mods;
285 switch (kbdstate) {
286 case IDLE:
287 register_code(code);
288 NEXT(PRESSING);
289 break;
290 case PRESSING:
291 register_code(code);
292 break;
293 case DELAYING:
294 waiting_key = (keyrecord_t) {
295 .event = event,
296 .code = code,
297 .mods = keyboard_report->mods,
298 .time = timer_read()
299 };
300 NEXT(WAITING);
301 break;
302 case WAITING:
303 // play back key stroke
304 tmp_mods = keyboard_report->mods;
305 host_set_mods(delayed_fn.mods);
306 register_code(delayed_fn.code);
307 host_set_mods(waiting_key.mods);
308 register_code(waiting_key.code);
309 host_set_mods(tmp_mods);
310 register_code(code);
311 NEXT(IDLE);
312 break;
313 }
314}
315inline static void key_released(uint8_t code, keyevent_t event)
316{
317 uint8_t tmp_mods;
318 switch (kbdstate) {
319 case IDLE:
320 unregister_code(code);
321 break;
322 case PRESSING:
323 unregister_code(code);
324 if (!anykey_sent_to_host())
325 NEXT(IDLE);
326 break;
327 case DELAYING:
328 unregister_code(code);
329 break;
330 case WAITING:
331 if (code == waiting_key.code) {
332 layer_switch_on(delayed_fn.code);
333 NEXT(IDLE);
334 // process waiting_key
335 tmp_mods = keyboard_report->mods;
336 host_set_mods(waiting_key.mods);
337 keymap_process_event(waiting_key.event);
338 host_set_mods(tmp_mods);
339 keymap_process_event(event);
340 } else {
341 unregister_code(code);
342 }
343 break;
344 }
345}
346
347/* layer switch momentary */
348inline static void layerkey_pressed(uint8_t code, keyevent_t event)
349{
350 uint8_t tmp_mods;
351 switch (kbdstate) {
352 case IDLE:
353 layer_switch_on(code);
354 break;
355 case PRESSING:
356 // ignore
357 break;
358 case DELAYING:
359 waiting_key = (keyrecord_t) {
360 .event = event,
361 .code = code,
362 .mods = keyboard_report->mods,
363 .time = timer_read()
364 };
365 NEXT(WAITING);
366 break;
367 case WAITING:
368 tmp_mods = keyboard_report->mods;
369 host_set_mods(delayed_fn.mods);
370 register_code(delayed_fn.code);
371 host_set_mods(waiting_key.mods);
372 register_code(waiting_key.code);
373 host_set_mods(tmp_mods);
374 if (kind == FN_DOWN) {
375 // ignore Fn
376 } else if (kind == FNK_DOWN) {
377 register_code(code);
378 } else if (kind == KEY_DOWN) {
379 register_code(code);
380 }
381 NEXT(IDLE);
382 break;
383 }
384}
385inline static void layerkey_released(uint8_t code, keyevent_t event)
386{
387 switch (kbdstate) {
388 case IDLE:
389 layer_switch_off(code);
390 break;
391 case PRESSING:
392 case DELAYING:
393 case WAITING:
394 if (layer_switch_off(code))
395 NEXT(IDLE);
396 break;
397 }
398}
399#endif
400
401
402static void register_code(uint8_t code) 382static void register_code(uint8_t code)
403{ 383{
404 if (code == KC_NO) { 384 if (code == KC_NO) {
diff --git a/common/action.h b/common/action.h
index 08f8c5608..942ce191a 100644
--- a/common/action.h
+++ b/common/action.h
@@ -15,10 +15,6 @@ ACT_LMODS(0000)
15 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) 15 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 0 (reserved)
16 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) 16 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 1 (reserved)
17 0 0 0 0| mods(4) | keycode(8) Key+Lmods 17 0 0 0 0| mods(4) | keycode(8) Key+Lmods
18???
19 0 0 0 0| mods(4) | 1 1 1 1 0| tap(3) Lmods+tap Switch(enable/disable)
20 0 0 0 0| mods(4) | 1 1 1 1 1| tap(3) Lmods+tap Toggle(on/off)
21???
22 18
23ACT_RMODS(0001) 19ACT_RMODS(0001)
24 0 0 0 1| 0 0 0 0| 0 0 0 0 0 0 0 0 No action(not used) 20 0 0 0 1| 0 0 0 0| 0 0 0 0 0 0 0 0 No action(not used)
@@ -28,10 +24,6 @@ ACT_RMODS(0001)
28 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) 24 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 0 (reserved)
29 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) 25 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 1 (reserved)
30 0 0 0 1| mods(4) | keycode(8) Key+Rmod 26 0 0 0 1| mods(4) | keycode(8) Key+Rmod
31???
32 0 0 0 1| mods(4) | 1 1 1 1 0| tap(3) Rmods+tap Switch(enable/disable)
33 0 0 0 1| mods(4) | 1 1 1 1 1| tap(3) Rmods+tap Toggle(on/off)
34???
35 27
36ACT_LMODS_TAP(0010) 28ACT_LMODS_TAP(0010)
37 0 0 1 0| 0 0 0 0| X X X X X X X X (reserved)[00-FF] 29 0 0 1 0| 0 0 0 0| X X X X X X X X (reserved)[00-FF]
@@ -45,36 +37,47 @@ ACT_RMODS_TAP(0011)
45 0 0 1 1| mods(4) | keycode(8) Rmods+tap Key 37 0 0 1 1| mods(4) | keycode(8) Rmods+tap Key
46 0 0 1 1| mods(4) | 1 1 1 1| X X X X (reserved)[F0-FF] 38 0 0 1 1| mods(4) | 1 1 1 1| X X X X (reserved)[F0-FF]
47 39
48ACT_LAYER(0100) 40ACT_USAGE - other HID usage than keyboard
49 0 1 0 0| layer(4) | 0 0 0 0 0 0| 0 0 Momentary 41 0 1 0 0| 0 0| usage(10) System usage
50 0 1 0 0| layer(4) | 0 0 0 0 0 0| 0 1 Oneshot 42 0 1 0 0| 0 1| usage(10) Consumer usage
51 0 1 0 0| layer(4) | 0 0 0 0 0 0| 1 0 (reserved) 43 0 1 0 0| 1 0| usage(10) (reserved)
52 0 1 0 0| layer(4) | 0 0 0 0 0 0| 1 1 (reserved) 44 0 1 0 0| 1 1| usage(10) (reserved)
53 0 1 0 0| layer(4) | keycode(8) Fn momentary + tap Key
54 0 1 0 0| layer(4) | 1 1 1 1 0| tap(3) Fn+tap Switch(enable/disable)
55 0 1 0 0| layer(4) | 1 1 1 1 1| tap(3) Fn+tap Toggle(on/off)
56
57ACT_USAGE(0101)
58 0 1 0 1| 0 0| usage(10) System usage
59 0 1 0 1| 0 1| usage(10) Consumer usage
60 0 1 0 1| 1 0| usage(10) (reserved)
61 0 1 0 1| 1 1| usage(10) (reserved)
62 45
63ACT_MOUSEKEY(0110) 46ACT_MOUSEKEY(0110)
64 0 1 1 0| X X X X| keycode(8) Mouse key 47 0 1 0 1| X X X X| keycode(8) Mouse key
65??? TODO: refactor 48??? TODO: refactor
66 0 1 1 0| 0 0 X X| accel(5) |cursor(3) Mouse key 49 0 1 0 1| 0 0 X X| accel(5) |cursor(3) Mouse key
67 0 1 1 0| 0 1 X X| accel(5) |wheel(3) Mouse key 50 0 1 0 1| 0 1 X X| accel(5) |wheel(3) Mouse key
68 0 1 1 0| 1 0 X X| button(8) Mouse key 51 0 1 0 1| 1 0 X X| button(8) Mouse key
69 0 1 1 0| 1 1 X X| button(8) Mouse key 52 0 1 0 1| 1 1 X X| button(8) Mouse key
70??? 53???
71 54
72 0 1 1 1| (reserved) 55Layer Action
73 1 0 0 0| (reserved) 56------------
74 1 0 0 1| (reserved) 571000|LLLL|0000 0000 set layer L when pressed
75 1 0 1 0| (reserved) 581001|LLLL|0000 0000 set layer L when released
76 1 0 1 1| (reserved) 591010|BBBB|0000 0000 on/off bit B when pressed/released
77 1 1 0 0| (reserved) 601011|0000|0000 0000 set default layer when pressed
611011|0001|0000 0000 set default layer when released
62
631000|LLLL|1111 0000 set layer L when pressed + tap toggle
641001|LLLL|1111 0000 set layer L when released[tap is ignored/not used]
651010|BBBB|1111 0000 on/off bit B when pressed/released + tap toggle
661011|0000|1111 0000 set default layer when pressed + tap toggle
671011|0001|1111 0000 set default layer when released[tap is ignored/not used]
68
691000|LLLL|1111 1111 set L to default layer when pressed
701001|LLLL|1111 1111 set L to default layer when released
711010|BBBB|1111 1111 on/off bit B of default layer when pressed/released
721011|0000|1111 1111 set current to default layer when pressed
731011|0001|1111 1111 set current to default layer when released
74
751000|LLLL| keycode set layer L when pressed + tap key
761001|LLLL| keyocde set layer L when released[tap is ignored/not used]
771010|BBBB| keyocde on/off bit B when pressed/released + tap key
781011|0000| keyocde set default layer when pressed + tap key
791011|0001| keyocde set default layer when released[tap is ignored/not used]
80
78 81
79ACT_MACRO(1100) 82ACT_MACRO(1100)
80 1 1 0 0| option(4) | macro-table id(8) Macro play(Flash) 83 1 1 0 0| option(4) | macro-table id(8) Macro play(Flash)
@@ -88,25 +91,32 @@ ACT_FUNCTION(1111)
88 1 1 1 1| function address(4K range) Function 91 1 1 1 1| function address(4K range) Function
89 Macro record(dynamicly) 92 Macro record(dynamicly)
90 Macro play(dynamicly) 93 Macro play(dynamicly)
94TODO: modifier + [tap key /w mod]
95 : layerkey + [tap key /w mod]
96 for example: LShift + '('[Shift+9] and RShift + ')'[Shift+0]
97 http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478.html#p90052
91*/ 98*/
92 99
93enum action_id { 100enum action_id {
94 ACT_LMODS = 0, 101 ACT_LMODS = 0b0000,
95 ACT_RMODS, 102 ACT_RMODS = 0b0001,
96 ACT_LMOD_TAP, 103 ACT_LMOD_TAP = 0b0010,
97 ACT_RMOD_TAP, 104 ACT_RMOD_TAP = 0b0011,
98 ACT_LAYER, 105 ACT_USAGE = 0b0100,
99 ACT_USAGE, 106 ACT_MOUSEKEY = 0b0101,
100 ACT_MOUSEKEY, 107 ACT_LAYER_PRESSED = 0b1000,
101 ACT_MACRO = 14, 108 ACT_LAYER_RELEASED = 0b1001,
102 ACT_COMMAND = 15, 109 ACT_LAYER_BIT = 0b1010,
103 ACT_FUNCTION = 16 110 ACT_LAYER_EXT = 0b1011,
111 ACT_MACRO = 0b1100,
112 ACT_COMMAND = 0b1110,
113 ACT_FUNCTION = 0b1111
104}; 114};
105 115
106// TODO: not portable across compiler/endianness? 116// TODO: not portable across compiler/endianness?
107/* 117/*
108In avr-gcc bit fields seems to be assigned from LSB(bit0) to MSB(bit15). 118In avr-gcc bit fields seems to be assigned from LSB(bit0) to MSB(bit15).
109AVR seems like little endian in avr-gcc. 119AVR looks like a little endian in avr-gcc.
110 120
111Byte order and bit order of 0x1234: 121Byte order and bit order of 0x1234:
112Big endian: 15 ... 8 7 ... 210 122Big endian: 15 ... 8 7 ... 210
@@ -127,17 +137,11 @@ typedef union {
127 uint16_t mods :4; 137 uint16_t mods :4;
128 uint16_t kind :4; 138 uint16_t kind :4;
129 } key; 139 } key;
130 struct action_layer_key { 140 struct action_layer {
131 uint16_t code :8; 141 uint16_t code :8;
132 uint16_t layer :4; 142 uint16_t opt :4;
133 uint16_t kind :4;
134 } layer_key;
135 struct action_layer_tap {
136 uint16_t count :3;
137 uint16_t rest :5;
138 uint16_t layer :4;
139 uint16_t kind :4; 143 uint16_t kind :4;
140 } layer_tap; 144 } layer;
141 struct action_usage { 145 struct action_usage {
142 uint16_t code :10; 146 uint16_t code :10;
143 uint16_t page :2; 147 uint16_t page :2;
@@ -157,7 +161,14 @@ enum stroke_cmd {
157 STROKE_ALLUP, /* release all keys in reverse order */ 161 STROKE_ALLUP, /* release all keys in reverse order */
158}; 162};
159 163
160void action_exec(action_t act, keyevent_t event); 164typedef struct {
165 keyevent_t event;
166 action_t action;
167 uint8_t mods;
168} keyrecord_t;
169
170
171void action_exec(keyevent_t event);
161/* 172/*
162void key_action(uint8_t code, keyevent_t event); 173void key_action(uint8_t code, keyevent_t event);
163void mod_action(uint8_t code, keyevent_t event); 174void mod_action(uint8_t code, keyevent_t event);
@@ -166,9 +177,12 @@ void fn_action(uint8_t code, keyevent_t event);
166 177
167 178
168/* action_t utility */ 179/* action_t utility */
180/*
181#define ACTION_NO { .code = 0 }
169#define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } 182#define ACTION(kind, param) { .code = ((kind)<<12 | (param)) }
170#define NO_ACTION ACTION(0, 0) 183*/
171#define LAYER_PARAM(layer, key) ((layer)<<8|(key)) 184#define ACTION_NO 0
185#define ACTION(kind, param) ((kind)<<12 | (param))
172 186
173/* Key & Mods */ 187/* Key & Mods */
174#define ACTION_KEY(key) ACTION(ACT_LMODS, key) 188#define ACTION_KEY(key) ACTION(ACT_LMODS, key)
@@ -185,12 +199,28 @@ void fn_action(uint8_t code, keyevent_t event);
185/* Mods + Tap key */ 199/* Mods + Tap key */
186#define ACTION_LMODS_TAP(mods, key) ACTION(ACT_LMODS_TAP,(mods)<<8 | (key)) 200#define ACTION_LMODS_TAP(mods, key) ACTION(ACT_LMODS_TAP,(mods)<<8 | (key))
187#define ACTION_RMODS_TAP(mods, key) ACTION(ACT_RMODS_TAP,(mods)<<8 | (key)) 201#define ACTION_RMODS_TAP(mods, key) ACTION(ACT_RMODS_TAP,(mods)<<8 | (key))
202
188/* Layer Switch */ 203/* Layer Switch */
189#define ACTION_LAYER(layer) ACTION(ACT_LAYER, (layer)<<8 | 0x00) 204#define ACTION_LAYER_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0x00)
190#define ACTION_LAYER_ONESHOT(layer) ACTION(ACT_LAYER, (layer)<<8 | 0x01) 205#define ACTION_LAYER_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0x00)
191#define ACTION_LAYER_KEY(layer, key) ACTION(ACT_LAYER, (layer)<<8 | (key)) 206#define ACTION_LAYER_BIT(bits) ACTION(ACT_LAYER_BIT, (layer)<<8 | 0x00)
192#define ACTION_LAYER_SWITCH(layer, tap) ACTION(ACT_LAYER, (layer)<<8 | 0xF0 | (tap)) 207#define ACTION_LAYER_TO_DEFAULT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0x00)
193#define ACTION_LAYER_TOGGLE(layer, tap) ACTION(ACT_LAYER, (layer)<<8 | 0xF1 | (tap)) 208#define ACTION_LAYER_TO_DEFAULT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0x00)
209
210#define ACTION_LAYER_TAP_TOGGLE(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xF0)
211#define ACTION_LAYER_BIT_TAP_TOGGLE(layer) ACTION(ACT_LAYER_BIT, (layer)<<8 | 0xF0)
212#define ACTION_LAYER_DEFAULT_TAP_TOGGLE ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xF0)
213
214#define ACTION_LAYER_DEFAULT_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xFF)
215#define ACTION_LAYER_DEFAULT_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xFF)
216#define ACTION_LAYER_DEFAULT_BIT(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | 0xFF)
217#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xFF)
218#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0xFF)
219
220#define ACTION_LAYER_SET_TAP_KEY(layer, key) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | (key))
221#define ACTION_LAYER_BIT_TAP_KEY(bits, key) ACTION(ACT_LAYER_BIT, (layer)<<8 | (key))
222#define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key) ACTION(ACT_LAYER_EXT, 0x0<<8 | (key))
223
194/* HID Usage */ 224/* HID Usage */
195#define ACTION_USAGE_PAGE_SYSTEM 0 225#define ACTION_USAGE_PAGE_SYSTEM 0
196#define ACTION_USAGE_PAGE_CONSUMER 1 226#define ACTION_USAGE_PAGE_CONSUMER 1
diff --git a/common/keyboard.c b/common/keyboard.c
index 5e95fb984..1e0b8c3ed 100644
--- a/common/keyboard.c
+++ b/common/keyboard.c
@@ -65,9 +65,10 @@ void keyboard_task(void)
65 65
66 for (int c = 0; c < MATRIX_COLS; c++) { 66 for (int c = 0; c < MATRIX_COLS; c++) {
67 if (matrix_change & (1<<c)) { 67 if (matrix_change & (1<<c)) {
68 keymap_process_event((keyevent_t){ 68 action_exec((keyevent_t){
69 .key = (keypos_t){ .row = r, .col = c }, 69 .key = (keypos_t){ .row = r, .col = c },
70 .pressed = (matrix_row & (1<<c)) 70 .pressed = (matrix_row & (1<<c)),
71 .time = timer_read()
71 }); 72 });
72 // record a processed key 73 // record a processed key
73 matrix_prev[r] ^= (1<<c); 74 matrix_prev[r] ^= (1<<c);
diff --git a/common/keyboard.h b/common/keyboard.h
index 37df6a4de..116653661 100644
--- a/common/keyboard.h
+++ b/common/keyboard.h
@@ -34,15 +34,9 @@ typedef struct {
34typedef struct { 34typedef struct {
35 keypos_t key; 35 keypos_t key;
36 bool pressed; 36 bool pressed;
37 uint16_t time;
37} keyevent_t; 38} keyevent_t;
38 39
39typedef struct {
40 keyevent_t event;
41 uint8_t code;
42 uint8_t mods;
43 uint16_t time;
44} keyrecord_t;
45
46#define KEYEQ(keya, keyb) (keya.row == keyb.row && keya.col == keyb.col) 40#define KEYEQ(keya, keyb) (keya.row == keyb.row && keya.col == keyb.col)
47 41
48extern uint8_t current_layer; 42extern uint8_t current_layer;
diff --git a/common/keymap.h b/common/keymap.h
index 935d886d7..f992be18e 100644
--- a/common/keymap.h
+++ b/common/keymap.h
@@ -35,6 +35,5 @@ uint8_t keymap_fn_keycode(uint8_t fn_bits);
35 * new keymap interface: action 35 * new keymap interface: action
36 */ 36 */
37action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); 37action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col);
38uint8_t keymap_process_event(keyevent_t event);
39 38
40#endif 39#endif
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c
index 477ef6c33..3ea75f5bb 100644
--- a/keyboard/hhkb/keymap.c
+++ b/keyboard/hhkb/keymap.c
@@ -51,15 +51,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
51} 51}
52 52
53 53
54/*
54static const action_t PROGMEM fn_actions[] = { 55static const action_t PROGMEM fn_actions[] = {
55 ACTION_LAYER(0), // Fn0 56 ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0
56 ACTION_LAYER(1), // Fn1 57 ACTION_LAYER_SET_ON_PRESSED(1), // Fn1
57 ACTION_LAYER_KEY(2, KC_SLASH), // Fn2 58 ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2
58 ACTION_LAYER_KEY(3, KC_SCLN), // Fn3 59 ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3
59 ACTION_LAYER(3), // Fn3 60 ACTION_LAYER_SET_ON_PRESSED(3), // Fn4
60 ACTION_LAYER_KEY(5, KC_SPC), // Fn5 61 ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5
61 NO_ACTION, // Fn6 62 ACTION_NO, // Fn6
62 NO_ACTION, // Fn7 63 ACTION_NO, // Fn7
64};
65*/
66static const uint16_t PROGMEM fn_actions[] = {
67 ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0
68 ACTION_LAYER_SET_ON_PRESSED(1), // Fn1
69 ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2
70 ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3
71 ACTION_LAYER_SET_ON_PRESSED(3), // Fn4
72 ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5
73 ACTION_NO, // Fn6
74 ACTION_NO, // Fn7
63}; 75};
64 76
65 77
@@ -91,7 +103,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
91 * |-----------------------------------------------------------| 103 * |-----------------------------------------------------------|
92 * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | 104 * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
93 * |-----------------------------------------------------------| 105 * |-----------------------------------------------------------|
94 * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx| 106 * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0|
95 * `-----------------------------------------------------------' 107 * `-----------------------------------------------------------'
96 * |Gui |Alt |Space |Alt |xxx| 108 * |Gui |Alt |Space |Alt |xxx|
97 * `--------------------------------------------' 109 * `--------------------------------------------'
@@ -99,8 +111,8 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
99 KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ 111 KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
100 CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \ 112 CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \
101 LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ 113 LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
102 LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \ 114 LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN0, \
103 LGUI,LALT, SPC, RALT,FN7), 115 LGUI,LALT, SPC, RALT,RGUI),
104 116
105 /* Layer 2: Vi mode (Slash) 117 /* Layer 2: Vi mode (Slash)
106 * ,-----------------------------------------------------------. 118 * ,-----------------------------------------------------------.
@@ -110,7 +122,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
110 * |-----------------------------------------------------------| 122 * |-----------------------------------------------------------|
111 * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | 123 * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return |
112 * |-----------------------------------------------------------| 124 * |-----------------------------------------------------------|
113 * |Shift | | | | | |Hom|PgD|PgUlEnd|xxx|Shift | | 125 * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | |
114 * `-----------------------------------------------------------' 126 * `-----------------------------------------------------------'
115 * |Gui|Alt |Space |Alt |Gui| 127 * |Gui|Alt |Space |Alt |Gui|
116 * `-------------------------------------------' 128 * `-------------------------------------------'
@@ -118,7 +130,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
118 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ 130 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
119 TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ 131 TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \
120 LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ 132 LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \
121 LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,NO, \ 133 LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \
122 LGUI,LALT, SPC, RALT,RGUI), 134 LGUI,LALT, SPC, RALT,RGUI),
123 135
124 /* Layer 3: Mouse mode (Semicolon) 136 /* Layer 3: Mouse mode (Semicolon)
@@ -127,19 +139,19 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
127 * |-----------------------------------------------------------| 139 * |-----------------------------------------------------------|
128 * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs| 140 * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs|
129 * |-----------------------------------------------------------| 141 * |-----------------------------------------------------------|
130 * |Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| |Return | 142 * |Contro| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return |
131 * |-----------------------------------------------------------| 143 * |-----------------------------------------------------------|
132 * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | 144 * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
133 * `-----------------------------------------------------------' 145 * `-----------------------------------------------------------'
134 * |Gui |Alt |Mb1 |Alt |Gui| 146 * |Gui |Alt |Mb1 |Alt |Fn0|
135 * `--------------------------------------------' 147 * `--------------------------------------------'
136 * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel 148 * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
137 */ 149 */
138 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ 150 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
139 TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ 151 TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
140 LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ 152 LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \
141 LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ 153 LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
142 LGUI,LALT, BTN1, RALT,FN4), 154 LGUI,LALT, BTN1, RALT,FN0),
143 155
144 /* Layer 4: Matias half keyboard style (Space) 156 /* Layer 4: Matias half keyboard style (Space)
145 * ,-----------------------------------------------------------. 157 * ,-----------------------------------------------------------.
@@ -151,21 +163,21 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
151 * |-----------------------------------------------------------| 163 * |-----------------------------------------------------------|
152 * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | 164 * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
153 * `-----------------------------------------------------------' 165 * `-----------------------------------------------------------'
154 * |Gui |Alt |xxxxxxxxxxxxxxxxxxxxxxx|Alt |Gui| 166 * |Gui |Alt | Fn0 |Alt |Gui|
155 * `--------------------------------------------' 167 * `--------------------------------------------'
156 */ 168 */
157 KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ 169 KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \
158 BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ 170 BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \
159 LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ 171 LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \
160 LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ 172 LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \
161 LGUI,LALT, FN5, RALT,RGUI), 173 LGUI,LALT, FN0, RALT,RGUI),
162 174
163 /* Layer5: another Mouse mode (Space) */ 175 /* Layer5: another Mouse mode (Space) */
164 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ 176 KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
165 TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ 177 TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
166 LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ 178 LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \
167 LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ 179 LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
168 LGUI,LALT, FN5, RALT,RGUI), 180 LGUI,LALT, FN0, RALT,RGUI),
169}; 181};
170 182
171#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) 183#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
@@ -183,39 +195,31 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
183 action_t action; 195 action_t action;
184 switch (key) { 196 switch (key) {
185 case KC_A ... KC_EXSEL: 197 case KC_A ... KC_EXSEL:
186 action = (action_t)ACTION_KEY(key); 198 action.code = ACTION_KEY(key);
187 break; 199 break;
188 case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: 200 case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
189 action = (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); 201 action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key));
190 break; 202 break;
191 case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: 203 case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
192 action = (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); 204 action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key));
193 break; 205 break;
194 case KC_MS_UP ... KC_MS_ACCEL2: 206 case KC_MS_UP ... KC_MS_ACCEL2:
195 action = (action_t)ACTION_MOUSEKEY(key); 207 action.code = ACTION_MOUSEKEY(key);
196 break; 208 break;
197 case KC_LCTRL ... KC_LGUI: 209 case KC_LCTRL ... KC_LGUI:
198 action = (action_t)ACTION_LMODS(MOD_BIT(key)); 210 action.code = ACTION_LMODS(MOD_BIT(key));
199 break; 211 break;
200 case KC_RCTRL ... KC_RGUI: 212 case KC_RCTRL ... KC_RGUI:
201 action = (action_t)ACTION_RMODS(MOD_BIT(key)>>4); 213 action.code = ACTION_RMODS(MOD_BIT(key)>>4);
202 break; 214 break;
203 case KC_FN0 ... KC_FN7: 215 case KC_FN0 ... KC_FN7:
204 action = (action_t)pgm_read_word(&fn_actions[FN_INDEX(key)]); 216 action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]);
205 break; 217 break;
206 case KC_NO ... KC_UNDEFINED: 218 case KC_NO ... KC_UNDEFINED:
207 default: 219 default:
208 action = (action_t)NO_ACTION; 220 action.code = ACTION_NO;
209 break; 221 break;
210 } 222 }
211 debug("action: "); debug_hex16(action.code); debug("\n"); 223 debug("action: "); debug_hex16(action.code); debug("\n");
212 return action; 224 return action;
213} 225}
214
215
216uint8_t keymap_process_event(keyevent_t event)
217{
218 action_t action = keymap_get_action(current_layer, event.key.row, event.key.col);
219 action_exec(action, event);
220 return 0;
221}