WebCore:
authorantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2007 08:03:58 +0000 (08:03 +0000)
committerantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2007 08:03:58 +0000 (08:03 +0000)
        Reviewed by Darin.

        On Mac, support fine grained wheel events generated by trackpad and Mighty Mouse.
        http://bugs.webkit.org/show_bug.cgi?id=13134
        <rdar://problem/5076249?

        * WebCore.exp:
            Export _wkGetWheelEventDeltas
        * page/EventHandler.cpp:
        (WebCore::EventHandler::handleWheelEvent):
            Remove (0, 0) scroll event hack, it is not needed anymore.
            Do per-pixel scrolling for fine grained events.
        * platform/PlatformWheelEvent.h:
        (WebCore::PlatformWheelEvent::isContinuous):
            Add new m_isContinuous boolean to indicate fine grained wheel events.
        * platform/ScrollBar.cpp:
        (WebCore::Scrollbar::Scrollbar):
        (WebCore::Scrollbar::setValue):
        (WebCore::Scrollbar::setSteps):
        (WebCore::Scrollbar::scroll):
        * platform/ScrollBar.h:
        (WebCore::Scrollbar::value):
            Use float to represent current position to support finer grained scrolling.
            Add ScrollByPixel, remove ScrollByWheel (which was same as ScrollByLine anyway)
        * platform/ScrollTypes.h:
        (WebCore::):
        * platform/gdk/WheelEventGdk.cpp:
        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
            Initalize m_isContinuous
        * platform/mac/WebCoreSystemInterface.h:
        * platform/mac/WebCoreSystemInterface.mm:
            Add wkGetWheelEventDeltas for getting fine grained wheel events
        * platform/mac/WheelEventMac.mm:
        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
            Get the wheel deltas using new wkGetWheelEventDeltas interface
        * platform/qt/WheelEventQt.cpp:
        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
            Initalize m_isContinuous
        * rendering/RenderListBox.cpp:
        (WebCore::RenderListBox::calcHeight):
            Pass item height to scrollbar

WebKit:

        Reviewed by Darin.

        On Mac, support fine grained wheel events generated by trackpad and Mighty Mouse.
        http://bugs.webkit.org/show_bug.cgi?id=13134
        <rdar://problem/5076249?

        * WebCoreSupport/WebSystemInterface.m:
        (InitWebCoreSystemInterface): Expose GetWheelEventDeltas()

WebKitLibraries:

        Reviewed by Darin.

        Added wkGetWheelEventDeltas

        * WebKitSystemInterface.h:
        * libWebKitSystemInterface.a:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@20506 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
WebCore/ChangeLog
WebCore/WebCore.exp
WebCore/page/EventHandler.cpp
WebCore/platform/PlatformWheelEvent.h
WebCore/platform/ScrollBar.cpp
WebCore/platform/ScrollBar.h
WebCore/platform/ScrollTypes.h
WebCore/platform/gdk/WheelEventGdk.cpp
WebCore/platform/mac/WebCoreSystemInterface.h
WebCore/platform/mac/WebCoreSystemInterface.mm
WebCore/platform/mac/WheelEventMac.mm
WebCore/platform/qt/WheelEventQt.cpp
WebCore/rendering/RenderListBox.cpp
WebKit/ChangeLog
WebKit/WebCoreSupport/WebSystemInterface.m
WebKitLibraries/ChangeLog
WebKitLibraries/WebKitSystemInterface.h
WebKitLibraries/libWebKitSystemInterface.a

index 10922db12630defd2a480198993025f5f4d7f77a..004b11b849a6497860408776bf0b0bc5ecf6b5c9 100644 (file)
@@ -1,3 +1,47 @@
+2007-03-26  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Darin.
+        
+        On Mac, support fine grained wheel events generated by trackpad and Mighty Mouse.
+        http://bugs.webkit.org/show_bug.cgi?id=13134
+        <rdar://problem/5076249?
+
+        * WebCore.exp:
+            Export _wkGetWheelEventDeltas
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleWheelEvent):
+            Remove (0, 0) scroll event hack, it is not needed anymore.
+            Do per-pixel scrolling for fine grained events.
+        * platform/PlatformWheelEvent.h:
+        (WebCore::PlatformWheelEvent::isContinuous):
+            Add new m_isContinuous boolean to indicate fine grained wheel events.
+        * platform/ScrollBar.cpp:
+        (WebCore::Scrollbar::Scrollbar):
+        (WebCore::Scrollbar::setValue):
+        (WebCore::Scrollbar::setSteps):
+        (WebCore::Scrollbar::scroll):
+        * platform/ScrollBar.h:
+        (WebCore::Scrollbar::value):
+            Use float to represent current position to support finer grained scrolling.
+            Add ScrollByPixel, remove ScrollByWheel (which was same as ScrollByLine anyway)
+        * platform/ScrollTypes.h:
+        (WebCore::):
+        * platform/gdk/WheelEventGdk.cpp:
+        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
+            Initalize m_isContinuous
+        * platform/mac/WebCoreSystemInterface.h:
+        * platform/mac/WebCoreSystemInterface.mm:
+            Add wkGetWheelEventDeltas for getting fine grained wheel events
+        * platform/mac/WheelEventMac.mm:
+        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
+            Get the wheel deltas using new wkGetWheelEventDeltas interface
+        * platform/qt/WheelEventQt.cpp:
+        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
+            Initalize m_isContinuous
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::calcHeight):
+            Pass item height to scrollbar
+
 2007-03-26  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Darin Adler.
index bc2dd37e03c612f6fb481f168e5fbc4999e7a9e6..a661d5c5575e72f5708c15015f752f226055ce64 100644 (file)
@@ -662,6 +662,7 @@ _wkGetNSURLResponseCalculatedExpiration
 _wkGetNSURLResponseLastModifiedDate
 _wkGetNSURLResponseMustRevalidate
 _wkGetPreferredExtensionForMIMEType
+_wkGetWheelEventDeltas
 _wkInitializeGlyphVector
 _wkNSURLProtocolClassForReqest
 _wkPathFromFont
index 8f275b28881501ecbb5dd74644a2939e9a4e5528..2415f5c17866281f3f56120512ba5df8a853e76e 100644 (file)
@@ -1172,19 +1172,12 @@ bool EventHandler::handleWheelEvent(PlatformWheelEvent& e)
             return true;
             
         if (node->renderer()) {
-#if PLATFORM(MAC)
-            if (!e.deltaX() && !e.deltaY() && node->renderer()->isScrollable())
-                // smooth scroll events on mac may have (0,0) deltas
-                // they need to be eaten until we start supporting them
-                e.accept();
-#endif
-        
             // Just break up into two scrolls if we need to.  Diagonal movement on 
             // a MacBook pro is an example of a 2-dimensional mouse wheel event (where both deltaX and deltaY can be set).
-            if (e.deltaX() && node->renderer()->scroll(e.deltaX() < 0 ? ScrollRight : ScrollLeft, ScrollByWheel,
+            if (e.deltaX() && node->renderer()->scroll(e.deltaX() < 0 ? ScrollRight : ScrollLeft, e.isContinuous() ? ScrollByPixel : ScrollByLine,
                                                        e.deltaX() < 0 ? -e.deltaX() : e.deltaX()))
                 e.accept();
-            if (e.deltaY() && node->renderer()->scroll(e.deltaY() < 0 ? ScrollDown : ScrollUp, ScrollByWheel,
+            if (e.deltaY() && node->renderer()->scroll(e.deltaY() < 0 ? ScrollDown : ScrollUp, e.isContinuous() ? ScrollByPixel : ScrollByLine,
                                                        e.deltaY() < 0 ? -e.deltaY() : e.deltaY()))
                 e.accept();
         }
index 39120ad5e36721530fc5a4f2e3674b77657fe935..5896fc2d44ee57d959c455a6251f71d960aa33f9 100644 (file)
@@ -73,6 +73,8 @@ namespace WebCore {
 
         void accept() { m_isAccepted = true; }
         void ignore() { m_isAccepted = false; }
+        
+        bool isContinuous() const { return m_isContinuous; }
 
 #if PLATFORM(MAC)
         PlatformWheelEvent(NSEvent*);
@@ -97,6 +99,7 @@ namespace WebCore {
         bool m_ctrlKey;
         bool m_altKey;
         bool m_metaKey;
+        bool m_isContinuous;
     };
 
 } // namespace WebCore
index f75b19e8345f62b409aab379fdb457d4dbc63b17..fe04e964602b4576ce887dcef1902f46c1e705d8 100644 (file)
@@ -37,6 +37,7 @@ Scrollbar::Scrollbar(ScrollbarClient* client, ScrollbarOrientation orientation,
     , m_currentPos(0)
     , m_lineStep(0)
     , m_pageStep(0)
+    , m_pixelStep(1)
 {
 }
 
@@ -47,7 +48,7 @@ bool Scrollbar::setValue(int v)
         v = maxPos;
     if (v < 0)
         v = 0;
-    if (m_currentPos == v)
+    if (value() == v)
         return false; // Our value stayed the same.
     m_currentPos = v;
 
@@ -70,38 +71,47 @@ void Scrollbar::setProportion(int visibleSize, int totalSize)
     updateThumbProportion();
 }
 
-void Scrollbar::setSteps(int lineStep, int pageStep)
+void Scrollbar::setSteps(int lineStep, int pageStep, int pixelsPerStep)
 {
     m_lineStep = lineStep;
     m_pageStep = pageStep;
+    m_pixelStep = 1.0f / pixelsPerStep;
 }
 
 bool Scrollbar::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
 {
-    float delta = 0.0;
-    if ((direction == ScrollUp && m_orientation == VerticalScrollbar) || (direction == ScrollLeft && m_orientation == HorizontalScrollbar)) {
-        if (granularity == ScrollByLine) {
-            delta = -m_lineStep;
-        } else if (granularity == ScrollByPage) {
-            delta = -m_pageStep;
-        } else if (granularity == ScrollByDocument) {
-            delta = -m_currentPos;
-        } else if (granularity == ScrollByWheel) {
-            delta = -m_lineStep;
-        }
-    } else if ((direction == ScrollDown && m_orientation == VerticalScrollbar) || (direction == ScrollRight && m_orientation == HorizontalScrollbar)) {
-        if (granularity == ScrollByLine) {
-            delta = m_lineStep;
-        } else if (granularity == ScrollByPage) {
-            delta = m_pageStep;
-        } else if (granularity == ScrollByDocument) {
-            delta = m_totalSize - m_visibleSize - m_currentPos;
-        } else if (granularity == ScrollByWheel) {
-            delta = m_lineStep;
-        }
-    }
-    int newPos = (int)(m_currentPos + (delta * multiplier));
-    return setValue(newPos);
+    float step = 0;
+    if ((direction == ScrollUp && m_orientation == VerticalScrollbar) || (direction == ScrollLeft && m_orientation == HorizontalScrollbar))
+        step = -1;
+    else if ((direction == ScrollDown && m_orientation == VerticalScrollbar) || (direction == ScrollRight && m_orientation == HorizontalScrollbar)) 
+        step = 1;
+    
+    if (granularity == ScrollByLine)
+        step *= m_lineStep;
+    else if (granularity == ScrollByPage)
+        step *= m_pageStep;
+    else if (granularity == ScrollByDocument)
+        step *= m_totalSize;
+    else if (granularity == ScrollByPixel)
+        step *= m_pixelStep;
+        
+    float newPos = m_currentPos + step * multiplier;
+    float maxPos = m_totalSize - m_visibleSize;
+    if (newPos < 0)
+        newPos = 0;
+    if (newPos > maxPos)
+        newPos = maxPos;
+    if (newPos == m_currentPos)
+        return false;
+    
+    int oldValue = value();
+    m_currentPos = newPos;
+    updateThumbPosition();
+    
+    if (value() != oldValue && client())
+        client()->valueChanged(this);
+    
+    // return true even if the integer value did not change so that scroll event gets eaten
+    return true;
 }
-
 }
index 7ca391eb45026174418f57b28acf66bf6cab5d2e..aed336049a6cde6e0095a1aba499947a1120fed9 100644 (file)
@@ -61,11 +61,11 @@ public:
     virtual bool isWidget() const = 0;
 
     ScrollbarOrientation orientation() const { return m_orientation; }
-    int value() const { return m_currentPos; } 
+    int value() const { return lroundf(m_currentPos); } 
     
     ScrollbarControlSize controlSize() const { return m_controlSize; }
 
-    void setSteps(int lineStep, int pageStep);
+    void setSteps(int lineStep, int pageStep, int pixelsPerStep = 1);
     
     bool setValue(int);
     void setProportion(int visibleSize, int totalSize);
@@ -102,9 +102,10 @@ protected:
     ScrollbarControlSize m_controlSize;
     int m_visibleSize;
     int m_totalSize;
-    int m_currentPos;
+    float m_currentPos;
     int m_lineStep;
     int m_pageStep;
+    float m_pixelStep;
 };
 
 }
index 7115c321d91a48068bde4c11ae7da075e35dba42..be48fa66c01ec5b41365f93c1866eb8dd1b0fea4 100644 (file)
@@ -39,7 +39,7 @@ namespace WebCore {
         ScrollByLine,
         ScrollByPage,
         ScrollByDocument,
-        ScrollByWheel
+        ScrollByPixel
     };
 
     enum ScrollbarOrientation { HorizontalScrollbar, VerticalScrollbar };
index e14732c1ee1c8bfb04e3c67260dd2e02c63e8568..cc3331697474ff59f563006a30a17b32756698e3 100644 (file)
@@ -53,6 +53,7 @@ PlatformWheelEvent::PlatformWheelEvent(GdkEvent* event)
     m_ctrlKey = event->button.state & GDK_CONTROL_MASK;
     m_altKey = event->button.state & GDK_MOD1_MASK;
     m_metaKey = event->button.state & GDK_MOD2_MASK;
+    m_isContinuous = false;
 }
 
 }
index b732d024acc94654dbb690a3b365c0b4841943aa..8479c93cd2f356877e4de1db7469830e24eae965 100644 (file)
@@ -40,12 +40,14 @@ typedef struct _NSRect NSRect;
 #endif
 
 #ifdef __OBJC__
+@class NSEvent;
 @class NSFont;
 @class NSMutableURLRequest;
 @class NSURLRequest;
 #else
 typedef struct NSArray NSArray;
 typedef struct NSDate NSDate;
+typedef struct NSEvent NSEvent;
 typedef struct NSFont NSFont;
 typedef struct NSImage NSImage;
 typedef struct NSMenu NSMenu;
@@ -104,6 +106,7 @@ extern ATSUFontID (*wkGetNSFontATSUFontId)(NSFont*);
 extern double (*wkGetNSURLResponseCalculatedExpiration)(NSURLResponse *response);
 extern NSDate *(*wkGetNSURLResponseLastModifiedDate)(NSURLResponse *response);
 extern BOOL (*wkGetNSURLResponseMustRevalidate)(NSURLResponse *response);
+extern void (*wkGetWheelEventDeltas)(NSEvent*, float* deltaX, float* deltaY, BOOL* continuous);
 extern OSStatus (*wkInitializeGlyphVector)(int count, void* glyphs);
 extern NSString* (*wkPathFromFont)(NSFont*);
 extern void (*wkPopupMenu)(NSMenu*, NSPoint location, float width, NSView*, int selectedItem, NSFont*);
index c7a947796e19d08c899c7c1f06ea0018c13178c6..0b465dc7ff18b847913b68af2a0696ef8d83c089 100644 (file)
@@ -53,6 +53,7 @@ ATSUFontID (*wkGetNSFontATSUFontId)(NSFont*);
 NSTimeInterval (*wkGetNSURLResponseCalculatedExpiration)(NSURLResponse *response);
 NSDate *(*wkGetNSURLResponseLastModifiedDate)(NSURLResponse *response);
 BOOL (*wkGetNSURLResponseMustRevalidate)(NSURLResponse *response);
+void (*wkGetWheelEventDeltas)(NSEvent*, float* deltaX, float* deltaY, BOOL* continuous);
 OSStatus (*wkInitializeGlyphVector)(int count, void* glyphs);
 NSString* (*wkPathFromFont)(NSFont*);
 void (*wkPopupMenu)(NSMenu*, NSPoint location, float width, NSView*, int selectedItem, NSFont*);
@@ -78,4 +79,3 @@ id (*wkCreateNSURLConnectionDelegateProxy)(void);
 BOOL (*wkSupportsMultipartXMixedReplace)(NSMutableURLRequest *);
 Class (*wkNSURLProtocolClassForReqest)(NSURLRequest *);
 float (*wkSecondsSinceLastInputEvent)(void);
-
index 84a7ea8cdaa5c16c10cf453ce6c4c9ca7b2b20a4..6cbfca9d37d2e22e6d0b2ff93ede3e10582e1cda 100644 (file)
 #import "PlatformWheelEvent.h"
 
 #import "PlatformMouseEvent.h"
+#import "WebCoreSystemInterface.h"
 
 namespace WebCore {
 
 PlatformWheelEvent::PlatformWheelEvent(NSEvent* event)
     : m_position(pointForEvent(event))
     , m_globalPosition(globalPointForEvent(event))
-    , m_deltaX([event deltaX])
-    , m_deltaY([event deltaY])
     , m_isAccepted(false)
     , m_shiftKey([event modifierFlags] & NSShiftKeyMask)
     , m_ctrlKey([event modifierFlags] & NSControlKeyMask)
     , m_altKey([event modifierFlags] & NSAlternateKeyMask)
     , m_metaKey([event modifierFlags] & NSCommandKeyMask)
 {
+    BOOL continuous;
+    wkGetWheelEventDeltas(event, &m_deltaX, &m_deltaY, &continuous);
+    m_isContinuous = continuous;
 }
 
 } // namespace WebCore
index 33e8c1e9686477b0ac0104ed5ec656f72d9c49e8..f428a0879f7c0603b62078e4a90964fe17f359bc 100644 (file)
@@ -39,6 +39,7 @@ PlatformWheelEvent::PlatformWheelEvent(QWheelEvent* e)
     , m_ctrlKey(e->modifiers() & Qt::ControlModifier)
     , m_altKey(e->modifiers() & Qt::AltModifier)
     , m_metaKey(e->modifiers() & Qt::MetaModifier)
+    , m_isContinuous(false)
 {
 }
 
index 7bf16e495af649777d6f58cc6b30acb137de4293..50f1228c5d4f5f3865e4588b5026bd1c352f230a 100644 (file)
@@ -229,7 +229,7 @@ void RenderListBox::calcHeight()
     
     if (m_vBar) {
         m_vBar->setEnabled(numVisibleItems() < numItems());
-        m_vBar->setSteps(1, min(1, numVisibleItems() - 1));
+        m_vBar->setSteps(1, min(1, numVisibleItems() - 1), itemHeight);
         m_vBar->setProportion(numVisibleItems(), numItems());
     }
 }
index ea65c65489e3aad43ca892e2601d2c79b2d3d75e..82c142f14446b7f6caebcf03bbd75680f8d5eb58 100644 (file)
@@ -1,3 +1,14 @@
+2007-03-26  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Darin.
+        
+        On Mac, support fine grained wheel events generated by trackpad and Mighty Mouse.
+        http://bugs.webkit.org/show_bug.cgi?id=13134
+        <rdar://problem/5076249?
+
+        * WebCoreSupport/WebSystemInterface.m:
+        (InitWebCoreSystemInterface): Expose GetWheelEventDeltas()
+
 2007-03-26  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Dave Harrison
index 5e7255531d80994a79fc02fabbd8b247a0bcb125..e8fdb4e90716d598a56e0d783ed8f91fe130005e 100644 (file)
@@ -68,6 +68,7 @@ void InitWebCoreSystemInterface(void)
     INIT(GetNSURLResponseLastModifiedDate);
     INIT(GetNSURLResponseMustRevalidate);
     INIT(GetPreferredExtensionForMIMEType);
+    INIT(GetWheelEventDeltas);
     INIT(InitializeGlyphVector);
     INIT(NSURLProtocolClassForReqest);
     INIT(PathFromFont);
index 18429da41f36697851fc4bc6e3b3a4091b24895d..98f91ce2bb9dbd23d1ddb3477b470217c14cff98 100644 (file)
@@ -1,3 +1,12 @@
+2007-03-27  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Darin.
+        
+        Added wkGetWheelEventDeltas
+
+        * WebKitSystemInterface.h:
+        * libWebKitSystemInterface.a:
+
 2007-03-07  Mark Rowe  <mrowe@apple.com>
 
         Build fix.  Rebuild against 10.4 SDK.
index 4d54d16263218aaa5f87b7bc90d5cc93da38e477..7d9be7e9253340ab6c9aea43b83839ebffc10a74 100644 (file)
@@ -145,6 +145,8 @@ NSString* WKPathFromFont(NSFont *font);
 
 BOOL WKCGContextIsBitmapContext(CGContextRef context);
 
+void WKGetWheelEventDeltas(NSEvent *, float *deltaX, float *deltaY, BOOL *continuous);
+
 #ifdef __cplusplus
 }
 #endif
index 6c39c74fc749de96446bcab28e93bf9919912475..1989cd336065a5c5c3ed00da2083f525e3ef4454 100644 (file)
Binary files a/WebKitLibraries/libWebKitSystemInterface.a and b/WebKitLibraries/libWebKitSystemInterface.a differ