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.

88 lines
2.4 KiB

  1. // Copyright 2022 Vino Rodrigues (@vinorodrigues)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "specialk.h"
  4. bool delkey_registered = false;
  5. uint32_t __keycode_raised = 0;
  6. bool get_keycode_raised(uint8_t n) {
  7. return __keycode_raised & (1 << n);
  8. }
  9. void set_keycode_raised(uint8_t n, bool b) {
  10. if (b) {
  11. __keycode_raised |= 1 << n;
  12. } else {
  13. __keycode_raised &= ~(1 << n);
  14. }
  15. }
  16. bool ID61_process_special_k(uint16_t keycode, keyrecord_t *record, bool arrow_mode, uint8_t k_norm, uint8_t k_spcl, uint8_t k_altr) {
  17. bool is_raised = get_highest_layer(layer_state|default_layer_state) != 0;
  18. if (record->event.pressed) {
  19. set_keycode_raised(keycode - QK_KB_0, is_raised); // save for key release event
  20. if (is_raised) {
  21. // *** Fn keyed ***
  22. if (arrow_mode) {
  23. // alternate key
  24. register_code(k_altr);
  25. } else {
  26. // special key
  27. register_code(k_spcl);
  28. }
  29. } else {
  30. // *** normal, un-Fn'ed ***
  31. if (arrow_mode) {
  32. // special key
  33. register_code(k_spcl);
  34. } else {
  35. // normal key
  36. register_code(k_norm);
  37. }
  38. }
  39. } else {
  40. if (get_keycode_raised(keycode - QK_KB_0)) {
  41. // *** Fn keyed ***
  42. if (arrow_mode) {
  43. // alternate key
  44. unregister_code(k_altr);
  45. } else {
  46. // special key
  47. unregister_code(k_spcl);
  48. }
  49. } else {
  50. // *** normal, un-Fn'ed ***
  51. if (arrow_mode) {
  52. // special key
  53. unregister_code(k_spcl);
  54. } else {
  55. // normal key
  56. unregister_code(k_norm);
  57. }
  58. }
  59. }
  60. return false;
  61. }
  62. bool ID61_backspace_special(uint16_t keycode, keyrecord_t *record) {
  63. uint8_t mod_state = get_mods();
  64. if (record->event.pressed) {
  65. if (mod_state & MOD_MASK_SHIFT) {
  66. del_mods(MOD_MASK_SHIFT);
  67. register_code(KC_DEL);
  68. delkey_registered = true;
  69. set_mods(mod_state);
  70. return false;
  71. }
  72. } else {
  73. if (delkey_registered) {
  74. unregister_code(KC_DEL);
  75. delkey_registered = false;
  76. return false;
  77. }
  78. }
  79. return true; // normal backspace, pass on
  80. }