| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/renderer_host/render_widget_host_view_views.h" | 5 #include "chrome/browser/renderer_host/render_widget_host_view_views.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
| (...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 #if 0 | 662 #if 0 |
| 663 TODO(bryeung): key bindings | 663 TODO(bryeung): key bindings |
| 664 if (!event.skip_in_browser && | 664 if (!event.skip_in_browser && |
| 665 key_bindings_handler_->Match(event, &edit_commands)) { | 665 key_bindings_handler_->Match(event, &edit_commands)) { |
| 666 host_->ForwardEditCommandsForNextKeyEvent(edit_commands); | 666 host_->ForwardEditCommandsForNextKeyEvent(edit_commands); |
| 667 } | 667 } |
| 668 #endif | 668 #endif |
| 669 host_->ForwardKeyboardEvent(event); | 669 host_->ForwardKeyboardEvent(event); |
| 670 } | 670 } |
| 671 | 671 |
| 672 bool RenderWidgetHostViewViews::OnTouchEvent(const views::TouchEvent& e) { | 672 views::View::TouchStatus RenderWidgetHostViewViews::OnTouchEvent( |
| 673 const views::TouchEvent& e) { |
| 673 // Update the list of touch points first. | 674 // Update the list of touch points first. |
| 674 WebKit::WebTouchPoint* point = NULL; | 675 WebKit::WebTouchPoint* point = NULL; |
| 676 TouchStatus status = TOUCH_STATUS_UNKNOWN; |
| 675 | 677 |
| 676 switch (e.GetType()) { | 678 switch (e.GetType()) { |
| 677 case views::Event::ET_TOUCH_PRESSED: | 679 case views::Event::ET_TOUCH_PRESSED: |
| 678 // Add a new touch point. | 680 // Add a new touch point. |
| 679 if (touch_event_.touchPointsLength < | 681 if (touch_event_.touchPointsLength < |
| 680 WebTouchEvent::touchPointsLengthCap) { | 682 WebTouchEvent::touchPointsLengthCap) { |
| 681 point = &touch_event_.touchPoints[touch_event_.touchPointsLength++]; | 683 point = &touch_event_.touchPoints[touch_event_.touchPointsLength++]; |
| 682 point->id = e.identity(); | 684 point->id = e.identity(); |
| 685 |
| 686 if (touch_event_.touchPointsLength == 1) { |
| 687 // A new touch sequence has started. |
| 688 status = TOUCH_STATUS_START; |
| 689 } |
| 683 } | 690 } |
| 684 break; | 691 break; |
| 685 case views::Event::ET_TOUCH_RELEASED: | 692 case views::Event::ET_TOUCH_RELEASED: |
| 686 case views::Event::ET_TOUCH_CANCELLED: | 693 case views::Event::ET_TOUCH_CANCELLED: |
| 687 case views::Event::ET_TOUCH_MOVED: { | 694 case views::Event::ET_TOUCH_MOVED: { |
| 688 // The touch point should have been added to the event from an earlier | 695 // The touch point should have been added to the event from an earlier |
| 689 // _PRESSED event. So find that. | 696 // _PRESSED event. So find that. |
| 690 // At the moment, only a maximum of 4 touch-points are allowed. So a | 697 // At the moment, only a maximum of 4 touch-points are allowed. So a |
| 691 // simple loop should be sufficient. | 698 // simple loop should be sufficient. |
| 692 for (int i = 0; i < WebTouchEvent::touchPointsLengthCap; ++i) { | 699 for (int i = 0; i < WebTouchEvent::touchPointsLengthCap; ++i) { |
| 693 point = touch_event_.touchPoints + i; | 700 point = touch_event_.touchPoints + i; |
| 694 if (point->id == e.identity()) { | 701 if (point->id == e.identity()) { |
| 695 break; | 702 break; |
| 696 } | 703 } |
| 697 point = NULL; | 704 point = NULL; |
| 698 } | 705 } |
| 699 DCHECK(point != NULL) << "Touchpoint not found for event " << e.GetType(); | |
| 700 break; | 706 break; |
| 701 } | 707 } |
| 702 default: | 708 default: |
| 703 DLOG(WARNING) << "Unknown touch event " << e.GetType(); | 709 DLOG(WARNING) << "Unknown touch event " << e.GetType(); |
| 704 break; | 710 break; |
| 705 } | 711 } |
| 706 | 712 |
| 707 if (!point) | 713 if (!point) |
| 708 return false; | 714 return TOUCH_STATUS_UNKNOWN; |
| 715 |
| 716 if (status != TOUCH_STATUS_START) |
| 717 status = TOUCH_STATUS_CONTINUE; |
| 709 | 718 |
| 710 // Update the location and state of the point. | 719 // Update the location and state of the point. |
| 711 UpdateTouchPointPosition(&e, GetPosition(), point); | 720 UpdateTouchPointPosition(&e, GetPosition(), point); |
| 712 point->state = TouchPointStateFromEvent(&e); | 721 point->state = TouchPointStateFromEvent(&e); |
| 713 | 722 |
| 714 // Mark the rest of the points as stationary. | 723 // Mark the rest of the points as stationary. |
| 715 for (int i = 0; i < touch_event_.touchPointsLength; ++i) { | 724 for (int i = 0; i < touch_event_.touchPointsLength; ++i) { |
| 716 WebKit::WebTouchPoint* iter = touch_event_.touchPoints + i; | 725 WebKit::WebTouchPoint* iter = touch_event_.touchPoints + i; |
| 717 if (iter != point) { | 726 if (iter != point) { |
| 718 iter->state = WebKit::WebTouchPoint::StateStationary; | 727 iter->state = WebKit::WebTouchPoint::StateStationary; |
| 719 } | 728 } |
| 720 } | 729 } |
| 721 | 730 |
| 722 // Update the type of the touch event. | 731 // Update the type of the touch event. |
| 723 touch_event_.type = TouchEventTypeFromEvent(&e); | 732 touch_event_.type = TouchEventTypeFromEvent(&e); |
| 724 touch_event_.timeStampSeconds = base::Time::Now().ToDoubleT(); | 733 touch_event_.timeStampSeconds = base::Time::Now().ToDoubleT(); |
| 725 | 734 |
| 726 // The event and all the touches have been updated. Dispatch. | 735 // The event and all the touches have been updated. Dispatch. |
| 727 host_->ForwardTouchEvent(touch_event_); | 736 host_->ForwardTouchEvent(touch_event_); |
| 728 | 737 |
| 729 // If the touch was released, then remove it from the list of touch points. | 738 // If the touch was released, then remove it from the list of touch points. |
| 730 if (e.GetType() == views::Event::ET_TOUCH_RELEASED) { | 739 if (e.GetType() == views::Event::ET_TOUCH_RELEASED) { |
| 731 --touch_event_.touchPointsLength; | 740 --touch_event_.touchPointsLength; |
| 732 for (int i = point - touch_event_.touchPoints; | 741 for (int i = point - touch_event_.touchPoints; |
| 733 i < touch_event_.touchPointsLength; | 742 i < touch_event_.touchPointsLength; |
| 734 ++i) { | 743 ++i) { |
| 735 touch_event_.touchPoints[i] = touch_event_.touchPoints[i + 1]; | 744 touch_event_.touchPoints[i] = touch_event_.touchPoints[i + 1]; |
| 736 } | 745 } |
| 746 if (touch_event_.touchPointsLength == 0) |
| 747 status = TOUCH_STATUS_END; |
| 748 } else if (e.GetType() == views::Event::ET_TOUCH_CANCELLED) { |
| 749 status = TOUCH_STATUS_CANCEL; |
| 737 } | 750 } |
| 738 | 751 |
| 739 return true; | 752 return status; |
| 740 } | 753 } |
| 741 | 754 |
| 742 // static | 755 // static |
| 743 RenderWidgetHostView* | 756 RenderWidgetHostView* |
| 744 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( | 757 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( |
| 745 gfx::NativeView widget) { | 758 gfx::NativeView widget) { |
| 746 gpointer user_data = g_object_get_data(G_OBJECT(widget), | 759 gpointer user_data = g_object_get_data(G_OBJECT(widget), |
| 747 kRenderWidgetHostViewKey); | 760 kRenderWidgetHostViewKey); |
| 748 return reinterpret_cast<RenderWidgetHostView*>(user_data); | 761 return reinterpret_cast<RenderWidgetHostView*>(user_data); |
| 749 } | 762 } |
| OLD | NEW |