From bb7462e786d14d1a4bc8f21702e39e779057a148 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Tue, 8 Jun 2010 09:27:41 +0900 Subject: [PATCH] Add "keycode" property to EekKey. Add eek_key_get_keysyms(). --- eek/eek-clutter-key.c | 29 ++++++++++++++++++ eek/eek-clutter-section.c | 2 ++ eek/eek-gtk-key.c | 29 ++++++++++++++++++ eek/eek-gtk-section.c | 2 ++ eek/eek-key.c | 54 +++++++++++++++++++++++++++++++++ eek/eek-key.h | 10 ++++++ eek/eek-keysym.h | 2 ++ eek/eek-section.c | 2 ++ eek/eek-section.h | 2 ++ eek/eek-simple-key.c | 44 +++++++++++++++++++++++++++ eek/eek-simple-section.c | 2 ++ eek/eek-xkb-layout.c | 1 + examples/eek-clutter-xkb-test.c | 4 +-- tests/eek-simple-test.c | 1 + 14 files changed, 182 insertions(+), 2 deletions(-) diff --git a/eek/eek-clutter-key.c b/eek/eek-clutter-key.c index cf4754d0..8c6f52aa 100644 --- a/eek/eek-clutter-key.c +++ b/eek/eek-clutter-key.c @@ -34,6 +34,7 @@ enum { PROP_0, + PROP_KEYCODE, PROP_KEYSYMS, PROP_COLUMN, PROP_ROW, @@ -59,6 +60,15 @@ struct _EekClutterKeyPrivate EekSimpleKey *simple; }; +static guint +eek_clutter_key_real_get_keycode (EekKey *self) +{ + EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self); + + g_return_val_if_fail (priv, EEK_INVALID_KEYCODE); + return eek_key_get_keycode (EEK_KEY(priv->simple)); +} + static void eek_clutter_key_real_set_keysyms (EekKey *self, guint *keysyms, @@ -71,6 +81,18 @@ eek_clutter_key_real_set_keysyms (EekKey *self, eek_key_set_keysyms (EEK_KEY(priv->simple), keysyms, groups, levels); } +static void +eek_clutter_key_real_get_keysyms (EekKey *self, + guint **keysyms, + gint *groups, + gint *levels) +{ + EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self); + + g_return_if_fail (priv); + eek_key_get_keysyms (EEK_KEY(priv->simple), keysyms, groups, levels); +} + static gint eek_clutter_key_real_get_groups (EekKey *self) { @@ -177,7 +199,9 @@ eek_clutter_key_real_get_keysym_index (EekKey *self, gint *group, gint *level) static void eek_key_iface_init (EekKeyIface *iface) { + iface->get_keycode = eek_clutter_key_real_get_keycode; iface->set_keysyms = eek_clutter_key_real_set_keysyms; + iface->get_keysyms = eek_clutter_key_real_get_keysyms; iface->get_groups = eek_clutter_key_real_get_groups; iface->get_keysym = eek_clutter_key_real_get_keysym; iface->set_index = eek_clutter_key_real_set_index; @@ -337,6 +361,7 @@ eek_clutter_key_set_property (GObject *object, g_value_get_pointer (value)); break; /* Otherwise delegate to priv->simple or the parent. */ + case PROP_KEYCODE: case PROP_KEYSYMS: case PROP_COLUMN: case PROP_GROUP: @@ -369,6 +394,7 @@ eek_clutter_key_get_property (GObject *object, eek_key_get_bounds (EEK_KEY(object), &bounds); g_value_set_boxed (value, &bounds); break; + case PROP_KEYCODE: case PROP_KEYSYMS: case PROP_COLUMN: case PROP_ROW: @@ -409,6 +435,9 @@ eek_clutter_key_class_init (EekClutterKeyClass *klass) gobject_class->finalize = eek_clutter_key_finalize; gobject_class->dispose = eek_clutter_key_dispose; + g_object_class_override_property (gobject_class, + PROP_KEYCODE, + "keycode"); g_object_class_override_property (gobject_class, PROP_KEYSYMS, "keysyms"); diff --git a/eek/eek-clutter-section.c b/eek/eek-clutter-section.c index 579315cb..a8d9bc9e 100644 --- a/eek/eek-clutter-section.c +++ b/eek/eek-clutter-section.c @@ -169,6 +169,7 @@ eek_clutter_section_real_get_bounds (EekSection *self, static EekKey * eek_clutter_section_real_create_key (EekSection *self, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, @@ -195,6 +196,7 @@ eek_clutter_section_real_create_key (EekSection *self, matrix.num_levels = num_levels; key = g_object_new (EEK_TYPE_CLUTTER_KEY, "name", name, + "keycode", keycode, "keysyms", &matrix, "column", column, "row", row, diff --git a/eek/eek-gtk-key.c b/eek/eek-gtk-key.c index bc3a6ac0..4fc7f4a7 100644 --- a/eek/eek-gtk-key.c +++ b/eek/eek-gtk-key.c @@ -34,6 +34,7 @@ enum { PROP_0, + PROP_KEYCODE, PROP_KEYSYMS, PROP_COLUMN, PROP_ROW, @@ -59,6 +60,15 @@ struct _EekGtkKeyPrivate EekSimpleKey *simple; }; +static guint +eek_gtk_key_real_get_keycode (EekKey *self) +{ + EekGtkKeyPrivate *priv = EEK_GTK_KEY_GET_PRIVATE(self); + + g_return_val_if_fail (priv, EEK_INVALID_KEYCODE); + return eek_key_get_keycode (EEK_KEY(priv->simple)); +} + static void eek_gtk_key_real_set_keysyms (EekKey *self, guint *keysyms, @@ -73,6 +83,18 @@ eek_gtk_key_real_set_keysyms (EekKey *self, eek_key_set_keysym_index (EEK_KEY(self), 0, 0); } +static void +eek_gtk_key_real_get_keysyms (EekKey *self, + guint **keysyms, + gint *groups, + gint *levels) +{ + EekGtkKeyPrivate *priv = EEK_GTK_KEY_GET_PRIVATE(self); + + g_return_if_fail (priv); + eek_key_get_keysyms (EEK_KEY(priv->simple), keysyms, groups, levels); +} + static gint eek_gtk_key_real_get_groups (EekKey *self) { @@ -181,7 +203,9 @@ eek_gtk_key_real_get_keysym_index (EekKey *self, gint *group, gint *level) static void eek_key_iface_init (EekKeyIface *iface) { + iface->get_keycode = eek_gtk_key_real_get_keycode; iface->set_keysyms = eek_gtk_key_real_set_keysyms; + iface->get_keysyms = eek_gtk_key_real_get_keysyms; iface->get_groups = eek_gtk_key_real_get_groups; iface->get_keysym = eek_gtk_key_real_get_keysym; iface->set_index = eek_gtk_key_real_set_index; @@ -227,6 +251,7 @@ eek_gtk_key_set_property (GObject *object, matrix->num_groups, matrix->num_levels); break; + case PROP_KEYCODE: case PROP_BOUNDS: case PROP_OUTLINE: case PROP_COLUMN: @@ -255,6 +280,7 @@ eek_gtk_key_get_property (GObject *object, g_return_if_fail (priv); switch (prop_id) { + case PROP_KEYCODE: case PROP_BOUNDS: case PROP_KEYSYMS: case PROP_COLUMN: @@ -288,6 +314,9 @@ eek_gtk_key_class_init (EekGtkKeyClass *klass) gobject_class->finalize = eek_gtk_key_finalize; gobject_class->dispose = eek_gtk_key_dispose; + g_object_class_override_property (gobject_class, + PROP_KEYCODE, + "keycode"); g_object_class_override_property (gobject_class, PROP_KEYSYMS, "keysyms"); diff --git a/eek/eek-gtk-section.c b/eek/eek-gtk-section.c index 631a7d52..5ee2cef0 100644 --- a/eek/eek-gtk-section.c +++ b/eek/eek-gtk-section.c @@ -162,6 +162,7 @@ eek_gtk_section_real_get_bounds (EekSection *self, static EekKey * eek_gtk_section_real_create_key (EekSection *self, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, @@ -187,6 +188,7 @@ eek_gtk_section_real_create_key (EekSection *self, matrix.num_levels = num_levels; key = g_object_new (EEK_TYPE_GTK_KEY, "name", name, + "keycode", keycode, "keysyms", &matrix, "column", column, "row", row, diff --git a/eek/eek-key.c b/eek/eek-key.c index 1c86203e..bd39de5b 100644 --- a/eek/eek-key.c +++ b/eek/eek-key.c @@ -54,6 +54,18 @@ eek_key_base_init (gpointer g_iface) G_PARAM_READWRITE); g_object_interface_install_property (g_iface, pspec); + /** + * EekKey:keycode: + * + * The keycode of #EekKey. + */ + pspec = g_param_spec_uint ("keycode", + "Keycode", + "Keycode of the key", + 0, G_MAXUINT, 0, + G_PARAM_READWRITE); + g_object_interface_install_property (g_iface, pspec); + /** * EekKey:keysyms: * @@ -164,6 +176,22 @@ eek_key_get_type (void) return iface_type; } +/** + * eek_key_get_keycode: + * @key: an #EekKey + * + * Get the keycode of @key. + */ +guint +eek_key_get_keycode (EekKey *key) +{ + EekKeyIface *iface = EEK_KEY_GET_IFACE(key); + + g_return_val_if_fail (iface, EEK_INVALID_KEYCODE); + g_return_val_if_fail (iface->get_keycode, EEK_INVALID_KEYCODE); + return (*iface->get_keycode) (key); +} + /** * eek_key_set_keysyms: * @key: an #EekKey @@ -188,6 +216,32 @@ eek_key_set_keysyms (EekKey *key, (*iface->set_keysyms) (key, keysyms, num_groups, num_levels); } +/** + * eek_key_get_keysyms: + * @key: an #EekKey + * @keysyms: pointer where symbol matrix of @key will be stored + * @num_groups: pointer where the number of groups (rows) of @keysyms + * will be stored + * @num_levels: pointer where the number of levels (columns) of + * @keysyms will be stored + * + * Get the symbol matrix of @key to @keysyms. @keysyms is an array of + * symbols (unsigned int) and the length must match with @num_groups * + * @num_levels. + */ +void +eek_key_get_keysyms (EekKey *key, + guint **keysyms, + gint *num_groups, + gint *num_levels) +{ + EekKeyIface *iface = EEK_KEY_GET_IFACE(key); + + g_return_if_fail (iface); + g_return_if_fail (iface->get_keysyms); + (*iface->get_keysyms) (key, keysyms, num_groups, num_levels); +} + /** * eek_key_get_groups: * @key: an #EekKey diff --git a/eek/eek-key.h b/eek/eek-key.h index 2377f203..7268a4ad 100644 --- a/eek/eek-key.h +++ b/eek/eek-key.h @@ -39,10 +39,15 @@ struct _EekKeyIface GTypeInterface g_iface; /*< public >*/ + guint (* get_keycode) (EekKey *self); void (* set_keysyms) (EekKey *self, guint *keysyms, gint num_groups, gint num_levels); + void (* get_keysyms) (EekKey *self, + guint **keysyms, + gint *num_groups, + gint *num_levels); gint (* get_groups) (EekKey *self); guint (* get_keysym) (EekKey *self); @@ -71,10 +76,15 @@ struct _EekKeyIface GType eek_key_get_type (void) G_GNUC_CONST; +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); gint eek_key_get_groups (EekKey *key); guint eek_key_get_keysym (EekKey *key); diff --git a/eek/eek-keysym.h b/eek/eek-keysym.h index 1f642e79..80c7c2b9 100644 --- a/eek/eek-keysym.h +++ b/eek/eek-keysym.h @@ -21,6 +21,8 @@ #define EEK_KEYSYMS_H 1 #define EEK_INVALID_KEYSYM ((guint)(-1)) +#define EEK_INVALID_KEYCODE ((guint)(-1)) + G_CONST_RETURN gchar *eek_keysym_to_string (guint keysym); #endif /* EEK_KEYSYMS_H */ diff --git a/eek/eek-section.c b/eek/eek-section.c index 11c02d76..afa55eaa 100644 --- a/eek/eek-section.c +++ b/eek/eek-section.c @@ -317,6 +317,7 @@ eek_section_get_bounds (EekSection *section, EekKey * eek_section_create_key (EekSection *section, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, @@ -334,6 +335,7 @@ eek_section_create_key (EekSection *section, return (*iface->create_key) (section, name, + keycode, keysyms, num_groups, num_levels, diff --git a/eek/eek-section.h b/eek/eek-section.h index ffd563fe..d9f5e7ae 100644 --- a/eek/eek-section.h +++ b/eek/eek-section.h @@ -63,6 +63,7 @@ struct _EekSectionIface EekKey *(* create_key) (EekSection *self, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, @@ -103,6 +104,7 @@ void eek_section_get_bounds (EekSection *section, EekKey *eek_section_create_key (EekSection *section, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, diff --git a/eek/eek-simple-key.c b/eek/eek-simple-key.c index 743f49df..c672eae1 100644 --- a/eek/eek-simple-key.c +++ b/eek/eek-simple-key.c @@ -32,6 +32,7 @@ enum { PROP_0, PROP_NAME, + PROP_KEYCODE, PROP_KEYSYMS, PROP_COLUMN, PROP_ROW, @@ -55,6 +56,7 @@ G_DEFINE_TYPE_WITH_CODE (EekSimpleKey, eek_simple_key, struct _EekSimpleKeyPrivate { gchar *name; + guint keycode; guint *keysyms; gint num_levels; gint num_groups; @@ -66,6 +68,15 @@ struct _EekSimpleKeyPrivate gint level; }; +static guint +eek_simple_key_real_get_keycode (EekKey *self) +{ + EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self); + + g_return_val_if_fail (priv, EEK_INVALID_KEYCODE); + return priv->keycode; +} + static void eek_simple_key_real_set_keysyms (EekKey *self, guint *keysyms, @@ -94,6 +105,27 @@ eek_simple_key_real_set_keysyms (EekKey *self, #endif } +static void +eek_simple_key_real_get_keysyms (EekKey *self, + guint **keysyms, + gint *groups, + gint *levels) +{ + EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self); + + g_return_if_fail (groups); + g_return_if_fail (levels); + g_return_if_fail (keysyms); + + *groups = priv->num_groups; + *levels = priv->num_levels; + if (priv->keysyms) { + *keysyms = g_slice_alloc (*groups * *levels * sizeof(guint)); + memcpy (*keysyms, priv->keysyms, *groups * *levels * sizeof(guint)); + } else + *keysyms = NULL; +} + static gint eek_simple_key_real_get_groups (EekKey *self) { @@ -212,7 +244,9 @@ eek_simple_key_real_get_keysym_index (EekKey *self, static void eek_key_iface_init (EekKeyIface *iface) { + iface->get_keycode = eek_simple_key_real_get_keycode; iface->set_keysyms = eek_simple_key_real_set_keysyms; + iface->get_keysyms = eek_simple_key_real_get_keysyms; iface->get_groups = eek_simple_key_real_get_groups; iface->get_keysym = eek_simple_key_real_get_keysym; iface->set_index = eek_simple_key_real_set_index; @@ -256,6 +290,9 @@ eek_simple_key_set_property (GObject *object, g_free (priv->name); priv->name = g_strdup (g_value_get_string (value)); break; + case PROP_KEYCODE: + priv->keycode = g_value_get_uint (value); + break; case PROP_KEYSYMS: matrix = g_value_get_boxed (value); eek_key_set_keysyms (EEK_KEY(object), @@ -304,6 +341,9 @@ eek_simple_key_get_property (GObject *object, case PROP_NAME: g_value_set_string (value, priv->name); break; + case PROP_KEYCODE: + g_value_set_uint (value, priv->keycode); + break; case PROP_KEYSYMS: matrix.data = priv->keysyms; matrix.num_groups = priv->num_groups; @@ -354,6 +394,9 @@ eek_simple_key_class_init (EekSimpleKeyClass *klass) g_object_class_override_property (gobject_class, PROP_NAME, "name"); + g_object_class_override_property (gobject_class, + PROP_KEYCODE, + "keycode"); g_object_class_override_property (gobject_class, PROP_KEYSYMS, "keysyms"); @@ -384,6 +427,7 @@ eek_simple_key_init (EekSimpleKey *self) priv = self->priv = EEK_SIMPLE_KEY_GET_PRIVATE(self); priv->keysyms = NULL; + priv->keycode = 0; priv->num_groups = 0; priv->num_levels = 0; priv->column = 0; diff --git a/eek/eek-simple-section.c b/eek/eek-simple-section.c index 88bd8179..a5645df1 100644 --- a/eek/eek-simple-section.c +++ b/eek/eek-simple-section.c @@ -170,6 +170,7 @@ eek_simple_section_real_get_bounds (EekSection *self, EekBounds *bounds) static EekKey * eek_simple_section_real_create_key (EekSection *self, const gchar *name, + guint keycode, guint *keysyms, gint num_groups, gint num_levels, @@ -191,6 +192,7 @@ eek_simple_section_real_create_key (EekSection *self, matrix.num_levels = num_levels; key = g_object_new (EEK_TYPE_SIMPLE_KEY, "name", name, + "keycode", keycode, "keysyms", &matrix, "column", column, "row", row, diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index 182d9806..1c325f58 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -198,6 +198,7 @@ create_key (EekXkbLayout *layout, eek_section_create_key (section, name, + keycode, keysyms, num_groups, num_levels, diff --git a/examples/eek-clutter-xkb-test.c b/examples/eek-clutter-xkb-test.c index 0c0e6294..d12a76b7 100644 --- a/examples/eek-clutter-xkb-test.c +++ b/examples/eek-clutter-xkb-test.c @@ -4,8 +4,8 @@ #include #include -#define CSW 640 -#define CSH 480 +#define CSW 1280 +#define CSH 1024 static gchar *symbols = NULL; static gchar *keycodes = NULL; diff --git a/tests/eek-simple-test.c b/tests/eek-simple-test.c index be15f492..4123bcd8 100644 --- a/tests/eek-simple-test.c +++ b/tests/eek-simple-test.c @@ -65,6 +65,7 @@ test_create (void) key = eek_section_create_key (section, "test-key", + 0, keysyms, 3, 2,