1 /* vim:set et sts=4: */
8 typedef struct _IBusHangulEngine IBusHangulEngine;
9 typedef struct _IBusHangulEngineClass IBusHangulEngineClass;
11 struct _IBusHangulEngine {
15 HangulInputContext *context;
18 IBusLookupTable *table;
19 IBusProperty *hangul_mode_prop;
20 IBusPropList *prop_list;
23 struct _IBusHangulEngineClass {
24 IBusEngineClass parent;
27 /* functions prototype */
28 static void ibus_hangul_engine_class_init (IBusHangulEngineClass *klass);
29 static void ibus_hangul_engine_init (IBusHangulEngine *hangul);
31 ibus_hangul_engine_constructor (GType type,
32 guint n_construct_params,
33 GObjectConstructParam *construct_params);
34 static void ibus_hangul_engine_destroy (IBusHangulEngine *hangul);
36 ibus_hangul_engine_process_key_event
40 static void ibus_hangul_engine_focus_in (IBusEngine *engine);
41 static void ibus_hangul_engine_focus_out (IBusEngine *engine);
42 static void ibus_hangul_engine_reset (IBusEngine *engine);
43 static void ibus_hangul_engine_enable (IBusEngine *engine);
44 static void ibus_hangul_engine_disable (IBusEngine *engine);
46 static void ibus_engine_set_cursor_location (IBusEngine *engine,
51 static void ibus_hangul_engine_set_capabilities
55 static void ibus_hangul_engine_page_up (IBusEngine *engine);
56 static void ibus_hangul_engine_page_down (IBusEngine *engine);
57 static void ibus_hangul_engine_cursor_up (IBusEngine *engine);
58 static void ibus_hangul_engine_cursor_down (IBusEngine *engine);
59 static void ibus_hangul_engine_toggle_hangul_mode
60 (IBusHangulEngine *hangul);
62 static void ibus_hangul_property_activate (IBusEngine *engine,
63 const gchar *prop_name,
65 static void ibus_hangul_engine_property_show
67 const gchar *prop_name);
68 static void ibus_hangul_engine_property_hide
70 const gchar *prop_name);
73 static void ibus_hangul_engine_flush (IBusHangulEngine *hangul);
74 static void ibus_hangul_engine_update_preedit_text
75 (IBusHangulEngine *hangul);
77 static IBusEngineClass *parent_class = NULL;
80 ibus_hangul_engine_get_type (void)
82 static GType type = 0;
84 static const GTypeInfo type_info = {
85 sizeof (IBusHangulEngineClass),
87 (GBaseFinalizeFunc) NULL,
88 (GClassInitFunc) ibus_hangul_engine_class_init,
91 sizeof (IBusHangulEngine),
93 (GInstanceInitFunc) ibus_hangul_engine_init,
97 type = g_type_register_static (IBUS_TYPE_ENGINE,
107 ibus_hangul_engine_class_init (IBusHangulEngineClass *klass)
109 GObjectClass *object_class = G_OBJECT_CLASS (klass);
110 IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
111 IBusEngineClass *engine_class = IBUS_ENGINE_CLASS (klass);
113 parent_class = (IBusEngineClass *) g_type_class_peek_parent (klass);
115 object_class->constructor = ibus_hangul_engine_constructor;
116 ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_hangul_engine_destroy;
118 engine_class->process_key_event = ibus_hangul_engine_process_key_event;
120 engine_class->reset = ibus_hangul_engine_reset;
121 engine_class->enable = ibus_hangul_engine_enable;
122 engine_class->disable = ibus_hangul_engine_disable;
124 engine_class->focus_in = ibus_hangul_engine_focus_in;
125 engine_class->focus_out = ibus_hangul_engine_focus_out;
127 engine_class->page_up = ibus_hangul_engine_page_up;
128 engine_class->page_down = ibus_hangul_engine_page_down;
130 engine_class->cursor_up = ibus_hangul_engine_cursor_up;
131 engine_class->cursor_down = ibus_hangul_engine_cursor_down;
135 ibus_hangul_engine_init (IBusHangulEngine *hangul)
137 hangul->context = hangul_ic_new ("2");
138 hangul->hangul_mode = TRUE;
139 hangul->hangul_mode_prop = ibus_property_new ("hangul_mode_prop",
149 hangul->prop_list = ibus_prop_list_new ();
150 ibus_prop_list_append (hangul->prop_list, hangul->hangul_mode_prop);
152 hangul->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
156 ibus_hangul_engine_constructor (GType type,
157 guint n_construct_params,
158 GObjectConstructParam *construct_params)
160 IBusHangulEngine *hangul;
162 hangul = (IBusHangulEngine *) G_OBJECT_CLASS (parent_class)->constructor (type,
166 return (GObject *)hangul;
171 ibus_hangul_engine_destroy (IBusHangulEngine *hangul)
173 if (hangul->prop_list) {
174 g_object_unref (hangul->prop_list);
175 hangul->prop_list = NULL;
178 if (hangul->hangul_mode_prop) {
179 g_object_unref (hangul->hangul_mode_prop);
180 hangul->hangul_mode_prop = NULL;
184 g_object_unref (hangul->table);
185 hangul->table = NULL;
188 if (hangul->context) {
189 hangul_ic_delete (hangul->context);
190 hangul->context = NULL;
193 IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)hangul);
197 ibus_hangul_engine_update_preedit_text (IBusHangulEngine *hangul)
202 str = hangul_ic_get_preedit_string (hangul->context);
204 if (str != NULL && str[0] != 0) {
205 text = ibus_text_new_from_ucs4 (str);
206 ibus_text_append_attribute (text, IBUS_ATTR_TYPE_FOREGROUND, 0x00ffffff, 0, -1);
207 ibus_text_append_attribute (text, IBUS_ATTR_TYPE_BACKGROUND, 0x00000000, 0, -1);
208 ibus_engine_update_preedit_text ((IBusEngine *)hangul,
210 ibus_text_get_length (text),
212 g_object_unref (text);
215 text = ibus_text_new_from_static_string ("");
216 ibus_engine_update_preedit_text ((IBusEngine *)hangul, text, 0, FALSE);
217 g_object_unref (text);
222 ibus_hangul_engine_process_key_event (IBusEngine *engine,
226 IBusHangulEngine *hangul = (IBusHangulEngine *) engine;
231 if (modifiers & IBUS_RELEASE_MASK)
234 if (modifiers & (IBUS_CONTROL_MASK | IBUS_MOD1_MASK))
237 // if we don't ignore shift keys, shift key will make flush the preedit
238 // string. So you cannot input shift+key.
239 // Let's think about these examples:
242 if (keyval == IBUS_Shift_L || keyval == IBUS_Shift_R)
245 if (keyval == IBUS_BackSpace) {
246 retval = hangul_ic_backspace (hangul->context);
248 retval = hangul_ic_process (hangul->context, keyval);
251 str = hangul_ic_get_commit_string (hangul->context);
252 if (str != NULL && str[0] != 0) {
253 IBusText *text = ibus_text_new_from_ucs4 (str);
254 ibus_engine_commit_text ((IBusEngine *)hangul, text);
255 g_object_unref (text);
258 ibus_hangul_engine_update_preedit_text (hangul);
261 ibus_hangul_engine_flush (hangul);
267 ibus_hangul_engine_flush (IBusHangulEngine *hangul)
272 str = hangul_ic_flush (hangul->context);
274 if (str == NULL || str[0] == 0)
277 text = ibus_text_new_from_ucs4 (str);
279 ibus_engine_hide_preedit_text ((IBusEngine *) hangul);
280 ibus_engine_commit_text ((IBusEngine *) hangul, text);
282 g_object_unref (text);
286 ibus_hangul_engine_toggle_hangul_mode (IBusHangulEngine *hangul)
289 hangul->hangul_mode = ! hangul->hangul_mode;
291 ibus_hangul_engine_flush (hangul);
293 if (hangul->hangul_mode) {
294 text = ibus_text_new_from_static_string ("한");
297 text = ibus_text_new_from_static_string ("A");
300 ibus_property_set_label (hangul->hangul_mode_prop, text);
301 ibus_engine_update_property ((IBusEngine *)hangul, hangul->hangul_mode_prop);
302 g_object_unref (text);
306 ibus_hangul_engine_focus_in (IBusEngine *engine)
308 IBusHangulEngine *hangul = (IBusHangulEngine *) engine;
310 ibus_engine_register_properties (engine, hangul->prop_list);
312 parent_class->focus_in (engine);
316 ibus_hangul_engine_focus_out (IBusEngine *engine)
318 IBusHangulEngine *hangul = (IBusHangulEngine *) engine;
320 ibus_hangul_engine_flush (hangul);
322 parent_class->focus_out ((IBusEngine *) hangul);
326 ibus_hangul_engine_reset (IBusEngine *engine)
328 IBusHangulEngine *hangul = (IBusHangulEngine *) engine;
330 ibus_hangul_engine_flush (hangul);
331 parent_class->reset (engine);
335 ibus_hangul_engine_enable (IBusEngine *engine)
337 parent_class->enable (engine);
341 ibus_hangul_engine_disable (IBusEngine *engine)
343 ibus_hangul_engine_focus_out (engine);
344 parent_class->disable (engine);
348 ibus_hangul_engine_page_up (IBusEngine *engine)
350 parent_class->page_up (engine);
354 ibus_hangul_engine_page_down (IBusEngine *engine)
356 parent_class->page_down (engine);
360 ibus_hangul_engine_cursor_up (IBusEngine *engine)
362 parent_class->cursor_up (engine);
366 ibus_hangul_engine_cursor_down (IBusEngine *engine)
368 parent_class->cursor_down (engine);