SHIFT mod in mod-tap key not working in mod-morph sequence
kmandarin-orange opened this issue · 2 comments
I'm having some trouble with getting any of my mod-morphs to work correctly, and it seems to be because of my shift key being behind a mod-tap. For example, I want to make SHIFT + BACKSPACE act as DELETE, but the behavior seems to simply be SHIFT and BACKSPACE being sent separately. That's what I gathered from this wev
output at least:
[14: wl_keyboard] key: serial: 91284; time: 50070095; key: 50; state: 1 (pressed)
sym: Shift_L (65505), utf8: ''
[14: wl_keyboard] modifiers: serial: 91285; group: 0
depressed: 00000001: Shift
latched: 00000000
locked: 00000010: Mod2
[14: wl_keyboard] key: serial: 91286; time: 50070254; key: 22; state: 1 (pressed)
sym: BackSpace (65288), utf8: '\b'
[14: wl_keyboard] key: serial: 91287; time: 50070314; key: 22; state: 0 (released)
sym: BackSpace (65288), utf8: ''
[14: wl_keyboard] key: serial: 91288; time: 50070479; key: 50; state: 0 (released)
sym: Shift_L (65505), utf8: ''
[14: wl_keyboard] modifiers: serial: 91289; group: 0
depressed: 00000000
latched: 00000000
locked: 00000010: Mod2
This behavior hasn't been limited to this specific case though, all of the following mod-morphs don't behave as expected when combined with either of my shift keys:
behaviors {
bksp_del: bksp_del {
compatible = "zmk,behavior-mod-morph";
label = "BKSP_DEL";
bindings = <&kp BACKSPACE>, <&kp DELETE>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
gaming_layer: gaming_layer {
compatible = "zmk,behavior-mod-morph";
label = "GAMING_LAYER";
bindings = <&tog 2>, <&tog 3>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
up_pgup: up_pgup {
compatible = "zmk,behavior-mod-morph";
label = "UP_PGUP";
bindings = <&kp UP_ARROW>, <&kp PG_UP>;
#binding-cells = <0>;
mods = <(MOD_RSFT|MOD_LSFT)>;
};
down_pgdown: down_pgdown {
compatible = "zmk,behavior-mod-morph";
label = "DOWN_PGDOWN";
bindings = <&kp DOWN_ARROW>, <&kp PAGE_DOWN>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
left_home: left_home {
compatible = "zmk,behavior-mod-morph";
label = "LEFT_HOME";
bindings = <&kp LEFT_ARROW>, <&kp HOME>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
right_end: right_end {
compatible = "zmk,behavior-mod-morph";
label = "RIGHT_END";
bindings = <&kp RIGHT_ARROW>, <&kp END>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
Further Information
I'm running all of this on my TOTEM keyboard (modified to use a dongle connection). Here's my full keymap:
My full keymap...
//
// ▀▀▀▀▀ ▀▀▀▀▀ ▀▀█▀▀
// ▄▀▀▀▄ ▄ ▄▀▀▀▄ ▄ ▄▀▀▀▄ █ ▄▀▀▀▄
// █ █ █ █ █ █ █ █ █ █ █
// ▀▀▀ █ ▀▀▀ █ ▀▀▀ ▀ ▀▀▀
// █ ▄▄▄█▄▄▄ █ █
// ▀ █ █ █ █▄█
// ▀▀▀▀▀ █ █ █ ▀
// ▀ ▀ ▀
//
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#define BASE 0
#define NAV 1
#define SYM 2
#define ADJ 3
&mt {
quick-tap-ms = <100>;
global-quick-tap;
flavor = "tap-preferred";
tapping-term-ms = <170>;
};
/ {
combos {
compatible = "zmk,combos";
Enter {
bindings = <&kp ENTER>;
key-positions = <19 18 17>;
};
Backspace {
bindings = <&kp BACKSPACE>;
key-positions = <9 8 7>;
};
Tab {
bindings = <&kp TAB>;
key-positions = <0 1 2>;
};
Grave {
bindings = <&kp GRAVE>;
key-positions = <0 1>;
};
Bootloader {
bindings = <&bootloader>;
key-positions = <20 34 35 31>;
};
Delete-workaround {
bindings = <&kp DELETE>;
key-positions = <20 35>;
};
};
behaviors {
bksp_del: bksp_del {
compatible = "zmk,behavior-mod-morph";
label = "BKSP_DEL";
bindings = <&kp BACKSPACE>, <&kp DELETE>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
gaming_layer: gaming_layer {
compatible = "zmk,behavior-mod-morph";
label = "GAMING_LAYER";
bindings = <&tog 2>, <&tog 3>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
up_pgup: up_pgup {
compatible = "zmk,behavior-mod-morph";
label = "UP_PGUP";
bindings = <&kp UP_ARROW>, <&kp PG_UP>;
#binding-cells = <0>;
mods = <(MOD_RSFT|MOD_LSFT)>;
};
down_pgdown: down_pgdown {
compatible = "zmk,behavior-mod-morph";
label = "DOWN_PGDOWN";
bindings = <&kp DOWN_ARROW>, <&kp PAGE_DOWN>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
left_home: left_home {
compatible = "zmk,behavior-mod-morph";
label = "LEFT_HOME";
bindings = <&kp LEFT_ARROW>, <&kp HOME>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
right_end: right_end {
compatible = "zmk,behavior-mod-morph";
label = "RIGHT_END";
bindings = <&kp RIGHT_ARROW>, <&kp END>;
#binding-cells = <0>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
};
keymap {
compatible = "zmk,keymap";
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
base_layer {
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
label = "BASE";
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
// ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓ ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓
// ┃ Q ┃ W ┃ E ┃ R ┃ T ┃ ┃ Y ┃ U ┃ I ┃ O ┃ P ┃
// ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫
// ┃ A ┃ S ┃ D ┃ F ┃ G ┃ ┃ H ┃ J ┃ K ┃ L ┃ ; ┃
// ┏━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┓
// ┃ Q ┃ Z ┃ X ┃ C ┃ V ┃ B ┃ ┃ N ┃ M ┃ , ┃ . ┃ / ┃ \ ┃
// ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛
// ┃ DEL ┃ TAB ┃ SPC ┃ ┃ ENTER ┃ ┃ BSPC ┃
// ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛ ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛
bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI
&mt LEFT_SHIFT ESC &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RIGHT_SHIFT APOSTROPHE
&mt LEFT_ALT MINUS &mt LEFT_CONTROL SPACE &kp LEFT_COMMAND &kp BACKSPACE < 1 SPACE < 2 EQUAL
>;
};
nums_and_syms {
bindings = <
&kp EXCLAMATION &kp AT_SIGN &kp HASH &kp DOLLAR &kp PERCENT &kp CARET &kp AMPERSAND &kp ASTERISK &kp LPAR &kp RIGHT_PARENTHESIS
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
&trans &kp GRAVE &trans &kp LEFT_BRACKET &kp RIGHT_BRACKET &kp MINUS &kp EQUAL &trans &trans &trans &kp BACKSLASH &trans
&trans &trans &trans &trans &trans &trans
>;
};
movement_and_media {
bindings = <
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F8 &kp F9 &kp UP_ARROW &kp F11 &kp F12
&kp F6 &kp K_MUTE &kp C_VOL_DN &kp C_VOLUME_UP &kp C_BRIGHTNESS_DEC &kp C_BRIGHTNESS_INC &kp LEFT_ARROW &kp DOWN_ARROW &kp RIGHT_ARROW &kp INSERT
&trans &kp F7 &kp C_PREVIOUS &kp C_PAUSE &kp C_NEXT &kp PRINTSCREEN &trans &trans &trans &trans &kp K_LOCK &trans
&to 3 &trans &trans &trans &trans &trans
>;
};
gaming {
bindings = <
&kp T &kp Q &kp W &kp E &kp R &kp F1 &kp F2 &kp F3 &kp F4 &kp F5
&kp G &kp A &kp S &kp D &kp F &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp NUMBER_4 &kp N5
&kp LSHFT &kp B &kp Z &kp X &kp C &kp V &kp H &kp N &kp M &kp DOT &kp FSLH &kp RET
&mt LEFT_ALT ESCAPE &kp LCTRL &kp SPACE &kp SPACE < 2 BACKSPACE &to 0
>;
};
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
};
};
Unless I am misreading, you are defining the mod-morph such as bksp_del
but you aren't assigning it to the backspace key position. Mod morphs aren't global "rules", they are behaviors so you need to assign and use them for them to work.
Oh jeez that was a huge misunderstanding on my part, sorry to bother with a goofy issue report. I'll get this closed, thank you for your time!