Blob Blame History Raw
From d218a3536bc2e2b03dfca03163f7fad5d87c571a Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Thu, 20 Feb 2020 17:30:20 +0900
Subject: [PATCH] Generate source files without GOB2 dependency

---
 bin/ibus-chewing-engine-private.h |  113 ++++
 bin/ibus-chewing-engine.c         | 1052 +++++++++++++++++++++++++++++
 bin/ibus-chewing-engine.h         |  187 +++++
 bin/maker-dialog-private.h        |   60 ++
 bin/maker-dialog.c                |  646 ++++++++++++++++++
 bin/maker-dialog.h                |  159 +++++
 src/CMakeLists.txt                |   31 +-
 test/CMakeLists.txt               |    9 +-
 8 files changed, 2226 insertions(+), 31 deletions(-)
 create mode 100644 bin/ibus-chewing-engine-private.h
 create mode 100644 bin/ibus-chewing-engine.c
 create mode 100644 bin/ibus-chewing-engine.h
 create mode 100644 bin/maker-dialog-private.h
 create mode 100644 bin/maker-dialog.c
 create mode 100644 bin/maker-dialog.h

diff --git a/bin/ibus-chewing-engine-private.h b/bin/ibus-chewing-engine-private.h
new file mode 100644
index 0000000..980cf97
--- /dev/null
+++ b/bin/ibus-chewing-engine-private.h
@@ -0,0 +1,113 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+
+
+/*
+ * Copyright © 2009,2010  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009,2010  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that ill 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#include <stdlib.h>
+#include <libintl.h>
+#include <ibus.h>
+#include <chewing.h>
+#include <string.h>
+#include <stdio.h>
+#define GETTEXT_PACKAGE "gtk20"
+#include <glib/gi18n.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <ctype.h>
+#include "IBusChewingUtil.h"
+#include "IBusChewingProperties.h"
+#include "IBusChewingPreEdit.h"
+#include "IBusChewingSystray.h"
+#ifdef USE_GSETTINGS
+#include "GSettingsBackend.h"
+#endif
+#ifdef USE_GCONF2
+#include "GConf2Backend.h"
+#endif
+
+#line 2 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+#line 49 "ibus-chewing-engine-private.h"
+#ifndef __IBUS_CHEWING_ENGINE_PRIVATE_H__
+#define __IBUS_CHEWING_ENGINE_PRIVATE_H__
+
+#include "ibus-chewing-engine.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#line 110 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+
+#include "maker-dialog.h"
+void ibus_chewing_engine_handle_Default(IBusChewingEngine * self,
+                                        guint keyval,
+                                        gboolean shiftPressed);
+#define self_handle_Default ibus_chewing_engine_handle_Default
+
+void ibus_chewing_engine_candidate_clicked(IBusEngine * engine,
+                                           guint index, guint button,
+                                           guint state);
+void ibus_chewing_engine_property_activate(IBusEngine * engine,
+                                           const gchar * prop_name,
+                                           guint prop_state);
+void ibus_chewing_engine_set_content_type(IBusEngine * engine,
+                                          guint purpose, guint hints);
+
+void refresh_pre_edit_text(IBusChewingEngine * self);
+void update_pre_edit_text(IBusChewingEngine * self);
+void refresh_aux_text(IBusChewingEngine * self);
+void update_aux_text(IBusChewingEngine * self);
+void update_lookup_table(IBusChewingEngine * self);
+void refresh_outgoing_text(IBusChewingEngine * self);
+void commit_text(IBusChewingEngine * self);
+
+#line 85 "ibus-chewing-engine-private.h"
+struct _IBusChewingEnginePrivate {
+#line 191 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+	EngineFlag statusFlags;
+#line 193 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+	IBusCapabilite capabilite;
+#line 195 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+	ChewingInputStyle inputStyle;
+#line 221 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+	Display * pDisplay;
+#line 95 "ibus-chewing-engine-private.h"
+};
+#line 345 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_use_setting	(IBusChewingEngine * self);
+#line 99 "ibus-chewing-engine-private.h"
+#line 359 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_restore_mode	(IBusChewingEngine * self);
+#line 102 "ibus-chewing-engine-private.h"
+#line 377 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_update	(IBusChewingEngine * self);
+#line 105 "ibus-chewing-engine-private.h"
+#line 391 "/root/rpmbuild/BUILD/ibus-chewing-1.6.1-Source/src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_refresh_property	(IBusChewingEngine * self, const gchar * prop_name);
+#line 108 "ibus-chewing-engine-private.h"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
diff --git a/bin/ibus-chewing-engine.c b/bin/ibus-chewing-engine.c
new file mode 100644
index 0000000..fc2394c
--- /dev/null
+++ b/bin/ibus-chewing-engine.c
@@ -0,0 +1,1052 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+/* End world hunger, donate to the World Food Programme, http://www.wfp.org */
+
+
+#line 2 "../src/IBusChewingEngine.gob"
+
+/*
+ * Copyright © 2009,2010  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009,2010  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that ill 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#include <stdlib.h>
+#include <libintl.h>
+#include <ibus.h>
+#include <chewing.h>
+#include <string.h>
+#include <stdio.h>
+#define GETTEXT_PACKAGE "gtk20"
+#include <glib/gi18n.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <ctype.h>
+#include "IBusChewingUtil.h"
+#include "IBusChewingProperties.h"
+#include "IBusChewingPreEdit.h"
+#include "IBusChewingSystray.h"
+#ifdef USE_GSETTINGS
+#include "GSettingsBackend.h"
+#endif
+#ifdef USE_GCONF2
+#include "GConf2Backend.h"
+#endif
+
+#line 51 "ibus-chewing-engine.c"
+#define GOB_VERSION_MAJOR 2
+#define GOB_VERSION_MINOR 0
+#define GOB_VERSION_PATCHLEVEL 19
+
+#define selfp (self->_priv)
+
+#include <string.h> /* memset() */
+
+#include "ibus-chewing-engine.h"
+
+#include "ibus-chewing-engine-private.h"
+
+#ifdef G_LIKELY
+#define ___GOB_LIKELY(expr) G_LIKELY(expr)
+#define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr)
+#else /* ! G_LIKELY */
+#define ___GOB_LIKELY(expr) (expr)
+#define ___GOB_UNLIKELY(expr) (expr)
+#endif /* G_LIKELY */
+static const GEnumValue _chewing_input_style_values[] = {
+	{ CHEWING_INPUT_STYLE_IN_APPLICATION, (char *)"CHEWING_INPUT_STYLE_IN_APPLICATION", (char *)"in-application" },
+	{ CHEWING_INPUT_STYLE_IN_CANDIDATE, (char *)"CHEWING_INPUT_STYLE_IN_CANDIDATE", (char *)"in-candidate" },
+	{ 0, NULL, NULL }
+};
+
+GType
+chewing_input_style_get_type (void)
+{
+	static GType type = 0;
+	if ___GOB_UNLIKELY(type == 0)
+		type = g_enum_register_static ("ChewingInputStyle", _chewing_input_style_values);
+	return type;
+}
+
+static const GEnumValue _engine_flag_values[] = {
+	{ ENGINE_FLAG_INITIALIZED, (char *)"ENGINE_FLAG_INITIALIZED", (char *)"initialized" },
+	{ ENGINE_FLAG_ENABLED, (char *)"ENGINE_FLAG_ENABLED", (char *)"enabled" },
+	{ ENGINE_FLAG_FOCUS_IN, (char *)"ENGINE_FLAG_FOCUS_IN", (char *)"focus-in" },
+	{ ENGINE_FLAG_IS_PASSWORD, (char *)"ENGINE_FLAG_IS_PASSWORD", (char *)"is-password" },
+	{ ENGINE_FLAG_PROPERTIES_REGISTERED, (char *)"ENGINE_FLAG_PROPERTIES_REGISTERED", (char *)"properties-registered" },
+	{ 0, NULL, NULL }
+};
+
+GType
+engine_flag_get_type (void)
+{
+	static GType type = 0;
+	if ___GOB_UNLIKELY(type == 0)
+		type = g_enum_register_static ("EngineFlag", _engine_flag_values);
+	return type;
+}
+
+
+#line 135 "../src/IBusChewingEngine.gob"
+
+extern gint ibus_chewing_verbose;
+
+#define IBUS_CHEWING_MAIN
+#include "IBusConfigBackend.h"
+
+#line 112 "ibus-chewing-engine.c"
+/* self casting macros */
+#define SELF(x) IBUS_CHEWING_ENGINE(x)
+#define SELF_CONST(x) IBUS_CHEWING_ENGINE_CONST(x)
+#define IS_SELF(x) IBUS_IS_CHEWING_ENGINE(x)
+#define TYPE_SELF IBUS_TYPE_CHEWING_ENGINE
+#define SELF_CLASS(x) IBUS_CHEWING_ENGINE_CLASS(x)
+
+#define SELF_GET_CLASS(x) IBUS_CHEWING_ENGINE_GET_CLASS(x)
+
+/* self typedefs */
+typedef IBusChewingEngine Self;
+typedef IBusChewingEngineClass SelfClass;
+
+/* here are local prototypes */
+#line 269 "../src/IBusChewingEngine.gob"
+static void ibus_chewing_engine_init (IBusChewingEngine * self) G_GNUC_UNUSED;
+#line 129 "ibus-chewing-engine.c"
+#line 328 "../src/IBusChewingEngine.gob"
+static void ibus_chewing_engine_class_init (IBusChewingEngineClass * klass) G_GNUC_UNUSED;
+#line 132 "ibus-chewing-engine.c"
+#line 341 "../src/IBusChewingEngine.gob"
+static void ibus_chewing_engine_constructor (IBusChewingEngine * self) G_GNUC_UNUSED;
+#line 135 "ibus-chewing-engine.c"
+#line 482 "../src/IBusChewingEngine.gob"
+static IBusProperty * ibus_chewing_engine_get_ibus_property_by_name (IBusChewingEngine * self, const gchar * prop_name) G_GNUC_UNUSED;
+#line 138 "ibus-chewing-engine.c"
+#line 496 "../src/IBusChewingEngine.gob"
+static void ___b_ibus_chewing_engine_reset (IBusEngine * engine) G_GNUC_UNUSED;
+#line 141 "ibus-chewing-engine.c"
+#line 501 "../src/IBusChewingEngine.gob"
+static void ___c_ibus_chewing_engine_page_up (IBusEngine * engine) G_GNUC_UNUSED;
+#line 144 "ibus-chewing-engine.c"
+#line 509 "../src/IBusChewingEngine.gob"
+static void ___d_ibus_chewing_engine_page_down (IBusEngine * engine) G_GNUC_UNUSED;
+#line 147 "ibus-chewing-engine.c"
+#line 517 "../src/IBusChewingEngine.gob"
+static void ___e_ibus_chewing_engine_cursor_up (IBusEngine * engine) G_GNUC_UNUSED;
+#line 150 "ibus-chewing-engine.c"
+#line 525 "../src/IBusChewingEngine.gob"
+static void ___f_ibus_chewing_engine_cursor_down (IBusEngine * engine) G_GNUC_UNUSED;
+#line 153 "ibus-chewing-engine.c"
+#line 533 "../src/IBusChewingEngine.gob"
+static void ___10_ibus_chewing_engine_enable (IBusEngine * engine) G_GNUC_UNUSED;
+#line 156 "ibus-chewing-engine.c"
+#line 538 "../src/IBusChewingEngine.gob"
+static void ___11_ibus_chewing_engine_disable (IBusEngine * engine) G_GNUC_UNUSED;
+#line 159 "ibus-chewing-engine.c"
+#line 543 "../src/IBusChewingEngine.gob"
+static void ___12_ibus_chewing_engine_focus_in (IBusEngine * engine) G_GNUC_UNUSED;
+#line 162 "ibus-chewing-engine.c"
+#line 548 "../src/IBusChewingEngine.gob"
+static void ___13_ibus_chewing_engine_focus_out (IBusEngine * engine) G_GNUC_UNUSED;
+#line 165 "ibus-chewing-engine.c"
+#line 553 "../src/IBusChewingEngine.gob"
+static void ___14_ibus_chewing_engine_set_capabilities (IBusEngine * engine, guint caps) G_GNUC_UNUSED;
+#line 168 "ibus-chewing-engine.c"
+#line 560 "../src/IBusChewingEngine.gob"
+static void ___15_ibus_chewing_engine_property_show (IBusEngine * engine, const gchar * prop_name) G_GNUC_UNUSED;
+#line 171 "ibus-chewing-engine.c"
+#line 567 "../src/IBusChewingEngine.gob"
+static void ___16_ibus_chewing_engine_property_hide (IBusEngine * engine, const gchar * prop_name) G_GNUC_UNUSED;
+#line 174 "ibus-chewing-engine.c"
+
+/* pointer to the class of our parent */
+static IBusEngineClass *parent_class = NULL;
+
+/* Short form macros */
+#define self_use_setting ibus_chewing_engine_use_setting
+#define self_restore_mode ibus_chewing_engine_restore_mode
+#define self_update ibus_chewing_engine_update
+#define self_refresh_property ibus_chewing_engine_refresh_property
+#define self_refresh_property_list ibus_chewing_engine_refresh_property_list
+#define self_hide_property_list ibus_chewing_engine_hide_property_list
+#define self_get_ibus_property_by_name ibus_chewing_engine_get_ibus_property_by_name
+GType
+ibus_chewing_engine_get_type (void)
+{
+	static GType type = 0;
+
+	if ___GOB_UNLIKELY(type == 0) {
+		static const GTypeInfo info = {
+			sizeof (IBusChewingEngineClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) ibus_chewing_engine_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL /* class_data */,
+			sizeof (IBusChewingEngine),
+			0 /* n_preallocs */,
+			(GInstanceInitFunc) ibus_chewing_engine_init,
+			NULL
+		};
+
+		type = g_type_register_static (IBUS_TYPE_ENGINE, "IBusChewingEngine", &info, (GTypeFlags)0);
+	}
+
+	return type;
+}
+
+/* a macro for creating a new object of our type */
+#define GET_NEW ((IBusChewingEngine *)g_object_new(ibus_chewing_engine_get_type(), NULL))
+
+/* a function for creating a new object of our type */
+#include <stdarg.h>
+static IBusChewingEngine * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED;
+static IBusChewingEngine *
+GET_NEW_VARG (const char *first, ...)
+{
+	IBusChewingEngine *ret;
+	va_list ap;
+	va_start (ap, first);
+	ret = (IBusChewingEngine *)g_object_new_valist (ibus_chewing_engine_get_type (), first, ap);
+	va_end (ap);
+	return ret;
+}
+
+
+static GObject *
+___constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::constructor"
+	GObject *obj_self;
+	IBusChewingEngine *self;
+	obj_self = G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_properties, construct_properties);
+	self = IBUS_CHEWING_ENGINE (obj_self);
+#line 341 "../src/IBusChewingEngine.gob"
+	ibus_chewing_engine_constructor (self);
+#line 240 "ibus-chewing-engine.c"
+	return obj_self;
+}
+#undef __GOB_FUNCTION__
+
+
+static void
+___finalize(GObject *obj_self)
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::finalize"
+	IBusChewingEngine *self G_GNUC_UNUSED = IBUS_CHEWING_ENGINE (obj_self);
+	gpointer priv G_GNUC_UNUSED = self->_priv;
+#line 144 "../src/IBusChewingEngine.gob"
+	if(self->icPreEdit) { ibus_chewing_pre_edit_free ((gpointer) self->icPreEdit); self->icPreEdit = NULL; }
+#line 254 "ibus-chewing-engine.c"
+#line 180 "../src/IBusChewingEngine.gob"
+	if(self->iChiEngSystrayIcon) { ibus_chewing_systray_icon_free ((gpointer) self->iChiEngSystrayIcon); self->iChiEngSystrayIcon = NULL; }
+#line 257 "ibus-chewing-engine.c"
+#line 205 "../src/IBusChewingEngine.gob"
+	if(self->chieng_prop) { g_object_unref ((gpointer) self->chieng_prop); self->chieng_prop = NULL; }
+#line 260 "ibus-chewing-engine.c"
+#line 213 "../src/IBusChewingEngine.gob"
+	if(self->alnumSize_prop) { g_object_unref ((gpointer) self->alnumSize_prop); self->alnumSize_prop = NULL; }
+#line 263 "ibus-chewing-engine.c"
+#line 217 "../src/IBusChewingEngine.gob"
+	if(self->prop_list) { g_object_unref ((gpointer) self->prop_list); self->prop_list = NULL; }
+#line 266 "ibus-chewing-engine.c"
+#line 223 "../src/IBusChewingEngine.gob"
+	if(self->_priv->pDisplay) { XCloseDisplay ((gpointer) self->_priv->pDisplay); self->_priv->pDisplay = NULL; }
+#line 269 "ibus-chewing-engine.c"
+	if(G_OBJECT_CLASS(parent_class)->finalize) \
+		(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);
+}
+#undef __GOB_FUNCTION__
+
+#line 269 "../src/IBusChewingEngine.gob"
+static void 
+ibus_chewing_engine_init (IBusChewingEngine * self G_GNUC_UNUSED)
+{
+#line 279 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::init"
+	self->_priv = G_TYPE_INSTANCE_GET_PRIVATE(self,IBUS_TYPE_CHEWING_ENGINE,IBusChewingEnginePrivate);
+#line 135 "../src/IBusChewingEngine.gob"
+	self->icPreEdit = NULL;
+#line 284 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->sDialog = NULL;
+#line 287 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->preEditText = NULL;
+#line 290 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->auxText = NULL;
+#line 293 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->outgoingText = NULL;
+#line 296 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->iChiEngSystrayIcon = NULL;
+#line 299 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->logFile = NULL;
+#line 302 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->_priv->statusFlags = 0;
+#line 305 "ibus-chewing-engine.c"
+#line 135 "../src/IBusChewingEngine.gob"
+	self->_priv->capabilite = 0;
+#line 308 "ibus-chewing-engine.c"
+#line 197 "../src/IBusChewingEngine.gob"
+	self->chieng_prop = 
+        g_object_ref_sink(ibus_property_new
+            ("InputMode", PROP_TYPE_NORMAL,
+             SELF_GET_CLASS(self)->chieng_prop_label_chi,
+             NULL,
+             SELF_GET_CLASS(self)->chieng_prop_tooltip_chi,
+             TRUE, TRUE,
+             PROP_STATE_UNCHECKED, NULL))
+    ;
+#line 319 "ibus-chewing-engine.c"
+#line 207 "../src/IBusChewingEngine.gob"
+	self->alnumSize_prop = 
+        g_object_ref_sink(ibus_property_new
+            ("chewing_alnumSize_prop", PROP_TYPE_NORMAL,
+            SELF_GET_CLASS(self)->alnumSize_prop_label_half,
+            NULL, NULL, TRUE, TRUE,
+            PROP_STATE_UNCHECKED, NULL))
+    ;
+#line 328 "ibus-chewing-engine.c"
+#line 215 "../src/IBusChewingEngine.gob"
+	self->prop_list = 
+        g_object_ref_sink(ibus_prop_list_new())
+    ;
+#line 333 "ibus-chewing-engine.c"
+#line 219 "../src/IBusChewingEngine.gob"
+	self->keymap_us =  ibus_keymap_get("us") ;
+#line 336 "ibus-chewing-engine.c"
+#line 221 "../src/IBusChewingEngine.gob"
+	self->_priv->pDisplay = 
+        XOpenDisplay(NULL)
+    ;
+#line 341 "ibus-chewing-engine.c"
+ {
+#line 269 "../src/IBusChewingEngine.gob"
+
+        /* initialize the object here */
+        IBUS_CHEWING_LOG(INFO, "init() %sinitialized",
+            (self->_priv->statusFlags & ENGINE_FLAG_INITIALIZED) ? "" : "un");
+        if (self->_priv->statusFlags & ENGINE_FLAG_INITIALIZED) {
+            return;
+        }
+
+        IBUS_CHEWING_LOG(INFO, "init() CHEWING_DATADIR_REAL=%s",
+                         QUOTE_ME(CHEWING_DATADIR_REAL));
+
+        gchar *logFilename = getenv("IBUS_CHEWING_LOGFILE");
+
+        if (logFilename != NULL) {
+            self->logFile = fopen(logFilename, "w+");
+            if (self->logFile == NULL) {
+                IBUS_CHEWING_LOG(WARN, "init() Cannot write to logfile %s, ignored",
+                                 logFilename);
+            } else {
+                mkdg_log_set_file(self->logFile);
+            }
+        }
+
+        if (self->icPreEdit == NULL) {
+
+#ifdef USE_GSETTINGS
+            MkdgBackend *backend =
+                mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID),
+                QUOTE_ME(PROJECT_SCHEMA_DIR), NULL);
+#elif defined USE_GCONF2
+            MkdgBackend *backend =
+                gconf2_backend_new(QUOTE_ME(PROJECT_SCHEMA_BASE), NULL);
+#else
+            MkdgBackend *backend = NULL;
+            g_error("Flag GSETTINGS_SUPPORT or GCONF2_SUPPORT are required!");
+            return;
+#endif          /* USE_GSETTINGS */
+
+            self->icPreEdit = ibus_chewing_pre_edit_new(backend);
+        }
+
+        g_assert(self->icPreEdit);
+
+        self->icPreEdit->engine = IBUS_ENGINE(self);
+
+        /* init properties */
+        ibus_prop_list_append(self->prop_list, self->chieng_prop);
+        ibus_prop_list_append(self->prop_list, self->alnumSize_prop);
+
+        ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_INITIALIZED);
+
+        /* In case we cannot open X display */
+        if (self->_priv->pDisplay == NULL) {
+            IBUS_CHEWING_LOG(WARN, "init() XOpenDisplay return NULL");
+        }
+
+        IBUS_CHEWING_LOG(DEBUG, "init() Done");
+    
+#line 402 "ibus-chewing-engine.c"
+ }
+}
+#undef __GOB_FUNCTION__
+#line 328 "../src/IBusChewingEngine.gob"
+static void 
+ibus_chewing_engine_class_init (IBusChewingEngineClass * klass G_GNUC_UNUSED)
+{
+#line 410 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::class_init"
+	GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) klass;
+	IBusEngineClass *ibus_engine_class = (IBusEngineClass *)klass;
+
+	g_type_class_add_private(klass,sizeof(IBusChewingEnginePrivate));
+#line 225 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_label_chi = 
+        g_object_ref_sink(ibus_text_new_from_static_string(_("Chi")))
+    ;
+#line 420 "ibus-chewing-engine.c"
+#line 228 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_label_eng = 
+        g_object_ref_sink(ibus_text_new_from_static_string(_("Eng")))
+    ;
+#line 425 "ibus-chewing-engine.c"
+#line 231 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_tooltip_chi = 
+        g_object_ref_sink(ibus_text_new_from_static_string
+                          (_("Click to switch to English")))
+    ;
+#line 431 "ibus-chewing-engine.c"
+#line 235 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_tooltip_eng = 
+        g_object_ref_sink(ibus_text_new_from_static_string
+                          (_("Click to switch to Chinese")))
+    ;
+#line 437 "ibus-chewing-engine.c"
+#line 239 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_symbol_chi = 
+        g_object_ref_sink(ibus_text_new_from_static_string("中"))
+    ;
+#line 442 "ibus-chewing-engine.c"
+#line 242 "../src/IBusChewingEngine.gob"
+	klass->chieng_prop_symbol_eng = 
+        g_object_ref_sink(ibus_text_new_from_static_string("英"))
+    ;
+#line 447 "ibus-chewing-engine.c"
+#line 245 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_label_full = 
+        g_object_ref_sink(ibus_text_new_from_static_string(_("Full")))
+    ;
+#line 452 "ibus-chewing-engine.c"
+#line 248 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_label_half = 
+        g_object_ref_sink(ibus_text_new_from_static_string(_("Half")))
+    ;
+#line 457 "ibus-chewing-engine.c"
+#line 251 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_tooltip_full = 
+        g_object_ref_sink(ibus_text_new_from_static_string
+                          (_("Click to switch to Half")))
+    ;
+#line 463 "ibus-chewing-engine.c"
+#line 255 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_tooltip_half = 
+        g_object_ref_sink(ibus_text_new_from_static_string
+                          (_("Click to switch to Full")))
+    ;
+#line 469 "ibus-chewing-engine.c"
+#line 259 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_symbol_full = 
+        g_object_ref_sink(ibus_text_new_from_static_string("全"))
+    ;
+#line 474 "ibus-chewing-engine.c"
+#line 262 "../src/IBusChewingEngine.gob"
+	klass->alnumSize_prop_symbol_half = 
+        g_object_ref_sink(ibus_text_new_from_static_string("半"))
+    ;
+#line 479 "ibus-chewing-engine.c"
+#line 265 "../src/IBusChewingEngine.gob"
+	klass->emptyText = 
+        g_object_ref_sink(ibus_text_new_from_static_string(""))
+    ;
+#line 484 "ibus-chewing-engine.c"
+
+	parent_class = g_type_class_ref (IBUS_TYPE_ENGINE);
+
+#line 496 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->reset = ___b_ibus_chewing_engine_reset;
+#line 501 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->page_up = ___c_ibus_chewing_engine_page_up;
+#line 509 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->page_down = ___d_ibus_chewing_engine_page_down;
+#line 517 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->cursor_up = ___e_ibus_chewing_engine_cursor_up;
+#line 525 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->cursor_down = ___f_ibus_chewing_engine_cursor_down;
+#line 533 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->enable = ___10_ibus_chewing_engine_enable;
+#line 538 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->disable = ___11_ibus_chewing_engine_disable;
+#line 543 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->focus_in = ___12_ibus_chewing_engine_focus_in;
+#line 548 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->focus_out = ___13_ibus_chewing_engine_focus_out;
+#line 553 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->set_capabilities = ___14_ibus_chewing_engine_set_capabilities;
+#line 560 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->property_show = ___15_ibus_chewing_engine_property_show;
+#line 567 "../src/IBusChewingEngine.gob"
+	ibus_engine_class->property_hide = ___16_ibus_chewing_engine_property_hide;
+#line 512 "ibus-chewing-engine.c"
+	g_object_class->constructor = ___constructor;
+	g_object_class->finalize = ___finalize;
+ {
+#line 328 "../src/IBusChewingEngine.gob"
+
+        ibus_engine_class->property_activate =
+            ibus_chewing_engine_property_activate;
+        ibus_engine_class->process_key_event =
+            ibus_chewing_engine_process_key_event;
+        ibus_engine_class->candidate_clicked =
+            ibus_chewing_engine_candidate_clicked;
+#if IBUS_CHECK_VERSION(1, 5, 4)
+        ibus_engine_class->set_content_type =
+            ibus_chewing_engine_set_content_type;
+#endif
+    
+#line 529 "ibus-chewing-engine.c"
+ }
+}
+#undef __GOB_FUNCTION__
+
+
+
+#line 341 "../src/IBusChewingEngine.gob"
+static void 
+ibus_chewing_engine_constructor (IBusChewingEngine * self G_GNUC_UNUSED)
+{
+#line 540 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::constructor"
+{
+#line 341 "../src/IBusChewingEngine.gob"
+	
+        /* GOB need this for generating constructor */
+    }}
+#line 547 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 345 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_use_setting (IBusChewingEngine * self)
+{
+#line 554 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::use_setting"
+#line 345 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 345 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 560 "ibus-chewing-engine.c"
+{
+#line 345 "../src/IBusChewingEngine.gob"
+	
+        IBUS_CHEWING_LOG(INFO, "use_setting()");
+
+        ibus_chewing_pre_edit_use_all_configure(self->icPreEdit);
+
+        /* Input style */
+        if (ibus_chewing_properties_read_boolean_general(self->icPreEdit->iProperties,
+            "ibus/general", "embed-preedit-text", NULL)) {
+            self->_priv->inputStyle = CHEWING_INPUT_STYLE_IN_APPLICATION;
+        } else {
+            self->_priv->inputStyle = CHEWING_INPUT_STYLE_IN_CANDIDATE;
+        }
+    }}
+#line 576 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 359 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_restore_mode (IBusChewingEngine * self)
+{
+#line 583 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::restore_mode"
+#line 359 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 359 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 589 "ibus-chewing-engine.c"
+{
+#line 359 "../src/IBusChewingEngine.gob"
+	
+        IBUS_CHEWING_LOG(DEBUG, "restore_mode() statusFlags=%x", self->_priv->statusFlags);
+        if (self->_priv->pDisplay != NULL) {
+            /* Restore Led Mode only make sense if pDisplay is available */
+            if (ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_SYNC_FROM_IM)) {
+                IBUS_CHEWING_LOG(DEBUG, "restore_mode() FLAG_SYNC_FROM_IM");
+                if (ibus_chewing_engine_is_chinese_mode(self) == is_caps_lock(self)) {
+                    /* ChiEng mode does not agree each other */
+                    set_caps_led(!ibus_chewing_engine_is_chinese_mode(self), self->_priv->pDisplay);
+                }
+            } else if (ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD)) {
+                IBUS_CHEWING_LOG(DEBUG, "restore_mode() FLAG_SYNC_FROM_KEYBOARD");
+                chewing_set_ChiEngMode(self->icPreEdit->context, (is_caps_lock(self))? 0: CHINESE_MODE);
+            }
+            self_refresh_property(self, "InputMode");
+        }
+    }}
+#line 609 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 377 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_update (IBusChewingEngine * self)
+{
+#line 616 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::update"
+#line 377 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 377 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 622 "ibus-chewing-engine.c"
+{
+#line 377 "../src/IBusChewingEngine.gob"
+	
+        IBUS_CHEWING_LOG(DEBUG, "update() statusFlags=%x", self->_priv->statusFlags);
+        update_pre_edit_text(self);
+        update_aux_text(self);
+        commit_text(self);
+
+        IBUS_CHEWING_LOG(DEBUG,
+                         "update() nPhoneSeq=%d statusFlags=%x",
+                         chewing_get_phoneSeqLen(self->icPreEdit->context),
+                         self->_priv->statusFlags);
+        update_lookup_table(self);
+        self_refresh_property_list(self);
+    }}
+#line 638 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 391 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_refresh_property (IBusChewingEngine * self, const gchar * prop_name)
+{
+#line 645 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::refresh_property"
+#line 391 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 391 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 651 "ibus-chewing-engine.c"
+{
+#line 391 "../src/IBusChewingEngine.gob"
+	
+#ifndef UNIT_TEST
+        IBUS_CHEWING_LOG(DEBUG, "refresh_property(%s) status=%x",
+                         prop_name, self->_priv->statusFlags);
+
+        if (ibus_chewing_systray_chi_eng_icon_create_or_hide(self)) {
+            ibus_chewing_systray_chi_eng_icon_refresh_value(self);
+        }
+
+        if (STRING_EQUALS(prop_name, "InputMode")) {
+
+            if (ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit)) {
+                /* Chinese  */
+                ibus_property_set_label(self->chieng_prop,
+                                        SELF_GET_CLASS(self)->chieng_prop_label_chi);
+                ibus_property_set_tooltip(self->chieng_prop,
+                                          SELF_GET_CLASS(self)->chieng_prop_tooltip_chi);
+#if IBUS_CHECK_VERSION(1, 5, 0)
+                ibus_property_set_symbol(self->chieng_prop,
+                                         SELF_GET_CLASS(self)->chieng_prop_symbol_chi);
+#endif
+            } else {
+                /* English  */
+                ibus_property_set_label(self->chieng_prop,
+                                        SELF_GET_CLASS(self)->chieng_prop_label_eng);
+                ibus_property_set_tooltip(self->chieng_prop,
+                                          SELF_GET_CLASS(self)->chieng_prop_tooltip_eng);
+#if IBUS_CHECK_VERSION(1, 5, 0)
+                ibus_property_set_symbol(self->chieng_prop,
+                                         SELF_GET_CLASS(self)->chieng_prop_symbol_eng);
+#endif
+            }
+
+            ibus_engine_update_property(IBUS_ENGINE(self), self->chieng_prop);
+
+        } else if (STRING_EQUALS(prop_name, "chewing_alnumSize_prop")) {
+
+            if (chewing_get_ShapeMode(self->icPreEdit->context)) {
+                /* Full-Sized Shape */
+                ibus_property_set_label(self->alnumSize_prop,
+                                        SELF_GET_CLASS(self)->alnumSize_prop_label_full);
+                ibus_property_set_tooltip(self->alnumSize_prop,
+                                          SELF_GET_CLASS(self)->alnumSize_prop_tooltip_full);
+#if IBUS_CHECK_VERSION(1, 5, 0)
+                ibus_property_set_symbol(self->alnumSize_prop,
+                                          SELF_GET_CLASS(self)->alnumSize_prop_symbol_full);
+#endif
+            } else {
+                /* Half-Sized Shape */
+                ibus_property_set_label(self->alnumSize_prop,
+                                        SELF_GET_CLASS(self)->alnumSize_prop_label_half);
+                ibus_property_set_tooltip(self->alnumSize_prop,
+                                          SELF_GET_CLASS(self)->alnumSize_prop_tooltip_half);
+#if IBUS_CHECK_VERSION(1, 5, 0)
+                ibus_property_set_symbol(self->alnumSize_prop,
+                                          SELF_GET_CLASS(self)->alnumSize_prop_symbol_half);
+#endif
+            }
+
+            if (self->_priv->statusFlags & ENGINE_FLAG_PROPERTIES_REGISTERED)
+                ibus_engine_update_property(IBUS_ENGINE(self),self->alnumSize_prop);
+        }
+#endif
+    }}
+#line 718 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * ibus_chewing_engine_refresh_property_list:
+ * @self: this instances.
+ *
+ * Refresh the property list (language bar).
+ **/
+#line 462 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_refresh_property_list (IBusChewingEngine * self)
+{
+#line 731 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::refresh_property_list"
+#line 462 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 462 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 737 "ibus-chewing-engine.c"
+{
+#line 462 "../src/IBusChewingEngine.gob"
+	
+#ifndef UNIT_TEST
+        self_refresh_property(self, "InputMode");
+        self_refresh_property(self, "chewing_alnumSize_prop");
+#endif
+    }}
+#line 746 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * ibus_chewing_engine_hide_property_list:
+ * @self: this instances.
+ *
+ * Hide the property list (language bar).
+ **/
+#line 475 "../src/IBusChewingEngine.gob"
+void 
+ibus_chewing_engine_hide_property_list (IBusChewingEngine * self)
+{
+#line 759 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::hide_property_list"
+#line 475 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (self != NULL);
+#line 475 "../src/IBusChewingEngine.gob"
+	g_return_if_fail (IBUS_IS_CHEWING_ENGINE (self));
+#line 765 "ibus-chewing-engine.c"
+{
+#line 475 "../src/IBusChewingEngine.gob"
+	
+#ifndef UNIT_TEST
+        IBUS_ENGINE_GET_CLASS(self)->property_hide(IBUS_ENGINE(self),
+                                                   "chewing_alnumSize_prop");
+#endif
+    }}
+#line 774 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 482 "../src/IBusChewingEngine.gob"
+static IBusProperty * 
+ibus_chewing_engine_get_ibus_property_by_name (IBusChewingEngine * self, const gchar * prop_name)
+{
+#line 781 "ibus-chewing-engine.c"
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::get_ibus_property_by_name"
+#line 482 "../src/IBusChewingEngine.gob"
+	g_return_val_if_fail (self != NULL, (IBusProperty * )0);
+#line 482 "../src/IBusChewingEngine.gob"
+	g_return_val_if_fail (IBUS_IS_CHEWING_ENGINE (self), (IBusProperty * )0);
+#line 787 "ibus-chewing-engine.c"
+{
+#line 482 "../src/IBusChewingEngine.gob"
+	
+        if (STRING_EQUALS(prop_name, "InputMode")) {
+            return self->chieng_prop;
+        } else if (STRING_EQUALS(prop_name, "chewing_alnumSize_prop")) {
+            return self->alnumSize_prop;
+        }
+        IBUS_CHEWING_LOG(MSG, "get_ibus_property_by_name(%s): NULL is returned", prop_name);
+        return NULL;
+    }}
+#line 799 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+
+#line 496 "../src/IBusChewingEngine.gob"
+static void 
+___b_ibus_chewing_engine_reset (IBusEngine * engine G_GNUC_UNUSED)
+#line 805 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->reset) \
+		(* IBUS_ENGINE_CLASS(parent_class)->reset)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::reset"
+{
+#line 496 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        ibus_chewing_engine_reset(self);
+    }}
+#line 817 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 501 "../src/IBusChewingEngine.gob"
+static void 
+___c_ibus_chewing_engine_page_up (IBusEngine * engine G_GNUC_UNUSED)
+#line 824 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->page_up) \
+		(* IBUS_ENGINE_CLASS(parent_class)->page_up)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::page_up"
+{
+#line 501 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        if (is_password(self))
+            return;
+        ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Page_Up, 0);
+        self_update(self);
+    }}
+#line 839 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 509 "../src/IBusChewingEngine.gob"
+static void 
+___d_ibus_chewing_engine_page_down (IBusEngine * engine G_GNUC_UNUSED)
+#line 846 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->page_down) \
+		(* IBUS_ENGINE_CLASS(parent_class)->page_down)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::page_down"
+{
+#line 509 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        if (is_password(self))
+            return;
+        ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Page_Down, 0);
+        self_update(self);
+    }}
+#line 861 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 517 "../src/IBusChewingEngine.gob"
+static void 
+___e_ibus_chewing_engine_cursor_up (IBusEngine * engine G_GNUC_UNUSED)
+#line 868 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->cursor_up) \
+		(* IBUS_ENGINE_CLASS(parent_class)->cursor_up)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::cursor_up"
+{
+#line 517 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        if (is_password(self))
+            return;
+        ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Up, 0);
+        self_update(self);
+    }}
+#line 883 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 525 "../src/IBusChewingEngine.gob"
+static void 
+___f_ibus_chewing_engine_cursor_down (IBusEngine * engine G_GNUC_UNUSED)
+#line 890 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->cursor_down) \
+		(* IBUS_ENGINE_CLASS(parent_class)->cursor_down)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::cursor_down"
+{
+#line 525 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        if (is_password(self))
+            return;
+        ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Down, 0);
+        self_update(self);
+    }}
+#line 905 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 533 "../src/IBusChewingEngine.gob"
+static void 
+___10_ibus_chewing_engine_enable (IBusEngine * engine G_GNUC_UNUSED)
+#line 912 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->enable) \
+		(* IBUS_ENGINE_CLASS(parent_class)->enable)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::enable"
+{
+#line 533 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        ibus_chewing_engine_enable(self);
+    }}
+#line 924 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 538 "../src/IBusChewingEngine.gob"
+static void 
+___11_ibus_chewing_engine_disable (IBusEngine * engine G_GNUC_UNUSED)
+#line 931 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->disable) \
+		(* IBUS_ENGINE_CLASS(parent_class)->disable)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::disable"
+{
+#line 538 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        ibus_chewing_engine_disable(self);
+    }}
+#line 943 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 543 "../src/IBusChewingEngine.gob"
+static void 
+___12_ibus_chewing_engine_focus_in (IBusEngine * engine G_GNUC_UNUSED)
+#line 950 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->focus_in) \
+		(* IBUS_ENGINE_CLASS(parent_class)->focus_in)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::focus_in"
+{
+#line 543 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        ibus_chewing_engine_focus_in(self);
+    }}
+#line 962 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 548 "../src/IBusChewingEngine.gob"
+static void 
+___13_ibus_chewing_engine_focus_out (IBusEngine * engine G_GNUC_UNUSED)
+#line 969 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->focus_out) \
+		(* IBUS_ENGINE_CLASS(parent_class)->focus_out)(___engine); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::focus_out"
+{
+#line 548 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        ibus_chewing_engine_focus_out(self);
+    }}
+#line 981 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 553 "../src/IBusChewingEngine.gob"
+static void 
+___14_ibus_chewing_engine_set_capabilities (IBusEngine * engine G_GNUC_UNUSED, guint caps)
+#line 988 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine,___caps) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->set_capabilities) \
+		(* IBUS_ENGINE_CLASS(parent_class)->set_capabilities)(___engine,___caps); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::set_capabilities"
+{
+#line 553 "../src/IBusChewingEngine.gob"
+	
+        Self *self = SELF(engine);
+        self->_priv->capabilite = caps;
+        IBUS_CHEWING_LOG(MSG, "***** set_capabilities(%x): statusFlags=%x",
+                         caps, self->_priv->statusFlags);
+    }}
+#line 1002 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 560 "../src/IBusChewingEngine.gob"
+static void 
+___15_ibus_chewing_engine_property_show (IBusEngine * engine G_GNUC_UNUSED, const gchar * prop_name)
+#line 1009 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine,___prop_name) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->property_show) \
+		(* IBUS_ENGINE_CLASS(parent_class)->property_show)(___engine,___prop_name); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::property_show"
+{
+#line 560 "../src/IBusChewingEngine.gob"
+	
+        IBUS_CHEWING_LOG(INFO, "property_show(-, %s)", prop_name);
+        Self *self = SELF(engine);
+        IBusProperty *prop = self_get_ibus_property_by_name(self, prop_name);
+        ibus_property_set_visible(prop, TRUE);
+    }}
+#line 1023 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 567 "../src/IBusChewingEngine.gob"
+static void 
+___16_ibus_chewing_engine_property_hide (IBusEngine * engine G_GNUC_UNUSED, const gchar * prop_name)
+#line 1030 "ibus-chewing-engine.c"
+#define PARENT_HANDLER(___engine,___prop_name) \
+	{ if(IBUS_ENGINE_CLASS(parent_class)->property_hide) \
+		(* IBUS_ENGINE_CLASS(parent_class)->property_hide)(___engine,___prop_name); }
+{
+#define __GOB_FUNCTION__ "IBus:Chewing:Engine::property_hide"
+{
+#line 567 "../src/IBusChewingEngine.gob"
+	
+        IBUS_CHEWING_LOG(INFO, "property_hide(-, %s)", prop_name);
+        Self *self = SELF(engine);
+        IBusProperty *prop = self_get_ibus_property_by_name(self, prop_name);
+        ibus_property_set_visible(prop, FALSE);
+    }}
+#line 1044 "ibus-chewing-engine.c"
+#undef __GOB_FUNCTION__
+#undef PARENT_HANDLER
+
+#line 587 "../src/IBusChewingEngine.gob"
+
+#include "IBusChewingEngine-signal.c"
+#include "IBusChewingEngine-input-events.c"
+
+#line 1053 "ibus-chewing-engine.c"
diff --git a/bin/ibus-chewing-engine.h b/bin/ibus-chewing-engine.h
new file mode 100644
index 0000000..89289b2
--- /dev/null
+++ b/bin/ibus-chewing-engine.h
@@ -0,0 +1,187 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+
+
+/*
+ * Copyright © 2009,2010  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009,2010  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that ill 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#include <stdlib.h>
+#include <libintl.h>
+#include <ibus.h>
+#include <chewing.h>
+#include <string.h>
+#include <stdio.h>
+#define GETTEXT_PACKAGE "gtk20"
+#include <glib/gi18n.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <ctype.h>
+#include "IBusChewingUtil.h"
+#include "IBusChewingProperties.h"
+#include "IBusChewingPreEdit.h"
+#include "IBusChewingSystray.h"
+#ifdef USE_GSETTINGS
+#include "GSettingsBackend.h"
+#endif
+#ifdef USE_GCONF2
+#include "GConf2Backend.h"
+#endif
+
+#include <glib.h>
+#include <glib-object.h>
+#ifndef __IBUS_CHEWING_ENGINE_H__
+#define __IBUS_CHEWING_ENGINE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+typedef enum {
+	CHEWING_INPUT_STYLE_IN_APPLICATION,
+	CHEWING_INPUT_STYLE_IN_CANDIDATE
+} ChewingInputStyle;
+#define CHEWING_TYPE_INPUT_STYLE chewing_input_style_get_type()
+GType chewing_input_style_get_type (void) G_GNUC_CONST;
+
+
+typedef enum {
+	ENGINE_FLAG_INITIALIZED = 0x1,
+	ENGINE_FLAG_ENABLED = 0x2,
+	ENGINE_FLAG_FOCUS_IN = 0x4,
+	ENGINE_FLAG_IS_PASSWORD = 0x8,
+	ENGINE_FLAG_PROPERTIES_REGISTERED = 0x10
+} EngineFlag;
+#define ENGINE_TYPE_FLAG engine_flag_get_type()
+GType engine_flag_get_type (void) G_GNUC_CONST;
+
+
+
+extern MkdgPropertySpec propSpecs[];
+extern const gchar *page_labels[];
+extern const gchar *button_labels[];
+extern GtkResponseType button_responses[];
+
+#define ibus_chewing_engine_has_status_flag(self, f) mkdg_has_flag(self->_priv->statusFlags, f)
+#define ibus_chewing_engine_set_status_flag(self, f) mkdg_set_flag(self->_priv->statusFlags, f)
+#define ibus_chewing_engine_clear_status_flag(self, f) mkdg_clear_flag(self->_priv->statusFlags, f)
+
+#define ibus_chewing_engine_has_capabilite(self, f) mkdg_has_flag(self->_priv->capabilite, f)
+#define ibus_chewing_engine_set_capabilite(self, f) mkdg_set_flag(self->_priv->capabilite, f)
+#define ibus_chewing_engine_clear_capabilite(self, f) mkdg_clear_flag(self->_priv->capabilite, f)
+
+#define is_password(self) ibus_chewing_engine_has_status_flag(self, ENGINE_FLAG_IS_PASSWORD)
+#define ibus_chewing_engine_is_chinese_mode(self) ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit)
+#define is_caps_lock(self) (is_caps_led_on(self->_priv->pDisplay))
+
+#define ibus_text_is_empty(iText) ((iText == NULL) || STRING_IS_EMPTY(iText->text))
+#define is_plain_chewing ibus_chewing_pre_edit_get_property_boolean(self->icPreEdit, "plain-zhuyin")
+#define cursor_current chewing_cursor_Current(self->icPreEdit->context)
+
+
+/*
+ * Type checking and casting macros
+ */
+#define IBUS_TYPE_CHEWING_ENGINE	(ibus_chewing_engine_get_type())
+#define IBUS_CHEWING_ENGINE(obj)	G_TYPE_CHECK_INSTANCE_CAST((obj), ibus_chewing_engine_get_type(), IBusChewingEngine)
+#define IBUS_CHEWING_ENGINE_CONST(obj)	G_TYPE_CHECK_INSTANCE_CAST((obj), ibus_chewing_engine_get_type(), IBusChewingEngine const)
+#define IBUS_CHEWING_ENGINE_CLASS(klass)	G_TYPE_CHECK_CLASS_CAST((klass), ibus_chewing_engine_get_type(), IBusChewingEngineClass)
+#define IBUS_IS_CHEWING_ENGINE(obj)	G_TYPE_CHECK_INSTANCE_TYPE((obj), ibus_chewing_engine_get_type ())
+
+#define IBUS_CHEWING_ENGINE_GET_CLASS(obj)	G_TYPE_INSTANCE_GET_CLASS((obj), ibus_chewing_engine_get_type(), IBusChewingEngineClass)
+
+/* Private structure type */
+typedef struct _IBusChewingEnginePrivate IBusChewingEnginePrivate;
+
+/*
+ * Main object structure
+ */
+#ifndef __TYPEDEF_IBUS_CHEWING_ENGINE__
+#define __TYPEDEF_IBUS_CHEWING_ENGINE__
+typedef struct _IBusChewingEngine IBusChewingEngine;
+#endif
+struct _IBusChewingEngine {
+	IBusEngine __parent__;
+	/*< public >*/
+	IBusChewingPreEdit * icPreEdit;
+	GtkWidget * sDialog;
+	IBusText * preEditText;
+	IBusText * auxText;
+	IBusText * outgoingText;
+	IBusProperty * chieng_prop;
+	IBusProperty * alnumSize_prop;
+	IBusPropList * prop_list;
+	/*< private >*/
+	IBusChewingSystrayIcon * iChiEngSystrayIcon; /* protected */
+	FILE * logFile; /* protected */
+	IBusKeymap * keymap_us; /* protected */
+	IBusChewingEnginePrivate *_priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _IBusChewingEngineClass IBusChewingEngineClass;
+struct _IBusChewingEngineClass {
+	IBusEngineClass __parent__;
+	IBusText * chieng_prop_label_chi;
+	IBusText * chieng_prop_label_eng;
+	IBusText * chieng_prop_tooltip_chi;
+	IBusText * chieng_prop_tooltip_eng;
+	IBusText * chieng_prop_symbol_chi;
+	IBusText * chieng_prop_symbol_eng;
+	IBusText * alnumSize_prop_label_full;
+	IBusText * alnumSize_prop_label_half;
+	IBusText * alnumSize_prop_tooltip_full;
+	IBusText * alnumSize_prop_tooltip_half;
+	IBusText * alnumSize_prop_symbol_full;
+	IBusText * alnumSize_prop_symbol_half;
+	IBusText * emptyText;
+};
+
+
+/*
+ * Public methods
+ */
+GType	ibus_chewing_engine_get_type	(void) G_GNUC_CONST;
+#line 462 "../src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_refresh_property_list	(IBusChewingEngine * self);
+#line 167 "ibus-chewing-engine.h"
+#line 475 "../src/IBusChewingEngine.gob"
+void 	ibus_chewing_engine_hide_property_list	(IBusChewingEngine * self);
+#line 170 "ibus-chewing-engine.h"
+
+
+void ibus_chewing_engine_reset(IBusChewingEngine *self);
+void ibus_chewing_engine_enable(IBusChewingEngine *self);
+void ibus_chewing_engine_disable(IBusChewingEngine *self);
+void ibus_chewing_engine_focus_in(IBusChewingEngine *self);
+void ibus_chewing_engine_focus_out(IBusChewingEngine *self);
+gboolean ibus_chewing_engine_process_key_event(IBusEngine *self,
+                                               guint key_sym,
+                                               guint keycode,
+                                               guint modifiers);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
diff --git a/bin/maker-dialog-private.h b/bin/maker-dialog-private.h
new file mode 100644
index 0000000..ca0ede3
--- /dev/null
+++ b/bin/maker-dialog-private.h
@@ -0,0 +1,60 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+
+
+/*
+ * Copyright © 2009  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#line 2 "../src/MakerDialog.gob"
+#line 28 "maker-dialog-private.h"
+#ifndef __MAKER_DIALOG_PRIVATE_H__
+#define __MAKER_DIALOG_PRIVATE_H__
+
+#include "maker-dialog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct _MakerDialogPrivate {
+#line 62 "../src/MakerDialog.gob"
+	GHashTable * containerTable;
+#line 66 "../src/MakerDialog.gob"
+	GHashTable * widgetTable;
+#line 69 "../src/MakerDialog.gob"
+	GHashTable * notebookContentTable;
+#line 72 "../src/MakerDialog.gob"
+	GStringChunk * widgetIds;
+#line 75 "../src/MakerDialog.gob"
+	GPtrArray * pageLabels;
+#line 82 "../src/MakerDialog.gob"
+	MkdgProperties * properties;
+#line 51 "maker-dialog-private.h"
+};
+#line 211 "../src/MakerDialog.gob"
+gboolean 	maker_dialog_prepare	(MakerDialog * self);
+#line 55 "maker-dialog-private.h"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
diff --git a/bin/maker-dialog.c b/bin/maker-dialog.c
new file mode 100644
index 0000000..bf72b63
--- /dev/null
+++ b/bin/maker-dialog.c
@@ -0,0 +1,646 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+/* End world hunger, donate to the World Food Programme, http://www.wfp.org */
+
+
+#line 2 "../src/MakerDialog.gob"
+
+/*
+ * Copyright © 2009  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#line 30 "maker-dialog.c"
+#define GOB_VERSION_MAJOR 2
+#define GOB_VERSION_MINOR 0
+#define GOB_VERSION_PATCHLEVEL 19
+
+#define selfp (self->_priv)
+
+#include <string.h> /* memset() */
+
+#include "maker-dialog.h"
+
+#include "maker-dialog-private.h"
+
+#ifdef G_LIKELY
+#define ___GOB_LIKELY(expr) G_LIKELY(expr)
+#define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr)
+#else /* ! G_LIKELY */
+#define ___GOB_LIKELY(expr) (expr)
+#define ___GOB_UNLIKELY(expr) (expr)
+#endif /* G_LIKELY */
+
+#line 51 "../src/MakerDialog.gob"
+
+#define GETTEXT_PACKAGE "gtk20"
+#include <glib/gi18n.h>
+
+#line 56 "maker-dialog.c"
+/* self casting macros */
+#define SELF(x) MAKER_DIALOG(x)
+#define SELF_CONST(x) MAKER_DIALOG_CONST(x)
+#define IS_SELF(x) MAKER_IS_DIALOG(x)
+#define TYPE_SELF MAKER_TYPE_DIALOG
+#define SELF_CLASS(x) MAKER_DIALOG_CLASS(x)
+
+#define SELF_GET_CLASS(x) MAKER_DIALOG_GET_CLASS(x)
+
+/* self typedefs */
+typedef MakerDialog Self;
+typedef MakerDialogClass SelfClass;
+
+/* here are local prototypes */
+static void maker_dialog_class_init (MakerDialogClass * c) G_GNUC_UNUSED;
+#line 89 "../src/MakerDialog.gob"
+static void maker_dialog_init (MakerDialog * self) G_GNUC_UNUSED;
+#line 74 "maker-dialog.c"
+
+/* pointer to the class of our parent */
+static GtkDialogClass *parent_class = NULL;
+
+/* Short form macros */
+#define self_new maker_dialog_new
+#define self_new_full maker_dialog_new_full
+#define self_add_property maker_dialog_add_property
+#define self_add_all_properties maker_dialog_add_all_properties
+#define self_prepare maker_dialog_prepare
+#define self_assign_widget_value maker_dialog_assign_widget_value
+#define self_assign_all_widgets_values maker_dialog_assign_all_widgets_values
+#define self_save_all_widgets_values maker_dialog_save_all_widgets_values
+#define self_get_widget_value maker_dialog_get_widget_value
+#define self_set_widget_value maker_dialog_set_widget_value
+#define self_show maker_dialog_show
+#define self_get_widget_by_key maker_dialog_get_widget_by_key
+GType
+maker_dialog_get_type (void)
+{
+	static GType type = 0;
+
+	if ___GOB_UNLIKELY(type == 0) {
+		static const GTypeInfo info = {
+			sizeof (MakerDialogClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) maker_dialog_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL /* class_data */,
+			sizeof (MakerDialog),
+			0 /* n_preallocs */,
+			(GInstanceInitFunc) maker_dialog_init,
+			NULL
+		};
+
+		type = g_type_register_static (GTK_TYPE_DIALOG, "MakerDialog", &info, (GTypeFlags)0);
+	}
+
+	return type;
+}
+
+/* a macro for creating a new object of our type */
+#define GET_NEW ((MakerDialog *)g_object_new(maker_dialog_get_type(), NULL))
+
+/* a function for creating a new object of our type */
+#include <stdarg.h>
+static MakerDialog * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED;
+static MakerDialog *
+GET_NEW_VARG (const char *first, ...)
+{
+	MakerDialog *ret;
+	va_list ap;
+	va_start (ap, first);
+	ret = (MakerDialog *)g_object_new_valist (maker_dialog_get_type (), first, ap);
+	va_end (ap);
+	return ret;
+}
+
+
+static void
+___finalize(GObject *obj_self)
+{
+#define __GOB_FUNCTION__ "Maker:Dialog::finalize"
+	MakerDialog *self G_GNUC_UNUSED = MAKER_DIALOG (obj_self);
+	gpointer priv G_GNUC_UNUSED = self->_priv;
+#line 58 "../src/MakerDialog.gob"
+	if(self->notebookWgt) { mkdg_wgt_destroy ((gpointer) self->notebookWgt); self->notebookWgt = NULL; }
+#line 143 "maker-dialog.c"
+#line 64 "../src/MakerDialog.gob"
+	if(self->_priv->containerTable) { g_hash_table_destroy ((gpointer) self->_priv->containerTable); self->_priv->containerTable = NULL; }
+#line 146 "maker-dialog.c"
+#line 68 "../src/MakerDialog.gob"
+	if(self->_priv->widgetTable) { g_hash_table_destroy ((gpointer) self->_priv->widgetTable); self->_priv->widgetTable = NULL; }
+#line 149 "maker-dialog.c"
+#line 71 "../src/MakerDialog.gob"
+	if(self->_priv->notebookContentTable) { g_hash_table_destroy ((gpointer) self->_priv->notebookContentTable); self->_priv->notebookContentTable = NULL; }
+#line 152 "maker-dialog.c"
+#line 74 "../src/MakerDialog.gob"
+	if(self->_priv->widgetIds) { g_string_chunk_free ((gpointer) self->_priv->widgetIds); self->_priv->widgetIds = NULL; }
+#line 155 "maker-dialog.c"
+#define pageLabels (self->_priv->pageLabels)
+#define VAR pageLabels
+	{
+#line 76 "../src/MakerDialog.gob"
+	
+            if (VAR) {
+                g_ptr_array_free(VAR, TRUE);
+            }
+        }
+#line 165 "maker-dialog.c"
+	memset(&(pageLabels), 0, sizeof(pageLabels));
+#undef VAR
+#undef pageLabels
+#define properties (self->_priv->properties)
+#define VAR properties
+	{
+#line 83 "../src/MakerDialog.gob"
+	
+            if (VAR) {
+                mkdg_properties_free(VAR);
+            }
+        }
+#line 178 "maker-dialog.c"
+	memset(&(properties), 0, sizeof(properties));
+#undef VAR
+#undef properties
+	if(G_OBJECT_CLASS(parent_class)->finalize) \
+		(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);
+}
+#undef __GOB_FUNCTION__
+
+static void 
+maker_dialog_class_init (MakerDialogClass * c G_GNUC_UNUSED)
+{
+#define __GOB_FUNCTION__ "Maker:Dialog::class_init"
+	GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) c;
+
+	g_type_class_add_private(c,sizeof(MakerDialogPrivate));
+
+	parent_class = g_type_class_ref (GTK_TYPE_DIALOG);
+
+	g_object_class->finalize = ___finalize;
+}
+#undef __GOB_FUNCTION__
+#line 89 "../src/MakerDialog.gob"
+static void 
+maker_dialog_init (MakerDialog * self G_GNUC_UNUSED)
+{
+#line 204 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::init"
+	self->_priv = G_TYPE_INSTANCE_GET_PRIVATE(self,MAKER_TYPE_DIALOG,MakerDialogPrivate);
+#line 51 "../src/MakerDialog.gob"
+	self->notebookWgt = NULL;
+#line 209 "maker-dialog.c"
+#line 63 "../src/MakerDialog.gob"
+	self->_priv->containerTable =  g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ;
+#line 212 "maker-dialog.c"
+#line 67 "../src/MakerDialog.gob"
+	self->_priv->widgetTable =  g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ;
+#line 215 "maker-dialog.c"
+#line 70 "../src/MakerDialog.gob"
+	self->_priv->notebookContentTable =  g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ;
+#line 218 "maker-dialog.c"
+#line 73 "../src/MakerDialog.gob"
+	self->_priv->widgetIds =  g_string_chunk_new(MAKER_DIALOG_ID_LENGTH) ;
+#line 221 "maker-dialog.c"
+#line 73 "../src/MakerDialog.gob"
+	self->_priv->pageLabels = NULL;
+#line 224 "maker-dialog.c"
+#line 76 "../src/MakerDialog.gob"
+	self->_priv->properties = NULL;
+#line 227 "maker-dialog.c"
+ {
+#line 89 "../src/MakerDialog.gob"
+
+        /* initialize the object here */
+    
+#line 233 "maker-dialog.c"
+ }
+}
+#undef __GOB_FUNCTION__
+
+
+
+#line 93 "../src/MakerDialog.gob"
+MakerDialog * 
+maker_dialog_new (void)
+{
+#line 244 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::new"
+{
+#line 93 "../src/MakerDialog.gob"
+	
+        Self * self = GET_NEW; 
+        return self;
+    }}
+#line 252 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+#line 98 "../src/MakerDialog.gob"
+MakerDialog * 
+maker_dialog_new_full (MkdgProperties * properties, const gchar * title, MkdgWidgetFlag wFlags, MkdgButtonFlag bFlags)
+{
+#line 259 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::new_full"
+{
+#line 101 "../src/MakerDialog.gob"
+	
+        Self * self = GET_NEW; 
+        GtkDialog * dialog = GTK_DIALOG(self);
+        gtk_window_set_title(GTK_WINDOW(dialog), title);
+        gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
+        gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+        self->wFlags = wFlags;
+        self->_priv->properties = properties;
+
+        gint i; 
+        /* Create Buttons */
+        for (i = MKDG_BUTTON_INDEX_INVALID -1; i >= 0; i--) {
+            if ( bFlags & (1 << i)) {
+                const gchar *buttonText = mkdg_button_get_text(i);
+                mkdg_log(DEBUG, "new_full(-,%s,%X,%X) i=%d, buttonText=%s",
+                    title, wFlags, bFlags, i, buttonText);
+                MkdgButtonResponse response = mkdg_button_get_response(i);
+                gtk_dialog_add_button(dialog, buttonText, response);
+            }
+        }
+
+        /* Create Notebook */
+        self->notebookWgt = gtk_notebook_new();
+        mkdg_wgt_show(self->notebookWgt);
+        GtkWidget *dialogVboxWgt = GTK_DIALOG(self)->vbox;
+        mkdg_wgt_show(dialogVboxWgt);
+        gtk_box_pack_start(GTK_BOX(dialogVboxWgt), self->notebookWgt, TRUE, TRUE, 0);
+
+        self_prepare(self);
+        return self;
+    }}
+#line 294 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_add_property:
+ * @self: A MakerDialog
+ * @ctx: A PropertyContext which contain the value to be set.
+ * @returns: TRUE if the property adding succeed; FALSE otherwise.
+ *
+ * Add a property to the dialog and corresponding Gtk widget will also be
+ * set.
+ **/
+#line 142 "../src/MakerDialog.gob"
+gboolean 
+maker_dialog_add_property (MakerDialog * self, PropertyContext * ctx)
+{
+#line 310 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::add_property"
+#line 142 "../src/MakerDialog.gob"
+	g_return_val_if_fail (self != NULL, (gboolean )0);
+#line 142 "../src/MakerDialog.gob"
+	g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0);
+#line 316 "maker-dialog.c"
+{
+#line 142 "../src/MakerDialog.gob"
+	
+
+        if (ctx == NULL) {
+            return FALSE;
+        }
+        mkdg_log(INFO, "add_property(%s) %s", ctx->spec->key,
+            property_context_to_string(ctx));
+
+        /* Create the widget */
+        MkdgWidget * mWidget = mkdg_widget_new(ctx, self->wFlags);
+        if (mWidget == NULL)
+            return FALSE;
+
+        /* Find the container */
+        const gchar *pageName = (STRING_IS_EMPTY(ctx->spec->pageName)) ? 
+            MKDG_PAGE_NAME_DEFAULT : ctx->spec->pageName;
+        MkdgWidgetContainer *container =
+            MKDG_CONTAINER_TABLE_LOOKUP(self->_priv->containerTable, pageName);
+
+        /* Do we need a new container/page? */
+        if (container == NULL) {
+            MkdgWgt * vboxWgt = gtk_vbox_new(FALSE, MKDG_VBOX_SPACING_DEFAULT);
+            mkdg_wgt_show(vboxWgt);
+            container = mkdg_widget_container_new(vboxWgt);
+            g_hash_table_insert(self->_priv->containerTable, (gpointer) pageName,
+                                (gpointer) container);
+
+            /* new notebook page */
+            MkdgWgt * pageLabelWgt = gtk_label_new(_(pageName));
+            mkdg_wgt_show(pageLabelWgt);
+            gtk_notebook_append_page(GTK_NOTEBOOK(self->notebookWgt), vboxWgt,
+                                     pageLabelWgt);
+        }
+
+        /* Add the widget to container */
+        mkdg_widget_container_add_widget(container, mWidget);
+        g_hash_table_insert(self->_priv->widgetTable, (gpointer) ctx->spec->key,
+                            (gpointer) mWidget);
+        return TRUE;
+    }}
+#line 359 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_add_all_properties:
+ * @self: A MakerDialog
+ * @returns: TRUE if all properties added successfully; FALSE otherwise.
+ *
+ * Add all properties to the dialog and corresponding Gtk widget will also be
+ * set.
+ *
+ **/
+#line 192 "../src/MakerDialog.gob"
+gboolean 
+maker_dialog_add_all_properties (MakerDialog * self)
+{
+#line 375 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::add_all_properties"
+#line 192 "../src/MakerDialog.gob"
+	g_return_val_if_fail (self != NULL, (gboolean )0);
+#line 192 "../src/MakerDialog.gob"
+	g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0);
+#line 381 "maker-dialog.c"
+{
+#line 192 "../src/MakerDialog.gob"
+	
+        gint i;
+        gboolean result = TRUE;
+        for(i = 0; i < mkdg_properties_size(self->_priv->properties); i++) {
+            PropertyContext * ctx = mkdg_properties_index(self->_priv->properties, i);
+            GValue * ret = property_context_load(ctx, NULL);
+            if (ret == NULL)
+                result = FALSE;
+            self_add_property(self, ctx);
+        }
+        return result;
+    }}
+#line 396 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_prepare:
+ * @returns: TRUE if success; FALSE otherwise.
+ *
+ * Prepare the MakerDialog after new. This includes add_all_properties.
+ **/
+#line 211 "../src/MakerDialog.gob"
+gboolean 
+maker_dialog_prepare (MakerDialog * self)
+{
+#line 409 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::prepare"
+#line 211 "../src/MakerDialog.gob"
+	g_return_val_if_fail (self != NULL, (gboolean )0);
+#line 211 "../src/MakerDialog.gob"
+	g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0);
+#line 415 "maker-dialog.c"
+{
+#line 211 "../src/MakerDialog.gob"
+	
+        gboolean success;
+        success = self_add_all_properties(self);
+            if (!success) {
+                return FALSE;
+            }
+
+        GList * containerList = g_hash_table_get_values(self->_priv->containerTable);
+        GList * node;
+        for(node = g_list_first(containerList); node != NULL; node = g_list_next(node)) {
+            MkdgWidgetContainer *container = (MkdgWidgetContainer *) node->data;
+            mkdg_widget_container_align_all_children(container, 1.0f, 0.5f, 0.0f, 0.5f);
+        }
+        g_list_free(containerList);
+        return TRUE;
+    }}
+#line 434 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_assign_widget_value:
+ * @self: A MakerDialog.
+ * @ctx: The PropertyContext
+ * @userData: userData that pass through applyFunc.
+ *
+ * Assign the value shown in widget to the property.
+ * That is firstly save the value, then apply the value.
+ *
+ * @see_also: set_widget_value()
+ **/
+#line 239 "../src/MakerDialog.gob"
+void 
+maker_dialog_assign_widget_value (MakerDialog * self, PropertyContext * ctx, gpointer userData)
+{
+#line 452 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::assign_widget_value"
+#line 239 "../src/MakerDialog.gob"
+	g_return_if_fail (self != NULL);
+#line 239 "../src/MakerDialog.gob"
+	g_return_if_fail (MAKER_IS_DIALOG (self));
+#line 458 "maker-dialog.c"
+{
+#line 239 "../src/MakerDialog.gob"
+	
+        mkdg_log(INFO, "assign_widget_value(%s)", ctx->spec->key);
+        GValue gValue = { 0 };
+        mkdg_g_value_reset(&gValue, ctx->spec->valueType, TRUE);
+        self_get_widget_value(self, ctx->spec->key, &gValue);
+        property_context_save(ctx, &gValue, userData);
+        property_context_apply(ctx, userData);
+        g_value_unset(&gValue);
+    }}
+#line 470 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_assign_all_widgets_values:
+ * @self: A MakerDialog.
+ * @userData: userData that pass through applyFunc.
+ *
+ * Invoke assign_widget_value for all widgets.
+ *
+ * @see_also: assign_widget_value(), set_widget_value()
+ **/
+#line 258 "../src/MakerDialog.gob"
+void 
+maker_dialog_assign_all_widgets_values (MakerDialog * self, gpointer userData)
+{
+#line 486 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::assign_all_widgets_values"
+#line 258 "../src/MakerDialog.gob"
+	g_return_if_fail (self != NULL);
+#line 258 "../src/MakerDialog.gob"
+	g_return_if_fail (MAKER_IS_DIALOG (self));
+#line 492 "maker-dialog.c"
+{
+#line 258 "../src/MakerDialog.gob"
+	
+        gint i;
+        for (i = 0; i < mkdg_properties_size(self->_priv->properties); i++) {
+            PropertyContext *ctx = mkdg_properties_index(self->_priv->properties, i);
+            self_assign_widget_value(self, ctx, userData);
+        }
+    }}
+#line 502 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_save_all_widgets_values:
+ * @self: A MakerDialog.
+ * @userData: userData that pass through property_context_save.
+ *
+ * Save all widget values to configuration backend.
+ *
+ **/
+#line 274 "../src/MakerDialog.gob"
+void 
+maker_dialog_save_all_widgets_values (MakerDialog * self, gpointer userData)
+{
+#line 517 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::save_all_widgets_values"
+#line 274 "../src/MakerDialog.gob"
+	g_return_if_fail (self != NULL);
+#line 274 "../src/MakerDialog.gob"
+	g_return_if_fail (MAKER_IS_DIALOG (self));
+#line 523 "maker-dialog.c"
+{
+#line 274 "../src/MakerDialog.gob"
+	
+        gint i;
+        for (i = 0; i < mkdg_properties_size(self->_priv->properties); i++) {
+            PropertyContext *ctx = mkdg_properties_index(self->_priv->properties,i);
+            GValue gValue= { 0 };
+            mkdg_g_value_reset(&gValue, ctx->spec->valueType, TRUE);
+            self_get_widget_value(self, ctx->spec->key, &gValue);
+            property_context_save(ctx, &gValue, userData);
+            g_value_reset(&gValue);
+        }
+    }}
+#line 537 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_get_widget_value:
+ * @self: A MakerDialog.
+ * @key: The key of a property.
+ * @value: GValue that store output.
+ * @returns: The address of value if success, NULL if failed.
+ *
+ * Get value as display in widget.
+ **/
+#line 296 "../src/MakerDialog.gob"
+GValue * 
+maker_dialog_get_widget_value (MakerDialog * self, const gchar * key, GValue * value)
+{
+#line 553 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::get_widget_value"
+#line 296 "../src/MakerDialog.gob"
+	g_return_val_if_fail (self != NULL, (GValue * )0);
+#line 296 "../src/MakerDialog.gob"
+	g_return_val_if_fail (MAKER_IS_DIALOG (self), (GValue * )0);
+#line 559 "maker-dialog.c"
+{
+#line 296 "../src/MakerDialog.gob"
+	
+        mkdg_log(INFO, "get_widget_value(%s)", key);
+        MkdgWidget * mWidget = self_get_widget_by_key(self, key);
+        if (mWidget == NULL) {
+            /* Not fount */
+            return NULL;
+        }
+        return mkdg_widget_get_widget_value(mWidget, value);
+    }}
+#line 571 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_set_widget_value:
+ * @self: A MakerDialog.
+ * @key: The key of a property.
+ * @value: Value to be shown in widget.
+ *
+ * Set value for widget display.
+ * However, value in PropertyContext is not changed.
+ * Use assign_widget_value() to do it.
+ * @see_also: assign_widget_value()
+ **/
+#line 317 "../src/MakerDialog.gob"
+void 
+maker_dialog_set_widget_value (MakerDialog * self, const gchar * key, GValue * value)
+{
+#line 589 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::set_widget_value"
+#line 317 "../src/MakerDialog.gob"
+	g_return_if_fail (self != NULL);
+#line 317 "../src/MakerDialog.gob"
+	g_return_if_fail (MAKER_IS_DIALOG (self));
+#line 595 "maker-dialog.c"
+{
+#line 317 "../src/MakerDialog.gob"
+	
+        mkdg_log(INFO, "set_widget_value(%s, %s)", key, mkdg_g_value_to_string(value));
+        MkdgWidget * mWidget = self_get_widget_by_key(self, key);
+        mkdg_widget_set_widget_value(mWidget, value);
+    }}
+#line 603 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+/**
+ * maker_dialog_show:
+ * @self: A MakerDialog.
+ *
+ **/
+#line 328 "../src/MakerDialog.gob"
+void 
+maker_dialog_show (MakerDialog * self)
+{
+#line 615 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::show"
+#line 328 "../src/MakerDialog.gob"
+	g_return_if_fail (self != NULL);
+#line 328 "../src/MakerDialog.gob"
+	g_return_if_fail (MAKER_IS_DIALOG (self));
+#line 621 "maker-dialog.c"
+{
+#line 328 "../src/MakerDialog.gob"
+	
+        mkdg_wgt_show_all(GTK_WIDGET(self));
+    }}
+#line 627 "maker-dialog.c"
+#undef __GOB_FUNCTION__
+
+#line 332 "../src/MakerDialog.gob"
+MkdgWidget * 
+maker_dialog_get_widget_by_key (MakerDialog * self, const gchar * key)
+{
+#line 634 "maker-dialog.c"
+#define __GOB_FUNCTION__ "Maker:Dialog::get_widget_by_key"
+#line 332 "../src/MakerDialog.gob"
+	g_return_val_if_fail (self != NULL, (MkdgWidget * )0);
+#line 332 "../src/MakerDialog.gob"
+	g_return_val_if_fail (MAKER_IS_DIALOG (self), (MkdgWidget * )0);
+#line 640 "maker-dialog.c"
+{
+#line 332 "../src/MakerDialog.gob"
+	
+        return (MkdgWidget *) g_hash_table_lookup(self->_priv->widgetTable, key);
+    }}
+#line 646 "maker-dialog.c"
+#undef __GOB_FUNCTION__
diff --git a/bin/maker-dialog.h b/bin/maker-dialog.h
new file mode 100644
index 0000000..624a43b
--- /dev/null
+++ b/bin/maker-dialog.h
@@ -0,0 +1,159 @@
+/* Generated by GOB (v2.0.19)   (do not edit directly) */
+
+
+
+/*
+ * Copyright © 2009  Red Hat, Inc. All rights reserved.
+ * Copyright © 2009  Ding-Yi Chen <dchen at redhat.com>
+ *
+ * This file is part of the ibus-chewing Project.
+ *
+ * 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
+ * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+
+#ifndef MAKER_DIALOG_H_
+#define MAKER_DIALOG_H_
+#include <stdlib.h>
+#include <strings.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+#include "MakerDialogProperty.h"
+#include "MakerDialogWidget.h"
+
+
+
+#define MKDG_PAGE_NAME_DEFAULT "..."
+#ifndef WIDGET_ID_PREFIX
+#define WIDGET_ID_PREFIX "+"
+#endif
+
+#ifndef MAKER_DIALOG_ID_LENGTH
+#define MAKER_DIALOG_ID_LENGTH 200
+#endif
+
+#define MKDG_CONTAINER_TABLE_LOOKUP(table,key) (MkdgWidgetContainer *) g_hash_table_lookup(table, (gconstpointer) key)
+
+
+
+#endif    /* MAKER_DIALOG_H_ */
+
+#ifndef __MAKER_DIALOG_H__
+#define __MAKER_DIALOG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*
+ * Type checking and casting macros
+ */
+#define MAKER_TYPE_DIALOG	(maker_dialog_get_type())
+#define MAKER_DIALOG(obj)	G_TYPE_CHECK_INSTANCE_CAST((obj), maker_dialog_get_type(), MakerDialog)
+#define MAKER_DIALOG_CONST(obj)	G_TYPE_CHECK_INSTANCE_CAST((obj), maker_dialog_get_type(), MakerDialog const)
+#define MAKER_DIALOG_CLASS(klass)	G_TYPE_CHECK_CLASS_CAST((klass), maker_dialog_get_type(), MakerDialogClass)
+#define MAKER_IS_DIALOG(obj)	G_TYPE_CHECK_INSTANCE_TYPE((obj), maker_dialog_get_type ())
+
+#define MAKER_DIALOG_GET_CLASS(obj)	G_TYPE_INSTANCE_GET_CLASS((obj), maker_dialog_get_type(), MakerDialogClass)
+
+/* Private structure type */
+typedef struct _MakerDialogPrivate MakerDialogPrivate;
+
+/*
+ * Main object structure
+ */
+#ifndef __TYPEDEF_MAKER_DIALOG__
+#define __TYPEDEF_MAKER_DIALOG__
+typedef struct _MakerDialog MakerDialog;
+#endif
+struct _MakerDialog {
+	GtkDialog __parent__;
+	/*< private >*/
+	MkdgWgt * notebookWgt; /* protected */
+	MkdgWidgetFlag wFlags; /* protected */
+	MakerDialogPrivate *_priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _MakerDialogClass MakerDialogClass;
+struct _MakerDialogClass {
+	GtkDialogClass __parent__;
+};
+
+
+/*
+ * Public methods
+ */
+GType	maker_dialog_get_type	(void) G_GNUC_CONST;
+#line 93 "../src/MakerDialog.gob"
+MakerDialog * 	maker_dialog_new	(void);
+#line 111 "maker-dialog.h"
+#line 98 "../src/MakerDialog.gob"
+MakerDialog * 	maker_dialog_new_full	(MkdgProperties * properties,
+					const gchar * title,
+					MkdgWidgetFlag wFlags,
+					MkdgButtonFlag bFlags);
+#line 117 "maker-dialog.h"
+#line 142 "../src/MakerDialog.gob"
+gboolean 	maker_dialog_add_property	(MakerDialog * self,
+					PropertyContext * ctx);
+#line 121 "maker-dialog.h"
+#line 192 "../src/MakerDialog.gob"
+gboolean 	maker_dialog_add_all_properties	(MakerDialog * self);
+#line 124 "maker-dialog.h"
+#line 239 "../src/MakerDialog.gob"
+void 	maker_dialog_assign_widget_value	(MakerDialog * self,
+					PropertyContext * ctx,
+					gpointer userData);
+#line 129 "maker-dialog.h"
+#line 258 "../src/MakerDialog.gob"
+void 	maker_dialog_assign_all_widgets_values	(MakerDialog * self,
+					gpointer userData);
+#line 133 "maker-dialog.h"
+#line 274 "../src/MakerDialog.gob"
+void 	maker_dialog_save_all_widgets_values	(MakerDialog * self,
+					gpointer userData);
+#line 137 "maker-dialog.h"
+#line 296 "../src/MakerDialog.gob"
+GValue * 	maker_dialog_get_widget_value	(MakerDialog * self,
+					const gchar * key,
+					GValue * value);
+#line 142 "maker-dialog.h"
+#line 317 "../src/MakerDialog.gob"
+void 	maker_dialog_set_widget_value	(MakerDialog * self,
+					const gchar * key,
+					GValue * value);
+#line 147 "maker-dialog.h"
+#line 328 "../src/MakerDialog.gob"
+void 	maker_dialog_show	(MakerDialog * self);
+#line 150 "maker-dialog.h"
+#line 332 "../src/MakerDialog.gob"
+MkdgWidget * 	maker_dialog_get_widget_by_key	(MakerDialog * self,
+					const gchar * key);
+#line 154 "maker-dialog.h"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c7fcb5a..7462a9f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -66,33 +66,9 @@ MACRO(GOB_GENERATE name gobFile)
 	CACHE INTERNAL "GOB_GENERATED_${name}"
 	)
 
-    ADD_CUSTOM_COMMAND(OUTPUT ${GOB_GENERATED_${name}}
-	COMMAND ${GOB2_EXECUTABLE} "${gobFile}"
-	-o "${GOB2_OUTPUT_DIR}/"
-	DEPENDS ${gobFile} ${ARGN}
-	)
 ENDMACRO(GOB_GENERATE name gobFile)
 
 
-GOB_GENERATE(ibus-chewing-engine
-    ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingEngine.gob
-    ${IBUS_CHEWING_ENGINE_SOURCE_INCLUDED_C_FILES}
-    )
-GOB_GENERATE(maker-dialog
-    ${CMAKE_CURRENT_SOURCE_DIR}/MakerDialog.gob
-    )
-
-ADD_CUSTOM_TARGET(gob2
-    DEPENDS ${GOB_GENERATED_ibus-chewing-engine}
-    ${GOB_GENERATED_maker-dialog}
-    COMMENT "Preprocess with gob2."
-    )
-
-
-SET_SOURCE_FILES_PROPERTIES(${GOB_GENERATED_ibus-chewing-engine}
-    ${GOB_GENERATED_maker-dialog} PROPERTIES GENERATED true
-    )
-
 SET(COMMON_SOURCE_C_FILES
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingApplier.c
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingLookupTable.c
@@ -242,7 +218,9 @@ SET(BACKEND_LIBRARIES "${BACKEND_LIBRARIES}" CACHE INTERNAL "Backend Libraries")
 
 SET(GUI_CORE_SOURCE_FILES ${COMMON_SOURCE_FILES}
     ${BACKEND_SOURCE_FILES}
-    ${GOB_GENERATED_maker-dialog}
+    ${GOB2_OUTPUT_DIR}/maker-dialog.c
+    ${GOB2_OUTPUT_DIR}/maker-dialog.h
+    ${GOB2_OUTPUT_DIR}/maker-dialog-private.h
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusConfigBackend.c
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusConfigBackend.h
     ${CMAKE_CURRENT_SOURCE_DIR}/MakerDialogWidget.c
@@ -290,7 +268,8 @@ SET(IBUS_ENGINE_CHEWING_LIBRARIES ${COMMON_LIBRARIES}
 
 ADD_EXECUTABLE(${IBUS_ENGINE_CHEWING}
     ${GUI_CORE_SOURCE_FILES}
-    ${GOB_GENERATED_ibus-chewing-engine}
+    ${GOB2_OUTPUT_DIR}/ibus-chewing-engine.c
+    ${GOB2_OUTPUT_DIR}/ibus-chewing-engine.h
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingLookupTable.c
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingLookupTable.h
     ${CMAKE_CURRENT_SOURCE_DIR}/IBusChewingPreEdit.c
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index acb8450..15364e7 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -17,10 +17,6 @@ ENDIF()
 
 ADD_DEFINITIONS("-DUNIT_TEST=1")
 
-SET_SOURCE_FILES_PROPERTIES(${GOB_GENERATED_ibus-chewing-engine}
-    ${GOB_GENERATED_maker-dialog} PROPERTIES GENERATED true
-    )
-
 #==================================================================
 # Dependencies
 #
@@ -107,8 +103,11 @@ ADD_SOURCE_TEST(IBusChewingPreEdit
     LIBRARIES ${COMMON_LIBRARIES} ${BACKEND_LIBRARIES} ${X11_LIBRARIES}
     )
 
+SET(GOB2_OUTPUT_DIR "${PROJECT_BINARY_DIR}/bin")
 ADD_SOURCE_TEST(ibus-chewing-engine NO_DEFAULT_SOURCE
-    SOURCES ${GUI_CORE_SOURCE_FILES} ${GOB_GENERATED_ibus-chewing-engine}
+    SOURCES ${GUI_CORE_SOURCE_FILES}
+    ${GOB2_OUTPUT_DIR}/ibus-chewing-engine.c
+    ${GOB2_OUTPUT_DIR}/ibus-chewing-engine.h
     ${CMAKE_SOURCE_DIR}/src/IBusChewingLookupTable.c
     ${CMAKE_SOURCE_DIR}/src/IBusChewingLookupTable.h
     ${CMAKE_SOURCE_DIR}/src/IBusChewingPreEdit.c
-- 
2.23.0.rc1