Don't cache group/level in EekKey.
This commit is contained in:
179
eek/eek-key.c
179
eek/eek-key.c
@ -35,6 +35,8 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
#include "eek-key.h"
|
#include "eek-key.h"
|
||||||
|
#include "eek-section.h"
|
||||||
|
#include "eek-keyboard.h"
|
||||||
#include "eek-keysym.h"
|
#include "eek-keysym.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -44,8 +46,6 @@ enum {
|
|||||||
PROP_COLUMN,
|
PROP_COLUMN,
|
||||||
PROP_ROW,
|
PROP_ROW,
|
||||||
PROP_OUTLINE,
|
PROP_OUTLINE,
|
||||||
PROP_GROUP,
|
|
||||||
PROP_LEVEL,
|
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -70,8 +70,6 @@ struct _EekKeyPrivate
|
|||||||
gint column;
|
gint column;
|
||||||
gint row;
|
gint row;
|
||||||
EekOutline *outline;
|
EekOutline *outline;
|
||||||
gint group;
|
|
||||||
gint level;
|
|
||||||
gboolean is_pressed;
|
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
|
static void
|
||||||
eek_key_real_set_index (EekKey *self,
|
eek_key_real_set_index (EekKey *self,
|
||||||
gint column,
|
gint column,
|
||||||
@ -192,38 +178,6 @@ eek_key_real_get_outline (EekKey *self)
|
|||||||
return priv->outline;
|
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
|
static gboolean
|
||||||
eek_key_real_is_pressed (EekKey *self)
|
eek_key_real_is_pressed (EekKey *self)
|
||||||
{
|
{
|
||||||
@ -271,7 +225,6 @@ eek_key_set_property (GObject *object,
|
|||||||
{
|
{
|
||||||
EekKeysymMatrix *matrix;
|
EekKeysymMatrix *matrix;
|
||||||
gint column, row;
|
gint column, row;
|
||||||
gint group, level;
|
|
||||||
|
|
||||||
g_return_if_fail (EEK_IS_KEY(object));
|
g_return_if_fail (EEK_IS_KEY(object));
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
@ -296,16 +249,6 @@ eek_key_set_property (GObject *object,
|
|||||||
case PROP_OUTLINE:
|
case PROP_OUTLINE:
|
||||||
eek_key_set_outline (EEK_KEY(object), g_value_get_pointer (value));
|
eek_key_set_outline (EEK_KEY(object), g_value_get_pointer (value));
|
||||||
break;
|
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:
|
default:
|
||||||
g_object_set_property (object,
|
g_object_set_property (object,
|
||||||
g_param_spec_get_name (pspec),
|
g_param_spec_get_name (pspec),
|
||||||
@ -345,14 +288,6 @@ eek_key_get_property (GObject *object,
|
|||||||
case PROP_OUTLINE:
|
case PROP_OUTLINE:
|
||||||
g_value_set_pointer (value, eek_key_get_outline (EEK_KEY(object)));
|
g_value_set_pointer (value, eek_key_get_outline (EEK_KEY(object)));
|
||||||
break;
|
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:
|
default:
|
||||||
g_object_get_property (object,
|
g_object_get_property (object,
|
||||||
g_param_spec_get_name (pspec),
|
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_keycode = eek_key_real_set_keycode;
|
||||||
klass->set_keysyms = eek_key_real_set_keysyms;
|
klass->set_keysyms = eek_key_real_set_keysyms;
|
||||||
klass->get_keysyms = eek_key_real_get_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->set_index = eek_key_real_set_index;
|
||||||
klass->get_index = eek_key_real_get_index;
|
klass->get_index = eek_key_real_get_index;
|
||||||
klass->set_outline = eek_key_real_set_outline;
|
klass->set_outline = eek_key_real_set_outline;
|
||||||
klass->get_outline = eek_key_real_get_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;
|
klass->is_pressed = eek_key_real_is_pressed;
|
||||||
|
|
||||||
gobject_class->set_property = eek_key_set_property;
|
gobject_class->set_property = eek_key_set_property;
|
||||||
@ -453,30 +385,6 @@ eek_key_class_init (EekKeyClass *klass)
|
|||||||
G_PARAM_READWRITE);
|
G_PARAM_READWRITE);
|
||||||
g_object_class_install_property (gobject_class, PROP_OUTLINE, pspec);
|
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:
|
* EekKey::pressed:
|
||||||
* @key: an #EekKey
|
* @key: an #EekKey
|
||||||
@ -522,7 +430,6 @@ eek_key_init (EekKey *self)
|
|||||||
memset (&priv->keysyms, 0, sizeof priv->keysyms);
|
memset (&priv->keysyms, 0, sizeof priv->keysyms);
|
||||||
priv->column = priv->row = 0;
|
priv->column = priv->row = 0;
|
||||||
priv->outline = NULL;
|
priv->outline = NULL;
|
||||||
priv->group = priv->level = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -606,8 +513,50 @@ eek_key_get_keysyms (EekKey *key,
|
|||||||
guint
|
guint
|
||||||
eek_key_get_keysym (EekKey *key)
|
eek_key_get_keysym (EekKey *key)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (EEK_IS_KEY(key), EEK_INVALID_KEYSYM);
|
gint group, level;
|
||||||
return EEK_KEY_GET_CLASS(key)->get_keysym (key);
|
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);
|
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:
|
* eek_key_is_pressed:
|
||||||
* @key: an #EekKey
|
* @key: an #EekKey
|
||||||
|
|||||||
@ -57,8 +57,6 @@ struct _EekKey
|
|||||||
* section
|
* section
|
||||||
* @set_outline: virtual function for setting outline shape of the key
|
* @set_outline: virtual function for setting outline shape of the key
|
||||||
* @get_outline: virtual function for getting 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
|
* @pressed: class handler for #EekKey::pressed signal
|
||||||
* @released: class handler for #EekKey::released signal
|
* @released: class handler for #EekKey::released signal
|
||||||
* @is_pressed: virtual function for getting whether the key is pressed
|
* @is_pressed: virtual function for getting whether the key is pressed
|
||||||
@ -80,7 +78,6 @@ struct _EekKeyClass
|
|||||||
guint **keysyms,
|
guint **keysyms,
|
||||||
gint *num_groups,
|
gint *num_groups,
|
||||||
gint *num_levels);
|
gint *num_levels);
|
||||||
guint (* get_keysym) (EekKey *self);
|
|
||||||
|
|
||||||
void (* set_index) (EekKey *self,
|
void (* set_index) (EekKey *self,
|
||||||
gint column,
|
gint column,
|
||||||
@ -93,12 +90,6 @@ struct _EekKeyClass
|
|||||||
EekOutline *outline);
|
EekOutline *outline);
|
||||||
EekOutline *(* get_outline) (EekKey *self);
|
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);
|
gboolean (* is_pressed) (EekKey *self);
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
@ -124,6 +115,9 @@ void eek_key_get_keysyms (EekKey *key,
|
|||||||
gint *num_groups,
|
gint *num_groups,
|
||||||
gint *num_levels);
|
gint *num_levels);
|
||||||
guint eek_key_get_keysym (EekKey *key);
|
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,
|
void eek_key_set_index (EekKey *key,
|
||||||
gint column,
|
gint column,
|
||||||
@ -136,12 +130,6 @@ void eek_key_set_outline (EekKey *key,
|
|||||||
EekOutline *outline);
|
EekOutline *outline);
|
||||||
EekOutline *eek_key_get_outline (EekKey *key);
|
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
|
G_END_DECLS
|
||||||
|
|||||||
@ -66,48 +66,16 @@ struct _EekKeyboardPrivate
|
|||||||
EekLayout *layout;
|
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
|
static void
|
||||||
eek_keyboard_real_set_keysym_index (EekKeyboard *self,
|
eek_keyboard_real_set_keysym_index (EekKeyboard *self,
|
||||||
gint group,
|
gint group,
|
||||||
gint level)
|
gint level)
|
||||||
{
|
{
|
||||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
SetKeysymIndexCallbackData data;
|
|
||||||
|
|
||||||
if (priv->group != group || priv->level != level) {
|
if (priv->group != group || priv->level != level) {
|
||||||
data.group = priv->group = group;
|
priv->group = group;
|
||||||
data.level = priv->level = level;
|
priv->level = level;
|
||||||
|
|
||||||
eek_container_foreach_child (EEK_CONTAINER(self),
|
|
||||||
set_keysym_index_for_section,
|
|
||||||
&data);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (self, "keysym-index-changed", group, level);
|
g_signal_emit_by_name (self, "keysym-index-changed", group, level);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -209,7 +209,6 @@ create_key (EekXkbLayout *layout,
|
|||||||
eek_key_set_keysyms (key, keysyms, num_groups, num_levels);
|
eek_key_set_keysyms (key, keysyms, num_groups, num_levels);
|
||||||
if (keysyms)
|
if (keysyms)
|
||||||
g_slice_free1 (num_keysyms * sizeof(guint), keysyms);
|
g_slice_free1 (num_keysyms * sizeof(guint), keysyms);
|
||||||
eek_key_set_keysym_index (key, 0, 0);
|
|
||||||
eek_key_set_outline (key, outline);
|
eek_key_set_outline (key, outline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user