Index: content/browser/renderer_host/render_widget_host_view_win.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc |
index fcfeac8668a7e1e134a9dd0c43aa1c674a2b7eff..2cf791cb644f4d66a803729f493155798ddffb5c 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_win.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc |
@@ -46,6 +46,7 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h" |
+#include "ui/base/gestures/gesture_recognizer.h" |
#include "ui/base/ime/composition_text.h" |
#include "ui/base/l10n/l10n_util_win.h" |
#include "ui/base/text/text_elider.h" |
@@ -57,6 +58,7 @@ |
#include "ui/gfx/gdi_util.h" |
#include "ui/gfx/rect.h" |
#include "ui/gfx/screen.h" |
+#include "ui/views/events/event.h" |
rjkroege
2012/05/04 15:42:46
afaik: content is not allowed to depend on views.
|
#include "webkit/glue/webaccessibility.h" |
#include "webkit/glue/webcursor.h" |
#include "webkit/plugins/npapi/plugin_constants_win.h" |
@@ -333,6 +335,8 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) |
focus_on_editable_field_(false), |
received_focus_change_after_pointer_down_(false), |
touch_events_enabled_(false), |
+ ALLOW_THIS_IN_INITIALIZER_LIST( |
sky
2012/05/04 16:23:40
No scoped_ptr since you're creating all the time (
|
+ gesture_recognizer_(ui::GestureRecognizer::Create(this))), |
ALLOW_THIS_IN_INITIALIZER_LIST(sys_color_change_listener_(this)) { |
render_widget_host_->SetView(this); |
registrar_.Add(this, |
@@ -938,6 +942,10 @@ void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) { |
void RenderWidgetHostViewWin::ProcessTouchAck( |
WebKit::WebInputEvent::Type type, bool processed) { |
+ scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
+ gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed)); |
+ ProcessGestures(gestures.get()); |
+ |
if (type == WebKit::WebInputEvent::TouchStart) |
UpdateDesiredTouchMode(processed); |
} |
@@ -993,6 +1001,46 @@ void RenderWidgetHostViewWin::UpdateDesiredTouchMode(bool touch_mode) { |
} |
} |
+ui::GestureEvent* RenderWidgetHostViewWin::CreateGestureEvent( |
rjkroege
2012/05/04 15:42:46
my intuition is that this class is not the right p
|
+ ui::EventType type, |
+ const gfx::Point& location, |
+ int flags, |
+ const base::Time& time, |
+ float param_first, |
+ float param_second, |
+ unsigned int touch_id_bitfield) { |
+ return new views::GestureEvent(type, location.x(), location.y(), flags, time, |
+ param_first, param_second, touch_id_bitfield); |
+} |
+ |
+ui::TouchEvent* RenderWidgetHostViewWin::CreateTouchEvent( |
+ ui::EventType type, |
+ const gfx::Point& location, |
+ int touch_id, |
+ const base::TimeDelta& time_stamp) { |
+ return new views::TouchEvent( |
+ type, location.x(), location.y(), 0, touch_id, 0, 0, 0, 0); |
+} |
+ |
+bool RenderWidgetHostViewWin::DispatchLongPressGestureEvent( |
+ ui::GestureEvent* event) { |
+ return ForwardGestureEventToRenderer( WebKit::WebInputEvent::GestureLongPress, |
+ reinterpret_cast< const views::GestureEvent *>(event)); |
+} |
+ |
+bool RenderWidgetHostViewWin::DispatchCancelTouchEvent( |
+ ui::TouchEvent* event) { |
+ if (!render_widget_host_) |
+ return false; |
+ |
+ WebKit::WebTouchEvent generatedEvent; |
+ generatedEvent.changedTouchesLength = 1; |
+ generatedEvent.changedTouches[0].id = event->GetTouchId(); |
+ generatedEvent.type = WebKit::WebInputEvent::TouchCancel; |
+ render_widget_host_->ForwardTouchEvent(generatedEvent); |
+ return true; |
+} |
+ |
void RenderWidgetHostViewWin::SetHasHorizontalScrollbar( |
bool has_horizontal_scrollbar) { |
} |
@@ -1897,18 +1945,117 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam, |
points, sizeof(TOUCHINPUT))) { |
return 0; |
} |
- |
for (size_t start = 0; start < total;) { |
start += touch_state_.UpdateTouchPoints(points + start, total - start); |
if (touch_state_.is_changed()) |
render_widget_host_->ForwardTouchEvent(touch_state_.touch_event()); |
rjkroege
2012/05/04 15:42:46
are the touch-ids normalized here?
|
} |
+ // Send a copy of the touch events on to the gesture recognizer. |
+ for (size_t index = 0; index < total; ++index) { |
+ // Create a views::TouchEvent |
+ bool hasAreaInfo = |
+ (points[index].dwMask & TOUCHINPUTMASKF_CONTACTAREA) != 0; |
+ |
+ DWORD flags = points[index].dwFlags; |
+ ui::EventType eventType = ui::ET_TOUCH_STATIONARY; |
+ |
+ if ((flags & TOUCHEVENTF_UP) != 0) |
+ eventType = ui::ET_TOUCH_RELEASED; |
+ else if ((flags & TOUCHEVENTF_MOVE) != 0) { |
+ eventType = ui::ET_TOUCH_MOVED; |
+ // Ignore this touch if there is a backlog. |
rjkroege
2012/05/04 15:42:46
why? you drop the moves on the floor?
wouldn't th
|
+ if (!gesture_recognizer_->IsQueueEmpty(this)) |
+ continue; |
+ } |
+ else if ((flags & TOUCHEVENTF_DOWN) != 0) |
+ eventType = ui::ET_TOUCH_PRESSED; |
+ |
+ views::TouchEvent touchEvent( eventType, |
+ TOUCH_COORD_TO_PIXEL( points[index].x), |
+ TOUCH_COORD_TO_PIXEL( points[index].y), |
+ 0, // flags are not used. |
+ points[index].dwID, |
+ hasAreaInfo ? points[index].cxContact : 0.0, |
+ hasAreaInfo ? points[index].cyContact : 0.0, |
+ 0.0, // angle is unknown? |
+ 0.0); // force is 0? |
+ GestureConsumer* consumer = this; |
+ gesture_recognizer_->QueueTouchEventForGesture( |
+ consumer, touchEvent); |
+ } |
+ |
CloseTouchInputHandle((HTOUCHINPUT)lparam); |
return 0; |
} |
+void RenderWidgetHostViewWin::ProcessGestures( |
+ ui::GestureRecognizer::Gestures* gestures) { |
+ if ((gestures == 0) || gestures->empty()) |
+ return; |
+ |
+ for (ui::GestureRecognizer::Gestures::iterator g_it = gestures->begin(); |
rjkroege
2012/05/04 15:42:46
we have code that knows how to make Web events out
|
+ g_it != gestures->end(); |
+ ++g_it) { |
+ views::GestureEvent *gesture = |
+ reinterpret_cast<views::GestureEvent *>( *g_it); |
+ switch (gesture->type()) { |
+ case ui::ET_GESTURE_SCROLL_BEGIN: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureScrollBegin, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_SCROLL_END: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureScrollEnd, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_SCROLL_UPDATE: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureScrollUpdate, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_PINCH_BEGIN: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GesturePinchBegin, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_PINCH_END: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GesturePinchEnd, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_PINCH_UPDATE: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GesturePinchUpdate, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_LONG_PRESS: |
+ ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureLongPress, |
+ gesture); |
+ break; |
+ case ui::ET_GESTURE_THREE_FINGER_SWIPE: |
+ // TODO: Add this code when three finger swipes are added. |
+ //ForwardGestureEventToRenderer( |
+ // WebKit::WebInputEvent::GestureThreeFingerSwipe, gesture); |
+ break; |
+ case ui::ET_GESTURE_TAP: |
+ if (!ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureTap, |
+ gesture)) |
+ ForwardMouseEventToRenderer(WM_LBUTTONUP, 0, |
+ MAKELONG(gesture->x(),gesture->y())); |
+ break; |
+ case ui::ET_GESTURE_TAP_DOWN: |
rjkroege
2012/05/04 15:42:46
Something looks wrong here. Taps from the GR are h
|
+ if (!ForwardGestureEventToRenderer(WebKit::WebInputEvent::GestureTapDown, |
+ gesture)) |
+ ForwardMouseEventToRenderer(WM_LBUTTONDOWN, 0, |
+ MAKELONG(gesture->x(),gesture->y())); |
+ break; |
+ case ui::ET_GESTURE_DOUBLE_TAP: |
+ if (!ForwardGestureEventToRenderer( |
+ WebKit::WebInputEvent::GestureDoubleTap, gesture)) |
+ ForwardMouseEventToRenderer(WM_LBUTTONDBLCLK, 0, |
rjkroege
2012/05/04 15:42:46
Same comment
|
+ MAKELONG(gesture->x(),gesture->y())); |
+ break; |
+ } |
+ } |
+} |
+ |
LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT message, |
WPARAM wparam, |
LPARAM lparam, |
@@ -2452,6 +2599,24 @@ void RenderWidgetHostViewWin::ResetTooltip() { |
tooltip_hwnd_ = NULL; |
} |
+bool RenderWidgetHostViewWin::ForwardGestureEventToRenderer( |
+ WebKit::WebInputEvent::Type eventType, |
+ const views::GestureEvent* gesture) { |
+ if (!render_widget_host_) |
+ return false; |
+ |
+ WebKit::WebGestureEvent generatedEvent; |
+ generatedEvent.x = gesture->x(); |
+ generatedEvent.y = gesture->y(); |
+ generatedEvent.deltaX = gesture->delta_x(); |
+ generatedEvent.deltaY = gesture->delta_y(); |
+ generatedEvent.timeStampSeconds = |
+ gesture->time_stamp().UnixEpoch().ToDoubleT(); |
+ generatedEvent.type = eventType; |
+ render_widget_host_->ForwardGestureEvent(generatedEvent); |
+ return true; |
+} |
+ |
void RenderWidgetHostViewWin::ForwardMouseEventToRenderer(UINT message, |
WPARAM wparam, |
LPARAM lparam) { |