Chromium Code Reviews| 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 "ui/views/win/hwnd_message_handler.h" | 5 #include "ui/views/win/hwnd_message_handler.h" |
| 6 | 6 |
| 7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
| 8 #include <oleacc.h> | 8 #include <oleacc.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 #include <tchar.h> | 10 #include <tchar.h> |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 const int kAutoHideTaskbarThicknessPx = 2; | 216 const int kAutoHideTaskbarThicknessPx = 2; |
| 217 | 217 |
| 218 bool IsTopLevelWindow(HWND window) { | 218 bool IsTopLevelWindow(HWND window) { |
| 219 long style = ::GetWindowLong(window, GWL_STYLE); | 219 long style = ::GetWindowLong(window, GWL_STYLE); |
| 220 if (!(style & WS_CHILD)) | 220 if (!(style & WS_CHILD)) |
| 221 return true; | 221 return true; |
| 222 HWND parent = ::GetParent(window); | 222 HWND parent = ::GetParent(window); |
| 223 return !parent || (parent == ::GetDesktopWindow()); | 223 return !parent || (parent == ::GetDesktopWindow()); |
| 224 } | 224 } |
| 225 | 225 |
| 226 ui::EventType GetTouchEventType(POINTER_FLAGS pointer_flags) { | |
| 227 if (pointer_flags & POINTER_FLAG_DOWN) | |
| 228 return ui::ET_TOUCH_PRESSED; | |
| 229 if (pointer_flags & POINTER_FLAG_UPDATE) | |
| 230 return ui::ET_TOUCH_MOVED; | |
| 231 if (pointer_flags & POINTER_FLAG_UP) | |
| 232 return ui::ET_TOUCH_RELEASED; | |
| 233 return ui::ET_TOUCH_MOVED; | |
| 234 } | |
| 235 | |
| 226 const int kTouchDownContextResetTimeout = 500; | 236 const int kTouchDownContextResetTimeout = 500; |
| 227 | 237 |
| 228 // Windows does not flag synthesized mouse messages from touch in all cases. | 238 // Windows does not flag synthesized mouse messages from touch in all cases. |
| 229 // This causes us grief as we don't want to process touch and mouse messages | 239 // This causes us grief as we don't want to process touch and mouse messages |
| 230 // concurrently. Hack as per msdn is to check if the time difference between | 240 // concurrently. Hack as per msdn is to check if the time difference between |
| 231 // the touch message and the mouse move is within 500 ms and at the same | 241 // the touch message and the mouse move is within 500 ms and at the same |
| 232 // location as the cursor. | 242 // location as the cursor. |
| 233 const int kSynthesizedMouseTouchMessagesTimeDifference = 500; | 243 const int kSynthesizedMouseTouchMessagesTimeDifference = 500; |
| 234 | 244 |
| 235 } // namespace | 245 } // namespace |
| (...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1665 } | 1675 } |
| 1666 | 1676 |
| 1667 UINT32 pointer_id = GET_POINTERID_WPARAM(w_param); | 1677 UINT32 pointer_id = GET_POINTERID_WPARAM(w_param); |
| 1668 using GetPointerTypeFn = BOOL(WINAPI*)(UINT32, POINTER_INPUT_TYPE*); | 1678 using GetPointerTypeFn = BOOL(WINAPI*)(UINT32, POINTER_INPUT_TYPE*); |
| 1669 POINTER_INPUT_TYPE pointer_type; | 1679 POINTER_INPUT_TYPE pointer_type; |
| 1670 static GetPointerTypeFn get_pointer_type = reinterpret_cast<GetPointerTypeFn>( | 1680 static GetPointerTypeFn get_pointer_type = reinterpret_cast<GetPointerTypeFn>( |
| 1671 GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerType")); | 1681 GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerType")); |
| 1672 // If the WM_POINTER messages are not sent from a stylus device, then we do | 1682 // If the WM_POINTER messages are not sent from a stylus device, then we do |
| 1673 // not handle them to make sure we do not change the current behavior of | 1683 // not handle them to make sure we do not change the current behavior of |
| 1674 // touch and mouse inputs. | 1684 // touch and mouse inputs. |
| 1675 if (!get_pointer_type || !get_pointer_type(pointer_id, &pointer_type) || | 1685 if (!get_pointer_type || !get_pointer_type(pointer_id, &pointer_type)) { |
| 1676 pointer_type != PT_PEN) { | |
| 1677 SetMsgHandled(FALSE); | 1686 SetMsgHandled(FALSE); |
| 1678 return -1; | 1687 return -1; |
| 1679 } | 1688 } |
| 1680 | 1689 |
| 1681 using GetPointerPenInfoFn = BOOL(WINAPI*)(UINT32, POINTER_PEN_INFO*); | 1690 if (pointer_type == PT_PEN) { |
|
dtapuska
2017/05/26 17:56:45
Can't this be a switch?
lanwei
2017/05/29 18:29:43
Done.
| |
| 1682 POINTER_PEN_INFO pointer_pen_info; | 1691 return HandleMouseEventForPen(message, w_param, l_param); |
| 1683 static GetPointerPenInfoFn get_pointer_pen_info = | 1692 } else if (pointer_type == PT_TOUCH) { |
| 1684 reinterpret_cast<GetPointerPenInfoFn>( | 1693 return HandleTouchEvent(message, w_param, l_param); |
| 1685 GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerPenInfo")); | 1694 } else { |
| 1686 if (!get_pointer_pen_info || | |
| 1687 !get_pointer_pen_info(pointer_id, &pointer_pen_info)) { | |
| 1688 SetMsgHandled(FALSE); | 1695 SetMsgHandled(FALSE); |
| 1689 return -1; | 1696 return -1; |
| 1690 } | 1697 } |
| 1691 | |
| 1692 // We are now creating a fake mouse event with pointer type of pen from | |
| 1693 // the WM_POINTER message and then setting up an associated pointer | |
| 1694 // details in the MouseEvent which contains the pen's information. | |
| 1695 ui::EventPointerType input_type = ui::EventPointerType::POINTER_TYPE_PEN; | |
| 1696 // TODO(lanwei): penFlags of PEN_FLAG_INVERTED may also indicate we are using | |
| 1697 // an eraser, but it is under debate. Please see | |
| 1698 // https://github.com/w3c/pointerevents/issues/134/. | |
| 1699 if (pointer_pen_info.penFlags & PEN_FLAG_ERASER) | |
| 1700 input_type = ui::EventPointerType::POINTER_TYPE_ERASER; | |
| 1701 | |
| 1702 float pressure = static_cast<float>(pointer_pen_info.pressure) / 1024; | |
| 1703 float rotation = pointer_pen_info.rotation; | |
| 1704 int tilt_x = pointer_pen_info.tiltX; | |
| 1705 int tilt_y = pointer_pen_info.tiltY; | |
| 1706 POINT client_point = pointer_pen_info.pointerInfo.ptPixelLocationRaw; | |
| 1707 ScreenToClient(hwnd(), &client_point); | |
| 1708 gfx::Point point = gfx::Point(client_point.x, client_point.y); | |
| 1709 ui::EventType event_type = ui::ET_MOUSE_MOVED; | |
| 1710 int flag = 0; | |
| 1711 int click_count = 0; | |
| 1712 switch (message) { | |
| 1713 case WM_POINTERDOWN: | |
| 1714 event_type = ui::ET_MOUSE_PRESSED; | |
| 1715 if (pointer_pen_info.pointerInfo.ButtonChangeType == | |
| 1716 POINTER_CHANGE_SECONDBUTTON_DOWN) { | |
| 1717 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 1718 } else { | |
| 1719 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 1720 } | |
| 1721 click_count = 1; | |
| 1722 break; | |
| 1723 case WM_POINTERUP: | |
| 1724 event_type = ui::ET_MOUSE_RELEASED; | |
| 1725 if (pointer_pen_info.pointerInfo.ButtonChangeType == | |
| 1726 POINTER_CHANGE_SECONDBUTTON_UP) { | |
| 1727 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 1728 } else { | |
| 1729 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 1730 } | |
| 1731 click_count = 1; | |
| 1732 break; | |
| 1733 case WM_POINTERUPDATE: | |
| 1734 event_type = ui::ET_MOUSE_DRAGGED; | |
| 1735 if (pointer_pen_info.pointerInfo.pointerFlags & | |
| 1736 POINTER_FLAG_FIRSTBUTTON) { | |
| 1737 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 1738 } else if (pointer_pen_info.pointerInfo.pointerFlags & | |
| 1739 POINTER_FLAG_SECONDBUTTON) { | |
| 1740 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 1741 } else { | |
| 1742 event_type = ui::ET_MOUSE_MOVED; | |
| 1743 } | |
| 1744 break; | |
| 1745 case WM_POINTERENTER: | |
| 1746 event_type = ui::ET_MOUSE_ENTERED; | |
| 1747 break; | |
| 1748 case WM_POINTERLEAVE: | |
| 1749 event_type = ui::ET_MOUSE_EXITED; | |
| 1750 break; | |
| 1751 default: | |
| 1752 NOTREACHED(); | |
| 1753 } | |
| 1754 ui::PointerDetails pointer_details( | |
| 1755 input_type, pointer_id, /* radius_x */ 0.0f, /* radius_y */ 0.0f, | |
| 1756 pressure, tilt_x, tilt_y, /* tangential_pressure */ 0.0f, rotation); | |
| 1757 ui::MouseEvent event(event_type, point, point, base::TimeTicks::Now(), flag, | |
| 1758 flag, pointer_details); | |
| 1759 event.SetClickCount(click_count); | |
| 1760 | |
| 1761 // There are cases where the code handling the message destroys the | |
| 1762 // window, so use the weak ptr to check if destruction occured or not. | |
| 1763 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | |
| 1764 bool handled = delegate_->HandleMouseEvent(event); | |
| 1765 | |
| 1766 if (ref) | |
| 1767 SetMsgHandled(handled); | |
| 1768 return 0; | |
| 1769 } | 1698 } |
| 1770 | 1699 |
| 1771 void HWNDMessageHandler::OnMove(const gfx::Point& point) { | 1700 void HWNDMessageHandler::OnMove(const gfx::Point& point) { |
| 1772 delegate_->HandleMove(); | 1701 delegate_->HandleMove(); |
| 1773 SetMsgHandled(FALSE); | 1702 SetMsgHandled(FALSE); |
| 1774 } | 1703 } |
| 1775 | 1704 |
| 1776 void HWNDMessageHandler::OnMoving(UINT param, const RECT* new_bounds) { | 1705 void HWNDMessageHandler::OnMoving(UINT param, const RECT* new_bounds) { |
| 1777 delegate_->HandleMove(); | 1706 delegate_->HandleMove(); |
| 1778 } | 1707 } |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2699 // Please refer to the HandleMouseInputForCaption() function for more | 2628 // Please refer to the HandleMouseInputForCaption() function for more |
| 2700 // information. | 2629 // information. |
| 2701 if (!handled) | 2630 if (!handled) |
| 2702 handled = HandleMouseInputForCaption(message, w_param, l_param); | 2631 handled = HandleMouseInputForCaption(message, w_param, l_param); |
| 2703 | 2632 |
| 2704 if (ref.get()) | 2633 if (ref.get()) |
| 2705 SetMsgHandled(handled); | 2634 SetMsgHandled(handled); |
| 2706 return 0; | 2635 return 0; |
| 2707 } | 2636 } |
| 2708 | 2637 |
| 2638 LRESULT HWNDMessageHandler::HandleTouchEvent(UINT message, | |
| 2639 WPARAM w_param, | |
| 2640 LPARAM l_param) { | |
| 2641 UINT32 pointer_id = GET_POINTERID_WPARAM(w_param); | |
| 2642 using GetPointerTouchInfoFn = BOOL(WINAPI*)(UINT32, POINTER_TOUCH_INFO*); | |
| 2643 POINTER_TOUCH_INFO pointer_touch_info; | |
| 2644 static GetPointerTouchInfoFn get_pointer_touch_info = | |
| 2645 reinterpret_cast<GetPointerTouchInfoFn>(GetProcAddress( | |
| 2646 GetModuleHandleA("user32.dll"), "GetPointerTouchInfo")); | |
| 2647 if (!get_pointer_touch_info || | |
| 2648 !get_pointer_touch_info(pointer_id, &pointer_touch_info)) { | |
| 2649 SetMsgHandled(FALSE); | |
| 2650 return -1; | |
| 2651 } | |
| 2652 | |
| 2653 POINTER_INFO pointer_info = pointer_touch_info.pointerInfo; | |
| 2654 | |
| 2655 POINT client_point = pointer_info.ptPixelLocationRaw; | |
| 2656 ScreenToClient(hwnd(), &client_point); | |
| 2657 gfx::Point touch_point = gfx::Point(client_point.x, client_point.y); | |
| 2658 | |
| 2659 POINTER_FLAGS pointer_flags = pointer_info.pointerFlags; | |
| 2660 ui::EventType event_type = GetTouchEventType(pointer_flags); | |
| 2661 const base::TimeTicks event_time = base::TimeTicks::Now(); | |
| 2662 | |
| 2663 float pressure = static_cast<float>(pointer_touch_info.pressure) / 1024; | |
| 2664 float radius_x = | |
| 2665 (pointer_touch_info.rcContact.right - pointer_touch_info.rcContact.left) / | |
| 2666 2.0; | |
| 2667 float radius_y = | |
| 2668 (pointer_touch_info.rcContact.bottom - pointer_touch_info.rcContact.top) / | |
| 2669 2.0; | |
| 2670 int rotation_angle = pointer_touch_info.orientation; | |
|
dtapuska
2017/05/26 17:56:45
Seems really odd that we have a different definiti
dtapuska
2017/05/26 18:08:21
Navid will likely need to comment. I see that we d
lanwei
2017/05/26 19:24:56
I can set twist too in ui::PointerDetails, twist a
mustaq
2017/05/26 19:59:14
Good catch Dave. We need to get rid of one of thes
| |
| 2671 rotation_angle %= 180; | |
| 2672 if (rotation_angle < 0) | |
| 2673 rotation_angle += 180; | |
| 2674 if (rotation_angle >= 90) { | |
| 2675 radius_x = radius_y; | |
| 2676 radius_y = (pointer_touch_info.rcContact.right - | |
| 2677 pointer_touch_info.rcContact.left) / | |
| 2678 2.0; | |
| 2679 rotation_angle -= 90; | |
| 2680 } | |
| 2681 | |
| 2682 ui::TouchEvent event( | |
| 2683 event_type, touch_point, event_time, | |
| 2684 ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, pointer_id, | |
| 2685 radius_x, radius_y, pressure), | |
| 2686 ui::GetModifiersFromKeyState(), rotation_angle); | |
| 2687 | |
| 2688 event.latency()->AddLatencyNumberWithTimestamp( | |
| 2689 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, 0, event_time, 1); | |
| 2690 | |
| 2691 // There are cases where the code handling the message destroys the | |
| 2692 // window, so use the weak ptr to check if destruction occured or not. | |
| 2693 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | |
| 2694 delegate_->HandleTouchEvent(event); | |
| 2695 | |
| 2696 if (ref) | |
| 2697 SetMsgHandled(TRUE); | |
| 2698 return 0; | |
| 2699 } | |
| 2700 | |
| 2701 LRESULT HWNDMessageHandler::HandleMouseEventForPen(UINT message, | |
| 2702 WPARAM w_param, | |
| 2703 LPARAM l_param) { | |
| 2704 UINT32 pointer_id = GET_POINTERID_WPARAM(w_param); | |
| 2705 using GetPointerPenInfoFn = BOOL(WINAPI*)(UINT32, POINTER_PEN_INFO*); | |
| 2706 POINTER_PEN_INFO pointer_pen_info; | |
| 2707 static GetPointerPenInfoFn get_pointer_pen_info = | |
| 2708 reinterpret_cast<GetPointerPenInfoFn>( | |
| 2709 GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerPenInfo")); | |
| 2710 if (!get_pointer_pen_info || | |
| 2711 !get_pointer_pen_info(pointer_id, &pointer_pen_info)) { | |
| 2712 SetMsgHandled(FALSE); | |
| 2713 return -1; | |
| 2714 } | |
| 2715 | |
| 2716 // We are now creating a fake mouse event with pointer type of pen from | |
| 2717 // the WM_POINTER message and then setting up an associated pointer | |
| 2718 // details in the MouseEvent which contains the pen's information. | |
| 2719 ui::EventPointerType input_type = ui::EventPointerType::POINTER_TYPE_PEN; | |
| 2720 // TODO(lanwei): penFlags of PEN_FLAG_INVERTED may also indicate we are using | |
| 2721 // an eraser, but it is under debate. Please see | |
| 2722 // https://github.com/w3c/pointerevents/issues/134/. | |
| 2723 if (pointer_pen_info.penFlags & PEN_FLAG_ERASER) | |
| 2724 input_type = ui::EventPointerType::POINTER_TYPE_ERASER; | |
| 2725 | |
| 2726 float pressure = static_cast<float>(pointer_pen_info.pressure) / 1024; | |
| 2727 float rotation = pointer_pen_info.rotation; | |
| 2728 int tilt_x = pointer_pen_info.tiltX; | |
| 2729 int tilt_y = pointer_pen_info.tiltY; | |
| 2730 POINT client_point = pointer_pen_info.pointerInfo.ptPixelLocationRaw; | |
| 2731 ScreenToClient(hwnd(), &client_point); | |
| 2732 gfx::Point point = gfx::Point(client_point.x, client_point.y); | |
| 2733 ui::EventType event_type = ui::ET_MOUSE_MOVED; | |
| 2734 int flag = 0; | |
| 2735 int click_count = 0; | |
| 2736 switch (message) { | |
| 2737 case WM_POINTERDOWN: | |
| 2738 event_type = ui::ET_MOUSE_PRESSED; | |
| 2739 if (pointer_pen_info.pointerInfo.ButtonChangeType == | |
| 2740 POINTER_CHANGE_SECONDBUTTON_DOWN) { | |
| 2741 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 2742 } else { | |
| 2743 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 2744 } | |
| 2745 click_count = 1; | |
| 2746 break; | |
| 2747 case WM_POINTERUP: | |
| 2748 event_type = ui::ET_MOUSE_RELEASED; | |
| 2749 if (pointer_pen_info.pointerInfo.ButtonChangeType == | |
| 2750 POINTER_CHANGE_SECONDBUTTON_UP) { | |
| 2751 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 2752 } else { | |
| 2753 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 2754 } | |
| 2755 click_count = 1; | |
| 2756 break; | |
| 2757 case WM_POINTERUPDATE: | |
| 2758 event_type = ui::ET_MOUSE_DRAGGED; | |
| 2759 if (pointer_pen_info.pointerInfo.pointerFlags & | |
| 2760 POINTER_FLAG_FIRSTBUTTON) { | |
| 2761 flag = ui::EF_LEFT_MOUSE_BUTTON; | |
| 2762 } else if (pointer_pen_info.pointerInfo.pointerFlags & | |
| 2763 POINTER_FLAG_SECONDBUTTON) { | |
| 2764 flag = ui::EF_RIGHT_MOUSE_BUTTON; | |
| 2765 } else { | |
| 2766 event_type = ui::ET_MOUSE_MOVED; | |
| 2767 } | |
| 2768 break; | |
| 2769 case WM_POINTERENTER: | |
| 2770 event_type = ui::ET_MOUSE_ENTERED; | |
| 2771 break; | |
| 2772 case WM_POINTERLEAVE: | |
| 2773 event_type = ui::ET_MOUSE_EXITED; | |
| 2774 break; | |
| 2775 default: | |
| 2776 NOTREACHED(); | |
| 2777 } | |
| 2778 ui::PointerDetails pointer_details( | |
| 2779 input_type, pointer_id, /* radius_x */ 0.0f, /* radius_y */ 0.0f, | |
| 2780 pressure, tilt_x, tilt_y, /* tangential_pressure */ 0.0f, rotation); | |
| 2781 ui::MouseEvent event(event_type, point, point, base::TimeTicks::Now(), flag, | |
| 2782 flag, pointer_details); | |
| 2783 event.SetClickCount(click_count); | |
| 2784 | |
| 2785 // There are cases where the code handling the message destroys the | |
| 2786 // window, so use the weak ptr to check if destruction occured or not. | |
| 2787 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | |
| 2788 bool handled = delegate_->HandleMouseEvent(event); | |
| 2789 | |
| 2790 if (ref) | |
| 2791 SetMsgHandled(handled); | |
| 2792 return 0; | |
| 2793 } | |
| 2794 | |
| 2709 bool HWNDMessageHandler::IsSynthesizedMouseMessage(unsigned int message, | 2795 bool HWNDMessageHandler::IsSynthesizedMouseMessage(unsigned int message, |
| 2710 int message_time, | 2796 int message_time, |
| 2711 LPARAM l_param) { | 2797 LPARAM l_param) { |
| 2712 if (ui::IsMouseEventFromTouch(message)) | 2798 if (ui::IsMouseEventFromTouch(message)) |
| 2713 return true; | 2799 return true; |
| 2714 // Ignore mouse messages which occur at the same location as the current | 2800 // Ignore mouse messages which occur at the same location as the current |
| 2715 // cursor position and within a time difference of 500 ms from the last | 2801 // cursor position and within a time difference of 500 ms from the last |
| 2716 // touch message. | 2802 // touch message. |
| 2717 if (last_touch_message_time_ && message_time >= last_touch_message_time_ && | 2803 if (last_touch_message_time_ && message_time >= last_touch_message_time_ && |
| 2718 ((message_time - last_touch_message_time_) <= | 2804 ((message_time - last_touch_message_time_) <= |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2909 MONITORINFO monitor_info = {sizeof(monitor_info)}; | 2995 MONITORINFO monitor_info = {sizeof(monitor_info)}; |
| 2910 GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY), | 2996 GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY), |
| 2911 &monitor_info); | 2997 &monitor_info); |
| 2912 gfx::Rect shrunk_rect(monitor_info.rcMonitor); | 2998 gfx::Rect shrunk_rect(monitor_info.rcMonitor); |
| 2913 shrunk_rect.set_height(shrunk_rect.height() - 1); | 2999 shrunk_rect.set_height(shrunk_rect.height() - 1); |
| 2914 background_fullscreen_hack_ = true; | 3000 background_fullscreen_hack_ = true; |
| 2915 SetBoundsInternal(shrunk_rect, false); | 3001 SetBoundsInternal(shrunk_rect, false); |
| 2916 } | 3002 } |
| 2917 | 3003 |
| 2918 } // namespace views | 3004 } // namespace views |
| OLD | NEW |