diff options
Diffstat (limited to 'quantum/action_layer.h')
| -rw-r--r-- | quantum/action_layer.h | 147 | 
1 files changed, 147 insertions, 0 deletions
| diff --git a/quantum/action_layer.h b/quantum/action_layer.h new file mode 100644 index 0000000000..b87d096eed --- /dev/null +++ b/quantum/action_layer.h @@ -0,0 +1,147 @@ +/* +Copyright 2013 Jun Wako <[email protected]> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include <stdint.h> +#include "keyboard.h" +#include "action.h" + +#ifdef DYNAMIC_KEYMAP_ENABLE +#    ifndef DYNAMIC_KEYMAP_LAYER_COUNT +#        define DYNAMIC_KEYMAP_LAYER_COUNT 4 +#    endif +#    if DYNAMIC_KEYMAP_LAYER_COUNT <= 8 +#        ifndef LAYER_STATE_8BIT +#            define LAYER_STATE_8BIT +#        endif +#    elif DYNAMIC_KEYMAP_LAYER_COUNT <= 16 +#        ifndef LAYER_STATE_16BIT +#            define LAYER_STATE_16BIT +#        endif +#    else +#        ifndef LAYER_STATE_32BIT +#            define LAYER_STATE_32BIT +#        endif +#    endif +#endif + +#if !defined(LAYER_STATE_8BIT) && !defined(LAYER_STATE_16BIT) && !defined(LAYER_STATE_32BIT) +#    define LAYER_STATE_32BIT +#endif + +#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) +#elif defined(LAYER_STATE_32BIT) +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) +#else +#    error Layer Mask size not specified.  HOW?! +#endif + +/* + * Default Layer + */ +extern layer_state_t default_layer_state; +void                 default_layer_debug(void); +void                 default_layer_set(layer_state_t state); + +__attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t state); +__attribute__((weak)) layer_state_t default_layer_state_set_user(layer_state_t state); + +#ifndef NO_ACTION_LAYER +/* bitwise operation */ +void default_layer_or(layer_state_t state); +void default_layer_and(layer_state_t state); +void default_layer_xor(layer_state_t state); +#else +#    define default_layer_or(state) +#    define default_layer_and(state) +#    define default_layer_xor(state) +#endif + +/* + * Keymap Layer + */ +#ifndef NO_ACTION_LAYER +extern layer_state_t layer_state; + +void layer_state_set(layer_state_t state); +bool layer_state_is(uint8_t layer); +bool layer_state_cmp(layer_state_t layer1, uint8_t layer2); + +void layer_debug(void); +void layer_clear(void); +void layer_move(uint8_t layer); +void layer_on(uint8_t layer); +void layer_off(uint8_t layer); +void layer_invert(uint8_t layer); +/* bitwise operation */ +void          layer_or(layer_state_t state); +void          layer_and(layer_state_t state); +void          layer_xor(layer_state_t state); +layer_state_t layer_state_set_user(layer_state_t state); +layer_state_t layer_state_set_kb(layer_state_t state); +#else +#    define layer_state 0 + +#    define layer_state_set(layer) +#    define layer_state_is(layer) (layer == 0) +#    define layer_state_cmp(state, layer) (state == 0 ? layer == 0 : (state & (layer_state_t)1 << layer) != 0) + +#    define layer_debug() +#    define layer_clear() +#    define layer_move(layer) (void)layer +#    define layer_on(layer) (void)layer +#    define layer_off(layer) (void)layer +#    define layer_invert(layer) (void)layer +#    define layer_or(state) (void)state +#    define layer_and(state) (void)state +#    define layer_xor(state) (void)state +#    define layer_state_set_kb(state) (void)state +#    define layer_state_set_user(state) (void)state +#endif + +/* pressed actions cache */ +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) + +void    update_source_layers_cache(keypos_t key, uint8_t layer); +uint8_t read_source_layers_cache(keypos_t key); +#endif +action_t store_or_get_action(bool pressed, keypos_t key); + +/* return the topmost non-transparent layer currently associated with key */ +uint8_t layer_switch_get_layer(keypos_t key); + +/* return action depending on current layer status */ +action_t layer_switch_get_action(keypos_t key); | 
