keystate: Removed multiple symbols
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user