/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Copyright (C) 2004 TAM (Teppei Tamra) * Copyright (C) 2004 Hiroyuki Ikezoe * Copyright (C) 2004 Takuro Ashie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * Based on scim-hangul. * Copyright (c) 2004 James Su <suzhe@turbolinux.com.cn> */ #define Uses_SCIM_CONFIG_BASE #include <gtk/gtk.h> #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <scim.h> #include <gtk/scimkeyselection.h> #include "honoka_def.h" #include "../plugins/honoka_plugin_def.h" #ifdef HAVE_GETTEXT #include <libintl.h> #define _(String) dgettext(GETTEXT_PACKAGE,String) #define N_(String) (String) #else #define _(String) (String) #define N_(String) (String) #define bindtextdomain(Package,Directory) #define textdomain(domain) #define bind_textdomain_codeset(domain,codeset) #endif using namespace scim; #define scim_module_init honoka_imengine_setup_LTX_scim_module_init #define scim_module_exit honoka_imengine_setup_LTX_scim_module_exit #define scim_setup_module_create_ui honoka_imengine_setup_LTX_scim_setup_module_create_ui #define scim_setup_module_get_category honoka_imengine_setup_LTX_scim_setup_module_get_category #define scim_setup_module_get_name honoka_imengine_setup_LTX_scim_setup_module_get_name #define scim_setup_module_get_description honoka_imengine_setup_LTX_scim_setup_module_get_description #define scim_setup_module_load_config honoka_imengine_setup_LTX_scim_setup_module_load_config #define scim_setup_module_save_config honoka_imengine_setup_LTX_scim_setup_module_save_config #define scim_setup_module_query_changed honoka_imengine_setup_LTX_scim_setup_module_query_changed static GtkWidget * create_setup_window (); static void load_config (const ConfigPointer &config); static void save_config (const ConfigPointer &config); static bool query_changed (); // Module Interface. extern "C" { void scim_module_init (void) { bindtextdomain (GETTEXT_PACKAGE, HONOKA_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); } void scim_module_exit (void) { } GtkWidget * scim_setup_module_create_ui (void) { return create_setup_window (); } String scim_setup_module_get_category (void) { return String ("IMEngine"); } String scim_setup_module_get_name (void) { return String (_("Honoka")); } String scim_setup_module_get_description (void) { return String (_("A Honoka IMEngine Module.")); } void scim_setup_module_load_config (const ConfigPointer &config) { load_config (config); } void scim_setup_module_save_config (const ConfigPointer &config) { save_config (config); } bool scim_setup_module_query_changed () { return query_changed (); } } // extern "C" // Internal data structure struct KeyboardConfigData { const char *key; String data; const char *label; const char *title; const char *tooltip; GtkWidget *entry; GtkWidget *button; }; struct KeyboardConfigPage { const char *label; KeyboardConfigData *data; }; struct ListData { GtkWidget *widget; String name; gchar *label; }; // Internal data declaration. //static bool __config_use_kana = false; static String __config_server = HONOKA_DEFAULT_JSERVER; static String __config_wnn_rc = HONOKA_DEFAULT_WNNENVRC; static String __config_servertype = HONOKA_DEFAULT_JSERVERTYPE; static String __config_preeditor = HONOKA_DEFAULT_DEFAULT_PREEDITOR; static bool __config_yosoku = HONOKA_DEFAULT_WNNYOSOKU; static bool __config_numkeyselect = HONOKA_DEFAULT_NUMKEY_SELECT; static bool __config_autoconversion = HONOKA_DEFAULT_AUTO_CONVERSION; static int __config_alp = HONOKA_DEFAULT_ALP; static String __config_romkan_table = HONOKA_DEFAULT_ROMKAN_TABLE_FILE; static bool __have_changed = true; //static GtkWidget * __widget_use_kana = 0; static GtkWidget * __widget_server = 0; static GtkWidget * __widget_servertype = 0; static GtkWidget * __widget_preeditor = 0; static GtkWidget * __widget_wnn_rc = 0; static GtkWidget * __widget_yosoku = 0; static GtkWidget * __widget_alp = 0; static GtkWidget * __widget_numkeyselect = 0; static GtkWidget * __widget_autoconversion = 0; static GtkWidget * __widget_romkan_table = 0; static GtkTooltips * __widget_tooltips = 0; static ListData __list_data [] = { { NULL, String("Wnn4"), N_("Wnn4 or FreeWnn"), }, { NULL, String("Wnn6"), N_("Wnn6"), }, { NULL, String("Wnn7"), N_("Wnn7"), }, { NULL, String("Wnn8"), N_("Wnn8"), }, { NULL, String("Romkan"), N_("Roma-Kana input"), }, { NULL, String("KanaInput"), N_("Kana input"), }, { NULL, String(), NULL, }, }; static KeyboardConfigData __config_keyboards_common [] = { { HONOKA_CONFIG_KEY_COMMIT, HONOKA_DEFAULT_KEY_COMMIT, N_("Commit keys:"), N_("Select commit keys"), N_("The key events to commit the preedit string. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_START, HONOKA_DEFAULT_KEY_CONVERSION_START, N_("Convert keys:"), N_("Select convert keys"), N_("The key events to convert the preedit string to kanji. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CANCEL, HONOKA_DEFAULT_KEY_CANCEL, N_("Cancel keys:"), N_("Select cancel keys"), N_("The key events to cancel preediting or converting. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_BACKSPACE, HONOKA_DEFAULT_KEY_BACKSPACE, N_("Backspace keys:"), N_("Select backspace keys"), N_("The key events to delete a character before caret. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_DELETE, HONOKA_DEFAULT_KEY_DELETE, N_("Delete keys:"), N_("Select delete keys"), N_("The key events to delete a character after caret. "), NULL, NULL, }, { NULL, "", NULL, NULL, NULL, NULL, NULL, }, }; static KeyboardConfigData __config_keyboards_caret [] = { { HONOKA_CONFIG_KEY_FORWARD, HONOKA_DEFAULT_KEY_FORWARD, N_("Move forward keys:"), N_("Select move caret forward keys"), N_("The key events to move the caret to forward. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_BACKWARD, HONOKA_DEFAULT_KEY_BACKWARD, N_("Move backward keys:"), N_("Select move caret backward keys"), N_("The key events to move the caret to backward. "), NULL, NULL, }, { NULL, "", NULL, NULL, NULL, NULL, NULL, }, }; static KeyboardConfigData __config_keyboards_segment [] = { { HONOKA_CONFIG_KEY_CONVERSION_FORWARD, HONOKA_DEFAULT_KEY_CONVERSION_FORWARD, N_("Next segment keys:"), N_("Select next segment keys"), N_("The key events to select next segment. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_BACKWARD, HONOKA_DEFAULT_KEY_CONVERSION_BACKWARD, N_("Previous segment keys:"), N_("Select previous segment keys"), N_("The key events to select previous segment. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_SHRINK, HONOKA_DEFAULT_KEY_CONVERSION_SHRINK, N_("Shrink segment keys:"), N_("Select shrink segment keys"), N_("The key events to shrink the selected segment. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_EXPAND, HONOKA_DEFAULT_KEY_CONVERSION_EXPAND, N_("Expand segment keys:"), N_("Select expand segment keys"), N_("The key events to expand the selected segment. "), NULL, NULL, }, { NULL, "", NULL, NULL, NULL, NULL, NULL, }, }; static KeyboardConfigData __config_keyboards_candidates [] = { { HONOKA_CONFIG_KEY_CONVERSION_NEXT, HONOKA_DEFAULT_KEY_CONVERSION_NEXT, N_("Next keys:"), N_("Select next candidate keys"), N_("The key events to select next candidate. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_PREV, HONOKA_DEFAULT_KEY_CONVERSION_PREV, N_("Previous keys:"), N_("Select previous candidate keys"), N_("The key events to select previous candidate. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_LOOKUPPOPUP, HONOKA_DEFAULT_KEY_LOOKUPPOPUP, N_("candidates list keys:"), N_("Select candidates list keys"), N_("The key events to popup candidates list. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_LOOKUPPAGEUP, HONOKA_DEFAULT_KEY_LOOKUPPAGEUP, N_("Page up keys:"), N_("Select page up candidates keys"), N_("The key events to select page up candidates. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_LOOKUPPAGEDOWN, HONOKA_DEFAULT_KEY_LOOKUPPAGEDOWN, N_("Page down keys:"), N_("Select page down candidates keys"), N_("The key events to select page down candidates. "), NULL, NULL, }, { NULL, "", NULL, NULL, NULL, NULL, NULL, }, }; static KeyboardConfigData __config_keyboards_other [] = { { HONOKA_CONFIG_KEY_AUTO_CONVERSION, HONOKA_DEFAULT_KEY_AUTO_CONVERSION, N_("auto conversion mode keys:"), N_("Select auto conversion mode keys"), N_("The key events to change auto conversion mode. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_SELECT_YOSOKU, HONOKA_DEFAULT_KEY_SELECT_YOSOKU, N_("Yosoku keys:"), N_("Select yosoku keys"), N_("The key events to select from completion list. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_IKEIJI, HONOKA_DEFAULT_KEY_CONVERSION_IKEIJI, N_("Convert to ikeiji keys:"), N_("Select ikeiji keys"), N_("The key events to convert the selected candidate to ikei-kanji. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERSION_RENSOU, HONOKA_DEFAULT_KEY_CONVERSION_RENSOU, N_("Convert to rensou keys:"), N_("Select rensou keys"), N_("The key events to convert the selected candidate to the associated acceptation string. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERT_HIRAGANA, HONOKA_DEFAULT_KEY_CONVERT_HIRAGANA, N_("Convert to HIRAGANA keys:"), N_("Select convert to HIRAGANA keys"), N_("The key events to convert the selected candidate or the preedit string to HIRAGANA. "), NULL, NULL, }, { HONOKA_CONFIG_KEY_CONVERT_KATAKANA, HONOKA_DEFAULT_KEY_CONVERT_KATAKANA, N_("Convert to KATAKANA keys:"), N_("Select convert to KATAGANA keys"), N_("The key events to convert the selected candidate or the preedit string to KATAKANA. "), NULL, NULL, }, { NULL, "", NULL, NULL, NULL, NULL, NULL, }, }; static struct KeyboardConfigPage __key_conf_pages[] = { {N_("Common keys"), __config_keyboards_common}, {N_("Preedit keys"), __config_keyboards_caret}, {N_("Candidates keys"), __config_keyboards_candidates}, {N_("Other function keys"), __config_keyboards_other}, }; static unsigned int __key_conf_pages_num = sizeof (__key_conf_pages) / sizeof (KeyboardConfigPage); static void on_default_editable_changed (GtkEditable *editable, gpointer user_data); static void on_default_number_changed (GtkEditable *editable, gpointer user_data); static void on_default_toggle_button_toggled (GtkToggleButton *togglebutton, gpointer user_data); static void on_default_key_selection_clicked (GtkButton *button, gpointer user_data); static void on_default_file_selection_button (GtkButton *button, gpointer user_data); static void on_default_list_changed (GtkList *list, GtkWidget *widget, gpointer user_data); static void setup_widget_value (void); static GtkWidget * create_options_page () { GtkWidget *vbox, *table, *label, *button, *button2; unsigned int i; GList *list = NULL; vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); for(i = 0;__list_data[i].label;i ++) { __list_data[i].widget = gtk_list_item_new_with_label(_(__list_data[i].label)); gtk_widget_show (__list_data[i].widget); } //__widget_use_kana = gtk_check_button_new_with_mnemonic (_("Use _Kana Table")); //gtk_widget_show (__widget_use_kana); //gtk_box_pack_start (GTK_BOX (vbox), __widget_use_kana, FALSE, FALSE, 4); //gtk_container_set_border_width (GTK_CONTAINER (__widget_use_kana), 4); // Connect all signals. //g_signal_connect ((gpointer) __widget_use_kana, "toggled", // G_CALLBACK (on_default_toggle_button_toggled), // &__config_use_kana); table = gtk_table_new (3, 6, FALSE); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); gtk_widget_show (table); /* server */ label = gtk_label_new_with_mnemonic (_("_Server: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_server = gtk_entry_new (); gtk_widget_show (__widget_server); gtk_table_attach (GTK_TABLE (table), __widget_server, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_server); if (!__widget_tooltips) __widget_tooltips = gtk_tooltips_new(); gtk_tooltips_set_tip (__widget_tooltips, __widget_server, _("input the server name to connect."), NULL); /* wnnenvrc */ label = gtk_label_new_with_mnemonic (_("_wnnenvrc: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_wnn_rc = gtk_entry_new (); gtk_widget_show (__widget_wnn_rc); gtk_table_attach (GTK_TABLE (table), __widget_wnn_rc, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_wnn_rc); button = gtk_button_new_with_label (_("...")); gtk_widget_show (button); gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); //gtk_label_set_mnemonic_widget (GTK_LABEL (label), button); gtk_tooltips_set_tip (__widget_tooltips, __widget_wnn_rc, _("input the path of wnnenvrc."), NULL); /* servertype */ label = gtk_label_new_with_mnemonic (_("Server_type: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); list = g_list_append(list,__list_data[0].widget); list = g_list_append(list,__list_data[1].widget); list = g_list_append(list,__list_data[2].widget); list = g_list_append(list,__list_data[3].widget); __widget_servertype = gtk_list_new (); gtk_list_append_items(GTK_LIST(__widget_servertype),list); gtk_widget_show (__widget_servertype); gtk_table_attach (GTK_TABLE (table), __widget_servertype, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __list_data[0].widget); gtk_tooltips_set_tip (__widget_tooltips, __widget_servertype, _("select the server type from Wnn4 / Wnn6 / Wnn7."), NULL); /* default preeditor */ label = gtk_label_new_with_mnemonic (_("Default_PreEditor: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); list = NULL; list = g_list_append(list,__list_data[4].widget); list = g_list_append(list,__list_data[5].widget); __widget_preeditor = gtk_list_new (); gtk_list_append_items(GTK_LIST(__widget_preeditor),list); gtk_widget_show (__widget_preeditor); gtk_table_attach (GTK_TABLE (table), __widget_preeditor, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __list_data[3].widget); gtk_tooltips_set_tip (__widget_tooltips, __widget_preeditor, _("select the default preeditor."), NULL); /* ALP */ label = gtk_label_new_with_mnemonic (_("_Auto candidates popup: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); GtkAdjustment* aj; aj = (GtkAdjustment *) gtk_adjustment_new(0,-1,10,1,1,1); __widget_alp = gtk_spin_button_new(aj,1,0); gtk_widget_show (__widget_alp); gtk_table_attach (GTK_TABLE (table), __widget_alp, 1, 2, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_alp); gtk_tooltips_set_tip (__widget_tooltips, __widget_alp, _("set the count of conversion until displaying the list of lookup result automatically."), NULL); /* numkeyselection */ label = gtk_label_new_with_mnemonic (_("_NumKey selection: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_numkeyselect = gtk_check_button_new(); gtk_widget_show (__widget_numkeyselect); gtk_table_attach (GTK_TABLE (table), __widget_numkeyselect, 1, 2, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_numkeyselect); gtk_tooltips_set_tip (__widget_tooltips, __widget_numkeyselect, _("If you use the candidate selection by numkey, check this."), NULL); /* auto conversion */ label = gtk_label_new_with_mnemonic (_("Auto _conversion: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_autoconversion = gtk_check_button_new(); gtk_widget_show (__widget_autoconversion); gtk_table_attach (GTK_TABLE (table), __widget_autoconversion, 1, 2, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_autoconversion); gtk_tooltips_set_tip (__widget_tooltips, __widget_autoconversion, _("If you set default to the auto conversion mode use, check this."), NULL); /* completion */ label = gtk_label_new_with_mnemonic (_("_YOSOKU-input: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_yosoku = gtk_check_button_new(); gtk_widget_show (__widget_yosoku); gtk_table_attach (GTK_TABLE (table), __widget_yosoku, 1, 2, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_yosoku); gtk_tooltips_set_tip (__widget_tooltips, __widget_yosoku, _("if you use YOSOKU-input , check this."), NULL); // romkan_table label = gtk_label_new_with_mnemonic (_("_Roma-Kana table: ")); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); __widget_romkan_table = gtk_entry_new (); gtk_widget_show (__widget_romkan_table); gtk_table_attach (GTK_TABLE (table), __widget_romkan_table, 1, 2, 8, 9, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), __widget_romkan_table); button2 = gtk_button_new_with_label (_("...")); gtk_widget_show (button2); gtk_table_attach (GTK_TABLE (table), button2, 2, 3, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_tooltips_set_tip (__widget_tooltips, __widget_romkan_table, _("input the path of Roma-Kana convert table file."), NULL); /* connect all signals */ g_signal_connect ((gpointer) __widget_server, "changed", G_CALLBACK (on_default_editable_changed), &__config_server); g_signal_connect ((gpointer) __widget_wnn_rc, "changed", G_CALLBACK (on_default_editable_changed), &__config_wnn_rc); g_signal_connect ((gpointer) button, "clicked", G_CALLBACK (on_default_file_selection_button), __widget_wnn_rc); g_signal_connect ((gpointer) __widget_servertype, "select-child", G_CALLBACK (on_default_list_changed), &__config_servertype); g_signal_connect ((gpointer) __widget_preeditor, "select-child", G_CALLBACK (on_default_list_changed), &__config_preeditor); g_signal_connect ((gpointer) __widget_alp, "changed", G_CALLBACK (on_default_number_changed), &__config_alp); g_signal_connect ((gpointer) __widget_numkeyselect, "toggled", G_CALLBACK (on_default_toggle_button_toggled), &__config_numkeyselect); g_signal_connect ((gpointer) __widget_autoconversion, "toggled", G_CALLBACK (on_default_toggle_button_toggled), &__config_autoconversion); g_signal_connect ((gpointer) __widget_yosoku, "toggled", G_CALLBACK (on_default_toggle_button_toggled), &__config_yosoku); g_signal_connect ((gpointer) __widget_romkan_table, "changed", G_CALLBACK (on_default_editable_changed), &__config_romkan_table); g_signal_connect ((gpointer) button2, "clicked", G_CALLBACK (on_default_file_selection_button), __widget_romkan_table); return vbox; } static GtkWidget * create_keyboard_page (unsigned int page) { GtkWidget *table; GtkWidget *label; if (page >= __key_conf_pages_num) return NULL; KeyboardConfigData *data = __key_conf_pages[page].data; table = gtk_table_new (3, 3, FALSE); gtk_widget_show (table); // Create keyboard setting. for (unsigned int i = 0; data[i].key; ++ i) { label = gtk_label_new (NULL); gtk_label_set_text_with_mnemonic (GTK_LABEL (label), _(data[i].label)); gtk_widget_show (label); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_misc_set_padding (GTK_MISC (label), 4, 0); gtk_table_attach (GTK_TABLE (table), label, 0, 1, i, i+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); data[i].entry = gtk_entry_new (); gtk_widget_show (data[i].entry); gtk_table_attach (GTK_TABLE (table), data[i].entry, 1, 2, i, i+1, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_entry_set_editable (GTK_ENTRY (data[i].entry), FALSE); data[i].button = gtk_button_new_with_label (_("...")); gtk_widget_show (data[i].button); gtk_table_attach (GTK_TABLE (table), data[i].button, 2, 3, i, i+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_label_set_mnemonic_widget (GTK_LABEL (label), data[i].button); } for (unsigned int i = 0; data[i].key; ++ i) { g_signal_connect ((gpointer) data[i].button, "clicked", G_CALLBACK (on_default_key_selection_clicked), &(data[i])); g_signal_connect ((gpointer) data[i].entry, "changed", G_CALLBACK (on_default_editable_changed), &(data[i].data)); } if (!__widget_tooltips) __widget_tooltips = gtk_tooltips_new(); for (unsigned int i = 0; data[i].key; ++ i) { gtk_tooltips_set_tip (__widget_tooltips, data[i].entry, _(data[i].tooltip), NULL); } return table; } static GtkWidget * create_setup_window () { static GtkWidget *window = NULL; if (!window) { GtkWidget *notebook = gtk_notebook_new(); gtk_widget_show (notebook); window = notebook; gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE); // Create the first page. GtkWidget *page = create_options_page (); GtkWidget *label = gtk_label_new (_("Options")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); setup_widget_value (); // Create the second page. for (unsigned int i = 0; i < __key_conf_pages_num; i++) { page = create_keyboard_page (i); label = gtk_label_new (_(__key_conf_pages[i].label)); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); } setup_widget_value (); } return window; } static void setup_widget_value (void) { // if (__widget_use_kana) { // gtk_toggle_button_set_active ( // GTK_TOGGLE_BUTTON (__widget_use_kana), // __config_use_kana); // } if (__widget_server) { gtk_entry_set_text ( GTK_ENTRY (__widget_server), __config_server.c_str ()); } if (__widget_wnn_rc) { gtk_entry_set_text ( GTK_ENTRY (__widget_wnn_rc), __config_wnn_rc.c_str ()); } if (__widget_servertype) { for(unsigned int i = 0;__list_data[i].widget;i ++) { if (__list_data[i].name == __config_servertype) { gtk_list_select_child(GTK_LIST(__widget_servertype),__list_data[i].widget); break; } } } if (__widget_preeditor) { for(unsigned int i = 0;__list_data[i].widget;i ++) { if (__list_data[i].name == __config_preeditor) { gtk_list_select_child(GTK_LIST(__widget_preeditor),__list_data[i].widget); break; } } } if (__widget_alp) { gtk_spin_button_set_value ( GTK_SPIN_BUTTON (__widget_alp), __config_alp); } if (__widget_numkeyselect) { gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (__widget_numkeyselect), __config_numkeyselect); } if (__widget_autoconversion) { gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (__widget_autoconversion), __config_autoconversion); } if (__widget_yosoku) { gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (__widget_yosoku), __config_yosoku); } if (__widget_romkan_table) { gtk_entry_set_text ( GTK_ENTRY (__widget_romkan_table), __config_romkan_table.c_str ()); } for (unsigned int j = 0; j < __key_conf_pages_num; ++ j) { for (unsigned int i = 0; __key_conf_pages[j].data[i].key; ++ i) { if (__key_conf_pages[j].data[i].entry) { gtk_entry_set_text ( GTK_ENTRY (__key_conf_pages[j].data[i].entry), __key_conf_pages[j].data[i].data.c_str ()); } } } } static void load_config (const ConfigPointer &config) { if (!config.null ()) { // __config_use_kana = // config->read (String (SCIM_CONFIG_IMENGINE_ANTHY_USE_KANA), // __config_use_kana); __config_server = config->read (String (HONOKA_CONFIG_JSERVER), __config_server); __config_wnn_rc = config->read (String (HONOKA_CONFIG_WNNENVRC), __config_wnn_rc); __config_servertype = config->read (String (HONOKA_CONFIG_JSERVERTYPE), __config_servertype); __config_preeditor = config->read (String (HONOKA_CONFIG_DEFAULT_PREEDITOR), __config_preeditor); __config_alp = config->read (String (HONOKA_CONFIG_ALP), __config_alp); __config_numkeyselect = config->read (String (HONOKA_CONFIG_NUMKEY_SELECT), __config_numkeyselect); __config_autoconversion = config->read (String (HONOKA_CONFIG_AUTO_CONVERSION), __config_autoconversion); __config_yosoku = config->read (String (HONOKA_CONFIG_WNNYOSOKU), __config_yosoku); __config_romkan_table = config->read (String (HONOKA_CONFIG_ROMKAN_TABLE_FILE), __config_romkan_table); for (unsigned int j = 0; j < __key_conf_pages_num; j++) { for (unsigned int i = 0; __key_conf_pages[j].data[i].key; ++ i) { __key_conf_pages[j].data[i].data = config->read (String (__key_conf_pages[j].data[i].key), __key_conf_pages[j].data[i].data); } } setup_widget_value (); __have_changed = false; } } static void save_config (const ConfigPointer &config) { if (!config.null ()) { // config->write (String (SCIM_CONFIG_IMENGINE_ANTHY_USE_KANA), // __config_use_kana); config->write (String (HONOKA_CONFIG_JSERVER), __config_server); config->write (String (HONOKA_CONFIG_WNNENVRC), __config_wnn_rc); config->write (String (HONOKA_CONFIG_JSERVERTYPE), __config_servertype); config->write (String (HONOKA_CONFIG_DEFAULT_PREEDITOR), __config_preeditor); config->write (String (HONOKA_CONFIG_ALP), __config_alp); config->write (String (HONOKA_CONFIG_NUMKEY_SELECT), __config_numkeyselect); config->write (String (HONOKA_CONFIG_AUTO_CONVERSION), __config_autoconversion); config->write (String (HONOKA_CONFIG_WNNYOSOKU), __config_yosoku); config->write (String (HONOKA_CONFIG_ROMKAN_TABLE_FILE), __config_romkan_table); for (unsigned j = 0; j < __key_conf_pages_num; j++) { for (unsigned int i = 0; __key_conf_pages[j].data[i].key; ++ i) { config->write (String (__key_conf_pages[j].data[i].key), __key_conf_pages[j].data[i].data); } } __have_changed = false; } } static bool query_changed () { return __have_changed; } static void on_default_toggle_button_toggled (GtkToggleButton *togglebutton, gpointer user_data) { bool *toggle = static_cast<bool*> (user_data); if (toggle) { *toggle = gtk_toggle_button_get_active (togglebutton); __have_changed = true; } } static void on_default_editable_changed (GtkEditable *editable, gpointer user_data) { String *str = static_cast <String *> (user_data); if (str) { *str = String (gtk_entry_get_text (GTK_ENTRY (editable))); __have_changed = true; } } static void on_default_number_changed (GtkEditable *editable, gpointer user_data) { int *num = static_cast <int *> (user_data); if (num) { *num = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editable)); __have_changed = true; } } static void on_default_list_changed (GtkList *list, GtkWidget *widget, gpointer user_data) { String *str = static_cast <String *> (user_data); if (str) { for(unsigned int i = 0;__list_data[i].widget;i ++) { if (__list_data[i].widget == widget) *str = __list_data[i].name; } __have_changed = true; } } static void on_default_key_selection_clicked (GtkButton *button, gpointer user_data) { KeyboardConfigData *data = static_cast <KeyboardConfigData *> (user_data); if (data) { GtkWidget *dialog = scim_key_selection_dialog_new (_(data->title)); gint result; scim_key_selection_dialog_set_keys ( SCIM_KEY_SELECTION_DIALOG (dialog), gtk_entry_get_text (GTK_ENTRY (data->entry))); result = gtk_dialog_run (GTK_DIALOG (dialog)); if (result == GTK_RESPONSE_OK) { const gchar *keys = scim_key_selection_dialog_get_keys ( SCIM_KEY_SELECTION_DIALOG (dialog)); if (!keys) keys = ""; if (strcmp (keys, gtk_entry_get_text (GTK_ENTRY (data->entry))) != 0) gtk_entry_set_text (GTK_ENTRY (data->entry), keys); } gtk_widget_destroy (dialog); } } static void on_ok_clicked (GtkButton *button, gpointer user_data) { bool *ok = static_cast<bool*>(user_data); if (ok) *ok = true; } static void on_default_file_selection_button (GtkButton *button, gpointer user_data) { GtkEntry *entry = GTK_ENTRY (user_data); const char *path = gtk_entry_get_text (entry); bool ok = false; GtkFileSelection *sel = GTK_FILE_SELECTION (gtk_file_selection_new ("Select a file")); gtk_file_selection_set_filename (sel, path); g_signal_connect (G_OBJECT (sel->ok_button), "clicked", G_CALLBACK (on_ok_clicked), (gpointer) &ok); gtk_window_set_transient_for ( GTK_WINDOW (sel), GTK_WINDOW (gtk_widget_get_toplevel(GTK_WIDGET (entry)))); gtk_dialog_run (GTK_DIALOG (sel)); if (ok) gtk_entry_set_text (entry, gtk_file_selection_get_filename (sel)); gtk_widget_destroy (GTK_WIDGET (sel)); }