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