diff options
author | Alex Ong <the.onga@gmail.com> | 2020-05-11 10:04:38 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-11 01:04:38 +0100 |
commit | 361ac2f32ac8b906dbb29cd0a6c5f971dad298c3 (patch) | |
tree | d4b8a2e2cfc464314a713f00294881fefa67f983 | |
parent | d15a60d2d318ede79746c09d5beb79ba72037f30 (diff) | |
download | qmk_firmware-361ac2f32ac8b906dbb29cd0a6c5f971dad298c3.tar.gz qmk_firmware-361ac2f32ac8b906dbb29cd0a6c5f971dad298c3.zip |
Optimization for scanning less layers. (#8311)
* Optimization for scanning less layers.
* Rename NUM_LAYERS to MAX_LAYER.
-rw-r--r-- | tmk_core/common/action_layer.c | 2 | ||||
-rw-r--r-- | tmk_core/common/action_layer.h | 15 |
2 files changed, 14 insertions, 3 deletions
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 81f86f0f34..af2d7d964b 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -257,7 +257,7 @@ uint8_t layer_switch_get_layer(keypos_t key) { layer_state_t layers = layer_state | default_layer_state; /* check top layer first */ - for (int8_t i = sizeof(layer_state_t) * 8 - 1; i >= 0; i--) { + for (int8_t i = MAX_LAYER - 1; i >= 0; i--) { if (layers & (1UL << i)) { action = action_for_key(i, key); if (action.code != ACTION_TRANSPARENT) { diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index c283d26232..16922c1ff9 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -23,12 +23,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #if defined(LAYER_STATE_8BIT) typedef uint8_t layer_state_t; +# define MAX_LAYER_BITS 3 +# ifndef MAX_LAYER +# define MAX_LAYER 8 +# endif # define get_highest_layer(state) biton(state) #elif defined(LAYER_STATE_16BIT) typedef uint16_t layer_state_t; +# define MAX_LAYER_BITS 4 +# ifndef MAX_LAYER +# define MAX_LAYER 16 +# endif # define get_highest_layer(state) biton16(state) #else typedef uint32_t layer_state_t; +# define MAX_LAYER_BITS 5 +# ifndef MAX_LAYER +# define MAX_LAYER 32 +# endif # define get_highest_layer(state) biton32(state) #endif @@ -96,8 +108,7 @@ layer_state_t layer_state_set_kb(layer_state_t state); /* pressed actions cache */ #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) -/* The number of bits needed to represent the layer number: log2(32). */ -# define MAX_LAYER_BITS 5 + void update_source_layers_cache(keypos_t key, uint8_t layer); uint8_t read_source_layers_cache(keypos_t key); #endif |