[Libreoffice-commits] online.git: 2 commits - kit/ChildSession.cpp kit/ChildSession.hpp
Jan Holesovsky
kendy at collabora.com
Mon Apr 24 17:33:24 UTC 2017
kit/ChildSession.cpp | 50 ++++++++++++++++++++++++++++++++------------------
kit/ChildSession.hpp | 12 ++++++++++++
2 files changed, 44 insertions(+), 18 deletions(-)
New commits:
commit c36e619d24d9a5b063db648e65daf2e43aae3df8
Author: Jan Holesovsky <kendy at collabora.com>
Date: Mon Apr 24 19:19:18 2017 +0200
inactive: Invalidate tiles when we return back to the active state.
Change-Id: Ib97d6463c52ecf153d3c19ab7efc47d99b71ce9b
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 373d451f..8b01a517 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -117,15 +117,24 @@ bool ChildSession::_handleInput(const char *buffer, int length)
sendTextFrame("setpart: part=" + std::to_string(curPart));
}
+ // Invalidate if we have to
+ // TODO instead just a "_invalidate" flag, we should remember / grow
+ // the rectangle to invalidate; invalidating everything is sub-optimal
+ if (_stateRecorder._invalidate)
+ {
+ std::string payload = "0, 0, " + std::to_string(INT_MAX) + ", " + std::to_string(INT_MAX) + ", " + std::to_string(curPart);
+ loKitCallback(LOK_CALLBACK_INVALIDATE_TILES, payload);
+ }
+
for (const auto& viewPair : _stateRecorder._recordedViewEvents)
{
- for (const auto& eventPair : viewPair.second)
- {
- const RecordedEvent& event = eventPair.second;
- LOG_TRC("Replaying missed view event: " << viewPair.first << " " << LOKitHelper::kitCallbackTypeToString(event._type)
- << ": " << event._payload);
- loKitCallback(event._type, event._payload);
- }
+ for (const auto& eventPair : viewPair.second)
+ {
+ const RecordedEvent& event = eventPair.second;
+ LOG_TRC("Replaying missed view event: " << viewPair.first << " " << LOKitHelper::kitCallbackTypeToString(event._type)
+ << ": " << event._payload);
+ loKitCallback(event._type, event._payload);
+ }
}
for (const auto& eventPair : _stateRecorder._recordedEvents)
@@ -971,16 +980,21 @@ bool ChildSession::setPage(const char* /*buffer*/, int /*length*/, const std::ve
*/
void ChildSession::rememberEventsForInactiveUser(const int type, const std::string& payload)
{
- if (type == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR ||
- type == LOK_CALLBACK_CURSOR_VISIBLE ||
- type == LOK_CALLBACK_TEXT_SELECTION ||
- type == LOK_CALLBACK_TEXT_SELECTION_START ||
- type == LOK_CALLBACK_TEXT_SELECTION_END ||
- type == LOK_CALLBACK_CELL_FORMULA ||
- type == LOK_CALLBACK_CELL_CURSOR ||
- type == LOK_CALLBACK_GRAPHIC_SELECTION ||
- type == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED ||
- type == LOK_CALLBACK_INVALIDATE_HEADER)
+ if (type == LOK_CALLBACK_INVALIDATE_TILES)
+ {
+ auto lock(getLock());
+ _stateRecorder.recordInvalidate(); // TODO remember the area, not just a bool ('true' invalidates everything)
+ }
+ else if (type == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR ||
+ type == LOK_CALLBACK_CURSOR_VISIBLE ||
+ type == LOK_CALLBACK_TEXT_SELECTION ||
+ type == LOK_CALLBACK_TEXT_SELECTION_START ||
+ type == LOK_CALLBACK_TEXT_SELECTION_END ||
+ type == LOK_CALLBACK_CELL_FORMULA ||
+ type == LOK_CALLBACK_CELL_CURSOR ||
+ type == LOK_CALLBACK_GRAPHIC_SELECTION ||
+ type == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED ||
+ type == LOK_CALLBACK_INVALIDATE_HEADER)
{
auto lock(getLock());
_stateRecorder.recordEvent(type, payload);
diff --git a/kit/ChildSession.hpp b/kit/ChildSession.hpp
index ce47ed4c..c0279488 100644
--- a/kit/ChildSession.hpp
+++ b/kit/ChildSession.hpp
@@ -66,13 +66,23 @@ struct RecordedEvent
std::string _payload;
};
+/// When the session is inactive, we need to record its state for a replay.
class StateRecorder
{
public:
+ bool _invalidate;
std::unordered_map<std::string, std::string> _recordedStates;
std::unordered_map<int, std::unordered_map<int, RecordedEvent>> _recordedViewEvents;
std::unordered_map<int, RecordedEvent> _recordedEvents;
+ StateRecorder() : _invalidate(false) {}
+
+ // TODO Remember the maximal area we need to invalidate - grow it step by step.
+ void recordInvalidate()
+ {
+ _invalidate = true;
+ }
+
void recordEvent(const int type, const std::string& payload)
{
_recordedEvents[type] = {type, payload};
@@ -90,8 +100,10 @@ public:
void clear()
{
+ _invalidate = false;
_recordedEvents.clear();
_recordedViewEvents.clear();
+ _recordedStates.clear();
}
};
commit e78c862c4799804e0627cb98d99d021a636fab80
Author: Jan Holesovsky <kendy at collabora.com>
Date: Mon Apr 24 18:37:03 2017 +0200
inactive: Replay the state payload, not the only the value.
We need to replay 'client-0054 statechanged: .uno:StateWordCount=5 words, 30 characters',
not 'client-0054 statechanged: 5 words, 30 characters'.
Change-Id: Ifd1fc7d6d567bcf209dffdd826400f5a5248aa7e
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 97a384a7..373d451f 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -1006,7 +1006,7 @@ void ChildSession::rememberEventsForInactiveUser(const int type, const std::stri
if (LOOLProtocol::parseNameValuePair(payload, name, value, '='))
{
auto lock(getLock());
- _stateRecorder.recordState(name, value);
+ _stateRecorder.recordState(name, payload);
}
}
}
More information about the Libreoffice-commits
mailing list