Move eek_keyboard_new to eek-layout.c; add utility functions.

This commit is contained in:
Daiki Ueno
2011-01-25 16:14:18 +09:00
parent 9b1a53510e
commit 48e64f1c32
5 changed files with 89 additions and 48 deletions

View File

@ -40,6 +40,7 @@ enum {
PROP_0,
PROP_GROUP,
PROP_LEVEL,
PROP_LAYOUT,
PROP_LAST
};
@ -198,6 +199,7 @@ eek_keyboard_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
gint group, level;
switch (prop_id) {
@ -213,6 +215,10 @@ eek_keyboard_set_property (GObject *object,
group,
g_value_get_int (value));
break;
case PROP_LAYOUT:
priv->layout = g_value_get_object (value);
g_object_ref (priv->layout);
break;
default:
g_object_set_property (object,
g_param_spec_get_name (pspec),
@ -227,9 +233,9 @@ eek_keyboard_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
gint group, level;
g_return_if_fail (EEK_IS_KEYBOARD(object));
switch (prop_id) {
case PROP_GROUP:
eek_keyboard_get_keysym_index (EEK_KEYBOARD(object), &group, &level);
@ -239,6 +245,9 @@ eek_keyboard_get_property (GObject *object,
eek_keyboard_get_keysym_index (EEK_KEYBOARD(object), &level, &level);
g_value_set_int (value, level);
break;
case PROP_LAYOUT:
g_value_set_object (value, priv->layout);
break;
default:
g_object_get_property (object,
g_param_spec_get_name (pspec),
@ -302,6 +311,20 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
PROP_LEVEL,
pspec);
/**
* EekKeyboard:layout:
*
* The layout used to create this #EekKeyboard.
*/
pspec = g_param_spec_object ("layout",
"Layout",
"Layout used to create the keyboard",
EEK_TYPE_LAYOUT,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
PROP_LAYOUT,
pspec);
/**
* EekKeyboard::key-pressed:
* @keyboard: an #EekKeyboard
@ -440,34 +463,30 @@ EekKey *
eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
guint keycode)
{
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
return EEK_KEYBOARD_GET_CLASS(keyboard)->find_key_by_keycode (keyboard,
keycode);
g_assert (EEK_IS_KEYBOARD(keyboard));
return EEK_KEYBOARD_GET_CLASS(keyboard)->
find_key_by_keycode (keyboard, keycode);
}
/**
* eek_keyboard_new:
* @layout: an #EekLayout
* @initial_width: default width of returned keyboard
* @initial_height: default height of returned keyboard
*
* Create a new #EekKeyboard instance based on @layout.
*/
EekKeyboard *
eek_keyboard_new (EekLayout *layout,
gint initial_width,
gint initial_height)
EekLayout *
eek_keyboard_get_layout (EekKeyboard *keyboard)
{
EekKeyboardPrivate *priv;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
return priv->layout;
}
void
eek_keyboard_get_size (EekKeyboard *keyboard,
gdouble *width,
gdouble *height)
{
EekKeyboard *keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL);
EekBounds bounds;
g_return_val_if_fail (EEK_IS_LAYOUT (layout), NULL);
bounds.x = bounds.y = 0.0;
bounds.width = initial_width;
bounds.height = initial_height;
eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
eek_layout_apply (layout, keyboard);
return keyboard;
g_assert (EEK_IS_KEYBOARD(keyboard));
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
*width = bounds.width;
*height = bounds.height;
}

View File

@ -89,6 +89,10 @@ GType eek_keyboard_get_type (void) G_GNUC_CONST;
EekKeyboard *eek_keyboard_new (EekLayout *layout,
gint initial_width,
gint initial_height);
EekLayout *eek_keyboard_get_layout (EekKeyboard *keyboard);
void eek_keyboard_get_size (EekKeyboard *keyboard,
gdouble *width,
gdouble *height);
void eek_keyboard_set_keysym_index (EekKeyboard *keyboard,
gint group,
gint level);

View File

@ -91,20 +91,24 @@ eek_layout_init (EekLayout *self)
}
/**
* eek_layout_apply:
* eek_keyboard_new:
* @layout: an #EekLayout
* @keyboard: an #EekKeyboard
* @initial_width: initial width of the keyboard
* @initial_height: initial height of the keyboard
*
* Relayout @keyboard with the @layout.
* Create a new #EekKeyboard based on @layout.
*/
void
eek_layout_apply (EekLayout *layout, EekKeyboard *keyboard)
EekKeyboard *
eek_keyboard_new (EekLayout *layout,
gint initial_width,
gint initial_height)
{
g_return_if_fail (EEK_IS_LAYOUT(layout));
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
g_return_if_fail (EEK_LAYOUT_GET_CLASS(layout)->apply);
g_assert (EEK_IS_LAYOUT(layout));
g_assert (EEK_LAYOUT_GET_CLASS(layout)->create_keyboard);
return EEK_LAYOUT_GET_CLASS(layout)->apply (layout, keyboard);
return EEK_LAYOUT_GET_CLASS(layout)->create_keyboard (layout,
initial_width,
initial_height);
}
/**

View File

@ -56,24 +56,26 @@ struct _EekLayoutClass
GObjectClass parent_class;
/*< public >*/
void (* apply) (EekLayout *self,
EekKeyboard *keyboard);
gint (* get_group) (EekLayout *self);
EekKeyboard* (* create_keyboard) (EekLayout *self,
gdouble initial_width,
gdouble initial_height);
gint (* get_group) (EekLayout *self);
/* signals */
void (* group_changed) (EekLayout *self,
gint group);
void (* changed) (EekLayout *self);
void (* group_changed) (EekLayout *self,
gint group);
void (* changed) (EekLayout *self);
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_layout_get_type (void) G_GNUC_CONST;
void eek_layout_apply (EekLayout *layout,
EekKeyboard *keyboard);
gint eek_layout_get_group (EekLayout *layout);
GType eek_layout_get_type (void) G_GNUC_CONST;
EekKeyboard *eek_layout_new (EekLayout *layout,
gdouble initial_width,
gdouble initial_height);
gint eek_layout_get_group (EekLayout *layout);
G_END_DECLS
#endif /* EEK_LAYOUT_H */

View File

@ -309,10 +309,20 @@ outline_free (gpointer data)
g_boxed_free (EEK_TYPE_OUTLINE, outline);
}
static void
eek_xkb_layout_real_apply (EekLayout *self, EekKeyboard *keyboard)
static EekKeyboard *
eek_xkb_layout_real_create_keyboard (EekLayout *self,
gdouble initial_width,
gdouble initial_height)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
EekBounds bounds;
EekKeyboard *keyboard;
keyboard = g_object_new (EEK_TYPE_KEYBOARD, "layout", self, NULL);
bounds.x = bounds.y = 0.0;
bounds.width = initial_width;
bounds.height = initial_height;
eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
if (priv->outline_hash)
g_hash_table_unref (priv->outline_hash);
@ -323,6 +333,8 @@ eek_xkb_layout_real_apply (EekLayout *self, EekKeyboard *keyboard)
outline_free);
create_keyboard (EEK_XKB_LAYOUT(self), keyboard);
return keyboard;
}
static gint
@ -432,7 +444,7 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
layout_class->apply = eek_xkb_layout_real_apply;
layout_class->create_keyboard = eek_xkb_layout_real_create_keyboard;
layout_class->get_group = eek_xkb_layout_real_get_group;
gobject_class->finalize = eek_xkb_layout_finalize;