/* Copyright 2013 Jun Wako 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 . */ #ifndef ACTION_LAYER_H #define ACTION_LAYER_H #include #include "keyboard.h" #include "action.h" #if defined(LAYER_STATE_8BIT) typedef uint8_t layer_state_t; # define get_highest_layer(state) biton(state) #elif defined(LAYER_STATE_16BIT) typedef uint16_t layer_state_t; # define get_highest_layer(state) biton16(state) #else typedef uint32_t layer_state_t; # define get_highest_layer(state) biton32(state) #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); #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 & 1UL << 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 #endif layer_state_t layer_state_set_user(layer_state_t state); 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 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); #endif