1 /* vim:set et ts=4 sts=4:
3 * ibus-pinyin - The Chinese PinYin engine for IBus
5 * Copyright (c) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
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)
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.
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.
24 #include "PYPPinyinEngine.h"
25 #include "PYPBopomofoEngine.h"
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))
41 typedef struct _IBusPinyinEngine IBusPinyinEngine;
42 typedef struct _IBusPinyinEngineClass IBusPinyinEngineClass;
44 struct _IBusPinyinEngine {
51 struct _IBusPinyinEngineClass {
52 IBusEngineClass parent;
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);
62 static void ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin);
63 static gboolean ibus_pinyin_engine_process_key_event
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);
75 static void ibus_engine_set_cursor_location (IBusEngine *engine,
80 static void ibus_pinyin_engine_set_capabilities
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
91 const gchar *prop_name,
93 static void ibus_pinyin_engine_candidate_clicked
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);
105 G_DEFINE_TYPE (IBusPinyinEngine, ibus_pinyin_engine, IBUS_TYPE_ENGINE)
108 ibus_pinyin_engine_class_init (IBusPinyinEngineClass *klass)
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);
114 object_class->constructor = ibus_pinyin_engine_constructor;
115 ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_pinyin_engine_destroy;
117 engine_class->process_key_event = ibus_pinyin_engine_process_key_event;
119 engine_class->reset = ibus_pinyin_engine_reset;
120 engine_class->enable = ibus_pinyin_engine_enable;
121 engine_class->disable = ibus_pinyin_engine_disable;
123 engine_class->focus_in = ibus_pinyin_engine_focus_in;
124 engine_class->focus_out = ibus_pinyin_engine_focus_out;
126 engine_class->page_up = ibus_pinyin_engine_page_up;
127 engine_class->page_down = ibus_pinyin_engine_page_down;
129 engine_class->cursor_up = ibus_pinyin_engine_cursor_up;
130 engine_class->cursor_down = ibus_pinyin_engine_cursor_down;
132 engine_class->property_activate = ibus_pinyin_engine_property_activate;
134 engine_class->candidate_clicked = ibus_pinyin_engine_candidate_clicked;
138 ibus_pinyin_engine_init (IBusPinyinEngine *pinyin)
140 if (g_object_is_floating (pinyin))
141 g_object_ref_sink (pinyin); // make engine sink
145 ibus_pinyin_engine_constructor (GType type,
146 guint n_construct_params,
147 GObjectConstructParam *construct_params)
149 IBusPinyinEngine *engine;
152 engine = (IBusPinyinEngine *) G_OBJECT_CLASS (ibus_pinyin_engine_parent_class)->constructor (
156 name = ibus_engine_get_name ((IBusEngine *) engine);
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));
164 if (std::strcmp (name, "libbopomofo") == 0 ||
165 std::strcmp (name, "libbopomofo-debug") == 0 ) {
166 engine->engine = new LibPinyinBopomofoEngine (IBUS_ENGINE (engine));
170 engine->engine = new LibPinyinPinyinEngine (IBUS_ENGINE (engine));
172 return (GObject *) engine;
176 ibus_pinyin_engine_destroy (IBusPinyinEngine *pinyin)
178 delete pinyin->engine;
179 ((IBusObjectClass *) ibus_pinyin_engine_parent_class)->destroy ((IBusObject *)pinyin);
183 ibus_pinyin_engine_process_key_event (IBusEngine *engine,
188 IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
189 return pinyin->engine->processKeyEvent (keyval, keycode, modifiers);
193 ibus_pinyin_engine_property_activate (IBusEngine *engine,
194 const gchar *prop_name,
197 IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
198 pinyin->engine->propertyActivate (prop_name, prop_state);
201 ibus_pinyin_engine_candidate_clicked (IBusEngine *engine,
206 IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine;
207 pinyin->engine->candidateClicked (index, button, state);
210 #define FUNCTION(name, Name) \
212 ibus_pinyin_engine_##name (IBusEngine *engine) \
214 IBusPinyinEngine *pinyin = (IBusPinyinEngine *) engine; \
215 pinyin->engine->Name (); \
216 ((IBusEngineClass *) ibus_pinyin_engine_parent_class) \
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)
230 Engine::~Engine (void)