From 2d7c1e52f227ff9c3632ce00aa4e0570f45e8a6a Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Mon, 14 Jun 2010 14:57:06 +0900 Subject: [PATCH] EekXklLayout: eek_xkl_layout_set_config() takes XklConfigRec as an argument. --- eek/eek-xkb-layout.c | 22 +++++--- eek/eek-xkl-layout.c | 124 ++++++++++++++++++++++++++++++------------- eek/eek-xkl-layout.h | 7 +-- src/eekboard.c | 52 +++++++++--------- 4 files changed, 131 insertions(+), 74 deletions(-) diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index a3b7e6f3..4794c4b3 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -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"); } diff --git a/eek/eek-xkl-layout.c b/eek/eek-xkl-layout.c index f0e3dcd6..21072b9a 100644 --- a/eek/eek-xkl-layout.c +++ b/eek/eek-xkl-layout.c @@ -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); diff --git a/eek/eek-xkl-layout.h b/eek/eek-xkl-layout.h index f251631e..409d47e4 100644 --- a/eek/eek-xkl-layout.h +++ b/eek/eek-xkl-layout.h @@ -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); diff --git a/src/eekboard.c b/src/eekboard.c index 505b4833..a34cc4f0 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -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 ());