keystate: Removed multiple symbols

This commit is contained in:
Dorota Czaplejewicz
2019-08-13 18:42:42 +00:00
parent eb118d67fc
commit 996f681e5c
6 changed files with 38 additions and 74 deletions

View File

@ -186,11 +186,10 @@ eek_key_get_keycode (EekKey *key)
*/ */
struct squeek_symbol* struct squeek_symbol*
eek_key_get_symbol_at_index (EekKey *key, eek_key_get_symbol_at_index (EekKey *key,
gint group, gint group)
guint level)
{ {
EekKeyPrivate *priv = eek_key_get_instance_private (key); EekKeyPrivate *priv = eek_key_get_instance_private (key);
return squeek_key_get_symbol(priv->state, level); return squeek_key_get_symbol(priv->state);
} }
/** /**

View File

@ -55,8 +55,7 @@ void eek_key_set_keycode (EekKey *key,
guint eek_key_get_keycode (EekKey *key); guint eek_key_get_keycode (EekKey *key);
struct squeek_key *eek_key_get_state(EekKey *key); struct squeek_key *eek_key_get_state(EekKey *key);
struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key, struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key,
gint group, gint group);
guint level);
void eek_key_set_oref (EekKey *key, void eek_key_set_oref (EekKey *key,
guint oref); guint oref);

View File

@ -191,7 +191,7 @@ void eek_keyboard_press_key(LevelKeyboard *keyboard, EekKey *key, guint32 timest
keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key); keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key);
struct squeek_symbol *symbol = eek_key_get_symbol_at_index( struct squeek_symbol *symbol = eek_key_get_symbol_at_index(
key, 0, keyboard->level key, 0
); );
if (!symbol) if (!symbol)
return; return;
@ -218,7 +218,7 @@ void eek_keyboard_release_key(LevelKeyboard *keyboard,
} }
struct squeek_symbol *symbol = eek_key_get_symbol_at_index( struct squeek_symbol *symbol = eek_key_get_symbol_at_index(
key, 0, keyboard->level); key, 0);
if (!symbol) if (!symbol)
return; return;

View File

@ -275,7 +275,7 @@ render_key (EekRenderer *self,
eek_renderer_get_foreground_color (self, priv->key_context, &foreground); eek_renderer_get_foreground_color (self, priv->key_context, &foreground);
/* render icon (if any) */ /* render icon (if any) */
symbol = eek_key_get_symbol_at_index (key, 0, level); symbol = eek_key_get_symbol_at_index (key, 0);
if (!symbol) if (!symbol)
return; return;
@ -389,7 +389,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
PangoLayoutLine *line; PangoLayoutLine *line;
gdouble scale; gdouble scale;
symbol = eek_key_get_symbol_at_index(key, 0, level); symbol = eek_key_get_symbol_at_index(key, 0);
if (!symbol) if (!symbol)
return; return;

View File

@ -20,6 +20,6 @@ void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed);
uint32_t squeek_key_get_keycode(struct squeek_key *key); uint32_t squeek_key_get_keycode(struct squeek_key *key);
void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode); void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode);
struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key, uint32_t level); struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key);
const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_key *key); const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_key *key);
#endif #endif

View File

@ -9,6 +9,7 @@ pub mod c {
use std::ffi::CString; use std::ffi::CString;
use std::os::raw::c_char; use std::os::raw::c_char;
use std::ptr;
// The following defined in C // The following defined in C
#[no_mangle] #[no_mangle]
@ -29,7 +30,7 @@ pub mod c {
pressed: false, pressed: false,
locked: false, locked: false,
keycode: keycode, keycode: keycode,
symbols: Vec::new(), symbol: None,
} }
)) ))
} }
@ -111,7 +112,7 @@ pub mod c {
let key = unsafe { &mut *key }; let key = unsafe { &mut *key };
if key.symbols.len() > 0 { if let Some(_) = key.symbol {
eprintln!("Key {:?} already has a symbol defined", text); eprintln!("Key {:?} already has a symbol defined", text);
return; return;
} }
@ -146,7 +147,7 @@ pub mod c {
None None
}); });
let symbol = match element.to_bytes() { key.symbol = Some(match element.to_bytes() {
b"symbol" => Symbol { b"symbol" => Symbol {
action: Action::Submit { action: Action::Submit {
text: text, text: text,
@ -155,42 +156,18 @@ pub mod c {
label: label, label: label,
tooltip: tooltip, tooltip: tooltip,
}, },
b"keysym" => {
let keysym = XKeySym(
if keyval == 0 {
unsafe { eek_keysym_from_name(text_raw) }
} else {
keyval
}
);
Symbol {
action: match KeySym::from_u32(keysym.0) {
KeySym::Shift => Action::SetLevel(1),
_ => Action::Submit {
text: text,
keys: vec![keysym],
}
},
label: label,
tooltip: tooltip,
}
},
_ => panic!("unsupported element type {:?}", element), _ => panic!("unsupported element type {:?}", element),
}; });
key.symbols.push(symbol);
} }
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_key_get_symbol( fn squeek_key_get_symbol(key: *const KeyState) -> *const symbol::Symbol {
key: *const KeyState, index: u32
) -> *const symbol::Symbol {
let key = unsafe { &*key }; let key = unsafe { &*key };
let index = index as usize; match key.symbol {
&key.symbols[ Some(ref symbol) => symbol as *const symbol::Symbol,
if index < key.symbols.len() { index } else { 0 } None => ptr::null(),
] as *const symbol::Symbol }
} }
#[no_mangle] #[no_mangle]
@ -205,9 +182,8 @@ pub mod c {
.expect("Bad key name"); .expect("Bad key name");
let key = unsafe { &*key }; let key = unsafe { &*key };
let symbol_names = key.symbols.iter() let symbol_name = match key.symbol {
.map(|symbol| { Some(ref symbol) => match &symbol.action {
match &symbol.action {
symbol::Action::Submit { text: Some(text), .. } => { symbol::Action::Submit { text: Some(text), .. } => {
Some( Some(
text.clone() text.clone()
@ -215,27 +191,16 @@ pub mod c {
) )
}, },
_ => None _ => None
} },
}) None => {
.collect::<Vec<_>>(); eprintln!("Key {} has no symbol", key_name);
None
},
};
let inner = match symbol_names.len() { let inner = match symbol_name {
1 => match &symbol_names[0] {
Some(name) => format!("[ {} ]", name), Some(name) => format!("[ {} ]", name),
_ => format!("[ ]"), _ => format!("[ ]"),
},
4 => {
let first = match (&symbol_names[0], &symbol_names[1]) {
(Some(left), Some(right)) => format!("{}, {}", left, right),
_ => format!(""),
};
let second = match (&symbol_names[2], &symbol_names[3]) {
(Some(left), Some(right)) => format!("{}, {}", left, right),
_ => format!(""),
};
format!("[ {} ], [ {} ]", first, second)
},
_ => panic!("Unsupported number of symbols: {}", symbol_names.len()),
}; };
CString::new(format!(" key <{}> {{ {} }};\n", key_name, inner)) CString::new(format!(" key <{}> {{ {} }};\n", key_name, inner))
@ -249,5 +214,6 @@ pub struct KeyState {
pressed: bool, pressed: bool,
locked: bool, locked: bool,
keycode: u32, keycode: u32,
symbols: Vec<symbol::Symbol>, // TODO: remove the optionality of a symbol
symbol: Option<symbol::Symbol>,
} }