[Fedora-i18n-bugs] [ibus-m17n] Revive iok patch.

Daiki Ueno ueno at fedoraproject.org
Fri Sep 2 03:03:15 UTC 2011


commit 74c5abeda032a692588cf41d53cbae408f48c989
Author: Daiki Ueno <ueno at unixuser.org>
Date:   Fri Sep 2 12:02:57 2011 +0900

    Revive iok patch.

 ibus-m17n-default-xml-override.patch |    2 +-
 ibus-m17n-iok.patch                  |  102 ++++
 ibus-m17n-setup-refactor.patch       |  843 ++++++++++++++++++++++++++++++++++
 ibus-m17n-virtkbd.patch              |  294 ++++++++++--
 ibus-m17n-xkb-options.patch          |    2 +-
 ibus-m17n-xx-icon-symbol.patch       |    6 +-
 ibus-m17n.spec                       |   23 +-
 7 files changed, 1212 insertions(+), 60 deletions(-)
---
diff --git a/ibus-m17n-default-xml-override.patch b/ibus-m17n-default-xml-override.patch
index 39d7935..21f2be2 100644
--- a/ibus-m17n-default-xml-override.patch
+++ b/ibus-m17n-default-xml-override.patch
@@ -1,7 +1,7 @@
 From e37bcc53f1d145e10974fb0bb91802d735921fcd Mon Sep 17 00:00:00 2001
 From: Daiki Ueno <ueno at unixuser.org>
 Date: Wed, 31 Aug 2011 11:44:46 +0900
-Subject: [PATCH 1/5] Update the format of default.xml to allow override.
+Subject: [PATCH 1/6] Update the format of default.xml to allow override.
 
 This patch allows value inheritance from the previous matches.
 With the new format:
diff --git a/ibus-m17n-iok.patch b/ibus-m17n-iok.patch
new file mode 100644
index 0000000..b885aae
--- /dev/null
+++ b/ibus-m17n-iok.patch
@@ -0,0 +1,102 @@
+From 240931f8433ffa9de0c78a862e0d5e0aad93953d Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Fri, 2 Sep 2011 11:27:02 +0900
+Subject: [PATCH 6/6] Apply iok patch from fedora.
+
+---
+ src/engine.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 44 insertions(+), 0 deletions(-)
+
+diff --git a/src/engine.c b/src/engine.c
+index 1e6bd1b..f23d982 100644
+--- a/src/engine.c
++++ b/src/engine.c
+@@ -26,6 +26,7 @@ struct _IBusM17NEngine {
+     IBusProperty    *setup_prop;
+ #endif  /* HAVE_SETUP */
+     IBusProperty    *virtkbd_prop;
++    IBusProperty    *show_iok_prop;
+     IBusPropList    *prop_list;
+ };
+ 
+@@ -40,6 +41,7 @@ struct _IBusM17NEngineClass {
+     gint lookup_table_orientation;
+     gchar *virtual_keyboard;
+     gboolean virtual_keyboard_enabled;
++    gboolean use_iok;
+ 
+     MInputMethod *im;
+ };
+@@ -254,6 +256,9 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+     }
+     engine_name = g_strdup_printf ("m17n:%s:%s", lang, name);
+     klass->config_section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
++    /* whether to use iok - maybe good to move this to default.xml */
++    klass->use_iok = g_strcmp0 (name, "inscript") == 0 ||
++        g_strcmp0 (name, "inscript2") == 0;
+     g_free (lang);
+     g_free (name);
+ 
+@@ -412,6 +417,22 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+         klass->virtual_keyboard != NULL)
+         ibus_property_set_visible (m17n->virtkbd_prop, TRUE);
+ 
++    label = ibus_text_new_from_string ("iok");
++    m17n->show_iok_prop = ibus_property_new ("iok",
++                                             PROP_TYPE_NORMAL,
++                                             label,
++                                             "/usr/share/pixmaps/iok.xpm",
++                                             label,
++                                             TRUE,
++                                             FALSE,
++                                             0,
++                                             NULL);
++    g_object_ref_sink (m17n->show_iok_prop);
++    ibus_prop_list_append (m17n->prop_list,  m17n->show_iok_prop);
++
++    if (klass->use_iok && !klass->virtual_keyboard_enabled)
++        ibus_property_set_visible (m17n->show_iok_prop, TRUE);
++
+     m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
+     g_object_ref_sink (m17n->table);
+     m17n->context = NULL;
+@@ -502,6 +523,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
+         m17n->virtkbd_prop = NULL;
+     }
+ 
++    if (m17n->show_iok_prop) {
++        g_object_unref (m17n->show_iok_prop);
++        m17n->show_iok_prop = NULL;
++    }
++
+     if (m17n->table) {
+         g_object_unref (m17n->table);
+         m17n->table = NULL;
+@@ -842,6 +868,24 @@ ibus_m17n_engine_property_activate (IBusEngine  *engine,
+     }
+ #endif  /*  HAVE_EEKBOARD */
+ 
++    if (g_strcmp0 (prop_name, "iok") == 0) {
++        const gchar *engine_name;
++        gchar *lang = NULL, *name = NULL;
++
++        engine_name = ibus_engine_get_name ((IBusEngine *) m17n);
++        if (ibus_m17n_scan_engine_name (engine_name, &lang, &name)) {
++            gchar *iok;
++
++            iok = g_strdup_printf ("/usr/bin/iok -n %s", lang);
++            g_debug ("keymap name = %s,prop_name=%s, prop_state=%d",
++                     engine_name, prop_name, prop_state);
++            g_spawn_command_line_async(iok, NULL);
++            g_free (iok);
++        }
++        g_free (lang);
++        g_free (name);
++    }
++
+     parent_class->property_activate (engine, prop_name, prop_state);
+ }
+ 
+-- 
+1.7.6.1
+
diff --git a/ibus-m17n-setup-refactor.patch b/ibus-m17n-setup-refactor.patch
new file mode 100644
index 0000000..ccd1346
--- /dev/null
+++ b/ibus-m17n-setup-refactor.patch
@@ -0,0 +1,843 @@
+From bd48b1f5c71ab849e1d2c78fd069a92d37426dc3 Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Thu, 1 Sep 2011 18:48:41 +0900
+Subject: [PATCH 2/6] Refactor setup.c.
+
+---
+ src/ibus-m17n-preferences.ui |    3 +-
+ src/setup.c                  |  663 +++++++++++++++++++++++-------------------
+ 2 files changed, 362 insertions(+), 304 deletions(-)
+
+diff --git a/src/ibus-m17n-preferences.ui b/src/ibus-m17n-preferences.ui
+index 6f6ace7..a46ab49 100644
+--- a/src/ibus-m17n-preferences.ui
++++ b/src/ibus-m17n-preferences.ui
+@@ -263,9 +263,10 @@
+                             <property name="hscrollbar_policy">automatic</property>
+                             <property name="vscrollbar_policy">automatic</property>
+                             <child>
+-                              <object class="GtkTreeView" id="treeviewMimConfig">
++                              <object class="GtkTreeView" id="treeview_mim_config">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
++                                <property name="has_tooltip">True</property>
+                                 <property name="enable_grid_lines">both</property>
+                               </object>
+                             </child>
+diff --git a/src/setup.c b/src/setup.c
+index aba0e92..30386df 100644
+--- a/src/setup.c
++++ b/src/setup.c
+@@ -17,19 +17,24 @@ enum {
+     NUM_COLS
+ };
+ 
+-struct _ConfigContext {
+-    IBusConfig *config;
+-    MSymbol language;
+-    MSymbol name;
+-    GtkListStore *store;
+-    gchar *section;
++struct _SetupDialog {
++    GtkWidget *dialog;
++    GtkWidget *combobox_underline;
++    GtkWidget *combobox_orientation;
++    GtkWidget *checkbutton_foreground;
+     GtkWidget *colorbutton_foreground;
++    GtkWidget *checkbutton_background;
+     GtkWidget *colorbutton_background;
++    GtkWidget *treeview;
++    GtkListStore *store;
+ 
+-};
+-typedef struct _ConfigContext ConfigContext;
++    gchar *lang;
++    gchar *name;
+ 
+-static IBusConfig *config = NULL;
++    IBusConfig *config;
++    gchar *section;
++};
++typedef struct _SetupDialog SetupDialog;
+ 
+ static gchar *opt_name = NULL;
+ static const GOptionEntry options[] = {
+@@ -38,17 +43,8 @@ static const GOptionEntry options[] = {
+     {NULL}
+ };
+ 
+-void
+-ibus_m17n_init (IBusBus *bus)
+-{
+-    config = ibus_bus_get_config (bus);
+-    if (config)
+-        g_object_ref_sink (config);
+-    ibus_m17n_init_common ();
+-}
+-
+ static gchar *
+-format_value (MPlist *plist)
++format_m17n_value (MPlist *plist)
+ {
+     if (mplist_key (plist) == Msymbol)
+         return g_strdup (msymbol_name ((MSymbol) mplist_value (plist)));
+@@ -64,7 +60,7 @@ format_value (MPlist *plist)
+ }
+ 
+ static MPlist *
+-parse_value (MPlist *plist, gchar *text)
++parse_m17n_value (MPlist *plist, gchar *text)
+ {
+     MPlist *value;
+ 
+@@ -100,7 +96,7 @@ parse_value (MPlist *plist, gchar *text)
+ }
+ 
+ static void
+-insert_items (GtkListStore *store, MSymbol language, MSymbol name)
++insert_m17n_items (GtkListStore *store, MSymbol language, MSymbol name)
+ {
+     MPlist *plist;
+ 
+@@ -109,8 +105,8 @@ insert_items (GtkListStore *store, MSymbol language, MSymbol name)
+     for (; plist && mplist_key (plist) == Mplist; plist = mplist_next (plist)) {
+         GtkTreeIter iter;
+         MSymbol key;
+-        MPlist *p, *value;
+-        gchar *description;
++        MPlist *p, *mvalue;
++        gchar *description, *value;
+ 
+         p = mplist_value (plist);
+         key = mplist_value (p); /* name */
+@@ -118,15 +114,17 @@ insert_items (GtkListStore *store, MSymbol language, MSymbol name)
+         p = mplist_next (p);  /* description */
+         description = ibus_m17n_mtext_to_utf8 ((MText *) mplist_value (p));
+         p = mplist_next (p);  /* status */
+-        value = mplist_next (p);
++        mvalue = mplist_next (p);
++        value = format_m17n_value (mvalue);
+ 
+         gtk_list_store_append (store, &iter);
+         gtk_list_store_set (store, &iter,
+                             COLUMN_KEY, msymbol_name (key),
+                             COLUMN_DESCRIPTION, description,
+-                            COLUMN_VALUE, format_value (value),
++                            COLUMN_VALUE, value,
+                             -1);
+         g_free (description);
++        g_free (value);
+     }
+ }
+ 
+@@ -163,95 +161,238 @@ on_edited (GtkCellRendererText *cell,
+            gchar               *new_text,
+            gpointer             data)
+ {
+-    ConfigContext *context = data;
+-    GtkTreeModel *model = GTK_TREE_MODEL (context->store);
++    SetupDialog *dialog = data;
++    GtkTreeModel *model = GTK_TREE_MODEL (dialog->store);
+     GtkTreeIter iter;
+     GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
+-    MPlist *plist, *p, *value;
+-    gchar *key;
+ 
+     gtk_tree_model_get_iter (model, &iter, path);
+-    gtk_tree_model_get (model, &iter, COLUMN_KEY, &key, -1);
+ 
+-    plist = minput_get_variable (context->language, context->name,
+-                                 msymbol (key));
+-    if (!plist)
+-        goto fail;
++    gtk_list_store_set (dialog->store, &iter,
++                        COLUMN_VALUE, new_text,
++                        -1);
++    gtk_tree_path_free (path);
++}
+ 
+-    p = mplist_next (mplist_next (mplist_next (mplist_value (plist))));
+-    if (!p)
+-        goto fail;
++static void
++toggle_colorbutton_sensitive (GtkToggleButton *togglebutton,
++                    GtkWidget       *colorbutton)
++{
++    if (gtk_toggle_button_get_active (togglebutton))
++        gtk_widget_set_sensitive (colorbutton, TRUE);
++    else
++        gtk_widget_set_sensitive (colorbutton, FALSE);
++}
+ 
+-    value = parse_value (p, new_text);
+-    if (!value)
+-        goto fail;
++static void
++on_foreground_toggled (GtkToggleButton *togglebutton,
++                       gpointer         user_data)
++{
++    SetupDialog *dialog = user_data;
++    toggle_colorbutton_sensitive (togglebutton, dialog->colorbutton_foreground);
++}
+ 
+-    if (minput_config_variable (context->language, context->name,
+-                                msymbol (key), value) != 0)
+-        goto fail;
++static void
++on_background_toggled (GtkToggleButton *togglebutton,
++                       gpointer         user_data)
++{
++    SetupDialog *dialog = user_data;
++    toggle_colorbutton_sensitive (togglebutton, dialog->colorbutton_background);
++}
+ 
+-    if (minput_save_config () != 1)
+-        goto fail;
++static gint
++get_combo_box_index_by_value (GtkComboBox *combobox, gint value)
++{
++    GtkTreeModel *model;
++    GtkTreeIter iter;
++    gint index;
+ 
+-    gtk_list_store_set (context->store, &iter,
+-                        COLUMN_VALUE, new_text,
+-                        -1);
++    index = 0;
++    model = gtk_combo_box_get_model (combobox);
++    if (!gtk_tree_model_get_iter_first (model, &iter))
++        return -1;
+ 
+- fail:
+-    gtk_tree_path_free (path);
++    do {
++        gint _value;
++        gtk_tree_model_get (model, &iter, COLUMN_VALUE, &_value, -1);
++        if (_value == value)
++            return index;
++        index++;
++    } while (gtk_tree_model_iter_next (model, &iter));
++    return -1;
+ }
+ 
+ static void
+-color_to_gdk (guint color, GdkColor *color_gdk)
++_gdk_color_from_uint (guint color, GdkColor *color_gdk)
+ {
+-    memset (color_gdk, 0, sizeof *color_gdk);
++    color_gdk->pixel = 0;
+     color_gdk->red = (color >> 8) & 0xFF00;
+     color_gdk->green = color & 0xFF00;
+     color_gdk->blue = (color & 0xFF) << 8;
+ }
+ 
+ static void
+-set_color (ConfigContext *context, const gchar *name, GdkColor *color)
++setup_dialog_load_config (SetupDialog *dialog)
+ {
+-    gchar buf[8];
++    gchar *color;
++    gboolean bvalue;
++    gint ivalue;
++    GdkColor cvalue;
++    GtkCellRenderer *renderer;
++    gint index;
+ 
+-    if (color)
+-        sprintf (buf, "#%02X%02X%02X",
+-                 (color->red & 0xFF00) >> 8,
+-                 (color->green & 0xFF00) >> 8,
+-                 (color->blue & 0xFF00) >> 8);
+-    else
+-        strcpy (buf, "none");
+-    ibus_m17n_config_set_string (config, context->section, name, buf);
++    /* General -> Pre-edit Appearance */
++    /* foreground color of pre-edit buffer */
++    bvalue = FALSE;
++    _gdk_color_from_uint (PREEDIT_FOREGROUND, &cvalue);
++    if (ibus_m17n_config_get_string (dialog->config,
++                                     dialog->section,
++                                     "preedit_foreground",
++                                     &color)) {
++        if (g_strcmp0 (color, "none") != 0 && gdk_color_parse (color, &cvalue))
++            bvalue = TRUE;
++        g_free (color);
++    }
++
++    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_foreground),
++                                  bvalue);
++    g_signal_connect (dialog->checkbutton_foreground, "toggled",
++                      G_CALLBACK(on_foreground_toggled),
++                      dialog);
++    gtk_widget_set_sensitive (dialog->colorbutton_foreground,
++                              bvalue);
++    gtk_color_button_set_color (GTK_COLOR_BUTTON(dialog->colorbutton_foreground),
++                                &cvalue);
++    
++    /* background color of pre-edit buffer */
++    bvalue = FALSE;
++    _gdk_color_from_uint (PREEDIT_BACKGROUND, &cvalue);
++    if (ibus_m17n_config_get_string (dialog->config,
++                                     dialog->section,
++                                     "preedit_background",
++                                     &color)) {
++        if (g_strcmp0 (color, "none") != 0 && gdk_color_parse (color, &cvalue))
++            bvalue = TRUE;
++        g_free (color);
++    }
++    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_background),
++                                  bvalue);
++    g_signal_connect (dialog->checkbutton_background, "toggled",
++                      G_CALLBACK(on_background_toggled),
++                      dialog);
++    gtk_widget_set_sensitive (dialog->colorbutton_background,
++                              bvalue);
++    gtk_color_button_set_color (GTK_COLOR_BUTTON(dialog->colorbutton_background),
++                                &cvalue);
++
++    /* underline of pre-edit buffer */
++    renderer = gtk_cell_renderer_text_new ();
++    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(dialog->combobox_underline),
++                                renderer, TRUE);
++    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(dialog->combobox_underline),
++                                    renderer, "text", 0, NULL);
++    if (!ibus_m17n_config_get_int (dialog->config,
++                                   dialog->section,
++                                   "preedit_underline",
++                                   &ivalue))
++        ivalue = IBUS_ATTR_UNDERLINE_NONE;
++
++    index = get_combo_box_index_by_value
++        (GTK_COMBO_BOX(dialog->combobox_underline),
++         ivalue);
++    gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_underline),
++                              index);
++
++    /* General -> Other */
++    renderer = gtk_cell_renderer_text_new ();
++    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(dialog->combobox_orientation),
++                                renderer, TRUE);
++    gtk_cell_layout_set_attributes
++        (GTK_CELL_LAYOUT(dialog->combobox_orientation),
++         renderer, "text", 0, NULL);
++    if (!ibus_m17n_config_get_int (dialog->config,
++                                   dialog->section,
++                                   "lookup_table_orientation",
++                                   &ivalue))
++        ivalue = IBUS_ORIENTATION_SYSTEM;
++
++    index = get_combo_box_index_by_value
++        (GTK_COMBO_BOX(dialog->combobox_orientation),
++         ivalue);
++    gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_orientation),
++                              index);
++
++    /* Advanced -> m17n-lib configuration */
++    dialog->store = gtk_list_store_new (NUM_COLS,
++                                        G_TYPE_STRING,
++                                        G_TYPE_STRING,
++                                        G_TYPE_STRING);
++    insert_m17n_items (dialog->store,
++                       msymbol (dialog->lang),
++                       msymbol (dialog->name));
++
++    gtk_tree_view_set_model (GTK_TREE_VIEW(dialog->treeview),
++                             GTK_TREE_MODEL (dialog->store));
++
++    renderer = gtk_cell_renderer_text_new ();
++    gtk_tree_view_insert_column_with_attributes
++        (GTK_TREE_VIEW (dialog->treeview), -1,
++         "Key",
++         renderer,
++         "text", COLUMN_KEY,
++         NULL);
++    renderer = gtk_cell_renderer_text_new ();
++    gtk_tree_view_insert_column_with_attributes
++        (GTK_TREE_VIEW (dialog->treeview), -1,
++         "Value",
++         renderer,
++         "text", COLUMN_VALUE,
++         NULL);
++    g_object_set (renderer, "editable", TRUE, NULL);
++    g_signal_connect (renderer, "edited", G_CALLBACK(on_edited), dialog);
++
++    g_signal_connect (dialog->treeview, "query-tooltip",
++                      G_CALLBACK(on_query_tooltip), NULL);
+ }
+ 
+-static void
+-on_foreground_color_set (GtkColorButton *widget,
+-                         gpointer        user_data)
++static gchar *
++_gdk_color_to_string (GdkColor *color)
+ {
+-    ConfigContext *context = user_data;
+-    GdkColor color;
+-
+-    gtk_color_button_get_color (GTK_COLOR_BUTTON(widget), &color);
+-    set_color (context, "preedit_foreground", &color);
++    g_strdup_printf ("#%02X%02X%02X",
++                     (color->red & 0xFF00) >> 8,
++                     (color->green & 0xFF00) >> 8,
++                     (color->blue & 0xFF00) >> 8);
+ }
+ 
+ static void
+-on_background_color_set (GtkColorButton *widget,
+-                         gpointer        user_data)
++save_color (SetupDialog     *dialog,
++            GtkToggleButton *togglebutton,
++            GtkColorButton  *colorbutton,
++            const gchar     *name)
+ {
+-    ConfigContext *context = user_data;
+-    GdkColor color;
+-
+-    gtk_color_button_get_color (GTK_COLOR_BUTTON(widget), &color);
+-    set_color (context, "preedit_background", &color);
++    if (gtk_toggle_button_get_active (togglebutton)) {
++        GdkColor color;
++        gchar *svalue;
++
++        gtk_color_button_get_color (colorbutton, &color);
++        svalue = _gdk_color_to_string (&color);
++        ibus_m17n_config_set_string (dialog->config,
++                                     dialog->section,
++                                     name,
++                                     svalue);
++        g_free (svalue);
++    } else
++        ibus_m17n_config_set_string (dialog->config,
++                                     dialog->section,
++                                     name,
++                                     "none");
+ }
+ 
+ static void
+-on_underline_changed (GtkComboBox *combo,
+-                      gpointer     user_data)
++save_choice (SetupDialog *dialog,
++             GtkComboBox *combo,
++             const gchar *name)
+ {
+-    ConfigContext *context = user_data;
+     GtkTreeModel *model;
+     GtkTreeIter iter;
+     gint active;
+@@ -260,123 +401,164 @@ on_underline_changed (GtkComboBox *combo,
+     gtk_combo_box_get_active_iter (combo, &iter);
+     gtk_tree_model_get (model, &iter, COLUMN_VALUE, &active, -1);
+ 
+-    ibus_m17n_config_set_int (config,
+-                              context->section,
+-                              "preedit_underline",
+-                              active);
++    ibus_m17n_config_set_int (dialog->config, dialog->section, name, active);
+ }
+ 
+-static void
+-on_orientation_changed (GtkComboBox *combo,
+-                        gpointer     user_data)
++static gboolean
++save_m17n_options (SetupDialog *dialog)
+ {
+-    ConfigContext *context = user_data;
+-    GtkTreeModel *model;
++    GtkTreeModel *model = GTK_TREE_MODEL (dialog->store);
+     GtkTreeIter iter;
+-    gint active;
++    MPlist *plist, *p, *mvalue = NULL;
++    MSymbol lang, name;
++    gchar *key = NULL, *value = NULL;
++    gboolean retval = TRUE;
+ 
+-    model = gtk_combo_box_get_model (combo);
+-    gtk_combo_box_get_active_iter (combo, &iter);
+-    gtk_tree_model_get (model, &iter, COLUMN_VALUE, &active, -1);
++    if (!gtk_tree_model_get_iter_first (model, &iter))
++        return;
+ 
+-    ibus_m17n_config_set_int (config,
+-                              context->section,
+-                              "lookup_table_orientation",
+-                              active);
+-}
++    lang = msymbol (dialog->lang);
++    name = msymbol (dialog->name);
+ 
+-static void
+-toggle_color (ConfigContext *context,
+-              GtkToggleButton *togglebutton,
+-              GtkWidget *colorbutton,
+-              const gchar *name)
+-{
+-    GdkColor color;
++    do {
++        gtk_tree_model_get (model, &iter,
++                            COLUMN_KEY, &key,
++                            COLUMN_VALUE, &value,
++                            -1);
+ 
+-    if (gtk_toggle_button_get_active (togglebutton)) {
+-        gtk_widget_set_sensitive (colorbutton, TRUE);
+-        gtk_color_button_get_color (GTK_COLOR_BUTTON(colorbutton), &color);
+-        set_color (context, name, &color);
+-    } else {
+-        gtk_widget_set_sensitive (colorbutton, FALSE);
+-        gtk_color_button_get_color (GTK_COLOR_BUTTON(colorbutton), &color);
+-        set_color (context, name, NULL);
+-    }
++        plist = minput_get_variable (lang, name, msymbol (key));
++        if (!plist) {
++            retval = FALSE;
++            break;
++        }
++
++        p = mplist_next (mplist_next (mplist_next (mplist_value (plist))));
++        if (!p) {
++            retval = FALSE;
++            break;
++        }
++
++        mvalue = parse_m17n_value (p, value);
++        if (!mvalue) {
++            retval = FALSE;
++            break;
++        }
++
++        if (minput_config_variable (lang, name, msymbol (key), mvalue) != 0) {
++            retval = FALSE;
++            break;
++        }
++
++        if (mvalue)
++            m17n_object_unref (mvalue);
++        g_free (key);
++        g_free (value);
++        mvalue = NULL;
++        key = NULL;
++        value = NULL;
++    } while (gtk_tree_model_iter_next (model, &iter));
++
++    if (retval && minput_save_config () != 1)
++        retval = FALSE;
++
++    if (mvalue)
++        m17n_object_unref (mvalue);
++    g_free (key);
++    g_free (value);
++
++    return retval;
+ }
+ 
+ static void
+-on_foreground_toggled (GtkToggleButton *togglebutton,
+-                       gpointer         user_data)
++setup_dialog_save_config (SetupDialog *dialog)
+ {
+-    ConfigContext *context = user_data;
+-
+-    toggle_color (context,
+-                  togglebutton,
+-                  context->colorbutton_foreground,
+-                  "preedit_foreground");
++    save_color (dialog,
++                GTK_TOGGLE_BUTTON(dialog->checkbutton_foreground),
++                GTK_COLOR_BUTTON(dialog->colorbutton_foreground),
++                "preedit_foreground");
++    save_color (dialog,
++                GTK_TOGGLE_BUTTON(dialog->checkbutton_background),
++                GTK_COLOR_BUTTON(dialog->colorbutton_background),
++                "preedit_background");
++    save_choice (dialog,
++                 GTK_COMBO_BOX(dialog->combobox_underline),
++                 "preedit_underline");
++    save_choice (dialog,
++                 GTK_COMBO_BOX(dialog->combobox_orientation),
++                 "lookup_table_orientation");
++    save_m17n_options (dialog);
+ }
+ 
+-static void
+-on_background_toggled (GtkToggleButton *togglebutton,
+-                       gpointer         user_data)
++static SetupDialog *
++setup_dialog_new (IBusConfig  *config,
++                  const gchar *lang,
++                  const gchar *name)
+ {
+-    ConfigContext *context = user_data;
++    GtkBuilder *builder;
++    SetupDialog *dialog;
++    GObject *object;
++    GError *error;
++
++    dialog = g_slice_new0 (SetupDialog);
++    dialog->config = g_object_ref_sink (config);
++    dialog->lang = g_strdup (lang);
++    dialog->name = g_strdup (name);
++    dialog->section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
++
++    builder = gtk_builder_new ();
++    gtk_builder_set_translation_domain (builder, "ibus-m17n");
++
++    error = NULL;
++    gtk_builder_add_from_file (builder,
++                               SETUPDIR "/ibus-m17n-preferences.ui",
++                               &error);
++    g_assert_no_error (error);
++
++    object = gtk_builder_get_object (builder, "dialog");
++    dialog->dialog = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "checkbutton_foreground");
++    dialog->checkbutton_foreground = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "colorbutton_foreground");
++    dialog->colorbutton_foreground = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "checkbutton_background");
++    dialog->checkbutton_background = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "colorbutton_background");
++    dialog->colorbutton_background = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "combobox_underline");
++    dialog->combobox_underline = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "combobox_orientation");
++    dialog->combobox_orientation = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "treeview_mim_config");
++    dialog->treeview = GTK_WIDGET(object);
+ 
+-    toggle_color (context,
+-                  togglebutton,
+-                  context->colorbutton_background,
+-                  "preedit_background");
++    return dialog;
+ }
+ 
+-static gint
+-get_combo_box_index_by_value (GtkComboBox *combobox, gint value)
++static void
++setup_dialog_free (SetupDialog *dialog)
+ {
+-    GtkTreeModel *model;
+-    GtkTreeIter iter;
+-    gint index;
++    gtk_widget_destroy (dialog->dialog);
+ 
+-    index = 0;
+-    model = gtk_combo_box_get_model (combobox);
+-    if (!gtk_tree_model_get_iter_first (model, &iter))
+-        return -1;
++    g_free (dialog->lang);
++    g_free (dialog->name);
+ 
+-    do {
+-        gint _value;
+-        gtk_tree_model_get (model, &iter, COLUMN_VALUE, &_value, -1);
+-        if (_value == value)
+-            return index;
+-        index++;
+-    } while (gtk_tree_model_iter_next (model, &iter));
+-    return -1;
++    g_free (dialog->section);
++    g_object_unref (dialog->store);
++    g_slice_free (SetupDialog, dialog);
+ }
+ 
+ static void
+ start (const gchar *engine_name)
+ {
+     IBusBus *bus;
+-    gchar **strv, *lang, *name;
+-    GtkBuilder *builder;
+-    GtkWidget *dialog;
+-    GtkWidget *combobox_underline, *combobox_orientation;
+-    GtkWidget *checkbutton_foreground, *checkbutton_background;
+-    GtkWidget *treeview;
+-    GtkListStore *store;
++    IBusConfig *config;
++    gchar **strv, *lang, *name, *section;
++    SetupDialog *dialog;
+     GObject *object;
+     GError *error = NULL;
+-    GtkCellRenderer *renderer;
+-    ConfigContext context;
+-    gchar *color;
+-    gboolean is_foreground_set, is_background_set;
+-    GdkColor foreground, background;
+-    gint underline;
+-    gint orientation;
+-    gint index;
+ 
+     ibus_init ();
+-
+-    bus = ibus_bus_new ();
+-    //g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
+-    ibus_m17n_init (bus);
++    ibus_m17n_init_common ();
+ 
+     strv = g_strsplit (engine_name, ":", 3);
+     
+@@ -386,150 +568,25 @@ start (const gchar *engine_name)
+     lang = strv[1];
+     name = strv[2];
+ 
+-    config = ibus_bus_get_config (bus);
+-    context.section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
+-
+-    builder = gtk_builder_new ();
+-    gtk_builder_set_translation_domain (builder, "ibus-m17n");
+-    gtk_builder_add_from_file (builder,
+-                               SETUPDIR "/ibus-m17n-preferences.ui",
+-                               &error);
+-    object = gtk_builder_get_object (builder, "dialog");
+-    dialog = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "checkbutton_foreground");
+-    checkbutton_foreground = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "colorbutton_foreground");
+-    context.colorbutton_foreground = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "checkbutton_background");
+-    checkbutton_background = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "colorbutton_background");
+-    context.colorbutton_background = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "combobox_underline");
+-    combobox_underline = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "combobox_orientation");
+-    combobox_orientation = GTK_WIDGET(object);
+-    object = gtk_builder_get_object (builder, "treeviewMimConfig");
+-    treeview = GTK_WIDGET(object);
+-
+-    /* General -> Pre-edit Appearance */
+-    /* foreground color of pre-edit buffer */
+-    is_foreground_set = FALSE;
+-    color_to_gdk (PREEDIT_FOREGROUND, &foreground);
+-    if (ibus_m17n_config_get_string (config,
+-                                     context.section,
+-                                     "preedit_foreground",
+-                                     &color)) {
+-        if (g_strcmp0 (color, "none") != 0 &&
+-            gdk_color_parse (color, &foreground))
+-            is_foreground_set = TRUE;
+-        g_free (color);
+-    }
++    bus = ibus_bus_new ();
++    //g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
+ 
+-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton_foreground),
+-                                  is_foreground_set);
+-    g_signal_connect (checkbutton_foreground, "toggled",
+-                      G_CALLBACK(on_foreground_toggled),
+-                      &context);
+-    gtk_widget_set_sensitive (context.colorbutton_foreground,
+-                              is_foreground_set);
+-    gtk_color_button_set_color
+-        (GTK_COLOR_BUTTON(context.colorbutton_foreground),
+-         &foreground);
+-    g_signal_connect (context.colorbutton_foreground, "color-set",
+-                      G_CALLBACK(on_foreground_color_set), &context);
++    config = ibus_bus_get_config (bus);
++    dialog = setup_dialog_new (config, lang, name);
+ 
+-    
+-    /* background color of pre-edit buffer */
+-    is_background_set = FALSE;
+-    color_to_gdk (PREEDIT_BACKGROUND, &background);
+-    if (ibus_m17n_config_get_string (config,
+-                                     context.section,
+-                                     "preedit_background",
+-                                     &color)) {
+-        if (g_strcmp0 (color, "none") != 0 &&
+-            gdk_color_parse (color, &background))
+-            is_background_set = TRUE;
+-        g_debug ("preedit_background %d", is_background_set);
+-        g_free (color);
+-    }
+-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton_background),
+-                                  is_background_set);
+-    g_signal_connect (checkbutton_background, "toggled",
+-                      G_CALLBACK(on_background_toggled),
+-                      &context);
+-    gtk_widget_set_sensitive (context.colorbutton_background,
+-                              is_background_set);
+-    gtk_color_button_set_color
+-        (GTK_COLOR_BUTTON(context.colorbutton_background),
+-         &background);
+-    g_signal_connect (context.colorbutton_background, "color-set",
+-                      G_CALLBACK(on_background_color_set), &context);
++    g_strfreev (strv);
+ 
+-    /* underline of pre-edit buffer */
+-    renderer = gtk_cell_renderer_text_new ();
+-    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combobox_underline),
+-                                renderer, TRUE);
+-    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combobox_underline),
+-                                    renderer, "text", 0, NULL);
+-    if (!ibus_m17n_config_get_int (config,
+-                                   context.section,
+-                                   "preedit_underline",
+-                                   &underline))
+-        underline = IBUS_ATTR_UNDERLINE_NONE;
++    setup_dialog_load_config (dialog);
+ 
+-    index = get_combo_box_index_by_value (GTK_COMBO_BOX(combobox_underline),
+-                                              underline);
+-    gtk_combo_box_set_active (GTK_COMBO_BOX(combobox_underline), index);
+-    g_signal_connect (combobox_underline, "changed",
+-                      G_CALLBACK(on_underline_changed), &context);
++    gtk_widget_show_all (dialog->dialog);
++    gtk_dialog_run (GTK_DIALOG(dialog->dialog));
+ 
+-    /* General -> Other */
+-    renderer = gtk_cell_renderer_text_new ();
+-    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combobox_orientation),
+-                                renderer, TRUE);
+-    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combobox_orientation),
+-                                    renderer, "text", 0, NULL);
+-    if (!ibus_m17n_config_get_int (config,
+-                                   context.section,
+-                                   "lookup_table_orientation",
+-                                   &orientation))
+-        orientation = IBUS_ORIENTATION_SYSTEM;
+-
+-    index = get_combo_box_index_by_value (GTK_COMBO_BOX(combobox_orientation),
+-                                          orientation);
+-    gtk_combo_box_set_active (GTK_COMBO_BOX(combobox_orientation), index);
+-    g_signal_connect (combobox_orientation, "changed",
+-                      G_CALLBACK(on_orientation_changed), &context);
++    setup_dialog_save_config (dialog);
++    setup_dialog_free (dialog);
+ 
+-    /* Advanced -> m17n-lib configuration */
+-    store = gtk_list_store_new (NUM_COLS,
+-                                G_TYPE_STRING,
+-                                G_TYPE_STRING,
+-                                G_TYPE_STRING);
+-    insert_items (store, msymbol (lang), msymbol (name));
+-
+-    gtk_tree_view_set_model (GTK_TREE_VIEW(treeview), GTK_TREE_MODEL (store));
+-    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1,
+-                                                 "Key",
+-                                                 gtk_cell_renderer_text_new (),
+-                                                 "text", COLUMN_KEY, NULL);
+-    g_object_set (treeview, "has-tooltip", TRUE, NULL);
+-    g_signal_connect (treeview, "query-tooltip", G_CALLBACK(on_query_tooltip),
+-                      NULL);
+-
+-    context.language = msymbol (lang);
+-    context.name = msymbol (name);
+-    context.store = store;
+-    renderer = gtk_cell_renderer_text_new ();
+-    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1,
+-                                                 "Value",
+-                                                 renderer,
+-                                                 "text", COLUMN_VALUE, NULL);
+-    g_object_set (renderer, "editable", TRUE, NULL);
+-    g_signal_connect (renderer, "edited", G_CALLBACK(on_edited), &context);
++    g_object_unref (bus);
+ 
+-    gtk_widget_show_all (dialog);
+-    gtk_dialog_run (GTK_DIALOG(dialog));
++    M17N_FINI ();
+ }
+ 
+ int
+-- 
+1.7.6.1
+
diff --git a/ibus-m17n-virtkbd.patch b/ibus-m17n-virtkbd.patch
index f26c9de..ad70c1c 100644
--- a/ibus-m17n-virtkbd.patch
+++ b/ibus-m17n-virtkbd.patch
@@ -1,18 +1,20 @@
-From 1bde900422ed9ed7f06962404d5e689b297ad0b2 Mon Sep 17 00:00:00 2001
+From 5ec645b395e81cd804f50e5bcd6c21e92d257fbe Mon Sep 17 00:00:00 2001
 From: Daiki Ueno <ueno at unixuser.org>
 Date: Wed, 31 Aug 2011 18:28:48 +0900
-Subject: [PATCH 5/5] Support virtual keyboard.
+Subject: [PATCH 5/6] Support virtual keyboard.
 
 ---
- configure.ac          |   17 ++++
- src/Makefile.am       |    7 ++
- src/default.xml.in.in |  111 +++++++++++++++++++++++
- src/engine.c          |   40 +++++++++
- src/m17nutil.c        |   10 ++-
- src/m17nutil.h        |    3 +
- src/virtkbd.c         |  233 +++++++++++++++++++++++++++++++++++++++++++++++++
- src/virtkbd.h         |   31 +++++++
- 8 files changed, 451 insertions(+), 1 deletions(-)
+ configure.ac                 |   17 +++
+ src/Makefile.am              |    7 ++
+ src/default.xml.in.in        |  111 ++++++++++++++++++++
+ src/engine.c                 |   66 ++++++++++++
+ src/ibus-m17n-preferences.ui |   16 +++
+ src/m17nutil.c               |   59 +++++++++++-
+ src/m17nutil.h               |   11 ++
+ src/setup.c                  |   26 +++++
+ src/virtkbd.c                |  233 ++++++++++++++++++++++++++++++++++++++++++
+ src/virtkbd.h                |   31 ++++++
+ 10 files changed, 576 insertions(+), 1 deletions(-)
  create mode 100644 src/virtkbd.c
  create mode 100644 src/virtkbd.h
 
@@ -195,7 +197,7 @@ index 8192878..47053ae 100644
 +	</engine>
  </engines>
 diff --git a/src/engine.c b/src/engine.c
-index dcff0c7..c8378a3 100644
+index dcff0c7..1e6bd1b 100644
 --- a/src/engine.c
 +++ b/src/engine.c
 @@ -7,6 +7,7 @@
@@ -220,24 +222,39 @@ index dcff0c7..c8378a3 100644
      IBusPropList    *prop_list;
  };
  
-@@ -34,6 +38,7 @@ struct _IBusM17NEngineClass {
+@@ -34,6 +38,8 @@ struct _IBusM17NEngineClass {
      guint preedit_background;
      gint preedit_underline;
      gint lookup_table_orientation;
 +    gchar *virtual_keyboard;
++    gboolean virtual_keyboard_enabled;
  
      MInputMethod *im;
  };
-@@ -290,6 +295,8 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+@@ -256,6 +262,7 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+     klass->preedit_background = INVALID_COLOR;
+     klass->preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
+     klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
++    klass->virtual_keyboard_enabled = FALSE;
+ 
+     engine_config = ibus_m17n_get_engine_config (engine_name);
+     g_free (engine_name);
+@@ -290,6 +297,14 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
                                     &klass->lookup_table_orientation))
          klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
  
++    if (!ibus_m17n_config_get_boolean (config,
++                                       klass->config_section,
++                                       "virtual_keyboard_enabled",
++                                       &klass->virtual_keyboard_enabled))
++        klass->virtual_keyboard_enabled = FALSE;
++
 +    klass->virtual_keyboard = engine_config->virtual_keyboard;
 +
      ibus_m17n_engine_config_free (engine_config);
  
      g_signal_connect (config, "value-changed",
-@@ -346,6 +353,7 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+@@ -346,6 +361,7 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
  {
      IBusText* label;
      IBusText* tooltip;
@@ -245,39 +262,44 @@ index dcff0c7..c8378a3 100644
  
      m17n->prop_list = ibus_prop_list_new ();
      g_object_ref_sink (m17n->prop_list);
-@@ -378,6 +386,22 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+@@ -378,6 +394,24 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
      ibus_prop_list_append (m17n->prop_list, m17n->setup_prop);
  #endif  /* HAVE_SETUP */
  
-+    if (klass->virtual_keyboard != NULL) {
-+        label = ibus_text_new_from_string ("On-screen Keyboard");
-+        tooltip = ibus_text_new_from_string ("Show on-screen keyboard");
-+        m17n->virtkbd_prop = ibus_property_new ("virtual-keyboard",
-+                                                PROP_TYPE_NORMAL,
-+                                                label,
-+                                                "input-keyboard",
-+                                                tooltip,
-+                                                TRUE,
-+                                                TRUE,
-+                                                PROP_STATE_UNCHECKED,
-+                                                NULL);
-+        g_object_ref_sink (m17n->virtkbd_prop);
-+        ibus_prop_list_append (m17n->prop_list, m17n->virtkbd_prop);
-+    }
++    label = ibus_text_new_from_string ("On-screen Keyboard");
++    tooltip = ibus_text_new_from_string ("Show on-screen keyboard");
++    m17n->virtkbd_prop = ibus_property_new ("virtual-keyboard",
++                                            PROP_TYPE_NORMAL,
++                                            label,
++                                            "input-keyboard",
++                                            tooltip,
++                                            TRUE,
++                                            FALSE,
++                                            PROP_STATE_UNCHECKED,
++                                            NULL);
++    g_object_ref_sink (m17n->virtkbd_prop);
++    ibus_prop_list_append (m17n->prop_list, m17n->virtkbd_prop);
++
++    if (klass->virtual_keyboard_enabled &&
++        klass->virtual_keyboard != NULL)
++        ibus_property_set_visible (m17n->virtkbd_prop, TRUE);
 +
      m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
      g_object_ref_sink (m17n->table);
      m17n->context = NULL;
-@@ -439,6 +463,8 @@ ibus_m17n_engine_constructor (GType                   type,
+@@ -463,6 +497,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
      }
+ #endif  /* HAVE_SETUP */
  
-     m17n->context = minput_create_ic (klass->im, m17n);
-+    m17n->virtkbd = ibus_m17n_virtual_keyboard_new ((IBusEngine *)m17n,
-+                                            klass->virtual_keyboard);
- 
-     return (GObject *) m17n;
- }
-@@ -473,6 +499,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
++    if (m17n->virtkbd_prop) {
++        g_object_unref (m17n->virtkbd_prop);
++        m17n->virtkbd_prop = NULL;
++    }
++
+     if (m17n->table) {
+         g_object_unref (m17n->table);
+         m17n->table = NULL;
+@@ -473,6 +512,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
          m17n->context = NULL;
      }
  
@@ -289,38 +311,85 @@ index dcff0c7..c8378a3 100644
      IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)m17n);
  }
  
-@@ -705,6 +736,8 @@ ibus_m17n_engine_enable (IBusEngine *engine)
+@@ -705,6 +749,9 @@ ibus_m17n_engine_enable (IBusEngine *engine)
         input context that we will use surrounding-text. */
      ibus_engine_get_surrounding_text (engine, NULL, NULL, NULL);
  #endif  /* HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT */
 +
-+    ibus_m17n_virtual_keyboard_enable (m17n->virtkbd);
++    if (m17n->virtkbd)
++        ibus_m17n_virtual_keyboard_enable (m17n->virtkbd);
  }
  
  static void
-@@ -714,6 +747,8 @@ ibus_m17n_engine_disable (IBusEngine *engine)
+@@ -714,6 +761,9 @@ ibus_m17n_engine_disable (IBusEngine *engine)
  
      ibus_m17n_engine_focus_out (engine);
      parent_class->disable (engine);
 +
-+    ibus_m17n_virtual_keyboard_disable (m17n->virtkbd);
++    if (m17n->virtkbd)
++        ibus_m17n_virtual_keyboard_disable (m17n->virtkbd);
  }
  
  static void
-@@ -776,6 +811,11 @@ ibus_m17n_engine_property_activate (IBusEngine  *engine,
+@@ -776,6 +826,22 @@ ibus_m17n_engine_property_activate (IBusEngine  *engine,
      }
  #endif  /* HAVE_SETUP */
  
 +#ifdef HAVE_EEKBOARD
-+    if (g_strcmp0 (prop_name, "virtual-keyboard") == 0)
++    if (g_strcmp0 (prop_name, "virtual-keyboard") == 0) {
++        /* virtual keyboard is not initialized until a user activates
++           the "virtual-keyboard" prop for the first time */
++        if (m17n->virtkbd == NULL) {
++            IBusM17NEngineClass *klass =
++                (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
++            
++            m17n->virtkbd =
++                ibus_m17n_virtual_keyboard_new ((IBusEngine *)m17n,
++                                                klass->virtual_keyboard);
++        }
 +        ibus_m17n_virtual_keyboard_toggle_display (m17n->virtkbd);
++    }
 +#endif  /*  HAVE_EEKBOARD */
 +
      parent_class->property_activate (engine, prop_name, prop_state);
  }
  
+diff --git a/src/ibus-m17n-preferences.ui b/src/ibus-m17n-preferences.ui
+index a46ab49..bca034d 100644
+--- a/src/ibus-m17n-preferences.ui
++++ b/src/ibus-m17n-preferences.ui
+@@ -192,6 +192,7 @@
+                             <child>
+                               <object class="GtkTable" id="table2">
+                                 <property name="visible">True</property>
++                                <property name="n_rows">2</property>
+                                 <property name="n_columns">2</property>
+                                 <child>
+                                   <object class="GtkLabel" id="label9">
+@@ -210,6 +211,21 @@
+                                     <property name="right_attach">2</property>
+                                   </packing>
+                                 </child>
++                                <child>
++                                  <object class="GtkCheckButton" id="checkbutton_virtkbd">
++                                    <property name="label" translatable="yes">Enable Virtual Keyboard</property>
++                                    <property name="visible">True</property>
++                                    <property name="can_focus">True</property>
++                                    <property name="receives_default">False</property>
++                                    <property name="draw_indicator">True</property>
++                                  </object>
++                                  <packing>
++                                    <property name="left_attach">0</property>
++                                    <property name="right_attach">2</property>
++                                    <property name="top_attach">1</property>
++                                    <property name="bottom_attach">2</property>
++                                  </packing>
++                                </child>
+                               </object>
+                             </child>
+                           </object>
 diff --git a/src/m17nutil.c b/src/m17nutil.c
-index 94a6891..a4e4b09 100644
+index 94a6891..2143e54 100644
 --- a/src/m17nutil.c
 +++ b/src/m17nutil.c
 @@ -18,7 +18,8 @@ typedef enum {
@@ -354,8 +423,61 @@ index 94a6891..a4e4b09 100644
          g_warning ("<engine> element contains invalid element <%s>",
                     sub_node->name);
      }
+@@ -494,3 +502,52 @@ ibus_m17n_config_get_int (IBusConfig  *config,
+     return FALSE;
+ #endif  /* !IBUS_CHECK_VERSION(1,3,99) */
+ }
++
++void
++ibus_m17n_config_set_boolean (IBusConfig  *config,
++                              const gchar *section,
++                              const gchar *name,
++                              gboolean     value)
++{
++#if IBUS_CHECK_VERSION(1,3,99)
++    ibus_config_set_value (config, section, name, g_variant_new_boolean (value));
++#else
++    GValue v = { 0 };
++
++    g_value_init (&v, G_TYPE_BOOLEAN);
++    g_value_set_boolean (&v, value);
++    ibus_config_set_value (config, section, name, &v);
++#endif  /* !IBUS_CHECK_VERSION(1,3,99) */
++}
++
++gboolean
++ibus_m17n_config_get_boolean (IBusConfig  *config,
++                              const gchar *section,
++                              const gchar *name,
++                              gboolean    *result)
++{
++#if IBUS_CHECK_VERSION(1,3,99)
++    GVariant *value = NULL;
++
++    g_return_val_if_fail (result != NULL, FALSE);
++
++    value = ibus_config_get_value (config, section, name);
++    if (value) {
++        *result = g_variant_get_boolean (value);
++        g_variant_unref (value);
++        return TRUE;
++    }
++    return FALSE;
++#else
++    GValue value = { 0 };
++
++    g_return_val_if_fail (result != NULL, FALSE);
++
++    if (ibus_config_get_value (config, section, name, &value)) {
++        *result = g_value_get_boolean (&value);
++        g_value_unset (&value);
++        return TRUE;
++    }
++    return FALSE;
++#endif  /* !IBUS_CHECK_VERSION(1,3,99) */
++}
 diff --git a/src/m17nutil.h b/src/m17nutil.h
-index 21b1bb9..f138c8b 100644
+index 21b1bb9..9c3fca8 100644
 --- a/src/m17nutil.h
 +++ b/src/m17nutil.h
 @@ -25,6 +25,9 @@ struct _IBusM17NEngineConfig {
@@ -368,6 +490,84 @@ index 21b1bb9..f138c8b 100644
  };
  
  typedef struct _IBusM17NEngineConfig IBusM17NEngineConfig;
+@@ -56,4 +59,12 @@ gboolean       ibus_m17n_config_get_int    (IBusConfig  *config,
+                                             const gchar *section,
+                                             const gchar *name,
+                                             gint        *result);
++void           ibus_m17n_config_set_boolean (IBusConfig  *config,
++                                             const gchar *section,
++                                             const gchar *name,
++                                             gboolean     value);
++gboolean       ibus_m17n_config_get_boolean (IBusConfig  *config,
++                                             const gchar *section,
++                                             const gchar *name,
++                                             gboolean    *result);
+ #endif
+diff --git a/src/setup.c b/src/setup.c
+index 30386df..1c534d6 100644
+--- a/src/setup.c
++++ b/src/setup.c
+@@ -25,6 +25,7 @@ struct _SetupDialog {
+     GtkWidget *colorbutton_foreground;
+     GtkWidget *checkbutton_background;
+     GtkWidget *colorbutton_background;
++    GtkWidget *checkbutton_virtkbd;
+     GtkWidget *treeview;
+     GtkListStore *store;
+ 
+@@ -322,6 +323,15 @@ setup_dialog_load_config (SetupDialog *dialog)
+     gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_orientation),
+                               index);
+ 
++    if (!ibus_m17n_config_get_boolean (dialog->config,
++                                       dialog->section,
++                                       "virtual_keyboard_enabled",
++                                       &bvalue))
++        bvalue = FALSE;
++
++    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_virtkbd),
++                                  bvalue);
++
+     /* Advanced -> m17n-lib configuration */
+     dialog->store = gtk_list_store_new (NUM_COLS,
+                                         G_TYPE_STRING,
+@@ -404,6 +414,17 @@ save_choice (SetupDialog *dialog,
+     ibus_m17n_config_set_int (dialog->config, dialog->section, name, active);
+ }
+ 
++static void
++save_toggle (SetupDialog     *dialog,
++             GtkToggleButton *togglebutton,
++             const gchar     *name)
++{
++    ibus_m17n_config_set_boolean (dialog->config,
++                                  dialog->section,
++                                  name,
++                                  gtk_toggle_button_get_active (togglebutton));
++}
++
+ static gboolean
+ save_m17n_options (SetupDialog *dialog)
+ {
+@@ -486,6 +507,9 @@ setup_dialog_save_config (SetupDialog *dialog)
+     save_choice (dialog,
+                  GTK_COMBO_BOX(dialog->combobox_orientation),
+                  "lookup_table_orientation");
++    save_toggle (dialog,
++                 GTK_TOGGLE_BUTTON(dialog->checkbutton_virtkbd),
++                 "virtual_keyboard_enabled");
+     save_m17n_options (dialog);
+ }
+ 
+@@ -528,6 +552,8 @@ setup_dialog_new (IBusConfig  *config,
+     dialog->combobox_underline = GTK_WIDGET(object);
+     object = gtk_builder_get_object (builder, "combobox_orientation");
+     dialog->combobox_orientation = GTK_WIDGET(object);
++    object = gtk_builder_get_object (builder, "checkbutton_virtkbd");
++    dialog->checkbutton_virtkbd = GTK_WIDGET(object);
+     object = gtk_builder_get_object (builder, "treeview_mim_config");
+     dialog->treeview = GTK_WIDGET(object);
+ 
 diff --git a/src/virtkbd.c b/src/virtkbd.c
 new file mode 100644
 index 0000000..9baf971
diff --git a/ibus-m17n-xkb-options.patch b/ibus-m17n-xkb-options.patch
index 49d29e6..ab09cf0 100644
--- a/ibus-m17n-xkb-options.patch
+++ b/ibus-m17n-xkb-options.patch
@@ -1,7 +1,7 @@
 From 0cc2abaab50e6668e525da093ef12ed0277d5c21 Mon Sep 17 00:00:00 2001
 From: Daiki Ueno <ueno at unixuser.org>
 Date: Mon, 8 Aug 2011 09:59:28 +0900
-Subject: [PATCH 3/5] Set XKB layout option via default.xml.
+Subject: [PATCH 3/6] Set XKB layout option via default.xml.
 
 ---
  src/default.xml.in.in |    9 +++++++++
diff --git a/ibus-m17n-xx-icon-symbol.patch b/ibus-m17n-xx-icon-symbol.patch
index 31757ae..42e70fd 100644
--- a/ibus-m17n-xx-icon-symbol.patch
+++ b/ibus-m17n-xx-icon-symbol.patch
@@ -1,7 +1,7 @@
 From 4cad5fe6e36be9cbfe0d50f683b489e9202c7d53 Mon Sep 17 00:00:00 2001
 From: Daiki Ueno <ueno at unixuser.org>
 Date: Wed, 31 Aug 2011 11:44:46 +0900
-Subject: [PATCH 4/5] Supply hotkeys and symbol in engine desc.
+Subject: [PATCH 4/6] Supply hotkeys and symbol in engine desc.
 
 ---
  configure.ac          |    3 +
@@ -29,8 +29,8 @@ index 927d382..23102c4 100644
  AC_CONFIG_FILES([ po/Makefile.in
 diff --git a/m4/.gitignore b/m4/.gitignore
 index 0f4126c..e28d185 100644
---- a/m4/.gitignore
-+++ b/m4/.gitignore
+#--- a/m4/.gitignore
+#+++ b/m4/.gitignore
 @@ -1 +1,3 @@
  *.m4
 +!ibus.m4
diff --git a/ibus-m17n.spec b/ibus-m17n.spec
index d94def8..92f0516 100644
--- a/ibus-m17n.spec
+++ b/ibus-m17n.spec
@@ -17,7 +17,7 @@
 
 Name:       ibus-m17n
 Version:    1.3.3
-Release:    1%{?dist}
+Release:    2%{?dist}
 Summary:    The M17N engine for IBus platform
 License:    GPLv2+
 Group:      System Environment/Libraries
@@ -26,9 +26,11 @@ Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
 
 #Patch0:     ibus-m17n-HEAD.patch
 Patch1:     ibus-m17n-default-xml-override.patch
-Patch2:     ibus-m17n-xkb-options.patch
-Patch3:     ibus-m17n-xx-icon-symbol.patch
-Patch4:     ibus-m17n-virtkbd.patch
+Patch2:	    ibus-m17n-setup-refactor.patch
+Patch3:     ibus-m17n-xkb-options.patch
+Patch4:     ibus-m17n-xx-icon-symbol.patch
+Patch5:     ibus-m17n-virtkbd.patch
+Patch6:	    ibus-m17n-iok.patch
 
 # The following BR is for autogen and not necessary when packging
 # released tarballs.
@@ -58,11 +60,13 @@ the input table maps from m17n-db.
 %setup -q
 #patch0 -p1 -b .HEAD
 %patch1 -p1 -b .default-xml-override
-%patch2 -p1 -b .xkb-options
+%patch2 -p1 -b .setup-refactor
+%patch3 -p1 -b .xkb-options
 # do not apply patch to m4/.gitignore
-sed -i 's!^[-+][-+][-+] .*/m4/\.gitignore!#\0!' %PATCH3
-%patch3 -p1 -b .xx-icon-symbol
-%patch4 -p1 -b .virtkbd
+sed -i 's!^[-+][-+][-+] .*/m4/\.gitignore!#\0!' %PATCH4
+%patch4 -p1 -b .xx-icon-symbol
+%patch5 -p1 -b .virtkbd
+%patch6 -p1 -b .iok
 NOCONFIGURE=1 ./autogen.sh
 
 %build
@@ -84,6 +88,9 @@ make DESTDIR=${RPM_BUILD_ROOT} install
 %{_datadir}/ibus/component/*
 
 %changelog
+* Fri Sep  2 2011 Daiki Ueno <dueno at redhat.com> - 1.3.3-2
+- Revive iok patch.
+
 * Thu Sep  1 2011 Daiki Ueno <dueno at redhat.com> - 1.3.3-1
 - New upstream release.
 - Add ibus-m17n-default-xml-override.patch.


More information about the i18n-bugs mailing list