event_utils.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int RegisterCustomEventType() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ++g_custom_event_types;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta EventTimeForNow() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::TimeDelta::FromInternalValue(
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks::Now().ToInternalValue());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ShouldDefaultToNaturalScroll() {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetInternalDisplayTouchSupport() ==
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Display::TOUCH_SUPPORT_AVAILABLE;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Display::TouchSupport GetInternalDisplayTouchSupport() {
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Screen* screen = gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // No screen in some unit tests.
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!screen)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return gfx::Display::TOUCH_SUPPORT_UNKNOWN;
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const std::vector<gfx::Display>& displays = screen->GetAllDisplays();
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<gfx::Display>::const_iterator it = displays.begin();
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       it != displays.end(); ++it) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (it->IsInternal())
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return it->touch_support();
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return gfx::Display::TOUCH_SUPPORT_UNAVAILABLE;
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
95