diff --git a/eek/eek-key.c b/eek/eek-key.c index 5dc32dac..96e6323a 100644 --- a/eek/eek-key.c +++ b/eek/eek-key.c @@ -186,11 +186,10 @@ eek_key_get_keycode (EekKey *key) */ struct squeek_symbol* eek_key_get_symbol_at_index (EekKey *key, - gint group, - guint level) + gint group) { EekKeyPrivate *priv = eek_key_get_instance_private (key); - return squeek_key_get_symbol(priv->state, level); + return squeek_key_get_symbol(priv->state); } /** diff --git a/eek/eek-key.h b/eek/eek-key.h index f0f4498d..47672526 100644 --- a/eek/eek-key.h +++ b/eek/eek-key.h @@ -55,8 +55,7 @@ void eek_key_set_keycode (EekKey *key, guint eek_key_get_keycode (EekKey *key); struct squeek_key *eek_key_get_state(EekKey *key); struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key, - gint group, - guint level); + gint group); void eek_key_set_oref (EekKey *key, guint oref); diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 19d6c9bd..b44237ef 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -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); struct squeek_symbol *symbol = eek_key_get_symbol_at_index( - key, 0, keyboard->level + key, 0 ); if (!symbol) return; @@ -218,7 +218,7 @@ void eek_keyboard_release_key(LevelKeyboard *keyboard, } struct squeek_symbol *symbol = eek_key_get_symbol_at_index( - key, 0, keyboard->level); + key, 0); if (!symbol) return; diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 85837618..5db9b1b2 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -275,7 +275,7 @@ render_key (EekRenderer *self, eek_renderer_get_foreground_color (self, priv->key_context, &foreground); /* 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) return; @@ -389,7 +389,7 @@ eek_renderer_real_render_key_label (EekRenderer *self, PangoLayoutLine *line; gdouble scale; - symbol = eek_key_get_symbol_at_index(key, 0, level); + symbol = eek_key_get_symbol_at_index(key, 0); if (!symbol) return; diff --git a/src/keyboard.h b/src/keyboard.h index 2fc40152..ef402e2f 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -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); 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); #endif diff --git a/src/keyboard.rs b/src/keyboard.rs index c3dc412c..dd7de03c 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -9,6 +9,7 @@ pub mod c { use std::ffi::CString; use std::os::raw::c_char; + use std::ptr; // The following defined in C #[no_mangle] @@ -29,7 +30,7 @@ pub mod c { pressed: false, locked: false, keycode: keycode, - symbols: Vec::new(), + symbol: None, } )) } @@ -111,7 +112,7 @@ pub mod c { let key = unsafe { &mut *key }; - if key.symbols.len() > 0 { + if let Some(_) = key.symbol { eprintln!("Key {:?} already has a symbol defined", text); return; } @@ -146,7 +147,7 @@ pub mod c { None }); - let symbol = match element.to_bytes() { + key.symbol = Some(match element.to_bytes() { b"symbol" => Symbol { action: Action::Submit { text: text, @@ -155,42 +156,18 @@ pub mod c { label: label, 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), - }; - - key.symbols.push(symbol); + }); } #[no_mangle] pub extern "C" - fn squeek_key_get_symbol( - key: *const KeyState, index: u32 - ) -> *const symbol::Symbol { + fn squeek_key_get_symbol(key: *const KeyState) -> *const symbol::Symbol { let key = unsafe { &*key }; - let index = index as usize; - &key.symbols[ - if index < key.symbols.len() { index } else { 0 } - ] as *const symbol::Symbol + match key.symbol { + Some(ref symbol) => symbol as *const symbol::Symbol, + None => ptr::null(), + } } #[no_mangle] @@ -205,37 +182,25 @@ pub mod c { .expect("Bad key name"); let key = unsafe { &*key }; - let symbol_names = key.symbols.iter() - .map(|symbol| { - match &symbol.action { - symbol::Action::Submit { text: Some(text), .. } => { - Some( - text.clone() - .into_string().expect("Bad symbol") - ) - }, - _ => None - } - }) - .collect::>(); + let symbol_name = match key.symbol { + Some(ref symbol) => match &symbol.action { + symbol::Action::Submit { text: Some(text), .. } => { + Some( + text.clone() + .into_string().expect("Bad symbol") + ) + }, + _ => None + }, + None => { + eprintln!("Key {} has no symbol", key_name); + None + }, + }; - let inner = match symbol_names.len() { - 1 => match &symbol_names[0] { - Some(name) => format!("[ {} ]", name), - _ => 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()), + let inner = match symbol_name { + Some(name) => format!("[ {} ]", name), + _ => format!("[ ]"), }; CString::new(format!(" key <{}> {{ {} }};\n", key_name, inner)) @@ -249,5 +214,6 @@ pub struct KeyState { pressed: bool, locked: bool, keycode: u32, - symbols: Vec, + // TODO: remove the optionality of a symbol + symbol: Option, }