mirror of https://github.com/electron/electron
58 lines
3.1 KiB
Diff
58 lines
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: clavin <cwatford@slack-corp.com>
|
|
Date: Fri, 11 Feb 2022 15:05:42 -0700
|
|
Subject: fix: non-client mouse tracking and message bubbling on windows
|
|
|
|
It is not known why, but for some reason calling |DefWindowProc| on the parent
|
|
window handle causes a WM_NCMOUSELEAVE (non-client mouse exit) message to be
|
|
sent to the parent window, even though |TrackMouseEvent| is never called on it.
|
|
|
|
This patch also adds some boilerplate for properly tracking non-client mouse
|
|
messages in the legacy window handle layer.
|
|
|
|
These conditions are regularly hit with WCO-enabled windows on Windows.
|
|
|
|
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
|
|
index 697fd7e1fc7e99e2d97376c905cc1cd8befed171..ac6fa9b0449da831152451e69b8659a798c2a917 100644
|
|
--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
|
|
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
|
|
@@ -321,12 +321,12 @@ LRESULT LegacyRenderWidgetHostHWND::OnMouseRange(UINT message,
|
|
WPARAM w_param,
|
|
LPARAM l_param,
|
|
BOOL& handled) {
|
|
- if (message == WM_MOUSEMOVE) {
|
|
+ if (message == WM_MOUSEMOVE || message == WM_NCMOUSEMOVE) {
|
|
if (!mouse_tracking_enabled_) {
|
|
mouse_tracking_enabled_ = true;
|
|
TRACKMOUSEEVENT tme;
|
|
tme.cbSize = sizeof(tme);
|
|
- tme.dwFlags = TME_LEAVE;
|
|
+ tme.dwFlags = message == WM_NCMOUSEMOVE ? TME_NONCLIENT | TME_LEAVE : TME_LEAVE;
|
|
tme.hwndTrack = hwnd();
|
|
tme.dwHoverTime = 0;
|
|
TrackMouseEvent(&tme);
|
|
@@ -357,7 +357,10 @@ LRESULT LegacyRenderWidgetHostHWND::OnMouseRange(UINT message,
|
|
// out of the picture.
|
|
if (!handled &&
|
|
(message >= WM_NCMOUSEMOVE && message <= WM_NCXBUTTONDBLCLK)) {
|
|
- ret = ::DefWindowProc(GetParent(), message, w_param, l_param);
|
|
+ // Send WM_NCMOUSEMOVE messages using the LegacyRenderWidgetHostHWND's
|
|
+ // handle so mouse tracking on non-client areas doesn't break.
|
|
+ HWND target = message == WM_NCMOUSEMOVE ? hwnd() : GetParent();
|
|
+ ret = ::DefWindowProc(target, message, w_param, l_param);
|
|
handled = TRUE;
|
|
}
|
|
}
|
|
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.h b/content/browser/renderer_host/legacy_render_widget_host_win.h
|
|
index aad10a91356b8b13e15fac0488d25187af23ce36..f9a3db0c54831ad0a1c9946a98a6d7154776ae51 100644
|
|
--- a/content/browser/renderer_host/legacy_render_widget_host_win.h
|
|
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.h
|
|
@@ -103,6 +103,7 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND
|
|
MESSAGE_HANDLER_EX(WM_VSCROLL, OnScroll)
|
|
MESSAGE_HANDLER_EX(WM_NCHITTEST, OnNCHitTest)
|
|
MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCXBUTTONDBLCLK, OnMouseRange)
|
|
+ MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseLeave)
|
|
MESSAGE_HANDLER_EX(WM_NCCALCSIZE, OnNCCalcSize)
|
|
MESSAGE_HANDLER_EX(WM_SIZE, OnSize)
|
|
MESSAGE_HANDLER_EX(WM_DESTROY, OnDestroy)
|