Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(844)

Unified Diff: content/browser/renderer_host/input/web_input_event_builders_mac.mm

Issue 2461323002: Mac: Support Sierra's broken MouseWheel events. (Closed)
Patch Set: Horizontal is a trap - stay clear Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/events/cocoa/events_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/input/web_input_event_builders_mac.mm
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.mm b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
index 45c37416b0d02e754e0700ceaed613b8fbff8bc2..745c6d939fe9d4817ec5a47f749cdf1b6db12bbf 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
@@ -551,17 +551,35 @@ blink::WebMouseWheelEvent WebMouseWheelEventBuilder::Build(
// the point delta data instead, since we cannot distinguish trackpad data
// from data from any other continuous device.
- if (CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventIsContinuous)) {
- result.deltaX = CGEventGetIntegerValueField(
+ int64_t pointDeltaX = CGEventGetIntegerValueField(
cg_event, kCGScrollWheelEventPointDeltaAxis2);
- result.deltaY = CGEventGetIntegerValueField(
+ int64_t pointDeltaY = CGEventGetIntegerValueField(
cg_event, kCGScrollWheelEventPointDeltaAxis1);
- result.wheelTicksX = result.deltaX / ui::kScrollbarPixelsPerCocoaTick;
- result.wheelTicksY = result.deltaY / ui::kScrollbarPixelsPerCocoaTick;
+
+ if (CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventIsContinuous)) {
+ result.deltaX = pointDeltaX;
+ result.deltaY = pointDeltaY;
+ result.wheelTicksX = pointDeltaX / ui::kScrollbarPixelsPerCocoaTick;
+ result.wheelTicksY = pointDeltaY / ui::kScrollbarPixelsPerCocoaTick;
result.hasPreciseScrollingDeltas = true;
} else {
result.deltaX = [event deltaX] * ui::kScrollbarPixelsPerCocoaTick;
result.deltaY = [event deltaY] * ui::kScrollbarPixelsPerCocoaTick;
+
+ // A rounding bug on Sierra means that single-tick wheel scrolls may be
+ // truncated to zero. Prefer kCGScrollWheelEventPointDeltaAxisXY in those
+ // cases. However, kCGScrollWheelEventPointDeltaAxisXY has a "nasty bug"
+ // when holding Shift (see "Of Mice and Men", above). So only check vertical
+ // scrolls. Also, to be consistent with the values when truncation does NOT
+ // scroll, it needs to be multiplied by some factor. The documentation for
+ // CGEventSourceGetPixelsPerLine() says "By default, the scale is about ten
+ // pixels per line." However, the actual relationship is fuzzy because of
+ // acceleration. Using a constant of 10 for small values seems to "feel
+ // right" when this bug is encountered. See http://crbug.com/660773.
+ const float kPixelsPerLine = 10.0;
+ if (result.deltaY == 0 && pointDeltaY != 0)
+ result.deltaY = pointDeltaY * kPixelsPerLine;
+
result.wheelTicksY =
CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventDeltaAxis1);
result.wheelTicksX =
« no previous file with comments | « no previous file | ui/events/cocoa/events_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698