| 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_win.h" | 5 #include "chrome/browser/renderer_host/render_widget_host_view_win.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/l10n_util_win.h" | 8 #include "app/l10n_util_win.h" |
| 9 #include "app/resource_bundle.h" | 9 #include "app/resource_bundle.h" |
| 10 #include "app/win/scoped_prop.h" | 10 #include "app/win/scoped_prop.h" |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 GetWindowRect(&window_rect); | 571 GetWindowRect(&window_rect); |
| 572 return gfx::Rect(window_rect); | 572 return gfx::Rect(window_rect); |
| 573 } | 573 } |
| 574 | 574 |
| 575 void RenderWidgetHostViewWin::UpdateCursor(const WebCursor& cursor) { | 575 void RenderWidgetHostViewWin::UpdateCursor(const WebCursor& cursor) { |
| 576 current_cursor_ = cursor; | 576 current_cursor_ = cursor; |
| 577 UpdateCursorIfOverSelf(); | 577 UpdateCursorIfOverSelf(); |
| 578 } | 578 } |
| 579 | 579 |
| 580 void RenderWidgetHostViewWin::UpdateCursorIfOverSelf() { | 580 void RenderWidgetHostViewWin::UpdateCursorIfOverSelf() { |
| 581 static HCURSOR kCursorResizeRight = LoadCursor(NULL, IDC_SIZENWSE); | |
| 582 static HCURSOR kCursorResizeLeft = LoadCursor(NULL, IDC_SIZENESW); | |
| 583 static HCURSOR kCursorArrow = LoadCursor(NULL, IDC_ARROW); | 581 static HCURSOR kCursorArrow = LoadCursor(NULL, IDC_ARROW); |
| 584 static HCURSOR kCursorAppStarting = LoadCursor(NULL, IDC_APPSTARTING); | 582 static HCURSOR kCursorAppStarting = LoadCursor(NULL, IDC_APPSTARTING); |
| 585 static HINSTANCE module_handle = | 583 static HINSTANCE module_handle = |
| 586 GetModuleHandle(chrome::kBrowserResourcesDll); | 584 GetModuleHandle(chrome::kBrowserResourcesDll); |
| 587 | 585 |
| 588 // If the mouse is over our HWND, then update the cursor state immediately. | 586 // If the mouse is over our HWND, then update the cursor state immediately. |
| 589 CPoint pt; | 587 CPoint pt; |
| 590 GetCursorPos(&pt); | 588 GetCursorPos(&pt); |
| 591 if (WindowFromPoint(pt) == m_hWnd) { | 589 if (WindowFromPoint(pt) == m_hWnd) { |
| 592 BOOL result = ::ScreenToClient(m_hWnd, &pt); | 590 BOOL result = ::ScreenToClient(m_hWnd, &pt); |
| 593 DCHECK(result); | 591 DCHECK(result); |
| 594 if (render_widget_host_->GetRootWindowResizerRect().Contains(pt.x, pt.y)) { | 592 // We cannot pass in NULL as the module handle as this would only work for |
| 595 if (base::i18n::IsRTL()) | 593 // standard win32 cursors. We can also receive cursor types which are |
| 596 SetCursor(kCursorResizeLeft); | 594 // defined as webkit resources. We need to specify the module handle of |
| 597 else | 595 // chrome.dll while loading these cursors. |
| 598 SetCursor(kCursorResizeRight); | 596 HCURSOR display_cursor = current_cursor_.GetCursor(module_handle); |
| 599 } else { | |
| 600 // We cannot pass in NULL as the module handle as this would only work for | |
| 601 // standard win32 cursors. We can also receive cursor types which are | |
| 602 // defined as webkit resources. We need to specify the module handle of | |
| 603 // chrome.dll while loading these cursors. | |
| 604 HCURSOR display_cursor = current_cursor_.GetCursor(module_handle); | |
| 605 | 597 |
| 606 // If a page is in the loading state, we want to show the Arrow+Hourglass | 598 // If a page is in the loading state, we want to show the Arrow+Hourglass |
| 607 // cursor only when the current cursor is the ARROW cursor. In all other | 599 // cursor only when the current cursor is the ARROW cursor. In all other |
| 608 // cases we should continue to display the current cursor. | 600 // cases we should continue to display the current cursor. |
| 609 if (is_loading_ && display_cursor == kCursorArrow) | 601 if (is_loading_ && display_cursor == kCursorArrow) |
| 610 display_cursor = kCursorAppStarting; | 602 display_cursor = kCursorAppStarting; |
| 611 | 603 |
| 612 SetCursor(display_cursor); | 604 SetCursor(display_cursor); |
| 613 } | |
| 614 } | 605 } |
| 615 } | 606 } |
| 616 | 607 |
| 617 void RenderWidgetHostViewWin::SetIsLoading(bool is_loading) { | 608 void RenderWidgetHostViewWin::SetIsLoading(bool is_loading) { |
| 618 is_loading_ = is_loading; | 609 is_loading_ = is_loading; |
| 619 UpdateCursorIfOverSelf(); | 610 UpdateCursorIfOverSelf(); |
| 620 } | 611 } |
| 621 | 612 |
| 622 void RenderWidgetHostViewWin::ImeUpdateTextInputState( | 613 void RenderWidgetHostViewWin::ImeUpdateTextInputState( |
| 623 WebKit::WebTextInputType type, | 614 WebKit::WebTextInputType type, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 | 668 |
| 678 // Send the invalid rect in screen coordinates. | 669 // Send the invalid rect in screen coordinates. |
| 679 gfx::Rect screen_rect = GetViewBounds(); | 670 gfx::Rect screen_rect = GetViewBounds(); |
| 680 gfx::Rect invalid_screen_rect(damage_bounds); | 671 gfx::Rect invalid_screen_rect(damage_bounds); |
| 681 invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y()); | 672 invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y()); |
| 682 | 673 |
| 683 LPARAM lparam = reinterpret_cast<LPARAM>(&invalid_screen_rect); | 674 LPARAM lparam = reinterpret_cast<LPARAM>(&invalid_screen_rect); |
| 684 EnumChildWindows(m_hWnd, EnumChildProc, lparam); | 675 EnumChildWindows(m_hWnd, EnumChildProc, lparam); |
| 685 } | 676 } |
| 686 | 677 |
| 687 void RenderWidgetHostViewWin::DrawResizeCorner(const gfx::Rect& paint_rect, | |
| 688 HDC dc) { | |
| 689 gfx::Rect resize_corner_rect = | |
| 690 render_widget_host_->GetRootWindowResizerRect(); | |
| 691 if (!paint_rect.Intersect(resize_corner_rect).IsEmpty()) { | |
| 692 SkBitmap* bitmap = ResourceBundle::GetSharedInstance(). | |
| 693 GetBitmapNamed(IDR_TEXTAREA_RESIZER); | |
| 694 gfx::CanvasSkia canvas(bitmap->width(), bitmap->height(), false); | |
| 695 canvas.getDevice()->accessBitmap(true).eraseARGB(0, 0, 0, 0); | |
| 696 int x = resize_corner_rect.x() + resize_corner_rect.width() - | |
| 697 bitmap->width(); | |
| 698 canvas.save(); | |
| 699 if (base::i18n::IsRTL()) { | |
| 700 canvas.TranslateInt(bitmap->width(), 0); | |
| 701 canvas.ScaleInt(-1, 1); | |
| 702 x = 0; | |
| 703 } | |
| 704 canvas.DrawBitmapInt(*bitmap, 0, 0); | |
| 705 canvas.getTopPlatformDevice().drawToHDC(dc, x, | |
| 706 resize_corner_rect.y() + resize_corner_rect.height() - | |
| 707 bitmap->height(), NULL); | |
| 708 canvas.restore(); | |
| 709 } | |
| 710 } | |
| 711 | |
| 712 void RenderWidgetHostViewWin::DidUpdateBackingStore( | 678 void RenderWidgetHostViewWin::DidUpdateBackingStore( |
| 713 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, | 679 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, |
| 714 const std::vector<gfx::Rect>& copy_rects) { | 680 const std::vector<gfx::Rect>& copy_rects) { |
| 715 if (is_hidden_) | 681 if (is_hidden_) |
| 716 return; | 682 return; |
| 717 | 683 |
| 718 // Schedule invalidations first so that the ScrollWindowEx call is closer to | 684 // Schedule invalidations first so that the ScrollWindowEx call is closer to |
| 719 // Redraw. That minimizes chances of "flicker" resulting if the screen | 685 // Redraw. That minimizes chances of "flicker" resulting if the screen |
| 720 // refreshes before we have a chance to paint the exposed area. Somewhat | 686 // refreshes before we have a chance to paint the exposed area. Somewhat |
| 721 // surprisingly, this ordering matters. | 687 // surprisingly, this ordering matters. |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 // Blit only the damaged regions from the backing store. | 884 // Blit only the damaged regions from the backing store. |
| 919 DWORD data_size = GetRegionData(damage_region, 0, NULL); | 885 DWORD data_size = GetRegionData(damage_region, 0, NULL); |
| 920 scoped_array<char> region_data_buf(new char[data_size]); | 886 scoped_array<char> region_data_buf(new char[data_size]); |
| 921 RGNDATA* region_data = reinterpret_cast<RGNDATA*>(region_data_buf.get()); | 887 RGNDATA* region_data = reinterpret_cast<RGNDATA*>(region_data_buf.get()); |
| 922 GetRegionData(damage_region, data_size, region_data); | 888 GetRegionData(damage_region, data_size, region_data); |
| 923 | 889 |
| 924 RECT* region_rects = reinterpret_cast<RECT*>(region_data->Buffer); | 890 RECT* region_rects = reinterpret_cast<RECT*>(region_data->Buffer); |
| 925 for (DWORD i = 0; i < region_data->rdh.nCount; ++i) { | 891 for (DWORD i = 0; i < region_data->rdh.nCount; ++i) { |
| 926 gfx::Rect paint_rect = bitmap_rect.Intersect(gfx::Rect(region_rects[i])); | 892 gfx::Rect paint_rect = bitmap_rect.Intersect(gfx::Rect(region_rects[i])); |
| 927 if (!paint_rect.IsEmpty()) { | 893 if (!paint_rect.IsEmpty()) { |
| 928 DrawResizeCorner(paint_rect, backing_store->hdc()); | |
| 929 if (visually_deemphasized_) { | 894 if (visually_deemphasized_) { |
| 930 DrawDeemphasized(paint_rect, backing_store->hdc(), paint_dc.m_hDC); | 895 DrawDeemphasized(paint_rect, backing_store->hdc(), paint_dc.m_hDC); |
| 931 } else { | 896 } else { |
| 932 BitBlt(paint_dc.m_hDC, | 897 BitBlt(paint_dc.m_hDC, |
| 933 paint_rect.x(), | 898 paint_rect.x(), |
| 934 paint_rect.y(), | 899 paint_rect.y(), |
| 935 paint_rect.width(), | 900 paint_rect.width(), |
| 936 paint_rect.height(), | 901 paint_rect.height(), |
| 937 backing_store->hdc(), | 902 backing_store->hdc(), |
| 938 paint_rect.x(), | 903 paint_rect.x(), |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 // TabContents first in the case of popups. If we do, we would need to | 1211 // TabContents first in the case of popups. If we do, we would need to |
| 1247 // convert the click from the popup window coordinates to the TabContents' | 1212 // convert the click from the popup window coordinates to the TabContents' |
| 1248 // window coordinates. For now we don't forward the message in that case to | 1213 // window coordinates. For now we don't forward the message in that case to |
| 1249 // address bug #907474. | 1214 // address bug #907474. |
| 1250 // Note: GetParent() on popup windows returns the top window and not the | 1215 // Note: GetParent() on popup windows returns the top window and not the |
| 1251 // parent the window was created with (the parent and the owner of the popup | 1216 // parent the window was created with (the parent and the owner of the popup |
| 1252 // is the first non-child view of the view that was specified to the create | 1217 // is the first non-child view of the view that was specified to the create |
| 1253 // call). So the TabContents window would have to be specified to the | 1218 // call). So the TabContents window would have to be specified to the |
| 1254 // RenderViewHostHWND as there is no way to retrieve it from the HWND. | 1219 // RenderViewHostHWND as there is no way to retrieve it from the HWND. |
| 1255 if (!close_on_deactivate_) { // Don't forward if the container is a popup. | 1220 if (!close_on_deactivate_) { // Don't forward if the container is a popup. |
| 1256 if (message == WM_LBUTTONDOWN) { | |
| 1257 // If we get clicked on, where the resize corner is drawn, we delegate the | |
| 1258 // message to the root window, with the proper HTBOTTOMXXX wparam so that | |
| 1259 // Windows can take care of the resizing for us. | |
| 1260 if (render_widget_host_ && | |
| 1261 render_widget_host_->GetRootWindowResizerRect(). | |
| 1262 Contains(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam))) { | |
| 1263 WPARAM wparam = HTBOTTOMRIGHT; | |
| 1264 if (base::i18n::IsRTL()) | |
| 1265 wparam = HTBOTTOMLEFT; | |
| 1266 HWND root_hwnd = ::GetAncestor(m_hWnd, GA_ROOT); | |
| 1267 if (SendMessage(root_hwnd, WM_NCLBUTTONDOWN, wparam, lparam) == 0) | |
| 1268 return 0; | |
| 1269 } | |
| 1270 } | |
| 1271 switch (message) { | 1221 switch (message) { |
| 1272 case WM_LBUTTONDOWN: | 1222 case WM_LBUTTONDOWN: |
| 1273 case WM_MBUTTONDOWN: | 1223 case WM_MBUTTONDOWN: |
| 1274 case WM_RBUTTONDOWN: | 1224 case WM_RBUTTONDOWN: |
| 1275 // Finish the ongoing composition whenever a mouse click happens. | 1225 // Finish the ongoing composition whenever a mouse click happens. |
| 1276 // It matches IE's behavior. | 1226 // It matches IE's behavior. |
| 1277 ime_input_.CleanupComposition(m_hWnd); | 1227 ime_input_.CleanupComposition(m_hWnd); |
| 1278 // Fall through. | 1228 // Fall through. |
| 1279 case WM_MOUSEMOVE: | 1229 case WM_MOUSEMOVE: |
| 1280 case WM_MOUSELEAVE: { | 1230 case WM_MOUSELEAVE: { |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1686 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( | 1636 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( |
| 1687 gfx::NativeView native_view) { | 1637 gfx::NativeView native_view) { |
| 1688 if (::IsWindow(native_view)) { | 1638 if (::IsWindow(native_view)) { |
| 1689 HANDLE raw_render_host_view = ::GetProp(native_view, | 1639 HANDLE raw_render_host_view = ::GetProp(native_view, |
| 1690 kRenderWidgetHostViewKey); | 1640 kRenderWidgetHostViewKey); |
| 1691 if (raw_render_host_view) | 1641 if (raw_render_host_view) |
| 1692 return reinterpret_cast<RenderWidgetHostView*>(raw_render_host_view); | 1642 return reinterpret_cast<RenderWidgetHostView*>(raw_render_host_view); |
| 1693 } | 1643 } |
| 1694 return NULL; | 1644 return NULL; |
| 1695 } | 1645 } |
| OLD | NEW |