diff -Nurb gcin-1.6.4.pre23/modules/chewing-conf.cpp gcin_chewing/modules/chewing-conf.cpp
--- gcin-1.6.4.pre23/modules/chewing-conf.cpp	1969-12-31 19:00:00.000000000 -0500
+++ gcin_chewing/modules/chewing-conf.cpp	2011-06-18 11:40:45.000000000 -0400
@@ -0,0 +1,205 @@
+#include "chewing.h"
+
+static ChewingConfigData g_chewingConfig;
+static gboolean g_bUseDefault = FALSE;
+static int g_nFd = -1;
+static kbmapping_t g_kbMappingTable[] = 
+{ 
+    {"zo",        "KB_DEFAULT"},
+    {"et",        "KB_ET"},
+    {"et26",      "KB_ET26"},
+    {"hsu",       "KB_HSU"},
+    {"pinyin",    "KB_HANYU_PINYIN"},
+    {"dvorak",    "KB_DVORAK"},
+    {"ibm",       "KB_IBM"},
+    {"mitac",     NULL},
+    {"colemak",   NULL},
+    {NULL,        NULL},
+};
+
+static void gcin_kb_config_set (ChewingContext *pChewingCtx);
+
+void
+chewing_config_open (gboolean bWrite)
+{
+    char *pszChewingConfig;
+    char *pszHome;
+
+    pszHome = getenv ("HOME");
+    if (!pszHome)
+        pszHome = "";
+
+    pszChewingConfig = malloc (strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
+    memset (pszChewingConfig, 0x00, strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
+    sprintf (pszChewingConfig, "%s%s", pszHome, GCIN_CHEWING_CONFIG);
+
+    g_nFd = open (pszChewingConfig,
+                  bWrite == TRUE ? (O_RDWR | O_CREAT) : (O_RDONLY),
+                  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+    free (pszChewingConfig);
+
+    if (g_nFd == -1)
+        g_bUseDefault = TRUE;
+}
+
+void
+chewing_config_load (ChewingConfigData *pChewingConfig)
+{
+    int nReadSize;
+
+    nReadSize = read (g_nFd, &g_chewingConfig, sizeof (g_chewingConfig));
+    if (nReadSize == 0 || nReadSize != sizeof (g_chewingConfig))
+        g_bUseDefault = TRUE;
+
+    if (g_bUseDefault)
+    {
+        int nDefaultSelKey[MAX_SELKEY] = {'a', 's', 'd', 'f',
+                                          'g', 'h', 'j', 'k',
+                                          'l', ';'};
+
+        g_chewingConfig.candPerPage           = 10;
+        g_chewingConfig.maxChiSymbolLen       = 16;
+        g_chewingConfig.bAddPhraseForward     = 1;
+        g_chewingConfig.bSpaceAsSelection     = 1;
+        g_chewingConfig.bEscCleanAllBuf       = 0;
+        g_chewingConfig.bAutoShiftCur         = 1;
+        g_chewingConfig.bEasySymbolInput      = 0;
+        g_chewingConfig.bPhraseChoiceRearward = 1;
+        g_chewingConfig.hsuSelKeyType         = 0;
+        memcpy (&g_chewingConfig.selKey,
+                &nDefaultSelKey,
+                sizeof (g_chewingConfig.selKey));
+    }
+
+    memcpy (pChewingConfig, &g_chewingConfig, sizeof (ChewingConfigData));
+}
+
+void
+chewing_config_set (ChewingContext *pChewingCtx)
+{
+    gcin_kb_config_set (pChewingCtx);
+
+    chewing_set_candPerPage (pChewingCtx, g_chewingConfig.candPerPage);
+    chewing_set_maxChiSymbolLen (pChewingCtx, g_chewingConfig.maxChiSymbolLen);
+    chewing_set_addPhraseDirection (pChewingCtx, g_chewingConfig.bAddPhraseForward);
+    chewing_set_spaceAsSelection (pChewingCtx, g_chewingConfig.bSpaceAsSelection);
+    chewing_set_escCleanAllBuf (pChewingCtx, g_chewingConfig.bEscCleanAllBuf);
+    chewing_set_autoShiftCur (pChewingCtx, g_chewingConfig.bAutoShiftCur);
+    chewing_set_easySymbolInput (pChewingCtx, g_chewingConfig.bEasySymbolInput);
+    chewing_set_phraseChoiceRearward (pChewingCtx, g_chewingConfig.bPhraseChoiceRearward);
+    chewing_set_hsuSelKeyType (pChewingCtx, g_chewingConfig.hsuSelKeyType);
+}
+
+void
+chewing_config_dump (void)
+{
+    int nIdx = 0;
+    printf ("chewing config:\n");
+    printf ("\tcandPerPage: %d\n", g_chewingConfig.candPerPage);
+    printf ("\tmaxChiSymbolLen: %d\n", g_chewingConfig.maxChiSymbolLen);
+    printf ("\tbAddPhraseForward: %d\n", g_chewingConfig.bAddPhraseForward);
+    printf ("\tbSpaceAsSelection: %d\n", g_chewingConfig.bSpaceAsSelection);
+    printf ("\tbEscCleanAllBuf: %d\n", g_chewingConfig.bEscCleanAllBuf);
+    printf ("\tbAutoShiftCur: %d\n", g_chewingConfig.bAutoShiftCur);
+    printf ("\tbEasySymbolInput: %d\n", g_chewingConfig.bEasySymbolInput);
+    printf ("\tbPhraseChoiceRearward: %d\n", g_chewingConfig.bPhraseChoiceRearward);
+    printf ("\thsuSelKeyType: %d\n", g_chewingConfig.hsuSelKeyType);
+    printf ("\tselKey: ");
+    for (nIdx = 0; nIdx < MAX_SELKEY; nIdx++)
+        printf ("%c ", g_chewingConfig.selKey[nIdx]);
+    printf ("\n");
+}
+
+void
+chewing_config_close (void)
+{
+    if (g_nFd != -1)
+        close (g_nFd);
+
+    g_nFd = -1;
+    g_bUseDefault = FALSE;
+    memset (&g_chewingConfig, 0x00, sizeof (g_chewingConfig));
+}
+
+static void
+gcin_kb_config_set (ChewingContext *pChewingCtx)
+{
+    char *pszHome;
+    char *pszGcinKBConfig;
+    char szBuf[32];
+    char szKbType[8];
+    char szKbSelKey[16];
+    int  nFd;
+    int  nRead;
+    int  nIdx = 0;
+
+    memset (szBuf, 0x00, 32);
+    memset (szKbType, 0x00, 8);
+    memset (szKbSelKey, 0x00, 16);
+
+    pszHome = getenv ("HOME");
+    if (!pszHome)
+        pszHome = "";
+
+    pszGcinKBConfig = malloc (strlen (pszHome) + strlen (GCIN_KB_CONFIG) + 1);
+    memset (pszGcinKBConfig, 0x00, strlen (pszHome) + strlen (GCIN_KB_CONFIG) + 1);
+    sprintf (pszGcinKBConfig, "%s%s", pszHome, GCIN_KB_CONFIG);
+
+    nFd = open (pszGcinKBConfig, 
+          O_RDONLY, 
+          S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+    free (pszGcinKBConfig);
+
+    if (nFd == -1)
+        return;
+
+    nRead = read (nFd, szBuf, 32);
+    if (nRead == -1)
+        return;
+    
+    sscanf (szBuf, "%s %s ", szKbType, szKbSelKey);
+
+    if (!szKbType || !szKbSelKey)
+        return;
+
+    for (nIdx = 0; nIdx < strlen (szKbSelKey); nIdx++)
+        g_chewingConfig.selKey[nIdx] = szKbSelKey[nIdx];
+    chewing_set_selKey (pChewingCtx, g_chewingConfig.selKey, strlen (szKbSelKey));
+
+    while (g_kbMappingTable[nIdx].pszGcinKbName)
+    {
+        if (!strncmp (g_kbMappingTable[nIdx].pszGcinKbName,
+	              szKbType,
+		      strlen (szKbType)))
+        {
+            chewing_set_KBType (pChewingCtx, 
+	                        chewing_KBStr2Num (g_kbMappingTable[nIdx].pszChewingKbName));
+	    break;
+	}
+        nIdx++;
+    }
+}
+
+gboolean
+chewing_config_save (int nVal[])
+{
+    int nWriteSize;
+
+    g_chewingConfig.candPerPage       = 
+        nVal[0] > MAX_SELKEY ? MAX_SELKEY : nVal[0];
+    g_chewingConfig.bSpaceAsSelection = nVal[1];
+    g_chewingConfig.bEscCleanAllBuf   = nVal[2];
+    g_chewingConfig.bAutoShiftCur     = nVal[3];
+    g_chewingConfig.bAddPhraseForward = nVal[4];
+
+    lseek (g_nFd, 0, SEEK_SET);
+
+    nWriteSize = write (g_nFd, &g_chewingConfig, sizeof (g_chewingConfig));
+    if (nWriteSize != sizeof (g_chewingConfig))
+        return FALSE;
+
+    return TRUE;
+}
+
diff -Nurb gcin-1.6.4.pre23/modules/chewing.cpp gcin_chewing/modules/chewing.cpp
--- gcin-1.6.4.pre23/modules/chewing.cpp	2011-06-04 08:24:45.000000000 -0400
+++ gcin_chewing/modules/chewing.cpp	2011-06-18 11:35:26.000000000 -0400
@@ -1,61 +1,5 @@
-#include <chewing/chewing.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "gcin.h"
-#include "pho.h"
-#include "gst.h"
-#include "im-client/gcin-im-client-attr.h"
-#include "win1.h"
-#include "gcin-module.h"
-#include "gcin-module-cb.h"
-
-#define MAX_SEG_NUM  128
-#define GCIN_CHEWING_CONFIG "/.gcin/config/chewing_conf.dat"
-
-typedef struct _SEGMENT {
-    GtkWidget *label;
-    unsigned char selidx, selN;
-} SEG;
-
-/*---------------------------------------------------------------------------*/
-/*    call back funcs                                                        */
-/*---------------------------------------------------------------------------*/
-int module_init_win (GCIN_module_main_functions *pFuncs);
-void module_get_win_geom (void);
-int module_reset (void);
-int module_get_preedit (char *pszStr, GCIN_PREEDIT_ATTR attr[],
-                        int *pnCursor, int *pCompFlag);
-gboolean module_feedkey (int nKeyVal, int nKeyState);
-int module_feedkey_release (KeySym xkey, int nKbState);
-void module_move_win(int x, int y);
-void module_change_font_size (void);
-void module_show_win (void);
-void module_hide_win (void);
-int module_win_visible (void);
-int module_flush_input (void);
-
-/*---------------------------------------------------------------------------*/
-/*    local funcs                                                            */
-/*---------------------------------------------------------------------------*/
-static gboolean select_idx (int c);
-static void prev_page (void);
-static void next_page (void);
-static gboolean chewing_initialize (void);
-static gboolean is_empty (void);
-static gboolean gcin_label_show (char *pszPho, int nPos);
-static gboolean gcin_label_clear (int nCount);
-static gboolean gcin_label_cand_show (char *pszWord, int nCount);
-static gboolean gtk_pango_font_pixel_size_get (int *pnFontWidth, int *pnFontHeight);
-static gboolean chewing_config_open (void);
-static void chewing_config_load (void);
-static void chewing_config_set (void);
-static void chewing_config_dump (void);
-void chewing_config_close (void);
-
-/*---------------------------------------------------------------------------*/
-/*    global vars                                                            */
-/*---------------------------------------------------------------------------*/
+#include "chewing.h"
+
 static GCIN_module_main_functions g_gcinModMainFuncs;
 static GtkWidget *g_pWinChewing      = NULL;
 static ChewingContext *g_pChewingCtx = NULL;
@@ -63,9 +7,7 @@
 static GtkWidget *g_pHBoxChewing     = NULL;
 static SEG *g_pSeg = NULL;
 static int g_nCurrentCursorPos = 0;
-static ChewingConfigData g_chewingConfig;
 static int g_nFd;
-static gboolean g_bUseDefault = FALSE;
 
 // FIXME: impl
 static gboolean
@@ -96,8 +38,9 @@
 
     memset (szTmp, 0x00, 128);
 
-    sprintf (szTmp, "<span background=\"%s\">%s</span>",
+    sprintf (szTmp, "<span background=\"%s\" foreground=\"%s\">%s</span>",
              *g_gcinModMainFuncs.mf_tsin_cursor_color,
+             *g_gcinModMainFuncs.mf_gcin_win_color_fg,
              pszPho);
 
     gtk_label_set_markup (GTK_LABEL (g_pSeg[nPos].label),
@@ -171,6 +114,8 @@
 {
     char *pszChewingHashDir;
     char *pszHome;
+    gboolean bWriteMode = FALSE;
+    ChewingConfigData dummyConfig;
 
     pszHome = getenv ("HOME");
     if (!pszHome)
@@ -191,10 +136,11 @@
     if (!g_pChewingCtx)
         return FALSE;
 
-    if (chewing_config_open ())
-        chewing_config_load ();
+    chewing_config_open (bWriteMode);
+
+    chewing_config_load (&dummyConfig);
 
-    chewing_config_set ();
+    chewing_config_set (g_pChewingCtx);
 
     chewing_config_close ();
 
@@ -630,101 +576,3 @@
     return 0;
 }
 
-static gboolean
-chewing_config_open (void)
-{
-    char *pszChewingConfig;
-    char *pszHome;
-
-    pszHome = getenv ("HOME");
-    if (!pszHome)
-        pszHome = "";
-
-    pszChewingConfig = malloc (strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
-    memset (pszChewingConfig, 0x00, strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
-    sprintf (pszChewingConfig, "%s%s", pszHome, GCIN_CHEWING_CONFIG);
-
-    g_nFd = open (pszChewingConfig,
-                  O_RDONLY,
-                  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-
-    free (pszChewingConfig);
-
-    return (g_nFd == -1 ? !(g_bUseDefault = TRUE) : TRUE);
-}
-
-static void
-chewing_config_load (void)
-{
-    int nReadSize;
-
-    nReadSize = read (g_nFd, &g_chewingConfig, sizeof (g_chewingConfig));
-    if (nReadSize == 0 || nReadSize != sizeof (g_chewingConfig))
-        g_bUseDefault = TRUE;
-}
-
-// TODO: add kbtype into gcin_conf.dat
-//       or use the gcin setting instead
-static void
-chewing_config_set (void)
-{
-    if (g_bUseDefault)
-    {
-        int nDefaultSelKey[MAX_SELKEY] = {'a', 's', 'd', 'f',
-                                          'g', 'h', 'j', 'k',
-                                          'l', ';'};
-
-        g_chewingConfig.candPerPage           = 10;
-        g_chewingConfig.maxChiSymbolLen       = 16;
-        g_chewingConfig.bAddPhraseForward     = 1;
-        g_chewingConfig.bSpaceAsSelection     = 1;
-        g_chewingConfig.bEscCleanAllBuf       = 0;
-        g_chewingConfig.bAutoShiftCur         = 1;
-        g_chewingConfig.bEasySymbolInput      = 0;
-        g_chewingConfig.bPhraseChoiceRearward = 1;
-        g_chewingConfig.hsuSelKeyType         = 0;
-        memcpy (&g_chewingConfig.selKey,
-                &nDefaultSelKey,
-                sizeof (g_chewingConfig.selKey));
-    }
-
-    chewing_set_KBType (g_pChewingCtx, chewing_KBStr2Num ("KB_DEFAULT"));
-    chewing_set_selKey (g_pChewingCtx, g_chewingConfig.selKey, 10);
-    chewing_set_candPerPage (g_pChewingCtx, g_chewingConfig.candPerPage);
-    chewing_set_maxChiSymbolLen (g_pChewingCtx, g_chewingConfig.maxChiSymbolLen);
-    chewing_set_addPhraseDirection (g_pChewingCtx, g_chewingConfig.bAddPhraseForward);
-    chewing_set_spaceAsSelection (g_pChewingCtx, g_chewingConfig.bSpaceAsSelection);
-    chewing_set_escCleanAllBuf (g_pChewingCtx, g_chewingConfig.bEscCleanAllBuf);
-    chewing_set_autoShiftCur (g_pChewingCtx, g_chewingConfig.bAutoShiftCur);
-    chewing_set_easySymbolInput (g_pChewingCtx, g_chewingConfig.bEasySymbolInput);
-    chewing_set_phraseChoiceRearward (g_pChewingCtx, g_chewingConfig.bPhraseChoiceRearward);
-    chewing_set_hsuSelKeyType (g_pChewingCtx, g_chewingConfig.hsuSelKeyType);
-}
-
-static void
-chewing_config_dump (void)
-{
-    int nIdx = 0;
-    printf ("chewing config:\n");
-    printf ("\tcandPerPage: %d\n", g_chewingConfig.candPerPage);
-    printf ("\tmaxChiSymbolLen: %d\n", g_chewingConfig.maxChiSymbolLen);
-    printf ("\tbAddPhraseForward: %d\n", g_chewingConfig.bAddPhraseForward);
-    printf ("\tbSpaceAsSelection: %d\n", g_chewingConfig.bSpaceAsSelection);
-    printf ("\tbEscCleanAllBuf: %d\n", g_chewingConfig.bEscCleanAllBuf);
-    printf ("\tbAutoShiftCur: %d\n", g_chewingConfig.bAutoShiftCur);
-    printf ("\tbEasySymbolInput: %d\n", g_chewingConfig.bEasySymbolInput);
-    printf ("\tbPhraseChoiceRearward: %d\n", g_chewingConfig.bPhraseChoiceRearward);
-    printf ("\thsuSelKeyType: %d\n", g_chewingConfig.hsuSelKeyType);
-    printf ("\tselKey: ");
-    for (nIdx = 0; nIdx < MAX_SELKEY; nIdx++)
-        printf ("%c ", g_chewingConfig.selKey[nIdx]);
-    printf ("\n");
-}
-
-void
-chewing_config_close (void)
-{
-    if (g_nFd != -1)
-        close (g_nFd);
-}
-
diff -Nurb gcin-1.6.4.pre23/modules/chewing.h gcin_chewing/modules/chewing.h
--- gcin-1.6.4.pre23/modules/chewing.h	1969-12-31 19:00:00.000000000 -0500
+++ gcin_chewing/modules/chewing.h	2011-06-18 11:35:26.000000000 -0400
@@ -0,0 +1,67 @@
+#ifndef CHEWING_H
+#define CHEWING_H
+
+#include <chewing/chewing.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "gcin.h"
+#include "pho.h"
+#include "gst.h"
+#include "im-client/gcin-im-client-attr.h"
+#include "win1.h"
+#include "gcin-module.h"
+#include "gcin-module-cb.h"
+#include "gcin-conf.h"
+#include "pho-kbm-name.h"
+
+#define MAX_SEG_NUM  128
+#define GCIN_CHEWING_CONFIG "/.gcin/config/chewing_conf.dat"
+#define GCIN_KB_CONFIG "/.gcin/config/phonetic-keyboard2"
+
+typedef struct _SEGMENT {
+    GtkWidget *label;
+    unsigned char selidx, selN;
+} SEG;
+
+typedef struct KB_MAPPING
+{
+    char *pszGcinKbName;
+    char *pszChewingKbName;
+} kbmapping_t;
+
+// gcin module callbacks
+int module_init_win (GCIN_module_main_functions *pFuncs);
+void module_get_win_geom (void);
+int module_reset (void);
+int module_get_preedit (char *pszStr, GCIN_PREEDIT_ATTR attr[],
+                        int *pnCursor, int *pCompFlag);
+gboolean module_feedkey (int nKeyVal, int nKeyState);
+int module_feedkey_release (KeySym xkey, int nKbState);
+void module_move_win(int x, int y);
+void module_change_font_size (void);
+void module_show_win (void);
+void module_hide_win (void);
+int module_win_visible (void);
+int module_flush_input (void);
+
+// gcin-chewing funcs
+static gboolean select_idx (int c);
+static void prev_page (void);
+static void next_page (void);
+static gboolean chewing_initialize (void);
+static gboolean is_empty (void);
+static gboolean gcin_label_show (char *pszPho, int nPos);
+static gboolean gcin_label_clear (int nCount);
+static gboolean gcin_label_cand_show (char *pszWord, int nCount);
+static gboolean gtk_pango_font_pixel_size_get (int *pnFontWidth, int *pnFontHeight);
+
+// config funcs
+void chewing_config_open (gboolean bWrite);
+void chewing_config_load (ChewingConfigData *pChewingConfig);
+void chewing_config_set (ChewingContext *pChewingContext);
+void chewing_config_dump (void);
+void chewing_config_close (void);
+gboolean chewing_config_save (int nVal[]);
+
+#endif
diff -Nurb gcin-1.6.4.pre23/modules/gcin-setup-chewing.cpp gcin_chewing/modules/gcin-setup-chewing.cpp
--- gcin-1.6.4.pre23/modules/gcin-setup-chewing.cpp	2011-06-04 08:24:45.000000000 -0400
+++ gcin_chewing/modules/gcin-setup-chewing.cpp	2011-06-18 11:35:26.000000000 -0400
@@ -1,10 +1,4 @@
-#include <chewing/chewing.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "gcin.h"
-
-#define GCIN_CHEWING_CONFIG "/.gcin/config/chewing_conf.dat"
+#include "chewing.h"
 
 // TODO:
 //     the hbox/label could be moved to local func
@@ -36,132 +30,6 @@
 static GtkWidget *g_pCheckButtonAddPhraseForward = NULL;
 
 static ChewingConfigData g_chewingConfig;
-static int g_nFd = -1;
-
-static void
-chewing_config_dump (void)
-{
-    int nIdx = 0;
-    printf ("chewing config:\n");
-    printf ("\tcandPerPage: %d\n", g_chewingConfig.candPerPage);
-    printf ("\tmaxChiSymbolLen: %d\n", g_chewingConfig.maxChiSymbolLen);
-    printf ("\tbAddPhraseForward: %d\n", g_chewingConfig.bAddPhraseForward);
-    printf ("\tbSpaceAsSelection: %d\n", g_chewingConfig.bSpaceAsSelection);
-    printf ("\tbEscCleanAllBuf: %d\n", g_chewingConfig.bEscCleanAllBuf);
-    printf ("\tbAutoShiftCur: %d\n", g_chewingConfig.bAutoShiftCur);
-    printf ("\tbEasySymbolInput: %d\n", g_chewingConfig.bEasySymbolInput);
-    printf ("\tbPhraseChoiceRearward: %d\n", g_chewingConfig.bPhraseChoiceRearward);
-    printf ("\thsuSelKeyType: %d\n", g_chewingConfig.hsuSelKeyType);
-    printf ("\tselKey: ");
-    for (nIdx = 0; nIdx < MAX_SELKEY; nIdx++)
-        printf ("%c ", g_chewingConfig.selKey[nIdx]);
-    printf ("\n");
-}
-
-static void
-chewing_config_default_set (void)
-{
-    int nDefaultSelKey[MAX_SELKEY] = {'a', 's', 'd', 'f',
-                                      'g', 'h', 'j', 'k',
-                                      'l', ';'};
-
-    g_chewingConfig.candPerPage           = 10;
-    g_chewingConfig.maxChiSymbolLen       = 16;
-    g_chewingConfig.bAddPhraseForward     = 1;
-    g_chewingConfig.bSpaceAsSelection     = 1;
-    g_chewingConfig.bEscCleanAllBuf       = 0;
-    g_chewingConfig.bAutoShiftCur         = 1;
-    g_chewingConfig.bEasySymbolInput      = 0;
-    g_chewingConfig.bPhraseChoiceRearward = 1;
-    g_chewingConfig.hsuSelKeyType         = 0;
-    memcpy (&g_chewingConfig.selKey,
-            &nDefaultSelKey,
-            sizeof (g_chewingConfig.selKey));
-}
-
-static gboolean
-chewing_config_open (void)
-{
-    char *pszChewingConfig;
-    char *pszHome;
-
-    pszHome = getenv ("HOME");
-    if (!pszHome)
-        pszHome = "";
-
-    pszChewingConfig = malloc (strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
-    memset (pszChewingConfig, 0x00, strlen (pszHome) + strlen (GCIN_CHEWING_CONFIG) + 1);
-    sprintf (pszChewingConfig, "%s%s", pszHome, GCIN_CHEWING_CONFIG);
-
-    g_nFd = open (pszChewingConfig,
-                  O_RDWR  | O_CREAT,
-                  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-
-    free (pszChewingConfig);
-
-    return (g_nFd == -1 ? FALSE : TRUE);
-}
-
-static void
-chewing_config_close (void)
-{
-    if (g_nFd != -1)
-        close (g_nFd);
-    g_nFd = -1;
-}
-
-static gboolean
-chewing_config_load (void)
-{
-    int nReadSize;
-
-    if (!chewing_config_open ())
-        return FALSE;
-
-    nReadSize = read (g_nFd, &g_chewingConfig, sizeof (g_chewingConfig));
-    if (nReadSize == 0)
-        chewing_config_default_set ();
-    else if (nReadSize != sizeof (g_chewingConfig))
-        return FALSE;
-
-    chewing_config_close ();
-
-    return TRUE;
-}
-
-static gboolean
-chewing_config_save (void)
-{
-    int nWriteSize;
-
-    if (!chewing_config_open ())
-        return FALSE;
-
-    g_chewingConfig.candPerPage =
-        (int)gtk_spin_button_get_value (GTK_SPIN_BUTTON (g_pSpinButtonCandPerPage));
-    if (g_chewingConfig.candPerPage > MAX_SELKEY)
-        g_chewingConfig.candPerPage = MAX_SELKEY;
-
-    g_chewingConfig.bSpaceAsSelection =
-        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonSpaceAsSelection));
-
-    g_chewingConfig.bEscCleanAllBuf =
-        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonEscCleanAllBuf));
-
-    g_chewingConfig.bAutoShiftCur =
-        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonAutoShiftCur));
-
-    g_chewingConfig.bAddPhraseForward =
-        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonAddPhraseForward));
-
-    nWriteSize = write (g_nFd, &g_chewingConfig, sizeof (g_chewingConfig));
-    if (nWriteSize != sizeof (g_chewingConfig))
-        return FALSE;
-
-    chewing_config_close ();
-
-    return TRUE;
-}
 
 static gboolean
 cb_close_window (GtkWidget *widget, GdkEvent *event, gpointer data)
@@ -170,13 +38,29 @@
 
     gtk_widget_destroy (gcin_chewing_window);
     gcin_chewing_window = NULL;
+    memset (&g_chewingConfig, 0x00, sizeof (g_chewingConfig));
+
     return TRUE;
 }
 
 static gboolean
 cb_update_setting (GtkWidget *widget, GdkEvent *event, gpointer data)
 {
-    chewing_config_save ();
+    int nVal[] = 
+    {
+        gtk_spin_button_get_value (GTK_SPIN_BUTTON (g_pSpinButtonCandPerPage)),
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonSpaceAsSelection)),
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonEscCleanAllBuf)),
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonAutoShiftCur)),
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_pCheckButtonAddPhraseForward)) 
+    };
+
+    if (!chewing_config_save (nVal))
+    {
+        chewing_config_close ();
+        return FALSE;
+    }
+
     chewing_config_close ();
 
     gtk_widget_destroy (gcin_chewing_window);
@@ -186,8 +70,11 @@
 
 void module_setup_window_create ()
 {
-    if (!chewing_config_load ())
-        return;
+    gboolean bWriteMode = TRUE;
+
+    chewing_config_open (bWriteMode);
+    
+    chewing_config_load (&g_chewingConfig);
 
     if (gcin_chewing_window)
     {
diff -Nurb gcin-1.6.4.pre23/modules/Makefile gcin_chewing/modules/Makefile
--- gcin-1.6.4.pre23/modules/Makefile	2011-06-03 14:06:25.000000000 -0400
+++ gcin_chewing/modules/Makefile	2011-06-18 11:35:26.000000000 -0400
@@ -19,12 +19,13 @@
 anthy-module.so: $(anthy_module_so)
 	$(CCLD) $(SO_FLAGS) -o $@ $(anthy_module_so) $(LDFLAGS) -lanthy
 
+chewing_module_obj = chewing-conf.o
 chewing_module_so = chewing.pico gcin-setup-chewing.pico
-chewing-module.so: $(chewing_module_so)
-	$(CCLD) $(SO_FLAGS) -o $@ $(chewing_module_so) $(LDFLAGS) $(shell pkg-config --cflags --libs chewing)
+chewing-module.so: $(chewing_module_obj) $(chewing_module_so)
+	$(CCLD) $(SO_FLAGS) -o $@ $(chewing_module_obj) $(chewing_module_so) $(LDFLAGS) $(shell pkg-config --cflags --libs chewing)
 
 install:
 	install $(GCIN_MODULE) $(gcinlibdir)
 
 clean:
-	rm -f *.pico *.so
+	rm -f *.pico *.so *.o
