Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add processing of mouse movements in Edge browser #1551

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ public WebViewEnvironment(ICoreWebView2Environment environment) {
private boolean ignoreFocus;
private String lastCustomText;

private static record CursorPosition(Point location, boolean isInsideBrowser) {};
private CursorPosition previousCursorPosition = new CursorPosition(new Point(0, 0), false);

static {
NativeClearSessions = () -> {
ICoreWebView2CookieManager manager = getCookieManager();
Expand Down Expand Up @@ -654,6 +657,7 @@ void setupBrowser(int hr, long pv) {
browser.addListener(SWT.FocusIn, this::browserFocusIn);
browser.addListener(SWT.Resize, this::browserResize);
browser.addListener(SWT.Move, this::browserMove);
scheduleMouseMovementHandling();

containingEnvironment.instances().add(this);
// Sometimes when the shell of the browser is opened before the browser is
Expand Down Expand Up @@ -709,6 +713,52 @@ void browserResize(Event event) {
controller.put_IsVisible(true);
}

private void scheduleMouseMovementHandling() {
browser.getDisplay().timerExec(100, () -> {
if (browser.isDisposed()) {
return;
}
if (browser.isVisible() && hasDisplayFocus()) {
handleMouseMovement();
}
scheduleMouseMovementHandling();
});
}

private void handleMouseMovement() {
final Point currentCursorLocation = browser.getDisplay().getCursorLocation();
Point cursorLocationInControlCoordinate = browser.toControl(currentCursorLocation);
boolean isCursorInsideBrowser = browser.getBounds().contains(cursorLocationInControlCoordinate);
boolean hasCursorLocationChanged = !currentCursorLocation.equals(previousCursorPosition.location);

boolean mousePassedBrowserBorder = previousCursorPosition.isInsideBrowser != isCursorInsideBrowser;
boolean mouseMovedInsideBrowser = isCursorInsideBrowser && hasCursorLocationChanged;
if (mousePassedBrowserBorder) {
if (isCursorInsideBrowser) {
sendMouseEvent(cursorLocationInControlCoordinate, SWT.MouseEnter);
} else {
sendMouseEvent(cursorLocationInControlCoordinate, SWT.MouseExit);
}
} else if (mouseMovedInsideBrowser) {
sendMouseEvent(cursorLocationInControlCoordinate, SWT.MouseMove);
}
previousCursorPosition = new CursorPosition(currentCursorLocation, isCursorInsideBrowser);
}

private void sendMouseEvent(Point cursorLocationInControlCoordinate, int mouseEvent) {
Event newEvent = new Event();
newEvent.widget = browser;
Point position = cursorLocationInControlCoordinate;
newEvent.x = position.x;
newEvent.y = position.y;
newEvent.type = mouseEvent;
browser.notifyListeners(newEvent.type, newEvent);
}

private boolean hasDisplayFocus() {
return browser.getDisplay().getFocusControl() != null;
}

@Override
public Object evaluate(String script) throws SWTException {
// Feature in WebView2. ExecuteScript works regardless of IsScriptEnabled setting.
Expand Down
Loading