Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include <vector> | |
| 8 | 9 |
| 9 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 10 #include "base/i18n/rtl.h" | 11 #include "base/i18n/rtl.h" |
| 12 #include "base/logging.h" | |
| 11 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 12 #include "base/process_util.h" | 14 #include "base/process_util.h" |
| 13 #include "base/threading/thread.h" | 15 #include "base/threading/thread.h" |
| 14 #include "base/win/scoped_comptr.h" | 16 #include "base/win/scoped_comptr.h" |
| 15 #include "base/win/scoped_gdi_object.h" | 17 #include "base/win/scoped_gdi_object.h" |
| 18 #include "base/win/windows_version.h" | |
| 16 #include "base/win/win_util.h" | 19 #include "base/win/win_util.h" |
| 17 #include "base/win/windows_version.h" | 20 #include "base/win/windows_version.h" |
| 18 #include "base/win/wrapped_window_proc.h" | 21 #include "base/win/wrapped_window_proc.h" |
| 19 #include "content/browser/accessibility/browser_accessibility_manager.h" | 22 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 20 #include "content/browser/accessibility/browser_accessibility_state.h" | 23 #include "content/browser/accessibility/browser_accessibility_state.h" |
| 21 #include "content/browser/accessibility/browser_accessibility_win.h" | 24 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 22 #include "content/browser/plugin_process_host.h" | 25 #include "content/browser/plugin_process_host.h" |
| 23 #include "content/browser/renderer_host/backing_store.h" | 26 #include "content/browser/renderer_host/backing_store.h" |
| 24 #include "content/browser/renderer_host/backing_store_win.h" | 27 #include "content/browser/renderer_host/backing_store_win.h" |
| 25 #include "content/browser/renderer_host/render_process_host.h" | 28 #include "content/browser/renderer_host/render_process_host.h" |
| (...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 882 // Single finger panning is consistent with other windows applications. | 885 // Single finger panning is consistent with other windows applications. |
| 883 const DWORD gesture_allow = GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | | 886 const DWORD gesture_allow = GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | |
| 884 GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY; | 887 GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY; |
| 885 const DWORD gesture_block = GC_PAN_WITH_GUTTER; | 888 const DWORD gesture_block = GC_PAN_WITH_GUTTER; |
| 886 GESTURECONFIG gc[] = { | 889 GESTURECONFIG gc[] = { |
| 887 { GID_ZOOM, GC_ZOOM, 0 }, | 890 { GID_ZOOM, GC_ZOOM, 0 }, |
| 888 { GID_PAN, gesture_allow , gesture_block}, | 891 { GID_PAN, gesture_allow , gesture_block}, |
| 889 { GID_TWOFINGERTAP, GC_TWOFINGERTAP , 0}, | 892 { GID_TWOFINGERTAP, GC_TWOFINGERTAP , 0}, |
| 890 { GID_PRESSANDTAP, GC_PRESSANDTAP , 0} | 893 { GID_PRESSANDTAP, GC_PRESSANDTAP , 0} |
| 891 }; | 894 }; |
| 892 if (!SetGestureConfig(m_hWnd, 0, arraysize(gc), gc, sizeof(GESTURECONFIG))) | 895 if (base::win::GetVersion() >= base::win::VERSION_WIN7 && |
| 893 { | 896 CommandLine::ForCurrentProcess()->HasSwitch( |
| 897 switches::kEnableTouchEvents)) { | |
| 898 DCHECK(RegisterTouchWindow(m_hWnd, 0)); | |
|
cpu_(ooo_6.6-7.5)
2011/11/08 02:34:04
bug: on release RTE is not called.
jschuh
2011/11/08 17:12:41
I'm confused. Are you saying I need a call to Unre
cpu_(ooo_6.6-7.5)
2011/11/08 19:20:14
No. release build. dcheck goes *puff*
| |
| 899 } else if (!SetGestureConfig(m_hWnd, 0, arraysize(gc), gc, | |
| 900 sizeof(GESTURECONFIG))) { | |
|
cpu_(ooo_6.6-7.5)
2011/11/08 02:34:04
886 to 893 should be moved inside this block and t
jschuh
2011/11/08 17:12:41
Ugh, merge noise. Sorry, I should have caught that
| |
| 894 NOTREACHED(); | 901 NOTREACHED(); |
| 895 } | 902 } |
| 896 } | 903 } |
| 897 | 904 |
| 898 return 0; | 905 return 0; |
| 899 } | 906 } |
| 900 | 907 |
| 901 void RenderWidgetHostViewWin::OnActivate(UINT action, BOOL minimized, | 908 void RenderWidgetHostViewWin::OnActivate(UINT action, BOOL minimized, |
| 902 HWND window) { | 909 HWND window) { |
| 903 // If the container is a popup, clicking elsewhere on screen should close the | 910 // If the container is a popup, clicking elsewhere on screen should close the |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1095 return 0; | 1102 return 0; |
| 1096 } | 1103 } |
| 1097 | 1104 |
| 1098 void RenderWidgetHostViewWin::OnSetFocus(HWND window) { | 1105 void RenderWidgetHostViewWin::OnSetFocus(HWND window) { |
| 1099 if (browser_accessibility_manager_.get()) | 1106 if (browser_accessibility_manager_.get()) |
| 1100 browser_accessibility_manager_->GotFocus(); | 1107 browser_accessibility_manager_->GotFocus(); |
| 1101 if (render_widget_host_) { | 1108 if (render_widget_host_) { |
| 1102 render_widget_host_->GotFocus(); | 1109 render_widget_host_->GotFocus(); |
| 1103 render_widget_host_->SetActive(true); | 1110 render_widget_host_->SetActive(true); |
| 1104 } | 1111 } |
| 1112 FinishTouchEvent(); | |
| 1105 } | 1113 } |
| 1106 | 1114 |
| 1107 void RenderWidgetHostViewWin::OnKillFocus(HWND window) { | 1115 void RenderWidgetHostViewWin::OnKillFocus(HWND window) { |
| 1108 if (render_widget_host_) { | 1116 if (render_widget_host_) { |
| 1109 render_widget_host_->SetActive(false); | 1117 render_widget_host_->SetActive(false); |
| 1110 render_widget_host_->Blur(); | 1118 render_widget_host_->Blur(); |
| 1111 } | 1119 } |
| 1120 FinishTouchEvent(); | |
| 1112 } | 1121 } |
| 1113 | 1122 |
| 1114 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) { | 1123 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) { |
| 1115 if (render_widget_host_) | 1124 if (render_widget_host_) |
| 1116 render_widget_host_->LostCapture(); | 1125 render_widget_host_->LostCapture(); |
| 1117 } | 1126 } |
| 1118 | 1127 |
| 1119 void RenderWidgetHostViewWin::OnCancelMode() { | 1128 void RenderWidgetHostViewWin::OnCancelMode() { |
| 1120 if (render_widget_host_) | 1129 if (render_widget_host_) |
| 1121 render_widget_host_->LostCapture(); | 1130 render_widget_host_->LostCapture(); |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1563 | 1572 |
| 1564 if (!handled_by_TabContents && render_widget_host_) { | 1573 if (!handled_by_TabContents && render_widget_host_) { |
| 1565 render_widget_host_->ForwardWheelEvent( | 1574 render_widget_host_->ForwardWheelEvent( |
| 1566 WebInputEventFactory::mouseWheelEvent(m_hWnd, message, wparam, | 1575 WebInputEventFactory::mouseWheelEvent(m_hWnd, message, wparam, |
| 1567 lparam)); | 1576 lparam)); |
| 1568 } | 1577 } |
| 1569 handled = TRUE; | 1578 handled = TRUE; |
| 1570 return 0; | 1579 return 0; |
| 1571 } | 1580 } |
| 1572 | 1581 |
| 1582 void RenderWidgetHostViewWin::FinishTouchEvent() { | |
| 1583 if (touch_event_.touchesLength == 0) | |
| 1584 return; | |
| 1585 | |
| 1586 // Release all active touchpoints. | |
| 1587 for (unsigned int i = 0; i < touch_event_.touchesLength; ++i) { | |
| 1588 touch_event_.touches[i].state = WebKit::WebTouchPoint::StateReleased; | |
| 1589 touch_event_.changedTouches[i].state = | |
| 1590 WebKit::WebTouchPoint::StateReleased; | |
| 1591 } | |
| 1592 touch_event_.changedTouchesLength = touch_event_.touchesLength = 0; | |
| 1593 touch_event_.type = WebKit::WebInputEvent::TouchEnd; | |
| 1594 render_widget_host_->ForwardTouchEvent(touch_event_); | |
| 1595 touch_event_.touchesLength = 0; | |
| 1596 } | |
| 1597 | |
| 1598 WebKit::WebTouchPoint* RenderWidgetHostViewWin::AddTouchPoint( | |
| 1599 TOUCHINPUT* touch_input) { | |
| 1600 if (touch_event_.touchesLength >= WebKit::WebTouchEvent::touchesLengthCap) | |
| 1601 return NULL; | |
| 1602 WebKit::WebTouchPoint* point = | |
| 1603 &touch_event_.touches[touch_event_.touchesLength++]; | |
| 1604 point->state = WebKit::WebTouchPoint::StatePressed; | |
| 1605 point->id = touch_input->dwID; | |
| 1606 UpdateTouchPoint(point, touch_input); | |
| 1607 return point; | |
| 1608 } | |
| 1609 | |
| 1610 bool RenderWidgetHostViewWin::UpdateTouchPoint( | |
| 1611 WebKit::WebTouchPoint* touch_point, | |
| 1612 TOUCHINPUT* touch_input) { | |
| 1613 CPoint coordinates(TOUCH_COORD_TO_PIXEL(touch_input->x), | |
| 1614 TOUCH_COORD_TO_PIXEL(touch_input->y)); | |
| 1615 int radius_x = 0; | |
| 1616 int radius_y = 0; | |
| 1617 if (touch_input->dwMask & TOUCHINPUTMASKF_CONTACTAREA) { | |
| 1618 radius_x = TOUCH_COORD_TO_PIXEL(touch_input->cxContact); | |
| 1619 radius_y = TOUCH_COORD_TO_PIXEL(touch_input->cyContact); | |
| 1620 } | |
| 1621 | |
| 1622 // Detect and exclude stationary moves. | |
| 1623 if (touch_point->state == WebKit::WebTouchPoint::StateMoved && | |
| 1624 touch_point->screenPosition.x == coordinates.x && | |
| 1625 touch_point->screenPosition.y == coordinates.y && | |
| 1626 touch_point->radiusX == radius_x && | |
| 1627 touch_point->radiusY == radius_y) { | |
| 1628 touch_point->state = WebKit::WebTouchPoint::StateStationary; | |
| 1629 return true; | |
| 1630 } | |
| 1631 | |
| 1632 touch_point->screenPosition.x = coordinates.x; | |
| 1633 touch_point->screenPosition.y = coordinates.y; | |
| 1634 GetParent().ScreenToClient(&coordinates); | |
| 1635 touch_point->position.x = coordinates.x; | |
| 1636 touch_point->position.y = coordinates.y; | |
| 1637 touch_point->radiusX = radius_x; | |
| 1638 touch_point->radiusY = radius_y; | |
| 1639 touch_point->force = 1.0; | |
| 1640 touch_point->rotationAngle = 0; | |
| 1641 return false; | |
| 1642 } | |
| 1643 | |
| 1644 LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam, | |
| 1645 LPARAM lparam, BOOL& handled) { | |
| 1646 unsigned int touches_down = 0; | |
| 1647 unsigned int touches_up = 0; | |
| 1648 unsigned int touches_moved = 0; | |
| 1649 // TODO(jschuh): Add support for an arbitrary number of touchpoints. | |
| 1650 size_t points_count = std::min(static_cast<int>(LOWORD(wparam)), | |
| 1651 static_cast<int>(WebKit::WebTouchEvent::touchesLengthCap)); | |
| 1652 TOUCHINPUT points[WebKit::WebTouchEvent::touchesLengthCap]; | |
| 1653 | |
| 1654 if (points_count > WebKit::WebTouchEvent::touchesLengthCap) | |
| 1655 points_count = WebKit::WebTouchEvent::touchesLengthCap; | |
| 1656 if (!points_count || !GetTouchInputInfo((HTOUCHINPUT)lparam, points_count, | |
| 1657 points, sizeof(TOUCHINPUT))) { | |
| 1658 return 0; | |
| 1659 } | |
| 1660 touch_event_.changedTouchesLength = 0; | |
| 1661 | |
| 1662 for (size_t i = 0; i < points_count; i++) { | |
| 1663 if (points[i].dwID == 0ul) | |
| 1664 continue; | |
| 1665 | |
| 1666 WebKit::WebTouchPoint* point = NULL; | |
| 1667 for (unsigned j = 0; j < touch_event_.touchesLength; ++j) { | |
| 1668 if (static_cast<DWORD>(touch_event_.touches[j].id) == points[i].dwID) { | |
| 1669 point = &touch_event_.touches[j]; | |
| 1670 break; | |
| 1671 } | |
| 1672 } | |
| 1673 | |
| 1674 // Use a move instead if we see a down on a point we already have. | |
| 1675 if (point && (points[i].dwFlags & 0x7) == TOUCHEVENTF_DOWN) | |
| 1676 points[i].dwFlags = (points[i].dwFlags & ~0x7) | TOUCHEVENTF_MOVE; | |
| 1677 | |
| 1678 switch (points[i].dwFlags & 0x7) { | |
| 1679 case TOUCHEVENTF_DOWN: { | |
| 1680 if (!(point = AddTouchPoint(&points[i]))) | |
| 1681 continue; | |
| 1682 ++touches_down; | |
| 1683 break; | |
| 1684 } | |
| 1685 | |
| 1686 case TOUCHEVENTF_UP: { | |
| 1687 if (!point) | |
| 1688 continue; | |
| 1689 point->state = WebKit::WebTouchPoint::StateReleased; | |
| 1690 UpdateTouchPoint(point, &points[i]); | |
| 1691 ++touches_up; | |
| 1692 break; | |
| 1693 } | |
| 1694 | |
| 1695 case TOUCHEVENTF_MOVE: { | |
| 1696 if (point) { | |
| 1697 point->state = WebKit::WebTouchPoint::StateMoved; | |
| 1698 // Don't update the message if the point didn't really move. | |
| 1699 if (UpdateTouchPoint(point, &points[i])) | |
| 1700 continue; | |
| 1701 ++touches_moved; | |
| 1702 } else { // Add a new point if we missed the TOUCHEVENTF_DOWN | |
| 1703 if (!(point = AddTouchPoint(&points[i]))) | |
| 1704 continue; | |
| 1705 ++touches_down; | |
| 1706 } | |
| 1707 break; | |
| 1708 } | |
| 1709 | |
| 1710 default: | |
| 1711 NOTREACHED(); | |
| 1712 continue; | |
| 1713 } | |
| 1714 touch_event_.changedTouches[touch_event_.changedTouchesLength++] = *point; | |
| 1715 } | |
| 1716 | |
| 1717 CloseTouchInputHandle((HTOUCHINPUT)lparam); | |
| 1718 | |
| 1719 // Set the event type based on what we've received. | |
| 1720 if (touches_down) | |
| 1721 touch_event_.type = WebKit::WebInputEvent::TouchStart; | |
| 1722 else if (touches_up) | |
| 1723 touch_event_.type = WebKit::WebInputEvent::TouchEnd; | |
| 1724 else if (touches_moved) | |
| 1725 touch_event_.type = WebKit::WebInputEvent::TouchMove; | |
| 1726 else | |
| 1727 touch_event_.type = WebKit::WebInputEvent::Undefined; | |
| 1728 | |
| 1729 // Forward the event only when there's a legitimate change. | |
| 1730 if (touch_event_.changedTouchesLength) | |
| 1731 render_widget_host_->ForwardTouchEvent(touch_event_); | |
| 1732 | |
| 1733 // Clean up released touches and reset everything else to staitonary. | |
| 1734 WebKit::WebTouchPoint* point = touch_event_.touches; | |
| 1735 WebKit::WebTouchPoint* end = | |
| 1736 &touch_event_.touches[touch_event_.touchesLength]; | |
| 1737 while (point < end) { | |
| 1738 if (point->state == WebKit::WebTouchPoint::StateReleased) { | |
| 1739 *point = *(--end); | |
| 1740 --touch_event_.touchesLength; | |
| 1741 } else { | |
| 1742 point->state = WebKit::WebTouchPoint::StateStationary; | |
| 1743 point++; | |
| 1744 } | |
| 1745 } | |
| 1746 | |
| 1747 return 0; | |
| 1748 } | |
| 1749 | |
| 1573 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT message, | 1750 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT message, |
| 1574 WPARAM wparam, | 1751 WPARAM wparam, |
| 1575 LPARAM lparam, | 1752 LPARAM lparam, |
| 1576 BOOL& handled) { | 1753 BOOL& handled) { |
| 1577 if (!render_widget_host_) | 1754 if (!render_widget_host_) |
| 1578 return MA_NOACTIVATE; | 1755 return MA_NOACTIVATE; |
| 1579 | 1756 |
| 1580 if (!IsActivatable()) | 1757 if (!IsActivatable()) |
| 1581 return MA_NOACTIVATE; | 1758 return MA_NOACTIVATE; |
| 1582 | 1759 |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2225 | 2402 |
| 2226 size_t offset = selection_range_.GetMin() - selection_text_offset_; | 2403 size_t offset = selection_range_.GetMin() - selection_text_offset_; |
| 2227 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING), | 2404 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING), |
| 2228 selection_text_.c_str() + offset, len * sizeof(WCHAR)); | 2405 selection_text_.c_str() + offset, len * sizeof(WCHAR)); |
| 2229 | 2406 |
| 2230 // According to Microsft API document, IMR_RECONVERTSTRING and | 2407 // According to Microsft API document, IMR_RECONVERTSTRING and |
| 2231 // IMR_DOCUMENTFEED should return reconv, but some applications return | 2408 // IMR_DOCUMENTFEED should return reconv, but some applications return |
| 2232 // need_size. | 2409 // need_size. |
| 2233 return reinterpret_cast<LRESULT>(reconv); | 2410 return reinterpret_cast<LRESULT>(reconv); |
| 2234 } | 2411 } |
| OLD | NEW |