Beispiel #1
0
bool QHimePlatformInputContext::filterEvent(const QEvent* event)
{
    dbg("QHimePlatformInputContext::filterEvent\n");
    if (event->type() != QEvent::KeyPress && event->type() != QEvent::KeyRelease) {
        goto ret;
    }

    const QKeyEvent* keyEvent;
    keyEvent = static_cast<const QKeyEvent*>(event);
    quint32 keysym ;
    keysym = keyEvent->nativeVirtualKey();
    quint32  state;
    state = keyEvent->nativeModifiers();

    if (!inputMethodAccepted()) {
        goto ret;
    }

    QObject *input;
    input = qApp->focusObject();

    if (!input) {
        goto ret;
    }

    int result;
    if (event->type() == QEvent::KeyPress) {
        if (send_key_press(keysym, state)) {
            update_preedit();
            return true;
        }
    } else {
        char *rstr = NULL;
        result = hime_im_client_forward_key_release(hime_ch,   keysym, state, &rstr);
        if (rstr) {
            free(rstr);
        }

        if (result) {
            return true;
        }
    }

ret:
    return QPlatformInputContext::filterEvent(event);
}
bool QHIMEInputContext::x11FilterEvent( QWidget *keywidget, XEvent *event )
{
#ifndef QT_NO_HIME
    KeySym keysym;
    char static_buffer[256];
    char *buffer = static_buffer;
    int buffer_size = sizeof(static_buffer) - 1;

    if (event->type != KeyPress && event->type != KeyRelease)
        return TRUE;

    XKeyEvent *keve = (XKeyEvent *) event;

    XLookupString (keve, buffer, buffer_size, &keysym, NULL);
    int result;
    char *rstr = NULL;
    unsigned int state = keve->state;


    if (event->type == KeyPress) {
        result = hime_im_client_forward_key_press(hime_ch,
          keysym, state, &rstr);

        if (rstr) {
            QString inputText = QString::fromUtf8(rstr);

            sendIMEvent( QEvent::IMStart );
            sendIMEvent( QEvent::IMEnd, inputText );
        }
    } else {
       result = hime_im_client_forward_key_release(hime_ch,
         keysym, state, &rstr);
    }


    if (rstr)
        free(rstr);

    return result;
}