BusEngineProxy * bus_engine_proxy_new (const gchar *path, IBusEngineDesc *desc, BusConnection *connection) { g_assert (path); g_assert (IBUS_IS_ENGINE_DESC (desc)); g_assert (BUS_IS_CONNECTION (connection)); BusEngineProxy *engine; engine = (BusEngineProxy *) g_object_new (BUS_TYPE_ENGINE_PROXY, "name", NULL, "path", path, "connection", connection, NULL); engine->desc = desc; g_object_ref_sink (desc); if (desc->layout != NULL && desc->layout[0] != '\0') { engine->keymap = ibus_keymap_get (desc->layout); } if (engine->keymap == NULL) { engine->keymap = ibus_keymap_get ("us"); } return engine; }
void ibus_hangul_init (IBusBus *bus) { GVariant* value; hanja_table = hanja_table_load (NULL); symbol_table = hanja_table_load (IBUSHANGUL_DATADIR "/data/symbol.txt"); config = ibus_bus_get_config (bus); if (config) g_object_ref_sink (config); hangul_keyboard = g_string_new_len ("2", 8); value = ibus_config_get_value (config, "engine/Hangul", "HangulKeyboard"); if (value != NULL) { const gchar* str = g_variant_get_string (value, NULL); g_string_assign (hangul_keyboard, str); g_variant_unref(value); } hanja_key_list_init(&hanja_keys); value = ibus_config_get_value (config, "engine/Hangul", "HanjaKeys"); if (value != NULL) { const gchar* str = g_variant_get_string (value, NULL); hanja_key_list_set_from_string(&hanja_keys, str); g_variant_unref(value); } else { hanja_key_list_append(&hanja_keys, IBUS_Hangul_Hanja, 0); hanja_key_list_append(&hanja_keys, IBUS_F9, 0); } value = ibus_config_get_value (config, "engine/Hangul", "WordCommit"); if (value != NULL) { word_commit = g_variant_get_boolean (value); g_variant_unref(value); } value = ibus_config_get_value (config, "engine/Hangul", "AutoReorder"); if (value != NULL) { auto_reorder = g_variant_get_boolean (value); g_variant_unref (value); } keymap = ibus_keymap_get("us"); }
/* Note on AltGr (Level3 Shift) handling: While currently we expect AltGr == mod5, it would be better to not expect the modifier always be assigned to particular modX. However, it needs some code like: KeyCode altgr = XKeysymToKeycode (display, XK_ISO_Level3_Shift); XModifierKeymap *mods = XGetModifierMapping (display); for (i = 3; i < 8; i++) for (j = 0; j < mods->max_keypermod; j++) { KeyCode code = mods->modifiermap[i * mods->max_keypermod + j]; if (code == altgr) ... } Since IBus engines are supposed to be cross-platform, the code should go into IBus core, instead of ibus-m17n. */ MSymbol ibus_m17n_key_event_to_symbol (guint keycode, guint keyval, guint modifiers) { GString *keysym; MSymbol mkeysym = Mnil; guint mask = 0; IBusKeymap *keymap; if (keyval >= IBUS_Shift_L && keyval <= IBUS_Hyper_R) { return Mnil; } /* Here, keyval is already translated by IBUS_MOD5_MASK. Obtain the untranslated keyval from the underlying keymap and represent the translated keyval as the form "G-<untranslated keyval>", which m17n-lib accepts. */ if (modifiers & IBUS_MOD5_MASK) { keymap = ibus_keymap_get ("us"); keyval = ibus_keymap_lookup_keysym (keymap, keycode, modifiers & ~IBUS_MOD5_MASK); g_object_unref (keymap); } keysym = g_string_new (""); if (keyval >= IBUS_space && keyval <= IBUS_asciitilde) { gint c = keyval; if (keyval == IBUS_space && modifiers & IBUS_SHIFT_MASK) mask |= IBUS_SHIFT_MASK; if (modifiers & IBUS_CONTROL_MASK) { if (c >= IBUS_a && c <= IBUS_z) c += IBUS_A - IBUS_a; mask |= IBUS_CONTROL_MASK; } g_string_append_c (keysym, c); } else { mask |= modifiers & (IBUS_CONTROL_MASK | IBUS_SHIFT_MASK); g_string_append (keysym, ibus_keyval_name (keyval)); if (keysym->len == 0) { g_string_free (keysym, TRUE); return Mnil; } } mask |= modifiers & (IBUS_MOD1_MASK | IBUS_MOD5_MASK | IBUS_META_MASK | IBUS_SUPER_MASK | IBUS_HYPER_MASK); if (mask & IBUS_HYPER_MASK) { g_string_prepend (keysym, "H-"); } if (mask & IBUS_SUPER_MASK) { g_string_prepend (keysym, "s-"); } if (mask & IBUS_MOD5_MASK) { g_string_prepend (keysym, "G-"); } if (mask & IBUS_MOD1_MASK) { g_string_prepend (keysym, "A-"); } if (mask & IBUS_META_MASK) { g_string_prepend (keysym, "M-"); } if (mask & IBUS_CONTROL_MASK) { g_string_prepend (keysym, "C-"); } if (mask & IBUS_SHIFT_MASK) { g_string_prepend (keysym, "S-"); } mkeysym = msymbol (keysym->str); g_string_free (keysym, TRUE); return mkeysym; }
IBusKeymap * ibus_keymap_new (const gchar *name) { return ibus_keymap_get (name); }