From c45940531865ee635138f54c6b270f6723e736b7 Mon Sep 17 00:00:00 2001 From: Richard Acayan Date: Sun, 4 Aug 2024 22:00:29 -0400 Subject: [PATCH] core: layout: store availability of text insertion --- src/core/button.rs | 6 ++++ src/core/layout.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/core/button.rs b/src/core/button.rs index dde5b4c..3dc6403 100644 --- a/src/core/button.rs +++ b/src/core/button.rs @@ -204,6 +204,12 @@ impl Button { &self.modifiers } + #[inline(always)] + pub fn set_text_supported(&mut self, text_supp: bool) + { + self.layout.set_text_supported(text_supp) + } + #[inline(always)] pub fn update_keys_supported(&mut self) { diff --git a/src/core/layout.rs b/src/core/layout.rs index 02de32d..d956409 100644 --- a/src/core/layout.rs +++ b/src/core/layout.rs @@ -72,6 +72,7 @@ pub struct Part { val: KeyValue, key_avail: bool, + text_avail: bool, presses: u32, } @@ -298,6 +299,41 @@ impl Part { } } + fn keyvalue_has_text(val: &KeyValue) -> bool + { + match val { + KeyValue(Keysym::BackSpace, _) => false, + KeyValue(Keysym::Tab, _) => false, + KeyValue(Keysym::Return, _) => false, + KeyValue(Keysym::Escape, _) => false, + KeyValue(Keysym::Home, _) => false, + KeyValue(Keysym::Left, _) => false, + KeyValue(Keysym::Up, _) => false, + KeyValue(Keysym::Right, _) => false, + KeyValue(Keysym::Down, _) => false, + KeyValue(Keysym::Prior, _) => false, + KeyValue(Keysym::Next, _) => false, + KeyValue(Keysym::End, _) => false, + KeyValue(Keysym::F1, _) => false, + KeyValue(Keysym::F2, _) => false, + KeyValue(Keysym::F3, _) => false, + KeyValue(Keysym::F4, _) => false, + KeyValue(Keysym::F5, _) => false, + KeyValue(Keysym::F6, _) => false, + KeyValue(Keysym::F7, _) => false, + KeyValue(Keysym::F8, _) => false, + KeyValue(Keysym::F9, _) => false, + KeyValue(Keysym::F10, _) => false, + KeyValue(Keysym::F11, _) => false, + KeyValue(Keysym::F12, _) => false, + KeyValue(Keysym::Delete, _) => false, + + KeyValue(_, l) => l != "", + + _ => true, + } + } + fn new(orig: KeyValue) -> Part { let val = Self::modify_no_fn(&orig); @@ -307,6 +343,7 @@ impl Part { val, key_avail: false, + text_avail: false, presses: 0, } @@ -336,12 +373,23 @@ impl Part { self.presses } + #[inline(always)] + pub fn text_available(&self) -> bool + { + self.text_avail + } + #[inline(always)] pub fn key_available(&self) -> bool { self.key_avail } + fn set_text_supported(&mut self, text_supp: bool) + { + self.text_avail = text_supp && Self::keyvalue_has_text(&self.val); + } + fn update_keys_supported(&mut self, kbd: &K) { let key_supp = kbd.key_supported(self.val.0); @@ -361,7 +409,8 @@ impl Part { pub fn update_modifiers(&mut self, kbd: &K, - mod_state: &[ModState]) + mod_state: &[ModState], + text_avail: bool) { let mut val = self.orig.clone(); @@ -377,6 +426,7 @@ impl Part { let key_supp = kbd.key_supported(self.val.0); self.key_avail = self.val.0 != Keysym::NoSymbol && key_supp; + self.text_avail = text_avail && Self::keyvalue_has_text(&val); self.val = val; } @@ -432,6 +482,8 @@ pub struct Layout { height: f64, row_width: f64, in_row: u32, + + text_supp: bool, } const KEYSYMS: [(&str, Keysym, &str); 20] = [ @@ -574,6 +626,7 @@ impl Layout { height: 0.0, row_width: 0.0, in_row: 0, + text_supp: false, }; let mut vec = Vec::new(); @@ -678,7 +731,20 @@ impl Layout { for row in self.rows.iter_mut() { for key in row.iter_mut() { for part in key.parts.iter_mut() { - part.update_modifiers(kbd, mod_state); + part.update_modifiers(kbd, mod_state, self.text_supp); + } + } + } + } + + pub fn set_text_supported(&mut self, text_supp: bool) + { + self.text_supp = text_supp; + + for row in self.rows.iter_mut() { + for key in row.iter_mut() { + for part in key.parts.iter_mut() { + part.set_text_supported(text_supp); } } }