EekXklLayout: eek_xkl_layout_set_config() takes XklConfigRec as an argument.

This commit is contained in:
Daiki Ueno
2010-06-14 14:57:06 +09:00
parent 226f682000
commit 2d7c1e52f2
4 changed files with 131 additions and 74 deletions

View File

@ -326,7 +326,7 @@ eek_xkb_layout_real_apply (EekLayout *layout, EekKeyboard *keyboard)
}
static gint
compare_component_names (gchar *name0, gchar *name1)
compare_component_name (gchar *name0, gchar *name1)
{
if (name0 && name1)
return g_strcmp0 (name0, name1);
@ -345,19 +345,27 @@ eek_xkb_layout_real_set_names (EekXkbLayout *self, XkbComponentNamesRec *names)
gboolean is_changed;
g_return_if_fail (priv);
is_changed =
compare_component_names (names->keycodes, priv->names.keycodes) != 0;
/* 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);
is_changed =
compare_component_names (names->geometry, priv->names.geometry) != 0;
/* 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);
is_changed =
compare_component_names (names->symbols, priv->names.symbols) != 0;
/* 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");
}

View File

@ -59,7 +59,7 @@ enum {
struct _EekXklLayoutPrivate
{
XklEngine *engine;
XklConfigRec config;
XklConfigRec *config;
};
/* from gnome-keyboard-properties-xkbpv.c:
@ -98,14 +98,19 @@ eek_layout_iface_init (EekLayoutIface *iface)
}
static void
eek_xkl_layout_finalize (GObject *object)
eek_xkl_layout_dispose (GObject *object)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (object);
g_free (priv->config.layouts);
g_free (priv->config.variants);
g_free (priv->config.options);
G_OBJECT_CLASS (eek_xkl_layout_parent_class)->finalize (object);
if (priv->config) {
g_object_unref (priv->config);
priv->config = NULL;
}
if (priv->engine) {
g_object_unref (priv->engine);
priv->engine = NULL;
}
G_OBJECT_CLASS (eek_xkl_layout_parent_class)->dispose (object);
}
static void
@ -175,7 +180,7 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
g_type_class_add_private (gobject_class, sizeof (EekXklLayoutPrivate));
gobject_class->finalize = eek_xkl_layout_finalize;
gobject_class->dispose = eek_xkl_layout_dispose;
gobject_class->set_property = eek_xkl_layout_set_property;
gobject_class->get_property = eek_xkl_layout_get_property;
@ -201,6 +206,7 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
}
#if 0
static void
on_state_changed (XklEngine *xklengine,
XklEngineStateChange type,
@ -213,6 +219,7 @@ on_state_changed (XklEngine *xklengine,
if (type == GROUP_CHANGED)
g_signal_emit_by_name (layout, "group_changed", value);
}
#endif
static void
eek_xkl_layout_init (EekXklLayout *self)
@ -221,17 +228,19 @@ eek_xkl_layout_init (EekXklLayout *self)
Display *display;
priv = self->priv = EEK_XKL_LAYOUT_GET_PRIVATE (self);
memset (&priv->config, 0, sizeof priv->config);
priv->config = xkl_config_rec_new ();
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
g_return_if_fail (display);
priv->engine = xkl_engine_get_instance (display);
#if 0
g_signal_connect (priv->engine, "X-state-changed",
G_CALLBACK(on_state_changed), self);
xkl_config_rec_get_from_server (&priv->config, priv->engine);
get_xkb_component_names (self);
xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE);
#endif
xkl_config_rec_get_from_server (priv->config, priv->engine);
get_xkb_component_names (self);
}
EekLayout *
@ -242,53 +251,93 @@ eek_xkl_layout_new (void)
void
eek_xkl_layout_set_config (EekXklLayout *layout,
gchar **layouts,
gchar **variants,
gchar **options)
XklConfigRec *config)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
g_return_if_fail (priv);
g_strfreev (priv->config.layouts);
priv->config.layouts = g_strdupv (layouts);
g_strfreev (priv->config.variants);
priv->config.variants = g_strdupv (variants);
g_strfreev (priv->config.options);
priv->config.options = g_strdupv (options);
if (config->model) {
g_free (priv->config->model);
priv->config->model = g_strdup (config->model);
}
if (config->layouts) {
g_strfreev (priv->config->layouts);
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_layouts (EekXklLayout *layout, gchar **layouts)
eek_xkl_layout_set_model (EekXklLayout *layout,
gchar *model)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config;
g_return_if_fail (priv);
g_strfreev (priv->config.layouts);
priv->config.layouts = g_strdupv (layouts);
get_xkb_component_names (layout);
config = xkl_config_rec_new ();
config->model = model;
eek_xkl_layout_set_config (layout, config);
g_object_unref (config);
}
void
eek_xkl_layout_set_variants (EekXklLayout *layout, gchar **variants)
eek_xkl_layout_set_layouts (EekXklLayout *layout,
gchar **layouts)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config;
g_return_if_fail (priv);
g_strfreev (priv->config.variants);
priv->config.variants = g_strdupv (variants);
get_xkb_component_names (layout);
config = xkl_config_rec_new ();
config->layouts = layouts;
eek_xkl_layout_set_config (layout, config);
g_object_unref (config);
}
void
eek_xkl_layout_set_options (EekXklLayout *layout, gchar **options)
eek_xkl_layout_set_variants (EekXklLayout *layout,
gchar **variants)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config;
g_return_if_fail (priv);
config = xkl_config_rec_new ();
config->variants = variants;
eek_xkl_layout_set_config (layout, config);
g_object_unref (config);
}
void
eek_xkl_layout_set_options (EekXklLayout *layout,
gchar **options)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
XklConfigRec *config;
g_return_if_fail (priv);
config = xkl_config_rec_new ();
config->options = options;
eek_xkl_layout_set_config (layout, config);
g_object_unref (config);
}
gchar *
eek_xkl_layout_get_model (EekXklLayout *layout)
{
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
g_return_if_fail (priv);
g_strfreev (priv->config.options);
priv->config.options = g_strdupv (options);
get_xkb_component_names (layout);
g_return_val_if_fail (priv, NULL);
return priv->config->model;
}
gchar **
@ -297,7 +346,7 @@ eek_xkl_layout_get_layouts (EekXklLayout *layout)
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->config.layouts;
return priv->config->layouts;
}
gchar **
@ -306,7 +355,7 @@ eek_xkl_layout_get_variants (EekXklLayout *layout)
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->config.variants;
return priv->config->variants;
}
gchar **
@ -315,7 +364,7 @@ eek_xkl_layout_get_options (EekXklLayout *layout)
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->config.options;
return priv->config->options;
}
static void
@ -324,8 +373,7 @@ get_xkb_component_names (EekXklLayout *layout)
EekXklLayoutPrivate *priv = layout->priv;
XkbComponentNamesRec names;
if (xkl_xkb_config_native_prepare (priv->engine, &priv->config, &names)) {
g_debug ("symbols = \"%s\"", names.symbols);
if (xkl_xkb_config_native_prepare (priv->engine, priv->config, &names)) {
EEK_XKB_LAYOUT_GET_CLASS (layout)->
set_names (EEK_XKB_LAYOUT(layout), &names);
xkl_xkb_config_native_cleanup (priv->engine, &names);

View File

@ -54,10 +54,10 @@ GType eek_xkl_layout_get_type (void) G_GNUC_CONST;
EekLayout *eek_xkl_layout_new (void);
void eek_xkl_layout_set_config (EekXklLayout *layout,
gchar **layouts,
gchar **variants,
gchar **options);
XklConfigRec *config);
void eek_xkl_layout_set_model (EekXklLayout *layout,
gchar *model);
void eek_xkl_layout_set_layouts (EekXklLayout *layout,
gchar **layouts);
void eek_xkl_layout_set_variants (EekXklLayout *layout,
@ -65,6 +65,7 @@ void eek_xkl_layout_set_variants (EekXklLayout *layout,
void eek_xkl_layout_set_options (EekXklLayout *layout,
gchar **options);
gchar *eek_xkl_layout_get_model (EekXklLayout *layout);
gchar **eek_xkl_layout_get_layouts (EekXklLayout *layout);
gchar **eek_xkl_layout_get_variants
(EekXklLayout *layout);

View File

@ -85,12 +85,11 @@ static const char ui_description[] =
#define SET_LAYOUT_UI_PATH "/MainMenu/KeyboardMenu/SetLayout/LayoutsPH"
struct _LayoutVariant {
struct _ConfigCallbackData {
EekBoard *eekboard;
gchar *layout;
gchar *variant;
XklConfigRec *config;
};
typedef struct _LayoutVariant LayoutVariant;
typedef struct _ConfigCallbackData ConfigCallbackData;
struct _LayoutCallbackData {
EekBoard *eekboard;
@ -180,18 +179,11 @@ on_key_released (EekKeyboard *keyboard,
static void
on_activate (GtkAction *action, gpointer user_data)
{
LayoutVariant *config = user_data;
gchar *layouts[2], *variants[2], **vp = NULL;
ConfigCallbackData *data = user_data;
layouts[0] = config->layout;
layouts[1] = NULL;
if (config->variant) {
variants[0] = config->variant;
variants[1] = NULL;
vp = variants;
}
eek_xkl_layout_set_config (EEK_XKL_LAYOUT(config->eekboard->layout),
layouts, vp, NULL);
eek_xkl_layout_set_config (EEK_XKL_LAYOUT(data->eekboard->layout),
data->config);
g_object_unref (data->config);
}
static void
@ -202,7 +194,6 @@ create_keyboard (EekBoard *eekboard,
gfloat initial_height)
{
ClutterActor *actor;
GValue value = {0};
eekboard->keyboard = eek_clutter_keyboard_new (initial_width,
initial_height);
@ -261,7 +252,7 @@ layout_callback (XklConfigRegistry *registry,
GtkAction *action;
GSList *variants = NULL;
char layout_action_name[128], variant_action_name[128];
LayoutVariant *config;
ConfigCallbackData *config;
g_snprintf (layout_action_name, sizeof (layout_action_name),
"SetLayout%s", item->name);
@ -274,13 +265,15 @@ layout_callback (XklConfigRegistry *registry,
&variants);
if (!variants) {
config = g_slice_new (LayoutVariant);
config = g_slice_new (ConfigCallbackData);
config->eekboard = data->eekboard;
config->layout = g_strdup (item->name);
config->variant = NULL;
config->config = xkl_config_rec_new ();
config->config->layouts = g_new0 (char *, 2);
config->config->layouts[0] = g_strdup (item->name);
config->config->layouts[1] = NULL;
config->config->variants = NULL;
g_signal_connect (action, "activate", G_CALLBACK (on_activate),
config);
g_object_unref (action);
gtk_ui_manager_add_ui (data->ui_manager, data->merge_id,
SET_LAYOUT_UI_PATH,
@ -308,10 +301,15 @@ layout_callback (XklConfigRegistry *registry,
NULL,
NULL);
config = g_slice_new (LayoutVariant);
config = g_slice_new (ConfigCallbackData);
config->eekboard = data->eekboard;
config->layout = g_strdup (item->name);
config->variant = g_strdup (_item->name);
config->config = xkl_config_rec_new ();
config->config->layouts = g_new0 (char *, 2);
config->config->layouts[0] = g_strdup (item->name);
config->config->layouts[1] = NULL;
config->config->variants = g_new0 (char *, 2);
config->config->variants[0] = g_strdup (_item->name);
config->config->variants[1] = NULL;
g_signal_connect (action, "activate", G_CALLBACK (on_activate),
config);
@ -410,8 +408,10 @@ main (int argc, char *argv[])
GtkWidget *menubar, *embed, *vbox, *window;
GtkUIManager *ui_manager;
clutter_init (&argc, &argv);
gtk_init (&argc, &argv);
if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) {
fprintf (stderr, "Can't init Clutter-Gtk\n");
exit (1);
}
memset (&eekboard, 0, sizeof eekboard);
eekboard.display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());