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.

223 lines
6.0 KiB

  1. /* A library to output the right key shortcut in any common app.
  2. Given a global variable babble_mode to show the environment and a
  3. key that calls the paste macro, do the right type of paste.
  4. Setting the context is done by another macro, or TBD interaction with the host.
  5. Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
  6. and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
  7. */
  8. #include QMK_KEYBOARD_H
  9. #ifdef USE_BABBLEPASTE
  10. # include "babblePaste.h"
  11. // GLOBAL variable to determine mode. Sets startup default if no eeppom
  12. uint8_t babble_mode = 0;
  13. // functions to tell the user that the mode has changed
  14. __attribute__((weak)) void babble_modeswitch_user(uint8_t mode) {}
  15. __attribute__((weak)) void babble_modeswitch_kb(uint8_t mode) { babble_modeswitch_user( mode); }
  16. void set_babble_mode(uint8_t id) { babble_mode = id; }
  17. void babble_mode_increment() {
  18. babble_mode += 1;
  19. if (babble_mode >= BABL_MODEMAX) {
  20. babble_mode = 0;
  21. }
  22. babble_modeswitch_kb(babble_mode);
  23. }
  24. void babble_mode_decrement() {
  25. if (babble_mode >= 1) {
  26. babble_mode -= 1;
  27. } else {
  28. babble_mode = BABL_MODEMAX - 1;
  29. }
  30. babble_modeswitch_kb(babble_mode);
  31. }
  32. /* this function runs the appropriate babblepaste macro, given
  33. the global babble_mode and a keycode defined in the babble_keycodes enum.
  34. This could be made faster by splitting into functions sorted by keycode range
  35. But that makes for a *lot* of ifdefs.
  36. */
  37. bool babblePaste(uint16_t keycode, bool is_pressed ) {
  38. // handle keys that have up & down behavior first, then OS/mode switching, then macros
  39. // This is the key used for cut & paste (Propeller on Mac, Control elsewhere)
  40. # ifdef BABL_MODSWAP
  41. // WARNING, this assumes you have BABL_MAC_MODE defined.
  42. if (keycode == BABL_PRIMARY_OS_MOD ) {
  43. if (babble_mode == BABL_MAC_MODE) {
  44. if (is_pressed) {
  45. register_code(KC_LGUI);
  46. } else {
  47. unregister_code(KC_LGUI);
  48. }
  49. } else { // everybody else
  50. if (is_pressed) {
  51. register_code(KC_LCTL);
  52. } else {
  53. unregister_code(KC_LCTL);
  54. }
  55. }
  56. }
  57. // This is the os key not used in cut & paste. (CTRL on mac, GUI elsewhere)
  58. if (keycode == BABL_SECONDARY_OS_MOD ) {
  59. if (babble_mode == BABL_MAC_MODE) {
  60. if (is_pressed) {
  61. register_code(KC_LCTL);
  62. } else {
  63. unregister_code(KC_LCTL);
  64. }
  65. } else { // everybody else
  66. if (is_pressed) {
  67. register_code(KC_LGUI);
  68. } else {
  69. unregister_code(KC_LGUI);
  70. }
  71. }
  72. }
  73. // This is the alt key in most OSes. Mostly useful if you want to do hyper on one OS, Meh on another.
  74. if (keycode == BABL_TERTIARY_OS_MOD ) {
  75. if (babble_mode == BABL_MAC_MODE) {
  76. if (is_pressed) {
  77. register_code(KC_LALT);
  78. } else {
  79. unregister_code(KC_LALT);
  80. }
  81. } else { // everybody else
  82. if (is_pressed) {
  83. register_code(KC_LALT);
  84. } else {
  85. unregister_code(KC_LALT);
  86. }
  87. }
  88. }
  89. # endif
  90. // below here we are only running macros - don't serve any key up events.
  91. if (is_pressed == 0 ) {
  92. return true;
  93. }
  94. // handle increment functions.
  95. if (keycode == BABL_MODE_INCREMENT) {
  96. babble_mode_increment();
  97. return true;
  98. }
  99. if (keycode == BABL_MODE_DECREMENT) {
  100. babble_mode_decrement();
  101. return true;
  102. }
  103. # ifdef BABL_MAC
  104. if (keycode == BABL_DO_MAC) {
  105. set_babble_mode(BABL_MAC_MODE);
  106. babble_modeswitch_kb(babble_mode);
  107. return true;
  108. }
  109. if (babble_mode == BABL_MAC_MODE) {
  110. babblePaste_mac(keycode);
  111. }
  112. # endif
  113. # ifdef BABL_VI
  114. if (keycode == BABL_DO_VI) {
  115. set_babble_mode(BABL_VI_MODE);
  116. babble_modeswitch_kb(babble_mode);
  117. return true;
  118. }
  119. if (babble_mode == BABL_VI_MODE) {
  120. babblePaste_vi(keycode);
  121. }
  122. # endif
  123. # ifdef BABL_WINDOWS
  124. if (keycode == BABL_DO_WINDOWS) {
  125. set_babble_mode(BABL_WINDOWS_MODE);
  126. babble_modeswitch_kb(babble_mode);
  127. return true;
  128. }
  129. if (babble_mode == BABL_WINDOWS_MODE) {
  130. babblePaste_win(keycode);
  131. }
  132. # endif
  133. # ifdef BABL_LINUX
  134. if (keycode == BABL_DO_LINUX) {
  135. set_babble_mode(BABL_LINUX_MODE);
  136. babble_modeswitch_kb(babble_mode);
  137. return true;
  138. }
  139. if (babble_mode == BABL_LINUX_MODE) {
  140. babblePaste_linux(keycode);
  141. }
  142. # endif
  143. # ifdef BABL_EMACS
  144. if (keycode == BABL_DO_EMACS) {
  145. set_babble_mode(BABL_EMACS_MODE);
  146. babble_modeswitch_kb(babble_mode);
  147. return true;
  148. }
  149. if (babble_mode == BABL_EMACS_MODE) {
  150. babblePaste_emacs(keycode);
  151. }
  152. # endif
  153. # ifdef BABL_NANO
  154. if (keycode == BABL_DO_NANO) {
  155. set_babble_mode(BABL_NANO_MODE);
  156. babble_modeswitch_kb(babble_mode);
  157. return true;
  158. }
  159. if (babble_mode == BABL_NANO_MODE) {
  160. babblePaste_nano(keycode);
  161. }
  162. # endif
  163. # ifdef BABL_KITTY
  164. if (keycode == BABL_DO_KITTY) {
  165. set_babble_mode(BABL_KITTY_MODE);
  166. babble_modeswitch_kb(babble_mode);
  167. return true;
  168. }
  169. if (babble_mode == BABL_KITTY_MODE) {
  170. babblePaste_kitty(keycode);
  171. }
  172. # endif
  173. # ifdef BABL_CHROMEOS
  174. if (keycode == BABL_DO_CHROMEOS) {
  175. set_babble_mode(BABL_CHROMEOS_MODE);
  176. babble_modeswitch_kb(babble_mode);
  177. return true;
  178. }
  179. if (babble_mode == BABL_CHROMEOS_MODE) {
  180. babblePaste_chromeos(keycode);
  181. }
  182. # endif
  183. # ifdef BABL_READMUX
  184. if (keycode == BABL_DO_READMUX) {
  185. set_babble_mode(BABL_READMUX_MODE);
  186. babble_modeswitch_kb(babble_mode);
  187. return true;
  188. }
  189. if (babble_mode == BABL_READMUX_MODE) {
  190. babblePaste_readmux(keycode);
  191. }
  192. # endif
  193. return false;
  194. }
  195. #endif // USE_BABBLEPASTE