keystate: Removed multiple symbols
This commit is contained in:
		@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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::<Vec<_>>();
 | 
			
		||||
        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<symbol::Symbol>,
 | 
			
		||||
    // TODO: remove the optionality of a symbol
 | 
			
		||||
    symbol: Option<symbol::Symbol>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user