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

Unified Diff: mojo/services/html_viewer/blink_input_events_type_converters.cc

Issue 492863002: mojo: Plumb through sufficient context to make real blink::WebInputEvents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final sky nits Created 6 years, 4 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 | « mojo/mojo_services.gypi ('k') | mojo/services/public/cpp/input_events/lib/input_events_type_converters.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/services/html_viewer/blink_input_events_type_converters.cc
diff --git a/mojo/services/html_viewer/blink_input_events_type_converters.cc b/mojo/services/html_viewer/blink_input_events_type_converters.cc
index 7ff8d9c1966de691a97893902cd723a2451bee02..4b2a0a1a641a9a6d7ba240528acd38083dacecfa 100644
--- a/mojo/services/html_viewer/blink_input_events_type_converters.cc
+++ b/mojo/services/html_viewer/blink_input_events_type_converters.cc
@@ -48,20 +48,6 @@ int EventFlagsToWebInputEventModifiers(int flags) {
blink::WebInputEvent::AltKey : 0);
}
-// TODO(erg): This function is extremely hacky and should only be accepted
-// since this is demo code which won't live very long. Actually calculating
-// this accurately would require the native X11 event so we could get accurate
-// key codes via XKeyEventToWindowsKeyCode() and mojo::GetCharacterFromXEvent().
-// That option is closed to us, and thus, hack.
-int32_t MakeHackyText(int32_t key_code, int flags) {
- if (!(flags & mojo::EVENT_FLAGS_SHIFT_DOWN) && key_code >= 'A' &&
- key_code <= 'Z') {
- key_code = key_code + ('a' - 'A');
- }
-
- return key_code;
-}
-
int GetClickCount(int flags) {
if (flags & mojo::MOUSE_EVENT_FLAGS_IS_TRIPLE_CLICK)
return 3;
@@ -71,140 +57,150 @@ int GetClickCount(int flags) {
return 1;
}
+scoped_ptr<blink::WebInputEvent> BuildWebMouseEventFrom(const EventPtr& event) {
+ scoped_ptr<blink::WebMouseEvent> web_event(new blink::WebMouseEvent);
+ web_event->x = event->location_data->in_view_location->x;
+ web_event->y = event->location_data->in_view_location->y;
+
+ // TODO(erg): Remove this if check once we can rely on screen_location
+ // actually being passed to us. As written today, getting the screen
+ // location from ui::Event objects can only be done by querying the
+ // underlying native events, so all synthesized events don't have screen
+ // locations.
+ if (!event->location_data->screen_location.is_null()) {
+ web_event->globalX = event->location_data->screen_location->x;
+ web_event->globalY = event->location_data->screen_location->y;
+ }
+
+ web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
+ web_event->timeStampSeconds =
+ base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
+
+ web_event->button = blink::WebMouseEvent::ButtonNone;
+ if (event->flags & mojo::EVENT_FLAGS_LEFT_MOUSE_BUTTON)
+ web_event->button = blink::WebMouseEvent::ButtonLeft;
+ if (event->flags & mojo::EVENT_FLAGS_MIDDLE_MOUSE_BUTTON)
+ web_event->button = blink::WebMouseEvent::ButtonMiddle;
+ if (event->flags & mojo::EVENT_FLAGS_RIGHT_MOUSE_BUTTON)
+ web_event->button = blink::WebMouseEvent::ButtonRight;
+
+ switch (event->action) {
+ case EVENT_TYPE_MOUSE_PRESSED:
+ web_event->type = blink::WebInputEvent::MouseDown;
+ break;
+ case EVENT_TYPE_MOUSE_RELEASED:
+ web_event->type = blink::WebInputEvent::MouseUp;
+ break;
+ case EVENT_TYPE_MOUSE_ENTERED:
+ web_event->type = blink::WebInputEvent::MouseLeave;
+ web_event->button = blink::WebMouseEvent::ButtonNone;
+ break;
+ case EVENT_TYPE_MOUSE_EXITED:
+ case EVENT_TYPE_MOUSE_MOVED:
+ case EVENT_TYPE_MOUSE_DRAGGED:
+ web_event->type = blink::WebInputEvent::MouseMove;
+ break;
+ default:
+ NOTIMPLEMENTED() << "Received unexpected event: " << event->action;
+ break;
+ }
+
+ web_event->clickCount = GetClickCount(event->flags);
+
+ return web_event.PassAs<blink::WebInputEvent>();
+}
+
+scoped_ptr<blink::WebInputEvent> BuildWebKeyboardEvent(
+ const EventPtr& event) {
+ scoped_ptr<blink::WebKeyboardEvent> web_event(new blink::WebKeyboardEvent);
+
+ web_event->modifiers = EventFlagsToWebInputEventModifiers(event->flags);
+ web_event->timeStampSeconds =
+ base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
+
+ // TODO(erg): This derivation of is_char is a bad hack, and exists because
+ // the platform doesn't seem to be sending character events to us.
+ bool is_char =
+ event->key_data->is_char ||
+ (event->key_data->key_code >= 32 && event->key_data->key_code < 127);
+
+ switch (event->action) {
+ case EVENT_TYPE_KEY_PRESSED:
+ web_event->type = is_char ? blink::WebInputEvent::Char :
+ blink::WebInputEvent::RawKeyDown;
+ break;
+ case EVENT_TYPE_KEY_RELEASED:
+ web_event->type = blink::WebInputEvent::KeyUp;
+ break;
+ default:
+ NOTREACHED();
+ }
+
+ if (web_event->modifiers & blink::WebInputEvent::AltKey)
+ web_event->isSystemKey = true;
+
+ web_event->windowsKeyCode = event->key_data->windows_key_code;
+ web_event->nativeKeyCode = event->key_data->native_key_code;
+ web_event->text[0] = event->key_data->text;
+ web_event->unmodifiedText[0] = event->key_data->unmodified_text;
+
+ web_event->setKeyIdentifierFromWindowsKeyCode();
+ return web_event.PassAs<blink::WebInputEvent>();
+}
+
+scoped_ptr<blink::WebInputEvent> BuildWebMouseWheelEventFrom(
+ const EventPtr& event) {
+ scoped_ptr<blink::WebMouseWheelEvent> web_event(
+ new blink::WebMouseWheelEvent);
+ web_event->type = blink::WebInputEvent::MouseWheel;
+ web_event->button = blink::WebMouseEvent::ButtonNone;
+ web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
+ web_event->timeStampSeconds =
+ base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
+
+ web_event->x = event->location_data->in_view_location->x;
+ web_event->y = event->location_data->in_view_location->y;
+
+ // TODO(erg): Remove this null check as parallel to above.
+ if (!event->location_data->screen_location.is_null()) {
+ web_event->globalX = event->location_data->screen_location->x;
+ web_event->globalY = event->location_data->screen_location->y;
+ }
+
+ if ((event->flags & mojo::EVENT_FLAGS_SHIFT_DOWN) != 0 &&
+ event->wheel_data->x_offset == 0) {
+ web_event->deltaX = event->wheel_data->y_offset;
+ web_event->deltaY = 0;
+ } else {
+ web_event->deltaX = event->wheel_data->x_offset;
+ web_event->deltaY = event->wheel_data->y_offset;
+ }
+
+ web_event->wheelTicksX = web_event->deltaX / kPixelsPerTick;
+ web_event->wheelTicksY = web_event->deltaY / kPixelsPerTick;
+
+ return web_event.PassAs<blink::WebInputEvent>();
+}
+
} // namespace
// static
scoped_ptr<blink::WebInputEvent>
TypeConverter<EventPtr, scoped_ptr<blink::WebInputEvent> >::ConvertTo(
const EventPtr& event) {
-
if (event->action == EVENT_TYPE_MOUSE_PRESSED ||
event->action == EVENT_TYPE_MOUSE_RELEASED ||
event->action == EVENT_TYPE_MOUSE_ENTERED ||
event->action == EVENT_TYPE_MOUSE_EXITED ||
event->action == EVENT_TYPE_MOUSE_MOVED ||
event->action == EVENT_TYPE_MOUSE_DRAGGED) {
- scoped_ptr<blink::WebMouseEvent> web_event(new blink::WebMouseEvent);
- web_event->x = event->location_data->in_view_location->x;
- web_event->y = event->location_data->in_view_location->y;
-
- // TODO(erg): Remove this if check once we can rely on screen_location
- // actually being passed to us. As written today, getting the screen
- // location from ui::Event objects can only be done by querying the
- // underlying native events, so all synthesized events don't have screen
- // locations.
- if (!event->location_data->screen_location.is_null()) {
- web_event->globalX = event->location_data->screen_location->x;
- web_event->globalY = event->location_data->screen_location->y;
- }
-
- web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
- web_event->timeStampSeconds =
- base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
-
- web_event->button = blink::WebMouseEvent::ButtonNone;
- if (event->flags & mojo::EVENT_FLAGS_LEFT_MOUSE_BUTTON)
- web_event->button = blink::WebMouseEvent::ButtonLeft;
- if (event->flags & mojo::EVENT_FLAGS_MIDDLE_MOUSE_BUTTON)
- web_event->button = blink::WebMouseEvent::ButtonMiddle;
- if (event->flags & mojo::EVENT_FLAGS_RIGHT_MOUSE_BUTTON)
- web_event->button = blink::WebMouseEvent::ButtonRight;
-
- switch (event->action) {
- case EVENT_TYPE_MOUSE_PRESSED:
- web_event->type = blink::WebInputEvent::MouseDown;
- break;
- case EVENT_TYPE_MOUSE_RELEASED:
- web_event->type = blink::WebInputEvent::MouseUp;
- break;
- case EVENT_TYPE_MOUSE_ENTERED:
- web_event->type = blink::WebInputEvent::MouseLeave;
- web_event->button = blink::WebMouseEvent::ButtonNone;
- break;
- case EVENT_TYPE_MOUSE_EXITED:
- case EVENT_TYPE_MOUSE_MOVED:
- case EVENT_TYPE_MOUSE_DRAGGED:
- web_event->type = blink::WebInputEvent::MouseMove;
- break;
- default:
- NOTIMPLEMENTED() << "Received unexpected event: " << event->action;
- break;
- }
-
- web_event->clickCount = GetClickCount(event->flags);
-
- return web_event.PassAs<blink::WebInputEvent>();
+ return BuildWebMouseEventFrom(event);
} else if ((event->action == EVENT_TYPE_KEY_PRESSED ||
event->action == EVENT_TYPE_KEY_RELEASED) &&
event->key_data) {
- scoped_ptr<blink::WebKeyboardEvent> web_event(new blink::WebKeyboardEvent);
-
- // TODO(erg): This derivation of is_char is a bad hack, along with our key
- // code and text calculations. Normally, key code calculations need the
- // gfx::NativeEvent, which we don't have access to here. Likewise, the
- // calculation of the |text| is overly simplified for similar
- // reasons. (Contrast with web_input_event_aurax11.cc in content/.)
- bool is_char =
- event->key_data->is_char ||
- (event->key_data->key_code >= 32 && event->key_data->key_code < 127);
-
- switch (event->action) {
- case EVENT_TYPE_KEY_PRESSED:
- web_event->type = is_char ? blink::WebInputEvent::Char :
- blink::WebInputEvent::RawKeyDown;
- break;
- case EVENT_TYPE_KEY_RELEASED:
- web_event->type = blink::WebInputEvent::KeyUp;
- break;
- default:
- NOTREACHED();
- }
-
- web_event->modifiers = EventFlagsToWebInputEventModifiers(event->flags);
- web_event->timeStampSeconds =
- base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
-
- if (web_event->modifiers & blink::WebInputEvent::AltKey)
- web_event->isSystemKey = true;
-
- web_event->windowsKeyCode = event->key_data->key_code;
- web_event->nativeKeyCode = event->key_data->key_code;
- web_event->text[0] = MakeHackyText(event->key_data->key_code, event->flags);
- web_event->unmodifiedText[0] = event->key_data->key_code;
-
- web_event->setKeyIdentifierFromWindowsKeyCode();
- return web_event.PassAs<blink::WebInputEvent>();
+ return BuildWebKeyboardEvent(event);
} else if (event->action == EVENT_TYPE_MOUSEWHEEL) {
- scoped_ptr<blink::WebMouseWheelEvent> web_event(
- new blink::WebMouseWheelEvent);
- web_event->type = blink::WebInputEvent::MouseWheel;
- web_event->button = blink::WebMouseEvent::ButtonNone;
- web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
- web_event->timeStampSeconds =
- base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
-
- web_event->x = event->location_data->in_view_location->x;
- web_event->y = event->location_data->in_view_location->y;
-
- // TODO(erg): Remove this null check as parallel to above.
- if (!event->location_data->screen_location.is_null()) {
- web_event->globalX = event->location_data->screen_location->x;
- web_event->globalY = event->location_data->screen_location->y;
- }
-
- if ((event->flags & mojo::EVENT_FLAGS_SHIFT_DOWN) != 0 &&
- event->wheel_data->x_offset == 0) {
- web_event->deltaX = event->wheel_data->y_offset;
- web_event->deltaY = 0;
- } else {
- web_event->deltaX = event->wheel_data->x_offset;
- web_event->deltaY = event->wheel_data->y_offset;
- }
-
- web_event->wheelTicksX = web_event->deltaX / kPixelsPerTick;
- web_event->wheelTicksY = web_event->deltaY / kPixelsPerTick;
-
- return web_event.PassAs<blink::WebInputEvent>();
+ return BuildWebMouseWheelEventFrom(event);
}
return scoped_ptr<blink::WebInputEvent>();
« no previous file with comments | « mojo/mojo_services.gypi ('k') | mojo/services/public/cpp/input_events/lib/input_events_type_converters.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698