vcl/qt5/Qt5Widget.cxx | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
New commits: commit 7dc35d13e375cac1371ea491ee3bc46ef5ebf8a6 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Sat May 4 01:04:35 2019 +0000 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Wed May 15 23:21:06 2019 +0200 Qt5 IM handle surrounding text requests This is almost a C'n'P from gtk / gtk3. That code is from 2006 (see i#68048 / commit 28c5cdcc53ae068b0c763c660d61a8291dd96726). The original patch was described by the author (caolan) as hilarious. No change from my side, except using QString. Completely untested, in theory correct. Change-Id: I8373ca7ac9eda6e377da985532fd2b7cd595bf48 Reviewed-on: https://gerrit.libreoffice.org/71786 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de> diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx index 88ce1b18f0e7..8db1e05e6cf2 100644 --- a/vcl/qt5/Qt5Widget.cxx +++ b/vcl/qt5/Qt5Widget.cxx @@ -46,6 +46,12 @@ #include <headless/svpgdi.hxx> #include <vcl/commandevent.hxx> #include <vcl/event.hxx> +#include <window.h> + +#include <com/sun/star/accessibility/XAccessibleContext.hpp> +#include <com/sun/star/accessibility/XAccessibleEditableText.hpp> + +using namespace com::sun::star; void Qt5Widget::paintEvent(QPaintEvent* pEvent) { @@ -553,10 +559,55 @@ void Qt5Widget::inputMethodEvent(QInputMethodEvent* pEvent) pEvent->accept(); } +static bool lcl_retrieveSurrounding(sal_Int32& rPosition, QString* pText) +{ + vcl::Window* pFocusWin = Application::GetFocusWindow(); + if (!pFocusWin) + return false; + + uno::Reference<accessibility::XAccessibleEditableText> xText; + try + { + uno::Reference<accessibility::XAccessible> xAccessible(pFocusWin->GetAccessible()); + if (xAccessible.is()) + xText = FindFocusedEditableText(xAccessible->getAccessibleContext()); + } + catch (const uno::Exception& e) + { + SAL_WARN("vcl.qt5", "Exception in getting input method surrounding text: " << e); + } + if (xText.is()) + { + rPosition = xText->getCaretPosition(); + if (rPosition != -1 && pText) + { + *pText = toQString(xText->getText()); + return true; + } + } + + return false; +} + QVariant Qt5Widget::inputMethodQuery(Qt::InputMethodQuery property) const { switch (property) { + case Qt::ImSurroundingText: + { + QString aText; + sal_Int32 nCursorPos; + if (lcl_retrieveSurrounding(nCursorPos, &aText)) + return QVariant(aText); + [[fallthrough]]; + } + case Qt::ImCursorPosition: + { + sal_Int32 nCursorPos; + if (lcl_retrieveSurrounding(nCursorPos, nullptr)) + return QVariant(nCursorPos); + [[fallthrough]]; + } case Qt::ImCursorRectangle: { SalExtTextInputPosEvent aPosEvent; @@ -567,6 +618,8 @@ QVariant Qt5Widget::inputMethodQuery(Qt::InputMethodQuery property) const default: return QWidget::inputMethodQuery(property); } + + return QVariant(); } void Qt5Widget::endExtTextInput() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits