diff --git a/rmk-macro/src/layout.rs b/rmk-macro/src/layout.rs index 25d259c2..8519bfdd 100644 --- a/rmk-macro/src/layout.rs +++ b/rmk-macro/src/layout.rs @@ -219,6 +219,54 @@ fn parse_key(key: String) -> TokenStream2 { ::rmk::df!(#layer) } } + "MTH(" => { + let keys: Vec<&str> = key + .trim_start_matches("MTH(") + .trim_end_matches(")") + .split_terminator(",") + .map(|w| w.trim()) + .filter(|w| w.len() > 0) + .collect(); + if keys.len() != 2 { + return quote! { + compile_error!("keyboard.toml: MTH(modifiers, key) invalid, please check the documentation: https://haobogu.github.io/rmk/keyboard_configuration.html"); + }; + } + let ident = format_ident!("{}", keys[0].to_string()); + + let (right, gui, alt, shift, ctrl) = parse_modifiers(keys[1]); + + if (gui || alt || shift || ctrl) == false { + return quote! { + compile_error!("keyboard.toml: modifier in MTH(modifier, key) is not valid! Please check the documentation: https://haobogu.github.io/rmk/keyboard_configuration.html"); + }; + } + quote! { + ::rmk::mth!(#ident, ::rmk::keycode::ModifierCombination::new_from(#right, #gui, #alt, #shift, #ctrl)) + } + + } + "TH(" => { + let keys: Vec<&str> = key + .trim_start_matches("TH(") + .trim_end_matches(")") + .split_terminator(",") + .map(|w| w.trim()) + .filter(|w| w.len() > 0) + .collect(); + if keys.len() != 2 { + return quote! { + compile_error!("keyboard.toml: TH(modifiers, key) invalid, please check the documentation: https://haobogu.github.io/rmk/keyboard_configuration.html"); + }; + } + let ident1 = format_ident!("{}", keys[0].to_string()); + let ident2 = format_ident!("{}", keys[1].to_string()); + + quote! { + ::rmk::th!(#ident1, #ident2) + } + + } _ => { let ident = format_ident!("{}", key); quote! {::rmk::k!(#ident) } diff --git a/rmk/src/layout_macro.rs b/rmk/src/layout_macro.rs index 7b100b91..cb52e863 100644 --- a/rmk/src/layout_macro.rs +++ b/rmk/src/layout_macro.rs @@ -63,7 +63,7 @@ macro_rules! lt { /// Create a modifier-tap-hold action #[macro_export] macro_rules! mth { - ($m: expr, $k: ident) => { + ($k: ident, $m: expr) => { $crate::action::KeyAction::ModifierTapHold( $m, $crate::action::Action::Key($crate::keycode::KeyCode::$k), @@ -74,7 +74,7 @@ macro_rules! mth { /// Create a tap-hold action #[macro_export] macro_rules! th { - ($h: ident, $t: ident) => { + ($t: ident, $h: ident) => { $crate::action::KeyAction::TapHold( $t, $h,