@@ -141,16 +141,22 @@ class CWebDiffWindow : public IWebDiffWindow
141
141
}
142
142
else if (event == L" click" )
143
143
{
144
- const std::wstring& selector = doc[L" selector" ].GetString ();
145
- syncClick (ev.pane , selector);
144
+ if (GetSyncEventFlag (EVENT_CLICK))
145
+ {
146
+ const std::wstring& selector = doc[L" selector" ].GetString ();
147
+ syncClick (ev.pane , selector);
148
+ }
146
149
}
147
150
else if (event == L" scroll" )
148
151
{
149
- const double left = doc[L" left" ].GetDouble ();
150
- const double top = doc[L" top" ].GetDouble ();
151
- const std::wstring& window = doc[L" window" ].GetString ();
152
- const std::wstring& selector = doc[L" selector" ].GetString ();
153
- syncScroll (ev.pane , window, selector, left, top);
152
+ if (GetSyncEventFlag (EVENT_SCROLL))
153
+ {
154
+ const double left = doc[L" left" ].GetDouble ();
155
+ const double top = doc[L" top" ].GetDouble ();
156
+ const std::wstring& window = doc[L" window" ].GetString ();
157
+ const std::wstring& selector = doc[L" selector" ].GetString ();
158
+ syncScroll (ev.pane , window, selector, left, top);
159
+ }
154
160
}
155
161
}
156
162
for (const auto & listener : m_listeners)
@@ -468,6 +474,19 @@ class CWebDiffWindow : public IWebDiffWindow
468
474
Recompare (nullptr );
469
475
}
470
476
477
+ bool GetSyncEventFlag (EventType event) const
478
+ {
479
+ return (m_eventSyncFlags & event) != 0 ;
480
+ }
481
+
482
+ void SetSyncEventFlag (EventType event, bool flag)
483
+ {
484
+ if (flag)
485
+ m_eventSyncFlags = m_eventSyncFlags | static_cast <unsigned >(event);
486
+ else
487
+ m_eventSyncFlags = m_eventSyncFlags & ~static_cast <unsigned >(event);
488
+ }
489
+
471
490
int GetDiffCount () const override
472
491
{
473
492
return static_cast <int >(m_diffInfos.size ());
@@ -721,12 +740,12 @@ class CWebDiffWindow : public IWebDiffWindow
721
740
const wchar_t * script =
722
741
LR"(
723
742
(function() {
724
- window.wdw = { };
743
+ window.wdw = {};
725
744
wdw.syncScroll = function(win, selector, left, top) {
726
745
var el = document.querySelector(selector);
727
746
if (el && wdw.getWindowLocation() === win) {
728
- var sleft = ( el.scrollWidth - el.clientWidth) * left;
729
- var stop = ( el.scrollHeight - el.clientHeight) * top;
747
+ var sleft = Math.round(( el.scrollWidth - el.clientWidth) * left) ;
748
+ var stop = Math.round(( el.scrollHeight - el.clientHeight) * top) ;
730
749
clearTimeout(wdw.timeout);
731
750
wdw.timeout = setTimeout(function() {
732
751
el.scroll(sleft, stop);
@@ -844,19 +863,23 @@ LR"(
844
863
845
864
HRESULT syncClick (int srcPane, const std::wstring& selector)
846
865
{
847
- std::wstring script =
848
- L" if (!('wdw' in window)) { console.log('none'); window.wdw = {}; }"
849
- L" var el = document.querySelector('" + selector + L" ');"
850
- L" if (el) {"
851
- L" el.click();"
852
- L" setTimeout(function() {"
853
- L" }, 500);"
854
- L" }" ;
855
- for (int pane = 0 ; pane < m_nPanes; ++pane)
866
+ uint64_t now = GetTickCount64 ();
867
+ if (m_lastClickEvent.selector != selector || GetTickCount64 () - m_lastClickEvent.time > 200 )
856
868
{
857
- if (pane == srcPane)
858
- continue ;
859
- m_webWindow[pane].ExecuteScriptInAllFrames (script.c_str (), nullptr );
869
+ m_lastClickEvent.selector = selector;
870
+ m_lastClickEvent.time = now;
871
+ std::wstring script =
872
+ L" if (!('wdw' in window)) { console.log('none'); window.wdw = {}; }"
873
+ L" var el = document.querySelector('" + selector + L" ');"
874
+ L" if (el) {"
875
+ L" el.click();"
876
+ L" }" ;
877
+ for (int pane = 0 ; pane < m_nPanes; ++pane)
878
+ {
879
+ if (pane == srcPane)
880
+ continue ;
881
+ m_webWindow[pane].ExecuteScriptInAllFrames (script.c_str (), nullptr );
882
+ }
860
883
}
861
884
return S_OK;
862
885
}
@@ -1476,6 +1499,11 @@ LR"(
1476
1499
DiffOptions m_diffOptions{};
1477
1500
bool m_bShowDifferences = true ;
1478
1501
bool m_bShowWordDifferences = true ;
1502
+ unsigned m_eventSyncFlags = EVENT_SCROLL | EVENT_CLICK;
1503
+ struct LastClickEvent {
1504
+ std::wstring selector;
1505
+ uint64_t time;
1506
+ } m_lastClickEvent;
1479
1507
IWebDiffWindow::ColorSettings m_colorSettings = {
1480
1508
RGB (239 , 203 , 5 ), RGB (192 , 192 , 192 ), RGB (0 , 0 , 0 ),
1481
1509
RGB (239 , 119 , 116 ), RGB (240 , 192 , 192 ), RGB (0 , 0 , 0 ),
0 commit comments