static void im_active(void) { if (raw_mode) { init_keycode_state(); } FcitxIMClientFocusIn(client); FcitxIMClientEnableIC(client); active = 1; }
static void process_raw_key(char *buf, unsigned int len) { if ( len <= 0 ) { return; } else { unsigned int i; for (i = 0; i < len; i++) { char down = !(buf[i] & 0x80); short code = buf[i] & 0x7f; if (!code) { if (i + 2 >= len) break; code = (buf[++i] & 0x7f) << 7; code |= buf[++i] & 0x7f; if (!(buf[i] & 0x80) || !(buf[i - 1] & 0x80)) continue; } unsigned short linux_keysym = keycode_to_keysym(code, down); FcitxKeySym keysym = linux_keysym_to_fcitx_keysym(linux_keysym, code); if (keysym == Key_None) continue; FcitxIMClientFocusIn(client); if (FcitxIMClientProcessKey(client, keysym, code, state, (down ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY), 0) <= 0) { char *str = keysym_to_term_string(linux_keysym, down); if (str) put_im_text(str, strlen(str)); } state = calculate_modifiers(state, keysym, down); } } }
void _fcitx_fbterm_connect_cb(FcitxIMClient* client, void* user_data) { if (IsFcitxIMClientValid(client)) { FcitxIMClientConnectSignal(client, G_CALLBACK(_fcitx_fbterm_enable_im_cb), G_CALLBACK(_fcitx_fbterm_close_im_cb), G_CALLBACK(_fcitx_fbterm_commit_string_cb), G_CALLBACK(_fcitx_fbterm_forward_key_cb), G_CALLBACK(_fcitx_fbterm_update_client_side_ui_cb), user_data, NULL); CapacityFlags flags = CAPACITY_CLIENT_SIDE_UI; FcitxIMClientSetCapacity(client, flags); if (active) { FcitxIMClientFocusIn(client); FcitxIMClientEnableIC(client); } } }
static void fcitx_im_context_focus_in(ClutterIMContext *context) { FcitxLog(LOG_LEVEL, "fcitx_im_context_focus_in"); FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); if (fcitxcontext->has_focus) return; fcitxcontext->has_focus = true; if (IsFcitxIMClientValid(fcitxcontext->client)) { FcitxIMClientFocusIn(fcitxcontext->client); } /* set_cursor_location_internal() will get origin from X server, * it blocks UI. So delay it to idle callback. */ g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, (GSourceFunc) _set_cursor_location_internal, g_object_ref(fcitxcontext), (GDestroyNotify) g_object_unref); return; }