Add "keycode" property to EekKey.

Add eek_key_get_keysyms().
This commit is contained in:
Daiki Ueno
2010-06-08 09:27:41 +09:00
parent ece1c559a2
commit bb7462e786
14 changed files with 182 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 */

View File

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

View File

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

View File

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

View File

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

View File

@ -198,6 +198,7 @@ create_key (EekXkbLayout *layout,
eek_section_create_key (section,
name,
keycode,
keysyms,
num_groups,
num_levels,

View File

@ -4,8 +4,8 @@
#include <stdio.h>
#include <stdlib.h>
#define CSW 640
#define CSH 480
#define CSW 1280
#define CSH 1024
static gchar *symbols = NULL;
static gchar *keycodes = NULL;

View File

@ -65,6 +65,7 @@ test_create (void)
key = eek_section_create_key (section,
"test-key",
0,
keysyms,
3,
2,