[Libreoffice-commits] core.git: vcl/inc vcl/qt5
Jan-Marek Glogowski (via logerrit)
logerrit at kemper.freedesktop.org
Sun Nov 22 16:01:50 UTC 2020
vcl/inc/qt5/Qt5Frame.hxx | 4 ++++
vcl/inc/qt5/Qt5Instance.hxx | 1 +
vcl/qt5/Qt5Frame.cxx | 11 ++++++++---
vcl/qt5/Qt5Instance.cxx | 16 ++++++++++++++++
4 files changed, 29 insertions(+), 3 deletions(-)
New commits:
commit 9d96088c2832b681ae079b29cbc977231674ad52
Author: Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Sun Nov 22 14:53:14 2020 +0100
Commit: Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Sun Nov 22 17:01:07 2020 +0100
Qt5 report input method language
This is in the spirit of tdf#108151, based on the information Qt
provides for the IM setting. I don't know how correct it is,
especially looking at Caolans comment 3 in that bug report
regarding the assumed validity of GtkIMContextInfo. OTOH it seems
to work well enough for my simple tests.
Some BG info: while the QInputMethod object is a global one, it's
"bound" to the focused window. So you'll get change events, when
you change the input window, with the correct IM settings for the
new one, be it a real window or just the menu bar.
To prevent unneeded flushes of buffers and language lookup, this
caches the current IM language of a window.
The language is not affected just by changing keyboard mappings,
which the bug reporter requested! It just works with a configured
input method, like fcitx or ibus (which can have keyboard mappings
too, which work correctly).
Change-Id: Ia9133edf4d1ce77d29adbfe57c180db15db0a560
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106354
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>
diff --git a/vcl/inc/qt5/Qt5Frame.hxx b/vcl/inc/qt5/Qt5Frame.hxx
index 54a721e03730..c07fda54ec40 100644
--- a/vcl/inc/qt5/Qt5Frame.hxx
+++ b/vcl/inc/qt5/Qt5Frame.hxx
@@ -109,6 +109,8 @@ class VCLPLUG_QT5_PUBLIC Qt5Frame : public QObject, public SalFrame
ScreenSaverInhibitor m_ScreenSaverInhibitor;
#endif
+ LanguageType m_nInputLanguage;
+
void SetDefaultPos();
Size CalcDefaultSize();
void SetDefaultSize();
@@ -211,6 +213,8 @@ public:
virtual void SetApplicationID(const OUString&) override;
inline bool CallCallback(SalEvent nEvent, const void* pEvent) const;
+
+ void setInputLanguage(LanguageType);
};
inline bool Qt5Frame::CallCallback(SalEvent nEvent, const void* pEvent) const
diff --git a/vcl/inc/qt5/Qt5Instance.hxx b/vcl/inc/qt5/Qt5Instance.hxx
index d73a59de51c1..cd9c51826a90 100644
--- a/vcl/inc/qt5/Qt5Instance.hxx
+++ b/vcl/inc/qt5/Qt5Instance.hxx
@@ -73,6 +73,7 @@ class VCLPLUG_QT5_PUBLIC Qt5Instance : public QObject,
private Q_SLOTS:
bool ImplYield(bool bWait, bool bHandleAllCurrentEvents);
static void deleteObjectLater(QObject* pObject);
+ static void localeChanged();
Q_SIGNALS:
bool ImplYieldSignal(bool bWait, bool bHandleAllCurrentEvents);
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx
index 06984b983a79..ad541db4f70c 100644
--- a/vcl/qt5/Qt5Frame.cxx
+++ b/vcl/qt5/Qt5Frame.cxx
@@ -116,6 +116,7 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo)
, m_bDefaultPos(true)
, m_bFullScreen(false)
, m_bFullScreenSpanAll(false)
+ , m_nInputLanguage(LANGUAGE_DONTKNOW)
{
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
pInst->insertFrame(this);
@@ -995,10 +996,14 @@ bool Qt5Frame::MapUnicodeToKeyCode(sal_Unicode /*aUnicode*/, LanguageType /*aLan
return false;
}
-LanguageType Qt5Frame::GetInputLanguage()
+LanguageType Qt5Frame::GetInputLanguage() { return m_nInputLanguage; }
+
+void Qt5Frame::setInputLanguage(LanguageType nInputLanguage)
{
- // fallback
- return LANGUAGE_DONTKNOW;
+ if (nInputLanguage == m_nInputLanguage)
+ return;
+ m_nInputLanguage = nInputLanguage;
+ CallCallback(SalEvent::InputLanguageChange, nullptr);
}
static Color toColor(const QColor& rColor)
diff --git a/vcl/qt5/Qt5Instance.cxx b/vcl/qt5/Qt5Instance.cxx
index ca1f914dd707..97eff04fe77a 100644
--- a/vcl/qt5/Qt5Instance.cxx
+++ b/vcl/qt5/Qt5Instance.cxx
@@ -229,6 +229,9 @@ Qt5Instance::Qt5Instance(std::unique_ptr<QApplication>& pQApp, bool bUseCairo)
connect(dispatcher, &QAbstractEventDispatcher::awake, this, [this]() { m_bSleeping = false; });
connect(dispatcher, &QAbstractEventDispatcher::aboutToBlock, this,
[this]() { m_bSleeping = true; });
+
+ connect(QGuiApplication::inputMethod(), &QInputMethod::localeChanged, this,
+ &Qt5Instance::localeChanged);
}
Qt5Instance::~Qt5Instance()
@@ -248,6 +251,19 @@ void Qt5Instance::AfterAppInit()
: Qt::LeftToRight);
}
+void Qt5Instance::localeChanged()
+{
+ SolarMutexGuard aGuard;
+ const vcl::Window* pFocusWindow = Application::GetFocusWindow();
+ SalFrame* const pFocusFrame = pFocusWindow ? pFocusWindow->ImplGetFrame() : nullptr;
+ if (!pFocusFrame)
+ return;
+
+ const LanguageTag aTag(
+ toOUString(QGuiApplication::inputMethod()->locale().name().replace("_", "-")));
+ static_cast<Qt5Frame*>(pFocusFrame)->setInputLanguage(aTag.getLanguageType());
+}
+
void Qt5Instance::deleteObjectLater(QObject* pObject) { pObject->deleteLater(); }
SalFrame* Qt5Instance::CreateChildFrame(SystemParentData* /*pParent*/, SalFrameStyleFlags nStyle)
More information about the Libreoffice-commits
mailing list