diff --git a/lib/OpenLayers/Handler/MouseWheel.js b/lib/OpenLayers/Handler/MouseWheel.js index 7cfc40cfce..c21459a6cb 100644 --- a/lib/OpenLayers/Handler/MouseWheel.js +++ b/lib/OpenLayers/Handler/MouseWheel.js @@ -55,12 +55,19 @@ OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, { */ cumulative: true, + /** + * APIProperty: isAnalogScrollWheel + * {Boolean} Will switch to true when an event with analog scroll value + * is detected. + */ + isAnalogScrollWheel: false, + /** * Property: analogWheelPrecision * {Integer} Adjust to get analog scroll wheel to feel right */ analogWheelPrecision: 360, - + /** * Constructor: OpenLayers.Handler.MouseWheel * @@ -175,16 +182,24 @@ OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, { if (!e) { e = window.event; } + if (e.wheelDelta) { delta = e.wheelDelta; - if (delta % 120 === 0) { - delta = delta / 120; - } else { - delta = delta / this.analogWheelPrecision; - } - if (window.opera && window.opera.version() < 9.2) { + + if (OpenLayers.BROWSER_NAME === "safari" && !this.isAnalogScrollWheel) { + delta = delta * 10; + } else if (window.opera && window.opera.version() < 9.2) { delta = -delta; } + + this.isAnalogScrollWheel = (this.isAnalogScrollWheel || + delta % 40 !== 0 || Math.abs(delta) < 120); + + if (this.isAnalogScrollWheel) { + delta = delta / this.analogWheelPrecision; + } else { + delta = Math.round(delta / 120); + } } else if (e.detail) { delta = -e.detail / 3; } diff --git a/tests/Handler/MouseWheel.html b/tests/Handler/MouseWheel.html index d41c2cd18c..251a879e9c 100644 --- a/tests/Handler/MouseWheel.html +++ b/tests/Handler/MouseWheel.html @@ -108,7 +108,8 @@ var activated = handler.activate(); var delta = 120; - if (window.opera && window.opera.version() < 9.2) delta = -delta; + if (window.opera && window.opera.version() < 9.2) { delta = -delta; } + if (OpenLayers.BROWSER_NAME === "safari") delta = delta / 10; handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta}); handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta}); t.delay_call(1, function() {