From 0733f11105234ea5e49027a0a66ba3cfa1d21405 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 4 Jun 2010 18:15:14 +0900 Subject: [PATCH] Experimental support for Shift handling. --- eek/eek-clutter-keyboard.c | 81 +++++++++++++++++++++++++++++++++++++- eek/eek-key.c | 8 ++-- eek/eek-keyboard.c | 42 ++++++++++++++++++++ eek/eek-keyboard.h | 66 ++++++++++++++++++------------- eek/eek-simple-key.c | 16 ++++++++ eek/eek-xkb-layout.c | 2 +- 6 files changed, 182 insertions(+), 33 deletions(-) diff --git a/eek/eek-clutter-keyboard.c b/eek/eek-clutter-keyboard.c index 0cdba99a..7df85163 100644 --- a/eek/eek-clutter-keyboard.c +++ b/eek/eek-clutter-keyboard.c @@ -53,6 +53,8 @@ G_DEFINE_TYPE_WITH_CODE (EekClutterKeyboard, eek_clutter_keyboard, struct _EekClutterKeyboardPrivate { EekSimpleKeyboard *simple; + gint group; + gint level; }; static void @@ -61,7 +63,6 @@ eek_clutter_keyboard_real_set_bounds (EekKeyboard *self, { EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); - fflush (stdout); g_return_if_fail (priv); eek_keyboard_set_bounds (EEK_KEYBOARD(priv->simple), bounds); clutter_actor_set_position (CLUTTER_ACTOR(self), bounds->x, bounds->y); @@ -78,6 +79,46 @@ eek_clutter_keyboard_real_get_bounds (EekKeyboard *self, return eek_keyboard_get_bounds (EEK_KEYBOARD(priv->simple), bounds); } +static void +eek_clutter_keyboard_real_set_keysym_index (EekKeyboard *self, + gint group, + gint level) +{ + EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); + gint num_sections, num_keys, i, j; + + g_return_if_fail (priv); + priv->group = group; + priv->level = level; + num_sections = clutter_group_get_n_children (CLUTTER_GROUP(self)); + for (i = 0; i < num_sections; i++) { + ClutterActor *section; + + section = clutter_group_get_nth_child (CLUTTER_GROUP(self), i); + g_return_if_fail (EEK_IS_CLUTTER_SECTION(section)); + num_keys = clutter_group_get_n_children (CLUTTER_GROUP(section)); + for (j = 0; j < num_keys; j++) { + ClutterActor *key; + + key = clutter_group_get_nth_child (CLUTTER_GROUP(section), j); + g_return_if_fail (EEK_IS_CLUTTER_KEY(key)); + eek_key_set_keysym_index (EEK_KEY(key), group, level); + } + } +} + +static void +eek_clutter_keyboard_real_get_keysym_index (EekKeyboard *self, + gint *group, + gint *level) +{ + EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); + + g_return_if_fail (priv); + *group = priv->group; + *level = priv->level; +} + static EekSection * eek_clutter_keyboard_real_create_section (EekKeyboard *self, const gchar *name, @@ -134,6 +175,8 @@ eek_keyboard_iface_init (EekKeyboardIface *iface) { iface->set_bounds = eek_clutter_keyboard_real_set_bounds; iface->get_bounds = eek_clutter_keyboard_real_get_bounds; + iface->set_keysym_index = eek_clutter_keyboard_real_set_keysym_index; + iface->get_keysym_index = eek_clutter_keyboard_real_get_keysym_index; iface->create_section = eek_clutter_keyboard_real_create_section; iface->foreach_section = eek_clutter_keyboard_real_foreach_section; iface->set_layout = eek_clutter_keyboard_real_set_layout; @@ -227,6 +270,38 @@ eek_clutter_keyboard_class_init (EekClutterKeyboardClass *klass) "bounds"); } +static gboolean +on_event (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + EekKeyboard *keyboard; + EekKey *key; + ClutterActor *source; + + g_return_val_if_fail (EEK_IS_KEYBOARD(user_data), FALSE); + keyboard = EEK_KEYBOARD(user_data); + + source = clutter_event_get_source (event); + if (!EEK_IS_KEY(source)) + return FALSE; + key = EEK_KEY(source); + if (event->type == CLUTTER_BUTTON_PRESS) { + guint keysym; + gint group, level; + + keysym = eek_key_get_keysym (EEK_KEY(source)); + if (keysym == 0xFFE1 || keysym == 0xFFE2) { + eek_keyboard_get_keysym_index (keyboard, &group, &level); + if (level == 0) + eek_keyboard_set_keysym_index (keyboard, group, 1); + else + eek_keyboard_set_keysym_index (keyboard, group, 0); + } + } + return FALSE; +} + static void eek_clutter_keyboard_init (EekClutterKeyboard *self) { @@ -234,6 +309,10 @@ eek_clutter_keyboard_init (EekClutterKeyboard *self) priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); priv->simple = g_object_new (EEK_TYPE_SIMPLE_KEYBOARD, NULL); + priv->group = priv->level = 0; + + clutter_actor_set_reactive (CLUTTER_ACTOR(self), TRUE); + g_signal_connect (self, "event", G_CALLBACK(on_event), self); } /** diff --git a/eek/eek-key.c b/eek/eek-key.c index a897a9f5..1c86203e 100644 --- a/eek/eek-key.c +++ b/eek/eek-key.c @@ -355,10 +355,10 @@ eek_key_set_keysym_index (EekKey *key, /** * eek_key_get_keysym_index: * @key: an #EekKey - * @group: a pointer to row index of the symbol matrix #EekKey:keysyms - * to be stored - * @level: a pointer to column index of the symbol matrix - * #EekKey:keysyms to be stored + * @group: a pointer where row index of the symbol matrix #EekKey:keysyms + * will be stored + * @level: a pointer where column index of the symbol matrix + * #EekKey:keysyms will be stored * * Get the current cell position of the symbol matrix of @key. */ diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 9c40b6c4..cd30c899 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -116,6 +116,48 @@ eek_keyboard_get_bounds (EekKeyboard *keyboard, return (*iface->get_bounds) (keyboard, bounds); } +/** + * eek_keyboard_set_keysym_index: + * @keyboard: an #EekKeyboard + * @group: row index of the symbol matrix of keys on @keyboard + * @level: column index of the symbol matrix of keys on @keyboard + * + * Select a cell of the symbol matrix of each key on @keyboard. + */ +void +eek_keyboard_set_keysym_index (EekKeyboard *self, + gint group, + gint level) +{ + EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(self); + + g_return_if_fail (iface); + g_return_if_fail (iface->set_keysym_index); + (*iface->set_keysym_index) (self, group, level); +} + +/** + * eek_keyboard_set_keysym_index: + * @keyboard: an #EekKeyboard + * @group: a pointer where row index of the symbol matrix of keys on + * @keyboard will be stored + * @level: a pointer where column index of the symbol matrix of keys + * on @keyboard will be stored + * + * Get the current cell position of the symbol matrix of each key on @keyboard. + */ +void +eek_keyboard_get_keysym_index (EekKeyboard *self, + gint *group, + gint *level) +{ + EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(self); + + g_return_if_fail (iface); + g_return_if_fail (iface->get_keysym_index); + return (*iface->get_keysym_index) (self, group, level); +} + /** * eek_keyboard_create_section: * @keyboard: an #EekKeyboard diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index e36b795b..fb066803 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -38,41 +38,53 @@ struct _EekKeyboardIface GTypeInterface g_iface; /*< public >*/ - void (* set_bounds) (EekKeyboard *self, - EekBounds *bounds); - void (* get_bounds) (EekKeyboard *self, - EekBounds *bounds); - EekSection *(* create_section) (EekKeyboard *self, - const gchar *name, - gint angle, - EekBounds *bounds); + void (* set_bounds) (EekKeyboard *self, + EekBounds *bounds); + void (* get_bounds) (EekKeyboard *self, + EekBounds *bounds); + void (* set_keysym_index) (EekKeyboard *self, + gint group, + gint level); + void (* get_keysym_index) (EekKeyboard *self, + gint *group, + gint *level); + EekSection *(* create_section) (EekKeyboard *self, + const gchar *name, + gint angle, + EekBounds *bounds); - void (* foreach_section) (EekKeyboard *self, - GFunc func, - gpointer user_data); + void (* foreach_section) (EekKeyboard *self, + GFunc func, + gpointer user_data); - void (* set_layout) (EekKeyboard *self, - EekLayout *layout); + void (* set_layout) (EekKeyboard *self, + EekLayout *layout); }; -GType eek_keyboard_get_type (void) G_GNUC_CONST; +GType eek_keyboard_get_type (void) G_GNUC_CONST; -void eek_keyboard_set_bounds (EekKeyboard *keyboard, - EekBounds *bounds); -void eek_keyboard_get_bounds (EekKeyboard *keyboard, - EekBounds *bounds); +void eek_keyboard_set_bounds (EekKeyboard *keyboard, + EekBounds *bounds); +void eek_keyboard_get_bounds (EekKeyboard *keyboard, + EekBounds *bounds); +void eek_keyboard_set_keysym_index (EekKeyboard *self, + gint group, + gint level); +void eek_keyboard_get_keysym_index (EekKeyboard *self, + gint *group, + gint *level); -EekSection *eek_keyboard_create_section (EekKeyboard *keyboard, - const gchar *name, - gint angle, - EekBounds *bounds); +EekSection *eek_keyboard_create_section (EekKeyboard *keyboard, + const gchar *name, + gint angle, + EekBounds *bounds); -void eek_keyboard_foreach_section (EekKeyboard *keyboard, - GFunc func, - gpointer user_data); +void eek_keyboard_foreach_section (EekKeyboard *keyboard, + GFunc func, + gpointer user_data); -void eek_keyboard_set_layout (EekKeyboard *keyboard, - EekLayout *layout); +void eek_keyboard_set_layout (EekKeyboard *keyboard, + EekLayout *layout); G_END_DECLS #endif /* EEK_KEYBOARD_H */ diff --git a/eek/eek-simple-key.c b/eek/eek-simple-key.c index 36828f8a..743f49df 100644 --- a/eek/eek-simple-key.c +++ b/eek/eek-simple-key.c @@ -24,6 +24,11 @@ #include "eek-keysym.h" #include +#define DEBUG 0 +#if DEBUG +#include +#endif + enum { PROP_0, PROP_NAME, @@ -76,6 +81,17 @@ eek_simple_key_real_set_keysyms (EekKey *self, memcpy (priv->keysyms, keysyms, groups * levels * sizeof(guint)); priv->num_groups = groups; priv->num_levels = levels; + +#if DEBUG + { + gint i; + + fprintf (stderr, "%s: ", priv->name); + for (i = 0; i < groups * levels; i++) + fprintf (stderr, "\"%s\" ", eek_keysym_to_string (keysyms[i])); + fprintf (stderr, "\n"); + } +#endif } static gint diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index 3fe6725e..a202ea10 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -191,7 +191,7 @@ create_key (EekXkbLayout *layout, keysyms = g_malloc0 ((num_keysyms) * sizeof(guint)); for (i = 0; i < num_groups; i++) for (j = 0; j < num_levels; j++) { - keysym = XkbKeySymEntry (priv->xkb, keycode, i, j); + keysym = XkbKeySymEntry (priv->xkb, keycode, j, i); keysyms[i * num_levels + j] = keysym; } }