core: layout: store availability of text insertion
This commit is contained in:
parent
c152dc8468
commit
c459405318
2 changed files with 74 additions and 2 deletions
|
|
@ -204,6 +204,12 @@ impl<D: Display, K: Keyboard> Button<D, K> {
|
||||||
&self.modifiers
|
&self.modifiers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn set_text_supported(&mut self, text_supp: bool)
|
||||||
|
{
|
||||||
|
self.layout.set_text_supported(text_supp)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn update_keys_supported(&mut self)
|
pub fn update_keys_supported(&mut self)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ pub struct Part {
|
||||||
val: KeyValue,
|
val: KeyValue,
|
||||||
|
|
||||||
key_avail: bool,
|
key_avail: bool,
|
||||||
|
text_avail: bool,
|
||||||
|
|
||||||
presses: u32,
|
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
|
fn new(orig: KeyValue) -> Part
|
||||||
{
|
{
|
||||||
let val = Self::modify_no_fn(&orig);
|
let val = Self::modify_no_fn(&orig);
|
||||||
|
|
@ -307,6 +343,7 @@ impl Part {
|
||||||
val,
|
val,
|
||||||
|
|
||||||
key_avail: false,
|
key_avail: false,
|
||||||
|
text_avail: false,
|
||||||
|
|
||||||
presses: 0,
|
presses: 0,
|
||||||
}
|
}
|
||||||
|
|
@ -336,12 +373,23 @@ impl Part {
|
||||||
self.presses
|
self.presses
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn text_available(&self) -> bool
|
||||||
|
{
|
||||||
|
self.text_avail
|
||||||
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn key_available(&self) -> bool
|
pub fn key_available(&self) -> bool
|
||||||
{
|
{
|
||||||
self.key_avail
|
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)
|
fn update_keys_supported<K: Keyboard>(&mut self, kbd: &K)
|
||||||
{
|
{
|
||||||
let key_supp = kbd.key_supported(self.val.0);
|
let key_supp = kbd.key_supported(self.val.0);
|
||||||
|
|
@ -361,7 +409,8 @@ impl Part {
|
||||||
|
|
||||||
pub fn update_modifiers<K: Keyboard>(&mut self,
|
pub fn update_modifiers<K: Keyboard>(&mut self,
|
||||||
kbd: &K,
|
kbd: &K,
|
||||||
mod_state: &[ModState])
|
mod_state: &[ModState],
|
||||||
|
text_avail: bool)
|
||||||
{
|
{
|
||||||
let mut val = self.orig.clone();
|
let mut val = self.orig.clone();
|
||||||
|
|
||||||
|
|
@ -377,6 +426,7 @@ impl Part {
|
||||||
|
|
||||||
let key_supp = kbd.key_supported(self.val.0);
|
let key_supp = kbd.key_supported(self.val.0);
|
||||||
self.key_avail = self.val.0 != Keysym::NoSymbol && key_supp;
|
self.key_avail = self.val.0 != Keysym::NoSymbol && key_supp;
|
||||||
|
self.text_avail = text_avail && Self::keyvalue_has_text(&val);
|
||||||
self.val = val;
|
self.val = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -432,6 +482,8 @@ pub struct Layout {
|
||||||
height: f64,
|
height: f64,
|
||||||
row_width: f64,
|
row_width: f64,
|
||||||
in_row: u32,
|
in_row: u32,
|
||||||
|
|
||||||
|
text_supp: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
const KEYSYMS: [(&str, Keysym, &str); 20] = [
|
const KEYSYMS: [(&str, Keysym, &str); 20] = [
|
||||||
|
|
@ -574,6 +626,7 @@ impl Layout {
|
||||||
height: 0.0,
|
height: 0.0,
|
||||||
row_width: 0.0,
|
row_width: 0.0,
|
||||||
in_row: 0,
|
in_row: 0,
|
||||||
|
text_supp: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut vec = Vec::new();
|
let mut vec = Vec::new();
|
||||||
|
|
@ -678,7 +731,20 @@ impl Layout {
|
||||||
for row in self.rows.iter_mut() {
|
for row in self.rows.iter_mut() {
|
||||||
for key in row.iter_mut() {
|
for key in row.iter_mut() {
|
||||||
for part in key.parts.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue