summaryrefslogtreecommitdiff
path: root/tmk_core/common/action.c
diff options
context:
space:
mode:
authorChristopher Browne <cbbrowne@ca.afilias.info>2016-04-13 12:02:51 -0400
committerChristopher Browne <cbbrowne@ca.afilias.info>2016-04-13 12:02:51 -0400
commit6ec6b613536b7138ee0c87002b10da8fe0c0117d (patch)
tree9bd7d842cb99a84ab6ae96b3437c39e41f9608d9 /tmk_core/common/action.c
parent5bbcc484a8e14ffb13354df4efdd460ebe7200e1 (diff)
parenta0194d7e5ff2f3d242a5c6508abf81b4ddf67a3e (diff)
Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware
Diffstat (limited to 'tmk_core/common/action.c')
-rw-r--r--tmk_core/common/action.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index 2ccc0e0b94..f9e6c17dc3 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -53,6 +53,22 @@ void action_exec(keyevent_t event)
#endif
}
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+bool disable_action_cache = false;
+
+void process_action_nocache(keyrecord_t *record)
+{
+ disable_action_cache = true;
+ process_action(record);
+ disable_action_cache = false;
+}
+#else
+void process_action_nocache(keyrecord_t *record)
+{
+ process_action(record);
+}
+#endif
+
__attribute__ ((weak))
void process_action_kb(keyrecord_t *record) {}
@@ -67,7 +83,7 @@ void process_action(keyrecord_t *record)
process_action_kb(record);
- action_t action = layer_switch_get_action(event.key);
+ action_t action = store_or_get_action(event.pressed, event.key);
dprint("ACTION: "); debug_action(action);
#ifndef NO_ACTION_LAYER
dprint(" layer_state: "); layer_debug();
@@ -88,14 +104,24 @@ void process_action(keyrecord_t *record)
action.key.mods<<4;
if (event.pressed) {
if (mods) {
- add_weak_mods(mods);
+ if (IS_MOD(action.key.code)) {
+ // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless.
+ // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT)
+ add_mods(mods);
+ } else {
+ add_weak_mods(mods);
+ }
send_keyboard_report();
}
register_code(action.key.code);
} else {
unregister_code(action.key.code);
if (mods) {
- del_weak_mods(mods);
+ if (IS_MOD(action.key.code)) {
+ del_mods(mods);
+ } else {
+ del_weak_mods(mods);
+ }
send_keyboard_report();
}
}