#ifndef WebEvent_h
#define WebEvent_h
#include <WebCore/FloatPoint.h>
#include <WebCore/FloatSize.h>
#include <WebCore/IntPoint.h>
#include <WebCore/IntSize.h>
#include <wtf/text/WTFString.h>
namespace CoreIPC {
class ArgumentDecoder;
class ArgumentEncoder;
}
namespace WebKit {
class WebEvent {
public:
enum Type {
NoType = -1,
MouseDown,
MouseUp,
MouseMove,
Wheel,
KeyDown,
KeyUp,
RawKeyDown,
Char,
#if ENABLE(GESTURE_EVENTS)
GestureScrollBegin,
GestureScrollEnd,
GestureSingleTap,
#endif
#if ENABLE(TOUCH_EVENTS)
TouchStart,
TouchMove,
TouchEnd,
TouchCancel,
#endif
};
enum Modifiers {
ShiftKey = 1 << 0,
ControlKey = 1 << 1,
AltKey = 1 << 2,
MetaKey = 1 << 3,
CapsLockKey = 1 << 4,
};
Type type() const { return static_cast<Type>(m_type); }
bool shiftKey() const { return m_modifiers & ShiftKey; }
bool controlKey() const { return m_modifiers & ControlKey; }
bool altKey() const { return m_modifiers & AltKey; }
bool metaKey() const { return m_modifiers & MetaKey; }
bool capsLockKey() const { return m_modifiers & CapsLockKey; }
Modifiers modifiers() const { return static_cast<Modifiers>(m_modifiers); }
double timestamp() const { return m_timestamp; }
protected:
WebEvent();
WebEvent(Type, Modifiers, double timestamp);
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebEvent&);
private:
uint32_t m_type; uint32_t m_modifiers; double m_timestamp;
};
class WebMouseEvent : public WebEvent {
public:
enum Button {
NoButton = -1,
LeftButton,
MiddleButton,
RightButton
};
WebMouseEvent();
WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp);
Button button() const { return static_cast<Button>(m_button); }
const WebCore::IntPoint& position() const { return m_position; }
const WebCore::IntPoint& globalPosition() const { return m_globalPosition; }
float deltaX() const { return m_deltaX; }
float deltaY() const { return m_deltaY; }
float deltaZ() const { return m_deltaZ; }
int32_t clickCount() const { return m_clickCount; }
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebMouseEvent&);
private:
static bool isMouseEventType(Type);
uint32_t m_button;
WebCore::IntPoint m_position;
WebCore::IntPoint m_globalPosition;
float m_deltaX;
float m_deltaY;
float m_deltaZ;
int32_t m_clickCount;
};
class WebWheelEvent : public WebEvent {
public:
enum Granularity {
ScrollByPageWheelEvent,
ScrollByPixelWheelEvent
};
#if PLATFORM(MAC)
enum Phase {
PhaseNone = 0,
PhaseBegan = 1 << 0,
PhaseStationary = 1 << 1,
PhaseChanged = 1 << 2,
PhaseEnded = 1 << 3,
PhaseCancelled = 1 << 4,
PhaseMayBegin = 1 << 5,
};
#endif
WebWheelEvent() { }
WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Modifiers, double timestamp);
#if PLATFORM(MAC)
WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, bool directionInvertedFromDevice, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers, double timestamp);
#endif
const WebCore::IntPoint position() const { return m_position; }
const WebCore::IntPoint globalPosition() const { return m_globalPosition; }
const WebCore::FloatSize delta() const { return m_delta; }
const WebCore::FloatSize wheelTicks() const { return m_wheelTicks; }
Granularity granularity() const { return static_cast<Granularity>(m_granularity); }
bool directionInvertedFromDevice() const { return m_directionInvertedFromDevice; }
#if PLATFORM(MAC)
Phase phase() const { return static_cast<Phase>(m_phase); }
Phase momentumPhase() const { return static_cast<Phase>(m_momentumPhase); }
bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; }
uint32_t scrollCount() const { return m_scrollCount; }
const WebCore::FloatSize& unacceleratedScrollingDelta() const { return m_unacceleratedScrollingDelta; }
#endif
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebWheelEvent&);
private:
static bool isWheelEventType(Type);
WebCore::IntPoint m_position;
WebCore::IntPoint m_globalPosition;
WebCore::FloatSize m_delta;
WebCore::FloatSize m_wheelTicks;
uint32_t m_granularity; bool m_directionInvertedFromDevice;
#if PLATFORM(MAC)
uint32_t m_phase; uint32_t m_momentumPhase; bool m_hasPreciseScrollingDeltas;
uint32_t m_scrollCount;
WebCore::FloatSize m_unacceleratedScrollingDelta;
#endif
};
class WebKeyboardEvent : public WebEvent {
public:
WebKeyboardEvent() { }
WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, double timestamp);
const String& text() const { return m_text; }
const String& unmodifiedText() const { return m_unmodifiedText; }
const String& keyIdentifier() const { return m_keyIdentifier; }
int32_t windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; }
int32_t nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; }
int32_t macCharCode() const { return m_macCharCode; }
bool isAutoRepeat() const { return m_isAutoRepeat; }
bool isKeypad() const { return m_isKeypad; }
bool isSystemKey() const { return m_isSystemKey; }
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebKeyboardEvent&);
static bool isKeyboardEventType(Type);
private:
String m_text;
String m_unmodifiedText;
String m_keyIdentifier;
int32_t m_windowsVirtualKeyCode;
int32_t m_nativeVirtualKeyCode;
int32_t m_macCharCode;
bool m_isAutoRepeat;
bool m_isKeypad;
bool m_isSystemKey;
};
#if ENABLE(GESTURE_EVENTS)
class WebGestureEvent : public WebEvent {
public:
WebGestureEvent() { }
WebGestureEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, Modifiers, double timestamp);
WebGestureEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, Modifiers, double timestamp, const WebCore::IntSize& area, const WebCore::FloatPoint& delta);
const WebCore::IntPoint position() const { return m_position; }
const WebCore::IntPoint globalPosition() const { return m_globalPosition; }
const WebCore::IntSize area() const { return m_area; }
const WebCore::FloatPoint delta() const { return m_delta; }
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebGestureEvent&);
private:
static bool isGestureEventType(Type);
WebCore::IntPoint m_position;
WebCore::IntPoint m_globalPosition;
WebCore::IntSize m_area;
WebCore::FloatPoint m_delta;
};
#endif // ENABLE(GESTURE_EVENTS)
#if ENABLE(TOUCH_EVENTS)
class WebPlatformTouchPoint {
public:
enum TouchPointState {
TouchReleased,
TouchPressed,
TouchMoved,
TouchStationary,
TouchCancelled
};
WebPlatformTouchPoint() : m_rotationAngle(0.0), m_force(0.0) { }
WebPlatformTouchPoint(uint32_t id, TouchPointState, const WebCore::IntPoint& screenPosition, const WebCore::IntPoint& position);
WebPlatformTouchPoint(uint32_t id, TouchPointState, const WebCore::IntPoint& screenPosition, const WebCore::IntPoint& position, const WebCore::IntSize& radius, float rotationAngle = 0.0, float force = 0.0);
uint32_t id() const { return m_id; }
TouchPointState state() const { return static_cast<TouchPointState>(m_state); }
const WebCore::IntPoint& screenPosition() const { return m_screenPosition; }
const WebCore::IntPoint& position() const { return m_position; }
const WebCore::IntSize& radius() const { return m_radius; }
float rotationAngle() const { return m_rotationAngle; }
float force() const { return m_force; }
void setState(TouchPointState state) { m_state = state; }
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebPlatformTouchPoint&);
private:
uint32_t m_id;
uint32_t m_state;
WebCore::IntPoint m_screenPosition;
WebCore::IntPoint m_position;
WebCore::IntSize m_radius;
float m_rotationAngle;
float m_force;
};
class WebTouchEvent : public WebEvent {
public:
WebTouchEvent() { }
WebTouchEvent(Type, Vector<WebPlatformTouchPoint>, Modifiers, double timestamp);
const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
void encode(CoreIPC::ArgumentEncoder&) const;
static bool decode(CoreIPC::ArgumentDecoder&, WebTouchEvent&);
private:
static bool isTouchEventType(Type);
Vector<WebPlatformTouchPoint> m_touchPoints;
};
#endif // ENABLE(TOUCH_EVENTS)
}
#endif // WebEvent_h