fix: touch events not recognized by WCO on windows (#35117)
This commit is contained in:
parent
0cdc946b27
commit
e3893632e7
4 changed files with 99 additions and 0 deletions
|
@ -114,3 +114,4 @@ fix_allow_guest_webcontents_to_enter_fullscreen.patch
|
||||||
disable_freezing_flags_after_init_in_node.patch
|
disable_freezing_flags_after_init_in_node.patch
|
||||||
short-circuit_permissions_checks_in_mediastreamdevicescontroller.patch
|
short-circuit_permissions_checks_in_mediastreamdevicescontroller.patch
|
||||||
chore_add_electron_deps_to_gitignores.patch
|
chore_add_electron_deps_to_gitignores.patch
|
||||||
|
chore_allow_chromium_to_handle_synthetic_mouse_events_for_touch.patch
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: deepak1556 <hop2deep@gmail.com>
|
||||||
|
Date: Fri, 29 Jul 2022 00:29:35 +0900
|
||||||
|
Subject: chore: allow chromium to handle synthetic mouse events for touch
|
||||||
|
|
||||||
|
With WCO, allow chromium to handle synthetic mouse events generated for touch
|
||||||
|
actions in the non-client caption area.
|
||||||
|
|
||||||
|
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
||||||
|
index f6b37bdec2343d45447b419aeadbe2aa19493c3c..bdbf7153f27376bd68459f9cb480bff7485c9e98 100644
|
||||||
|
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
||||||
|
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
||||||
|
@@ -1169,6 +1169,10 @@ void DesktopWindowTreeHostWin::HandleWindowScaleFactorChanged(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool DesktopWindowTreeHostWin::HandleMouseEventForCaption(UINT message) const {
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
DesktopNativeCursorManager*
|
||||||
|
DesktopWindowTreeHostWin::GetSingletonDesktopNativeCursorManager() {
|
||||||
|
return new DesktopNativeCursorManagerWin();
|
||||||
|
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
||||||
|
index 0aae49ec83b88057434af5bbfb54b10e53469918..058e5dc978e76a71fa02dc9e275592f3c39befea 100644
|
||||||
|
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
||||||
|
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
||||||
|
@@ -263,6 +263,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
|
||||||
|
void HandleWindowSizeChanging() override;
|
||||||
|
void HandleWindowSizeUnchanged() override;
|
||||||
|
void HandleWindowScaleFactorChanged(float window_scale_factor) override;
|
||||||
|
+ bool HandleMouseEventForCaption(UINT message) const override;
|
||||||
|
|
||||||
|
Widget* GetWidget();
|
||||||
|
const Widget* GetWidget() const;
|
||||||
|
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
|
||||||
|
index 3b546cf67089e6677fc668b4d1d6c0863282dff5..c6810f162806b36494885b2f63982a756d4dcd38 100644
|
||||||
|
--- a/ui/views/win/hwnd_message_handler.cc
|
||||||
|
+++ b/ui/views/win/hwnd_message_handler.cc
|
||||||
|
@@ -3129,15 +3129,19 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
|
||||||
|
SetMsgHandled(FALSE);
|
||||||
|
// We must let Windows handle the caption buttons if it's drawing them, or
|
||||||
|
// they won't work.
|
||||||
|
+ bool simulate_mouse_event_for_caption = false;
|
||||||
|
if (delegate_->GetFrameMode() == FrameMode::SYSTEM_DRAWN &&
|
||||||
|
(hittest == HTCLOSE || hittest == HTMINBUTTON ||
|
||||||
|
hittest == HTMAXBUTTON)) {
|
||||||
|
- SetMsgHandled(FALSE);
|
||||||
|
+ simulate_mouse_event_for_caption =
|
||||||
|
+ delegate_->HandleMouseEventForCaption(message);
|
||||||
|
+ if (!simulate_mouse_event_for_caption)
|
||||||
|
+ SetMsgHandled(FALSE);
|
||||||
|
}
|
||||||
|
// Let resize events fall through. Ignore everything else, as we're either
|
||||||
|
// letting Windows handle it above or we've already handled the equivalent
|
||||||
|
// touch message.
|
||||||
|
- if (!IsHitTestOnResizeHandle(hittest))
|
||||||
|
+ if (!IsHitTestOnResizeHandle(hittest) && !simulate_mouse_event_for_caption)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/ui/views/win/hwnd_message_handler_delegate.h b/ui/views/win/hwnd_message_handler_delegate.h
|
||||||
|
index 5dbb192d0840ca0ded61397c399b774a8cb05cce..098a9c3140e9e140fdc8f0dc9cf4e8ec84451221 100644
|
||||||
|
--- a/ui/views/win/hwnd_message_handler_delegate.h
|
||||||
|
+++ b/ui/views/win/hwnd_message_handler_delegate.h
|
||||||
|
@@ -258,6 +258,10 @@ class VIEWS_EXPORT HWNDMessageHandlerDelegate {
|
||||||
|
// Called when the window scale factor has changed.
|
||||||
|
virtual void HandleWindowScaleFactorChanged(float window_scale_factor) = 0;
|
||||||
|
|
||||||
|
+ // Called when synthetic mouse event is generated for touch event on
|
||||||
|
+ // caption buttons.
|
||||||
|
+ virtual bool HandleMouseEventForCaption(UINT message) const = 0;
|
||||||
|
+
|
||||||
|
protected:
|
||||||
|
virtual ~HWNDMessageHandlerDelegate() = default;
|
||||||
|
};
|
|
@ -95,6 +95,27 @@ bool ElectronDesktopWindowTreeHostWin::GetClientAreaInsets(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ElectronDesktopWindowTreeHostWin::HandleMouseEventForCaption(
|
||||||
|
UINT message) const {
|
||||||
|
// Windows does not seem to generate WM_NCPOINTERDOWN/UP touch events for
|
||||||
|
// caption buttons with WCO. This results in a no-op for
|
||||||
|
// HWNDMessageHandler::HandlePointerEventTypeTouchOrNonClient and
|
||||||
|
// WM_SYSCOMMAND is not generated for the touch action. However, Windows will
|
||||||
|
// also generate a mouse event for every touch action and this gets handled in
|
||||||
|
// HWNDMessageHandler::HandleMouseEventInternal.
|
||||||
|
// With https://chromium-review.googlesource.com/c/chromium/src/+/1048877/
|
||||||
|
// Chromium lets the OS handle caption buttons for FrameMode::SYSTEM_DRAWN but
|
||||||
|
// again this does not generate the SC_MINIMIZE, SC_MAXIMIZE, SC_RESTORE
|
||||||
|
// commands when Non-client mouse events are generated for HTCLOSE,
|
||||||
|
// HTMINBUTTON, HTMAXBUTTON. To workaround this issue, wit this delegate we
|
||||||
|
// let chromium handle the mouse events via
|
||||||
|
// HWNDMessageHandler::HandleMouseInputForCaption instead of the OS and this
|
||||||
|
// will generate the necessary system commands to perform caption button
|
||||||
|
// actions due to the DefWindowProc call.
|
||||||
|
// https://source.chromium.org/chromium/chromium/src/+/main:ui/views/win/hwnd_message_handler.cc;l=3611
|
||||||
|
return native_window_view_->IsWindowControlsOverlayEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
void ElectronDesktopWindowTreeHostWin::OnNativeThemeUpdated(
|
void ElectronDesktopWindowTreeHostWin::OnNativeThemeUpdated(
|
||||||
ui::NativeTheme* observed_theme) {
|
ui::NativeTheme* observed_theme) {
|
||||||
win::SetDarkModeForWindow(GetAcceleratedWidget());
|
win::SetDarkModeForWindow(GetAcceleratedWidget());
|
||||||
|
|
|
@ -36,6 +36,7 @@ class ElectronDesktopWindowTreeHostWin : public views::DesktopWindowTreeHostWin,
|
||||||
bool GetDwmFrameInsetsInPixels(gfx::Insets* insets) const override;
|
bool GetDwmFrameInsetsInPixels(gfx::Insets* insets) const override;
|
||||||
bool GetClientAreaInsets(gfx::Insets* insets,
|
bool GetClientAreaInsets(gfx::Insets* insets,
|
||||||
HMONITOR monitor) const override;
|
HMONITOR monitor) const override;
|
||||||
|
bool HandleMouseEventForCaption(UINT message) const override;
|
||||||
|
|
||||||
// ui::NativeThemeObserver:
|
// ui::NativeThemeObserver:
|
||||||
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
|
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
|
||||||
|
|
Loading…
Reference in a new issue