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.

57 lines
1.7 KiB

  1. #include "oneshot.h"
  2. void update_oneshot(
  3. oneshot_state *state,
  4. uint16_t mod,
  5. uint16_t trigger,
  6. uint16_t keycode,
  7. keyrecord_t *record
  8. ) {
  9. if (keycode == trigger) {
  10. if (record->event.pressed) {
  11. // Trigger keydown
  12. if (*state == os_up_unqueued) {
  13. register_code(mod);
  14. }
  15. *state = os_down_unused;
  16. } else {
  17. // Trigger keyup
  18. switch (*state) {
  19. case os_down_unused:
  20. // If we didn't use the mod while trigger was held, queue it.
  21. *state = os_up_queued;
  22. break;
  23. case os_down_used:
  24. // If we did use the mod while trigger was held, unregister it.
  25. *state = os_up_unqueued;
  26. unregister_code(mod);
  27. break;
  28. default:
  29. break;
  30. }
  31. }
  32. } else {
  33. if (record->event.pressed) {
  34. if (is_oneshot_cancel_key(keycode) && *state != os_up_unqueued) {
  35. // Cancel oneshot on designated cancel keydown.
  36. *state = os_up_unqueued;
  37. unregister_code(mod);
  38. }
  39. } else {
  40. if (!is_oneshot_ignored_key(keycode)) {
  41. // On non-ignored keyup, consider the oneshot used.
  42. switch (*state) {
  43. case os_down_unused:
  44. *state = os_down_used;
  45. break;
  46. case os_up_queued:
  47. *state = os_up_unqueued;
  48. unregister_code(mod);
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. }