|  |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include "keyboard.h"
 | 
					
						
							|  |  |  | #include "action.h"
 | 
					
						
							|  |  |  | #include "util.h"
 | 
					
						
							|  |  |  | #include "action_layer.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef DEBUG_ACTION
 | 
					
						
							|  |  |  | #include "debug.h"
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #include "nodebug.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 
 | 
					
						
							|  |  |  |  * Default Layer State | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | uint32_t default_layer_state = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void default_layer_state_set(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     debug("default_layer_state: "); | 
					
						
							|  |  |  |     default_layer_debug(); debug(" to "); | 
					
						
							|  |  |  |     default_layer_state = state; | 
					
						
							|  |  |  |     default_layer_debug(); debug("\n"); | 
					
						
							|  |  |  |     clear_keyboard_but_mods(); // To avoid stuck keys
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void default_layer_debug(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void default_layer_set(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     default_layer_state_set(state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NO_ACTION_LAYER
 | 
					
						
							|  |  |  | void default_layer_or(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     default_layer_state_set(default_layer_state | state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void default_layer_and(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     default_layer_state_set(default_layer_state & state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void default_layer_xor(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     default_layer_state_set(default_layer_state ^ state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NO_ACTION_LAYER
 | 
					
						
							|  |  |  | /* 
 | 
					
						
							|  |  |  |  * Keymap Layer State | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | uint32_t layer_state = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void layer_state_set(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     dprint("layer_state: "); | 
					
						
							|  |  |  |     layer_debug(); dprint(" to "); | 
					
						
							|  |  |  |     layer_state = state; | 
					
						
							|  |  |  |     layer_debug(); dprintln(); | 
					
						
							|  |  |  |     clear_keyboard_but_mods(); // To avoid stuck keys
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_clear(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_move(uint8_t layer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(1UL<<layer); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_on(uint8_t layer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state | (1UL<<layer)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_off(uint8_t layer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state & ~(1UL<<layer)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_invert(uint8_t layer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state ^ (1UL<<layer)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_or(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state | state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void layer_and(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state & state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void layer_xor(uint32_t state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     layer_state_set(layer_state ^ state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void layer_debug(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     dprintf("%08lX(%u)", layer_state, biton32(layer_state)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | action_t layer_switch_get_action(keypos_t key) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     action_t action; | 
					
						
							|  |  |  |     action.code = ACTION_TRANSPARENT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NO_ACTION_LAYER
 | 
					
						
							|  |  |  |     uint32_t layers = layer_state | default_layer_state; | 
					
						
							|  |  |  |     /* check top layer first */ | 
					
						
							|  |  |  |     for (int8_t i = 31; i >= 0; i--) { | 
					
						
							|  |  |  |         if (layers & (1UL<<i)) { | 
					
						
							|  |  |  |             action = action_for_key(i, key); | 
					
						
							|  |  |  |             if (action.code != ACTION_TRANSPARENT) { | 
					
						
							|  |  |  |                 return action; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* fall back to layer 0 */ | 
					
						
							|  |  |  |     action = action_for_key(0, key); | 
					
						
							|  |  |  |     return action; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     action = action_for_key(biton32(default_layer_state), key); | 
					
						
							|  |  |  |     return action; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } |