From 74c5abeda032a692588cf41d53cbae408f48c989 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 2 Sep 2011 12:02:57 +0900 Subject: [PATCH] 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(-) create mode 100644 ibus-m17n-iok.patch create mode 100644 ibus-m17n-setup-refactor.patch 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 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 +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 +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 @@ + automatic + automatic + +- ++ + True + True ++ True + both + + +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 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 + 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 @@ + + + True ++ 2 + 2 + + +@@ -210,6 +211,21 @@ + 2 + + ++ ++ ++ Enable Virtual Keyboard ++ True ++ True ++ False ++ True ++ ++ ++ 0 ++ 2 ++ 1 ++ 2 ++ ++ + + + 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 (" 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 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 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 - 1.3.3-2 +- Revive iok patch. + * Thu Sep 1 2011 Daiki Ueno - 1.3.3-1 - New upstream release. - Add ibus-m17n-default-xml-override.patch.