Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1143)

Unified Diff: views/events/event_x.cc

Issue 7942004: Consolidate/cleanup event cracking code; single out GdkEvents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge removal of compact nav. Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/events/event_win.cc ('k') | views/focus/accelerator_handler_touch.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/events/event_x.cc
diff --git a/views/events/event_x.cc b/views/events/event_x.cc
index fda4affb3038f172432e0f45dd3c2641d69a66f7..9957d5f00941bea07e04e6147881e9bd13df8625 100644
--- a/views/events/event_x.cc
+++ b/views/events/event_x.cc
@@ -12,234 +12,27 @@
#include "base/logging.h"
#include "base/utf_string_conversions.h"
#include "ui/base/keycodes/keyboard_code_conversion_x.h"
-#include "views/touchui/touch_factory.h"
+#include "ui/base/touch/touch_factory.h"
#include "views/widget/root_view.h"
namespace views {
namespace {
-// Scroll amount for each wheelscroll event. 53 is also the value used for GTK+.
-static int kWheelScrollAmount = 53;
-
-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 & Button1Mask)
- flags |= ui::EF_LEFT_BUTTON_DOWN;
- if (state & Button2Mask)
- flags |= ui::EF_MIDDLE_BUTTON_DOWN;
- if (state & Button3Mask)
- flags |= ui::EF_RIGHT_BUTTON_DOWN;
-
- return flags;
-}
-
-// 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_BUTTON_DOWN;
- case 2:
- return ui::EF_MIDDLE_BUTTON_DOWN;
- case 3:
- return ui::EF_RIGHT_BUTTON_DOWN;
- }
-
- DLOG(WARNING) << "Unexpected button (" << button << ") received.";
- 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)) {
- buttonflags |= GetEventFlagsForButton(i);
- }
- }
-
- return buttonflags;
-}
-
-ui::EventType GetTouchEventType(XEvent* xev) {
-#if defined(USE_XI2_MT)
- XIEvent* event = static_cast<XIEvent*>(xev->xcookie.data);
- switch(event->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;
- }
-
- return ui::ET_UNKNOWN;
-#else
- XGenericEventCookie* cookie = &xev->xcookie;
- DCHECK_EQ(cookie->evtype, XI_Motion);
-
- // Note: We will not generate a _STATIONARY event here. It will be created,
- // when necessary, by a RWHVV.
- // TODO(sad): When should _CANCELLED be generated?
-
- TouchFactory* factory = TouchFactory::GetInstance();
- float slot;
- if (!factory->ExtractTouchParam(*xev, TouchFactory::TP_SLOT_ID, &slot))
- return ui::ET_UNKNOWN;
-
- if (!factory->IsSlotUsed(slot)) {
- // This is a new touch point.
- return ui::ET_TOUCH_PRESSED;
- }
-
- float tracking;
- if (!factory->ExtractTouchParam(*xev, TouchFactory::TP_TRACKING_ID,
- &tracking))
- return ui::ET_UNKNOWN;
-
- if (tracking == 0l) {
- // The touch point has been released.
- return ui::ET_TOUCH_RELEASED;
- }
-
- return ui::ET_TOUCH_MOVED;
-#endif // defined(USE_XI2_MT)
-}
-
int GetTouchIDFromXEvent(XEvent* xev) {
float id = 0;
#if defined(USE_XI2_MT)
// TODO(ningxin.hu@gmail.com): Make the id always start from 0 for a new
// touch-sequence when TRACKING_ID is used to extract the touch id.
- TouchFactory::TouchParam tp = TouchFactory::TP_TRACKING_ID;
+ ui::TouchFactory::TouchParam tp = ui::TouchFactory::TP_TRACKING_ID;
#else
- TouchFactory::TouchParam tp = TouchFactory::TP_SLOT_ID;
+ ui::TouchFactory::TouchParam tp = ui::TouchFactory::TP_SLOT_ID;
#endif
- if (!TouchFactory::GetInstance()->ExtractTouchParam(
- *xev, tp, &id))
+ if (!ui::TouchFactory::GetInstance()->ExtractTouchParam(*xev, tp, &id))
LOG(ERROR) << "Could not get the touch ID for the event. Using 0.";
return id;
}
-ui::EventType EventTypeFromNative(NativeEvent2 native_event) {
- switch (native_event->type) {
- case KeyPress:
- return ui::ET_KEY_PRESSED;
- case KeyRelease:
- return ui::ET_KEY_RELEASED;
- case ButtonPress:
- if (native_event->xbutton.button == 4 ||
- native_event->xbutton.button == 5)
- return ui::ET_MOUSEWHEEL;
- return ui::ET_MOUSE_PRESSED;
- case ButtonRelease:
- if (native_event->xbutton.button == 4 ||
- native_event->xbutton.button == 5)
- return ui::ET_MOUSEWHEEL;
- return ui::ET_MOUSE_RELEASED;
- case MotionNotify:
- if (native_event->xmotion.state &
- (Button1Mask | Button2Mask | Button3Mask))
- return ui::ET_MOUSE_DRAGGED;
- return ui::ET_MOUSE_MOVED;
- case GenericEvent: {
- XIDeviceEvent* xievent =
- static_cast<XIDeviceEvent*>(native_event->xcookie.data);
- if (TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid))
- return GetTouchEventType(native_event);
- switch (xievent->evtype) {
- case XI_ButtonPress:
- return (xievent->detail == 4 || xievent->detail == 5) ?
- ui::ET_MOUSEWHEEL : ui::ET_MOUSE_PRESSED;
- case XI_ButtonRelease:
- return (xievent->detail == 4 || xievent->detail == 5) ?
- ui::ET_MOUSEWHEEL : ui::ET_MOUSE_RELEASED;
- case XI_Motion:
- return GetButtonMaskForX2Event(xievent) ? ui::ET_MOUSE_DRAGGED :
- ui::ET_MOUSE_MOVED;
- }
- }
- default:
- NOTREACHED();
- break;
- }
- return ui::ET_UNKNOWN;
-}
-
-int GetMouseWheelOffset(XEvent* xev) {
- if (xev->type == GenericEvent) {
- XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data);
- return xiev->detail == 4 ? kWheelScrollAmount : -kWheelScrollAmount;
- }
- return xev->xbutton.button == 4 ? kWheelScrollAmount : -kWheelScrollAmount;
-}
-
-gfx::Point GetEventLocation(XEvent* xev) {
- switch (xev->type) {
- case ButtonPress:
- case ButtonRelease:
- return gfx::Point(xev->xbutton.x, xev->xbutton.y);
-
- case MotionNotify:
- return gfx::Point(xev->xmotion.x, xev->xmotion.y);
-
- case GenericEvent: {
- XIDeviceEvent* xievent =
- static_cast<XIDeviceEvent*>(xev->xcookie.data);
- return gfx::Point(static_cast<int>(xievent->event_x),
- static_cast<int>(xievent->event_y));
- }
- }
-
- return gfx::Point();
-}
-
-int GetLocatedEventFlags(XEvent* xev) {
- switch (xev->type) {
- case ButtonPress:
- case ButtonRelease:
- return GetEventFlagsFromXState(xev->xbutton.state) |
- GetEventFlagsForButton(xev->xbutton.button);
-
- case MotionNotify:
- return GetEventFlagsFromXState(xev->xmotion.state);
-
- case GenericEvent: {
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
- bool touch =
- TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid);
- switch (xievent->evtype) {
- case XI_ButtonPress:
- case XI_ButtonRelease:
- return GetButtonMaskForX2Event(xievent) |
- GetEventFlagsFromXState(xievent->mods.effective) |
- (touch ? 0 : GetEventFlagsForButton(xievent->detail));
-
- case XI_Motion:
- return GetButtonMaskForX2Event(xievent) |
- GetEventFlagsFromXState(xievent->mods.effective);
- }
- }
- }
-
- return 0;
-}
-
uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) {
char buf[6];
int bytes_written = XLookupString(key, buf, 6, NULL, NULL);
@@ -251,26 +44,27 @@ uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) {
}
float GetTouchParamFromXEvent(XEvent* xev,
- TouchFactory::TouchParam tp,
+ ui::TouchFactory::TouchParam tp,
float default_value) {
- TouchFactory::GetInstance()->ExtractTouchParam(*xev, tp, &default_value);
+ ui::TouchFactory::GetInstance()->ExtractTouchParam(*xev, tp, &default_value);
return default_value;
}
float GetTouchForceFromXEvent(XEvent* xev) {
float force = 0.0;
- force = GetTouchParamFromXEvent(xev, TouchFactory::TP_PRESSURE, 0.0);
+ force = GetTouchParamFromXEvent(xev, ui::TouchFactory::TP_PRESSURE, 0.0);
unsigned int deviceid =
static_cast<XIDeviceEvent*>(xev->xcookie.data)->sourceid;
// Force is normalized to fall into [0, 1]
- if (!TouchFactory::GetInstance()->NormalizeTouchParam(
- deviceid, TouchFactory::TP_PRESSURE, &force))
+ if (!ui::TouchFactory::GetInstance()->NormalizeTouchParam(
+ deviceid, ui::TouchFactory::TP_PRESSURE, &force))
force = 0.0;
return force;
}
// The following two functions are copied from event_gtk.cc. These will be
// removed when GTK dependency is removed.
+#if defined(TOOLKIT_USES_GTK)
uint16 GetCharacterFromGdkKeyval(guint keyval) {
guint32 ch = gdk_keyval_to_unicode(keyval);
@@ -278,67 +72,39 @@ uint16 GetCharacterFromGdkKeyval(guint keyval) {
return ch < 0xFFFE ? static_cast<uint16>(ch) : 0;
}
-GdkEventKey* GetGdkEventKeyFromNative(NativeEvent native_event) {
- DCHECK(native_event->type == GDK_KEY_PRESS ||
- native_event->type == GDK_KEY_RELEASE);
- return &native_event->key;
+GdkEventKey* GetGdkEventKeyFromNative(GdkEvent* gdk_event) {
+ DCHECK(gdk_event->type == GDK_KEY_PRESS ||
+ gdk_event->type == GDK_KEY_RELEASE);
+ return &gdk_event->key;
}
+#endif
} // namespace
////////////////////////////////////////////////////////////////////////////////
-// Event, private:
-
-void Event::InitWithNativeEvent2(NativeEvent2 native_event_2,
- FromNativeEvent2) {
- native_event_ = NULL;
- // TODO(beng): remove once we rid views of Gtk/Gdk.
- native_event_2_ = native_event_2;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// LocatedEvent, protected:
-
-LocatedEvent::LocatedEvent(NativeEvent2 native_event_2,
- FromNativeEvent2 from_native)
- : Event(native_event_2,
- EventTypeFromNative(native_event_2),
- GetLocatedEventFlags(native_event_2),
- from_native),
- location_(GetEventLocation(native_event_2)) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
// KeyEvent, public:
-KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native)
- : Event(native_event_2,
- EventTypeFromNative(native_event_2),
- GetEventFlagsFromXState(native_event_2->xkey.state),
- from_native),
- key_code_(ui::KeyboardCodeFromXKeyEvent(native_event_2)),
- character_(0),
- unmodified_character_(0) {
-}
-
uint16 KeyEvent::GetCharacter() const {
if (character_)
return character_;
- if (!native_event_2()) {
+ if (!native_event()) {
+#if defined(TOOLKIT_USES_GTK)
// This event may have been created from a Gdk event.
- if (IsControlDown() || !native_event())
- return GetCharacterFromKeyCode(key_code_, flags());
-
- uint16 ch = GetCharacterFromGdkKeyval(
- GetGdkEventKeyFromNative(native_event())->keyval);
- return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
+ if (!IsControlDown() && gdk_event()) {
+ uint16 ch = GetCharacterFromGdkKeyval(
+ GetGdkEventKeyFromNative(gdk_event())->keyval);
+ if (ch)
+ return ch;
+ }
+#endif
+ return GetCharacterFromKeyCode(key_code_, flags());
}
- DCHECK(native_event_2()->type == KeyPress ||
- native_event_2()->type == KeyRelease);
+ DCHECK(native_event()->type == KeyPress ||
+ native_event()->type == KeyRelease);
- uint16 ch = GetCharacterFromXKeyEvent(&native_event_2()->xkey);
+ uint16 ch = GetCharacterFromXKeyEvent(&native_event()->xkey);
return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
}
@@ -346,38 +112,37 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const {
if (unmodified_character_)
return unmodified_character_;
- if (!native_event_2()) {
+ if (!native_event()) {
+#if defined(TOOLKIT_USES_GTK)
// This event may have been created from a Gdk event.
- if (!native_event())
- return GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN);
-
- GdkEventKey* key = GetGdkEventKeyFromNative(native_event());
-
- static const guint kIgnoredModifiers =
- GDK_CONTROL_MASK | GDK_LOCK_MASK | GDK_MOD1_MASK | GDK_MOD2_MASK |
- GDK_MOD3_MASK | GDK_MOD4_MASK | GDK_MOD5_MASK | GDK_SUPER_MASK |
- GDK_HYPER_MASK | GDK_META_MASK;
-
- // We can't use things like (key->state & GDK_SHIFT_MASK), as it may mask
- // out bits used by X11 or Gtk internally.
- GdkModifierType modifiers =
- static_cast<GdkModifierType>(key->state & ~kIgnoredModifiers);
- guint keyval = 0;
- uint16 ch = 0;
- if (gdk_keymap_translate_keyboard_state(NULL, key->hardware_keycode,
- modifiers, key->group, &keyval,
- NULL, NULL, NULL)) {
- ch = GetCharacterFromGdkKeyval(keyval);
+ if (gdk_event()) {
+ GdkEventKey* key = GetGdkEventKeyFromNative(gdk_event());
+
+ static const guint kIgnoredModifiers =
+ GDK_CONTROL_MASK | GDK_LOCK_MASK | GDK_MOD1_MASK | GDK_MOD2_MASK |
+ GDK_MOD3_MASK | GDK_MOD4_MASK | GDK_MOD5_MASK | GDK_SUPER_MASK |
+ GDK_HYPER_MASK | GDK_META_MASK;
+
+ // We can't use things like (key->state & GDK_SHIFT_MASK), as it may mask
+ // out bits used by X11 or Gtk internally.
+ GdkModifierType modifiers =
+ static_cast<GdkModifierType>(key->state & ~kIgnoredModifiers);
+ guint keyval = 0;
+ if (gdk_keymap_translate_keyboard_state(NULL, key->hardware_keycode,
+ modifiers, key->group, &keyval, NULL, NULL, NULL)) {
+ uint16 ch = GetCharacterFromGdkKeyval(keyval);
+ if (ch)
+ return ch;
+ }
}
-
- return ch ? ch :
- GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN);
+#endif
+ return GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN);
}
- DCHECK(native_event_2()->type == KeyPress ||
- native_event_2()->type == KeyRelease);
+ DCHECK(native_event()->type == KeyPress ||
+ native_event()->type == KeyRelease);
- XKeyEvent key = native_event_2()->xkey;
+ XKeyEvent key = native_event()->xkey;
static const unsigned int kIgnoredModifiers = ControlMask | LockMask |
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask;
@@ -391,45 +156,27 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const {
}
////////////////////////////////////////////////////////////////////////////////
-// MouseEvent, public:
-
-MouseEvent::MouseEvent(NativeEvent2 native_event_2,
- FromNativeEvent2 from_native)
- : LocatedEvent(native_event_2, from_native) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// MouseWheelEvent, public:
-
-MouseWheelEvent::MouseWheelEvent(NativeEvent2 native_event_2,
- FromNativeEvent2 from_native)
- : MouseEvent(native_event_2, from_native),
- offset_(GetMouseWheelOffset(native_event_2)) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
// TouchEvent, public:
-TouchEvent::TouchEvent(NativeEvent2 native_event_2,
- FromNativeEvent2 from_native)
- : LocatedEvent(native_event_2, from_native),
- touch_id_(GetTouchIDFromXEvent(native_event_2)),
- radius_x_(GetTouchParamFromXEvent(native_event_2,
- TouchFactory::TP_TOUCH_MAJOR,
+TouchEvent::TouchEvent(const ui::NativeEvent& native_event)
+ : LocatedEvent(native_event),
+ touch_id_(GetTouchIDFromXEvent(native_event)),
+ radius_x_(GetTouchParamFromXEvent(native_event,
+ ui::TouchFactory::TP_TOUCH_MAJOR,
2.0) / 2.0),
- radius_y_(GetTouchParamFromXEvent(native_event_2,
- TouchFactory::TP_TOUCH_MINOR,
+ radius_y_(GetTouchParamFromXEvent(native_event,
+ ui::TouchFactory::TP_TOUCH_MINOR,
2.0) / 2.0),
- rotation_angle_(GetTouchParamFromXEvent(native_event_2,
- TouchFactory::TP_ORIENTATION,
+ rotation_angle_(GetTouchParamFromXEvent(native_event,
+ ui::TouchFactory::TP_ORIENTATION,
0.0)),
- force_(GetTouchForceFromXEvent(native_event_2)) {
+ force_(GetTouchForceFromXEvent(native_event)) {
#if !defined(USE_XI2_MT)
if (type() == ui::ET_TOUCH_PRESSED || type() == ui::ET_TOUCH_RELEASED) {
- TouchFactory* factory = TouchFactory::GetInstance();
+ ui::TouchFactory* factory = ui::TouchFactory::GetInstance();
float slot;
- if (factory->ExtractTouchParam(*native_event_2,
- TouchFactory::TP_SLOT_ID, &slot)) {
+ if (factory->ExtractTouchParam(*native_event,
+ ui::TouchFactory::TP_SLOT_ID, &slot)) {
factory->SetSlotUsed(slot, type() == ui::ET_TOUCH_PRESSED);
}
}
« no previous file with comments | « views/events/event_win.cc ('k') | views/focus/accelerator_handler_touch.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698