clean db
[platform/upstream/ibus-libpinyin.git] / src / PYEngine.cc
1 /* vim:set et ts=4 sts=4:
2  *
3  * ibus-pinyin - The Chinese PinYin engine for IBus
4  *
5  * Copyright (c) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 #include <cstring>
23 #include "PYEngine.h"
24 #include "PYPPinyinEngine.h"
25 #include "PYPBopomofoEngine.h"
26
27 namespace PY {
28 /* code of engine class of GObject */
29 #define IBUS_PINYIN_ENGINE(obj)             \
30     (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_PINYIN_ENGINE, IBusPinyinEngine))
31 #define IBUS_PINYIN_ENGINE_CLASS(klass)     \
32     (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_PINYIN_ENGINE, IBusPinyinEngineClass))
33 #define IBUS_IS_PINYIN_ENGINE(obj)          \
34     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_PINYIN_ENGINE))
35 #define IBUS_IS_PINYIN_ENGINE_CLASS(klass)  \
36     (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_PINYIN_ENGINE))
37 #define IBUS_PINYIN_ENGINE_GET_CLASS(obj)   \
38     (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_PINYIN_ENGINE, IBusPinyinEngineClass))
39
40
41 typedef struct _IBusPinyinEngine IBusPinyinEngine;
42 typedef struct _IBusPinyinEngineClass IBusPinyinEngineClass;
43
44 struct _IBusPinyinEngine {
45     IBusEngine parent;
46
47     /* members */
48     Engine *engine;
49 };
50
51 struct _IBusPinyinEngineClass {
52     IBusEngineClass parent;
53 };
54
55 /* functions prototype */
56 static void     ibus_pinyin_engine_class_init   (IBusPinyinEngineClass  *klass);
57 static void     ibus_pinyin_engine_init         (IBusPinyinEngine       *pinyin);
58 static GObject* ibus_pinyin_engine_constructor  (GType                   type,
59                                                  guint                   n_construct_params,
60                                                  GObjectConstructParam  *construct_params);
61
62 static void     ibus_pinyin_engine_destroy      (IBusPinyinEngine       *pinyin);
63 static gboolean ibus_pinyin_engine_process_key_event
64                                                 (IBusEngine             *engine,
65                                                  guint                   keyval,
66                                                  guint                   keycode,
67                                                  guint                   modifiers);
68 static void     ibus_pinyin_engine_focus_in     (IBusEngine             *engine);
69 static void     ibus_pinyin_engine_focus_out    (IBusEngine             *engine);
70 static void     ibus_pinyin_engine_reset        (IBusEngine             *engine);
71 static void     ibus_pinyin_engine_enable       (IBusEngine             *engine);
72 static void     ibus_pinyin_engine_disable      (IBusEngine             *engine);
73
74 #if 0
75 static void     ibus_engine_set_cursor_location (IBusEngine             *engine,
76                                                  gint                    x,
77                                                  gint                    y,
78                                                  gint                    w,
79                                                  gint                    h);
80 static void     ibus_pinyin_engine_set_capabilities
81                                                 (IBusEngine             *engine,
82                                                  guint                   caps);
83 #endif
84
85 static void     ibus_pinyin_engine_page_up      (IBusEngine             *engine);
86 static void     ibus_pinyin_engine_page_down    (IBusEngine             *engine);
87 static void     ibus_pinyin_engine_cursor_up    (IBusEngine             *engine);
88 static void     ibus_pinyin_engine_cursor_down  (IBusEngine             *engine);
89 static void     ibus_pinyin_engine_property_activate
90                                                 (IBusEngine             *engine,
91                                                  const gchar            *prop_name,
92                                                  guint                   prop_state);
93 static void     ibus_pinyin_engine_candidate_clicked
94                                                 (IBusEngine             *engine,
95                                                  guint                   index,
96                                                  guint                   button,
97                                                  guint                   state);
98 #if 0
99 static void ibus_pinyin_engine_property_show    (IBusEngine             *engine,
100                                                  const gchar            *prop_name);
101 static void ibus_pinyin_engine_property_hide    (IBusEngine             *engine,
102                                                  const gchar            *prop_name);
103 #endif
104
105 G_DEFINE_TYPE (IBusPinyinEngine, ibus_pinyin_engine, IBUS_TYPE_ENGINE)
106
107 static void
108 ibus_pinyin_engine_class_init (IBusPinyinEngineClass *klass)
109 {
110     GObjectClass *object_class = G_OBJECT_CLASS (klass);
111     IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
112     IBusEngineClass *engine_class = IBUS_ENGINE_CLASS (klass);
113
114     object_class->constructor = ibus_pinyin_engine_constructor;
115     ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_pinyin_engine_destroy;
116
117     engine_class->process_key_event = ibus_pinyin_engine_process_key_event;
118
119     engine_class->reset = ibus_pinyin_engine_reset;
120     engine_class->enable = ibus_pinyin_engine_enable;
121     engine_class->disable = ibus_pinyin_engine_disable;
122
123     engine_class->focus_in = ibus_pinyin_engine_focus_in;
124     engine_class->focus_out = ibus_pinyin_engine_focus_out;
125
126     engine_class->page_up = ibus_pinyin_engine_page_up;
127     engine_class->page_down = ibus_pinyin_engine_page_down;
128
129     engine_class->cursor_up = ibus_pinyin_engine_cursor_up;
130     engine_class->cursor_down = ibus_pinyin_engine_cursor_down;
131
132     engine_class->property_activate = ibus_pinyin_engine_property_activate;
133
134     engine_class->candidate_clicked = ibus_pinyin_engine_candidate_clicked;
135 }
136
137 static void
138 ibus_pinyin_engine_init (IBusPinyinEngine *pinyin)
139 {
140     if (g_object_is_floating (pinyin))
141         g_object_ref_sink (pinyin);  // make engine sink
142 }
143
144 static GObject*
145 ibus_pinyin_engine_constructor (GType                  type,
146                                 guint                  n_construct_params,
147                                 GObjectConstructParam *construct_params)
148 {
149     IBusPinyinEngine *engine;
150     const gchar *name;
151
152     engine = (IBusPinyinEngine *) G_OBJECT_CLASS (ibus_pinyin_engine_parent_class)->constructor (
153                                                            type,
154                                                            n_construct_params,
155                                                            construct_params);
156     name = ibus_engine_get_name ((IBusEngine *) engine);
157
158     if (name) {
159 #ifdef IBUS_BUILD_LIBPINYIN
160         if (std::strcmp (name, "libpinyin") == 0 ||
161             std::strcmp (name, "libpinyin-debug") == 0) {
162             engine->engine = new LibPinyinPinyinEngine (IBUS_ENGINE (engine));
163         }
164         if (std::strcmp (name, "libbopomofo") == 0 ||
165             std::strcmp (name, "libbopomofo-debug") == 0 ) {
166             engine->engine = new LibPinyinBopomofoEngine (IBUS_ENGINE (engine));
167         }
168 #endif
169     } else {
170         engine->engine = new LibPinyinPinyinEngine (IBUS_ENGINE (engine));
171     }
172     return (GObject *) engine;
173 }
174
175 static void
176 ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin)
177 {
178     delete pinyin->engine;
179     ((IBusObjectClass *) ibus_pinyin_engine_parent_class)->destroy ((IBusObject *)pinyin);
180 }
181
182 static gboolean
183 ibus_pinyin_engine_process_key_event (IBusEngine     *engine,
184                                       guint           keyval,
185                                       guint           keycode,
186                                       guint           modifiers)
187 {
188     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
189     return pinyin->engine->processKeyEvent (keyval, keycode, modifiers);
190 }
191
192 static void
193 ibus_pinyin_engine_property_activate (IBusEngine    *engine,
194                                       const gchar   *prop_name,
195                                       guint          prop_state)
196 {
197     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
198     pinyin->engine->propertyActivate (prop_name, prop_state);
199 }
200 static void
201 ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
202                                       guint       index,
203                                       guint       button,
204                                       guint       state)
205 {
206     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
207     pinyin->engine->candidateClicked (index, button, state);
208 }
209
210 #define FUNCTION(name, Name)                                        \
211     static void                                                     \
212     ibus_pinyin_engine_##name (IBusEngine *engine)                  \
213     {                                                               \
214         IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;     \
215         pinyin->engine->Name ();                                    \
216         ((IBusEngineClass *) ibus_pinyin_engine_parent_class)       \
217             ->name (engine);                                        \
218     }
219 FUNCTION(focus_in,    focusIn)
220 FUNCTION(focus_out,   focusOut)
221 FUNCTION(reset,       reset)
222 FUNCTION(enable,      enable)
223 FUNCTION(disable,     disable)
224 FUNCTION(page_up,     pageUp)
225 FUNCTION(page_down,   pageDown)
226 FUNCTION(cursor_up,   cursorUp)
227 FUNCTION(cursor_down, cursorDown)
228 #undef FUNCTION
229
230 Engine::~Engine (void)
231 {
232 }
233
234 };
235