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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_win.cc

Issue 8537005: Revert 109594 - Forward Windows touch messages to the renderer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/i18n/rtl.h" 10 #include "base/i18n/rtl.h"
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 result.windowX = result.x; 283 result.windowX = result.x;
284 result.windowY = result.y; 284 result.windowY = result.y;
285 // Note that we support diagonal scrolling. 285 // Note that we support diagonal scrolling.
286 result.deltaX = static_cast<float>(delta.x); 286 result.deltaX = static_cast<float>(delta.x);
287 result.wheelTicksX = WHEEL_DELTA; 287 result.wheelTicksX = WHEEL_DELTA;
288 result.deltaY = static_cast<float>(delta.y); 288 result.deltaY = static_cast<float>(delta.y);
289 result.wheelTicksY = WHEEL_DELTA; 289 result.wheelTicksY = WHEEL_DELTA;
290 return result; 290 return result;
291 } 291 }
292 292
293 static const int kTouchMask = 0x7;
294
295 inline int GetTouchType(const TOUCHINPUT& point) {
296 return point.dwFlags & kTouchMask;
297 }
298
299 inline void SetTouchType(TOUCHINPUT* point, int type) {
300 point->dwFlags = (point->dwFlags & kTouchMask) | type;
301 }
302
303 } // namespace 293 } // namespace
304 294
305 /////////////////////////////////////////////////////////////////////////////// 295 ///////////////////////////////////////////////////////////////////////////////
306 // RenderWidgetHostViewWin, public: 296 // RenderWidgetHostViewWin, public:
307 297
308 RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) 298 RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget)
309 : render_widget_host_(widget), 299 : render_widget_host_(widget),
310 compositor_host_window_(NULL), 300 compositor_host_window_(NULL),
311 hide_compositor_window_at_next_paint_(false), 301 hide_compositor_window_at_next_paint_(false),
312 track_mouse_leave_(false), 302 track_mouse_leave_(false),
313 ime_notification_(false), 303 ime_notification_(false),
314 capture_enter_key_(false), 304 capture_enter_key_(false),
315 is_hidden_(false), 305 is_hidden_(false),
316 about_to_validate_and_paint_(false), 306 about_to_validate_and_paint_(false),
317 close_on_deactivate_(false), 307 close_on_deactivate_(false),
318 being_destroyed_(false), 308 being_destroyed_(false),
319 tooltip_hwnd_(NULL), 309 tooltip_hwnd_(NULL),
320 tooltip_showing_(false), 310 tooltip_showing_(false),
321 shutdown_factory_(this), 311 shutdown_factory_(this),
322 parent_hwnd_(NULL), 312 parent_hwnd_(NULL),
323 is_loading_(false), 313 is_loading_(false),
324 overlay_color_(0), 314 overlay_color_(0),
325 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 315 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
326 is_fullscreen_(false), 316 is_fullscreen_(false),
327 ignore_mouse_movement_(true), 317 ignore_mouse_movement_(true),
328 composition_range_(ui::Range::InvalidRange()), 318 composition_range_(ui::Range::InvalidRange()),
329 ignore_next_lbutton_message_at_same_location(false), 319 ignore_next_lbutton_message_at_same_location(false),
330 last_pointer_down_location_(0), 320 last_pointer_down_location_(0) {
331 touch_state_(this) {
332 render_widget_host_->SetView(this); 321 render_widget_host_->SetView(this);
333 registrar_.Add(this, 322 registrar_.Add(this,
334 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, 323 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
335 content::NotificationService::AllBrowserContextsAndSources()); 324 content::NotificationService::AllBrowserContextsAndSources());
336 } 325 }
337 326
338 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() { 327 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() {
339 UnlockMouse(); 328 UnlockMouse();
340 ResetTooltip(); 329 ResetTooltip();
341 } 330 }
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 872
884 LRESULT RenderWidgetHostViewWin::OnCreate(CREATESTRUCT* create_struct) { 873 LRESULT RenderWidgetHostViewWin::OnCreate(CREATESTRUCT* create_struct) {
885 // Call the WM_INPUTLANGCHANGE message handler to initialize the input locale 874 // Call the WM_INPUTLANGCHANGE message handler to initialize the input locale
886 // of a browser process. 875 // of a browser process.
887 OnInputLangChange(0, 0); 876 OnInputLangChange(0, 0);
888 // Marks that window as supporting mouse-wheel messages rerouting so it is 877 // Marks that window as supporting mouse-wheel messages rerouting so it is
889 // scrolled when under the mouse pointer even if inactive. 878 // scrolled when under the mouse pointer even if inactive.
890 props_.push_back(ui::SetWindowSupportsRerouteMouseWheel(m_hWnd)); 879 props_.push_back(ui::SetWindowSupportsRerouteMouseWheel(m_hWnd));
891 880
892 if (base::win::GetVersion() >= base::win::VERSION_WIN7) { 881 if (base::win::GetVersion() >= base::win::VERSION_WIN7) {
893 // Use gestures if touch event switch isn't present or registration fails. 882 // Single finger panning is consistent with other windows applications.
894 if (!CommandLine::ForCurrentProcess()->HasSwitch( 883 const DWORD gesture_allow = GC_PAN_WITH_SINGLE_FINGER_VERTICALLY |
895 switches::kEnableTouchEvents) || 884 GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY;
896 !RegisterTouchWindow(m_hWnd, 0)) { 885 const DWORD gesture_block = GC_PAN_WITH_GUTTER;
897 // Single finger panning is consistent with other windows applications. 886 GESTURECONFIG gc[] = {
898 const DWORD gesture_allow = GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | 887 { GID_ZOOM, GC_ZOOM, 0 },
899 GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY; 888 { GID_PAN, gesture_allow , gesture_block},
900 const DWORD gesture_block = GC_PAN_WITH_GUTTER; 889 { GID_TWOFINGERTAP, GC_TWOFINGERTAP , 0},
901 GESTURECONFIG gc[] = { 890 { GID_PRESSANDTAP, GC_PRESSANDTAP , 0}
902 { GID_ZOOM, GC_ZOOM, 0 }, 891 };
903 { GID_PAN, gesture_allow , gesture_block}, 892 if (!SetGestureConfig(m_hWnd, 0, arraysize(gc), gc, sizeof(GESTURECONFIG)))
904 { GID_TWOFINGERTAP, GC_TWOFINGERTAP , 0}, 893 {
905 { GID_PRESSANDTAP, GC_PRESSANDTAP , 0} 894 NOTREACHED();
906 };
907 if (!SetGestureConfig(m_hWnd, 0, arraysize(gc), gc,
908 sizeof(GESTURECONFIG))) {
909 NOTREACHED();
910 }
911 } 895 }
912 } 896 }
913 897
914 return 0; 898 return 0;
915 } 899 }
916 900
917 void RenderWidgetHostViewWin::OnActivate(UINT action, BOOL minimized, 901 void RenderWidgetHostViewWin::OnActivate(UINT action, BOOL minimized,
918 HWND window) { 902 HWND window) {
919 // If the container is a popup, clicking elsewhere on screen should close the 903 // If the container is a popup, clicking elsewhere on screen should close the
920 // popup. 904 // popup.
(...skipping 15 matching lines...) Expand all
936 // handler for NPP_DestroyStream relies on. 920 // handler for NPP_DestroyStream relies on.
937 // 921 //
938 // The fix is to detach plugin windows from web contents when it is going 922 // The fix is to detach plugin windows from web contents when it is going
939 // away. This will prevent the plugin windows from getting destroyed 923 // away. This will prevent the plugin windows from getting destroyed
940 // automatically. The detached plugin windows will get cleaned up in proper 924 // automatically. The detached plugin windows will get cleaned up in proper
941 // sequence as part of the usual cleanup when the plugin instance goes away. 925 // sequence as part of the usual cleanup when the plugin instance goes away.
942 EnumChildWindows(m_hWnd, DetachPluginWindowsCallback, NULL); 926 EnumChildWindows(m_hWnd, DetachPluginWindowsCallback, NULL);
943 927
944 props_.reset(); 928 props_.reset();
945 929
946 if (IsTouchWindow(m_hWnd, NULL))
947 UnregisterTouchWindow(m_hWnd);
948
949 CleanupCompositorWindow(); 930 CleanupCompositorWindow();
950 931
951 ResetTooltip(); 932 ResetTooltip();
952 TrackMouseLeave(false); 933 TrackMouseLeave(false);
953 } 934 }
954 935
955 void RenderWidgetHostViewWin::OnPaint(HDC unused_dc) { 936 void RenderWidgetHostViewWin::OnPaint(HDC unused_dc) {
956 if (!render_widget_host_) 937 if (!render_widget_host_)
957 return; 938 return;
958 939
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 return 0; 1095 return 0;
1115 } 1096 }
1116 1097
1117 void RenderWidgetHostViewWin::OnSetFocus(HWND window) { 1098 void RenderWidgetHostViewWin::OnSetFocus(HWND window) {
1118 if (browser_accessibility_manager_.get()) 1099 if (browser_accessibility_manager_.get())
1119 browser_accessibility_manager_->GotFocus(); 1100 browser_accessibility_manager_->GotFocus();
1120 if (render_widget_host_) { 1101 if (render_widget_host_) {
1121 render_widget_host_->GotFocus(); 1102 render_widget_host_->GotFocus();
1122 render_widget_host_->SetActive(true); 1103 render_widget_host_->SetActive(true);
1123 } 1104 }
1124 if (touch_state_.ReleaseTouchPoints())
1125 render_widget_host_->ForwardTouchEvent(touch_state_.touch_event());
1126 } 1105 }
1127 1106
1128 void RenderWidgetHostViewWin::OnKillFocus(HWND window) { 1107 void RenderWidgetHostViewWin::OnKillFocus(HWND window) {
1129 if (render_widget_host_) { 1108 if (render_widget_host_) {
1130 render_widget_host_->SetActive(false); 1109 render_widget_host_->SetActive(false);
1131 render_widget_host_->Blur(); 1110 render_widget_host_->Blur();
1132 } 1111 }
1133 if (touch_state_.ReleaseTouchPoints())
1134 render_widget_host_->ForwardTouchEvent(touch_state_.touch_event());
1135 } 1112 }
1136 1113
1137 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) { 1114 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) {
1138 if (render_widget_host_) 1115 if (render_widget_host_)
1139 render_widget_host_->LostCapture(); 1116 render_widget_host_->LostCapture();
1140 } 1117 }
1141 1118
1142 void RenderWidgetHostViewWin::OnCancelMode() { 1119 void RenderWidgetHostViewWin::OnCancelMode() {
1143 if (render_widget_host_) 1120 if (render_widget_host_)
1144 render_widget_host_->LostCapture(); 1121 render_widget_host_->LostCapture();
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 1563
1587 if (!handled_by_TabContents && render_widget_host_) { 1564 if (!handled_by_TabContents && render_widget_host_) {
1588 render_widget_host_->ForwardWheelEvent( 1565 render_widget_host_->ForwardWheelEvent(
1589 WebInputEventFactory::mouseWheelEvent(m_hWnd, message, wparam, 1566 WebInputEventFactory::mouseWheelEvent(m_hWnd, message, wparam,
1590 lparam)); 1567 lparam));
1591 } 1568 }
1592 handled = TRUE; 1569 handled = TRUE;
1593 return 0; 1570 return 0;
1594 } 1571 }
1595 1572
1596 RenderWidgetHostViewWin::WebTouchState::WebTouchState(const CWindowImpl* window)
1597 : window_(window) { }
1598
1599 size_t RenderWidgetHostViewWin::WebTouchState::UpdateTouchPoints(
1600 TOUCHINPUT* points, size_t count) {
1601 // First we reset all touch event state. This involves removing any released
1602 // touchpoints and marking the rest as stationary. After that we go through
1603 // and alter/add any touchpoints (from the touch input buffer) that we can
1604 // coalesce into a single message. The return value is the number of consumed
1605 // input message.
1606 WebKit::WebTouchPoint* point = touch_event_.touches;
1607 WebKit::WebTouchPoint* end = point + touch_event_.touchesLength;
1608 while (point < end) {
1609 if (point->state == WebKit::WebTouchPoint::StateReleased) {
1610 *point = *(--end);
1611 --touch_event_.touchesLength;
1612 } else {
1613 point->state = WebKit::WebTouchPoint::StateStationary;
1614 point++;
1615 }
1616 }
1617 touch_event_.changedTouchesLength = 0;
1618
1619 // Consume all events of the same type and add them to the changed list.
1620 int last_type = 0;
1621 for (size_t i = 0; i < count; ++i) {
1622 if (points[i].dwID == 0ul)
1623 continue;
1624
1625 WebKit::WebTouchPoint* point = NULL;
1626 for (unsigned j = 0; j < touch_event_.touchesLength; ++j) {
1627 if (static_cast<DWORD>(touch_event_.touches[j].id) == points[i].dwID) {
1628 point = &touch_event_.touches[j];
1629 break;
1630 }
1631 }
1632
1633 // Use a move instead if we see a down on a point we already have.
1634 int type = GetTouchType(points[i]);
1635 if (point && type == TOUCHEVENTF_DOWN)
1636 SetTouchType(&points[i], TOUCHEVENTF_MOVE);
1637
1638 // Stop processing when the event type changes.
1639 if (touch_event_.changedTouchesLength && type != last_type)
1640 return i;
1641
1642 last_type = type;
1643 switch (type) {
1644 case TOUCHEVENTF_DOWN: {
1645 if (!(point = AddTouchPoint(&points[i])))
1646 continue;
1647 touch_event_.type = WebKit::WebInputEvent::TouchStart;
1648 break;
1649 }
1650
1651 case TOUCHEVENTF_UP: {
1652 if (!point) // Just throw away a stray up.
1653 continue;
1654 point->state = WebKit::WebTouchPoint::StateReleased;
1655 UpdateTouchPoint(point, &points[i]);
1656 touch_event_.type = WebKit::WebInputEvent::TouchEnd;
1657 break;
1658 }
1659
1660 case TOUCHEVENTF_MOVE: {
1661 if (point) {
1662 point->state = WebKit::WebTouchPoint::StateMoved;
1663 // Don't update the message if the point didn't really move.
1664 if (UpdateTouchPoint(point, &points[i]))
1665 continue;
1666 touch_event_.type = WebKit::WebInputEvent::TouchMove;
1667 } else if (touch_event_.changedTouchesLength) {
1668 // Can't add a point if we're already handling move events.
1669 return i;
1670 } else {
1671 // Treat a move with no existing point as a down.
1672 if (!(point = AddTouchPoint(&points[i])))
1673 continue;
1674 last_type = TOUCHEVENTF_DOWN;
1675 SetTouchType(&points[i], TOUCHEVENTF_DOWN);
1676 touch_event_.type = WebKit::WebInputEvent::TouchStart;
1677 }
1678 break;
1679 }
1680
1681 default:
1682 NOTREACHED();
1683 continue;
1684 }
1685 touch_event_.changedTouches[touch_event_.changedTouchesLength++] = *point;
1686 }
1687
1688 return count;
1689 }
1690
1691 bool RenderWidgetHostViewWin::WebTouchState::ReleaseTouchPoints() {
1692 if (touch_event_.touchesLength == 0)
1693 return false;
1694 // Mark every active touchpoint as released.
1695 touch_event_.type = WebKit::WebInputEvent::TouchEnd;
1696 touch_event_.changedTouchesLength = touch_event_.touchesLength;
1697 for (unsigned int i = 0; i < touch_event_.touchesLength; ++i) {
1698 touch_event_.touches[i].state = WebKit::WebTouchPoint::StateReleased;
1699 touch_event_.changedTouches[i].state =
1700 WebKit::WebTouchPoint::StateReleased;
1701 }
1702
1703 return true;
1704 }
1705
1706 WebKit::WebTouchPoint* RenderWidgetHostViewWin::WebTouchState::AddTouchPoint(
1707 TOUCHINPUT* touch_input) {
1708 if (touch_event_.touchesLength >= WebKit::WebTouchEvent::touchesLengthCap)
1709 return NULL;
1710 WebKit::WebTouchPoint* point =
1711 &touch_event_.touches[touch_event_.touchesLength++];
1712 point->state = WebKit::WebTouchPoint::StatePressed;
1713 point->id = touch_input->dwID;
1714 UpdateTouchPoint(point, touch_input);
1715 return point;
1716 }
1717
1718 bool RenderWidgetHostViewWin::WebTouchState::UpdateTouchPoint(
1719 WebKit::WebTouchPoint* touch_point,
1720 TOUCHINPUT* touch_input) {
1721 CPoint coordinates(TOUCH_COORD_TO_PIXEL(touch_input->x),
1722 TOUCH_COORD_TO_PIXEL(touch_input->y));
1723 int radius_x = 1;
1724 int radius_y = 1;
1725 if (touch_input->dwMask & TOUCHINPUTMASKF_CONTACTAREA) {
1726 radius_x = TOUCH_COORD_TO_PIXEL(touch_input->cxContact);
1727 radius_y = TOUCH_COORD_TO_PIXEL(touch_input->cyContact);
1728 }
1729
1730 // Detect and exclude stationary moves.
1731 if (GetTouchType(*touch_input) == TOUCHEVENTF_MOVE &&
1732 touch_point->screenPosition.x == coordinates.x &&
1733 touch_point->screenPosition.y == coordinates.y &&
1734 touch_point->radiusX == radius_x &&
1735 touch_point->radiusY == radius_y) {
1736 touch_point->state = WebKit::WebTouchPoint::StateStationary;
1737 return true;
1738 }
1739
1740 touch_point->screenPosition.x = coordinates.x;
1741 touch_point->screenPosition.y = coordinates.y;
1742 window_->GetParent().ScreenToClient(&coordinates);
1743 touch_point->position.x = coordinates.x;
1744 touch_point->position.y = coordinates.y;
1745 touch_point->radiusX = radius_x;
1746 touch_point->radiusY = radius_y;
1747 touch_point->force = 0;
1748 touch_point->rotationAngle = 0;
1749 return false;
1750 }
1751
1752 LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam,
1753 LPARAM lparam, BOOL& handled) {
1754 // TODO(jschuh): Add support for an arbitrary number of touchpoints.
1755 size_t total = std::min(static_cast<int>(LOWORD(wparam)),
1756 static_cast<int>(WebKit::WebTouchEvent::touchesLengthCap));
1757 TOUCHINPUT points[WebKit::WebTouchEvent::touchesLengthCap];
1758
1759 if (!total || !GetTouchInputInfo((HTOUCHINPUT)lparam, total,
1760 points, sizeof(TOUCHINPUT))) {
1761 return 0;
1762 }
1763
1764 for (size_t start = 0; start < total;) {
1765 start += touch_state_.UpdateTouchPoints(points + start, total - start);
1766 if (touch_state_.is_changed())
1767 render_widget_host_->ForwardTouchEvent(touch_state_.touch_event());
1768 }
1769
1770 CloseTouchInputHandle((HTOUCHINPUT)lparam);
1771
1772 return 0;
1773 }
1774
1775 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT message, 1573 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT message,
1776 WPARAM wparam, 1574 WPARAM wparam,
1777 LPARAM lparam, 1575 LPARAM lparam,
1778 BOOL& handled) { 1576 BOOL& handled) {
1779 if (!render_widget_host_) 1577 if (!render_widget_host_)
1780 return MA_NOACTIVATE; 1578 return MA_NOACTIVATE;
1781 1579
1782 if (!IsActivatable()) 1580 if (!IsActivatable())
1783 return MA_NOACTIVATE; 1581 return MA_NOACTIVATE;
1784 1582
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
2428 2226
2429 size_t offset = selection_range_.GetMin() - selection_text_offset_; 2227 size_t offset = selection_range_.GetMin() - selection_text_offset_;
2430 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING), 2228 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING),
2431 selection_text_.c_str() + offset, len * sizeof(WCHAR)); 2229 selection_text_.c_str() + offset, len * sizeof(WCHAR));
2432 2230
2433 // According to Microsft API document, IMR_RECONVERTSTRING and 2231 // According to Microsft API document, IMR_RECONVERTSTRING and
2434 // IMR_DOCUMENTFEED should return reconv, but some applications return 2232 // IMR_DOCUMENTFEED should return reconv, but some applications return
2435 // need_size. 2233 // need_size.
2436 return reinterpret_cast<LRESULT>(reconv); 2234 return reinterpret_cast<LRESULT>(reconv);
2437 } 2235 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_win.h ('k') | content/public/common/content_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698