EekKey#set_keysym_index(): fallback to level 0 when level exceeds num_levels

This commit is contained in:
Daiki Ueno
2010-06-16 10:41:35 +09:00
parent 473a9a9b2a
commit b2ace93fef
13 changed files with 298 additions and 141 deletions

View File

@ -72,6 +72,7 @@ eek_clutter_drawing_context_class_init (EekClutterDrawingContextClass *klass)
sizeof (EekClutterDrawingContextPrivate)); sizeof (EekClutterDrawingContextPrivate));
gobject_class->finalize = eek_clutter_drawing_context_finalize; gobject_class->finalize = eek_clutter_drawing_context_finalize;
gobject_class->dispose = eek_clutter_drawing_context_dispose;
} }
static void static void

View File

@ -31,6 +31,7 @@
#include "eek-clutter-keyboard.h" #include "eek-clutter-keyboard.h"
#include "eek-clutter-drawing-context.h" #include "eek-clutter-drawing-context.h"
#include "eek-keyboard.h" #include "eek-keyboard.h"
#include "eek-drawing.h"
G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD); G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD);
@ -266,7 +267,9 @@ update_category_fonts (EekClutterKeyboard *keyboard)
base_font = pango_font_description_from_string ("Sans"); base_font = pango_font_description_from_string ("Sans");
pango_layout_set_font_description (layout, base_font); pango_layout_set_font_description (layout, base_font);
pango_font_description_free (base_font); pango_font_description_free (base_font);
eek_get_fonts (EEK_KEYBOARD(keyboard), layout, &fonts); eek_get_fonts (EEK_KEYBOARD(keyboard),
layout,
(PangoFontDescription **)&fonts);
for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++) { for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++) {
eek_clutter_drawing_context_set_category_font (priv->context, eek_clutter_drawing_context_set_category_font (priv->context,
i, i,

View File

@ -74,7 +74,7 @@ struct _EekContainerClass
GType eek_container_get_type (void) G_GNUC_CONST; GType eek_container_get_type (void) G_GNUC_CONST;
void eek_container_foreach_child (EekContainer *self, void eek_container_foreach_child (EekContainer *container,
EekCallback callback, EekCallback callback,
gpointer user_data); gpointer user_data);
EekElement *eek_container_find (EekContainer *container, EekElement *eek_container_find (EekContainer *container,

View File

@ -201,7 +201,9 @@ eek_key_real_set_keysym_index (EekKey *self,
g_return_if_fail (0 <= group); g_return_if_fail (0 <= group);
if (group >= priv->keysyms.num_groups) if (group >= priv->keysyms.num_groups)
group = 0; group = 0;
g_return_if_fail (0 <= level && level < priv->keysyms.num_levels); g_return_if_fail (0 <= level);
if (level >= priv->keysyms.num_levels)
level = 0;
priv->group = group; priv->group = group;
priv->level = level; priv->level = level;
} }

View File

@ -430,8 +430,6 @@ eek_keyboard_get_keysym_index (EekKeyboard *keyboard,
/** /**
* eek_keyboard_create_section: * eek_keyboard_create_section:
* @keyboard: an #EekKeyboard * @keyboard: an #EekKeyboard
* @name: name of the section
* @bounds: bounding box of the section
* *
* Create an #EekSection instance and append it to @keyboard. This * Create an #EekSection instance and append it to @keyboard. This
* function is rarely called by application but called by #EekLayout * function is rarely called by application but called by #EekLayout

View File

@ -69,10 +69,10 @@ struct _EekKeyboardClass
GType eek_keyboard_get_type (void) G_GNUC_CONST; GType eek_keyboard_get_type (void) G_GNUC_CONST;
void eek_keyboard_set_keysym_index (EekKeyboard *self, void eek_keyboard_set_keysym_index (EekKeyboard *keyboard,
gint group, gint group,
gint level); gint level);
void eek_keyboard_get_keysym_index (EekKeyboard *self, void eek_keyboard_get_keysym_index (EekKeyboard *keyboard,
gint *group, gint *group,
gint *level); gint *level);
@ -80,7 +80,7 @@ EekSection *eek_keyboard_create_section (EekKeyboard *keyboard);
void eek_keyboard_set_layout (EekKeyboard *keyboard, void eek_keyboard_set_layout (EekKeyboard *keyboard,
EekLayout *layout); EekLayout *layout);
void eek_keyboard_realize (EekKeyboard *keyboard); void eek_keyboard_realize (EekKeyboard *keyboard);
EekKey *eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard, EekKey *eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
guint keycode); guint keycode);

View File

@ -90,7 +90,7 @@ EekKey *eek_section_create_key (EekSection *section,
gint column, gint column,
gint row); gint row);
EekKey *eek_section_find_key_by_keycode (EekSection *self, EekKey *eek_section_find_key_by_keycode (EekSection *section,
guint keycode); guint keycode);
G_END_DECLS G_END_DECLS

View File

@ -24,6 +24,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/**
* EekOrientation:
* @EEK_ORIENTATION_VERTICAL: the elements will be arranged vertically
* @EEK_ORIENTATION_HORIZONTAL: the elements will be arranged horizontally
* @EEK_ORIENTATION_INVALID: used for error reporting
*
* Orientation of rows in sections. Elements in a row will be
* arranged with the specified orientation.
*/
typedef enum { typedef enum {
EEK_ORIENTATION_VERTICAL, EEK_ORIENTATION_VERTICAL,
EEK_ORIENTATION_HORIZONTAL, EEK_ORIENTATION_HORIZONTAL,

View File

@ -338,38 +338,6 @@ compare_component_name (gchar *name0, gchar *name1)
return 0; return 0;
} }
static void
eek_xkb_layout_real_set_names (EekXkbLayout *self, XkbComponentNamesRec *names)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
gboolean is_changed;
g_return_if_fail (priv);
/* keycodes */
if (compare_component_name (names->keycodes, priv->names.keycodes) != 0)
is_changed = TRUE;
g_free (priv->names.keycodes);
priv->names.keycodes = g_strdup (names->keycodes);
/* geometry */
if (compare_component_name (names->geometry, priv->names.geometry) != 0)
is_changed = TRUE;
g_free (priv->names.geometry);
priv->names.geometry = g_strdup (names->geometry);
/* symbols */
if (compare_component_name (names->symbols, priv->names.symbols) != 0)
is_changed = TRUE;
g_free (priv->names.symbols);
priv->names.symbols = g_strdup (names->symbols);
get_keyboard (self);
if (is_changed)
g_signal_emit_by_name (self, "changed");
}
static void static void
eek_xkb_layout_finalize (GObject *object) eek_xkb_layout_finalize (GObject *object)
{ {
@ -469,7 +437,6 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate)); g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
klass->set_names = eek_xkb_layout_real_set_names;
gobject_class->finalize = eek_xkb_layout_finalize; gobject_class->finalize = eek_xkb_layout_finalize;
gobject_class->set_property = eek_xkb_layout_set_property; gobject_class->set_property = eek_xkb_layout_set_property;
gobject_class->get_property = eek_xkb_layout_get_property; gobject_class->get_property = eek_xkb_layout_get_property;
@ -609,29 +576,68 @@ eek_xkb_layout_new (const gchar *keycodes,
return EEK_LAYOUT(layout); return EEK_LAYOUT(layout);
} }
/**
* eek_xkb_layout_set_names:
* @layout: an #EekXkbLayout
* @names: XKB component names
*
* Set the XKB component names to @layout.
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkb_layout_set_names (EekXkbLayout *layout, XkbComponentNamesRec *names)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
gboolean is_changed;
g_return_val_if_fail (priv, FALSE);
/* keycodes */
if (compare_component_name (names->keycodes, priv->names.keycodes) != 0)
is_changed = TRUE;
g_free (priv->names.keycodes);
priv->names.keycodes = g_strdup (names->keycodes);
/* geometry */
if (compare_component_name (names->geometry, priv->names.geometry) != 0)
is_changed = TRUE;
g_free (priv->names.geometry);
priv->names.geometry = g_strdup (names->geometry);
/* symbols */
if (compare_component_name (names->symbols, priv->names.symbols) != 0)
is_changed = TRUE;
g_free (priv->names.symbols);
priv->names.symbols = g_strdup (names->symbols);
get_keyboard (layout);
if (!priv->xkb)
return FALSE;
if (is_changed)
g_signal_emit_by_name (layout, "changed");
return TRUE;
}
/** /**
* eek_xkb_layout_set_keycodes: * eek_xkb_layout_set_keycodes:
* @layout: an #EekXkbLayout * @layout: an #EekXkbLayout
* @keycodes: component name for keycodes * @keycodes: component name for keycodes
* *
* Set the keycodes component (in the XKB terminology). * Set the keycodes component (in the XKB terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/ */
void gboolean
eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes) eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
{ {
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout); EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
gboolean is_changed = TRUE; XkbComponentNamesRec names;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
if (keycodes && priv->names.keycodes) memcpy (&names, &priv->names, sizeof names);
is_changed = g_strcmp0 (keycodes, priv->names.keycodes) != 0; names.keycodes = (gchar *)keycodes;
else if (keycodes == NULL && priv->names.keycodes == NULL) return eek_xkb_layout_set_names (layout, &names);
is_changed = FALSE;
g_free (priv->names.keycodes);
priv->names.keycodes = g_strdup (keycodes);
get_keyboard (layout);
if (is_changed)
g_signal_emit_by_name (layout, "changed");
} }
/** /**
@ -639,24 +645,18 @@ eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
* @layout: an #EekXkbLayout * @layout: an #EekXkbLayout
* @geometry: component name for geometry * @geometry: component name for geometry
* *
* Set the keycodes component (in the XKB terminology). * Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/ */
void gboolean
eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry) eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
{ {
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout); EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
gboolean is_changed = TRUE; XkbComponentNamesRec names;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
if (geometry && priv->names.geometry) memcpy (&names, &priv->names, sizeof names);
is_changed = g_strcmp0 (geometry, priv->names.geometry) != 0; names.geometry = (gchar *)geometry;
else if (geometry == NULL && priv->names.geometry == NULL) return eek_xkb_layout_set_names (layout, &names);
is_changed = FALSE;
g_free (priv->names.geometry);
priv->names.geometry = g_strdup (geometry);
get_keyboard (layout);
if (is_changed)
g_signal_emit_by_name (layout, "changed");
} }
/** /**
@ -665,23 +665,18 @@ eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
* @symbols: component name for symbols * @symbols: component name for symbols
* *
* Set the symbols component (in the XKB terminology). * Set the symbols component (in the XKB terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/ */
void gboolean
eek_xkb_layout_set_symbols (EekXkbLayout *layout, const gchar *symbols) eek_xkb_layout_set_symbols (EekXkbLayout *layout, const gchar *symbols)
{ {
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout); EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
gboolean is_changed = TRUE; XkbComponentNamesRec names;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
if (symbols && priv->names.symbols) memcpy (&names, &priv->names, sizeof names);
is_changed = g_strcmp0 (symbols, priv->names.symbols) != 0; names.symbols = (gchar *)symbols;
else if (symbols == NULL && priv->names.symbols == NULL) return eek_xkb_layout_set_names (layout, &names);
is_changed = FALSE;
g_free (priv->names.symbols);
priv->names.symbols = g_strdup (symbols);
get_keyboard (layout);
if (is_changed)
g_signal_emit_by_name (layout, "changed");
} }
/** /**

View File

@ -49,27 +49,33 @@ struct _EekXkbLayoutClass
{ {
/*< private >*/ /*< private >*/
GInitiallyUnownedClass parent_class; GInitiallyUnownedClass parent_class;
void (* set_names) (EekXkbLayout *self,
XkbComponentNamesRec *names);
}; };
GType eek_xkb_layout_get_type (void) G_GNUC_CONST; GType eek_xkb_layout_get_type (void) G_GNUC_CONST;
EekLayout *eek_xkb_layout_new (const gchar *keycodes, EekLayout *eek_xkb_layout_new (const gchar *keycodes,
const gchar *geometry, const gchar *geometry,
const gchar *symbols); const gchar *symbols);
void eek_xkb_layout_set_keycodes (EekXkbLayout *layout,
const gchar *keycodes);
void eek_xkb_layout_set_geometry (EekXkbLayout *layout,
const gchar *geometry);
void eek_xkb_layout_set_symbols (EekXkbLayout *layout,
const gchar *symbols);
G_CONST_RETURN gchar *eek_xkb_layout_get_keycodes (EekXkbLayout *layout); gboolean eek_xkb_layout_set_names (EekXkbLayout *layout,
G_CONST_RETURN gchar *eek_xkb_layout_get_geometry (EekXkbLayout *layout); XkbComponentNamesRec *names);
G_CONST_RETURN gchar *eek_xkb_layout_get_symbols (EekXkbLayout *layout); gboolean eek_xkb_layout_set_keycodes
(EekXkbLayout *layout,
const gchar *keycodes);
gboolean eek_xkb_layout_set_geometry
(EekXkbLayout *layout,
const gchar *geometry);
gboolean eek_xkb_layout_set_symbols
(EekXkbLayout *layout,
const gchar *symbols);
G_CONST_RETURN gchar *eek_xkb_layout_get_keycodes
(EekXkbLayout *layout);
G_CONST_RETURN gchar *eek_xkb_layout_get_geometry
(EekXkbLayout *layout);
G_CONST_RETURN gchar *eek_xkb_layout_get_symbols
(EekXkbLayout *layout);
G_END_DECLS G_END_DECLS
#endif /* #ifndef EEK_XKB_LAYOUT_H */ #endif /* #ifndef EEK_XKB_LAYOUT_H */

View File

@ -50,6 +50,7 @@ G_DEFINE_TYPE_WITH_CODE (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT,
enum { enum {
PROP_0, PROP_0,
PROP_MODEL,
PROP_LAYOUTS, PROP_LAYOUTS,
PROP_VARIANTS, PROP_VARIANTS,
PROP_OPTIONS, PROP_OPTIONS,
@ -75,7 +76,8 @@ extern void xkl_xkb_config_native_cleanup (XklEngine * engine,
XkbComponentNamesPtr XkbComponentNamesPtr
component_names); component_names);
static void get_xkb_component_names (EekXklLayout *layout); static gboolean set_xkb_component_names (EekXklLayout *layout,
XklConfigRec *config);
static gint static gint
eek_xkl_layout_real_get_group (EekLayout *self) eek_xkl_layout_real_get_group (EekLayout *self)
@ -121,6 +123,10 @@ eek_xkl_layout_set_property (GObject *object,
{ {
switch (prop_id) switch (prop_id)
{ {
case PROP_MODEL:
eek_xkl_layout_set_model (EEK_XKL_LAYOUT(object),
g_value_get_string (value));
break;
case PROP_LAYOUTS: case PROP_LAYOUTS:
eek_xkl_layout_set_layouts (EEK_XKL_LAYOUT(object), eek_xkl_layout_set_layouts (EEK_XKL_LAYOUT(object),
g_value_get_boxed (value)); g_value_get_boxed (value));
@ -149,6 +155,11 @@ eek_xkl_layout_get_property (GObject *object,
{ {
switch (prop_id) switch (prop_id)
{ {
case PROP_MODEL:
g_value_set_string
(value,
eek_xkl_layout_get_model (EEK_XKL_LAYOUT(object)));
break;
case PROP_LAYOUTS: case PROP_LAYOUTS:
g_value_set_boxed g_value_set_boxed
(value, (value,
@ -184,6 +195,23 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
gobject_class->set_property = eek_xkl_layout_set_property; gobject_class->set_property = eek_xkl_layout_set_property;
gobject_class->get_property = eek_xkl_layout_get_property; gobject_class->get_property = eek_xkl_layout_get_property;
/**
* EekXklLayout:model:
*
* The libxklavier model name of #EekXklLayout.
*/
pspec = g_param_spec_string ("model",
"Model",
"Libxklavier model",
NULL,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_MODEL, pspec);
/**
* EekXklLayout:layouts:
*
* The libxklavier layout names of #EekXklLayout.
*/
pspec = g_param_spec_boxed ("layouts", pspec = g_param_spec_boxed ("layouts",
"Layouts", "Layouts",
"Libxklavier layouts", "Libxklavier layouts",
@ -191,6 +219,11 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_LAYOUTS, pspec); g_object_class_install_property (gobject_class, PROP_LAYOUTS, pspec);
/**
* EekXklLayout:variants:
*
* The libxklavier variant names of #EekXklLayout.
*/
pspec = g_param_spec_boxed ("variants", pspec = g_param_spec_boxed ("variants",
"Variants", "Variants",
"Libxklavier variants", "Libxklavier variants",
@ -198,6 +231,11 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_VARIANTS, pspec); g_object_class_install_property (gobject_class, PROP_VARIANTS, pspec);
/**
* EekXklLayout:options:
*
* The libxklavier option names of #EekXklLayout.
*/
pspec = g_param_spec_boxed ("options", pspec = g_param_spec_boxed ("options",
"Options", "Options",
"Libxklavier options", "Libxklavier options",
@ -206,6 +244,8 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec); g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
} }
/* Disabled since the current EekXklLayout implementation does not
change the server setting. */
#if 0 #if 0
static void static void
on_state_changed (XklEngine *xklengine, on_state_changed (XklEngine *xklengine,
@ -234,103 +274,179 @@ eek_xkl_layout_init (EekXklLayout *self)
g_return_if_fail (display); g_return_if_fail (display);
priv->engine = xkl_engine_get_instance (display); priv->engine = xkl_engine_get_instance (display);
/* Disabled since the current EekXklLayout implementation does not
change the server setting. */
#if 0 #if 0
g_signal_connect (priv->engine, "X-state-changed", g_signal_connect (priv->engine, "X-state-changed",
G_CALLBACK(on_state_changed), self); G_CALLBACK(on_state_changed), self);
xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE); xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE);
#endif #endif
xkl_config_rec_get_from_server (priv->config, priv->engine); xkl_config_rec_get_from_server (priv->config, priv->engine);
get_xkb_component_names (self); set_xkb_component_names (self, priv->config);
} }
/**
* eek_xkl_layout_new:
*
* Create a new #EekXklLayout.
*/
EekLayout * EekLayout *
eek_xkl_layout_new (void) eek_xkl_layout_new (void)
{ {
return g_object_new (EEK_TYPE_XKL_LAYOUT, NULL); return g_object_new (EEK_TYPE_XKL_LAYOUT, NULL);
} }
void G_INLINE_FUNC void
merge_xkl_config_rec (XklConfigRec *dst, XklConfigRec *src)
{
if (src->model) {
g_free (dst->model);
dst->model = g_strdup (src->model);
}
if (src->layouts) {
g_strfreev (dst->layouts);
dst->layouts = g_strdupv (src->layouts);
}
if (src->variants) {
g_strfreev (dst->variants);
dst->variants = g_strdupv (src->variants);
}
if (src->options) {
g_strfreev (dst->options);
dst->options = g_strdupv (src->options);
}
}
/**
* eek_xkl_layout_set_config:
* @layout: an #EekXklLayout
* @config: Libxklavier configuration
*
* Reconfigure @layout with @config.
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkl_layout_set_config (EekXklLayout *layout, eek_xkl_layout_set_config (EekXklLayout *layout,
XklConfigRec *config) XklConfigRec *config)
{ {
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout); EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *c;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
if (config->model) { c = xkl_config_rec_new ();
g_free (priv->config->model); merge_xkl_config_rec (c, priv->config);
priv->config->model = g_strdup (config->model); merge_xkl_config_rec (c, config);
if (set_xkb_component_names (layout, c)) {
g_object_unref (c);
merge_xkl_config_rec (priv->config, config);
return TRUE;
} }
if (config->layouts) { g_object_unref (c);
g_strfreev (priv->config->layouts); return FALSE;
priv->config->layouts = g_strdupv (config->layouts);
}
if (config->variants) {
g_strfreev (priv->config->variants);
priv->config->variants = g_strdupv (config->variants);
}
if (config->options) {
g_strfreev (priv->config->options);
priv->config->options = g_strdupv (config->options);
}
get_xkb_component_names (layout);
} }
void /**
* eek_xkl_layout_set_model:
* @layout: an #EekXklLayout
* @model: model name
*
* Set the model name of @layout configuration (in the Libxklavier terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkl_layout_set_model (EekXklLayout *layout, eek_xkl_layout_set_model (EekXklLayout *layout,
gchar *model) const gchar *model)
{ {
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout); EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config; XklConfigRec *config;
gboolean success;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
config = xkl_config_rec_new (); config = xkl_config_rec_new ();
config->model = model; config->model = (gchar *)model;
eek_xkl_layout_set_config (layout, config); success = eek_xkl_layout_set_config (layout, config);
g_object_unref (config); g_object_unref (config);
return success;
} }
void /**
* eek_xkl_layout_set_layouts:
* @layout: an #EekXklLayout
* @layouts: layout names
*
* Set the layout names of @layout (in the Libxklavier terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkl_layout_set_layouts (EekXklLayout *layout, eek_xkl_layout_set_layouts (EekXklLayout *layout,
gchar **layouts) gchar **layouts)
{ {
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout); EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config; XklConfigRec *config;
gboolean success;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
config = xkl_config_rec_new (); config = xkl_config_rec_new ();
config->layouts = layouts; config->layouts = layouts;
eek_xkl_layout_set_config (layout, config); success = eek_xkl_layout_set_config (layout, config);
g_object_unref (config); g_object_unref (config);
return success;
} }
void /**
* eek_xkl_layout_set_variants:
* @layout: an #EekXklLayout
* @variants: variant names
*
* Set the variant names of @layout (in the Libxklavier terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkl_layout_set_variants (EekXklLayout *layout, eek_xkl_layout_set_variants (EekXklLayout *layout,
gchar **variants) gchar **variants)
{ {
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout); EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config; XklConfigRec *config;
gboolean success;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
config = xkl_config_rec_new (); config = xkl_config_rec_new ();
config->variants = variants; config->variants = variants;
eek_xkl_layout_set_config (layout, config); success = eek_xkl_layout_set_config (layout, config);
g_object_unref (config); g_object_unref (config);
return success;
} }
void /**
* eek_xkl_layout_set_options:
* @layout: an #EekXklLayout
* @options: option names
*
* Set the option names of @layout (in the Libxklavier terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkl_layout_set_options (EekXklLayout *layout, eek_xkl_layout_set_options (EekXklLayout *layout,
gchar **options) gchar **options)
{ {
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout); EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config; XklConfigRec *config;
gboolean success;
g_return_if_fail (priv); g_return_val_if_fail (priv, FALSE);
config = xkl_config_rec_new (); config = xkl_config_rec_new ();
config->options = options; config->options = options;
eek_xkl_layout_set_config (layout, config); success = eek_xkl_layout_set_config (layout, config);
g_object_unref (config); g_object_unref (config);
return success;
} }
/**
* eek_xkl_layout_get_model:
* @layout: an #EekXklLayout
*
* Get the model name of @layout configuration (in the Libxklavier terminology).
*/
gchar * gchar *
eek_xkl_layout_get_model (EekXklLayout *layout) eek_xkl_layout_get_model (EekXklLayout *layout)
{ {
@ -340,6 +456,13 @@ eek_xkl_layout_get_model (EekXklLayout *layout)
return priv->config->model; return priv->config->model;
} }
/**
* eek_xkl_layout_get_layouts:
* @layout: an #EekXklLayout
*
* Get the layout names of @layout configuration (in the Libxklavier
* terminology).
*/
gchar ** gchar **
eek_xkl_layout_get_layouts (EekXklLayout *layout) eek_xkl_layout_get_layouts (EekXklLayout *layout)
{ {
@ -349,6 +472,13 @@ eek_xkl_layout_get_layouts (EekXklLayout *layout)
return priv->config->layouts; return priv->config->layouts;
} }
/**
* eek_xkl_layout_get_variants:
* @layout: an #EekXklLayout
*
* Get the variant names of @layout configuration (in the Libxklavier
* terminology).
*/
gchar ** gchar **
eek_xkl_layout_get_variants (EekXklLayout *layout) eek_xkl_layout_get_variants (EekXklLayout *layout)
{ {
@ -358,6 +488,13 @@ eek_xkl_layout_get_variants (EekXklLayout *layout)
return priv->config->variants; return priv->config->variants;
} }
/**
* eek_xkl_layout_get_options:
* @layout: an #EekXklLayout
*
* Get the option names of @layout configuration (in the Libxklavier
* terminology).
*/
gchar ** gchar **
eek_xkl_layout_get_options (EekXklLayout *layout) eek_xkl_layout_get_options (EekXklLayout *layout)
{ {
@ -367,15 +504,21 @@ eek_xkl_layout_get_options (EekXklLayout *layout)
return priv->config->options; return priv->config->options;
} }
static void static gboolean
get_xkb_component_names (EekXklLayout *layout) set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
{ {
EekXklLayoutPrivate *priv = layout->priv; EekXklLayoutPrivate *priv = layout->priv;
XkbComponentNamesRec names; XkbComponentNamesRec names;
gboolean success = FALSE;
if (xkl_xkb_config_native_prepare (priv->engine, priv->config, &names)) { /* Disabled since the current EekXklLayout implementation does not
EEK_XKB_LAYOUT_GET_CLASS (layout)-> change the server setting. */
set_names (EEK_XKB_LAYOUT(layout), &names); #if 0
xkl_config_rec_activate (priv->engine, config);
#endif
if (xkl_xkb_config_native_prepare (priv->engine, config, &names)) {
success = eek_xkb_layout_set_names (EEK_XKB_LAYOUT(layout), &names);
xkl_xkb_config_native_cleanup (priv->engine, &names); xkl_xkb_config_native_cleanup (priv->engine, &names);
} }
return success;
} }

View File

@ -53,16 +53,16 @@ GType eek_xkl_layout_get_type (void) G_GNUC_CONST;
EekLayout *eek_xkl_layout_new (void); EekLayout *eek_xkl_layout_new (void);
void eek_xkl_layout_set_config (EekXklLayout *layout, gboolean eek_xkl_layout_set_config (EekXklLayout *layout,
XklConfigRec *config); XklConfigRec *config);
void eek_xkl_layout_set_model (EekXklLayout *layout, gboolean eek_xkl_layout_set_model (EekXklLayout *layout,
gchar *model); const gchar *model);
void eek_xkl_layout_set_layouts (EekXklLayout *layout, gboolean eek_xkl_layout_set_layouts (EekXklLayout *layout,
gchar **layouts); gchar **layouts);
void eek_xkl_layout_set_variants (EekXklLayout *layout, gboolean eek_xkl_layout_set_variants (EekXklLayout *layout,
gchar **variants); gchar **variants);
void eek_xkl_layout_set_options (EekXklLayout *layout, gboolean eek_xkl_layout_set_options (EekXklLayout *layout,
gchar **options); gchar **options);
gchar *eek_xkl_layout_get_model (EekXklLayout *layout); gchar *eek_xkl_layout_get_model (EekXklLayout *layout);

View File

@ -462,7 +462,7 @@ main (int argc, char *argv[])
bounds.width = CSW; bounds.width = CSW;
bounds.height = CSH; bounds.height = CSH;
eekboard.keyboard = eek_gtk_keyboard_new (); eekboard.keyboard = eek_gtk_keyboard_new ();
eek_element_set_bounds (eekboard.keyboard, &bounds); eek_element_set_bounds (EEK_ELEMENT(eekboard.keyboard), &bounds);
eek_keyboard_set_layout (eekboard.keyboard, eekboard.layout); eek_keyboard_set_layout (eekboard.keyboard, eekboard.layout);
embed = eek_gtk_keyboard_get_widget (EEK_GTK_KEYBOARD (eekboard.keyboard)); embed = eek_gtk_keyboard_get_widget (EEK_GTK_KEYBOARD (eekboard.keyboard));