void QUimInputContext::updatePreedit() { QString newString = getPreeditString(); int cursor = getPreeditCursorPosition(); int selLength = getPreeditSelectionLength(); if ( newString.isEmpty() && ! isComposing() ) return ; // Activating the IM if ( ! newString.isEmpty() && ! isComposing() ) sendIMEvent( QEvent::IMStart ); if ( ! newString.isEmpty() ) { #ifdef ENABLE_DEBUG qDebug( "cursor = %d, length = %d", cursor, newString.length() ); #endif sendIMEvent( QEvent::IMCompose, newString, cursor, selLength ); } // Preedit's length is Zero, we should deactivate IM and // cancel the inputting, that is, sending IMEnd event with // empty string. if ( newString.isEmpty() && isComposing() ) sendIMEvent( QEvent::IMEnd ); }
void QUimInputContext::commitString( const QString& str ) { if ( !isComposing() ) { sendIMEvent( QEvent::IMStart ); } sendIMEvent( QEvent::IMEnd, str ); }
void QGCINInputContext::reset() { // printf("reset %x %d %d\n", focusWidget(), isComposing(), composingText.isNull()); if ( focusWidget() && isComposing() && ! composingText.isNull() ) { QInputContext::reset(); resetClientState(); } }
// called when the keyboard is opened or closed // virtual void TextService::onKeyboardStatusChanged(bool opened) { Ime::TextService::onKeyboardStatusChanged(opened); if(client_) client_->onKeyboardStatusChanged(opened); if(opened) { // keyboard is opened } else { // keyboard is closed if(isComposing()) { // end current composition if needed ITfContext* context = currentContext(); if(context) { endComposition(context); context->Release(); } } if(showingCandidates()) // disable candidate window if it's opened hideCandidates(); hideMessage(); // hide message window, if there's any } }
// message window void TextService::showMessage(Ime::EditSession* session, std::wstring message, int duration) { // remove previous message if there's any hideMessage(); // FIXME: reuse the window whenever possible messageWindow_ = make_unique<Ime::MessageWindow>(this, session); messageWindow_->setFont(font_); messageWindow_->setText(message); int x = 0, y = 0; if(isComposing()) { RECT rc; if(selectionRect(session, &rc)) { x = rc.left; y = rc.bottom; } } messageWindow_->move(x, y); messageWindow_->show(); messageTimerId_ = ::SetTimer(messageWindow_->hwnd(), 1, duration * 1000, (TIMERPROC)TextService::onMessageTimeout); }
void QUimInputContext::saveContext() { // just send IMEnd and keep preedit string if ( isComposing() ) sendIMEvent( QEvent::IMEnd ); }