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