[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/MasterProcessSession.cpp loolwsd/MasterProcessSession.hpp

Pranav Kant pranavk at collabora.com
Tue May 10 13:57:17 UTC 2016


 loolwsd/DocumentBroker.cpp       |   28 ++++++++++++++++++++++++----
 loolwsd/MasterProcessSession.cpp |   21 ++++++++++++++++++++-
 loolwsd/MasterProcessSession.hpp |    8 +++++---
 3 files changed, 49 insertions(+), 8 deletions(-)

New commits:
commit 55a85ddb33854ef18f950ba63a656eb5e15b04ed
Author: Pranav Kant <pranavk at collabora.com>
Date:   Tue May 10 19:07:42 2016 +0530

    bccu#1776: Fake double click after auto-saving
    
    ... just so that if we have the cursor before auto-saving, we
    have it after save too (calc).
    
    Change-Id: I3e6b1e41006c8fd9105d370b62ead4f45e50848c

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 9a4db8a..31be2ce 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -54,6 +54,16 @@ std::string getCachePath(const std::string& uri)
             Poco::DigestEngine::digestToHex(digestEngine.digest()).insert(3, "/").insert(2, "/").insert(1, "/"));
 }
 
+/// Return mouse commands
+std::string getMouseCommand(std::string type, long posX, long posY, int count)
+{
+    return std::string("mouse type=" + type +
+                       " x=" + std::to_string(posX) +
+                       " y=" + std::to_string(posY) +
+                       " count=" + std::to_string(count) +
+                       " buttons=1 modifier=0");
+}
+
 }
 
 Poco::URI DocumentBroker::sanitizeURI(const std::string& uri)
@@ -284,13 +294,23 @@ bool DocumentBroker::sendUnoSave()
                 // Invalidate the timestamp to force persisting.
                 _lastFileModifiedTime.fromEpochTime(0);
 
+                // Store the cursor position before saving, if visible
+                long posX = -1;
+                long posY = -1;
+                if (sessionIt.second->isCursorVisible())
+                {
+                    sessionIt.second->getCursorPos(posX, posY);
+                }
+
                 queue->put("uno .uno:Save");
 
-                // Set calc cell mode back to edit mode
-                // if we were in edit before save
-                if (sessionIt.second->isCursorVisible())
+                // Restore the cursor position, if visible, by a fake double click
+                if (posX != -1 && posY != -1)
                 {
-                    queue->put("uno .uno:SetInputMode");
+                    queue->put(getMouseCommand("buttondown", posX, posY, 1));
+                    queue->put(getMouseCommand("buttonup", posX, posY, 1));
+                    queue->put(getMouseCommand("buttondown", posX, posY, 2));
+                    queue->put(getMouseCommand("buttonup", posX, posY, 2));
                 }
 
                 return true;
diff --git a/loolwsd/MasterProcessSession.cpp b/loolwsd/MasterProcessSession.cpp
index 3d5ee3c..87be145 100644
--- a/loolwsd/MasterProcessSession.cpp
+++ b/loolwsd/MasterProcessSession.cpp
@@ -175,9 +175,16 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length)
                     }
                 }
             }
+            else if (tokens.count() == 5 && tokens[0] == "invalidatecursor:")
+            {
+                peer->setCursorPos(std::stoi(tokens[1]), std::stoi(tokens[2]));
+            }
             else if (tokens.count() == 2 && tokens[0] == "cursorvisible:")
             {
-                peer->setCursorVisible(tokens[1] == "true");
+                if (tokens[1] == "false")
+                {
+                    peer->setCursorPos(-1, -1);
+                }
             }
         }
 
@@ -654,4 +661,16 @@ bool MasterProcessSession::shutdownPeer(Poco::UInt16 statusCode, const std::stri
     return peer != nullptr;
 }
 
+void MasterProcessSession::setCursorPos(long posX, long posY)
+{
+    _cursorPosX = posX;
+    _cursorPosY = posY;
+}
+
+void MasterProcessSession::getCursorPos(long& posX, long& posY)
+{
+    posX = _cursorPosX;
+    posY = _cursorPosY;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp
index 2472eb5..d2227e7 100644
--- a/loolwsd/MasterProcessSession.hpp
+++ b/loolwsd/MasterProcessSession.hpp
@@ -50,8 +50,9 @@ class MasterProcessSession final : public LOOLSession, public std::enable_shared
     void setEditLock(const bool value);
     void markEditLock(const bool value) { _bEditLock = value; }
     bool isEditLocked() const { return _bEditLock; }
-    void setCursorVisible(const bool value) { _isCursorVisible = value; }
-    bool isCursorVisible() { return _isCursorVisible; }
+    void setCursorPos(const long posX, const long posY);
+    void getCursorPos(long& posX, long& posY);
+    bool isCursorVisible() { return _cursorPosX != -1 && _cursorPosY != -1; }
 
     bool shutdownPeer(Poco::UInt16 statusCode, const std::string& message);
 
@@ -88,7 +89,8 @@ public:
 
     int _curPart;
     int _loadPart;
-    bool _isCursorVisible;
+    long _cursorPosX;
+    long _cursorPosY;
     /// Kind::ToClient instances store URLs of completed 'save as' documents.
     MessageQueue _saveAsQueue;
     std::shared_ptr<DocumentBroker> _docBroker;


More information about the Libreoffice-commits mailing list