diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 7e7951c2..2c3e772f 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -528,9 +528,9 @@ on_button_pressed (struct squeek_button *button, struct button_place place = { .button = button, - .section = eek_keyboard_get_section(view, button), + .row = eek_keyboard_get_row(view, button), }; - if (!place.section) { + if (!place.row) { return; } render_pressed_button (GTK_WIDGET(self), &place); diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 7ff978f9..e9c786e6 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -66,7 +66,7 @@ struct _EekKeyboardPrivate char dummy; // won't run otherwise }; -G_DEFINE_TYPE_WITH_PRIVATE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER); +G_DEFINE_TYPE_WITH_PRIVATE (EekKeyboard, eek_keyboard, EEK_TYPE_ELEMENT); G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key, eek_modifier_key_copy, eek_modifier_key_free); @@ -83,17 +83,12 @@ eek_modifier_key_free (EekModifierKey *modkey) g_slice_free (EekModifierKey, modkey); } -EekSection * -eek_keyboard_real_create_section (EekKeyboard *self) +struct squeek_row * +eek_keyboard_real_create_row (EekKeyboard *self) { - EekSection *section; - - section = g_object_new (EEK_TYPE_SECTION, NULL); - g_return_val_if_fail (section, NULL); - - EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self), - EEK_ELEMENT(section)); - return section; + struct squeek_row *row = squeek_row_new(0); + g_ptr_array_add(self->rows, row); + return row; } static void @@ -278,13 +273,9 @@ eek_keyboard_real_child_removed (EekContainer *self, static void eek_keyboard_class_init (EekKeyboardClass *klass) { - EekContainerClass *container_class = EEK_CONTAINER_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); /* signals */ - container_class->child_added = eek_keyboard_real_child_added; - container_class->child_removed = eek_keyboard_real_child_removed; - gobject_class->get_property = eek_keyboard_get_property; gobject_class->set_property = eek_keyboard_set_property; gobject_class->dispose = eek_keyboard_dispose; @@ -294,8 +285,14 @@ eek_keyboard_class_init (EekKeyboardClass *klass) static void eek_keyboard_init (EekKeyboard *self) { - self->priv = EEK_KEYBOARD_GET_PRIVATE(self); self->scale = 1.0; + self->rows = g_ptr_array_new(); +} + +void eek_keyboard_foreach (EekKeyboard *keyboard, + GFunc func, + gpointer user_data) { + g_ptr_array_foreach(keyboard->rows, func, user_data); } void level_keyboard_init(LevelKeyboard *self) { @@ -431,42 +428,42 @@ EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard) return keyboard->views[keyboard->level]; } -struct GetSectionData { +struct GetRowData { struct squeek_button *button; - EekSection *section; + struct squeek_row *row; struct squeek_key *needle; }; -void find_button_in_section(EekElement *element, gpointer user_data) { - EekSection *section = EEK_SECTION(element); - struct GetSectionData *data = user_data; - if (data->section) { +void find_button_in_row(gpointer item, gpointer user_data) { + struct squeek_row *row = item; + struct GetRowData *data = user_data; + if (data->row) { return; } - if (eek_section_find(section, data->button)) { - data->section = section; + if (squeek_row_contains(row, data->button)) { + data->row = row; } } -EekSection *eek_keyboard_get_section(EekKeyboard *keyboard, +struct squeek_row *eek_keyboard_get_row(EekKeyboard *keyboard, struct squeek_button *button) { - struct GetSectionData data = { + struct GetRowData data = { .button = button, - .section = NULL, + .row = NULL, }; - eek_container_foreach_child(EEK_CONTAINER(keyboard), find_button_in_section, &data); - return data.section; + eek_keyboard_foreach(keyboard, find_button_in_row, &data); + return data.row; } -void find_key_in_section(EekElement *element, gpointer user_data) { - EekSection *section = EEK_SECTION(element); - struct GetSectionData *data = user_data; +void find_key_in_row(gpointer item, gpointer user_data) { + struct squeek_row *row = item; + struct GetRowData *data = user_data; if (data->button) { return; } - data->button = eek_section_find_key(section, data->needle); + data->button = squeek_row_find_key(row, data->needle); if (data->button) { - data->section = section; + data->row = row; } } @@ -474,14 +471,14 @@ void find_key_in_section(EekElement *element, gpointer user_data) { // TODO: return multiple struct button_place eek_keyboard_get_button_by_state(EekKeyboard *keyboard, struct squeek_key *key) { - struct GetSectionData data = { - .section = NULL, + struct GetRowData data = { + .row = NULL, .button = NULL, .needle = key, }; - eek_container_foreach_child(EEK_CONTAINER(keyboard), find_key_in_section, &data); + eek_keyboard_foreach(keyboard, find_key_in_row, &data); struct button_place ret = { - .section = data.section, + .row = data.row, .button = data.button, }; return ret; diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index c152e72a..236ade14 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -57,10 +57,11 @@ typedef struct _EekKeyboardPrivate EekKeyboardPrivate; struct _EekKeyboard { /*< private >*/ - EekContainer parent; + EekElement parent; EekKeyboardPrivate *priv; double scale; + GPtrArray *rows; // struct squeek_row* }; /** @@ -77,7 +78,7 @@ struct _EekKeyboard struct _EekKeyboardClass { /*< private >*/ - EekContainerClass parent_class; + EekElementClass parent_class; /* obsolete members moved to EekElement */ gpointer set_symbol_index; @@ -156,15 +157,14 @@ void eek_keyboard_set_size EekSection *eek_keyboard_create_section (EekKeyboard *keyboard); -EekSection *eek_keyboard_get_section - (EekKeyboard *keyboard, +struct squeek_row *eek_keyboard_get_row(EekKeyboard *keyboard, struct squeek_button *button); struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard, const gchar *name); /// Represents the path to the button within a view struct button_place { - EekSection *section; + struct squeek_row *row; struct squeek_button *button; }; @@ -185,16 +185,14 @@ void eek_keyboard_release_button(LevelKeyboard *keyboard, struct squeek_button * gchar * eek_keyboard_get_keymap (LevelKeyboard *keyboard); +void eek_keyboard_foreach (EekKeyboard *keyboard, + GFunc func, + gpointer user_data); + EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard); LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *views[4], GHashTable *name_button_hash); void level_keyboard_deinit(LevelKeyboard *self); void level_keyboard_free(LevelKeyboard *self); -/* Create an #EekSection instance and append it to @keyboard. This -* function is rarely called by application but called by #EekLayout -* implementation. -*/ -EekSection * -eek_keyboard_real_create_section (EekKeyboard *self); struct squeek_row * eek_keyboard_real_create_row (EekKeyboard *self); diff --git a/eek/eek-layout.c b/eek/eek-layout.c index 93f5aa9f..ac70aa87 100644 --- a/eek/eek-layout.c +++ b/eek/eek-layout.c @@ -46,7 +46,7 @@ eek_layout_init (EekLayout *self) { } -const double section_spacing = 7.0; +const double row_spacing = 7.0; struct place_data { double desired_width; @@ -56,38 +56,39 @@ struct place_data { }; static void -section_placer(EekElement *element, gpointer user_data) +row_placer(gpointer item, gpointer user_data) { struct place_data *data = (struct place_data*)user_data; - EekSection *section = EEK_SECTION(element); - EekBounds section_bounds = { + struct squeek_row *row = item; + EekBounds row_bounds = { .x = 0, .y = 0, .width = data->desired_width, .height = 0, }; - eek_section_set_bounds(section, section_bounds); + squeek_row_set_bounds(row, row_bounds); - // Sections are rows now. Gather up all the keys and adjust their bounds. - eek_section_place_keys(EEK_SECTION(element), data->keyboard); + // Gather up all the keys in a row and adjust their bounds. + eek_row_place_buttons(row, data->keyboard); - section_bounds = eek_section_get_bounds(section); - section_bounds.y = data->current_offset; - eek_section_set_bounds(section, section_bounds); - data->current_offset += section_bounds.height + section_spacing; + row_bounds = squeek_row_get_bounds(row); + row_bounds.y = data->current_offset; + squeek_row_set_bounds(row, row_bounds); + data->current_offset += row_bounds.height + row_spacing; } static void -section_counter(EekElement *element, gpointer user_data) { +row_counter(gpointer item, gpointer user_data) { double *total_height = user_data; - EekBounds section_bounds = eek_section_get_bounds(EEK_SECTION(element)); - *total_height += section_bounds.height + section_spacing; + struct squeek_row *row = item; + EekBounds row_bounds = squeek_row_get_bounds(row); + *total_height += row_bounds.height + row_spacing; } void -eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level) +eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level) { /* Order rows */ // This needs to be done after outlines, because outlines define key sizes @@ -103,10 +104,10 @@ eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level) .current_offset = 0, .keyboard = keyboard, }; - eek_container_foreach_child(EEK_CONTAINER(level), section_placer, &placer_data); + eek_keyboard_foreach(level, row_placer, &placer_data); double total_height = 0; - eek_container_foreach_child(EEK_CONTAINER(level), section_counter, &total_height); + eek_keyboard_foreach(level, row_counter, &total_height); keyboard_bounds.height = total_height; eek_element_set_bounds(EEK_ELEMENT(level), &keyboard_bounds); } @@ -114,5 +115,5 @@ eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level) void eek_layout_update_layout(LevelKeyboard *keyboard) { - eek_layout_place_sections(keyboard, level_keyboard_current(keyboard)); + eek_layout_place_rows(keyboard, level_keyboard_current(keyboard)); } diff --git a/eek/eek-layout.h b/eek/eek-layout.h index 7ee3195d..fb98abaf 100644 --- a/eek/eek-layout.h +++ b/eek/eek-layout.h @@ -55,7 +55,7 @@ struct _EekLayoutClass GType eek_layout_get_type (void) G_GNUC_CONST; -void eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level); +void eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level); void eek_layout_update_layout(LevelKeyboard *keyboard); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index dbf79fce..d4a204ff 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -88,7 +88,7 @@ struct _CreateKeyboardSurfaceCallbackData { cairo_t *cr; EekRenderer *renderer; EekKeyboard *view; - EekSection *section; + struct squeek_row *row; }; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; @@ -109,7 +109,7 @@ create_keyboard_surface_button_callback (struct squeek_button *button, bounds.height + 100); cairo_clip (data->cr); struct button_place place = { - .section = data->section, + .row = data->row, .button = button, }; render_button (data->renderer, data->cr, &place, FALSE); @@ -118,23 +118,21 @@ create_keyboard_surface_button_callback (struct squeek_button *button, } static void -create_keyboard_surface_section_callback (EekElement *element, +create_keyboard_surface_row_callback (gpointer item, gpointer user_data) { CreateKeyboardSurfaceCallbackData *data = user_data; - EekSection *section = EEK_SECTION(element); - EekBounds bounds = eek_section_get_bounds(section); - gint angle; + struct squeek_row *row = item; + EekBounds bounds = squeek_row_get_bounds(row); cairo_save (data->cr); cairo_translate (data->cr, bounds.x, bounds.y); - angle = eek_section_get_angle (section); + gint angle = squeek_row_get_angle (row); cairo_rotate (data->cr, angle * G_PI / 180); - data->section = section; - eek_section_foreach(section, - create_keyboard_surface_button_callback, + data->row = row; + squeek_row_foreach(row, create_keyboard_surface_button_callback, data); cairo_restore (data->cr); @@ -177,9 +175,9 @@ render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view) foreground.blue, foreground.alpha); - /* draw sections */ - eek_container_foreach_child (EEK_CONTAINER(level_keyboard_current(priv->keyboard)), - create_keyboard_surface_section_callback, + /* draw rows */ + eek_keyboard_foreach(level_keyboard_current(priv->keyboard), + create_keyboard_surface_row_callback, &data); cairo_restore (data.cr); @@ -351,13 +349,12 @@ eek_renderer_apply_transformation_for_button (EekRenderer *self, gboolean rotate) { EekBounds bounds, rotated_bounds; - gint angle; gdouble s; eek_renderer_get_button_bounds (self, place, &bounds, FALSE); eek_renderer_get_button_bounds (self, place, &rotated_bounds, TRUE); - angle = eek_section_get_angle (place->section); + gint angle = squeek_row_get_angle (place->row); cairo_scale (cr, scale, scale); if (rotate) { @@ -771,13 +768,13 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekBounds button_bounds = squeek_button_get_bounds(place->button); - EekBounds section_bounds = eek_section_get_bounds (place->section); + EekBounds row_bounds = squeek_row_get_bounds (place->row); eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &keyboard_bounds); if (!rotate) { - button_bounds.x += keyboard_bounds.x + section_bounds.x; - button_bounds.y += keyboard_bounds.y + section_bounds.y; + button_bounds.x += keyboard_bounds.x + row_bounds.x; + button_bounds.y += keyboard_bounds.y + row_bounds.y; *bounds = button_bounds; return; } @@ -790,8 +787,9 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, points[3].x = points[0].x; points[3].y = points[2].y; - if (rotate) - angle = eek_section_get_angle (place->section); + if (rotate) { + angle = squeek_row_get_angle (place->row); + } min = points[2]; max = points[0]; @@ -806,8 +804,8 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, if (points[i].y > max.y) max.y = points[i].y; } - bounds->x = keyboard_bounds.x + section_bounds.x + min.x; - bounds->y = keyboard_bounds.y + section_bounds.y + min.y; + bounds->x = keyboard_bounds.x + row_bounds.x + min.x; + bounds->y = keyboard_bounds.y + row_bounds.y + min.y; bounds->width = (max.x - min.x); bounds->height = (max.y - min.y); } @@ -1021,23 +1019,25 @@ find_button_by_position_key_callback (struct squeek_button *button, } } -static gint -find_button_by_position_section_callback (EekElement *element, +static void +find_button_by_position_row_callback (gpointer item, gpointer user_data) { - EekSection *section = EEK_SECTION(element); + struct squeek_row *row = item; FindKeyByPositionCallbackData *data = user_data; - EekBounds bounds = eek_section_get_bounds(section); + if (data->button) { + return; + } + EekBounds bounds = squeek_row_get_bounds(row); EekPoint origin; origin = data->origin; data->origin.x += bounds.x; data->origin.y += bounds.y; - data->angle = eek_section_get_angle(section); + data->angle = squeek_row_get_angle(row); - eek_section_foreach(section, find_button_by_position_key_callback, data); + squeek_row_foreach(row, find_button_by_position_key_callback, data); data->origin = origin; - return data->button ? 0 : -1; } /** @@ -1080,8 +1080,7 @@ eek_renderer_find_button_by_position (EekRenderer *renderer, data.button = NULL; data.renderer = renderer; - eek_container_find (EEK_CONTAINER(view), - find_button_by_position_section_callback, + eek_keyboard_foreach (view, find_button_by_position_row_callback, &data); return data.button; } diff --git a/eek/eek-section.c b/eek/eek-section.c index e3f80620..c8b09c3a 100644 --- a/eek/eek-section.c +++ b/eek/eek-section.c @@ -208,18 +208,17 @@ EekBounds eek_section_get_bounds(EekSection *section) { } void -eek_section_place_keys(EekSection *section, LevelKeyboard *keyboard) +eek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard) { - EekSectionPrivate *priv = eek_section_get_instance_private (section); - EekBounds section_size = squeek_row_place_keys(priv->row, keyboard); - EekBounds section_bounds = eek_section_get_bounds(section); - // FIXME: do centering of each section based on keyboard dimensions, + EekBounds row_size = squeek_row_place_keys(row, keyboard); + EekBounds row_bounds = squeek_row_get_bounds(row); + // FIXME: do centering of each row based on keyboard dimensions, // one level up the iterators // now centering by comparing previous width to the new, calculated one - section_bounds.x = (section_bounds.width - section_size.width) / 2; - section_bounds.width = section_size.width; - section_bounds.height = section_size.height; - eek_section_set_bounds(section, section_bounds); + row_bounds.x = (row_bounds.width - row_size.width) / 2; + row_bounds.width = row_size.width; + row_bounds.height = row_size.height; + squeek_row_set_bounds(row, row_bounds); } void eek_section_foreach (EekSection *section, diff --git a/eek/eek-section.h b/eek/eek-section.h index 16c0aa6b..f1d3f0f7 100644 --- a/eek/eek-section.h +++ b/eek/eek-section.h @@ -73,7 +73,8 @@ struct squeek_button *eek_section_create_button (EekSection *section, struct squeek_button *eek_section_create_button_with_state(EekSection *self, const gchar *name, struct squeek_button *source); -void eek_section_place_keys (EekSection *section, LevelKeyboard *keyboard); +void +eek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard); void eek_section_foreach (EekSection *section, ButtonCallback func, gpointer user_data); diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index 316ebe9d..b45db93a 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -234,7 +234,6 @@ struct _GeometryParseData { EekBounds bounds; EekKeyboard **views; guint view_idx; - EekSection *section; struct squeek_row *row; gint num_rows; EekOrientation orientation; @@ -375,12 +374,7 @@ geometry_start_element_callback (GMarkupParseContext *pcontext, } if (g_strcmp0 (element_name, "section") == 0) { - data->section = eek_keyboard_real_create_section (data->views[data->view_idx]); - data->row = eek_section_get_row(data->section); - attribute = get_attribute (attribute_names, attribute_values, - "id"); - if (attribute != NULL) - eek_element_set_name (EEK_ELEMENT(data->section), attribute); + data->row = eek_keyboard_real_create_row(data->views[data->view_idx]); attribute = get_attribute (attribute_names, attribute_values, "angle"); if (attribute != NULL) { @@ -584,7 +578,6 @@ geometry_end_element_callback (GMarkupParseContext *pcontext, } } - data->section = NULL; data->row = NULL; data->num_rows = 0; return; @@ -939,7 +932,7 @@ eek_xml_layout_real_create_keyboard (EekLayout *self, for (uint i = 0; i < 4; i++) { if (views[i]) { - eek_layout_place_sections(keyboard, views[i]); + eek_layout_place_rows(keyboard, views[i]); } } diff --git a/src/layout.rs b/src/layout.rs index 8d912792..e4cc5c79 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -126,8 +126,7 @@ pub mod c { let row = unsafe { &mut *row }; row.bounds = Some(bounds); } - - + #[no_mangle] pub extern "C" fn squeek_row_contains( diff --git a/tests/eek-simple-test.c b/tests/eek-simple-test.c index 72cdd391..03d2df85 100644 --- a/tests/eek-simple-test.c +++ b/tests/eek-simple-test.c @@ -25,13 +25,10 @@ static void test_create (void) { EekKeyboard *keyboard; - EekSection *section; struct squeek_button *button0, *button1; keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL); - section = eek_keyboard_real_create_section (keyboard); - g_assert (EEK_IS_SECTION(section)); - struct squeek_row *row = eek_section_get_row(section); + struct squeek_row *row = eek_keyboard_real_create_row (keyboard); g_assert (row); button0 = squeek_row_create_button (row, 1, 0); g_assert (button0);