• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
6 /* From ppb_input_event.idl modified Tue Jul 23 19:23:51 2013. */
7 
8 #ifndef PPAPI_C_PPB_INPUT_EVENT_H_
9 #define PPAPI_C_PPB_INPUT_EVENT_H_
10 
11 #include "ppapi/c/pp_bool.h"
12 #include "ppapi/c/pp_instance.h"
13 #include "ppapi/c/pp_macros.h"
14 #include "ppapi/c/pp_point.h"
15 #include "ppapi/c/pp_resource.h"
16 #include "ppapi/c/pp_stdint.h"
17 #include "ppapi/c/pp_time.h"
18 #include "ppapi/c/pp_touch_point.h"
19 #include "ppapi/c/pp_var.h"
20 
21 #define PPB_INPUT_EVENT_INTERFACE_1_0 "PPB_InputEvent;1.0"
22 #define PPB_INPUT_EVENT_INTERFACE PPB_INPUT_EVENT_INTERFACE_1_0
23 
24 #define PPB_MOUSE_INPUT_EVENT_INTERFACE_1_0 "PPB_MouseInputEvent;1.0"
25 #define PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1 "PPB_MouseInputEvent;1.1"
26 #define PPB_MOUSE_INPUT_EVENT_INTERFACE PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1
27 
28 #define PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0 "PPB_WheelInputEvent;1.0"
29 #define PPB_WHEEL_INPUT_EVENT_INTERFACE PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0
30 
31 #define PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0 "PPB_KeyboardInputEvent;1.0"
32 #define PPB_KEYBOARD_INPUT_EVENT_INTERFACE \
33     PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0
34 
35 #define PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0 "PPB_TouchInputEvent;1.0"
36 #define PPB_TOUCH_INPUT_EVENT_INTERFACE PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0
37 
38 #define PPB_IME_INPUT_EVENT_INTERFACE_1_0 "PPB_IMEInputEvent;1.0"
39 #define PPB_IME_INPUT_EVENT_INTERFACE PPB_IME_INPUT_EVENT_INTERFACE_1_0
40 
41 /**
42  * @file
43  * This file defines the Input Event interfaces.
44  */
45 
46 
47 /**
48  * @addtogroup Enums
49  * @{
50  */
51 /**
52  * This enumeration contains the types of input events.
53  */
54 typedef enum {
55   PP_INPUTEVENT_TYPE_UNDEFINED = -1,
56   /**
57    * Notification that a mouse button was pressed.
58    *
59    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
60    */
61   PP_INPUTEVENT_TYPE_MOUSEDOWN = 0,
62   /**
63    * Notification that a mouse button was released.
64    *
65    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
66    */
67   PP_INPUTEVENT_TYPE_MOUSEUP = 1,
68   /**
69    * Notification that a mouse button was moved when it is over the instance
70    * or dragged out of it.
71    *
72    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
73    */
74   PP_INPUTEVENT_TYPE_MOUSEMOVE = 2,
75   /**
76    * Notification that the mouse entered the instance's bounds.
77    *
78    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
79    */
80   PP_INPUTEVENT_TYPE_MOUSEENTER = 3,
81   /**
82    * Notification that a mouse left the instance's bounds.
83    *
84    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
85    */
86   PP_INPUTEVENT_TYPE_MOUSELEAVE = 4,
87   /**
88    * Notification that the scroll wheel was used.
89    *
90    * Register for this event using the PP_INPUTEVENT_CLASS_WHEEL class.
91    */
92   PP_INPUTEVENT_TYPE_WHEEL = 5,
93   /**
94    * Notification that a key transitioned from "up" to "down".
95    *
96    * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
97    */
98   /*
99    * TODO(brettw) differentiate from KEYDOWN.
100    */
101   PP_INPUTEVENT_TYPE_RAWKEYDOWN = 6,
102   /**
103    * Notification that a key was pressed. This does not necessarily correspond
104    * to a character depending on the key and language. Use the
105    * PP_INPUTEVENT_TYPE_CHAR for character input.
106    *
107    * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
108    */
109   PP_INPUTEVENT_TYPE_KEYDOWN = 7,
110   /**
111    * Notification that a key was released.
112    *
113    * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
114    */
115   PP_INPUTEVENT_TYPE_KEYUP = 8,
116   /**
117    * Notification that a character was typed. Use this for text input. Key
118    * down events may generate 0, 1, or more than one character event depending
119    * on the key, locale, and operating system.
120    *
121    * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
122    */
123   PP_INPUTEVENT_TYPE_CHAR = 9,
124   /**
125    * Notification that a context menu should be shown.
126    *
127    * This message will be sent when the user right-clicks or performs another
128    * OS-specific mouse command that should open a context menu. When this event
129    * is delivered depends on the system, on some systems (Mac) it will
130    * delivered after the mouse down event, and on others (Windows) it will be
131    * delivered after the mouse up event.
132    *
133    * You will always get the normal mouse events. For example, you may see
134    * MOUSEDOWN,CONTEXTMENU,MOUSEUP or MOUSEDOWN,MOUSEUP,CONTEXTMENU.
135    *
136    * The return value from the event handler determines if the context menu
137    * event will be passed to the page when you are using filtered input events
138    * (via RequestFilteringInputEvents()). In non-filtering mode the event will
139    * never be propagated and no context menu will be displayed. If you are
140    * handling mouse events in filtering mode, you may want to return true from
141    * this event even if you do not support a context menu to suppress the
142    * default one.
143    *
144    * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
145    */
146   PP_INPUTEVENT_TYPE_CONTEXTMENU = 10,
147   /**
148    * Notification that an input method composition process has just started.
149    *
150    * Register for this event using the PP_INPUTEVENT_CLASS_IME class.
151    */
152   PP_INPUTEVENT_TYPE_IME_COMPOSITION_START = 11,
153   /**
154    * Notification that the input method composition string is updated.
155    *
156    * Register for this event using the PP_INPUTEVENT_CLASS_IME class.
157    */
158   PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE = 12,
159   /**
160    * Notification that an input method composition process has completed.
161    *
162    * Register for this event using the PP_INPUTEVENT_CLASS_IME class.
163    */
164   PP_INPUTEVENT_TYPE_IME_COMPOSITION_END = 13,
165   /**
166    * Notification that an input method committed a string.
167    *
168    * Register for this event using the PP_INPUTEVENT_CLASS_IME class.
169    */
170   PP_INPUTEVENT_TYPE_IME_TEXT = 14,
171   /**
172    * Notification that a finger was placed on a touch-enabled device.
173    *
174    * Register for this event using the PP_INPUTEVENT_CLASS_TOUCH class.
175    */
176   PP_INPUTEVENT_TYPE_TOUCHSTART = 15,
177   /**
178    * Notification that a finger was moved on a touch-enabled device.
179    *
180    * Register for this event using the PP_INPUTEVENT_CLASS_TOUCH class.
181    */
182   PP_INPUTEVENT_TYPE_TOUCHMOVE = 16,
183   /**
184    * Notification that a finger was released on a touch-enabled device.
185    *
186    * Register for this event using the PP_INPUTEVENT_CLASS_TOUCH class.
187    */
188   PP_INPUTEVENT_TYPE_TOUCHEND = 17,
189   /**
190    * Notification that a touch event was canceled.
191    *
192    * Register for this event using the PP_INPUTEVENT_CLASS_TOUCH class.
193    */
194   PP_INPUTEVENT_TYPE_TOUCHCANCEL = 18
195 } PP_InputEvent_Type;
196 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Type, 4);
197 
198 /**
199  * This enumeration contains event modifier constants. Each modifier is one
200  * bit. Retrieve the modifiers from an input event using the GetEventModifiers
201  * function on PPB_InputEvent.
202  */
203 typedef enum {
204   PP_INPUTEVENT_MODIFIER_SHIFTKEY = 1 << 0,
205   PP_INPUTEVENT_MODIFIER_CONTROLKEY = 1 << 1,
206   PP_INPUTEVENT_MODIFIER_ALTKEY = 1 << 2,
207   PP_INPUTEVENT_MODIFIER_METAKEY = 1 << 3,
208   PP_INPUTEVENT_MODIFIER_ISKEYPAD = 1 << 4,
209   PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT = 1 << 5,
210   PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN = 1 << 6,
211   PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN = 1 << 7,
212   PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN = 1 << 8,
213   PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY = 1 << 9,
214   PP_INPUTEVENT_MODIFIER_NUMLOCKKEY = 1 << 10,
215   PP_INPUTEVENT_MODIFIER_ISLEFT = 1 << 11,
216   PP_INPUTEVENT_MODIFIER_ISRIGHT = 1 << 12
217 } PP_InputEvent_Modifier;
218 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Modifier, 4);
219 
220 /**
221  * This enumeration contains constants representing each mouse button. To get
222  * the mouse button for a mouse down or up event, use GetMouseButton on
223  * PPB_InputEvent.
224  */
225 typedef enum {
226   PP_INPUTEVENT_MOUSEBUTTON_NONE = -1,
227   PP_INPUTEVENT_MOUSEBUTTON_LEFT = 0,
228   PP_INPUTEVENT_MOUSEBUTTON_MIDDLE = 1,
229   PP_INPUTEVENT_MOUSEBUTTON_RIGHT = 2
230 } PP_InputEvent_MouseButton;
231 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_MouseButton, 4);
232 
233 typedef enum {
234   /**
235    * Request mouse input events.
236    *
237    * Normally you will request mouse events by calling RequestInputEvents().
238    * The only use case for filtered events (via RequestFilteringInputEvents())
239    * is for instances that have irregular outlines and you want to perform hit
240    * testing, which is very uncommon. Requesting non-filtered mouse events will
241    * lead to higher performance.
242    */
243   PP_INPUTEVENT_CLASS_MOUSE = 1 << 0,
244   /**
245    * Requests keyboard events. Often you will want to request filtered mode
246    * (via RequestFilteringInputEvents) for keyboard events so you can pass on
247    * events (by returning false) that you don't handle. For example, if you
248    * don't request filtered mode and the user pressed "Page Down" when your
249    * instance has focus, the page won't scroll which will be a poor experience.
250    *
251    * A small number of tab and window management commands like Alt-F4 are never
252    * sent to the page. You can not request these keyboard commands since it
253    * would allow pages to trap users on a page.
254    */
255   PP_INPUTEVENT_CLASS_KEYBOARD = 1 << 1,
256   /**
257    * Identifies scroll wheel input event. Wheel events must be requested in
258    * filtering mode via RequestFilteringInputEvents(). This is because many
259    * wheel commands should be forwarded to the page.
260    *
261    * Most instances will not need this event. Consuming wheel events by
262    * returning true from your filtered event handler will prevent the user from
263    * scrolling the page when the mouse is over the instance which can be very
264    * annoying.
265    *
266    * If you handle wheel events (for example, you have a document viewer which
267    * the user can scroll), the recommended behavior is to return false only if
268    * the wheel event actually causes your document to scroll. When the user
269    * reaches the end of the document, return false to indicating that the event
270    * was not handled. This will then forward the event to the containing page
271    * for scrolling, producing the nested scrolling behavior users expect from
272    * frames in a page.
273    */
274   PP_INPUTEVENT_CLASS_WHEEL = 1 << 2,
275   /**
276    * Identifies touch input events.
277    *
278    * Request touch events only if you intend to handle them. If the browser
279    * knows you do not need to handle touch events, it can handle them at a
280    * higher level and achieve higher performance. If the plugin does not
281    * register for touch-events, then it will receive synthetic mouse events that
282    * are generated from the touch events (e.g. mouse-down for touch-start,
283    * mouse-move for touch-move (with left-button down), and mouse-up for
284    * touch-end. If the plugin does register for touch events, then the synthetic
285    * mouse events are not created.
286    */
287   PP_INPUTEVENT_CLASS_TOUCH = 1 << 3,
288   /**
289    * Identifies IME composition input events.
290    *
291    * Request this input event class if you allow on-the-spot IME input.
292    */
293   PP_INPUTEVENT_CLASS_IME = 1 << 4
294 } PP_InputEvent_Class;
295 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Class, 4);
296 /**
297  * @}
298  */
299 
300 /**
301  * @addtogroup Interfaces
302  * @{
303  */
304 /**
305  * The <code>PPB_InputEvent</code> interface contains pointers to several
306  * functions related to generic input events on the browser.
307  */
308 struct PPB_InputEvent_1_0 {
309   /**
310    * RequestInputEvent() requests that input events corresponding to the given
311    * input events are delivered to the instance.
312    *
313    * It's recommended that you use RequestFilteringInputEvents() for keyboard
314    * events instead of this function so that you don't interfere with normal
315    * browser accelerators.
316    *
317    * By default, no input events are delivered. Call this function with the
318    * classes of events you are interested in to have them be delivered to
319    * the instance. Calling this function will override any previous setting for
320    * each specified class of input events (for example, if you previously
321    * called RequestFilteringInputEvents(), this function will set those events
322    * to non-filtering mode).
323    *
324    * Input events may have high overhead, so you should only request input
325    * events that your plugin will actually handle. For example, the browser may
326    * do optimizations for scroll or touch events that can be processed
327    * substantially faster if it knows there are no non-default receivers for
328    * that message. Requesting that such messages be delivered, even if they are
329    * processed very quickly, may have a noticeable effect on the performance of
330    * the page.
331    *
332    * Note that synthetic mouse events will be generated from touch events if
333    * (and only if) the you do not request touch events.
334    *
335    * When requesting input events through this function, the events will be
336    * delivered and <i>not</i> bubbled to the page. This means that even if you
337    * aren't interested in the message, no other parts of the page will get
338    * a crack at the message.
339    *
340    * <strong>Example:</strong>
341    * @code
342    *   RequestInputEvents(instance, PP_INPUTEVENT_CLASS_MOUSE);
343    *   RequestFilteringInputEvents(instance,
344    *       PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_KEYBOARD);
345    * @endcode
346    *
347    * @param instance The <code>PP_Instance</code> of the instance requesting
348    * the given events.
349    *
350    * @param event_classes A combination of flags from
351    * <code>PP_InputEvent_Class</code> that identifies the classes of events the
352    * instance is requesting. The flags are combined by logically ORing their
353    * values.
354    *
355    * @return <code>PP_OK</code> if the operation succeeded,
356    * <code>PP_ERROR_BADARGUMENT</code> if instance is invalid, or
357    * <code>PP_ERROR_NOTSUPPORTED</code> if one of the event class bits were
358    * illegal. In the case of an invalid bit, all valid bits will be applied
359    * and only the illegal bits will be ignored. The most common cause of a
360    * <code>PP_ERROR_NOTSUPPORTED</code> return value is requesting keyboard
361    * events, these must use RequestFilteringInputEvents().
362    */
363   int32_t (*RequestInputEvents)(PP_Instance instance, uint32_t event_classes);
364   /**
365    * RequestFilteringInputEvents() requests that input events corresponding to
366    * the given input events are delivered to the instance for filtering.
367    *
368    * By default, no input events are delivered. In most cases you would
369    * register to receive events by calling RequestInputEvents(). In some cases,
370    * however, you may wish to filter events such that they can be bubbled up
371    * to the DOM. In this case, register for those classes of events using
372    * this function instead of RequestInputEvents().
373    *
374    * Filtering input events requires significantly more overhead than just
375    * delivering them to the instance. As such, you should only request
376    * filtering in those cases where it's absolutely necessary. The reason is
377    * that it requires the browser to stop and block for the instance to handle
378    * the input event, rather than sending the input event asynchronously. This
379    * can have significant overhead.
380    *
381    * <strong>Example:</strong>
382    * @code
383    *   RequestInputEvents(instance, PP_INPUTEVENT_CLASS_MOUSE);
384    *   RequestFilteringInputEvents(instance,
385    *       PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_KEYBOARD);
386    * @endcode
387    *
388    * @return <code>PP_OK</code> if the operation succeeded,
389    * <code>PP_ERROR_BADARGUMENT</code> if instance is invalid, or
390    * <code>PP_ERROR_NOTSUPPORTED</code> if one of the event class bits were
391    * illegal. In the case of an invalid bit, all valid bits will be applied
392    * and only the illegal bits will be ignored.
393    */
394   int32_t (*RequestFilteringInputEvents)(PP_Instance instance,
395                                          uint32_t event_classes);
396   /**
397    * ClearInputEventRequest() requests that input events corresponding to the
398    * given input classes no longer be delivered to the instance.
399    *
400    * By default, no input events are delivered. If you have previously
401    * requested input events via RequestInputEvents() or
402    * RequestFilteringInputEvents(), this function will unregister handling
403    * for the given instance. This will allow greater browser performance for
404    * those events.
405    *
406    * Note that you may still get some input events after clearing the flag if
407    * they were dispatched before the request was cleared. For example, if
408    * there are 3 mouse move events waiting to be delivered, and you clear the
409    * mouse event class during the processing of the first one, you'll still
410    * receive the next two. You just won't get more events generated.
411    *
412    * @param instance The <code>PP_Instance</code> of the instance requesting
413    * to no longer receive the given events.
414    *
415    * @param event_classes A combination of flags from
416    * <code>PP_InputEvent_Class</code> that identify the classes of events the
417    * instance is no longer interested in.
418    */
419   void (*ClearInputEventRequest)(PP_Instance instance, uint32_t event_classes);
420   /**
421    * IsInputEvent() returns true if the given resource is a valid input event
422    * resource.
423    *
424    * @param[in] resource A <code>PP_Resource</code> corresponding to a generic
425    * resource.
426    *
427    * @return <code>PP_TRUE</code> if the given resource is a valid input event
428    * resource.
429    */
430   PP_Bool (*IsInputEvent)(PP_Resource resource);
431   /**
432    * GetType() returns the type of input event for the given input event
433    * resource.
434    *
435    * @param[in] resource A <code>PP_Resource</code> corresponding to an input
436    * event.
437    *
438    * @return A <code>PP_InputEvent_Type</code> if its a valid input event or
439    * <code>PP_INPUTEVENT_TYPE_UNDEFINED</code> if the resource is invalid.
440    */
441   PP_InputEvent_Type (*GetType)(PP_Resource event);
442   /**
443    * GetTimeStamp() Returns the time that the event was generated. This will be
444    *  before the current time since processing and dispatching the event has
445    * some overhead. Use this value to compare the times the user generated two
446    * events without being sensitive to variable processing time.
447    *
448    * @param[in] resource A <code>PP_Resource</code> corresponding to the event.
449    *
450    * @return The return value is in time ticks, which is a monotonically
451    * increasing clock not related to the wall clock time. It will not change
452    * if the user changes their clock or daylight savings time starts, so can
453    * be reliably used to compare events. This means, however, that you can't
454    * correlate event times to a particular time of day on the system clock.
455    */
456   PP_TimeTicks (*GetTimeStamp)(PP_Resource event);
457   /**
458    * GetModifiers() returns a bitfield indicating which modifiers were down
459    * at the time of the event. This is a combination of the flags in the
460    * <code>PP_InputEvent_Modifier</code> enum.
461    *
462    * @param[in] resource A <code>PP_Resource</code> corresponding to an input
463    * event.
464    *
465    * @return The modifiers associated with the event, or 0 if the given
466    * resource is not a valid event resource.
467    */
468   uint32_t (*GetModifiers)(PP_Resource event);
469 };
470 
471 typedef struct PPB_InputEvent_1_0 PPB_InputEvent;
472 
473 /**
474  * The <code>PPB_MouseInputEvent</code> interface contains pointers to several
475  * functions related to mouse input events.
476  */
477 struct PPB_MouseInputEvent_1_1 {
478   /**
479    * Create() creates a mouse input event with the given parameters. Normally
480    * you will get a mouse event passed through the
481    * <code>HandleInputEvent</code> and will not need to create them, but some
482    * applications may want to create their own for internal use. The type must
483    * be one of the mouse event types.
484    *
485    * @param[in] instance The instance for which this event occurred.
486    *
487    * @param[in] type A <code>PP_InputEvent_Type</code> identifying the type of
488    * input event.
489    *
490    * @param[in] time_stamp A <code>PP_TimeTicks</code> indicating the time
491    * when the event occurred.
492    *
493    * @param[in] modifiers A bit field combination of the
494    * <code>PP_InputEvent_Modifier</code> flags.
495    *
496    * @param[in] mouse_button The button that changed for mouse down or up
497    * events. This value will be <code>PP_EVENT_MOUSEBUTTON_NONE</code> for
498    * mouse move, enter, and leave events.
499    *
500    * @param[in] mouse_position A <code>Point</code> containing the x and y
501    * position of the mouse when the event occurred.
502    *
503    * @param[in] mouse_movement The change in position of the mouse.
504    *
505    * @return A <code>PP_Resource</code> containing the new mouse input event.
506    */
507   PP_Resource (*Create)(PP_Instance instance,
508                         PP_InputEvent_Type type,
509                         PP_TimeTicks time_stamp,
510                         uint32_t modifiers,
511                         PP_InputEvent_MouseButton mouse_button,
512                         const struct PP_Point* mouse_position,
513                         int32_t click_count,
514                         const struct PP_Point* mouse_movement);
515   /**
516    * IsMouseInputEvent() determines if a resource is a mouse event.
517    *
518    * @param[in] resource A <code>PP_Resource</code> corresponding to an event.
519    *
520    * @return <code>PP_TRUE</code> if the given resource is a valid mouse input
521    * event, otherwise <code>PP_FALSE</code>.
522    */
523   PP_Bool (*IsMouseInputEvent)(PP_Resource resource);
524   /**
525    * GetButton() returns the mouse button that generated a mouse down or up
526    * event.
527    *
528    * @param[in] mouse_event A <code>PP_Resource</code> corresponding to a
529    * mouse event.
530    *
531    * @return The mouse button associated with mouse down and up events. This
532    * value will be <code>PP_EVENT_MOUSEBUTTON_NONE</code> for mouse move,
533    * enter, and leave events, and for all non-mouse events.
534    */
535   PP_InputEvent_MouseButton (*GetButton)(PP_Resource mouse_event);
536   /**
537    * GetPosition() returns the pixel location of a mouse input event. When
538    * the mouse is locked, it returns the last known mouse position just as
539    * mouse lock was entered.
540    *
541    * @param[in] mouse_event A <code>PP_Resource</code> corresponding to a
542    * mouse event.
543    *
544    * @return The point associated with the mouse event, relative to the upper-
545    * left of the instance receiving the event. These values can be negative for
546    * mouse drags. The return value will be (0, 0) for non-mouse events.
547    */
548   struct PP_Point (*GetPosition)(PP_Resource mouse_event);
549   /*
550    * TODO(brettw) figure out exactly what this means.
551    */
552   int32_t (*GetClickCount)(PP_Resource mouse_event);
553   /**
554    * Returns the change in position of the mouse. When the mouse is locked,
555    * although the mouse position doesn't actually change, this function
556    * still provides movement information, which indicates what the change in
557    * position would be had the mouse not been locked.
558    *
559    * @param[in] mouse_event A <code>PP_Resource</code> corresponding to a
560    * mouse event.
561    *
562    * @return The change in position of the mouse, relative to the previous
563    * position.
564    */
565   struct PP_Point (*GetMovement)(PP_Resource mouse_event);
566 };
567 
568 typedef struct PPB_MouseInputEvent_1_1 PPB_MouseInputEvent;
569 
570 struct PPB_MouseInputEvent_1_0 {
571   PP_Resource (*Create)(PP_Instance instance,
572                         PP_InputEvent_Type type,
573                         PP_TimeTicks time_stamp,
574                         uint32_t modifiers,
575                         PP_InputEvent_MouseButton mouse_button,
576                         const struct PP_Point* mouse_position,
577                         int32_t click_count);
578   PP_Bool (*IsMouseInputEvent)(PP_Resource resource);
579   PP_InputEvent_MouseButton (*GetButton)(PP_Resource mouse_event);
580   struct PP_Point (*GetPosition)(PP_Resource mouse_event);
581   int32_t (*GetClickCount)(PP_Resource mouse_event);
582 };
583 
584 /**
585  * The <code>PPB_WheelIputEvent</code> interface contains pointers to several
586  * functions related to wheel input events.
587  */
588 struct PPB_WheelInputEvent_1_0 {
589   /**
590    * Create() creates a wheel input event with the given parameters. Normally
591    * you will get a wheel event passed through the
592    * <code>HandleInputEvent</code> and will not need to create them, but some
593    * applications may want to create their own for internal use.
594    *
595    * @param[in] instance The instance for which this event occurred.
596    *
597    * @param[in] time_stamp A <code>PP_TimeTicks</code> indicating the time
598    * when the event occurred.
599    *
600    * @param[in] modifiers A bit field combination of the
601    * <code>PP_InputEvent_Modifier</code> flags.
602    *
603    * @param[in] wheel_delta The scroll wheel's horizontal and vertical scroll
604    * amounts.
605    *
606    * @param[in] wheel_ticks The number of "clicks" of the scroll wheel that
607    * have produced the event.
608    *
609    * @param[in] scroll_by_page When true, the user is requesting to scroll
610    * by pages. When false, the user is requesting to scroll by lines.
611    *
612    * @return A <code>PP_Resource</code> containing the new wheel input event.
613    */
614   PP_Resource (*Create)(PP_Instance instance,
615                         PP_TimeTicks time_stamp,
616                         uint32_t modifiers,
617                         const struct PP_FloatPoint* wheel_delta,
618                         const struct PP_FloatPoint* wheel_ticks,
619                         PP_Bool scroll_by_page);
620   /**
621    * IsWheelInputEvent() determines if a resource is a wheel event.
622    *
623    * @param[in] wheel_event A <code>PP_Resource</code> corresponding to an
624    * event.
625    *
626    * @return <code>PP_TRUE</code> if the given resource is a valid wheel input
627    * event.
628    */
629   PP_Bool (*IsWheelInputEvent)(PP_Resource resource);
630   /**
631    * GetDelta() returns the amount vertically and horizontally the user has
632    * requested to scroll by with their mouse wheel. A scroll down or to the
633    * right (where the content moves up or left) is represented as positive
634    * values, and a scroll up or to the left (where the content moves down or
635    * right) is represented as negative values.
636    *
637    * This amount is system dependent and will take into account the user's
638    * preferred scroll sensitivity and potentially also nonlinear acceleration
639    * based on the speed of the scrolling.
640    *
641    * Devices will be of varying resolution. Some mice with large detents will
642    * only generate integer scroll amounts. But fractional values are also
643    * possible, for example, on some trackpads and newer mice that don't have
644    * "clicks".
645    *
646    * @param[in] wheel_event A <code>PP_Resource</code> corresponding to a wheel
647    * event.
648    *
649    * @return The vertical and horizontal scroll values. The units are either in
650    * pixels (when scroll_by_page is false) or pages (when scroll_by_page is
651    * true). For example, y = -3 means scroll up 3 pixels when scroll_by_page
652    * is false, and scroll up 3 pages when scroll_by_page is true.
653    */
654   struct PP_FloatPoint (*GetDelta)(PP_Resource wheel_event);
655   /**
656    * GetTicks() returns the number of "clicks" of the scroll wheel
657    * that have produced the event. The value may have system-specific
658    * acceleration applied to it, depending on the device. The positive and
659    * negative meanings are the same as for GetDelta().
660    *
661    * If you are scrolling, you probably want to use the delta values.  These
662    * tick events can be useful if you aren't doing actual scrolling and don't
663    * want or pixel values. An example may be cycling between different items in
664    * a game.
665    *
666    * @param[in] wheel_event A <code>PP_Resource</code> corresponding to a wheel
667    * event.
668    *
669    * @return The number of "clicks" of the scroll wheel. You may receive
670    * fractional values for the wheel ticks if the mouse wheel is high
671    * resolution or doesn't have "clicks". If your program wants discrete
672    * events (as in the "picking items" example) you should accumulate
673    * fractional click values from multiple messages until the total value
674    * reaches positive or negative one. This should represent a similar amount
675    * of scrolling as for a mouse that has a discrete mouse wheel.
676    */
677   struct PP_FloatPoint (*GetTicks)(PP_Resource wheel_event);
678   /**
679    * GetScrollByPage() indicates if the scroll delta x/y indicates pages or
680    * lines to scroll by.
681    *
682    * @param[in] wheel_event A <code>PP_Resource</code> corresponding to a wheel
683    * event.
684    *
685    * @return <code>PP_TRUE</code> if the event is a wheel event and the user is
686    * scrolling by pages. <code>PP_FALSE</code> if not or if the resource is not
687    * a wheel event.
688    */
689   PP_Bool (*GetScrollByPage)(PP_Resource wheel_event);
690 };
691 
692 typedef struct PPB_WheelInputEvent_1_0 PPB_WheelInputEvent;
693 
694 /**
695  * The <code>PPB_KeyboardInputEvent</code> interface contains pointers to
696  * several functions related to keyboard input events.
697  */
698 struct PPB_KeyboardInputEvent_1_0 {
699   /**
700    * Creates a keyboard input event with the given parameters. Normally you
701    * will get a keyboard event passed through the HandleInputEvent and will not
702    * need to create them, but some applications may want to create their own
703    * for internal use. The type must be one of the keyboard event types.
704    *
705    * @param[in] instance The instance for which this event occurred.
706    *
707    * @param[in] type A <code>PP_InputEvent_Type</code> identifying the type of
708    * input event.
709    *
710    * @param[in] time_stamp A <code>PP_TimeTicks</code> indicating the time
711    * when the event occurred.
712    *
713    * @param[in]  modifiers A bit field combination of the
714    * <code>PP_InputEvent_Modifier</code> flags.
715    *
716    * @param[in] key_code This value reflects the DOM KeyboardEvent
717    * <code>keyCode</code> field. Chrome populates this with the Windows-style
718    * Virtual Key code of the key.
719    *
720    * @param[in] character_text This value represents the typed character as a
721    * UTF-8 string.
722    *
723    * @return A <code>PP_Resource</code> containing the new keyboard input
724    * event.
725    */
726   PP_Resource (*Create)(PP_Instance instance,
727                         PP_InputEvent_Type type,
728                         PP_TimeTicks time_stamp,
729                         uint32_t modifiers,
730                         uint32_t key_code,
731                         struct PP_Var character_text);
732   /**
733    * IsKeyboardInputEvent() determines if a resource is a keyboard event.
734    *
735    * @param[in] resource A <code>PP_Resource</code> corresponding to an event.
736    *
737    * @return <code>PP_TRUE</code> if the given resource is a valid input event.
738    */
739   PP_Bool (*IsKeyboardInputEvent)(PP_Resource resource);
740   /**
741    * GetKeyCode() returns the DOM keyCode field for the keyboard event.
742    * Chrome populates this with the Windows-style Virtual Key code of the key.
743    *
744    * @param[in] key_event A <code>PP_Resource</code> corresponding to a
745    * keyboard event.
746    *
747    * @return The DOM keyCode field for the keyboard event.
748    */
749   uint32_t (*GetKeyCode)(PP_Resource key_event);
750   /**
751    * GetCharacterText() returns the typed character as a UTF-8 string for the
752    * given character event.
753    *
754    * @param[in] character_event A <code>PP_Resource</code> corresponding to a
755    * keyboard event.
756    *
757    * @return A string var representing a single typed character for character
758    * input events. For non-character input events the return value will be an
759    * undefined var.
760    */
761   struct PP_Var (*GetCharacterText)(PP_Resource character_event);
762 };
763 
764 typedef struct PPB_KeyboardInputEvent_1_0 PPB_KeyboardInputEvent;
765 /**
766  * @}
767  */
768 
769 /**
770  * @addtogroup Enums
771  * @{
772  */
773 typedef enum {
774   /**
775    * The list of all TouchPoints which are currently down.
776    */
777   PP_TOUCHLIST_TYPE_TOUCHES = 0,
778   /**
779    * The list of all TouchPoints whose state has changed since the last
780    * TouchInputEvent.
781    */
782   PP_TOUCHLIST_TYPE_CHANGEDTOUCHES = 1,
783   /**
784    * The list of all TouchPoints which are targeting this plugin.  This is a
785    * subset of Touches.
786    */
787   PP_TOUCHLIST_TYPE_TARGETTOUCHES = 2
788 } PP_TouchListType;
789 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_TouchListType, 4);
790 /**
791  * @}
792  */
793 
794 /**
795  * @addtogroup Interfaces
796  * @{
797  */
798 /**
799  * The <code>PPB_TouchInputEvent</code> interface contains pointers to several
800  * functions related to touch events.
801  */
802 struct PPB_TouchInputEvent_1_0 {
803   /**
804    * Creates a touch input event with the given parameters. Normally you
805    * will get a touch event passed through the HandleInputEvent and will not
806    * need to create them, but some applications may want to create their own
807    * for internal use. The type must be one of the touch event types.
808    * This newly created touch input event does not have any touch point in any
809    * of the touch-point lists. <code>AddTouchPoint</code> should be called to
810    * add the touch-points.
811    *
812    * @param[in] instance The instance for which this event occurred.
813    *
814    * @param[in] type A <code>PP_InputEvent_Type</code> identifying the type of
815    * input event.
816    *
817    * @param[in] time_stamp A <code>PP_TimeTicks</code> indicating the time
818    * when the event occurred.
819    *
820    * @param[in]  modifiers A bit field combination of the
821    * <code>PP_InputEvent_Modifier</code> flags.
822    *
823    * @return A <code>PP_Resource</code> containing the new touch input event.
824    */
825   PP_Resource (*Create)(PP_Instance instance,
826                         PP_InputEvent_Type type,
827                         PP_TimeTicks time_stamp,
828                         uint32_t modifiers);
829   /**
830    * Adds a touch point to the touch event in the specified touch-list.
831    *
832    * @param[in] touch_event A <code>PP_Resource</code> corresponding to a touch
833    * event.
834    *
835    * @param[in] list The list to add the touch point to.
836    *
837    * @param[in] point The point to add to the list.
838    */
839   void (*AddTouchPoint)(PP_Resource touch_event,
840                         PP_TouchListType list,
841                         const struct PP_TouchPoint* point);
842   /**
843    * IsTouchInputEvent() determines if a resource is a touch event.
844    *
845    * @param[in] resource A <code>PP_Resource</code> corresponding to an event.
846    *
847    * @return <code>PP_TRUE</code> if the given resource is a valid touch input
848    * event, otherwise <code>PP_FALSE</code>.
849    */
850   PP_Bool (*IsTouchInputEvent)(PP_Resource resource);
851   /**
852    * Returns the number of touch-points in the specified list.
853    *
854    * @param[in] resource A <code>PP_Resource</code> corresponding to a touch
855    * event.
856    *
857    * @param[in] list The list.
858    *
859    * @return The number of touch-points in the specified list.
860    */
861   uint32_t (*GetTouchCount)(PP_Resource resource, PP_TouchListType list);
862   /**
863    * Returns the touch-point at the specified index from the specified list.
864    *
865    * @param[in] resource A <code>PP_Resource</code> corresponding to a touch
866    * event.
867    *
868    * @param[in] list The list.
869    *
870    * @param[in] index The index.
871    *
872    * @return A <code>PP_TouchPoint</code> representing the touch-point.
873    */
874   struct PP_TouchPoint (*GetTouchByIndex)(PP_Resource resource,
875                                           PP_TouchListType list,
876                                           uint32_t index);
877   /**
878    * Returns the touch-point with the specified touch-id in the specified list.
879    *
880    * @param[in] resource A <code>PP_Resource</code> corresponding to a touch
881    * event.
882    *
883    * @param[in] list The list.
884    *
885    * @param[in] touch_id The id of the touch-point.
886    *
887    * @return A <code>PP_TouchPoint</code> representing the touch-point.
888    */
889   struct PP_TouchPoint (*GetTouchById)(PP_Resource resource,
890                                        PP_TouchListType list,
891                                        uint32_t touch_id);
892 };
893 
894 typedef struct PPB_TouchInputEvent_1_0 PPB_TouchInputEvent;
895 
896 struct PPB_IMEInputEvent_1_0 {
897   /**
898    * Create() creates an IME input event with the given parameters. Normally
899    * you will get an IME event passed through the <code>HandleInputEvent</code>
900    * and will not need to create them, but some applications may want to create
901    * their own for internal use.
902    *
903    * @param[in] instance The instance for which this event occurred.
904    *
905    * @param[in] type A <code>PP_InputEvent_Type</code> identifying the type of
906    * input event. The type must be one of the IME event types.
907    *
908    * @param[in] time_stamp A <code>PP_TimeTicks</code> indicating the time
909    * when the event occurred.
910    *
911    * @param[in] text The string returned by <code>GetText</code>.
912    *
913    * @param[in] segment_number The number returned by
914    * <code>GetSegmentNumber</code>.
915    *
916    * @param[in] segment_offsets The array of numbers returned by
917    * <code>GetSegmentOffset</code>. If <code>segment_number</code> is zero,
918    * the number of elements of the array should be zero. If
919    * <code>segment_number</code> is non-zero, the length of the array must be
920    * <code>segment_number</code> + 1.
921    *
922    * @param[in] target_segment The number returned by
923    * <code>GetTargetSegment</code>.
924    *
925    * @param[in] selection_start The start index returned by
926    * <code>GetSelection</code>.
927    *
928    * @param[in] selection_end The end index returned by
929    * <code>GetSelection</code>.
930    *
931    * @return A <code>PP_Resource</code> containing the new IME input event.
932    */
933   PP_Resource (*Create)(PP_Instance instance,
934                         PP_InputEvent_Type type,
935                         PP_TimeTicks time_stamp,
936                         struct PP_Var text,
937                         uint32_t segment_number,
938                         const uint32_t segment_offsets[],
939                         int32_t target_segment,
940                         uint32_t selection_start,
941                         uint32_t selection_end);
942   /**
943    * IsIMEInputEvent() determines if a resource is an IME event.
944    *
945    * @param[in] resource A <code>PP_Resource</code> corresponding to an event.
946    *
947    * @return <code>PP_TRUE</code> if the given resource is a valid input event.
948    */
949   PP_Bool (*IsIMEInputEvent)(PP_Resource resource);
950   /**
951    * GetText() returns the composition text as a UTF-8 string for the given IME
952    * event.
953    *
954    * @param[in] ime_event A <code>PP_Resource</code> corresponding to an IME
955    * event.
956    *
957    * @return A string var representing the composition text. For non-IME input
958    * events the return value will be an undefined var.
959    */
960   struct PP_Var (*GetText)(PP_Resource ime_event);
961   /**
962    * GetSegmentNumber() returns the number of segments in the composition text.
963    *
964    * @param[in] ime_event A <code>PP_Resource</code> corresponding to an IME
965    * event.
966    *
967    * @return The number of segments. For events other than COMPOSITION_UPDATE,
968    * returns 0.
969    */
970   uint32_t (*GetSegmentNumber)(PP_Resource ime_event);
971   /**
972    * GetSegmentOffset() returns the position of the index-th segmentation point
973    * in the composition text. The position is given by a byte-offset (not a
974    * character-offset) of the string returned by GetText(). It always satisfies
975    * 0=GetSegmentOffset(0) < ... < GetSegmentOffset(i) < GetSegmentOffset(i+1)
976    * < ... < GetSegmentOffset(GetSegmentNumber())=(byte-length of GetText()).
977    * Note that [GetSegmentOffset(i), GetSegmentOffset(i+1)) represents the range
978    * of the i-th segment, and hence GetSegmentNumber() can be a valid argument
979    * to this function instead of an off-by-1 error.
980    *
981    * @param[in] ime_event A <code>PP_Resource</code> corresponding to an IME
982    * event.
983    *
984    * @param[in] index An integer indicating a segment.
985    *
986    * @return The byte-offset of the segmentation point. If the event is not
987    * COMPOSITION_UPDATE or index is out of range, returns 0.
988    */
989   uint32_t (*GetSegmentOffset)(PP_Resource ime_event, uint32_t index);
990   /**
991    * GetTargetSegment() returns the index of the current target segment of
992    * composition.
993    *
994    * @param[in] ime_event A <code>PP_Resource</code> corresponding to an IME
995    * event.
996    *
997    * @return An integer indicating the index of the target segment. When there
998    * is no active target segment, or the event is not COMPOSITION_UPDATE,
999    * returns -1.
1000    */
1001   int32_t (*GetTargetSegment)(PP_Resource ime_event);
1002   /**
1003    * GetSelection() returns the range selected by caret in the composition text.
1004    *
1005    * @param[in] ime_event A <code>PP_Resource</code> corresponding to an IME
1006    * event.
1007    *
1008    * @param[out] start The start position of the current selection.
1009    *
1010    * @param[out] end The end position of the current selection.
1011    */
1012   void (*GetSelection)(PP_Resource ime_event, uint32_t* start, uint32_t* end);
1013 };
1014 
1015 typedef struct PPB_IMEInputEvent_1_0 PPB_IMEInputEvent;
1016 /**
1017  * @}
1018  */
1019 
1020 #endif  /* PPAPI_C_PPB_INPUT_EVENT_H_ */
1021 
1022