symbol: Store symbols instead of pointers

This commit is contained in:
Dorota Czaplejewicz
2019-08-03 09:29:03 +00:00
parent 53b89aae45
commit ad86cb531a
4 changed files with 53 additions and 56 deletions

View File

@ -761,7 +761,7 @@ eek_keyboard_get_keymap(EekKeyboard *keyboard)
g_free(current); g_free(current);
// FIXME: free // FIXME: free
char *key_str = squeek_key_to_keymap_entry( const char *key_str = squeek_key_to_keymap_entry(
(char*)key_name, (char*)key_name,
eek_key_get_symbol_matrix(key) eek_key_get_symbol_matrix(key)
); );

View File

@ -748,7 +748,8 @@ symbols_end_element_callback (GMarkupParseContext *pcontext,
g_strcmp0 (element_name, "keysym") == 0 || g_strcmp0 (element_name, "keysym") == 0 ||
g_strcmp0 (element_name, "text") == 0) { g_strcmp0 (element_name, "text") == 0) {
struct squeek_symbol *symbol = squeek_symbol_new( squeek_symbols_add(
eek_key_get_symbol_matrix(data->key),
element_name, element_name,
text, text,
data->keyval, data->keyval,
@ -757,7 +758,6 @@ symbols_end_element_callback (GMarkupParseContext *pcontext,
data->tooltip data->tooltip
); );
squeek_symbols_append(eek_key_get_symbol_matrix(data->key), symbol);
data->keyval = 0; data->keyval = 0;
g_free(data->label); g_free(data->label);
data->label = NULL; data->label = NULL;

View File

@ -8,7 +8,8 @@
struct squeek_symbol; struct squeek_symbol;
struct squeek_symbols; struct squeek_symbols;
struct squeek_symbol* squeek_symbol_new(const char *element_name, void squeek_symbols_add(struct squeek_symbols*,
const char *element_name,
const char *text, uint32_t keyval, const char *text, uint32_t keyval,
const char *label, const char *icon, const char *label, const char *icon,
const char *tooltip); const char *tooltip);
@ -23,7 +24,6 @@ void squeek_symbol_print(struct squeek_symbol* symbol);
struct squeek_symbols* squeek_symbols_new(); struct squeek_symbols* squeek_symbols_new();
void squeek_symbols_free(struct squeek_symbols*); void squeek_symbols_free(struct squeek_symbols*);
void squeek_symbols_append(struct squeek_symbols*, struct squeek_symbol *item);
struct squeek_symbol *squeek_symbols_get(struct squeek_symbols*, uint32_t level); struct squeek_symbol *squeek_symbols_get(struct squeek_symbols*, uint32_t level);
const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_symbols *symbols); const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_symbols *symbols);

View File

@ -68,18 +68,22 @@ pub mod c {
Shift = 1, Shift = 1,
} }
// The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers // The following defined in Rust.
// TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
// Symbols are owned by Rust and will move towards no C manipulation, so it may make sense not to wrap them
// TODO: this will receive data from the filesystem, // TODO: this will receive data from the filesystem,
// so it should handle garbled strings in the future // so it should handle garbled strings in the future
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_symbol_new( fn squeek_symbols_add(
v: *mut Vec<Symbol>,
element: *const c_char, element: *const c_char,
text_raw: *const c_char, keyval: u32, text_raw: *const c_char, keyval: u32,
label: *const c_char, icon: *const c_char, label: *const c_char, icon: *const c_char,
tooltip: *const c_char, tooltip: *const c_char,
) -> *mut Symbol { ) {
let element = as_cstr(&element) let element = as_cstr(&element)
.expect("Missing element name"); .expect("Missing element name");
@ -124,8 +128,7 @@ pub mod c {
None None
}); });
Box::<Symbol>::into_raw(Box::new( let symbol = match element.to_bytes() {
match element.to_bytes() {
b"symbol" => Symbol { b"symbol" => Symbol {
action: Action::Submit { action: Action::Submit {
text: text, text: text,
@ -155,8 +158,10 @@ pub mod c {
} }
}, },
_ => panic!("unsupported element type {:?}", element), _ => panic!("unsupported element type {:?}", element),
} };
))
let v = unsafe { &mut *v };
v.push(symbol);
} }
#[no_mangle] #[no_mangle]
@ -212,30 +217,23 @@ pub mod c {
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_symbols_new() -> *const Vec<*const Symbol> { fn squeek_symbols_new() -> *const Vec<Symbol> {
Box::into_raw(Box::new(Vec::new())) Box::into_raw(Box::new(Vec::new()))
} }
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_symbols_append(v: *mut Vec<*const Symbol>, symbol: *const Symbol) { fn squeek_symbols_get(v: *mut Vec<Symbol>, index: u32) -> *const Symbol {
let v = unsafe { &mut *v };
v.push(symbol);
}
#[no_mangle]
pub extern "C"
fn squeek_symbols_get(v: *mut Vec<*const Symbol>, index: u32) -> *const Symbol {
let v = unsafe { &mut *v }; let v = unsafe { &mut *v };
let index = index as usize; let index = index as usize;
v[ &v[
if index < v.len() { index } else { 0 } if index < v.len() { index } else { 0 }
] ] as *const Symbol
} }
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_symbols_free(symbols: *mut Vec<*const Symbol>) { fn squeek_symbols_free(symbols: *mut Vec<Symbol>) {
unsafe { Box::from_raw(symbols) }; // Will just get dropped, together with the contents unsafe { Box::from_raw(symbols) }; // Will just get dropped, together with the contents
} }
@ -243,7 +241,7 @@ pub mod c {
pub extern "C" pub extern "C"
fn squeek_key_to_keymap_entry( fn squeek_key_to_keymap_entry(
key_name: *const c_char, key_name: *const c_char,
symbols: *const Vec<*const Symbol>, symbols: *const Vec<Symbol>,
) -> *const c_char { ) -> *const c_char {
let key_name = as_cstr(&key_name) let key_name = as_cstr(&key_name)
.expect("Missing key name") .expect("Missing key name")
@ -252,7 +250,6 @@ pub mod c {
let symbols = unsafe { &*symbols }; let symbols = unsafe { &*symbols };
let symbol_names = symbols.iter() let symbol_names = symbols.iter()
.map(|symbol| { .map(|symbol| {
let symbol: &Symbol = unsafe { &**symbol };
match &symbol.action { match &symbol.action {
Action::Submit { text: Some(text), .. } => { Action::Submit { text: Some(text), .. } => {
Some( Some(