summaryrefslogtreecommitdiffstats
path: root/ppapi/c/ppb_input_event.h
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-07 15:38:48 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-07 15:38:48 +0000
commit493d1421853518d3b16a7b103311ea4fa1988341 (patch)
treeabc9bd73da85786a933666c8c6042a62aabd7c4b /ppapi/c/ppb_input_event.h
parentb18d98d7de474db2a2057d0e3aaaac9bd87a2f41 (diff)
downloadchromium_src-493d1421853518d3b16a7b103311ea4fa1988341.zip
chromium_src-493d1421853518d3b16a7b103311ea4fa1988341.tar.gz
chromium_src-493d1421853518d3b16a7b103311ea4fa1988341.tar.bz2
Add interfaces for requesting and receiving input event resources.
This converts the input event from a C struct to a resource to give us more ability to change over time. This patch includes a proxy and a C++ wrapper for this resource. You now have to register for classes of input events. No events are sent by default. This also allows us to specify whether the events support bubbling or not, which allows us to better-optimize IPC. TEST=none BUG=none Review URL: http://codereview.chromium.org/7285010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91711 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/c/ppb_input_event.h')
-rw-r--r--ppapi/c/ppb_input_event.h485
1 files changed, 485 insertions, 0 deletions
diff --git a/ppapi/c/ppb_input_event.h b/ppapi/c/ppb_input_event.h
new file mode 100644
index 0000000..0d33c74
--- /dev/null
+++ b/ppapi/c/ppb_input_event.h
@@ -0,0 +1,485 @@
+/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef PPAPI_C_PPB_INPUT_EVENT_H_
+#define PPAPI_C_PPB_INPUT_EVENT_H_
+
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/c/pp_macros.h"
+#include "ppapi/c/pp_point.h"
+#include "ppapi/c/pp_resource.h"
+#include "ppapi/c/pp_stdint.h"
+#include "ppapi/c/pp_time.h"
+#include "ppapi/c/pp_var.h"
+
+#define PPB_INPUT_EVENT_INTERFACE_0_1 "PPB_InputEvent;0.1"
+#define PPB_INPUT_EVENT_INTERFACE PPB_INPUT_EVENT_INTERFACE_0_1
+
+#define PPB_MOUSE_INPUT_EVENT_INTERFACE_0_1 "PPB_MouseInputEvent;0.1"
+#define PPB_MOUSE_INPUT_EVENT_INTERFACE PPB_MOUSE_INPUT_EVENT_INTERFACE_0_1
+
+#define PPB_WHEEL_INPUT_EVENT_INTERFACE_0_1 "PPB_WheelInputEvent;0.1"
+#define PPB_WHEEL_INPUT_EVENT_INTERFACE PPB_WHEEL_INPUT_EVENT_INTERFACE_0_1
+
+#define PPB_KEYBOARD_INPUT_EVENT_INTERFACE_0_1 "PPB_KeyboardInputEvent;0.1"
+#define PPB_KEYBOARD_INPUT_EVENT_INTERFACE \
+ PPB_KEYBOARD_INPUT_EVENT_INTERFACE_0_1
+
+/**
+ * @addtogroup Enums
+ * @{
+ */
+
+/**
+ * This enumeration contains the types of input events.
+ */
+typedef enum {
+ PP_INPUTEVENT_TYPE_UNDEFINED = -1,
+
+ /**
+ * Notification that a mouse button was pressed.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSEDOWN = 0,
+
+ /**
+ * Notification that a mouse button was released.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSEUP = 1,
+
+ /**
+ * Notification that a mouse button was moved when it is over the instance
+ * or dragged out of it.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSEMOVE = 2,
+
+ /**
+ * Notification that the mouse entered the instance's bounds.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSEENTER = 3,
+
+ /**
+ * Notification that a mouse left the instance's bounds.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSELEAVE = 4,
+
+ /**
+ * Notification that the scroll wheel was used.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_WHEEL class.
+ */
+ PP_INPUTEVENT_TYPE_MOUSEWHEEL = 5,
+
+ /**
+ * Notification that a key transitioned from "up" to "down".
+ * TODO(brettw) differentiate from KEYDOWN.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
+ */
+ PP_INPUTEVENT_TYPE_RAWKEYDOWN = 6,
+
+ /**
+ * Notification that a key was pressed. This does not necessarily correspond
+ * to a character depending on the key and language. Use the
+ * PP_INPUTEVENT_TYPE_CHAR for character input.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
+ */
+ PP_INPUTEVENT_TYPE_KEYDOWN = 7,
+
+ /**
+ * Notification that a key was released.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
+ */
+ PP_INPUTEVENT_TYPE_KEYUP = 8,
+
+ /**
+ * Notification that a character was typed. Use this for text input. Key
+ * down events may generate 0, 1, or more than one character event depending
+ * on the key, locale, and operating system.
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_KEYBOARD class.
+ */
+ PP_INPUTEVENT_TYPE_CHAR = 9,
+
+ /**
+ * TODO(brettw) when is this used?
+ *
+ * Register for this event using the PP_INPUTEVENT_CLASS_MOUSE class.
+ */
+ PP_INPUTEVENT_TYPE_CONTEXTMENU = 10
+} PP_InputEvent_Type;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Type, 4);
+
+/**
+ * This enumeration contains event modifier constants. Each modifier is one
+ * bit. Retrieve the modifiers from an input event using the GetEventModifiers
+ * function on PPB_InputEvent.
+ */
+typedef enum {
+ PP_INPUTEVENT_MODIFIER_SHIFTKEY = 1 << 0,
+ PP_INPUTEVENT_MODIFIER_CONTROLKEY = 1 << 1,
+ PP_INPUTEVENT_MODIFIER_ALTKEY = 1 << 2,
+ PP_INPUTEVENT_MODIFIER_METAKEY = 1 << 3,
+ PP_INPUTEVENT_MODIFIER_ISKEYPAD = 1 << 4,
+ PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT = 1 << 5,
+ PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN = 1 << 6,
+ PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN = 1 << 7,
+ PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN = 1 << 8,
+ PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY = 1 << 9,
+ PP_INPUTEVENT_MODIFIER_NUMLOCKKEY = 1 << 10
+} PP_InputEvent_Modifier;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Modifier, 4);
+
+/**
+ * This enumeration contains constants representing each mouse button. To get
+ * the mouse button for a mouse down or up event, use GetMouseButton on
+ * PPB_InputEvent.
+ */
+typedef enum {
+ PP_INPUTEVENT_MOUSEBUTTON_NONE = -1,
+ PP_INPUTEVENT_MOUSEBUTTON_LEFT = 0,
+ PP_INPUTEVENT_MOUSEBUTTON_MIDDLE = 1,
+ PP_INPUTEVENT_MOUSEBUTTON_RIGHT = 2
+} PP_InputEvent_MouseButton;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_MouseButton, 4);
+
+/**
+ * @}
+ */
+
+typedef enum {
+ /**
+ * Request mouse input events.
+ *
+ * Normally you will request mouse events by calling RequestInputEvents().
+ * The only use case for filtered events (via RequestFilteringInputEvents())
+ * is for instances that have irregular outlines and you want to perform hit
+ * testing, which is very uncommon. Requesting non-filtered mouse events will
+ * lead to higher performance.
+ */
+ PP_INPUTEVENT_CLASS_MOUSE = 1 << 0,
+
+ /**
+ * Requests keyboard events. Keyboard events must be requested in filtering
+ * mode via RequestFilteringInputEvents(). This is because many commands
+ * should be forwarded to the page.
+ *
+ * A small number of tab and window management commands like Alt-F4 are never
+ * sent to the page. You can not request these keyboard commands since it
+ * would allow pages to trap users on a page.
+ */
+ PP_INPUTEVENT_CLASS_KEYBOARD = 1 << 1,
+
+ /**
+ * Identifies scroll wheel input event. Wheel events must be requested in
+ * filtering mode via RequestFilteringInputEvents(). This is because many
+ * wheel commands should be forwarded to the page.
+ *
+ * Most instances will not need this event. Consuming wheel events by
+ * returning true from your filtered event handler will prevent the user from
+ * scrolling the page when the mouse is over the instance which can be very
+ * annoying.
+ *
+ * If you handle wheel events (for example, you have a document viewer which
+ * the user can scroll), the recommended behavior is to return false only if
+ * the wheel event actually causes your document to scroll. When the user
+ * reaches the end of the document, return false to indicating that the event
+ * was not handled. This will then forward the event to the containing page
+ * for scrolling, producing the nested scrolling behavior users expect from
+ * frames in a page.
+ */
+ PP_INPUTEVENT_CLASS_WHEEL = 1 << 2,
+
+ /**
+ * Identifies touch input events.
+ *
+ * Request touch events only if you intend to handle them. If the browser
+ * knows you do not need to handle touch events, it can handle them at a
+ * higher level and achieve higher performance.
+ */
+ PP_INPUTEVENT_CLASS_TOUCH = 1 << 3,
+
+ /**
+ * Identifies IME composition input events.
+ *
+ * Request this input event class if you allow on-the-spot IME input.
+ */
+ PP_INPUTEVENT_CLASS_IME = 1 << 4
+} PP_InputEvent_Class;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InputEvent_Class, 4);
+
+struct PPB_InputEvent {
+ /**
+ * Request that input events corresponding to the given input events are
+ * delivered to the instance.
+ *
+ * You can not use this function to request keyboard events
+ * (PP_INPUTEVENT_CLASS_KEYBOARD). You must use RequestFilteringInputEvents()
+ * for this class of input.
+ *
+ * By default, no input events are delivered. Call this function with the
+ * classes of events you are interested in to have them be delivered to
+ * the instance. Calling this function will override any previous setting for
+ * each specified class of input events (for example, if you previously
+ * called RequestFilteringInputEvents(), this function will set those events
+ * to non-filtering mode).
+ *
+ * Input events may have high overhead, so you should only request input
+ * events that your plugin will actually handle. For example, the browser may
+ * do optimizations for scroll or touch events that can be processed
+ * substantially faster if it knows there are no non-default receivers for
+ * that message. Requesting that such messages be delivered, even if they are
+ * processed very quickly, may have a noticable effect on the performance of
+ * the page.
+ *
+ * When requesting input events through this function, the events will be
+ * delivered and <i>not</i> bubbled to the page. This means that even if you
+ * aren't interested in the message, no other parts of the page will get
+ * a crack at the message.
+ *
+ * Example:
+ * RequestInputEvents(instance, PP_INPUTEVENT_CLASS_MOUSE);
+ * RequestFilteringInputEvents(instance,
+ * PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_KEYBOARD);
+ *
+ * @param instance The <code>PP_Instance</code> of the instance requesting
+ * the given events.
+ *
+ * @param event_classes A combination of flags from PP_InputEvent_Class that
+ * identifies the classes of events the instance is requesting. The flags
+ * are combined by logically ORing their values.
+ *
+ * @return PP_OK if the operation succeeded, PP_ERROR_BADARGUMENT if instance
+ * is invalid, or PP_ERROR_NOTSUPPORTED if one of the event class bits were
+ * illegal. In the case of an invalid bit, all valid bits will be applied
+ * and only the illegal bits will be ignored. The most common cause of a
+ * PP_ERROR_NOTSUPPORTED return value is requesting keyboard events, these
+ * must use RequestFilteringInputEvents().
+ */
+ int32_t (*RequestInputEvents)(PP_Instance instance,
+ uint32_t event_classes);
+
+ /**
+ * Request that input events corresponding to the given input events are
+ * delivered to the instance for filtering.
+ *
+ * By default, no input events are delivered. In most cases you would
+ * register to receive events by calling RequestInputEvents(). In some cases,
+ * however, you may wish to filter events such that they can be bubbled up
+ * to the DOM. In this case, register for those classes of events using
+ * this function instead of RequestInputEvents(). Keyboard events must always
+ * be registered in filtering mode.
+ *
+ * Filtering input events requires significantly more overhead than just
+ * delivering them to the instance. As such, you should only request
+ * filtering in those cases where it's absolutely necessary. The reason is
+ * that it requires the browser to stop and block for the instance to handle
+ * the input event, rather than sending the input event asynchronously. This
+ * can have significant overhead.
+ *
+ * Example:
+ * RequestInputEvents(instance, PP_INPUTEVENT_CLASS_MOUSE);
+ * RequestFilteringInputEvents(instance,
+ * PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_KEYBOARD);
+ *
+ * @return PP_OK if the operation succeeded, PP_ERROR_BADARGUMENT if instance
+ * is invalid, or PP_ERROR_NOTSUPPORTED if one of the event class bits were
+ * illegal. In the case of an invalid bit, all valid bits will be applied
+ * and only the illegal bits will be ignored.
+ */
+ int32_t (*RequestFilteringInputEvents)(PP_Instance instance,
+ uint32_t event_classes);
+
+ /**
+ * Request that input events corresponding to the given input classes no
+ * longer be delivered to the instance.
+ *
+ * By default, no input events are delivered. If you have previously
+ * requested input events via RequestInputEvents() or
+ * RequestFilteringInputEvents(), this function will unregister handling
+ * for the given instance. This will allow greater browser performance for
+ * those events.
+ *
+ * Note that you may still get some input events after clearing the flag if
+ * they were dispatched before the request was cleared. For example, if
+ * there are 3 mouse move events waiting to be delivered, and you clear the
+ * mouse event class during the processing of the first one, you'll still
+ * receive the next two. You just won't get more events generated.
+ *
+ * @param instance The <code>PP_Instance</code> of the instance requesting
+ * to no longer receive the given events.
+ *
+ * @param event_classes A combination of flags from PP_InputEvent_Class that
+ * identifies the classes of events the instance is no longer interested in.
+ */
+ void (*ClearInputEventRequest)(PP_Instance instance,
+ uint32_t event_classes);
+
+ /**
+ * Returns true if the given resource is a valid input event resource.
+ */
+ PP_Bool (*IsInputEvent)(PP_Resource resource);
+
+ /**
+ * Returns the type of input event for the given input event resource.
+ * This is valid for all input events. Returns PP_INPUTEVENT_TYPE_UNDEFINED
+ * if the resource is invalid.
+ */
+ PP_InputEvent_Type (*GetType)(PP_Resource event);
+
+ /**
+ * Returns the time that the event was generated. This will be before the
+ * current time since processing and dispatching the event has some overhead.
+ * Use this value to compare the times the user generated two events without
+ * being sensitive to variable processing time.
+ *
+ * The return value is in time ticks, which is a monotonically increasing
+ * clock not related to the wall clock time. It will not change if the user
+ * changes their clock or daylight savings time starts, so can be reliably
+ * used to compare events. This means, however, that you can't correlate
+ * event times to a particular time of day on the system clock.
+ */
+ PP_TimeTicks (*GetTimeStamp)(PP_Resource event);
+
+ /**
+ * Returns a bitfield indicating which modifiers were down at the time of
+ * the event. This is a combination of the flags in the
+ * PP_InputEvent_Modifier enum.
+ *
+ * @return The modifiers associated with the event, or 0 if the given
+ * resource is not a valid event resource.
+ */
+ uint32_t (*GetModifiers)(PP_Resource event);
+};
+
+struct PPB_MouseInputEvent {
+ /**
+ * Determines if a resource is a mouse event.
+ *
+ * @return PP_TRUE if the given resource is a valid mouse input event.
+ */
+ PP_Bool (*IsMouseInputEvent)(PP_Resource resource);
+
+ /**
+ * Returns which mouse button generated a mouse down or up event.
+ *
+ * @return The mouse button associated with mouse down and up events. This
+ * value will be PP_EVENT_MOUSEBUTTON_NONE for mouse move, enter, and leave
+ * events, and for all non-mouse events.
+ */
+ PP_InputEvent_MouseButton (*GetMouseButton)(PP_Resource mouse_event);
+
+ /**
+ * Returns the pixel location of a mouse input event.
+ *
+ * @return The point associated with the mouse event, relative to the upper-
+ * left of the instance receiving the event. These values can be negative for
+ * mouse drags. The return value will be (0, 0) for non-mouse events.
+ */
+ struct PP_Point (*GetMousePosition)(PP_Resource mouse_event);
+
+ /**
+ * TODO(brettw) figure out exactly what this means.
+ */
+ int32_t (*GetMouseClickCount)(PP_Resource mouse_event);
+};
+
+struct PPB_WheelInputEvent {
+ /**
+ * Determines if a resource is a wheel event.
+ *
+ * @return PP_TRUE if the given resource is a valid wheel input event.
+ */
+ PP_Bool (*IsWheelInputEvent)(PP_Resource resource);
+
+ /**
+ * Indicates the amount vertically and horizontally the user has requested
+ * to scroll by with their mouse wheel. A scroll down or to the right (where
+ * the content moves up or left) is represented as positive values, and
+ * a scroll up or to the left (where the content moves down or right) is
+ * represented as negative values.
+ *
+ * The units are either in pixels (when scroll_by_page is false) or pages
+ * (when scroll_by_page is true). For example, y = -3 means scroll up 3
+ * pixels when scroll_by_page is false, and scroll up 3 pages when
+ * scroll_by_page is true.
+ *
+ * This amount is system dependent and will take into account the user's
+ * preferred scroll sensitivity and potentially also nonlinear acceleration
+ * based on the speed of the scrolling.
+ *
+ * Devices will be of varying resolution. Some mice with large detents will
+ * only generate integer scroll amounts. But fractional values are also
+ * possible, for example, on some trackpads and newer mice that don't have
+ * "clicks".
+ */
+ struct PP_FloatPoint (*GetWheelDelta)(PP_Resource wheel_event);
+
+ /**
+ * The number of "clicks" of the scroll wheel that have produced the
+ * event. The value may have system-specific acceleration applied to it,
+ * depending on the device. The positive and negative meanings are the same
+ * as for GetWheelDelta().
+ *
+ * If you are scrolling, you probably want to use the delta values. These
+ * tick events can be useful if you aren't doing actual scrolling and don't
+ * want or pixel values. An example may be cycling between different items in
+ * a game.
+ *
+ * You may receive fractional values for the wheel ticks if the mouse wheel
+ * is high resolution or doesn't have "clicks". If your program wants
+ * discrete events (as in the "picking items" example) you should accumulate
+ * fractional click values from multiple messages until the total value
+ * reaches positive or negative one. This should represent a similar amount
+ * of scrolling as for a mouse that has a discrete mouse wheel.
+ */
+ struct PP_FloatPoint (*GetWheelTicks)(PP_Resource wheel_event);
+
+ /**
+ * Indicates if the scroll delta x/y indicates pages or lines to
+ * scroll by.
+ *
+ * @return PP_TRUE if the event is a wheel event and the user is scrolling
+ * by pages. PP_FALSE if not or if the resource is not a wheel event.
+ */
+ PP_Bool (*GetScrollByPage)(PP_Resource wheel_event);
+};
+
+struct PPB_KeyboardInputEvent {
+ /**
+ * Determines if a resource is a keyboard event.
+ *
+ * @return PP_TRUE if the given resource is a valid mouse input event.
+ */
+ PP_Bool (*IsKeyboardInputEvent)(PP_Resource resource);
+
+ /**
+ * Returns the DOM |keyCode| field for the keyboard event.
+ * Chrome populates this with the Windows-style Virtual Key code of the key.
+ */
+ uint32_t (*GetKeyCode)(PP_Resource key_event);
+
+ /**
+ * Returns the typed character for the given character event.
+ *
+ * @return A string var representing a single typed character for character
+ * input events. For non-character input events the return value will be an
+ * undefined var.
+ */
+ struct PP_Var (*GetCharacterText)(PP_Resource character_event);
+};
+
+#endif // PPAPI_C_PPB_INPUT_EVENT_H_