From 4e9a8e4afed7c5e380855a9f8401e3f3a6226dd0 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Fri, 16 Aug 2019 17:14:36 +0000 Subject: [PATCH] Move button finding to view --- eek/eek-gtk-keyboard.c | 2 +- eek/eek-keyboard.c | 20 ------------- eek/eek-keyboard.h | 2 -- src/layout.h | 2 ++ src/layout.rs | 68 ++++++++++++++++++++++++++---------------- 5 files changed, 46 insertions(+), 48 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index a07664d6..79ce33d9 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -498,7 +498,7 @@ on_button_pressed (struct squeek_button *button, struct button_place place = { .button = button, - .row = eek_keyboard_get_row(view, button), + .row = squeek_view_get_row(view, button), }; if (!place.row) { return; diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 33cd5031..e11172da 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -294,26 +294,6 @@ struct GetRowData { struct squeek_key *needle; }; -void find_button_in_row(struct squeek_row *row, gpointer user_data) { - struct GetRowData *data = user_data; - if (data->row) { - return; - } - if (squeek_row_contains(row, data->button)) { - data->row = row; - } -} - -struct squeek_row *eek_keyboard_get_row(struct squeek_view *view, - struct squeek_button *button) { - struct GetRowData data = { - .button = button, - .row = NULL, - }; - squeek_view_foreach(view, find_button_in_row, &data); - return data.row; -} - void find_key_in_row(struct squeek_row *row, gpointer user_data) { struct GetRowData *data = user_data; if (data->button) { diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index edce5afe..bea57c8f 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -61,8 +61,6 @@ struct _LevelKeyboard { }; typedef struct _LevelKeyboard LevelKeyboard; -struct squeek_row *eek_keyboard_get_row(struct squeek_view *view, - struct squeek_button *button); struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard, const gchar *name); diff --git a/src/layout.h b/src/layout.h index 89949fb2..7a5c0807 100644 --- a/src/layout.h +++ b/src/layout.h @@ -68,6 +68,8 @@ void squeek_view_foreach(struct squeek_view*, RowCallback callback, gpointer user_data); +struct squeek_row *squeek_view_get_row(struct squeek_view *view, + struct squeek_button *button); void squeek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard); #endif diff --git a/src/layout.rs b/src/layout.rs index 0c19d45b..2e7a0fe4 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -185,19 +185,6 @@ pub mod c { let row = unsafe { &mut *row }; row.bounds = Some(bounds); } - - #[no_mangle] - pub extern "C" - fn squeek_row_contains( - row: *mut ::layout::Row, - needle: *const ::layout::Button, - ) -> u32 { - let row = unsafe { &mut *row }; - row.buttons.iter().position( - // TODO: wrap Button properly in Rc; this comparison is unreliable - |button| button.as_ref() as *const ::layout::Button == needle - ).is_some() as u32 - } #[no_mangle] pub extern "C" @@ -413,12 +400,54 @@ pub mod c { None => ptr::null_mut(), } } + + fn squeek_row_contains(row: &Row, needle: *const Button) -> bool { + row.buttons.iter().position( + // TODO: wrap Button properly in Rc; this comparison is unreliable + |button| button.as_ref() as *const ::layout::Button == needle + ).is_some() + } + + #[no_mangle] + pub extern "C" + fn squeek_view_get_row( + view: *mut View, + needle: *const ::layout::Button, + ) -> *mut Row { + let view = unsafe { &mut *view }; + let result = view.rows.iter_mut().find(|row| { + squeek_row_contains(row, needle) + }); + match result { + Some(row) => row.as_mut() as *mut Row, + None => ptr::null_mut(), + } + } + + #[cfg(test)] + mod test { + use super::*; + + #[test] + fn row_has_button() { + let mut row = Row::new(0); + let button = squeek_row_create_button(&mut row as *mut Row, 0, 0); + assert_eq!(squeek_row_contains(&row, button), true); + let shared_button = squeek_row_create_button_with_state( + &mut row as *mut Row, + button + ); + assert_eq!(squeek_row_contains(&row, shared_button), true); + let row = Row::new(0); + assert_eq!(squeek_row_contains(&row, button), false); + } + } } #[cfg(test)] mod test { use super::*; - + #[test] fn button_has_key() { let button = squeek_button_new(0, 0); @@ -431,17 +460,6 @@ pub mod c { let shared_button = squeek_button_new_with_state(button); assert_eq!(squeek_button_has_key(shared_button, state), 1); } - - #[test] - fn row_has_button() { - let row = squeek_row_new(0); - let button = squeek_row_create_button(row, 0, 0); - assert_eq!(squeek_row_contains(row, button), 1); - let shared_button = squeek_row_create_button_with_state(row, button); - assert_eq!(squeek_row_contains(row, shared_button), 1); - let row = squeek_row_new(0); - assert_eq!(squeek_row_contains(row, button), 0); - } } }