diff --git a/patches/chromium/.patches b/patches/chromium/.patches index 3f3059a943081..94aa91c1c6abb 100644 --- a/patches/chromium/.patches +++ b/patches/chromium/.patches @@ -114,3 +114,4 @@ posix_replace_doubleforkandexec_with_forkandspawn.patch fix_allow_guest_webcontents_to_enter_fullscreen.patch disable_freezing_flags_after_init_in_node.patch chore_add_electron_deps_to_gitignores.patch +chore_allow_chromium_to_handle_synthetic_mouse_events_for_touch.patch diff --git a/patches/chromium/chore_allow_chromium_to_handle_synthetic_mouse_events_for_touch.patch b/patches/chromium/chore_allow_chromium_to_handle_synthetic_mouse_events_for_touch.patch new file mode 100644 index 0000000000000..65c048c9cc68f --- /dev/null +++ b/patches/chromium/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 +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 7c7952755317a8069becfff58ca5ec89e2266ce4..6496933a9c84c337b6ba25276badf7728eeabdfb 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; + }; diff --git a/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc b/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc index d978ce64f59a6..43d053d9c6bb5 100644 --- a/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc +++ b/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc @@ -95,6 +95,27 @@ bool ElectronDesktopWindowTreeHostWin::GetClientAreaInsets( 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( ui::NativeTheme* observed_theme) { win::SetDarkModeForWindow(GetAcceleratedWidget()); diff --git a/shell/browser/ui/win/electron_desktop_window_tree_host_win.h b/shell/browser/ui/win/electron_desktop_window_tree_host_win.h index 1b53f6f8e5313..2f63f34f63b63 100644 --- a/shell/browser/ui/win/electron_desktop_window_tree_host_win.h +++ b/shell/browser/ui/win/electron_desktop_window_tree_host_win.h @@ -36,6 +36,7 @@ class ElectronDesktopWindowTreeHostWin : public views::DesktopWindowTreeHostWin, bool GetDwmFrameInsetsInPixels(gfx::Insets* insets) const override; bool GetClientAreaInsets(gfx::Insets* insets, HMONITOR monitor) const override; + bool HandleMouseEventForCaption(UINT message) const override; // ui::NativeThemeObserver: void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;