1 /* 2 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef PlatformWheelEvent_h 27 #define PlatformWheelEvent_h 28 29 #include "IntPoint.h" 30 31 #if PLATFORM(GTK) 32 typedef struct _GdkEventScroll GdkEventScroll; 33 #endif 34 35 #if PLATFORM(EFL) 36 typedef struct _Evas_Event_Mouse_Wheel Evas_Event_Mouse_Wheel; 37 #endif 38 39 #if PLATFORM(QT) 40 QT_BEGIN_NAMESPACE 41 class QWheelEvent; 42 class QGraphicsSceneWheelEvent; 43 QT_END_NAMESPACE 44 #endif 45 46 #if PLATFORM(WIN) 47 typedef struct HWND__* HWND; 48 typedef unsigned WPARAM; 49 typedef long LPARAM; 50 #endif 51 52 #if PLATFORM(WX) 53 class wxMouseEvent; 54 class wxPoint; 55 #endif 56 57 #if PLATFORM(HAIKU) 58 class BMessage; 59 #endif 60 61 namespace WebCore { 62 63 class FloatPoint; 64 class FloatSize; 65 66 // Wheel events come in two flavors: 67 // The ScrollByPixelWheelEvent is a fine-grained event that specifies the precise number of pixels to scroll. It is sent directly by MacBook touchpads on OS X, 68 // and synthesized in other cases where platforms generate line-by-line scrolling events. 69 // The ScrollByPageWheelEvent indicates that the wheel event should scroll an entire page. In this case WebCore's built in paging behavior is used to page 70 // up and down (you get the same behavior as if the user was clicking in a scrollbar track to page up or page down). Page scrolling only works in the vertical direction. 71 enum PlatformWheelEventGranularity { 72 ScrollByPageWheelEvent, 73 ScrollByPixelWheelEvent 74 }; 75 76 #if PLATFORM(MAC) 77 enum PlatformWheelEventPhase { 78 PlatformWheelEventPhaseNone = 0, 79 PlatformWheelEventPhaseBegan = 1 << 1, 80 PlatformWheelEventPhaseStationary = 1 << 2, 81 PlatformWheelEventPhaseChanged = 1 << 3, 82 PlatformWheelEventPhaseEnded = 1 << 4, 83 PlatformWheelEventPhaseCancelled = 1 << 5, 84 }; 85 #endif 86 87 class PlatformWheelEvent { 88 public: 89 PlatformWheelEvent() 90 : m_deltaX(0) 91 , m_deltaY(0) 92 , m_wheelTicksX(0) 93 , m_wheelTicksY(0) 94 , m_granularity(ScrollByPixelWheelEvent) 95 , m_isAccepted(false) 96 , m_shiftKey(false) 97 , m_ctrlKey(false) 98 , m_altKey(false) 99 , m_metaKey(false) 100 #if PLATFORM(MAC) 101 , m_hasPreciseScrollingDeltas(false) 102 , m_phase(PlatformWheelEventPhaseNone) 103 , m_momentumPhase(PlatformWheelEventPhaseNone) 104 , m_timestamp(0) 105 #endif 106 { 107 } 108 109 const IntPoint& pos() const { return m_position; } // PlatformWindow coordinates. 110 const IntPoint& globalPos() const { return m_globalPosition; } // Screen coordinates. 111 112 float deltaX() const { return m_deltaX; } 113 float deltaY() const { return m_deltaY; } 114 115 float wheelTicksX() const { return m_wheelTicksX; } 116 float wheelTicksY() const { return m_wheelTicksY; } 117 118 PlatformWheelEventGranularity granularity() const { return m_granularity; } 119 120 bool isAccepted() const { return m_isAccepted; } 121 bool shiftKey() const { return m_shiftKey; } 122 bool ctrlKey() const { return m_ctrlKey; } 123 bool altKey() const { return m_altKey; } 124 bool metaKey() const { return m_metaKey; } 125 126 int x() const { return m_position.x(); } // PlatformWindow coordinates. 127 int y() const { return m_position.y(); } 128 int globalX() const { return m_globalPosition.x(); } // Screen coordinates. 129 int globalY() const { return m_globalPosition.y(); } 130 131 void accept() { m_isAccepted = true; } 132 void ignore() { m_isAccepted = false; } 133 134 void turnVerticalTicksIntoHorizontal() 135 { 136 m_deltaX = m_deltaY; 137 m_deltaY = 0; 138 139 m_wheelTicksX = m_wheelTicksY; 140 m_wheelTicksY = 0; 141 } 142 143 #if PLATFORM(GTK) 144 PlatformWheelEvent(GdkEventScroll*); 145 #endif 146 147 #if PLATFORM(EFL) 148 PlatformWheelEvent(const Evas_Event_Mouse_Wheel*); 149 #endif 150 151 #if PLATFORM(MAC) 152 #if defined(__OBJC__) 153 PlatformWheelEvent(NSEvent *, NSView *windowView); 154 #endif 155 156 PlatformWheelEventPhase phase() const { return m_phase; } 157 PlatformWheelEventPhase momentumPhase() const { return m_momentumPhase; } 158 bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; } 159 double timestamp() const { return m_timestamp; } 160 #endif 161 162 #if PLATFORM(QT) 163 PlatformWheelEvent(QWheelEvent*); 164 PlatformWheelEvent(QGraphicsSceneWheelEvent*); 165 void applyDelta(int delta, Qt::Orientation); 166 #endif 167 168 #if PLATFORM(WIN) 169 PlatformWheelEvent(HWND, WPARAM, LPARAM, bool isMouseHWheel); 170 PlatformWheelEvent(HWND, const FloatSize& delta, const FloatPoint& location); 171 #endif 172 173 #if PLATFORM(WX) 174 PlatformWheelEvent(const wxMouseEvent&, const wxPoint&); 175 #endif 176 177 #if PLATFORM(HAIKU) 178 PlatformWheelEvent(BMessage*); 179 #endif 180 181 protected: 182 IntPoint m_position; 183 IntPoint m_globalPosition; 184 float m_deltaX; 185 float m_deltaY; 186 float m_wheelTicksX; 187 float m_wheelTicksY; 188 PlatformWheelEventGranularity m_granularity; 189 bool m_isAccepted; 190 bool m_shiftKey; 191 bool m_ctrlKey; 192 bool m_altKey; 193 bool m_metaKey; 194 #if PLATFORM(MAC) 195 bool m_hasPreciseScrollingDeltas; 196 PlatformWheelEventPhase m_phase; 197 PlatformWheelEventPhase m_momentumPhase; 198 double m_timestamp; 199 #endif 200 }; 201 202 } // namespace WebCore 203 204 #endif // PlatformWheelEvent_h 205