You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
11 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. /*
  2. Copyright 2012,2013 Jun Wako <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "host.h"
  15. #include "keycode.h"
  16. #include "keyboard.h"
  17. #include "mousekey.h"
  18. #include "command.h"
  19. #include "led.h"
  20. #include "backlight.h"
  21. #include "action_layer.h"
  22. #include "action_tapping.h"
  23. #include "action_oneshot.h"
  24. #include "action_macro.h"
  25. #include "action.h"
  26. #ifdef DEBUG_ACTION
  27. #include "debug.h"
  28. #else
  29. #include "nodebug.h"
  30. #endif
  31. void action_exec(keyevent_t event)
  32. {
  33. if (!IS_NOEVENT(event)) {
  34. dprint("\n---- action_exec: start -----\n");
  35. dprint("EVENT: "); debug_event(event); dprintln();
  36. }
  37. keyrecord_t record = { .event = event };
  38. #ifndef NO_ACTION_TAPPING
  39. action_tapping_process(record);
  40. #else
  41. process_action(&record);
  42. if (!IS_NOEVENT(record.event)) {
  43. dprint("processed: "); debug_record(record); dprintln();
  44. }
  45. #endif
  46. }
  47. void process_action(keyrecord_t *record)
  48. {
  49. keyevent_t event = record->event;
  50. #ifndef NO_ACTION_TAPPING
  51. uint8_t tap_count = record->tap.count;
  52. #endif
  53. if (IS_NOEVENT(event)) { return; }
  54. action_t action = layer_switch_get_action(event.key);
  55. dprint("ACTION: "); debug_action(action);
  56. #ifndef NO_ACTION_LAYER
  57. dprint(" layer_state: "); layer_debug();
  58. dprint(" default_layer_state: "); default_layer_debug();
  59. #endif
  60. dprintln();
  61. switch (action.kind.id) {
  62. /* Key and Mods */
  63. case ACT_LMODS:
  64. case ACT_RMODS:
  65. {
  66. uint8_t mods = (action.kind.id == ACT_LMODS) ? action.key.mods :
  67. action.key.mods<<4;
  68. if (event.pressed) {
  69. if (mods) {
  70. host_add_mods(mods);
  71. host_send_keyboard_report();
  72. }
  73. register_code(action.key.code);
  74. } else {
  75. unregister_code(action.key.code);
  76. if (mods) {
  77. host_del_mods(mods);
  78. host_send_keyboard_report();
  79. }
  80. }
  81. }
  82. break;
  83. #ifndef NO_ACTION_TAPPING
  84. case ACT_LMODS_TAP:
  85. case ACT_RMODS_TAP:
  86. {
  87. uint8_t mods = (action.kind.id == ACT_LMODS_TAP) ? action.key.mods :
  88. action.key.mods<<4;
  89. switch (action.layer_tap.code) {
  90. #ifndef NO_ACTION_ONESHOT
  91. case 0x00:
  92. // Oneshot modifier
  93. if (event.pressed) {
  94. if (tap_count == 0) {
  95. dprint("MODS_TAP: Oneshot: add_mods\n");
  96. add_mods(mods);
  97. }
  98. else if (tap_count == 1) {
  99. dprint("MODS_TAP: Oneshot: start\n");
  100. oneshot_start(mods);
  101. }
  102. else if (tap_count == TAPPING_TOGGLE) {
  103. dprint("MODS_TAP: Oneshot: toggle\n");
  104. oneshot_toggle();
  105. }
  106. else {
  107. dprint("MODS_TAP: Oneshot: cancel&add_mods\n");
  108. // double tap cancels oneshot and works as normal modifier.
  109. oneshot_cancel();
  110. add_mods(mods);
  111. }
  112. } else {
  113. if (tap_count == 0) {
  114. dprint("MODS_TAP: Oneshot: cancel/del_mods\n");
  115. // cancel oneshot on hold
  116. oneshot_cancel();
  117. del_mods(mods);
  118. }
  119. else if (tap_count == 1) {
  120. dprint("MODS_TAP: Oneshot: del_mods\n");
  121. // retain Oneshot
  122. del_mods(mods);
  123. }
  124. else {
  125. dprint("MODS_TAP: Oneshot: del_mods\n");
  126. // cancel Mods
  127. del_mods(mods);
  128. }
  129. }
  130. break;
  131. #endif
  132. default:
  133. if (event.pressed) {
  134. if (tap_count > 0) {
  135. if (record->tap.interrupted) {
  136. dprint("MODS_TAP: Tap: Cancel: add_mods\n");
  137. // ad hoc: set 0 to cancel tap
  138. record->tap.count = 0;
  139. add_mods(mods);
  140. } else {
  141. dprint("MODS_TAP: Tap: register_code\n");
  142. register_code(action.key.code);
  143. }
  144. } else {
  145. dprint("MODS_TAP: No tap: add_mods\n");
  146. add_mods(mods);
  147. }
  148. } else {
  149. if (tap_count > 0) {
  150. dprint("MODS_TAP: Tap: unregister_code\n");
  151. unregister_code(action.key.code);
  152. } else {
  153. dprint("MODS_TAP: No tap: add_mods\n");
  154. del_mods(mods);
  155. }
  156. }
  157. break;
  158. }
  159. }
  160. break;
  161. #endif
  162. #ifdef EXTRAKEY_ENABLE
  163. /* other HID usage */
  164. case ACT_USAGE:
  165. switch (action.usage.page) {
  166. case PAGE_SYSTEM:
  167. if (event.pressed) {
  168. host_system_send(action.usage.code);
  169. } else {
  170. host_system_send(0);
  171. }
  172. break;
  173. case PAGE_CONSUMER:
  174. if (event.pressed) {
  175. host_consumer_send(action.usage.code);
  176. } else {
  177. host_consumer_send(0);
  178. }
  179. break;
  180. }
  181. break;
  182. #endif
  183. #ifdef MOUSEKEY_ENABLE
  184. /* Mouse key */
  185. case ACT_MOUSEKEY:
  186. if (event.pressed) {
  187. mousekey_on(action.key.code);
  188. mousekey_send();
  189. } else {
  190. mousekey_off(action.key.code);
  191. mousekey_send();
  192. }
  193. break;
  194. #endif
  195. #ifndef NO_ACTION_LAYER
  196. case ACT_LAYER:
  197. if (action.layer_bitop.on == 0) {
  198. /* Default Layer Bitwise Operation */
  199. if (!event.pressed) {
  200. uint8_t shift = action.layer_bitop.part*4;
  201. uint32_t bits = ((uint32_t)action.layer_bitop.bits)<<shift;
  202. uint32_t mask = (action.layer_bitop.xbit) ? ~(((uint32_t)0xf)<<shift) : 0;
  203. switch (action.layer_bitop.op) {
  204. case OP_BIT_AND: default_layer_and(bits | mask); break;
  205. case OP_BIT_OR: default_layer_or(bits | mask); break;
  206. case OP_BIT_XOR: default_layer_xor(bits | mask); break;
  207. case OP_BIT_SET: default_layer_and(mask); default_layer_or(bits); break;
  208. }
  209. }
  210. } else {
  211. /* Layer Bitwise Operation */
  212. if (event.pressed ? (action.layer_bitop.on & ON_PRESS) :
  213. (action.layer_bitop.on & ON_RELEASE)) {
  214. uint8_t shift = action.layer_bitop.part*4;
  215. uint32_t bits = ((uint32_t)action.layer_bitop.bits)<<shift;
  216. uint32_t mask = (action.layer_bitop.xbit) ? ~(((uint32_t)0xf)<<shift) : 0;
  217. switch (action.layer_bitop.op) {
  218. case OP_BIT_AND: layer_and(bits | mask); break;
  219. case OP_BIT_OR: layer_or(bits | mask); break;
  220. case OP_BIT_XOR: layer_xor(bits | mask); break;
  221. case OP_BIT_SET: layer_and(mask); layer_or(bits); break;
  222. }
  223. }
  224. }
  225. break;
  226. #ifndef NO_ACTION_TAPPING
  227. case ACT_LAYER_TAP:
  228. case ACT_LAYER_TAP_EXT:
  229. switch (action.layer_tap.code) {
  230. case OP_TAP_TOGGLE:
  231. /* tap toggle */
  232. if (event.pressed) {
  233. if (tap_count < TAPPING_TOGGLE) {
  234. layer_invert(action.layer_tap.val);
  235. }
  236. } else {
  237. if (tap_count <= TAPPING_TOGGLE) {
  238. layer_invert(action.layer_tap.val);
  239. }
  240. }
  241. break;
  242. case OP_ON_OFF:
  243. event.pressed ? layer_on(action.layer_tap.val) :
  244. layer_off(action.layer_tap.val);
  245. break;
  246. case OP_OFF_ON:
  247. event.pressed ? layer_off(action.layer_tap.val) :
  248. layer_on(action.layer_tap.val);
  249. break;
  250. case OP_SET_CLEAR:
  251. event.pressed ? layer_move(action.layer_tap.val) :
  252. layer_clear();
  253. break;
  254. default:
  255. /* tap key */
  256. if (event.pressed) {
  257. if (tap_count > 0) {
  258. dprint("KEYMAP_TAP_KEY: Tap: register_code\n");
  259. register_code(action.layer_tap.code);
  260. } else {
  261. dprint("KEYMAP_TAP_KEY: No tap: On on press\n");
  262. layer_on(action.layer_tap.val);
  263. }
  264. } else {
  265. if (tap_count > 0) {
  266. dprint("KEYMAP_TAP_KEY: Tap: unregister_code\n");
  267. unregister_code(action.layer_tap.code);
  268. } else {
  269. dprint("KEYMAP_TAP_KEY: No tap: Off on release\n");
  270. layer_off(action.layer_tap.val);
  271. }
  272. }
  273. break;
  274. }
  275. break;
  276. #endif
  277. #endif
  278. /* Extentions */
  279. #ifndef NO_ACTION_MACRO
  280. case ACT_MACRO:
  281. action_macro_play(action_get_macro(record, action.func.id, action.func.opt));
  282. break;
  283. #endif
  284. #ifdef BACKLIGHT_ENABLE
  285. case ACT_BACKLIGHT:
  286. if (!event.pressed) {
  287. switch (action.backlight.id) {
  288. case BACKLIGHT_INCREASE:
  289. backlight_increase();
  290. break;
  291. case BACKLIGHT_DECREASE:
  292. backlight_decrease();
  293. break;
  294. case BACKLIGHT_TOGGLE:
  295. backlight_toggle();
  296. break;
  297. case BACKLIGHT_STEP:
  298. backlight_step();
  299. break;
  300. }
  301. }
  302. break;
  303. #endif
  304. case ACT_COMMAND:
  305. break;
  306. #ifndef NO_ACTION_FUNCTION
  307. case ACT_FUNCTION:
  308. action_function(record, action.func.id, action.func.opt);
  309. break;
  310. #endif
  311. default:
  312. break;
  313. }
  314. }
  315. /*
  316. * Utilities for actions.
  317. */
  318. void register_code(uint8_t code)
  319. {
  320. if (code == KC_NO) {
  321. return;
  322. }
  323. #ifdef LOCKING_SUPPORT_ENABLE
  324. else if (KC_LOCKING_CAPS == code) {
  325. #ifdef LOCKING_RESYNC_ENABLE
  326. // Resync: ignore if caps lock already is on
  327. if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return;
  328. #endif
  329. host_add_key(KC_CAPSLOCK);
  330. host_send_keyboard_report();
  331. host_del_key(KC_CAPSLOCK);
  332. host_send_keyboard_report();
  333. }
  334. else if (KC_LOCKING_NUM == code) {
  335. #ifdef LOCKING_RESYNC_ENABLE
  336. if (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) return;
  337. #endif
  338. host_add_key(KC_NUMLOCK);
  339. host_send_keyboard_report();
  340. host_del_key(KC_NUMLOCK);
  341. host_send_keyboard_report();
  342. }
  343. else if (KC_LOCKING_SCROLL == code) {
  344. #ifdef LOCKING_RESYNC_ENABLE
  345. if (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) return;
  346. #endif
  347. host_add_key(KC_SCROLLLOCK);
  348. host_send_keyboard_report();
  349. host_del_key(KC_SCROLLLOCK);
  350. host_send_keyboard_report();
  351. }
  352. #endif
  353. else if IS_KEY(code) {
  354. // TODO: should push command_proc out of this block?
  355. if (command_proc(code)) return;
  356. #ifndef NO_ACTION_ONESHOT
  357. if (oneshot_state.mods && !oneshot_state.disabled) {
  358. uint8_t tmp_mods = host_get_mods();
  359. host_add_mods(oneshot_state.mods);
  360. host_add_key(code);
  361. host_send_keyboard_report();
  362. host_set_mods(tmp_mods);
  363. oneshot_cancel();
  364. } else
  365. #endif
  366. {
  367. host_add_key(code);
  368. host_send_keyboard_report();
  369. }
  370. }
  371. else if IS_MOD(code) {
  372. host_add_mods(MOD_BIT(code));
  373. host_send_keyboard_report();
  374. }
  375. else if IS_SYSTEM(code) {
  376. host_system_send(KEYCODE2SYSTEM(code));
  377. }
  378. else if IS_CONSUMER(code) {
  379. host_consumer_send(KEYCODE2CONSUMER(code));
  380. }
  381. }
  382. void unregister_code(uint8_t code)
  383. {
  384. if (code == KC_NO) {
  385. return;
  386. }
  387. #ifdef LOCKING_SUPPORT_ENABLE
  388. else if (KC_LOCKING_CAPS == code) {
  389. #ifdef LOCKING_RESYNC_ENABLE
  390. // Resync: ignore if caps lock already is off
  391. if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return;
  392. #endif
  393. host_add_key(KC_CAPSLOCK);
  394. host_send_keyboard_report();
  395. host_del_key(KC_CAPSLOCK);
  396. host_send_keyboard_report();
  397. }
  398. else if (KC_LOCKING_NUM == code) {
  399. #ifdef LOCKING_RESYNC_ENABLE
  400. if (!(host_keyboard_leds() & (1<<USB_LED_NUM_LOCK))) return;
  401. #endif
  402. host_add_key(KC_NUMLOCK);
  403. host_send_keyboard_report();
  404. host_del_key(KC_NUMLOCK);
  405. host_send_keyboard_report();
  406. }
  407. else if (KC_LOCKING_SCROLL == code) {
  408. #ifdef LOCKING_RESYNC_ENABLE
  409. if (!(host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK))) return;
  410. #endif
  411. host_add_key(KC_SCROLLLOCK);
  412. host_send_keyboard_report();
  413. host_del_key(KC_SCROLLLOCK);
  414. host_send_keyboard_report();
  415. }
  416. #endif
  417. else if IS_KEY(code) {
  418. host_del_key(code);
  419. host_send_keyboard_report();
  420. }
  421. else if IS_MOD(code) {
  422. host_del_mods(MOD_BIT(code));
  423. host_send_keyboard_report();
  424. }
  425. else if IS_SYSTEM(code) {
  426. host_system_send(0);
  427. }
  428. else if IS_CONSUMER(code) {
  429. host_consumer_send(0);
  430. }
  431. }
  432. void add_mods(uint8_t mods)
  433. {
  434. if (mods) {
  435. host_add_mods(mods);
  436. host_send_keyboard_report();
  437. }
  438. }
  439. void del_mods(uint8_t mods)
  440. {
  441. if (mods) {
  442. host_del_mods(mods);
  443. host_send_keyboard_report();
  444. }
  445. }
  446. void set_mods(uint8_t mods)
  447. {
  448. host_set_mods(mods);
  449. host_send_keyboard_report();
  450. }
  451. void clear_keyboard(void)
  452. {
  453. host_clear_mods();
  454. clear_keyboard_but_mods();
  455. }
  456. void clear_keyboard_but_mods(void)
  457. {
  458. host_clear_keys();
  459. host_send_keyboard_report();
  460. #ifdef MOUSEKEY_ENABLE
  461. mousekey_clear();
  462. mousekey_send();
  463. #endif
  464. #ifdef EXTRAKEY_ENABLE
  465. host_system_send(0);
  466. host_consumer_send(0);
  467. #endif
  468. }
  469. bool sending_anykey(void)
  470. {
  471. return (host_has_anykey() || host_mouse_in_use() ||
  472. host_last_sysytem_report() || host_last_consumer_report());
  473. }
  474. bool is_tap_key(key_t key)
  475. {
  476. action_t action = layer_switch_get_action(key);
  477. switch (action.kind.id) {
  478. case ACT_LMODS_TAP:
  479. case ACT_RMODS_TAP:
  480. case ACT_LAYER_TAP:
  481. case ACT_LAYER_TAP_EXT:
  482. return true;
  483. case ACT_MACRO:
  484. case ACT_FUNCTION:
  485. if (action.func.opt & FUNC_TAP) { return true; }
  486. return false;
  487. }
  488. return false;
  489. }
  490. /*
  491. * debug print
  492. */
  493. void debug_event(keyevent_t event)
  494. {
  495. dprintf("%04X%c(%u)", (event.key.row<<8 | event.key.col), (event.pressed ? 'd' : 'u'), event.time);
  496. }
  497. void debug_record(keyrecord_t record)
  498. {
  499. debug_event(record.event);
  500. #ifndef NO_ACTION_TAPPING
  501. dprintf(":%u%c", record.tap.count, (record.tap.interrupted ? '-' : ' '));
  502. #endif
  503. }
  504. void debug_action(action_t action)
  505. {
  506. switch (action.kind.id) {
  507. case ACT_LMODS: dprint("ACT_LMODS"); break;
  508. case ACT_RMODS: dprint("ACT_RMODS"); break;
  509. case ACT_LMODS_TAP: dprint("ACT_LMODS_TAP"); break;
  510. case ACT_RMODS_TAP: dprint("ACT_RMODS_TAP"); break;
  511. case ACT_USAGE: dprint("ACT_USAGE"); break;
  512. case ACT_MOUSEKEY: dprint("ACT_MOUSEKEY"); break;
  513. case ACT_LAYER: dprint("ACT_LAYER"); break;
  514. case ACT_LAYER_TAP: dprint("ACT_LAYER_TAP"); break;
  515. case ACT_LAYER_TAP_EXT: dprint("ACT_LAYER_TAP_EXT"); break;
  516. case ACT_MACRO: dprint("ACT_MACRO"); break;
  517. case ACT_COMMAND: dprint("ACT_COMMAND"); break;
  518. case ACT_FUNCTION: dprint("ACT_FUNCTION"); break;
  519. default: dprint("UNKNOWN"); break;
  520. }
  521. dprintf("[%X:%02X]", action.kind.param>>8, action.kind.param&0xff);
  522. }