section: Elininate references

This commit is contained in:
Dorota Czaplejewicz
2019-08-15 18:35:46 +00:00
parent 0d33179727
commit 77d4f45d13
11 changed files with 110 additions and 126 deletions

View File

@ -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;