diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h index f97521fe02..b6e3960121 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.h +++ b/src/plugins/platforms/cocoa/qcocoahelpers.h @@ -72,6 +72,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaWindow) Q_DECLARE_LOGGING_CATEGORY(lcQpaDrawing) Q_DECLARE_LOGGING_CATEGORY(lcQpaMouse) Q_DECLARE_LOGGING_CATEGORY(lcQpaKeys) +Q_DECLARE_LOGGING_CATEGORY(lcQpaInputMethods) Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen) Q_DECLARE_LOGGING_CATEGORY(lcQpaApplication) Q_DECLARE_LOGGING_CATEGORY(lcQpaClipboard) diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm index 102cf28452..f4cf630e4b 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -59,6 +59,7 @@ Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window"); Q_LOGGING_CATEGORY(lcQpaDrawing, "qt.qpa.drawing"); Q_LOGGING_CATEGORY(lcQpaMouse, "qt.qpa.input.mouse", QtCriticalMsg); Q_LOGGING_CATEGORY(lcQpaKeys, "qt.qpa.input.keys", QtCriticalMsg); +Q_LOGGING_CATEGORY(lcQpaInputMethods, "qt.qpa.input.methods") Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen", QtCriticalMsg); Q_LOGGING_CATEGORY(lcQpaApplication, "qt.qpa.application"); Q_LOGGING_CATEGORY(lcQpaClipboard, "qt.qpa.clipboard") diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.h b/src/plugins/platforms/cocoa/qcocoainputcontext.h index 7190ba0de8..445dd91866 100644 --- a/src/plugins/platforms/cocoa/qcocoainputcontext.h +++ b/src/plugins/platforms/cocoa/qcocoainputcontext.h @@ -44,6 +44,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QCocoaInputContext : public QPlatformInputContext @@ -67,6 +69,7 @@ private Q_SLOTS: private: QPointer mWindow; QLocale m_locale; + QMacNotificationObserver m_inputSourceObserver; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.mm b/src/plugins/platforms/cocoa/qcocoainputcontext.mm index 49c622e83b..6fe48daa14 100644 --- a/src/plugins/platforms/cocoa/qcocoainputcontext.mm +++ b/src/plugins/platforms/cocoa/qcocoainputcontext.mm @@ -85,6 +85,13 @@ QCocoaInputContext::QCocoaInputContext() , mWindow(QGuiApplication::focusWindow()) { QMetaObject::invokeMethod(this, "connectSignals", Qt::QueuedConnection); + + m_inputSourceObserver = QMacNotificationObserver(nil, + NSTextInputContextKeyboardSelectionDidChangeNotification, [&]() { + qCDebug(lcQpaInputMethods) << "Text input source changed"; + updateLocale(); + }); + updateLocale(); } @@ -146,18 +153,21 @@ void QCocoaInputContext::focusObjectChanged(QObject *focusObject) void QCocoaInputContext::updateLocale() { - TISInputSourceRef source = TISCopyCurrentKeyboardInputSource(); - CFArrayRef languages = (CFArrayRef) TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages); - if (CFArrayGetCount(languages) > 0) { - CFStringRef langRef = (CFStringRef)CFArrayGetValueAtIndex(languages, 0); - QString name = QString::fromCFString(langRef); - QLocale locale(name); - if (m_locale != locale) { - m_locale = locale; - emitLocaleChanged(); - } + QCFType source = TISCopyCurrentKeyboardInputSource(); + NSArray *languages = static_cast(TISGetInputSourceProperty(source, + kTISPropertyInputSourceLanguages)); + + qCDebug(lcQpaInputMethods) << "Input source supports" << languages; + if (!languages.count) + return; + + QString language = QString::fromNSString(languages.firstObject); + QLocale locale(language); + if (m_locale != locale) { + qCDebug(lcQpaInputMethods) << "Reporting new locale" << locale; + m_locale = locale; + emitLocaleChanged(); } - CFRelease(source); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index bcc6c5ee61..e2dd496dae 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -116,7 +116,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMouseMoveHelper); @end @interface QNSView (ComplexText) -- (void)textInputContextKeyboardSelectionDidChangeNotification:(NSNotification *)textInputContextKeyboardSelectionDidChangeNotification; @end @implementation QNSView { @@ -159,11 +158,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMouseMoveHelper); [self initDrawing]; [self initMouse]; [self registerDragTypes]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(textInputContextKeyboardSelectionDidChangeNotification:) - name:NSTextInputContextKeyboardSelectionDidChangeNotification - object:nil]; } return self; } diff --git a/src/plugins/platforms/cocoa/qnsview_complextext.mm b/src/plugins/platforms/cocoa/qnsview_complextext.mm index 2c2ccc33c8..a7c08e53ed 100644 --- a/src/plugins/platforms/cocoa/qnsview_complextext.mm +++ b/src/plugins/platforms/cocoa/qnsview_complextext.mm @@ -265,13 +265,4 @@ return nil; } -- (void)textInputContextKeyboardSelectionDidChangeNotification:(NSNotification *)textInputContextKeyboardSelectionDidChangeNotification -{ - Q_UNUSED(textInputContextKeyboardSelectionDidChangeNotification); - if (([NSApp keyWindow] == self.window) && self.window.firstResponder == self) { - if (QCocoaInputContext *ic = qobject_cast(QCocoaIntegration::instance()->inputContext())) - ic->updateLocale(); - } -} - @end