action_layer.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #include <stdint.h>
  2. #include "keyboard.h"
  3. #include "action.h"
  4. #include "util.h"
  5. #include "action_layer.h"
  6. #ifdef DEBUG_ACTION
  7. # include "debug.h"
  8. #else
  9. # include "nodebug.h"
  10. #endif
  11. /** \brief Default Layer State
  12. */
  13. layer_state_t default_layer_state = 0;
  14. /** \brief Default Layer State Set At user Level
  15. *
  16. * Run user code on default layer state change
  17. */
  18. __attribute__((weak)) layer_state_t default_layer_state_set_user(layer_state_t state) {
  19. return state;
  20. }
  21. /** \brief Default Layer State Set At Keyboard Level
  22. *
  23. * Run keyboard code on default layer state change
  24. */
  25. __attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t state) {
  26. return default_layer_state_set_user(state);
  27. }
  28. /** \brief Default Layer State Set
  29. *
  30. * Static function to set the default layer state, prints debug info and clears keys
  31. */
  32. static void default_layer_state_set(layer_state_t state) {
  33. state = default_layer_state_set_kb(state);
  34. debug("default_layer_state: ");
  35. default_layer_debug();
  36. debug(" to ");
  37. default_layer_state = state;
  38. default_layer_debug();
  39. debug("\n");
  40. #ifdef STRICT_LAYER_RELEASE
  41. clear_keyboard_but_mods(); // To avoid stuck keys
  42. #else
  43. clear_keyboard_but_mods_and_keys(); // Don't reset held keys
  44. #endif
  45. }
  46. /** \brief Default Layer Print
  47. *
  48. * Print out the hex value of the 32-bit default layer state, as well as the value of the highest bit.
  49. */
  50. void default_layer_debug(void) {
  51. dprintf("%08lX(%u)", default_layer_state, get_highest_layer(default_layer_state));
  52. }
  53. /** \brief Default Layer Set
  54. *
  55. * Sets the default layer state.
  56. */
  57. void default_layer_set(layer_state_t state) {
  58. default_layer_state_set(state);
  59. }
  60. #ifndef NO_ACTION_LAYER
  61. /** \brief Default Layer Or
  62. *
  63. * Turns on the default layer based on matching bits between specifed layer and existing layer state
  64. */
  65. void default_layer_or(layer_state_t state) {
  66. default_layer_state_set(default_layer_state | state);
  67. }
  68. /** \brief Default Layer And
  69. *
  70. * Turns on default layer based on matching enabled bits between specifed layer and existing layer state
  71. */
  72. void default_layer_and(layer_state_t state) {
  73. default_layer_state_set(default_layer_state & state);
  74. }
  75. /** \brief Default Layer Xor
  76. *
  77. * Turns on default layer based on non-matching bits between specifed layer and existing layer state
  78. */
  79. void default_layer_xor(layer_state_t state) {
  80. default_layer_state_set(default_layer_state ^ state);
  81. }
  82. #endif
  83. #ifndef NO_ACTION_LAYER
  84. /** \brief Keymap Layer State
  85. */
  86. layer_state_t layer_state = 0;
  87. /** \brief Layer state set user
  88. *
  89. * Runs user code on layer state change
  90. */
  91. __attribute__((weak)) layer_state_t layer_state_set_user(layer_state_t state) {
  92. return state;
  93. }
  94. /** \brief Layer state set keyboard
  95. *
  96. * Runs keyboard code on layer state change
  97. */
  98. __attribute__((weak)) layer_state_t layer_state_set_kb(layer_state_t state) {
  99. return layer_state_set_user(state);
  100. }
  101. /** \brief Layer state set
  102. *
  103. * Sets the layer to match the specifed state (a bitmask)
  104. */
  105. void layer_state_set(layer_state_t state) {
  106. state = layer_state_set_kb(state);
  107. dprint("layer_state: ");
  108. layer_debug();
  109. dprint(" to ");
  110. layer_state = state;
  111. layer_debug();
  112. dprintln();
  113. # ifdef STRICT_LAYER_RELEASE
  114. clear_keyboard_but_mods(); // To avoid stuck keys
  115. # else
  116. clear_keyboard_but_mods_and_keys(); // Don't reset held keys
  117. # endif
  118. }
  119. /** \brief Layer clear
  120. *
  121. * Turn off all layers
  122. */
  123. void layer_clear(void) {
  124. layer_state_set(0);
  125. }
  126. /** \brief Layer state is
  127. *
  128. * Return whether the given state is on (it might still be shadowed by a higher state, though)
  129. */
  130. bool layer_state_is(uint8_t layer) {
  131. return layer_state_cmp(layer_state, layer);
  132. }
  133. /** \brief Layer state compare
  134. *
  135. * Used for comparing layers {mostly used for unit testing}
  136. */
  137. bool layer_state_cmp(layer_state_t cmp_layer_state, uint8_t layer) {
  138. if (!cmp_layer_state) {
  139. return layer == 0;
  140. }
  141. return (cmp_layer_state & ((layer_state_t)1 << layer)) != 0;
  142. }
  143. /** \brief Layer move
  144. *
  145. * Turns on the given layer and turn off all other layers
  146. */
  147. void layer_move(uint8_t layer) {
  148. layer_state_set((layer_state_t)1 << layer);
  149. }
  150. /** \brief Layer on
  151. *
  152. * Turns on given layer
  153. */
  154. void layer_on(uint8_t layer) {
  155. layer_state_set(layer_state | ((layer_state_t)1 << layer));
  156. }
  157. /** \brief Layer off
  158. *
  159. * Turns off given layer
  160. */
  161. void layer_off(uint8_t layer) {
  162. layer_state_set(layer_state & ~((layer_state_t)1 << layer));
  163. }
  164. /** \brief Layer invert
  165. *
  166. * Toggle the given layer (set it if it's unset, or unset it if it's set)
  167. */
  168. void layer_invert(uint8_t layer) {
  169. layer_state_set(layer_state ^ ((layer_state_t)1 << layer));
  170. }
  171. /** \brief Layer or
  172. *
  173. * Turns on layers based on matching bits between specifed layer and existing layer state
  174. */
  175. void layer_or(layer_state_t state) {
  176. layer_state_set(layer_state | state);
  177. }
  178. /** \brief Layer and
  179. *
  180. * Turns on layers based on matching enabled bits between specifed layer and existing layer state
  181. */
  182. void layer_and(layer_state_t state) {
  183. layer_state_set(layer_state & state);
  184. }
  185. /** \brief Layer xor
  186. *
  187. * Turns on layers based on non-matching bits between specifed layer and existing layer state
  188. */
  189. void layer_xor(layer_state_t state) {
  190. layer_state_set(layer_state ^ state);
  191. }
  192. /** \brief Layer debug printing
  193. *
  194. * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit.
  195. */
  196. void layer_debug(void) {
  197. dprintf("%08lX(%u)", layer_state, get_highest_layer(layer_state));
  198. }
  199. #endif
  200. #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
  201. /** \brief source layer cache
  202. */
  203. uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}};
  204. /** \brief update source layers cache
  205. *
  206. * Updates the cached keys when changing layers
  207. */
  208. void update_source_layers_cache(keypos_t key, uint8_t layer) {
  209. const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
  210. const uint8_t storage_row = key_number / 8;
  211. const uint8_t storage_bit = key_number % 8;
  212. for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
  213. source_layers_cache[storage_row][bit_number] ^= (-((layer & (1U << bit_number)) != 0) ^ source_layers_cache[storage_row][bit_number]) & (1U << storage_bit);
  214. }
  215. }
  216. /** \brief read source layers cache
  217. *
  218. * reads the cached keys stored when the layer was changed
  219. */
  220. uint8_t read_source_layers_cache(keypos_t key) {
  221. const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
  222. const uint8_t storage_row = key_number / 8;
  223. const uint8_t storage_bit = key_number % 8;
  224. uint8_t layer = 0;
  225. for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
  226. layer |= ((source_layers_cache[storage_row][bit_number] & (1U << storage_bit)) != 0) << bit_number;
  227. }
  228. return layer;
  229. }
  230. #endif
  231. /** \brief Store or get action (FIXME: Needs better summary)
  232. *
  233. * Make sure the action triggered when the key is released is the same
  234. * one as the one triggered on press. It's important for the mod keys
  235. * when the layer is switched after the down event but before the up
  236. * event as they may get stuck otherwise.
  237. */
  238. action_t store_or_get_action(bool pressed, keypos_t key) {
  239. #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
  240. if (disable_action_cache) {
  241. return layer_switch_get_action(key);
  242. }
  243. uint8_t layer;
  244. if (pressed) {
  245. layer = layer_switch_get_layer(key);
  246. update_source_layers_cache(key, layer);
  247. } else {
  248. layer = read_source_layers_cache(key);
  249. }
  250. return action_for_key(layer, key);
  251. #else
  252. return layer_switch_get_action(key);
  253. #endif
  254. }
  255. /** \brief Layer switch get layer
  256. *
  257. * Gets the layer based on key info
  258. */
  259. uint8_t layer_switch_get_layer(keypos_t key) {
  260. #ifndef NO_ACTION_LAYER
  261. action_t action;
  262. action.code = ACTION_TRANSPARENT;
  263. layer_state_t layers = layer_state | default_layer_state;
  264. /* check top layer first */
  265. for (int8_t i = MAX_LAYER - 1; i >= 0; i--) {
  266. if (layers & ((layer_state_t)1 << i)) {
  267. action = action_for_key(i, key);
  268. if (action.code != ACTION_TRANSPARENT) {
  269. return i;
  270. }
  271. }
  272. }
  273. /* fall back to layer 0 */
  274. return 0;
  275. #else
  276. return get_highest_layer(default_layer_state);
  277. #endif
  278. }
  279. /** \brief Layer switch get layer
  280. *
  281. * Gets action code based on key position
  282. */
  283. action_t layer_switch_get_action(keypos_t key) {
  284. return action_for_key(layer_switch_get_layer(key), key);
  285. }