Hack to fix scrolling

Essentially doing a setTimeout() to prevent feedback loops. This
seems to work fine on Firefox, and has less side effect on Chrome
than the previous hack.

Change-Id: I2a8d7b910edbbd757479d7b0917c42f0c2155246
This commit is contained in:
Michael Zhou
2013-07-17 10:14:42 -07:00
parent a48e3d79c4
commit 72ec0a4f08
3 changed files with 16 additions and 22 deletions

View File

@@ -39,6 +39,7 @@ import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString; import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.dom.client.Style.Unit;
@@ -77,7 +78,7 @@ public class SideBySide2 extends Screen {
interface Binder extends UiBinder<HTMLPanel, SideBySide2> {} interface Binder extends UiBinder<HTMLPanel, SideBySide2> {}
private static Binder uiBinder = GWT.create(Binder.class); private static Binder uiBinder = GWT.create(Binder.class);
private static final int HEADER_FOOTER = 60 + 15 * 2 + 38 + 26 * 2; private static final int HEADER_FOOTER = 60 + 15 * 2 + 16 + 26 * 2;
private static final JsArrayString EMPTY = private static final JsArrayString EMPTY =
JavaScriptObject.createArray().cast(); JavaScriptObject.createArray().cast();
@@ -705,18 +706,19 @@ public class SideBySide2 extends Screen {
final CodeMirror other = otherCm(cm); final CodeMirror other = otherCm(cm);
return new Runnable() { return new Runnable() {
public void run() { public void run() {
/** // Hack to prevent feedback loop, Chrome seems fine but Firefox chokes.
* Prevent feedback loop, Chrome seems fine but Firefox chokes. if (cm.isScrollSetByOther()) {
* However on Chrome this may cause scrolling to be out of sync
* if scrolled too fast.
*/
double now = (double) System.currentTimeMillis();
if (cm.getScrollSetBy() == other && cm.getScrollSetAt() + 30 > now) {
return; return;
} }
other.scrollToY(cm.getScrollInfo().getTop()); other.scrollToY(cm.getScrollInfo().getTop());
other.setScrollSetBy(cm); other.setScrollSetByOther(true);
other.setScrollSetAt(now); Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
other.setScrollSetByOther(false);
return false;
}
}, 0);
} }
}; };
} }

View File

@@ -140,20 +140,12 @@ public class CodeMirror extends JavaScriptObject {
return this.getScrollInfo(); return this.getScrollInfo();
}-*/; }-*/;
public final native CodeMirror getScrollSetBy() /*-{ public final native boolean isScrollSetByOther() /*-{
return this.state.scrollSetBy; return this.state.scrollSetByOther == true;
}-*/; }-*/;
public final native void setScrollSetBy(CodeMirror cm) /*-{ public final native void setScrollSetByOther(boolean setByOther) /*-{
this.state.scrollSetBy = cm; this.state.scrollSetByOther = setByOther;
}-*/;
public final native double getScrollSetAt() /*-{
return this.state.scrollSetAt;
}-*/;
public final native void setScrollSetAt(double when) /*-{
this.state.scrollSetAt = when;
}-*/; }-*/;
public final native void on(String event, Runnable thunk) /*-{ public final native void on(String event, Runnable thunk) /*-{