summaryrefslogtreecommitdiffstats
path: root/src/Engine.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Engine.cc')
-rw-r--r--src/Engine.cc49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/Engine.cc b/src/Engine.cc
index 7894df0..175fc6e 100644
--- a/src/Engine.cc
+++ b/src/Engine.cc
@@ -4,6 +4,7 @@
#include <ibus.h>
#include "Engine.h"
#include "PinyinEngine.h"
+#include "BopomofoEngine.h"
namespace PY {
/* code of engine class of GObject */
@@ -26,7 +27,7 @@ struct _IBusPinyinEngine {
IBusEngine parent;
/* members */
- PinyinEngine engine;
+ Engine *engine;
};
struct _IBusPinyinEngineClass {
@@ -36,6 +37,10 @@ struct _IBusPinyinEngineClass {
/* functions prototype */
static void ibus_pinyin_engine_class_init (IBusPinyinEngineClass *klass);
static void ibus_pinyin_engine_init (IBusPinyinEngine *pinyin);
+static GObject* ibus_pinyin_engine_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params);
+
static void ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin);
static gboolean ibus_pinyin_engine_process_key_event
(IBusEngine *engine,
@@ -84,10 +89,11 @@ G_DEFINE_TYPE (IBusPinyinEngine, ibus_pinyin_engine, IBUS_TYPE_ENGINE)
static void
ibus_pinyin_engine_class_init (IBusPinyinEngineClass *klass)
{
- // GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
IBusEngineClass *engine_class = IBUS_ENGINE_CLASS (klass);
+ object_class->constructor = ibus_pinyin_engine_constructor;
ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_pinyin_engine_destroy;
engine_class->process_key_event = ibus_pinyin_engine_process_key_event;
@@ -115,13 +121,36 @@ ibus_pinyin_engine_init (IBusPinyinEngine *pinyin)
{
if (g_object_is_floating (pinyin))
g_object_ref_sink (pinyin); // make engine sink
- new (& (pinyin->engine)) PinyinEngine (IBUS_ENGINE (pinyin));
+}
+
+static GObject*
+ibus_pinyin_engine_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
+{
+ IBusPinyinEngine *engine;
+ const gchar *name;
+
+ engine = (IBusPinyinEngine *) G_OBJECT_CLASS (ibus_pinyin_engine_parent_class)->constructor (
+ type,
+ n_construct_params,
+ construct_params);
+ name = ibus_engine_get_name ((IBusEngine *) engine);
+
+ if (name &&
+ (std::strcmp (name, "bopomofo") == 0 || std::strcmp (name, "bopomofo-debug") == 0)) {
+ engine->engine = new BopomofoEngine (IBUS_ENGINE (engine));
+ }
+ else {
+ engine->engine = new PinyinEngine (IBUS_ENGINE (engine));
+ }
+ return (GObject *) engine;
}
static void
ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin)
{
- pinyin->engine.~PinyinEngine ();
+ delete pinyin->engine;
((IBusObjectClass *) ibus_pinyin_engine_parent_class)->destroy ((IBusObject *)pinyin);
}
@@ -132,7 +161,7 @@ ibus_pinyin_engine_process_key_event (IBusEngine *engine,
guint modifiers)
{
IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
- return pinyin->engine.processKeyEvent (keyval, keycode, modifiers);
+ return pinyin->engine->processKeyEvent (keyval, keycode, modifiers);
}
static void
@@ -141,7 +170,7 @@ ibus_pinyin_engine_property_activate (IBusEngine *engine,
guint prop_state)
{
IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
- pinyin->engine.propertyActivate (prop_name, prop_state);
+ pinyin->engine->propertyActivate (prop_name, prop_state);
}
static void
ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
@@ -150,7 +179,7 @@ ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
guint state)
{
IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
- pinyin->engine.candidateClicked (index, button, state);
+ pinyin->engine->candidateClicked (index, button, state);
}
#define FUNCTION(name, Name) \
@@ -158,7 +187,7 @@ ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
ibus_pinyin_engine_##name (IBusEngine *engine) \
{ \
IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine; \
- pinyin->engine.Name (); \
+ pinyin->engine->Name (); \
((IBusEngineClass *) ibus_pinyin_engine_parent_class) \
->name (engine); \
}
@@ -173,5 +202,9 @@ FUNCTION(cursor_up, cursorUp)
FUNCTION(cursor_down, cursorDown)
#undef FUNCTION
+Engine::~Engine (void)
+{
+}
+
};