1
0
tmk_keyboard/common/action_layer.c
tmk 20b787fc12 Squashed 'tmk_core/' changes from d5c5ac6..8da1898
8da1898 Merge remote-tracking branch 'flabbergast/chibios'
f0fdd8a ChibiOS: update instructions.md.
24dd0b5 ChibiOS: update mk to match chibios/master.
cdee266 Merge branch 'develop' into chibios
221663c Fix signatre of layer state change hooks
5a364cb Merge branch 'hotfix-chibios' into develop
af664cd Merge branch 'newapi' into develop
04feeaa Clean hook codes
0ca106d Fix code and table in hook.txt
714d418 Add hook document from njbair's work
b715129 Chibios: add default location for chibios-contrib.
fb3a323 Merge branch 'master' into newapi
8b7fbbd Merge branch 'master' into develop
e49851a Chibios: add default location for chibios-contrib.

git-subtree-dir: tmk_core
git-subtree-split: 8da189851ba83b9bb46a4290cd76b7b7fef6134e
2016-05-22 22:49:29 +09:00

142 lines
2.7 KiB
C

#include <stdint.h>
#include "keyboard.h"
#include "action.h"
#include "util.h"
#include "action_layer.h"
#include "hook.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;
hook_default_layer_change(default_layer_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;
hook_layer_change(layer_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
}