diff --git a/eek/eek-key.c b/eek/eek-key.c index 74d2040e..3a1c8e36 100644 --- a/eek/eek-key.c +++ b/eek/eek-key.c @@ -35,6 +35,8 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ #include "eek-key.h" +#include "eek-section.h" +#include "eek-keyboard.h" #include "eek-keysym.h" enum { @@ -44,8 +46,6 @@ enum { PROP_COLUMN, PROP_ROW, PROP_OUTLINE, - PROP_GROUP, - PROP_LEVEL, PROP_LAST }; @@ -70,8 +70,6 @@ struct _EekKeyPrivate gint column; gint row; EekOutline *outline; - gint group; - gint level; gboolean is_pressed; }; @@ -140,18 +138,6 @@ eek_key_real_get_keysyms (EekKey *self, } } -static guint -eek_key_real_get_keysym (EekKey *self) -{ - EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self); - gint num_keysyms = priv->keysyms.num_groups * priv->keysyms.num_levels; - - if (num_keysyms == 0) - return EEK_INVALID_KEYSYM; - return priv->keysyms.data[priv->group * priv->keysyms.num_levels + - priv->level]; -} - static void eek_key_real_set_index (EekKey *self, gint column, @@ -192,38 +178,6 @@ eek_key_real_get_outline (EekKey *self) return priv->outline; } -static void -eek_key_real_set_keysym_index (EekKey *self, - gint group, - gint level) -{ - EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self); - - g_return_if_fail (0 <= group); - if (group >= priv->keysyms.num_groups) - group = 0; - g_return_if_fail (0 <= level); - if (level >= priv->keysyms.num_levels) - level = 0; - priv->group = group; - priv->level = level; -} - -static void -eek_key_real_get_keysym_index (EekKey *self, - gint *group, - gint *level) -{ - EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self); - - g_return_if_fail (group); - g_return_if_fail (level); - if (group) - *group = priv->group; - if (level) - *level = priv->level; -} - static gboolean eek_key_real_is_pressed (EekKey *self) { @@ -271,7 +225,6 @@ eek_key_set_property (GObject *object, { EekKeysymMatrix *matrix; gint column, row; - gint group, level; g_return_if_fail (EEK_IS_KEY(object)); switch (prop_id) { @@ -296,16 +249,6 @@ eek_key_set_property (GObject *object, case PROP_OUTLINE: eek_key_set_outline (EEK_KEY(object), g_value_get_pointer (value)); break; - case PROP_GROUP: - eek_key_get_keysym_index (EEK_KEY(object), &group, &level); - eek_key_set_keysym_index (EEK_KEY(object), g_value_get_int (value), - level); - break; - case PROP_LEVEL: - eek_key_get_keysym_index (EEK_KEY(object), &group, &level); - eek_key_set_keysym_index (EEK_KEY(object), group, - g_value_get_int (value)); - break; default: g_object_set_property (object, g_param_spec_get_name (pspec), @@ -345,14 +288,6 @@ eek_key_get_property (GObject *object, case PROP_OUTLINE: g_value_set_pointer (value, eek_key_get_outline (EEK_KEY(object))); break; - case PROP_GROUP: - eek_key_get_keysym_index (EEK_KEY(object), &group, &level); - g_value_set_int (value, group); - break; - case PROP_LEVEL: - eek_key_get_keysym_index (EEK_KEY(object), &group, &level); - g_value_set_int (value, level); - break; default: g_object_get_property (object, g_param_spec_get_name (pspec), @@ -374,13 +309,10 @@ eek_key_class_init (EekKeyClass *klass) klass->set_keycode = eek_key_real_set_keycode; klass->set_keysyms = eek_key_real_set_keysyms; klass->get_keysyms = eek_key_real_get_keysyms; - klass->get_keysym = eek_key_real_get_keysym; klass->set_index = eek_key_real_set_index; klass->get_index = eek_key_real_get_index; klass->set_outline = eek_key_real_set_outline; klass->get_outline = eek_key_real_get_outline; - klass->set_keysym_index = eek_key_real_set_keysym_index; - klass->get_keysym_index = eek_key_real_get_keysym_index; klass->is_pressed = eek_key_real_is_pressed; gobject_class->set_property = eek_key_set_property; @@ -453,30 +385,6 @@ eek_key_class_init (EekKeyClass *klass) G_PARAM_READWRITE); g_object_class_install_property (gobject_class, PROP_OUTLINE, pspec); - /** - * EekKey:group: - * - * The column index of #EekKey in the symbol matrix #EekKey:keysyms. - */ - pspec = g_param_spec_int ("group", - "Group", - "Current group of the key", - 0, 64, 0, - G_PARAM_READWRITE); - g_object_class_install_property (gobject_class, PROP_GROUP, pspec); - - /** - * EekKey:level: - * - * The row index of #EekKey in the symbol matrix #EekKey:keysyms. - */ - pspec = g_param_spec_int ("level", - "Level", - "Current level of the key", - 0, 3, 0, - G_PARAM_READWRITE); - g_object_class_install_property (gobject_class, PROP_LEVEL, pspec); - /** * EekKey::pressed: * @key: an #EekKey @@ -522,7 +430,6 @@ eek_key_init (EekKey *self) memset (&priv->keysyms, 0, sizeof priv->keysyms); priv->column = priv->row = 0; priv->outline = NULL; - priv->group = priv->level = 0; } /** @@ -606,8 +513,50 @@ eek_key_get_keysyms (EekKey *key, guint eek_key_get_keysym (EekKey *key) { - g_return_val_if_fail (EEK_IS_KEY(key), EEK_INVALID_KEYSYM); - return EEK_KEY_GET_CLASS(key)->get_keysym (key); + gint group, level; + EekElement *parent; + + g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYSYM); + + parent = eek_element_get_parent (EEK_ELEMENT(key)); + g_return_val_if_fail (EEK_IS_SECTION(parent), EEK_INVALID_KEYSYM); + + parent = eek_element_get_parent (parent); + g_return_val_if_fail (EEK_IS_KEYBOARD(parent), EEK_INVALID_KEYSYM); + + eek_keyboard_get_keysym_index (EEK_KEYBOARD(parent), &group, &level); + + return eek_key_get_keysym_at_index (key, group, level); +} + +/** + * eek_key_get_keysym_at_index: + * @key: an #EekKey + * @group: group index of the keysym matrix + * @level: level index of the keysym matrix + * + * Get the symbol at (@group, @level) in the keysym matrix of @key. + * Returns: a symbol or %EEK_INVALID_KEYSYM on failure + */ +guint +eek_key_get_keysym_at_index (EekKey *key, + gint group, + gint level) +{ + EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(key); + gint num_keysyms = priv->keysyms.num_groups * priv->keysyms.num_levels; + gint g, l; + EekElement *parent; + + if (num_keysyms == 0) + return EEK_INVALID_KEYSYM; + + if (group >= priv->keysyms.num_groups) + return EEK_INVALID_KEYSYM; + if (level >= priv->keysyms.num_levels) + return EEK_INVALID_KEYSYM; + + return priv->keysyms.data[group * priv->keysyms.num_levels + level]; } /** @@ -675,42 +624,6 @@ eek_key_get_outline (EekKey *key) return EEK_KEY_GET_CLASS(key)->get_outline (key); } -/** - * eek_key_set_keysym_index: - * @key: an #EekKey - * @group: group (row) index of @key - * @level: level (column) index of @key - * - * Set the current group and/or level index of @key in its symbol - * matrix to @group and @level. - */ -void -eek_key_set_keysym_index (EekKey *key, - gint group, - gint level) -{ - g_return_if_fail (EEK_IS_KEY(key)); - EEK_KEY_GET_CLASS(key)->set_keysym_index (key, group, level); -} - -/** - * eek_key_get_keysym_index: - * @key: an #EekKey - * @group: pointer where group (row) index of @key will be stored - * @level: pointer where level (column) index of @key will be stored - * - * Get the current group and/or level index of @key in its symbol - * matrix. - */ -void -eek_key_get_keysym_index (EekKey *key, - gint *group, - gint *level) -{ - g_return_if_fail (EEK_IS_KEY(key)); - EEK_KEY_GET_CLASS(key)->get_keysym_index (key, group, level); -} - /** * eek_key_is_pressed: * @key: an #EekKey diff --git a/eek/eek-key.h b/eek/eek-key.h index 0ecd7e05..f17b3efc 100644 --- a/eek/eek-key.h +++ b/eek/eek-key.h @@ -57,8 +57,6 @@ struct _EekKey * section * @set_outline: virtual function for setting outline shape of the key * @get_outline: virtual function for getting outline shape of the key - * @set_keysym_index: virtual function for setting group and level of the key - * @get_keysym_index: virtual function for getting group and level of the key * @pressed: class handler for #EekKey::pressed signal * @released: class handler for #EekKey::released signal * @is_pressed: virtual function for getting whether the key is pressed @@ -80,7 +78,6 @@ struct _EekKeyClass guint **keysyms, gint *num_groups, gint *num_levels); - guint (* get_keysym) (EekKey *self); void (* set_index) (EekKey *self, gint column, @@ -93,12 +90,6 @@ struct _EekKeyClass EekOutline *outline); EekOutline *(* get_outline) (EekKey *self); - void (* set_keysym_index) (EekKey *self, - gint group, - gint level); - void (* get_keysym_index) (EekKey *self, - gint *group, - gint *level); gboolean (* is_pressed) (EekKey *self); /* signals */ @@ -110,39 +101,36 @@ struct _EekKeyClass gpointer pdummy[23]; }; -GType eek_key_get_type (void) G_GNUC_CONST; +GType eek_key_get_type (void) G_GNUC_CONST; -void eek_key_set_keycode (EekKey *key, - guint keycode); -guint eek_key_get_keycode (EekKey *key); -void eek_key_set_keysyms (EekKey *key, - guint *keysyms, - gint num_groups, - gint num_levels); -void eek_key_get_keysyms (EekKey *key, - guint **keysyms, - gint *num_groups, - gint *num_levels); -guint eek_key_get_keysym (EekKey *key); +void eek_key_set_keycode (EekKey *key, + guint keycode); +guint eek_key_get_keycode (EekKey *key); +void eek_key_set_keysyms (EekKey *key, + guint *keysyms, + gint num_groups, + gint num_levels); +void eek_key_get_keysyms (EekKey *key, + guint **keysyms, + gint *num_groups, + gint *num_levels); +guint eek_key_get_keysym (EekKey *key); +guint eek_key_get_keysym_at_index (EekKey *key, + gint group, + gint level); -void eek_key_set_index (EekKey *key, - gint column, - gint row); -void eek_key_get_index (EekKey *key, - gint *column, - gint *row); +void eek_key_set_index (EekKey *key, + gint column, + gint row); +void eek_key_get_index (EekKey *key, + gint *column, + gint *row); -void eek_key_set_outline (EekKey *key, - EekOutline *outline); -EekOutline *eek_key_get_outline (EekKey *key); +void eek_key_set_outline (EekKey *key, + EekOutline *outline); +EekOutline *eek_key_get_outline (EekKey *key); -void eek_key_set_keysym_index (EekKey *key, - gint group, - gint level); -void eek_key_get_keysym_index (EekKey *key, - gint *group, - gint *level); -gboolean eek_key_is_pressed (EekKey *key); +gboolean eek_key_is_pressed (EekKey *key); G_END_DECLS #endif /* EEK_KEY_H */ diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 0a42c049..5c3757fb 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -66,48 +66,16 @@ struct _EekKeyboardPrivate EekLayout *layout; }; -struct _SetKeysymIndexCallbackData { - gint group; - gint level; -}; -typedef struct _SetKeysymIndexCallbackData SetKeysymIndexCallbackData; - -static void -set_keysym_index_for_key (EekElement *element, - gpointer user_data) -{ - SetKeysymIndexCallbackData *data; - - g_return_if_fail (EEK_IS_KEY(element)); - - data = user_data; - eek_key_set_keysym_index (EEK_KEY(element), data->group, data->level); -} - -static void -set_keysym_index_for_section (EekElement *element, - gpointer user_data) -{ - eek_container_foreach_child (EEK_CONTAINER(element), - set_keysym_index_for_key, - user_data); -} - static void eek_keyboard_real_set_keysym_index (EekKeyboard *self, gint group, gint level) { EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self); - SetKeysymIndexCallbackData data; if (priv->group != group || priv->level != level) { - data.group = priv->group = group; - data.level = priv->level = level; - - eek_container_foreach_child (EEK_CONTAINER(self), - set_keysym_index_for_section, - &data); + priv->group = group; + priv->level = level; g_signal_emit_by_name (self, "keysym-index-changed", group, level); } diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index 28a0f74b..eccf964b 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -209,7 +209,6 @@ create_key (EekXkbLayout *layout, eek_key_set_keysyms (key, keysyms, num_groups, num_levels); if (keysyms) g_slice_free1 (num_keysyms * sizeof(guint), keysyms); - eek_key_set_keysym_index (key, 0, 0); eek_key_set_outline (key, outline); }