desktop/source/lib/init.cxx | 21 +++++++-------------- include/vcl/ITiledRenderable.hxx | 7 +++++++ sc/inc/docuno.hxx | 3 +++ sc/source/ui/inc/gridwin.hxx | 2 +- sc/source/ui/unoobj/docuno.cxx | 28 ++++++++++++++++++++++++++++ sd/source/ui/inc/Window.hxx | 2 +- sd/source/ui/inc/unomodel.hxx | 2 ++ sd/source/ui/unoidl/unomodel.cxx | 28 ++++++++++++++++++++++++++++ sw/inc/unotxdoc.hxx | 2 ++ sw/source/uibase/inc/edtwin.hxx | 2 +- sw/source/uibase/uno/unotxdoc.cxx | 21 +++++++++++++++++++++ 11 files changed, 101 insertions(+), 17 deletions(-)
New commits: commit 4ab968500f911f37d2a620c5576e21546cf9b885 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Apr 3 12:29:28 2015 +0200 LOK: reimplement lok::Document::postKeyEvent() Instead of posting an event to the main loop of the soffice thread, do what every other methods do: take the solar mutex and execute the task on the thread. This fixes random lost/delayed key events on Android. Change-Id: Ibe819282b5f3bb64e44d4b6f0a92611fe651bb39 diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index bdab485..7d502af 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -687,23 +687,16 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis, pDoc->registerCallback(pCallback, pData); } -static void doc_postKeyEvent(LibreOfficeKitDocument* /*pThis*/, int nType, int nCharCode, int nKeyCode) +static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nCharCode, int nKeyCode) { -#if defined(UNX) && !defined(MACOSX) && !defined(ENABLE_HEADLESS) - if (SalFrame *pFocus = GetSvpFocusFrameForLibreOfficeKit()) + ITiledRenderable* pDoc = getTiledRenderable(pThis); + if (!pDoc) { - KeyEvent aEvent(nCharCode, nKeyCode, 0); - switch (nType) - { - case LOK_KEYEVENT_KEYINPUT: - Application::PostKeyEvent(VCLEVENT_WINDOW_KEYINPUT, GetSalFrameWindowForLibreOfficeKit(pFocus), &aEvent); - break; - case LOK_KEYEVENT_KEYUP: - Application::PostKeyEvent(VCLEVENT_WINDOW_KEYUP, GetSalFrameWindowForLibreOfficeKit(pFocus), &aEvent); - break; - } + gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering"; + return; } -#endif + + pDoc->postKeyEvent(nType, nCharCode, nKeyCode); } static void doc_postUnoCommand(LibreOfficeKitDocument* /*pThis*/, const char* pCommand) diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx index a10e448..5cac9b6 100644 --- a/include/vcl/ITiledRenderable.hxx +++ b/include/vcl/ITiledRenderable.hxx @@ -101,6 +101,13 @@ public: virtual void registerCallback(LibreOfficeKitCallback pCallback, void* pData) = 0; /** + * Posts a keyboard event on the document. + * + * @see lok::Document::postKeyEvent(). + */ + virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) = 0; + + /** * Posts a mouse event on the document. * * @see lok::Document::postMouseEvent(). diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 5642569..0e58087 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -394,6 +394,9 @@ public: /// @see vcl::ITiledRenderable::registerCallback(). virtual void registerCallback(LibreOfficeKitCallback pCallback, void* pData) SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::postKeyEvent(). + virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount) SAL_OVERRIDE; diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 9d8965d..259844e 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -287,7 +287,6 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou protected: virtual void PrePaint() SAL_OVERRIDE; virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; - virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE; virtual void GetFocus() SAL_OVERRIDE; virtual void LoseFocus() SAL_OVERRIDE; @@ -304,6 +303,7 @@ public: ScGridWindow( vcl::Window* pParent, ScViewData* pData, ScSplitPos eWhichPos ); virtual ~ScGridWindow(); + virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE; // #i70788# flush and get overlay rtl::Reference<sdr::overlay::OverlayManager> getOverlayManager(); void flushOverlayManager(); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 16e83e0..3ee089a 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -528,6 +528,34 @@ void ScModelObj::registerCallback(LibreOfficeKitCallback pCallback, void* pData) pDocShell->GetDocument().GetDrawLayer()->registerLibreOfficeKitCallback(pCallback, pData); } +void ScModelObj::postKeyEvent(int nType, int nCharCode, int nKeyCode) +{ + SolarMutexGuard aGuard; + + // There seems to be no clear way of getting the grid window for this + // particular document, hence we need to hope we get the right window. + ScViewData* pViewData = ScDocShell::GetViewData(); + ScGridWindow* pGridWindow = pViewData->GetActiveWin(); + + if (!pGridWindow) + return; + + KeyEvent aEvent(nCharCode, nKeyCode, 0); + + switch (nType) + { + case LOK_KEYEVENT_KEYINPUT: + pGridWindow->KeyInput(aEvent); + break; + case LOK_KEYEVENT_KEYUP: + pGridWindow->KeyUp(aEvent); + break; + default: + assert(false); + break; + } +} + void ScModelObj::postMouseEvent(int nType, int nX, int nY, int nCount) { SolarMutexGuard aGuard; diff --git a/sd/source/ui/inc/Window.hxx b/sd/source/ui/inc/Window.hxx index be2bb1a..dca72fb 100644 --- a/sd/source/ui/inc/Window.hxx +++ b/sd/source/ui/inc/Window.hxx @@ -147,6 +147,7 @@ public: */ void SetUseDropScroll (bool bUseDropScroll); void DropScroll (const Point& rMousePos); + virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE; protected: ::sd::Window* mpShareWin; Point maWinPos; @@ -171,7 +172,6 @@ protected: virtual void Resize() SAL_OVERRIDE; virtual void PrePaint() SAL_OVERRIDE; virtual void Paint(const Rectangle& rRect) SAL_OVERRIDE; - virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE; virtual void MouseMove(const MouseEvent& rMEvt) SAL_OVERRIDE; virtual void MouseButtonUp(const MouseEvent& rMEvt) SAL_OVERRIDE; virtual void MouseButtonDown(const MouseEvent& rMEvt) SAL_OVERRIDE; diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx index bb840f2..b9c17ac 100644 --- a/sd/source/ui/inc/unomodel.hxx +++ b/sd/source/ui/inc/unomodel.hxx @@ -245,6 +245,8 @@ public: virtual void initializeForTiledRendering() SAL_OVERRIDE; /// @see vcl::ITiledRenderable::registerCallback(). virtual void registerCallback(LibreOfficeKitCallback pCallback, void* pData) SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::postKeyEvent(). + virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) SAL_OVERRIDE; /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount) SAL_OVERRIDE; /// @see vcl::ITiledRenderable::setTextSelection(). diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 9c9678b..b85de6a 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -2378,6 +2378,34 @@ void SdXImpressDocument::registerCallback(LibreOfficeKitCallback pCallback, void mpDoc->registerLibreOfficeKitCallback(pCallback, pData); } +void SdXImpressDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + sd::Window* pWindow = pViewShell->GetActiveWindow(); + if (!pWindow) + return; + + KeyEvent aEvent(nCharCode, nKeyCode, 0); + + switch (nType) + { + case LOK_KEYEVENT_KEYINPUT: + pWindow->KeyInput(aEvent); + break; + case LOK_KEYEVENT_KEYUP: + pWindow->KeyUp(aEvent); + break; + default: + assert(false); + break; + } +} + void SdXImpressDocument::postMouseEvent(int nType, int nX, int nY, int nCount) { SolarMutexGuard aGuard; diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index 72025628..22375eb 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -409,6 +409,8 @@ public: virtual void initializeForTiledRendering() SAL_OVERRIDE; /// @see vcl::ITiledRenderable::registerCallback(). virtual void registerCallback(LibreOfficeKitCallback pCallback, void* pData) SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::postKeyEvent(). + virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) SAL_OVERRIDE; /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount) SAL_OVERRIDE; /// @see vcl::ITiledRenderable::setTextSelection(). diff --git a/sw/source/uibase/inc/edtwin.hxx b/sw/source/uibase/inc/edtwin.hxx index 5a4cf7a..e8c2e5e 100644 --- a/sw/source/uibase/inc/edtwin.hxx +++ b/sw/source/uibase/inc/edtwin.hxx @@ -189,7 +189,6 @@ protected: virtual void DataChanged( const DataChangedEvent& ) SAL_OVERRIDE; virtual void PrePaint() SAL_OVERRIDE; virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; - virtual void KeyInput(const KeyEvent &rKEvt) SAL_OVERRIDE; virtual void GetFocus() SAL_OVERRIDE; virtual void LoseFocus() SAL_OVERRIDE; @@ -218,6 +217,7 @@ protected: bool IsOverHeaderFooterFly( const Point& rDocPos, FrameControlType& rControl, bool& bOverFly, bool& bPageAnchored ) const; public: + virtual void KeyInput(const KeyEvent &rKEvt) SAL_OVERRIDE; void UpdatePointer(const Point &, sal_uInt16 nButtons = 0); bool IsDrawSelMode(); diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index cdf2577..2564cf9 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -3186,6 +3186,27 @@ void SwXTextDocument::registerCallback(LibreOfficeKitCallback pCallback, void* p pViewShell->registerLibreOfficeKitCallback(pCallback, pData); } +void SwXTextDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode) +{ + SolarMutexGuard aGuard; + + SwEditWin& rEditWin = pDocShell->GetView()->GetEditWin(); + KeyEvent aEvent(nCharCode, nKeyCode, 0); + + switch (nType) + { + case LOK_KEYEVENT_KEYINPUT: + rEditWin.KeyInput(aEvent); + break; + case LOK_KEYEVENT_KEYUP: + rEditWin.KeyUp(aEvent); + break; + default: + assert(false); + break; + } +} + void SwXTextDocument::postMouseEvent(int nType, int nX, int nY, int nCount) { SolarMutexGuard aGuard; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits