Skip to content

Commit

Permalink
Add processing of mouse movements in Edge browser
Browse files Browse the repository at this point in the history
This contribution captures mouse movements in the edge browser and sends
according mouse move, enter and exit events to its listener.

contributes to
#1540
  • Loading branch information
amartya4256 authored and HeikoKlare committed Oct 29, 2024
1 parent 435fe7e commit 77a5a81
Showing 1 changed file with 50 additions and 0 deletions.
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

0 comments on commit 77a5a81

Please sign in to comment.