zmkfirmware/zmk

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  &lt 1 SPACE  &lt 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     &lt 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!