Home | History | Annotate | Download | only in thunk
      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 #include "ppapi/c/pp_errors.h"
      6 #include "ppapi/thunk/enter.h"
      7 #include "ppapi/thunk/ppb_input_event_api.h"
      8 #include "ppapi/thunk/ppb_instance_api.h"
      9 #include "ppapi/thunk/resource_creation_api.h"
     10 #include "ppapi/thunk/thunk.h"
     11 
     12 namespace ppapi {
     13 namespace thunk {
     14 
     15 namespace {
     16 
     17 typedef EnterResource<PPB_InputEvent_API> EnterInputEvent;
     18 
     19 // InputEvent ------------------------------------------------------------------
     20 
     21 int32_t RequestInputEvents(PP_Instance instance, uint32_t event_classes) {
     22   VLOG(4) << "PPB_InputEvent::RequestInputEvents()";
     23   EnterInstance enter(instance);
     24   if (enter.failed())
     25     return enter.retval();
     26   return enter.functions()->RequestInputEvents(instance, event_classes);
     27 }
     28 
     29 int32_t RequestFilteringInputEvents(PP_Instance instance,
     30                                     uint32_t event_classes) {
     31   VLOG(4) << "PPB_InputEvent::RequestFilteringInputEvents()";
     32   EnterInstance enter(instance);
     33   if (enter.failed())
     34     return enter.retval();
     35   return enter.functions()->RequestFilteringInputEvents(instance,
     36                                                         event_classes);
     37 }
     38 
     39 void ClearInputEventRequest(PP_Instance instance,
     40                             uint32_t event_classes) {
     41   VLOG(4) << "PPB_InputEvent::ClearInputEventRequest()";
     42   EnterInstance enter(instance);
     43   if (enter.succeeded())
     44     enter.functions()->ClearInputEventRequest(instance, event_classes);
     45 }
     46 
     47 PP_Bool IsInputEvent(PP_Resource resource) {
     48   VLOG(4) << "PPB_InputEvent::IsInputEvent()";
     49   EnterInputEvent enter(resource, false);
     50   return enter.succeeded() ? PP_TRUE : PP_FALSE;
     51 }
     52 
     53 PP_InputEvent_Type GetType(PP_Resource event) {
     54   VLOG(4) << "PPB_InputEvent::GetType()";
     55   EnterInputEvent enter(event, true);
     56   if (enter.failed())
     57     return PP_INPUTEVENT_TYPE_UNDEFINED;
     58   return enter.object()->GetType();
     59 }
     60 
     61 PP_TimeTicks GetTimeStamp(PP_Resource event) {
     62   VLOG(4) << "PPB_InputEvent::GetTimeStamp()";
     63   EnterInputEvent enter(event, true);
     64   if (enter.failed())
     65     return 0.0;
     66   return enter.object()->GetTimeStamp();
     67 }
     68 
     69 uint32_t GetModifiers(PP_Resource event) {
     70   VLOG(4) << "PPB_InputEvent::GetModifiers()";
     71   EnterInputEvent enter(event, true);
     72   if (enter.failed())
     73     return 0;
     74   return enter.object()->GetModifiers();
     75 }
     76 
     77 const PPB_InputEvent g_ppb_input_event_thunk = {
     78   &RequestInputEvents,
     79   &RequestFilteringInputEvents,
     80   &ClearInputEventRequest,
     81   &IsInputEvent,
     82   &GetType,
     83   &GetTimeStamp,
     84   &GetModifiers
     85 };
     86 
     87 // Mouse -----------------------------------------------------------------------
     88 
     89 PP_Resource CreateMouseInputEvent1_0(PP_Instance instance,
     90                                      PP_InputEvent_Type type,
     91                                      PP_TimeTicks time_stamp,
     92                                      uint32_t modifiers,
     93                                      PP_InputEvent_MouseButton mouse_button,
     94                                      const PP_Point* mouse_position,
     95                                      int32_t click_count) {
     96   VLOG(4) << "PPB_MouseInputEvent::Create()";
     97   EnterResourceCreation enter(instance);
     98   if (enter.failed())
     99     return 0;
    100 
    101   PP_Point mouse_movement = PP_MakePoint(0, 0);
    102   return enter.functions()->CreateMouseInputEvent(instance, type, time_stamp,
    103                                                   modifiers, mouse_button,
    104                                                   mouse_position, click_count,
    105                                                   &mouse_movement);
    106 }
    107 
    108 PP_Resource CreateMouseInputEvent1_1(PP_Instance instance,
    109                                      PP_InputEvent_Type type,
    110                                      PP_TimeTicks time_stamp,
    111                                      uint32_t modifiers,
    112                                      PP_InputEvent_MouseButton mouse_button,
    113                                      const PP_Point* mouse_position,
    114                                      int32_t click_count,
    115                                      const PP_Point* mouse_movement) {
    116   VLOG(4) << "PPB_MouseInputEvent::Create()";
    117   EnterResourceCreation enter(instance);
    118   if (enter.failed())
    119     return 0;
    120   return enter.functions()->CreateMouseInputEvent(instance, type, time_stamp,
    121                                                   modifiers, mouse_button,
    122                                                   mouse_position, click_count,
    123                                                   mouse_movement);
    124 }
    125 
    126 PP_Bool IsMouseInputEvent(PP_Resource resource) {
    127   VLOG(4) << "PPB_MouseInputEvent::IsMouseInputEvent()";
    128   if (!IsInputEvent(resource))
    129     return PP_FALSE;  // Prevent warning log in GetType.
    130   PP_InputEvent_Type type = GetType(resource);
    131   return PP_FromBool(type == PP_INPUTEVENT_TYPE_MOUSEDOWN ||
    132                      type == PP_INPUTEVENT_TYPE_MOUSEUP ||
    133                      type == PP_INPUTEVENT_TYPE_MOUSEMOVE ||
    134                      type == PP_INPUTEVENT_TYPE_MOUSEENTER ||
    135                      type == PP_INPUTEVENT_TYPE_MOUSELEAVE ||
    136                      type == PP_INPUTEVENT_TYPE_CONTEXTMENU);
    137 }
    138 
    139 PP_InputEvent_MouseButton GetMouseButton(PP_Resource mouse_event) {
    140   VLOG(4) << "PPB_MouseInputEvent::GetButton()";
    141   EnterInputEvent enter(mouse_event, true);
    142   if (enter.failed())
    143     return PP_INPUTEVENT_MOUSEBUTTON_NONE;
    144   return enter.object()->GetMouseButton();
    145 }
    146 
    147 PP_Point GetMousePosition(PP_Resource mouse_event) {
    148   VLOG(4) << "PPB_MouseInputEvent::GetPosition()";
    149   EnterInputEvent enter(mouse_event, true);
    150   if (enter.failed())
    151     return PP_MakePoint(0, 0);
    152   return enter.object()->GetMousePosition();
    153 }
    154 
    155 int32_t GetMouseClickCount(PP_Resource mouse_event) {
    156   VLOG(4) << "PPB_MouseInputEvent::GetClickCount()";
    157   EnterInputEvent enter(mouse_event, true);
    158   if (enter.failed())
    159     return 0;
    160   return enter.object()->GetMouseClickCount();
    161 }
    162 
    163 PP_Point GetMouseMovement(PP_Resource mouse_event) {
    164   VLOG(4) << "PPB_MouseInputEvent::GetMovement()";
    165   EnterInputEvent enter(mouse_event, true);
    166   if (enter.failed())
    167     return PP_MakePoint(0, 0);
    168   return enter.object()->GetMouseMovement();
    169 }
    170 
    171 const PPB_MouseInputEvent_1_0 g_ppb_mouse_input_event_1_0_thunk = {
    172   &CreateMouseInputEvent1_0,
    173   &IsMouseInputEvent,
    174   &GetMouseButton,
    175   &GetMousePosition,
    176   &GetMouseClickCount
    177 };
    178 
    179 const PPB_MouseInputEvent g_ppb_mouse_input_event_1_1_thunk = {
    180   &CreateMouseInputEvent1_1,
    181   &IsMouseInputEvent,
    182   &GetMouseButton,
    183   &GetMousePosition,
    184   &GetMouseClickCount,
    185   &GetMouseMovement
    186 };
    187 
    188 // Wheel -----------------------------------------------------------------------
    189 
    190 PP_Resource CreateWheelInputEvent(PP_Instance instance,
    191                                   PP_TimeTicks time_stamp,
    192                                   uint32_t modifiers,
    193                                   const PP_FloatPoint* wheel_delta,
    194                                   const PP_FloatPoint* wheel_ticks,
    195                                   PP_Bool scroll_by_page) {
    196   VLOG(4) << "PPB_WheelInputEvent::Create()";
    197   EnterResourceCreation enter(instance);
    198   if (enter.failed())
    199     return 0;
    200   return enter.functions()->CreateWheelInputEvent(instance, time_stamp,
    201                                                   modifiers, wheel_delta,
    202                                                   wheel_ticks, scroll_by_page);
    203 }
    204 
    205 PP_Bool IsWheelInputEvent(PP_Resource resource) {
    206   VLOG(4) << "PPB_WheelInputEvent::IsWheelInputEvent()";
    207   if (!IsInputEvent(resource))
    208     return PP_FALSE;  // Prevent warning log in GetType.
    209   PP_InputEvent_Type type = GetType(resource);
    210   return PP_FromBool(type == PP_INPUTEVENT_TYPE_WHEEL);
    211 }
    212 
    213 PP_FloatPoint GetWheelDelta(PP_Resource wheel_event) {
    214   VLOG(4) << "PPB_WheelInputEvent::GetDelta()";
    215   EnterInputEvent enter(wheel_event, true);
    216   if (enter.failed())
    217     return PP_MakeFloatPoint(0.0f, 0.0f);
    218   return enter.object()->GetWheelDelta();
    219 }
    220 
    221 PP_FloatPoint GetWheelTicks(PP_Resource wheel_event) {
    222   VLOG(4) << "PPB_WheelInputEvent::GetTicks()";
    223   EnterInputEvent enter(wheel_event, true);
    224   if (enter.failed())
    225     return PP_MakeFloatPoint(0.0f, 0.0f);
    226   return enter.object()->GetWheelTicks();
    227 }
    228 
    229 PP_Bool GetWheelScrollByPage(PP_Resource wheel_event) {
    230   VLOG(4) << "PPB_WheelInputEvent::GetScrollByPage()";
    231   EnterInputEvent enter(wheel_event, true);
    232   if (enter.failed())
    233     return PP_FALSE;
    234   return enter.object()->GetWheelScrollByPage();
    235 }
    236 
    237 const PPB_WheelInputEvent g_ppb_wheel_input_event_thunk = {
    238   &CreateWheelInputEvent,
    239   &IsWheelInputEvent,
    240   &GetWheelDelta,
    241   &GetWheelTicks,
    242   &GetWheelScrollByPage
    243 };
    244 
    245 // Keyboard --------------------------------------------------------------------
    246 
    247 PP_Resource CreateKeyboardInputEvent(PP_Instance instance,
    248                                      PP_InputEvent_Type type,
    249                                      PP_TimeTicks time_stamp,
    250                                      uint32_t modifiers,
    251                                      uint32_t key_code,
    252                                      struct PP_Var character_text) {
    253   VLOG(4) << "PPB_KeyboardInputEvent::Create()";
    254   EnterResourceCreation enter(instance);
    255   if (enter.failed())
    256     return 0;
    257   return enter.functions()->CreateKeyboardInputEvent(instance, type, time_stamp,
    258                                                      modifiers, key_code,
    259                                                      character_text);
    260 }
    261 
    262 PP_Bool IsKeyboardInputEvent(PP_Resource resource) {
    263   VLOG(4) << "PPB_KeyboardInputEvent::IsKeyboardInputEvent()";
    264   if (!IsInputEvent(resource))
    265     return PP_FALSE;  // Prevent warning log in GetType.
    266   PP_InputEvent_Type type = GetType(resource);
    267   return PP_FromBool(type == PP_INPUTEVENT_TYPE_KEYDOWN ||
    268                      type == PP_INPUTEVENT_TYPE_KEYUP ||
    269                      type == PP_INPUTEVENT_TYPE_RAWKEYDOWN ||
    270                      type == PP_INPUTEVENT_TYPE_CHAR);
    271 }
    272 
    273 uint32_t GetKeyCode(PP_Resource key_event) {
    274   VLOG(4) << "PPB_KeyboardInputEvent::GetKeyCode()";
    275   EnterInputEvent enter(key_event, true);
    276   if (enter.failed())
    277     return 0;
    278   return enter.object()->GetKeyCode();
    279 }
    280 
    281 PP_Var GetCharacterText(PP_Resource character_event) {
    282   VLOG(4) << "PPB_KeyboardInputEvent::GetCharacterText()";
    283   EnterInputEvent enter(character_event, true);
    284   if (enter.failed())
    285     return PP_MakeUndefined();
    286   return enter.object()->GetCharacterText();
    287 }
    288 
    289 const PPB_KeyboardInputEvent g_ppb_keyboard_input_event_thunk = {
    290   &CreateKeyboardInputEvent,
    291   &IsKeyboardInputEvent,
    292   &GetKeyCode,
    293   &GetCharacterText
    294 };
    295 
    296 // _Dev interface.
    297 
    298 PP_Bool SetUsbKeyCode(PP_Resource key_event, uint32_t usb_key_code) {
    299   VLOG(4) << "PPB_KeyboardInputEvent_Dev::SetUsbKeyCode()";
    300   EnterInputEvent enter(key_event, true);
    301   if (enter.failed())
    302     return PP_FALSE;
    303   return enter.object()->SetUsbKeyCode(usb_key_code);
    304 }
    305 
    306 uint32_t GetUsbKeyCode(PP_Resource key_event) {
    307   VLOG(4) << "PPB_KeyboardInputEvent_Dev::GetUsbKeyCode()";
    308   EnterInputEvent enter(key_event, true);
    309   if (enter.failed())
    310     return 0;
    311   return enter.object()->GetUsbKeyCode();
    312 }
    313 
    314 const PPB_KeyboardInputEvent_Dev g_ppb_keyboard_input_event_dev_thunk = {
    315   &SetUsbKeyCode,
    316   &GetUsbKeyCode,
    317 };
    318 
    319 // Composition -----------------------------------------------------------------
    320 
    321 PP_Resource CreateIMEInputEvent(PP_Instance instance,
    322                                 PP_InputEvent_Type type,
    323                                 PP_TimeTicks time_stamp,
    324                                 PP_Var text,
    325                                 uint32_t segment_number,
    326                                 const uint32_t segment_offsets[],
    327                                 int32_t target_segment,
    328                                 uint32_t selection_start,
    329                                 uint32_t selection_end) {
    330   VLOG(4) << "PPB_IMEInputEvent_Dev::Create()";
    331   EnterResourceCreation enter(instance);
    332   if (enter.failed())
    333     return 0;
    334   return enter.functions()->CreateIMEInputEvent(instance, type, time_stamp,
    335                                                 text, segment_number,
    336                                                 segment_offsets,
    337                                                 target_segment,
    338                                                 selection_start,
    339                                                 selection_end);
    340 }
    341 
    342 PP_Bool IsIMEInputEvent(PP_Resource resource) {
    343   VLOG(4) << "PPB_IMEInputEvent_Dev::IsIMEInputEvent()";
    344   if (!IsInputEvent(resource))
    345     return PP_FALSE;  // Prevent warning log in GetType.
    346   PP_InputEvent_Type type = GetType(resource);
    347   return PP_FromBool(type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_START ||
    348                      type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE ||
    349                      type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_END ||
    350                      type == PP_INPUTEVENT_TYPE_IME_TEXT);
    351 }
    352 
    353 PP_Var GetIMEText(PP_Resource ime_event) {
    354   VLOG(4) << "PPB_IMEInputEvent_Dev::GetText()";
    355   return GetCharacterText(ime_event);
    356 }
    357 
    358 uint32_t GetIMESegmentNumber(PP_Resource ime_event) {
    359   VLOG(4) << "PPB_IMEInputEvent_Dev::GetSegmentNumber()";
    360   EnterInputEvent enter(ime_event, true);
    361   if (enter.failed())
    362     return 0;
    363   return enter.object()->GetIMESegmentNumber();
    364 }
    365 
    366 uint32_t GetIMESegmentOffset(PP_Resource ime_event, uint32_t index) {
    367   VLOG(4) << "PPB_IMEInputEvent_Dev::GetSegmentOffset()";
    368   EnterInputEvent enter(ime_event, true);
    369   if (enter.failed())
    370     return 0;
    371   return enter.object()->GetIMESegmentOffset(index);
    372 }
    373 
    374 int32_t GetIMETargetSegment(PP_Resource ime_event) {
    375   VLOG(4) << "PPB_IMEInputEvent_Dev::GetTargetSegment()";
    376   EnterInputEvent enter(ime_event, true);
    377   if (enter.failed())
    378     return -1;
    379   return enter.object()->GetIMETargetSegment();
    380 }
    381 
    382 void GetIMESelection(PP_Resource ime_event, uint32_t* start, uint32_t* end) {
    383   VLOG(4) << "PPB_IMEInputEvent_Dev::GetSelection()";
    384   EnterInputEvent enter(ime_event, true);
    385   if (enter.failed()) {
    386     if (start)
    387       *start = 0;
    388     if (end)
    389       *end = 0;
    390     return;
    391   }
    392   enter.object()->GetIMESelection(start, end);
    393 }
    394 
    395 const PPB_IMEInputEvent_Dev_0_1 g_ppb_ime_input_event_0_1_thunk = {
    396   &IsIMEInputEvent,
    397   &GetIMEText,
    398   &GetIMESegmentNumber,
    399   &GetIMESegmentOffset,
    400   &GetIMETargetSegment,
    401   &GetIMESelection
    402 };
    403 
    404 const PPB_IMEInputEvent_Dev_0_2 g_ppb_ime_input_event_0_2_thunk = {
    405   &CreateIMEInputEvent,
    406   &IsIMEInputEvent,
    407   &GetIMEText,
    408   &GetIMESegmentNumber,
    409   &GetIMESegmentOffset,
    410   &GetIMETargetSegment,
    411   &GetIMESelection
    412 };
    413 
    414 const PPB_IMEInputEvent_1_0 g_ppb_ime_input_event_1_0_thunk = {
    415   &CreateIMEInputEvent,
    416   &IsIMEInputEvent,
    417   &GetIMEText,
    418   &GetIMESegmentNumber,
    419   &GetIMESegmentOffset,
    420   &GetIMETargetSegment,
    421   &GetIMESelection
    422 };
    423 
    424 // Touch -----------------------------------------------------------------------
    425 
    426 PP_Resource CreateTouchInputEvent(PP_Instance instance,
    427                                   PP_InputEvent_Type type,
    428                                   PP_TimeTicks time_stamp,
    429                                   uint32_t modifiers) {
    430   VLOG(4) << "PPB_TouchInputEvent::Create()";
    431   EnterResourceCreation enter(instance);
    432   if (enter.failed())
    433     return 0;
    434   return enter.functions()->CreateTouchInputEvent(instance, type, time_stamp,
    435                                                   modifiers);
    436 }
    437 
    438 void AddTouchPoint(PP_Resource touch_event,
    439                    PP_TouchListType list,
    440                    const PP_TouchPoint* point) {
    441   VLOG(4) << "PPB_TouchInputEvent::AddTouchPoint()";
    442   EnterInputEvent enter(touch_event, true);
    443   if (enter.failed())
    444     return;
    445   return enter.object()->AddTouchPoint(list, *point);
    446 }
    447 
    448 PP_Bool IsTouchInputEvent(PP_Resource resource) {
    449   VLOG(4) << "PPB_TouchInputEvent::IsTouchInputEvent()";
    450   if (!IsInputEvent(resource))
    451     return PP_FALSE;  // Prevent warning log in GetType.
    452   PP_InputEvent_Type type = GetType(resource);
    453   return PP_FromBool(type == PP_INPUTEVENT_TYPE_TOUCHSTART ||
    454                      type == PP_INPUTEVENT_TYPE_TOUCHMOVE ||
    455                      type == PP_INPUTEVENT_TYPE_TOUCHEND ||
    456                      type == PP_INPUTEVENT_TYPE_TOUCHCANCEL);
    457 }
    458 
    459 uint32_t GetTouchCount(PP_Resource touch_event, PP_TouchListType list) {
    460   VLOG(4) << "PPB_TouchInputEvent::GetTouchCount()";
    461   EnterInputEvent enter(touch_event, true);
    462   if (enter.failed())
    463     return 0;
    464   return enter.object()->GetTouchCount(list);
    465 }
    466 
    467 struct PP_TouchPoint GetTouchByIndex(PP_Resource touch_event,
    468                                      PP_TouchListType list,
    469                                      uint32_t index) {
    470   VLOG(4) << "PPB_TouchInputEvent::GetTouchByIndex()";
    471   EnterInputEvent enter(touch_event, true);
    472   if (enter.failed())
    473     return PP_MakeTouchPoint();
    474   return enter.object()->GetTouchByIndex(list, index);
    475 }
    476 
    477 struct PP_TouchPoint GetTouchById(PP_Resource touch_event,
    478                                   PP_TouchListType list,
    479                                   uint32_t id) {
    480   VLOG(4) << "PPB_TouchInputEvent::GetTouchById()";
    481   EnterInputEvent enter(touch_event, true);
    482   if (enter.failed())
    483     return PP_MakeTouchPoint();
    484   return enter.object()->GetTouchById(list, id);
    485 }
    486 
    487 const PPB_TouchInputEvent_1_0 g_ppb_touch_input_event_thunk = {
    488   &CreateTouchInputEvent,
    489   &AddTouchPoint,
    490   &IsTouchInputEvent,
    491   &GetTouchCount,
    492   &GetTouchByIndex,
    493   &GetTouchById
    494 };
    495 
    496 }  // namespace
    497 
    498 const PPB_InputEvent_1_0* GetPPB_InputEvent_1_0_Thunk() {
    499   return &g_ppb_input_event_thunk;
    500 }
    501 
    502 const PPB_MouseInputEvent_1_0* GetPPB_MouseInputEvent_1_0_Thunk() {
    503   return &g_ppb_mouse_input_event_1_0_thunk;
    504 }
    505 
    506 const PPB_MouseInputEvent_1_1* GetPPB_MouseInputEvent_1_1_Thunk() {
    507   return &g_ppb_mouse_input_event_1_1_thunk;
    508 }
    509 
    510 const PPB_KeyboardInputEvent_1_0* GetPPB_KeyboardInputEvent_1_0_Thunk() {
    511   return &g_ppb_keyboard_input_event_thunk;
    512 }
    513 
    514 const PPB_KeyboardInputEvent_Dev_0_1*
    515     GetPPB_KeyboardInputEvent_Dev_0_1_Thunk() {
    516   return &g_ppb_keyboard_input_event_dev_thunk;
    517 }
    518 
    519 const PPB_WheelInputEvent_1_0* GetPPB_WheelInputEvent_1_0_Thunk() {
    520   return &g_ppb_wheel_input_event_thunk;
    521 }
    522 
    523 const PPB_IMEInputEvent_Dev_0_1* GetPPB_IMEInputEvent_Dev_0_1_Thunk() {
    524   return &g_ppb_ime_input_event_0_1_thunk;
    525 }
    526 
    527 const PPB_IMEInputEvent_Dev_0_2* GetPPB_IMEInputEvent_Dev_0_2_Thunk() {
    528   return &g_ppb_ime_input_event_0_2_thunk;
    529 }
    530 
    531 const PPB_IMEInputEvent_1_0* GetPPB_IMEInputEvent_1_0_Thunk() {
    532   return &g_ppb_ime_input_event_1_0_thunk;
    533 }
    534 
    535 const PPB_TouchInputEvent_1_0* GetPPB_TouchInputEvent_1_0_Thunk() {
    536   return &g_ppb_touch_input_event_thunk;
    537 }
    538 
    539 }  // namespace thunk
    540 }  // namespace ppapi
    541