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