示例#1
0
static void im_active(void)
{
    if (raw_mode) {
        init_keycode_state();
    }
    FcitxIMClientFocusIn(client);
    FcitxIMClientEnableIC(client);
    active = 1;
}
示例#2
0
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);
        }
    }

}
示例#3
0
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);
        }
    }
}
示例#4
0
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;
}