Index: ui/events/platform/x11/platform_event_utils_x11.cc |
diff --git a/ui/events/platform/x11/platform_event_utils_x11.cc b/ui/events/platform/x11/platform_event_utils_x11.cc |
deleted file mode 100644 |
index 056dc26ce3400b5a7774dd989ff4bd11c271afb5..0000000000000000000000000000000000000000 |
--- a/ui/events/platform/x11/platform_event_utils_x11.cc |
+++ /dev/null |
@@ -1,832 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/events/platform/platform_event_utils.h" |
- |
-#include <string.h> |
-#include <X11/extensions/XInput.h> |
-#include <X11/extensions/XInput2.h> |
-#include <X11/XKBlib.h> |
-#include <X11/Xlib.h> |
-#include <X11/Xutil.h> |
-#include <cmath> |
- |
-#include "base/logging.h" |
-#include "base/memory/singleton.h" |
-#include "ui/events/event.h" |
-#include "ui/events/event_constants.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/events/platform/x11/device_data_manager_x11.h" |
-#include "ui/events/platform/x11/device_list_cache_x.h" |
-#include "ui/events/platform/x11/keyboard_code_conversion_x11.h" |
-#include "ui/events/platform/x11/touch_factory_x11.h" |
-#include "ui/gfx/display.h" |
-#include "ui/gfx/point.h" |
-#include "ui/gfx/rect.h" |
-#include "ui/gfx/x/x11_atom_cache.h" |
-#include "ui/gfx/x/x11_types.h" |
- |
-namespace { |
- |
-// Scroll amount for each wheelscroll event. 53 is also the value used for GTK+. |
-const int kWheelScrollAmount = 53; |
- |
-const int kMinWheelButton = 4; |
-const int kMaxWheelButton = 7; |
- |
-// A class to track current modifier state on master device. Only track ctrl, |
-// alt, shift and caps lock keys currently. The tracked state can then be used |
-// by floating device. |
-class XModifierStateWatcher { |
- public: |
- static XModifierStateWatcher* GetInstance() { |
- return Singleton<XModifierStateWatcher>::get(); |
- } |
- |
- int StateFromKeyboardCode(ui::KeyboardCode keyboard_code) { |
- switch (keyboard_code) { |
- case ui::VKEY_CONTROL: |
- return ControlMask; |
- case ui::VKEY_SHIFT: |
- return ShiftMask; |
- case ui::VKEY_MENU: |
- return Mod1Mask; |
- case ui::VKEY_CAPITAL: |
- return LockMask; |
- default: |
- return 0; |
- } |
- } |
- |
- void UpdateStateFromXEvent(const base::NativeEvent& native_event) { |
- ui::KeyboardCode keyboard_code = ui::KeyboardCodeFromNative(native_event); |
- unsigned int mask = StateFromKeyboardCode(keyboard_code); |
- // Floating device can't access the modifer state from master device. |
- // We need to track the states of modifier keys in a singleton for |
- // floating devices such as touch screen. Issue 106426 is one example |
- // of why we need the modifier states for floating device. |
- switch (native_event->type) { |
- case KeyPress: |
- state_ = native_event->xkey.state | mask; |
- break; |
- case KeyRelease: |
- state_ = native_event->xkey.state & ~mask; |
- break; |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- switch (xievent->evtype) { |
- case XI_KeyPress: |
- state_ = xievent->mods.effective |= mask; |
- break; |
- case XI_KeyRelease: |
- state_ = xievent->mods.effective &= ~mask; |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- break; |
- } |
- default: |
- NOTREACHED(); |
- break; |
- } |
- } |
- |
- // Returns the current modifer state in master device. It only contains the |
- // state of ctrl, shift, alt and caps lock keys. |
- unsigned int state() { return state_; } |
- |
- private: |
- friend struct DefaultSingletonTraits<XModifierStateWatcher>; |
- |
- XModifierStateWatcher() : state_(0) {} |
- |
- unsigned int state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); |
-}; |
- |
-#if defined(USE_XI2_MT) |
-// Detects if a touch event is a driver-generated 'special event'. |
-// A 'special event' is a touch event with maximum radius and pressure at |
-// location (0, 0). |
-// This needs to be done in a cleaner way: http://crbug.com/169256 |
-bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { |
- XIDeviceEvent* event = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- CHECK(event->evtype == XI_TouchBegin || event->evtype == XI_TouchUpdate || |
- event->evtype == XI_TouchEnd); |
- |
- // Force is normalized to [0, 1]. |
- if (ui::GetTouchForce(native_event) < 1.0f) |
- return false; |
- |
- if (ui::EventLocationFromNative(native_event) != gfx::Point()) |
- return false; |
- |
- // Radius is in pixels, and the valuator is the diameter in pixels. |
- double radius = ui::GetTouchRadiusX(native_event), min, max; |
- unsigned int deviceid = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; |
- if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
- deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { |
- return false; |
- } |
- |
- return radius * 2 == max; |
-} |
-#endif |
- |
-int GetEventFlagsFromXState(unsigned int state) { |
- int flags = 0; |
- if (state & ControlMask) |
- flags |= ui::EF_CONTROL_DOWN; |
- if (state & ShiftMask) |
- flags |= ui::EF_SHIFT_DOWN; |
- if (state & Mod1Mask) |
- flags |= ui::EF_ALT_DOWN; |
- if (state & LockMask) |
- flags |= ui::EF_CAPS_LOCK_DOWN; |
- if (state & Mod3Mask) |
- flags |= ui::EF_MOD3_DOWN; |
- if (state & Mod4Mask) |
- flags |= ui::EF_COMMAND_DOWN; |
- if (state & Mod5Mask) |
- flags |= ui::EF_ALTGR_DOWN; |
- if (state & Button1Mask) |
- flags |= ui::EF_LEFT_MOUSE_BUTTON; |
- if (state & Button2Mask) |
- flags |= ui::EF_MIDDLE_MOUSE_BUTTON; |
- if (state & Button3Mask) |
- flags |= ui::EF_RIGHT_MOUSE_BUTTON; |
- return flags; |
-} |
- |
-int GetEventFlagsFromXKeyEvent(XEvent* xevent) { |
- DCHECK(xevent->type == KeyPress || xevent->type == KeyRelease); |
- |
-#if defined(OS_CHROMEOS) |
- const int ime_fabricated_flag = 0; |
-#else |
- // XIM fabricates key events for the character compositions by XK_Multi_key. |
- // For example, when a user hits XK_Multi_key, XK_apostrophe, and XK_e in |
- // order to input "é", then XIM generates a key event with keycode=0 and |
- // state=0 for the composition, and the sequence of X11 key events will be |
- // XK_Multi_key, XK_apostrophe, **NoSymbol**, and XK_e. If the user used |
- // shift key and/or caps lock key, state can be ShiftMask, LockMask or both. |
- // |
- // We have to send these fabricated key events to XIM so it can correctly |
- // handle the character compositions. |
- const unsigned int shift_lock_mask = ShiftMask | LockMask; |
- const bool fabricated_by_xim = |
- xevent->xkey.keycode == 0 && (xevent->xkey.state & ~shift_lock_mask) == 0; |
- const int ime_fabricated_flag = |
- fabricated_by_xim ? ui::EF_IME_FABRICATED_KEY : 0; |
-#endif |
- |
- return GetEventFlagsFromXState(xevent->xkey.state) | |
- (xevent->xkey.send_event ? ui::EF_FINAL : 0) | |
- (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY |
- : 0) | |
- (IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_FUNCTION_KEY |
- : 0) | |
- ime_fabricated_flag; |
-} |
- |
-int GetEventFlagsFromXGenericEvent(XEvent* xevent) { |
- DCHECK(xevent->type == GenericEvent); |
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); |
- DCHECK((xievent->evtype == XI_KeyPress) || |
- (xievent->evtype == XI_KeyRelease)); |
- return GetEventFlagsFromXState(xievent->mods.effective) | |
- (xevent->xkey.send_event ? ui::EF_FINAL : 0) | |
- (IsKeypadKey( |
- XkbKeycodeToKeysym(xievent->display, xievent->detail, 0, 0)) |
- ? ui::EF_NUMPAD_KEY |
- : 0); |
-} |
- |
-// Get the event flag for the button in XButtonEvent. During a ButtonPress |
-// event, |state| in XButtonEvent does not include the button that has just been |
-// pressed. Instead |state| contains flags for the buttons (if any) that had |
-// already been pressed before the current button, and |button| stores the most |
-// current pressed button. So, if you press down left mouse button, and while |
-// pressing it down, press down the right mouse button, then for the latter |
-// event, |state| would have Button1Mask set but not Button3Mask, and |button| |
-// would be 3. |
-int GetEventFlagsForButton(int button) { |
- switch (button) { |
- case 1: |
- return ui::EF_LEFT_MOUSE_BUTTON; |
- case 2: |
- return ui::EF_MIDDLE_MOUSE_BUTTON; |
- case 3: |
- return ui::EF_RIGHT_MOUSE_BUTTON; |
- default: |
- return 0; |
- } |
-} |
- |
-int GetButtonMaskForX2Event(XIDeviceEvent* xievent) { |
- int buttonflags = 0; |
- for (int i = 0; i < 8 * xievent->buttons.mask_len; i++) { |
- if (XIMaskIsSet(xievent->buttons.mask, i)) { |
- int button = |
- (xievent->sourceid == xievent->deviceid) |
- ? ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) |
- : i; |
- buttonflags |= GetEventFlagsForButton(button); |
- } |
- } |
- return buttonflags; |
-} |
- |
-ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { |
- XIDeviceEvent* event = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
-#if defined(USE_XI2_MT) |
- switch (event->evtype) { |
- case XI_TouchBegin: |
- return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN |
- : ui::ET_TOUCH_PRESSED; |
- case XI_TouchUpdate: |
- return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN |
- : ui::ET_TOUCH_MOVED; |
- case XI_TouchEnd: |
- return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED |
- : ui::ET_TOUCH_RELEASED; |
- } |
-#endif // defined(USE_XI2_MT) |
- |
- DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); |
- switch (event->evtype) { |
- case XI_ButtonPress: |
- return ui::ET_TOUCH_PRESSED; |
- case XI_ButtonRelease: |
- return ui::ET_TOUCH_RELEASED; |
- case XI_Motion: |
- // Should not convert any emulated Motion event from touch device to |
- // touch event. |
- if (!(event->flags & XIPointerEmulated) && GetButtonMaskForX2Event(event)) |
- return ui::ET_TOUCH_MOVED; |
- return ui::ET_UNKNOWN; |
- default: |
- NOTREACHED(); |
- } |
- return ui::ET_UNKNOWN; |
-} |
- |
-double GetTouchParamFromXEvent(XEvent* xev, |
- ui::DeviceDataManagerX11::DataType val, |
- double default_value) { |
- ui::DeviceDataManagerX11::GetInstance()->GetEventData(*xev, val, |
- &default_value); |
- return default_value; |
-} |
- |
-void ScaleTouchRadius(XEvent* xev, double* radius) { |
- DCHECK_EQ(GenericEvent, xev->type); |
- XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); |
- ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale(xiev->sourceid, |
- radius); |
-} |
- |
-bool GetGestureTimes(const base::NativeEvent& native_event, |
- double* start_time, |
- double* end_time) { |
- if (!ui::DeviceDataManagerX11::GetInstance()->HasGestureTimes(native_event)) |
- return false; |
- |
- double start_time_, end_time_; |
- if (!start_time) |
- start_time = &start_time_; |
- if (!end_time) |
- end_time = &end_time_; |
- |
- ui::DeviceDataManagerX11::GetInstance()->GetGestureTimes( |
- native_event, start_time, end_time); |
- return true; |
-} |
- |
-} // namespace |
- |
-namespace ui { |
- |
-void UpdateDeviceList() { |
- XDisplay* display = gfx::GetXDisplay(); |
- DeviceListCacheX::GetInstance()->UpdateDeviceList(display); |
- TouchFactory::GetInstance()->UpdateDeviceList(display); |
- DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display); |
-} |
- |
-EventType EventTypeFromNative(const base::NativeEvent& native_event) { |
- // Allow the DeviceDataManager to block the event. If blocked return |
- // ET_UNKNOWN as the type so this event will not be further processed. |
- // NOTE: During some events unittests there is no device data manager. |
- if (DeviceDataManager::HasInstance() && |
- static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance()) |
- ->IsEventBlocked(native_event)) { |
- return ET_UNKNOWN; |
- } |
- |
- switch (native_event->type) { |
- case KeyPress: |
- return ET_KEY_PRESSED; |
- case KeyRelease: |
- return ET_KEY_RELEASED; |
- case ButtonPress: |
- if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton && |
- static_cast<int>(native_event->xbutton.button) <= kMaxWheelButton) |
- return ET_MOUSEWHEEL; |
- return ET_MOUSE_PRESSED; |
- case ButtonRelease: |
- // Drop wheel events; we should've already scrolled on the press. |
- if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton && |
- static_cast<int>(native_event->xbutton.button) <= kMaxWheelButton) |
- return ET_UNKNOWN; |
- return ET_MOUSE_RELEASED; |
- case MotionNotify: |
- if (native_event->xmotion.state & |
- (Button1Mask | Button2Mask | Button3Mask)) |
- return ET_MOUSE_DRAGGED; |
- return ET_MOUSE_MOVED; |
- case EnterNotify: |
- // The standard on Windows is to send a MouseMove event when the mouse |
- // first enters a window instead of sending a special mouse enter event. |
- // To be consistent we follow the same style. |
- return ET_MOUSE_MOVED; |
- case LeaveNotify: |
- return ET_MOUSE_EXITED; |
- case GenericEvent: { |
- TouchFactory* factory = TouchFactory::GetInstance(); |
- if (!factory->ShouldProcessXI2Event(native_event)) |
- return ET_UNKNOWN; |
- |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- |
- // This check works only for master and floating slave devices. That is |
- // why it is necessary to check for the XI_Touch* events in the following |
- // switch statement to account for attached-slave touchscreens. |
- if (factory->IsTouchDevice(xievent->sourceid)) |
- return GetTouchEventType(native_event); |
- |
- switch (xievent->evtype) { |
- case XI_TouchBegin: |
- return ui::ET_TOUCH_PRESSED; |
- case XI_TouchUpdate: |
- return ui::ET_TOUCH_MOVED; |
- case XI_TouchEnd: |
- return ui::ET_TOUCH_RELEASED; |
- case XI_ButtonPress: { |
- int button = EventButtonFromNative(native_event); |
- if (button >= kMinWheelButton && button <= kMaxWheelButton) |
- return ET_MOUSEWHEEL; |
- return ET_MOUSE_PRESSED; |
- } |
- case XI_ButtonRelease: { |
- int button = EventButtonFromNative(native_event); |
- // Drop wheel events; we should've already scrolled on the press. |
- if (button >= kMinWheelButton && button <= kMaxWheelButton) |
- return ET_UNKNOWN; |
- return ET_MOUSE_RELEASED; |
- } |
- case XI_Motion: { |
- bool is_cancel; |
- DeviceDataManagerX11* devices = DeviceDataManagerX11::GetInstance(); |
- if (GetFlingData(native_event, NULL, NULL, NULL, NULL, &is_cancel)) |
- return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START; |
- if (devices->IsScrollEvent(native_event)) { |
- return devices->IsTouchpadXInputEvent(native_event) ? ET_SCROLL |
- : ET_MOUSEWHEEL; |
- } |
- if (devices->IsCMTMetricsEvent(native_event)) |
- return ET_UMA_DATA; |
- if (GetButtonMaskForX2Event(xievent)) |
- return ET_MOUSE_DRAGGED; |
- return ET_MOUSE_MOVED; |
- } |
- case XI_KeyPress: |
- return ET_KEY_PRESSED; |
- case XI_KeyRelease: |
- return ET_KEY_RELEASED; |
- } |
- } |
- default: |
- break; |
- } |
- return ET_UNKNOWN; |
-} |
- |
-int EventFlagsFromNative(const base::NativeEvent& native_event) { |
- switch (native_event->type) { |
- case KeyPress: |
- case KeyRelease: { |
- XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(native_event); |
- return GetEventFlagsFromXKeyEvent(native_event); |
- } |
- case ButtonPress: |
- case ButtonRelease: { |
- int flags = GetEventFlagsFromXState(native_event->xbutton.state); |
- const EventType type = EventTypeFromNative(native_event); |
- if (type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED) |
- flags |= GetEventFlagsForButton(native_event->xbutton.button); |
- return flags; |
- } |
- case EnterNotify: |
- case LeaveNotify: |
- return GetEventFlagsFromXState(native_event->xcrossing.state); |
- case MotionNotify: |
- return GetEventFlagsFromXState(native_event->xmotion.state); |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- |
- switch (xievent->evtype) { |
-#if defined(USE_XI2_MT) |
- case XI_TouchBegin: |
- case XI_TouchUpdate: |
- case XI_TouchEnd: |
- return GetButtonMaskForX2Event(xievent) | |
- GetEventFlagsFromXState(xievent->mods.effective) | |
- GetEventFlagsFromXState( |
- XModifierStateWatcher::GetInstance()->state()); |
- break; |
-#endif |
- case XI_ButtonPress: |
- case XI_ButtonRelease: { |
- const bool touch = |
- TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); |
- int flags = GetButtonMaskForX2Event(xievent) | |
- GetEventFlagsFromXState(xievent->mods.effective); |
- if (touch) { |
- flags |= GetEventFlagsFromXState( |
- XModifierStateWatcher::GetInstance()->state()); |
- } |
- |
- const EventType type = EventTypeFromNative(native_event); |
- int button = EventButtonFromNative(native_event); |
- if ((type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED) && !touch) |
- flags |= GetEventFlagsForButton(button); |
- return flags; |
- } |
- case XI_Motion: |
- return GetButtonMaskForX2Event(xievent) | |
- GetEventFlagsFromXState(xievent->mods.effective); |
- case XI_KeyPress: |
- case XI_KeyRelease: { |
- XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent( |
- native_event); |
- return GetEventFlagsFromXGenericEvent(native_event); |
- } |
- } |
- } |
- } |
- return 0; |
-} |
- |
-base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) { |
- switch (native_event->type) { |
- case KeyPress: |
- case KeyRelease: |
- return base::TimeDelta::FromMilliseconds(native_event->xkey.time); |
- case ButtonPress: |
- case ButtonRelease: |
- return base::TimeDelta::FromMilliseconds(native_event->xbutton.time); |
- break; |
- case MotionNotify: |
- return base::TimeDelta::FromMilliseconds(native_event->xmotion.time); |
- break; |
- case EnterNotify: |
- case LeaveNotify: |
- return base::TimeDelta::FromMilliseconds(native_event->xcrossing.time); |
- break; |
- case GenericEvent: { |
- double start, end; |
- double touch_timestamp; |
- if (GetGestureTimes(native_event, &start, &end)) { |
- // If the driver supports gesture times, use them. |
- return base::TimeDelta::FromMicroseconds(end * 1000000); |
- } else if (DeviceDataManagerX11::GetInstance()->GetEventData( |
- *native_event, |
- DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP, |
- &touch_timestamp)) { |
- return base::TimeDelta::FromMicroseconds(touch_timestamp * 1000000); |
- } else { |
- XIDeviceEvent* xide = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- return base::TimeDelta::FromMilliseconds(xide->time); |
- } |
- break; |
- } |
- } |
- NOTREACHED(); |
- return base::TimeDelta(); |
-} |
- |
-gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { |
- switch (native_event->type) { |
- case EnterNotify: |
- case LeaveNotify: |
- return gfx::Point(native_event->xcrossing.x, native_event->xcrossing.y); |
- case ButtonPress: |
- case ButtonRelease: |
- return gfx::Point(native_event->xbutton.x, native_event->xbutton.y); |
- case MotionNotify: |
- return gfx::Point(native_event->xmotion.x, native_event->xmotion.y); |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- float x = xievent->event_x; |
- float y = xievent->event_y; |
-#if defined(OS_CHROMEOS) |
- switch (xievent->evtype) { |
- case XI_TouchBegin: |
- case XI_TouchUpdate: |
- case XI_TouchEnd: |
- ui::DeviceDataManagerX11::GetInstance()->ApplyTouchTransformer( |
- xievent->deviceid, &x, &y); |
- break; |
- default: |
- break; |
- } |
-#endif // defined(OS_CHROMEOS) |
- return gfx::Point(static_cast<int>(x), static_cast<int>(y)); |
- } |
- } |
- return gfx::Point(); |
-} |
- |
-gfx::Point EventSystemLocationFromNative( |
- const base::NativeEvent& native_event) { |
- switch (native_event->type) { |
- case EnterNotify: |
- case LeaveNotify: { |
- return gfx::Point(native_event->xcrossing.x_root, |
- native_event->xcrossing.y_root); |
- } |
- case ButtonPress: |
- case ButtonRelease: { |
- return gfx::Point(native_event->xbutton.x_root, |
- native_event->xbutton.y_root); |
- } |
- case MotionNotify: { |
- return gfx::Point(native_event->xmotion.x_root, |
- native_event->xmotion.y_root); |
- } |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- return gfx::Point(xievent->root_x, xievent->root_y); |
- } |
- } |
- |
- return gfx::Point(); |
-} |
- |
-int EventButtonFromNative(const base::NativeEvent& native_event) { |
- CHECK_EQ(GenericEvent, native_event->type); |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- int button = xievent->detail; |
- |
- return (xievent->sourceid == xievent->deviceid) |
- ? DeviceDataManagerX11::GetInstance()->GetMappedButton(button) |
- : button; |
-} |
- |
-KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { |
- return KeyboardCodeFromXKeyEvent(native_event); |
-} |
- |
-const char* CodeFromNative(const base::NativeEvent& native_event) { |
- return CodeFromXEvent(native_event); |
-} |
- |
-uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) { |
- XKeyEvent* xkey = NULL; |
- XEvent xkey_from_xi2; |
- switch (native_event->type) { |
- case KeyPress: |
- case KeyRelease: |
- xkey = &native_event->xkey; |
- break; |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- switch (xievent->evtype) { |
- case XI_KeyPress: |
- case XI_KeyRelease: |
- // Build an XKeyEvent corresponding to the XI2 event, |
- // so that we can call XLookupString on it. |
- InitXKeyEventFromXIDeviceEvent(*native_event, &xkey_from_xi2); |
- xkey = &xkey_from_xi2.xkey; |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- break; |
- } |
- default: |
- NOTREACHED(); |
- break; |
- } |
- KeySym keysym = XK_VoidSymbol; |
- if (xkey) |
- XLookupString(xkey, NULL, 0, &keysym, NULL); |
- return keysym; |
-} |
- |
-bool IsCharFromNative(const base::NativeEvent& native_event) { |
- return false; |
-} |
- |
-int GetChangedMouseButtonFlagsFromNative( |
- const base::NativeEvent& native_event) { |
- switch (native_event->type) { |
- case ButtonPress: |
- case ButtonRelease: |
- return GetEventFlagsFromXState(native_event->xbutton.state); |
- case GenericEvent: { |
- XIDeviceEvent* xievent = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
- switch (xievent->evtype) { |
- case XI_ButtonPress: |
- case XI_ButtonRelease: |
- return GetEventFlagsForButton(EventButtonFromNative(native_event)); |
- default: |
- break; |
- } |
- } |
- default: |
- break; |
- } |
- return 0; |
-} |
- |
-gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) { |
- float x_offset, y_offset; |
- if (GetScrollOffsets(native_event, &x_offset, &y_offset, NULL, NULL, NULL)) { |
- return gfx::Vector2d(static_cast<int>(x_offset), |
- static_cast<int>(y_offset)); |
- } |
- |
- int button = native_event->type == GenericEvent |
- ? EventButtonFromNative(native_event) |
- : native_event->xbutton.button; |
- |
- switch (button) { |
- case 4: |
- return gfx::Vector2d(0, kWheelScrollAmount); |
- case 5: |
- return gfx::Vector2d(0, -kWheelScrollAmount); |
- case 6: |
- return gfx::Vector2d(kWheelScrollAmount, 0); |
- case 7: |
- return gfx::Vector2d(-kWheelScrollAmount, 0); |
- default: |
- return gfx::Vector2d(); |
- } |
-} |
- |
-void IncrementTouchIdRefCount(const base::NativeEvent& xev) { |
- ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); |
- double tracking_id; |
- if (!manager->GetEventData( |
- *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { |
- return; |
- } |
- |
- ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
- factory->AcquireSlotForTrackingID(tracking_id); |
-} |
- |
-void ClearTouchIdIfReleased(const base::NativeEvent& xev) { |
- ui::EventType type = ui::EventTypeFromNative(xev); |
- if (type == ui::ET_TOUCH_CANCELLED || type == ui::ET_TOUCH_RELEASED) { |
- ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
- ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); |
- double tracking_id; |
- if (manager->GetEventData(*xev, |
- ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, |
- &tracking_id)) { |
- factory->ReleaseSlotForTrackingID(tracking_id); |
- } |
- } |
-} |
- |
-int GetTouchId(const base::NativeEvent& xev) { |
- double slot = 0; |
- ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); |
- double tracking_id; |
- if (!manager->GetEventData( |
- *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { |
- LOG(ERROR) << "Could not get the tracking ID for the event. Using 0."; |
- } else { |
- ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
- slot = factory->GetSlotForTrackingID(tracking_id); |
- } |
- return slot; |
-} |
- |
-float GetTouchRadiusX(const base::NativeEvent& native_event) { |
- double radius = |
- GetTouchParamFromXEvent(native_event, |
- ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) / |
- 2.0; |
- ScaleTouchRadius(native_event, &radius); |
- return radius; |
-} |
- |
-float GetTouchRadiusY(const base::NativeEvent& native_event) { |
- double radius = |
- GetTouchParamFromXEvent(native_event, |
- ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) / |
- 2.0; |
- ScaleTouchRadius(native_event, &radius); |
- return radius; |
-} |
- |
-float GetTouchAngle(const base::NativeEvent& native_event) { |
- return GetTouchParamFromXEvent(native_event, |
- ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, |
- 0.0) / |
- 2.0; |
-} |
- |
-float GetTouchForce(const base::NativeEvent& native_event) { |
- double force = 0.0; |
- force = GetTouchParamFromXEvent( |
- native_event, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0); |
- unsigned int deviceid = |
- static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; |
- // Force is normalized to fall into [0, 1] |
- if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData( |
- deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force)) |
- force = 0.0; |
- return force; |
-} |
- |
-bool GetScrollOffsets(const base::NativeEvent& native_event, |
- float* x_offset, |
- float* y_offset, |
- float* x_offset_ordinal, |
- float* y_offset_ordinal, |
- int* finger_count) { |
- if (!DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event)) |
- return false; |
- |
- // Temp values to prevent passing NULLs to DeviceDataManager. |
- float x_offset_, y_offset_; |
- float x_offset_ordinal_, y_offset_ordinal_; |
- int finger_count_; |
- if (!x_offset) |
- x_offset = &x_offset_; |
- if (!y_offset) |
- y_offset = &y_offset_; |
- if (!x_offset_ordinal) |
- x_offset_ordinal = &x_offset_ordinal_; |
- if (!y_offset_ordinal) |
- y_offset_ordinal = &y_offset_ordinal_; |
- if (!finger_count) |
- finger_count = &finger_count_; |
- |
- DeviceDataManagerX11::GetInstance()->GetScrollOffsets( |
- native_event, x_offset, y_offset, x_offset_ordinal, y_offset_ordinal, |
- finger_count); |
- return true; |
-} |
- |
-bool GetFlingData(const base::NativeEvent& native_event, |
- float* vx, |
- float* vy, |
- float* vx_ordinal, |
- float* vy_ordinal, |
- bool* is_cancel) { |
- if (!DeviceDataManagerX11::GetInstance()->IsFlingEvent(native_event)) |
- return false; |
- |
- float vx_, vy_; |
- float vx_ordinal_, vy_ordinal_; |
- bool is_cancel_; |
- if (!vx) |
- vx = &vx_; |
- if (!vy) |
- vy = &vy_; |
- if (!vx_ordinal) |
- vx_ordinal = &vx_ordinal_; |
- if (!vy_ordinal) |
- vy_ordinal = &vy_ordinal_; |
- if (!is_cancel) |
- is_cancel = &is_cancel_; |
- |
- DeviceDataManagerX11::GetInstance()->GetFlingData( |
- native_event, vx, vy, vx_ordinal, vy_ordinal, is_cancel); |
- return true; |
-} |
- |
-} // namespace ui |