15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <vector>
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/display.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/screen.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int g_custom_event_types = ET_LAST;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<Event> EventFromNative(const base::NativeEvent& native_event) {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Event> event;
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EventType type = EventTypeFromNative(native_event);
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch(type) {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_PRESSED:
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_RELEASED:
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event.reset(new KeyEvent(native_event));
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_PRESS:
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_RELEASE:
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // These should not be generated by native events.
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_PRESSED:
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_DRAGGED:
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_RELEASED:
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_MOVED:
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_ENTERED:
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSE_EXITED:
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event.reset(new MouseEvent(native_event));
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_MOUSEWHEEL:
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event.reset(new MouseWheelEvent(native_event));
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_SCROLL_FLING_START:
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_SCROLL_FLING_CANCEL:
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_SCROLL:
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event.reset(new ScrollEvent(native_event));
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TOUCH_RELEASED:
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TOUCH_PRESSED:
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TOUCH_MOVED:
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TOUCH_CANCELLED:
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event.reset(new TouchEvent(native_event));
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return event.Pass();
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// From third_party/WebKit/Source/web/gtk/WebInputEventFactory.cpp:
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::char16 GetControlCharacterForKeycode(int windows_key_code, bool shift) {
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (windows_key_code >= ui::VKEY_A &&
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    windows_key_code <= ui::VKEY_Z) {
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return windows_key_code - ui::VKEY_A + 1;
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (shift) {
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // following graphics chars require shift key to input.
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    switch (windows_key_code) {
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-@ maps to \x00 (Null byte)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_2:
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0;
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-^ maps to \x1E (Record separator, Information separator two)
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_6:
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x1E;
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-_ maps to \x1F (Unit separator, Information separator one)
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_OEM_MINUS:
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x1F;
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // Returns 0 for all other keys to avoid inputting unexpected chars.
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      default:
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        break;
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  } else {
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    switch (windows_key_code) {
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-[ maps to \x1B (Escape)
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_OEM_4:
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x1B;
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-\ maps to \x1C (File separator, Information separator four)
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_OEM_5:
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x1C;
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-] maps to \x1D (Group separator, Information separator three)
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_OEM_6:
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x1D;
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // ctrl-Enter maps to \x0A (Line feed)
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      case ui::VKEY_RETURN:
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return 0x0A;
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // Returns 0 for all other keys to avoid inputting unexpected chars.
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      default:
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        break;
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return 0;
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int RegisterCustomEventType() {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ++g_custom_event_types;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta EventTimeForNow() {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::TimeDelta::FromInternalValue(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks::Now().ToInternalValue());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ShouldDefaultToNaturalScroll() {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetInternalDisplayTouchSupport() ==
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Display::TOUCH_SUPPORT_AVAILABLE;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Display::TouchSupport GetInternalDisplayTouchSupport() {
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Screen* screen = gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // No screen in some unit tests.
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!screen)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return gfx::Display::TOUCH_SUPPORT_UNKNOWN;
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const std::vector<gfx::Display>& displays = screen->GetAllDisplays();
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<gfx::Display>::const_iterator it = displays.begin();
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       it != displays.end(); ++it) {
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (it->IsInternal())
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return it->touch_support();
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return gfx::Display::TOUCH_SUPPORT_UNAVAILABLE;
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
140