OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/render_widget_host_view_win.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_win.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <peninputpanel_i.c> | 9 #include <peninputpanel_i.c> |
10 #include <stack> | 10 #include <stack> |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 } | 263 } |
264 last_pt.x = gi.ptsLocation.x; | 264 last_pt.x = gi.ptsLocation.x; |
265 last_pt.y = gi.ptsLocation.y; | 265 last_pt.y = gi.ptsLocation.y; |
266 *start = start_pt; | 266 *start = start_pt; |
267 return true; | 267 return true; |
268 } | 268 } |
269 | 269 |
270 WebKit::WebMouseWheelEvent MakeFakeScrollWheelEvent(HWND hwnd, | 270 WebKit::WebMouseWheelEvent MakeFakeScrollWheelEvent(HWND hwnd, |
271 POINT start, | 271 POINT start, |
272 POINT delta) { | 272 POINT delta) { |
273 WebKit::WebMouseWheelEvent result; | 273 WebKit::WebMouseWheelEvent result; |
274 result.type = WebInputEvent::MouseWheel; | 274 result.type = WebInputEvent::MouseWheel; |
275 result.timeStampSeconds = ::GetMessageTime() / 1000.0; | 275 result.timeStampSeconds = ::GetMessageTime() / 1000.0; |
276 result.button = WebMouseEvent::ButtonNone; | 276 result.button = WebMouseEvent::ButtonNone; |
277 result.globalX = start.x; | 277 result.globalX = start.x; |
278 result.globalY = start.y; | 278 result.globalY = start.y; |
279 // Map to window coordinates. | 279 // Map to window coordinates. |
280 POINT client_point = { result.globalX, result.globalY }; | 280 POINT client_point = { result.globalX, result.globalY }; |
281 MapWindowPoints(0, hwnd, &client_point, 1); | 281 MapWindowPoints(0, hwnd, &client_point, 1); |
282 result.x = client_point.x; | 282 result.x = client_point.x; |
283 result.y = client_point.y; | 283 result.y = client_point.y; |
284 result.windowX = result.x; | 284 result.windowX = result.x; |
285 result.windowY = result.y; | 285 result.windowY = result.y; |
286 // Note that we support diagonal scrolling. | 286 // Note that we support diagonal scrolling. |
287 result.deltaX = static_cast<float>(delta.x); | 287 result.deltaX = static_cast<float>(delta.x); |
288 result.wheelTicksX = WHEEL_DELTA; | 288 result.wheelTicksX = WHEEL_DELTA; |
289 result.deltaY = static_cast<float>(delta.y); | 289 result.deltaY = static_cast<float>(delta.y); |
290 result.wheelTicksY = WHEEL_DELTA; | 290 result.wheelTicksY = WHEEL_DELTA; |
291 return result; | 291 return result; |
292 } | 292 } |
293 | 293 |
294 static const int kTouchMask = 0x7; | 294 static const int kTouchMask = 0x7; |
295 | 295 |
296 inline int GetTouchType(const TOUCHINPUT& point) { | 296 inline int GetTouchType(const TOUCHINPUT& point) { |
297 return point.dwFlags & kTouchMask; | 297 return point.dwFlags & kTouchMask; |
298 } | 298 } |
299 | 299 |
300 inline void SetTouchType(TOUCHINPUT* point, int type) { | 300 inline void SetTouchType(TOUCHINPUT* point, int type) { |
301 point->dwFlags = (point->dwFlags & kTouchMask) | type; | 301 point->dwFlags = (point->dwFlags & kTouchMask) | type; |
302 } | 302 } |
303 | 303 |
304 template <class IINTERFACE, class PAYLOAD> | |
305 class WrappedObject : public IINTERFACE { | |
306 public: | |
307 WrappedObject() { | |
308 } | |
309 const PAYLOAD& data() const { | |
310 return data_; | |
311 } | |
312 PAYLOAD& data() { | |
313 return data_; | |
314 } | |
315 | |
316 private: | |
317 PAYLOAD data_; | |
318 | |
319 typedef WrappedObject<IINTERFACE,PAYLOAD> Type; | |
320 DISALLOW_COPY_AND_ASSIGN(Type); | |
321 }; | |
322 | |
323 ui::EventType ConvertToUIEvent(WebKit::WebTouchPoint::State t) { | 304 ui::EventType ConvertToUIEvent(WebKit::WebTouchPoint::State t) { |
324 switch (t) { | 305 switch (t) { |
325 case WebKit::WebTouchPoint::StatePressed: | 306 case WebKit::WebTouchPoint::StatePressed: |
326 return ui::ET_TOUCH_PRESSED; | 307 return ui::ET_TOUCH_PRESSED; |
327 case WebKit::WebTouchPoint::StateMoved: | 308 case WebKit::WebTouchPoint::StateMoved: |
328 return ui::ET_TOUCH_MOVED; | 309 return ui::ET_TOUCH_MOVED; |
329 case WebKit::WebTouchPoint::StateStationary: | 310 case WebKit::WebTouchPoint::StateStationary: |
330 return ui::ET_TOUCH_STATIONARY; | 311 return ui::ET_TOUCH_STATIONARY; |
331 case WebKit::WebTouchPoint::StateReleased: | 312 case WebKit::WebTouchPoint::StateReleased: |
332 return ui::ET_TOUCH_RELEASED; | 313 return ui::ET_TOUCH_RELEASED; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 case ui::ET_TOUCH_RELEASED: | 365 case ui::ET_TOUCH_RELEASED: |
385 return WebKit::WebInputEvent::TouchEnd; | 366 return WebKit::WebInputEvent::TouchEnd; |
386 case ui::ET_TOUCH_CANCELLED: | 367 case ui::ET_TOUCH_CANCELLED: |
387 return WebKit::WebInputEvent::TouchCancel; | 368 return WebKit::WebInputEvent::TouchCancel; |
388 default: | 369 default: |
389 DCHECK(false) << "Unexpected ui type. " << t; | 370 DCHECK(false) << "Unexpected ui type. " << t; |
390 return WebKit::WebInputEvent::Undefined; | 371 return WebKit::WebInputEvent::Undefined; |
391 } | 372 } |
392 } | 373 } |
393 | 374 |
394 class LocalGestureEvent : | 375 class LocalGestureEvent : public ui::GestureEvent { |
395 public WrappedObject<ui::GestureEvent, WebKit::WebGestureEvent> { | |
396 public: | 376 public: |
397 LocalGestureEvent( | 377 LocalGestureEvent(HWND hwnd, |
398 HWND hwnd, | 378 const ui::GestureEventDetails& details, |
399 const ui::GestureEventDetails& details, | 379 const gfx::Point& location, |
400 const gfx::Point& location, | 380 int flags, |
401 int flags, | 381 base::Time time, |
402 base::Time time, | 382 unsigned int touch_id_bitfield) |
403 unsigned int touch_id_bitfield) | 383 : ui::GestureEvent(details.type(), location.x(), location.y(), flags, |
404 : touch_ids_bitfield_(touch_id_bitfield), | 384 time, details, touch_id_bitfield), |
405 type_(details.type()) { | 385 client_point_(location.ToPOINT()), |
406 // location is given in window coordinates, based on the parent window. | 386 screen_point_(location.ToPOINT()) { |
407 // Map to the appropriate window's coordinates. For a root window the | 387 MapWindowPoints(::GetParent(hwnd), hwnd, &client_point_, 1); |
408 // coordinates won't change, because the parent shares our rect. | 388 MapWindowPoints(hwnd, HWND_DESKTOP, &screen_point_, 1); |
409 POINT client_point = { location.x(), location.y()}; | 389 } |
410 MapWindowPoints(::GetParent(hwnd), hwnd, &client_point, 1); | 390 |
411 POINT screen_point = { location.x(), location.y()}; | 391 virtual ~LocalGestureEvent() {} |
412 MapWindowPoints(hwnd, HWND_DESKTOP, &screen_point, 1); | 392 |
413 data().x = client_point.x; | 393 WebKit::WebGestureEvent ToWebGestureEvent() { |
414 data().y = client_point.y; | 394 WebKit::WebGestureEvent gesture_event; |
415 data().globalX = screen_point.x; | 395 gesture_event.type = ConvertToWebInputEvent(type()); |
416 data().globalY = screen_point.y; | 396 gesture_event.x = client_point_.x; |
417 data().type = ConvertToWebInputEvent(type_); | 397 gesture_event.y = client_point_.y; |
418 data().boundingBox = details.bounding_box(); | 398 gesture_event.globalX = screen_point_.x; |
| 399 gesture_event.globalY = screen_point_.y; |
| 400 gesture_event.boundingBox = details().bounding_box(); |
419 | 401 |
420 // Copy any event-type specific data. | 402 // Copy any event-type specific data. |
421 switch (type_) { | 403 switch (type()) { |
422 case ui::ET_GESTURE_TAP: | 404 case ui::ET_GESTURE_TAP: |
423 data().deltaX = details.tap_count(); | 405 gesture_event.deltaX = details().tap_count(); |
424 break; | 406 break; |
425 case ui::ET_GESTURE_SCROLL_UPDATE: | 407 case ui::ET_GESTURE_SCROLL_UPDATE: |
426 data().deltaX = details.scroll_x(); | 408 gesture_event.deltaX = details().scroll_x(); |
427 data().deltaY = details.scroll_y(); | 409 gesture_event.deltaY = details().scroll_y(); |
428 break; | 410 break; |
429 case ui::ET_GESTURE_PINCH_UPDATE: | 411 case ui::ET_GESTURE_PINCH_UPDATE: |
430 data().deltaX = details.scale(); | 412 gesture_event.deltaX = details().scale(); |
431 break; | 413 break; |
432 case ui::ET_SCROLL_FLING_START: | 414 case ui::ET_SCROLL_FLING_START: |
433 data().deltaX = details.velocity_x(); | 415 gesture_event.deltaX = details().velocity_x(); |
434 data().deltaY = details.velocity_y(); | 416 gesture_event.deltaY = details().velocity_y(); |
435 default: | 417 default: |
436 break; | 418 break; |
437 } | 419 } |
438 } | 420 return gesture_event; |
439 | |
440 virtual int GetLowestTouchId() const OVERRIDE { | |
441 return LowestBit(touch_ids_bitfield_); | |
442 } | |
443 | |
444 ui::EventType type() { | |
445 return type_; | |
446 } | 421 } |
447 | 422 |
448 private: | 423 private: |
449 // The set of indices of ones in the binary representation of | 424 POINT client_point_; |
450 // |touch_ids_bitfield_| is the set of touch_ids associate with this gesture. | 425 POINT screen_point_; |
451 // This value is stored as a bitfield because the number of touch ids varies, | |
452 // but we currently don't need more than 32 touches at a time. | |
453 const unsigned int touch_ids_bitfield_; | |
454 | |
455 ui::EventType type_; | |
456 | 426 |
457 DISALLOW_COPY_AND_ASSIGN(LocalGestureEvent); | 427 DISALLOW_COPY_AND_ASSIGN(LocalGestureEvent); |
458 }; | 428 }; |
459 | 429 |
460 class TouchEventFromWebTouchPoint : public ui::TouchEvent { | 430 class TouchEventFromWebTouchPoint : public ui::TouchEvent { |
461 public: | 431 public: |
462 TouchEventFromWebTouchPoint(const WebKit::WebTouchPoint& touch_point, | 432 TouchEventFromWebTouchPoint(const WebKit::WebTouchPoint& touch_point, |
463 base::TimeDelta& timestamp) | 433 base::TimeDelta& timestamp) |
464 : ui::TouchEvent(ConvertToUIEvent(touch_point.state), | 434 : ui::TouchEvent(ConvertToUIEvent(touch_point.state), |
465 touch_point.position, | 435 touch_point.position, |
(...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2821 ::DestroyWindow(tooltip_hwnd_); | 2791 ::DestroyWindow(tooltip_hwnd_); |
2822 tooltip_hwnd_ = NULL; | 2792 tooltip_hwnd_ = NULL; |
2823 } | 2793 } |
2824 | 2794 |
2825 bool RenderWidgetHostViewWin::ForwardGestureEventToRenderer( | 2795 bool RenderWidgetHostViewWin::ForwardGestureEventToRenderer( |
2826 ui::GestureEvent* gesture) { | 2796 ui::GestureEvent* gesture) { |
2827 if (!render_widget_host_) | 2797 if (!render_widget_host_) |
2828 return false; | 2798 return false; |
2829 | 2799 |
2830 LocalGestureEvent* local = static_cast<LocalGestureEvent*>(gesture); | 2800 LocalGestureEvent* local = static_cast<LocalGestureEvent*>(gesture); |
2831 if (local->data().type == WebKit::WebGestureEvent::Undefined) | 2801 WebKit::WebGestureEvent gesture_event = local->ToWebGestureEvent(); |
| 2802 if (gesture_event.type == WebKit::WebGestureEvent::Undefined) |
2832 return false; | 2803 return false; |
2833 const WebKit::WebGestureEvent& generatedEvent = local->data(); | 2804 render_widget_host_->ForwardGestureEvent(gesture_event); |
2834 render_widget_host_->ForwardGestureEvent(generatedEvent); | |
2835 return true; | 2805 return true; |
2836 } | 2806 } |
2837 | 2807 |
2838 void RenderWidgetHostViewWin::ForwardMouseEventToRenderer(UINT message, | 2808 void RenderWidgetHostViewWin::ForwardMouseEventToRenderer(UINT message, |
2839 WPARAM wparam, | 2809 WPARAM wparam, |
2840 LPARAM lparam) { | 2810 LPARAM lparam) { |
2841 TRACE_EVENT0("browser", | 2811 TRACE_EVENT0("browser", |
2842 "RenderWidgetHostViewWin::ForwardMouseEventToRenderer"); | 2812 "RenderWidgetHostViewWin::ForwardMouseEventToRenderer"); |
2843 if (!render_widget_host_) { | 2813 if (!render_widget_host_) { |
2844 TRACE_EVENT0("browser", "EarlyOut_NoRWH"); | 2814 TRACE_EVENT0("browser", "EarlyOut_NoRWH"); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3114 // receive a focus change in the context of a pointer down message, it means | 3084 // receive a focus change in the context of a pointer down message, it means |
3115 // that the pointer down message occurred on the edit field and we should | 3085 // that the pointer down message occurred on the edit field and we should |
3116 // display the on screen keyboard | 3086 // display the on screen keyboard |
3117 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_) | 3087 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_) |
3118 DisplayOnScreenKeyboardIfNeeded(); | 3088 DisplayOnScreenKeyboardIfNeeded(); |
3119 received_focus_change_after_pointer_down_ = false; | 3089 received_focus_change_after_pointer_down_ = false; |
3120 pointer_down_context_ = false; | 3090 pointer_down_context_ = false; |
3121 } | 3091 } |
3122 | 3092 |
3123 } // namespace content | 3093 } // namespace content |
OLD | NEW |