// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Module Overview: Starboard Input module
//
// Defines input events and associated data types.

#ifndef STARBOARD_INPUT_H_
#define STARBOARD_INPUT_H_

#include "starboard/configuration.h"
#include "starboard/export.h"
#include "starboard/key.h"
#include "starboard/types.h"
#include "starboard/window.h"

#ifdef __cplusplus
extern "C" {
#endif

// Identifies possible input subsystem types. The types of events that each
// device type produces correspond to |SbInputEventType| values.
typedef enum SbInputDeviceType {
  // Input from a gesture-detection mechanism. Examples include Kinect,
  // Wiimotes, LG Magic Remotes, etc...
  //
  // Produces |Move|, |Grab|, |Ungrab|, |Press| and |Unpress| events.
  kSbInputDeviceTypeGesture,

  // Input from a gamepad, following the layout provided in the W3C Web Gamepad
  // API. [https://www.w3.org/TR/gamepad/]
  //
  // Produces |Move|, |Press| and |Unpress| events.
  kSbInputDeviceTypeGamepad,

  // Keyboard input from a traditional keyboard or game controller chatpad.
  //
  // Produces |Press| and |Unpress| events.
  kSbInputDeviceTypeKeyboard,

  // Input from a microphone that would provide audio data to the caller, who
  // may then find some way to detect speech or other sounds within it. It may
  // have processed or filtered the audio in some way before it arrives.
  //
  // Produces |Audio| events.
  kSbInputDeviceTypeMicrophone,

  // Input from a traditional mouse.
  //
  // Produces |Move|, |Press|, and |Unpress| events.
  kSbInputDeviceTypeMouse,

  // Input from a TV remote-control-style device.
  //
  // Produces |Press| and |Unpress| events.
  kSbInputDeviceTypeRemote,

  // Input from a speech command analyzer, which is some hardware or software
  // that, given a set of known phrases, activates when one of the registered
  // phrases is heard.
  //
  // Produces |Command| events.
  kSbInputDeviceTypeSpeechCommand,

  // Input from a single- or multi-touchscreen.
  //
  // Produces |Move|, |Press|, and |Unpress| events.
  kSbInputDeviceTypeTouchScreen,

  // Input from a touchpad that is not masquerading as a mouse.
  //
  // Produces |Move|, |Press|, and |Unpress| events.
  kSbInputDeviceTypeTouchPad,
} SbInputDeviceType;

// The action that an input event represents.
typedef enum SbInputEventType {
  // Receipt of Audio. Some audio data was received by the input microphone.
  kSbInputEventTypeAudio,

  // Receipt of a command. A command was received from some semantic source,
  // like a speech recognizer.
  kSbInputEventTypeCommand,

  // Grab activation. This event type is deprecated.
  kSbInputEventTypeGrab,

  // Device Movement. In the case of |Mouse|, and perhaps |Gesture|, the
  // movement tracks an absolute cursor position. In the case of |TouchPad|,
  // only relative movements are provided.
  kSbInputEventTypeMove,

  // Key or button press activation. This could be a key on a keyboard, a
  // button on a mouse or game controller, a push from a touch screen, or
  // a gesture. An |Unpress| event is subsequently delivered when the
  // |Press| event terminates, such as when the key/button/finger is raised.
  // Injecting repeat presses is up to the client.
  kSbInputEventTypePress,

  // Grab deactivation. This event type is deprecated.
  kSbInputEventTypeUngrab,

  // Key or button deactivation. The counterpart to the |Press| event, this
  // event is sent when the key or button being pressed is released.
  kSbInputEventTypeUnpress,
} SbInputEventType;

// A 2-dimensional vector used to represent points and motion vectors.
typedef struct SbInputVector {
  int x;
  int y;
} SbInputVector;

// Event data for |kSbEventTypeInput| events.
typedef struct SbInputData {
  // The window in which the input was generated.
  SbWindow window;

  // The type of input event that this represents.
  SbInputEventType type;

  // The type of device that generated this input event.
  SbInputDeviceType device_type;

  // An identifier that is unique among all connected devices.
  int device_id;

  // An identifier that indicates which keyboard key or mouse button was
  // involved in this event, if any. All known keys for all devices are mapped
  // to a single ID space, defined by the |SbKey| enum in |key.h|.
  SbKey key;

  // The character that corresponds to the key. For an external keyboard, this
  // character also depends on the keyboard language. The value is |0| if there
  // is no corresponding character.
  wchar_t character;

  // The location of the specified key, in cases where there are multiple
  // instances of the button on the keyboard. For example, some keyboards
  // have more than one "shift" key.
  SbKeyLocation key_location;

  // Key modifiers (e.g. |Ctrl|, |Shift|) held down during this input event.
  unsigned int key_modifiers;

  // The (x, y) coordinates of the persistent cursor controlled by this
  // device. The value is |0| if this data is not applicable.
  SbInputVector position;

  // The relative motion vector of this input. The value is |0| if this data
  // is not applicable.
  SbInputVector delta;
} SbInputData;

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // STARBOARD_INPUT_H_
