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

Unified Diff: content/browser/renderer_host/render_widget_host_view_win.cc

Issue 10365009: Adding Gesture Recognition to RenderWidgetHostViewWin (web client) (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 8 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
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) {

Powered by Google App Engine
This is Rietveld 408576698