diff --git a/src/core/button.rs b/src/core/button.rs index 8382916..a759ec1 100644 --- a/src/core/button.rs +++ b/src/core/button.rs @@ -6,7 +6,10 @@ use crate::core::Display; use crate::core::Graphics; use crate::core::Layout; +use crate::core::Part; use crate::core::layout::Key; +use crate::core::layout::MOD_ALT; +use crate::core::layout::MOD_CTRL; use crate::core::layout::MODIFIERS_MAX; use std::collections::VecDeque; use std::convert::TryInto; @@ -459,6 +462,23 @@ impl Button { Self::draw(draw, &self.gfx, &self.layout, Some(key), &self.modifiers); } + fn emit(kbd: &mut K, part: &Part, modifiers: &[ModState]) + { + let ctrl_pressed = modifiers[MOD_CTRL - 1] != ModState::Released; + let alt_pressed = modifiers[MOD_ALT - 1] != ModState::Released; + let mods_pressed = ctrl_pressed || alt_pressed; + + if part.key_available() && mods_pressed { + kbd.press(part.sym()); + kbd.release(part.sym()); + } else if part.text_available() { + kbd.text(part.text()); + } else if part.key_available() { + kbd.press(part.sym()); + kbd.release(part.sym()); + } + } + fn is_normal_key_pressed(&self) -> bool { for id in &self.timers { @@ -548,8 +568,7 @@ impl Button { let modifier = key.parts[press.part].modifier_id(); if modifier == 0 { - self.kbd.press(key.parts[press.part].sym()); - self.kbd.release(key.parts[press.part].sym()); + Self::emit(&mut self.kbd, &key.parts[press.part], &self.modifiers); } let draw = self.release_mod(modifier); @@ -596,8 +615,7 @@ impl Button { if modifier != 0 { draw = draw + self.lock_mod(modifier); } else { - self.kbd.press(key.parts[press.part].sym()); - self.kbd.release(key.parts[press.part].sym()); + Self::emit(&mut self.kbd, &key.parts[press.part], &self.modifiers); press.timer += self.repeat; self.timers.push_back(id); diff --git a/src/core/layout.rs b/src/core/layout.rs index beb16b0..5f50d50 100644 --- a/src/core/layout.rs +++ b/src/core/layout.rs @@ -355,6 +355,12 @@ impl Part { self.val.0 } + #[inline(always)] + pub fn text(&self) -> &str + { + &self.val.1 + } + #[inline(always)] pub fn press(&mut self) {