1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_SHARED_IMPL_PPB_INPUT_EVENT_SHARED_H_
6#define PPAPI_SHARED_IMPL_PPB_INPUT_EVENT_SHARED_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "ppapi/c/ppb_input_event.h"
14#include "ppapi/shared_impl/resource.h"
15#include "ppapi/thunk/ppb_input_event_api.h"
16#include "ui/events/latency_info.h"
17
18namespace ppapi {
19
20// IF YOU ADD STUFF TO THIS CLASS
21// ==============================
22// Be sure to add it to the STRUCT_TRAITS at the top of ppapi_messages.h
23struct PPAPI_SHARED_EXPORT InputEventData {
24  InputEventData();
25  ~InputEventData();
26
27  // Internal-only value. Set to true when this input event is filtered, that
28  // is, should be delivered synchronously. This is used by the proxy.
29  bool is_filtered;
30
31  PP_InputEvent_Type event_type;
32  PP_TimeTicks event_time_stamp;
33  uint32_t event_modifiers;
34
35  PP_InputEvent_MouseButton mouse_button;
36  PP_Point mouse_position;
37  int32_t mouse_click_count;
38  PP_Point mouse_movement;
39
40  PP_FloatPoint wheel_delta;
41  PP_FloatPoint wheel_ticks;
42  bool wheel_scroll_by_page;
43
44  uint32_t key_code;
45
46  // The key event's |code| attribute as defined in:
47  // http://www.w3.org/TR/uievents/
48  std::string code;
49
50  std::string character_text;
51
52  std::vector<uint32_t> composition_segment_offsets;
53  int32_t composition_target_segment;
54  uint32_t composition_selection_start;
55  uint32_t composition_selection_end;
56
57  std::vector<PP_TouchPoint> touches;
58  std::vector<PP_TouchPoint> changed_touches;
59  std::vector<PP_TouchPoint> target_touches;
60
61  ui::LatencyInfo latency_info;
62};
63
64// This simple class implements the PPB_InputEvent_API in terms of the
65// shared InputEventData structure
66class PPAPI_SHARED_EXPORT PPB_InputEvent_Shared
67    : public Resource,
68      public thunk::PPB_InputEvent_API {
69 public:
70  PPB_InputEvent_Shared(ResourceObjectType type,
71                        PP_Instance instance,
72                        const InputEventData& data);
73
74  // Resource overrides.
75  virtual PPB_InputEvent_API* AsPPB_InputEvent_API() OVERRIDE;
76
77  // PPB_InputEvent_API implementation.
78  virtual const InputEventData& GetInputEventData() const OVERRIDE;
79  virtual PP_InputEvent_Type GetType() OVERRIDE;
80  virtual PP_TimeTicks GetTimeStamp() OVERRIDE;
81  virtual uint32_t GetModifiers() OVERRIDE;
82  virtual PP_InputEvent_MouseButton GetMouseButton() OVERRIDE;
83  virtual PP_Point GetMousePosition() OVERRIDE;
84  virtual int32_t GetMouseClickCount() OVERRIDE;
85  virtual PP_Point GetMouseMovement() OVERRIDE;
86  virtual PP_FloatPoint GetWheelDelta() OVERRIDE;
87  virtual PP_FloatPoint GetWheelTicks() OVERRIDE;
88  virtual PP_Bool GetWheelScrollByPage() OVERRIDE;
89  virtual uint32_t GetKeyCode() OVERRIDE;
90  virtual PP_Var GetCharacterText() OVERRIDE;
91  virtual PP_Var GetCode() OVERRIDE;
92  virtual uint32_t GetIMESegmentNumber() OVERRIDE;
93  virtual uint32_t GetIMESegmentOffset(uint32_t index) OVERRIDE;
94  virtual int32_t GetIMETargetSegment() OVERRIDE;
95  virtual void GetIMESelection(uint32_t* start, uint32_t* end) OVERRIDE;
96  virtual void AddTouchPoint(PP_TouchListType list,
97                             const PP_TouchPoint& point) OVERRIDE;
98  virtual uint32_t GetTouchCount(PP_TouchListType list) OVERRIDE;
99  virtual PP_TouchPoint GetTouchByIndex(PP_TouchListType list,
100                                        uint32_t index) OVERRIDE;
101  virtual PP_TouchPoint GetTouchById(PP_TouchListType list,
102                                     uint32_t id) OVERRIDE;
103  virtual PP_Bool TraceInputLatency(PP_Bool has_damage) OVERRIDE;
104
105  // Implementations for event creation.
106  static PP_Resource CreateIMEInputEvent(ResourceObjectType type,
107                                         PP_Instance instance,
108                                         PP_InputEvent_Type event_type,
109                                         PP_TimeTicks time_stamp,
110                                         struct PP_Var text,
111                                         uint32_t segment_number,
112                                         const uint32_t* segment_offsets,
113                                         int32_t target_segment,
114                                         uint32_t selection_start,
115                                         uint32_t selection_end);
116  static PP_Resource CreateKeyboardInputEvent(ResourceObjectType type,
117                                              PP_Instance instance,
118                                              PP_InputEvent_Type event_type,
119                                              PP_TimeTicks time_stamp,
120                                              uint32_t modifiers,
121                                              uint32_t key_code,
122                                              struct PP_Var character_text,
123                                              struct PP_Var code);
124  static PP_Resource CreateMouseInputEvent(
125      ResourceObjectType type,
126      PP_Instance instance,
127      PP_InputEvent_Type event_type,
128      PP_TimeTicks time_stamp,
129      uint32_t modifiers,
130      PP_InputEvent_MouseButton mouse_button,
131      const PP_Point* mouse_position,
132      int32_t click_count,
133      const PP_Point* mouse_movement);
134  static PP_Resource CreateWheelInputEvent(ResourceObjectType type,
135                                           PP_Instance instance,
136                                           PP_TimeTicks time_stamp,
137                                           uint32_t modifiers,
138                                           const PP_FloatPoint* wheel_delta,
139                                           const PP_FloatPoint* wheel_ticks,
140                                           PP_Bool scroll_by_page);
141  static PP_Resource CreateTouchInputEvent(ResourceObjectType type,
142                                           PP_Instance instance,
143                                           PP_InputEvent_Type event_type,
144                                           PP_TimeTicks time_stamp,
145                                           uint32_t modifiers);
146
147 private:
148  InputEventData data_;
149
150  DISALLOW_IMPLICIT_CONSTRUCTORS(PPB_InputEvent_Shared);
151};
152
153}  // namespace ppapi
154
155#endif  // PPAPI_SHARED_IMPL_PPB_INPUT_EVENT_SHARED_H_
156