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

fix: touch events not recognized by WCO on windows #35176

Merged
merged 3 commits into from Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions patches/chromium/.patches
Expand Up @@ -122,3 +122,4 @@ posix_replace_doubleforkandexec_with_forkandspawn.patch
cherry-pick-22c61cfae5d1.patch
remove_default_window_title.patch
keep_handling_scroll_update_if_you_can.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 9fd052c00a484cd1acd2031fda79e6307fd01b60..016dfe880a48168154c08839afa540880c2d52be 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 444581249014a8ce301591f269dbb194f0520732..9377f26b081b717db6b50c13ce3795907cf2fcd2 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
@@ -262,6 +262,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 01ff95be00b3911749f66a136b2b5a6c02156bd3..23e8794c0551c377269ebecd6684206fc7087553 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -3064,15 +3064,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;
};
21 changes: 21 additions & 0 deletions shell/browser/ui/win/electron_desktop_window_tree_host_win.cc
Expand Up @@ -99,4 +99,25 @@ 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();
}

} // namespace electron
Expand Up @@ -36,6 +36,7 @@ class ElectronDesktopWindowTreeHostWin
bool GetDwmFrameInsetsInPixels(gfx::Insets* insets) const override;
bool GetClientAreaInsets(gfx::Insets* insets,
HMONITOR monitor) const override;
bool HandleMouseEventForCaption(UINT message) const override;

private:
NativeWindowViews* native_window_view_; // weak ref
Expand Down