21static QNSView *inputViewForWindow(QWindow *focusWindow)
26 auto *platformWindow = focusWindow->handle();
30 auto *cocoaWindow =
static_cast<QCocoaWindow *>(platformWindow);
34 NSView *firstResponder = qt_objc_cast<NSView *>(cocoaWindow->nativeWindow().firstResponder);
35 if (QNSView *view = qnsview_cast(firstResponder))
37 return qnsview_cast(cocoaWindow->view());
65QCocoaInputContext::QCocoaInputContext()
66 : QPlatformInputContext()
67 , m_focusWindow(QGuiApplication::focusWindow())
69 m_inputSourceObserver = QMacNotificationObserver(nil,
70 NSTextInputContextKeyboardSelectionDidChangeNotification, [&]() {
71 qCDebug(lcQpaInputMethods) <<
"Text input source changed";
87void QCocoaInputContext::commit()
89 qCDebug(lcQpaInputMethods) <<
"Committing composition";
91 QNSView *view = inputViewForWindow(m_focusWindow);
97 [view.inputContext discardMarkedText];
98 if (view.inputContext != NSTextInputContext.currentInputContext) {
103 [NSTextInputContext.currentInputContext activate];
111void QCocoaInputContext::reset()
113 qCDebug(lcQpaInputMethods) <<
"Resetting input method";
115 QNSView *view = inputViewForWindow(m_focusWindow);
119 if (NSTextInputContext *ctxt = [NSTextInputContext currentInputContext]) {
120 [ctxt discardMarkedText];
125void QCocoaInputContext::setFocusObject(QObject *focusObject)
127 qCDebug(lcQpaInputMethods) <<
"Focus object changed to" << focusObject;
129 if (m_focusWindow == QGuiApplication::focusWindow()) {
133 QNSView *view = inputViewForWindow(m_focusWindow);
137 if (NSTextInputContext *ctxt = [NSTextInputContext currentInputContext]) {
138 [ctxt discardMarkedText];
139 [view cancelComposingText];
142 m_focusWindow = QGuiApplication::focusWindow();
146void QCocoaInputContext::updateLocale()
148 QCFType<TISInputSourceRef> source = TISCopyCurrentKeyboardInputSource();
149 NSArray *languages =
static_cast<NSArray*>(TISGetInputSourceProperty(source,
150 kTISPropertyInputSourceLanguages));
152 qCDebug(lcQpaInputMethods) <<
"Input source supports" << languages;
153 if (!languages.count)
156 QString language = QString::fromNSString(languages.firstObject);
157 QLocale locale(language);
159 bool localeUpdated = m_locale != locale;
160 static bool firstUpdate =
true;
164 if (localeUpdated && !firstUpdate) {
165 qCDebug(lcQpaInputMethods) <<
"Reporting new locale" << locale;