QInputContext *QWidgetProto::inputContext() { QWidget *item = qscriptvalue_cast<QWidget*>(thisObject()); if (item) return item->inputContext(); return 0; }
void QtFallbackWebPopupCombo::hidePopup() { #ifndef QT_NO_IM QWidget* activeFocus = QApplication::focusWidget(); if (activeFocus && activeFocus == QComboBox::view() && activeFocus->testAttribute(Qt::WA_InputMethodEnabled)) { QInputContext* qic = activeFocus->inputContext(); if (qic) { qic->reset(); qic->setFocusWidget(0); } } #endif // QT_NO_IM QComboBox::hidePopup(); if (QGraphicsProxyWidget* proxy = graphicsProxyWidget()) proxy->setVisible(false); if (!m_ownerPopup.m_popupVisible) return; m_ownerPopup.m_popupVisible = false; m_ownerPopup.popupDidHide(); }
void QWebPopup::hidePopup() { QWidget* activeFocus = QApplication::focusWidget(); if (activeFocus && activeFocus == view() && activeFocus->testAttribute(Qt::WA_InputMethodEnabled)) { QInputContext* qic = activeFocus->inputContext(); if (qic) { qic->reset(); qic->setFocusWidget(0); } } QComboBox::hidePopup(); if (!m_popupVisible) return; m_popupVisible = false; m_client->popupDidHide(); }
OSStatus QMacInputContext::globalEventProcessor(EventHandlerCallRef, EventRef event, void *) { #ifndef QT_MAC_USE_COCOA QScopedLoopLevelCounter loopLevelCounter(QApplicationPrivate::instance()->threadData); SRefCon refcon = 0; GetEventParameter(event, kEventParamTextInputSendRefCon, typeRefCon, 0, sizeof(refcon), 0, &refcon); QMacInputContext *context = reinterpret_cast<QMacInputContext*>(refcon); bool handled_event=true; UInt32 ekind = GetEventKind(event), eclass = GetEventClass(event); switch(eclass) { case kEventClassTextInput: { handled_event = false; QWidget *widget = QApplicationPrivate::focus_widget; bool canCompose = widget && (!context || widget->inputContext() == context) && !(widget->inputMethodHints() & Qt::ImhDigitsOnly || widget->inputMethodHints() & Qt::ImhFormattedNumbersOnly || widget->inputMethodHints() & Qt::ImhHiddenText); if(!canCompose) { handled_event = false; } else if(ekind == kEventTextInputOffsetToPos) { if(!widget->testAttribute(Qt::WA_InputMethodEnabled)) { handled_event = false; break; } QRect mr(widget->inputMethodQuery(Qt::ImMicroFocus).toRect()); QPoint mp(widget->mapToGlobal(QPoint(mr.topLeft()))); Point pt; pt.h = mp.x(); pt.v = mp.y() + mr.height(); SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof(pt), &pt); handled_event = true; } else if(ekind == kEventTextInputUpdateActiveInputArea) { if(!widget->testAttribute(Qt::WA_InputMethodEnabled)) { handled_event = false; break; } if (context->recursionGuard) break; ByteCount unilen = 0; GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, 0, 0, &unilen, 0); UniChar *unicode = (UniChar*)NewPtr(unilen); GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, 0, unilen, 0, unicode); QString text((QChar*)unicode, unilen / sizeof(UniChar)); DisposePtr((char*)unicode); ByteCount fixed_length = 0; GetEventParameter(event, kEventParamTextInputSendFixLen, typeByteCount, 0, sizeof(fixed_length), 0, &fixed_length); if(fixed_length == ULONG_MAX || fixed_length == unilen) { QInputMethodEvent e; e.setCommitString(text); context->currentText = QString(); qt_sendSpontaneousEvent(context->focusWidget(), &e); handled_event = true; context->reset(); } else { ByteCount rngSize = 0; OSStatus err = GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, 0, 0, &rngSize, 0); QVarLengthArray<TextRangeArray> highlight(rngSize); if (noErr == err) { err = GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, 0, rngSize, &rngSize, highlight.data()); } context->composing = true; if(fixed_length > 0) { const int qFixedLength = fixed_length / sizeof(UniChar); QList<QInputMethodEvent::Attribute> attrs; attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, qFixedLength, text.length()-qFixedLength, qt_mac_compose_format()); QInputMethodEvent e(text, attrs); context->currentText = text; e.setCommitString(text.left(qFixedLength), 0, qFixedLength); qt_sendSpontaneousEvent(widget, &e); handled_event = true; } else { /* Apple's enums that they have removed from Tiger :( enum { kCaretPosition = 1, kRawText = 2, kSelectedRawText = 3, kConvertedText = 4, kSelectedConvertedText = 5, kBlockFillText = 6, kOutlineText = 7, kSelectedText = 8 }; */ #ifndef kConvertedText #define kConvertedText 4 #endif #ifndef kCaretPosition #define kCaretPosition 1 #endif QList<QInputMethodEvent::Attribute> attrs; if (!highlight.isEmpty()) { TextRangeArray *data = highlight.data(); for (int i = 0; i < data->fNumOfRanges; ++i) { int start = data->fRange[i].fStart / sizeof(UniChar); int len = (data->fRange[i].fEnd - data->fRange[i].fStart) / sizeof(UniChar); if (data->fRange[i].fHiliteStyle == kCaretPosition) { attrs << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, start, 0, QVariant()); continue; } QTextCharFormat format; format.setFontUnderline(true); if (data->fRange[i].fHiliteStyle == kConvertedText) format.setUnderlineColor(Qt::gray); else format.setUnderlineColor(Qt::black); attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, start, len, format); } } else { attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, 0, text.length(), qt_mac_compose_format()); } context->currentText = text; QInputMethodEvent e(text, attrs); qt_sendSpontaneousEvent(widget, &e); handled_event = true; } } #if 0 if(!context->composing) handled_event = false; #endif extern bool qt_mac_eat_unicode_key; //qapplication_mac.cpp qt_mac_eat_unicode_key = handled_event; } else if(ekind == kEventTextInputUnicodeForKeyEvent) { EventRef key_ev = 0; GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, 0, sizeof(key_ev), 0, &key_ev); QString text; ByteCount unilen = 0; if(GetEventParameter(key_ev, kEventParamKeyUnicodes, typeUnicodeText, 0, 0, &unilen, 0) == noErr) { UniChar *unicode = (UniChar*)NewPtr(unilen); GetEventParameter(key_ev, kEventParamKeyUnicodes, typeUnicodeText, 0, unilen, 0, unicode); text = QString((QChar*)unicode, unilen / sizeof(UniChar)); DisposePtr((char*)unicode); } unsigned char chr = 0; GetEventParameter(key_ev, kEventParamKeyMacCharCodes, typeChar, 0, sizeof(chr), 0, &chr); if(!chr || chr >= 128 || (text.length() > 0 && (text.length() > 1 || text.at(0) != QLatin1Char(chr)))) handled_event = !widget->testAttribute(Qt::WA_InputMethodEnabled); QMacInputContext *context = qobject_cast<QMacInputContext*>(qApp->inputContext()); if (context && context->lastKeydownEvent()) { qt_keymapper_private()->translateKeyEvent(widget, 0, context->lastKeydownEvent(), 0, false); context->setLastKeydownEvent(0); } } break; } default: break; } if(!handled_event) //let the event go through return eventNotHandledErr; #else Q_UNUSED(event); #endif return noErr; //we eat the event }