alt_shift.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include USERSPACE_H
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. bool shift_for_two(uint16_t keycode, keyrecord_t *record){
  5. uint16_t mod_state = get_mods();
  6. bool is_shifted = (get_mods() & MOD_MASK_SHIFT) ||
  7. (get_oneshot_mods() & MOD_MASK_SHIFT);
  8. if(record ->event.pressed) {
  9. // If shifted, double these common punctuation marks.
  10. if(is_shifted){
  11. // clear shift temporarily
  12. del_mods(MOD_MASK_SHIFT);
  13. del_oneshot_mods(MOD_MASK_SHIFT);
  14. tap_code16(keycode);
  15. tap_code16(keycode);
  16. // restore previous shift state
  17. set_mods(mod_state);
  18. return false;
  19. }
  20. }
  21. return true;
  22. }
  23. bool shift_for_three(uint16_t keycode, keyrecord_t *record){
  24. uint16_t mod_state = get_mods();
  25. bool is_shifted = (get_mods() & MOD_MASK_SHIFT) ||
  26. (get_oneshot_mods() & MOD_MASK_SHIFT);
  27. if(record ->event.pressed) {
  28. // If shifted, double these common punctuation marks.
  29. if(is_shifted){
  30. // clear shift temporarily
  31. del_mods(MOD_MASK_SHIFT);
  32. del_oneshot_mods(MOD_MASK_SHIFT);
  33. tap_code16(keycode);
  34. tap_code16(keycode);
  35. tap_code16(keycode);
  36. // restore previous shift state
  37. set_mods(mod_state);
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. bool override_shift(uint16_t keycode,
  44. uint16_t shift_keycode,
  45. keyrecord_t *record
  46. ) {
  47. bool is_shifted = (get_mods() & MOD_MASK_SHIFT) ||
  48. (get_oneshot_mods() & MOD_MASK_SHIFT);
  49. if (record->event.pressed) {
  50. if (is_shifted) {
  51. uint8_t mod_state = get_mods();
  52. del_mods(MOD_MASK_SHIFT);
  53. del_oneshot_mods(MOD_MASK_SHIFT);
  54. tap_code16(shift_keycode);
  55. set_mods(mod_state);
  56. } else {
  57. //tap_code16(keycode);
  58. }
  59. }
  60. return false;
  61. }
  62. // macros for use in alt_shift.defs.
  63. #define ALT_SHIFT(KCKEY, KC01) \
  64. case KCKEY: \
  65. return override_shift(KCKEY, KC01, record); \
  66. break;
  67. #define SHIFT_FOR_2(KCKEY) \
  68. case KCKEY: \
  69. return shift_for_two(KCKEY, record); \
  70. break;
  71. #define SHIFT_FOR_3(KCKEY) \
  72. case KCKEY: \
  73. return shift_for_three(KCKEY, record); \
  74. break;
  75. bool process_alt_shift_user(uint16_t keycode, keyrecord_t *record) {
  76. switch(keycode){
  77. #include "alt_shift.def"
  78. }
  79. return true;
  80. }