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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 #include <cstring>
23 #include "PYEngine.h"
24 #include "PYPinyinEngine.h"
25 #include "PYBopomofoEngine.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 
G_DEFINE_TYPE(IBusPinyinEngine,ibus_pinyin_engine,IBUS_TYPE_ENGINE)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
ibus_pinyin_engine_init(IBusPinyinEngine * pinyin)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*
ibus_pinyin_engine_constructor(GType type,guint n_construct_params,GObjectConstructParam * construct_params)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         (std::strcmp (name, "bopomofo") == 0 || std::strcmp (name, "bopomofo-debug") == 0)) {
160         engine->engine = new BopomofoEngine (IBUS_ENGINE (engine));
161     }
162     else {
163         engine->engine = new PinyinEngine (IBUS_ENGINE (engine));
164     }
165     return (GObject *) engine;
166 }
167 
168 static void
ibus_pinyin_engine_destroy(IBusPinyinEngine * pinyin)169 ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin)
170 {
171     delete pinyin->engine;
172     ((IBusObjectClass *) ibus_pinyin_engine_parent_class)->destroy ((IBusObject *)pinyin);
173 }
174 
175 static gboolean
ibus_pinyin_engine_process_key_event(IBusEngine * engine,guint keyval,guint keycode,guint modifiers)176 ibus_pinyin_engine_process_key_event (IBusEngine     *engine,
177                                       guint           keyval,
178                                       guint           keycode,
179                                       guint           modifiers)
180 {
181     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
182     return pinyin->engine->processKeyEvent (keyval, keycode, modifiers);
183 }
184 
185 static void
ibus_pinyin_engine_property_activate(IBusEngine * engine,const gchar * prop_name,guint prop_state)186 ibus_pinyin_engine_property_activate (IBusEngine    *engine,
187                                       const gchar   *prop_name,
188                                       guint          prop_state)
189 {
190     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
191     pinyin->engine->propertyActivate (prop_name, prop_state);
192 }
193 static void
ibus_pinyin_engine_candidate_clicked(IBusEngine * engine,guint index,guint button,guint state)194 ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
195                                       guint       index,
196                                       guint       button,
197                                       guint       state)
198 {
199     IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
200     pinyin->engine->candidateClicked (index, button, state);
201 }
202 
203 #define FUNCTION(name, Name)                                        \
204     static void                                                     \
205     ibus_pinyin_engine_##name (IBusEngine *engine)                  \
206     {                                                               \
207         IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;     \
208         pinyin->engine->Name ();                                    \
209         ((IBusEngineClass *) ibus_pinyin_engine_parent_class)       \
210             ->name (engine);                                        \
211     }
FUNCTION(focus_in,focusIn)212 FUNCTION(focus_in,    focusIn)
213 FUNCTION(focus_out,   focusOut)
214 FUNCTION(reset,       reset)
215 FUNCTION(enable,      enable)
216 FUNCTION(disable,     disable)
217 FUNCTION(page_up,     pageUp)
218 FUNCTION(page_down,   pageDown)
219 FUNCTION(cursor_up,   cursorUp)
220 FUNCTION(cursor_down, cursorDown)
221 #undef FUNCTION
222 
223 Engine::~Engine (void)
224 {
225 }
226 
227 };
228