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