Commit 414969893431

Vincent Demeester <vincent@sbr.pm>
2026-02-18 10:22:45
fix(keyboards): use non-dead key macros for combos
Replaced raw keycodes (DQT, TILDE, GRAVE) with dead key + space macros for us-intl OS layout compatibility. Added FR_TILD custom keycode on Moonlander and fixed symbol layer tilde. Created standalone ZMK macros for combo bindings on Eyelash Corne.
1 parent bac94c4
Changed files (4)
keyboards
eyelash_corne
moonlander
keyboards/eyelash_corne/config/combos.dtsi
@@ -55,10 +55,10 @@ ZMK_COMBO(rbrc, &kp RBKT, RM3 RB3, BEP ERG QWE)   // ]
 ZMK_COMBO(labk, &kp GT, RT3 RT2, BEP ERG QWE)     // <
 ZMK_COMBO(rabk, &kp LT, RT2 RT1, BEP ERG QWE)     // >
 
-ZMK_COMBO(dquo, &kp DQT, RT0 RM0, BEP ERG QWE)    // "
-ZMK_COMBO(tilde, &kp TILDE, LT0 LM0, BEP ERG QWE) // ~
-ZMK_COMBO(prcnt, &kp PRCNT, LM0 LB0, BEP ERG QWE) // %
-ZMK_COMBO(grave, &kp GRAVE, RM0 RB0, BEP ERG QWE)  // ` (non-dead)
+ZMK_COMBO(dquo, &standalone_dquo, RT0 RM0, BEP ERG QWE)    // " (dead DQT + space on us-intl)
+ZMK_COMBO(tilde, &standalone_tild, LT0 LM0, BEP ERG QWE)  // ~ (dead tilde + space on us-intl)
+ZMK_COMBO(prcnt, &kp PRCNT, LM0 LB0, BEP ERG QWE)        // %
+ZMK_COMBO(grave, &standalone_grav, RM0 RB0, BEP ERG QWE)   // ` (dead grave + space on us-intl)
 ZMK_COMBO(star, &kp STAR, RT4 RM4, BEP ERG QWE)    // *
 ZMK_COMBO(plus, &kp PLUS, RM4 RB4, BEP ERG QWE)    // +
 
keyboards/eyelash_corne/config/mod-morph.dtsi
@@ -33,6 +33,21 @@ ZMK_MACRO_ONE_PARAM(TREM, bindings =
     <&macro_tap &kp MACRO_PLACEHOLDER>;
 )
 
+// ~ to input (TILDE = LS(GRAVE), so use shift + grave)
+// Note: can't use "TILD" as name — it's a deprecated ZMK keycode #define
+ZMK_MACRO_ONE_PARAM(TILDEMACRO, bindings =
+    <&macro_press &kp LSHFT>,
+    <&macro_tap &kp GRAVE>,
+    <&macro_release &kp LSHFT>,
+    <&macro_param_1to1>,
+    <&macro_tap &kp MACRO_PLACEHOLDER>;
+)
+
+// Standalone dead key macros (dead key + space) for use in combos
+ZMK_MACRO(standalone_dquo, bindings = <&macro_tap &kp DQT &kp SPACE>;)                                       // "
+ZMK_MACRO(standalone_tild, bindings = <&macro_press &kp LSHFT>, <&macro_tap &kp GRAVE>, <&macro_release &kp LSHFT>, <&macro_tap &kp SPACE>;) // ~
+ZMK_MACRO(standalone_grav, bindings = <&macro_tap &kp GRAVE &kp SPACE>;)                                     // `
+
 // ^ to input
 ZMK_MACRO_ONE_PARAM(CIRC, bindings =
     <&kp CARET>,
keyboards/moonlander/config/config.h
@@ -66,6 +66,7 @@
 #define FR_DQUO_M SS_TAP(X_RALT) SS_DELAY(50) SS_RSFT(SS_TAP(X_QUOTE)) SS_DELAY(50) SS_TAP(X_SPACE)
 #define FR_GRAVE_M SS_TAP(X_RALT) SS_DELAY(50) SS_TAP(X_GRAVE) SS_DELAY(50) SS_TAP(X_SPACE)
 #define FR_CIRC_M SS_TAP(X_RALT) SS_DELAY(50) SS_RSFT(SS_TAP(X_6)) SS_DELAY(50) SS_TAP(X_SPACE)
+#define FR_TILD_M SS_TAP(X_RALT) SS_DELAY(50) SS_RSFT(SS_TAP(X_GRAVE)) SS_DELAY(50) SS_TAP(X_SPACE)
 #define FR_E_AIGU_M SS_TAP(X_RALT) SS_DELAY(50) SS_TAP(X_QUOTE) SS_DELAY(50) SS_TAP(X_E)           // é
 #define FR_E_AIGU_CAPS_M SS_TAP(X_RALT) SS_DELAY(50) SS_TAP(X_QUOTE) SS_DELAY(50) SS_RSFT(SS_TAP(X_E))        // É
 #define FR_E_GRAVE_M SS_TAP(X_RALT) SS_DELAY(50) SS_TAP(X_GRAVE) SS_DELAY(50) SS_TAP(X_E)          // è
keyboards/moonlander/config/keymap.c
@@ -45,6 +45,7 @@ enum custom_keycodes {
   FR_E_AIGU_CAPS,
   FR_E_GRAVE,
   FR_E_GRAVE_CAPS,
+  FR_TILD,
   FR_A_GRAVE,
   FR_A_GRAVE_CAPS,
   NUMWORD,  // Numword layer activation
@@ -304,10 +305,10 @@ combo_t key_combos[] = {
   [LABK] = COMBO(combo_qwe_labk, KC_LABK),
   [RABK] = COMBO(combo_qwe_rabk, KC_RABK),
 
-  [DQUO] = COMBO(combo_qwe_dquo, KC_DQUO),
-  [TILDE] = COMBO(combo_qwe_tilde, KC_TILD),
+  [DQUO] = COMBO(combo_qwe_dquo, FR_DQUO),
+  [TILDE] = COMBO(combo_qwe_tilde, FR_TILD),
   [PRCNT] = COMBO(combo_qwe_prcnt, KC_PERC),
-  [GRAVE] = COMBO(combo_qwe_grave, KC_GRV),
+  [GRAVE] = COMBO(combo_qwe_grave, FR_GRAVE),
   [STAR] = COMBO(combo_qwe_star, KC_ASTR),
   [PLUS] = COMBO(combo_qwe_plus, KC_PLUS),
 };
@@ -425,7 +426,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     VRSN,     XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
     KC_BSLS,  FR_GRAVE,  KC_LABK,  KC_RABK,  KC_PMNS,  KC_PIPE,   XXXXXXX,    XXXXXXX,  KC_CIRC,   KC_LCBR,  KC_RCBR,  KC_DLR,    FR_CIRC,  XXXXXXX,
     XXXXXXX,  KC_EXLM,   KC_PAST,  KC_PSLS,  KC_EQL,   KC_AMPR,   XXXXXXX,    XXXXXXX,  KC_HASH,   KC_LPRN,  KC_RPRN,  KC_SCLN,   FR_DQUO,  XXXXXXX,
-    XXXXXXX,  KC_TILD,   KC_LBRC,  KC_RBRC,  KC_PLUS,  KC_PERC,                         KC_AT,     KC_COLN,  KC_COMM,  KC_DOT,    FR_QUOT,  XXXXXXX,
+    XXXXXXX,  FR_TILD,   KC_LBRC,  KC_RBRC,  KC_PLUS,  KC_PERC,                         KC_AT,     KC_COLN,  KC_COMM,  KC_DOT,    FR_QUOT,  XXXXXXX,
     XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  _______,             RM_VALU,    RM_TOGG,             _______,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
                                               XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  _______,   _______
   ),
@@ -581,6 +582,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 	SEND_STRING(FR_CIRC_M);
       }
       break;
+    case FR_TILD:
+      if (record->event.pressed) {
+	SEND_STRING(FR_TILD_M);
+      }
+      break;
     case FR_E_AIGU:
       if (record->event.pressed) {
 	if (get_mods() & MOD_MASK_SHIFT) {