core: layout: store availability of text insertion

This commit is contained in:
Richard Acayan 2024-08-04 22:00:29 -04:00
parent c152dc8468
commit c459405318
2 changed files with 74 additions and 2 deletions

View file

@ -204,6 +204,12 @@ impl<D: Display, K: Keyboard> Button<D, K> {
&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)
{

View file

@ -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<K: Keyboard>(&mut self, kbd: &K)
{
let key_supp = kbd.key_supported(self.val.0);
@ -361,7 +409,8 @@ impl Part {
pub fn update_modifiers<K: Keyboard>(&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);
}
}
}