| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/render_widget_host_view_win.h" | 5 #include "chrome/browser/render_widget_host_view_win.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/gfx/gdi_util.h" | 8 #include "base/gfx/gdi_util.h" |
| 9 #include "base/gfx/rect.h" | 9 #include "base/gfx/rect.h" |
| 10 #include "base/histogram.h" | 10 #include "base/histogram.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( | 60 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( |
| 61 RenderWidgetHost* widget) { | 61 RenderWidgetHost* widget) { |
| 62 return new RenderWidgetHostViewWin(widget); | 62 return new RenderWidgetHostViewWin(widget); |
| 63 } | 63 } |
| 64 | 64 |
| 65 /////////////////////////////////////////////////////////////////////////////// | 65 /////////////////////////////////////////////////////////////////////////////// |
| 66 // RenderWidgetHostViewWin, public: | 66 // RenderWidgetHostViewWin, public: |
| 67 | 67 |
| 68 RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) | 68 RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) |
| 69 : render_widget_host_(widget), | 69 : render_widget_host_(widget), |
| 70 cursor_(LoadCursor(NULL, IDC_ARROW)), | |
| 71 cursor_is_custom_(false), | |
| 72 track_mouse_leave_(false), | 70 track_mouse_leave_(false), |
| 73 ime_notification_(false), | 71 ime_notification_(false), |
| 74 is_hidden_(false), | 72 is_hidden_(false), |
| 75 close_on_deactivate_(false), | 73 close_on_deactivate_(false), |
| 76 tooltip_hwnd_(NULL), | 74 tooltip_hwnd_(NULL), |
| 77 tooltip_showing_(false), | 75 tooltip_showing_(false), |
| 78 shutdown_factory_(this), | 76 shutdown_factory_(this), |
| 79 parent_hwnd_(NULL), | 77 parent_hwnd_(NULL), |
| 80 is_loading_(false), | 78 is_loading_(false), |
| 81 focus_on_show_(true) { | 79 focus_on_show_(true) { |
| 82 render_widget_host_->set_view(this); | 80 render_widget_host_->set_view(this); |
| 83 renderer_accessible_ = | 81 renderer_accessible_ = |
| 84 CommandLine().HasSwitch(switches::kEnableRendererAccessibility); | 82 CommandLine().HasSwitch(switches::kEnableRendererAccessibility); |
| 85 } | 83 } |
| 86 | 84 |
| 87 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() { | 85 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() { |
| 88 if (cursor_is_custom_) | |
| 89 DestroyIcon(cursor_); | |
| 90 ResetTooltip(); | 86 ResetTooltip(); |
| 91 } | 87 } |
| 92 | 88 |
| 93 /////////////////////////////////////////////////////////////////////////////// | 89 /////////////////////////////////////////////////////////////////////////////// |
| 94 // RenderWidgetHostViewWin, RenderWidgetHostView implementation: | 90 // RenderWidgetHostViewWin, RenderWidgetHostView implementation: |
| 95 | 91 |
| 96 RenderWidgetHost* RenderWidgetHostViewWin::GetRenderWidgetHost() const { | 92 RenderWidgetHost* RenderWidgetHostViewWin::GetRenderWidgetHost() const { |
| 97 return render_widget_host_; | 93 return render_widget_host_; |
| 98 } | 94 } |
| 99 | 95 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 WasHidden(); | 207 WasHidden(); |
| 212 } | 208 } |
| 213 | 209 |
| 214 gfx::Rect RenderWidgetHostViewWin::GetViewBounds() const { | 210 gfx::Rect RenderWidgetHostViewWin::GetViewBounds() const { |
| 215 CRect window_rect; | 211 CRect window_rect; |
| 216 GetWindowRect(&window_rect); | 212 GetWindowRect(&window_rect); |
| 217 return gfx::Rect(window_rect); | 213 return gfx::Rect(window_rect); |
| 218 } | 214 } |
| 219 | 215 |
| 220 void RenderWidgetHostViewWin::UpdateCursor(const WebCursor& cursor) { | 216 void RenderWidgetHostViewWin::UpdateCursor(const WebCursor& cursor) { |
| 221 static HINSTANCE module_handle = | 217 current_cursor_ = cursor; |
| 222 GetModuleHandle(chrome::kBrowserResourcesDll); | |
| 223 | |
| 224 // If the last active cursor was a custom cursor, we need to destroy | |
| 225 // it before setting the new one. | |
| 226 if (cursor_is_custom_) | |
| 227 DestroyIcon(cursor_); | |
| 228 | |
| 229 cursor_is_custom_ = cursor.IsCustom(); | |
| 230 if (cursor_is_custom_) { | |
| 231 cursor_ = cursor.GetCustomCursor(); | |
| 232 } else { | |
| 233 // We cannot pass in NULL as the module handle as this would only | |
| 234 // work for standard win32 cursors. We can also receive cursor | |
| 235 // types which are defined as webkit resources. We need to specify | |
| 236 // the module handle of chrome.dll while loading these cursors. | |
| 237 cursor_ = cursor.GetCursor(module_handle); | |
| 238 } | |
| 239 | |
| 240 UpdateCursorIfOverSelf(); | 218 UpdateCursorIfOverSelf(); |
| 241 } | 219 } |
| 242 | 220 |
| 243 void RenderWidgetHostViewWin::UpdateCursorIfOverSelf() { | 221 void RenderWidgetHostViewWin::UpdateCursorIfOverSelf() { |
| 244 static HCURSOR kCursorArrow = LoadCursor(NULL, IDC_ARROW); | 222 static HCURSOR kCursorArrow = LoadCursor(NULL, IDC_ARROW); |
| 245 static HCURSOR kCursorAppStarting = LoadCursor(NULL, IDC_APPSTARTING); | 223 static HCURSOR kCursorAppStarting = LoadCursor(NULL, IDC_APPSTARTING); |
| 224 static HINSTANCE module_handle = |
| 225 GetModuleHandle(chrome::kBrowserResourcesDll); |
| 246 | 226 |
| 247 HCURSOR display_cursor = cursor_; | 227 // We cannot pass in NULL as the module handle as this would only work for |
| 228 // standard win32 cursors. We can also receive cursor types which are defined |
| 229 // as webkit resources. We need to specify the module handle of chrome.dll |
| 230 // while loading these cursors. |
| 231 HCURSOR display_cursor = current_cursor_.GetCursor(module_handle); |
| 232 |
| 248 // If a page is in the loading state, we want to show the Arrow+Hourglass | 233 // If a page is in the loading state, we want to show the Arrow+Hourglass |
| 249 // cursor only when the current cursor is the ARROW cursor. In all other | 234 // cursor only when the current cursor is the ARROW cursor. In all other |
| 250 // cases we should continue to display the current cursor. | 235 // cases we should continue to display the current cursor. |
| 251 if (is_loading_ && display_cursor == kCursorArrow) | 236 if (is_loading_ && display_cursor == kCursorArrow) |
| 252 display_cursor = kCursorAppStarting; | 237 display_cursor = kCursorAppStarting; |
| 253 | 238 |
| 254 // If the mouse is over our HWND, then update the cursor state immediately. | 239 // If the mouse is over our HWND, then update the cursor state immediately. |
| 255 CPoint pt; | 240 CPoint pt; |
| 256 GetCursorPos(&pt); | 241 GetCursorPos(&pt); |
| 257 if (WindowFromPoint(pt) == m_hWnd) | 242 if (WindowFromPoint(pt) == m_hWnd) |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 if (!handled_by_webcontents) { | 758 if (!handled_by_webcontents) { |
| 774 render_widget_host_->ForwardWheelEvent( | 759 render_widget_host_->ForwardWheelEvent( |
| 775 WebMouseWheelEvent(m_hWnd, message, wparam, lparam)); | 760 WebMouseWheelEvent(m_hWnd, message, wparam, lparam)); |
| 776 } | 761 } |
| 777 handled = TRUE; | 762 handled = TRUE; |
| 778 return 0; | 763 return 0; |
| 779 } | 764 } |
| 780 | 765 |
| 781 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT, WPARAM, LPARAM, | 766 LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT, WPARAM, LPARAM, |
| 782 BOOL& handled) { | 767 BOOL& handled) { |
| 768 if (!focus_on_show_) |
| 769 return MA_NOACTIVATE; |
| 770 |
| 783 HWND focus_window = GetFocus(); | 771 HWND focus_window = GetFocus(); |
| 784 if (!::IsWindow(focus_window) || !IsChild(focus_window)) { | 772 if (!::IsWindow(focus_window) || !IsChild(focus_window)) { |
| 785 // We handle WM_MOUSEACTIVATE to set focus to the underlying plugin | 773 // We handle WM_MOUSEACTIVATE to set focus to the underlying plugin |
| 786 // child window. This is to ensure that keyboard events are received | 774 // child window. This is to ensure that keyboard events are received |
| 787 // by the plugin. The correct way to fix this would be send over | 775 // by the plugin. The correct way to fix this would be send over |
| 788 // an event to the renderer which would then eventually send over | 776 // an event to the renderer which would then eventually send over |
| 789 // a setFocus call to the plugin widget. This would ensure that | 777 // a setFocus call to the plugin widget. This would ensure that |
| 790 // the renderer (webkit) knows about the plugin widget receiving | 778 // the renderer (webkit) knows about the plugin widget receiving |
| 791 // focus. | 779 // focus. |
| 792 // TODO(iyengar) Do the right thing as per the above comment. | 780 // TODO(iyengar) Do the right thing as per the above comment. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 if (::IsWindow(tooltip_hwnd_)) | 897 if (::IsWindow(tooltip_hwnd_)) |
| 910 ::DestroyWindow(tooltip_hwnd_); | 898 ::DestroyWindow(tooltip_hwnd_); |
| 911 tooltip_hwnd_ = NULL; | 899 tooltip_hwnd_ = NULL; |
| 912 } | 900 } |
| 913 | 901 |
| 914 void RenderWidgetHostViewWin::ShutdownHost() { | 902 void RenderWidgetHostViewWin::ShutdownHost() { |
| 915 shutdown_factory_.RevokeAll(); | 903 shutdown_factory_.RevokeAll(); |
| 916 render_widget_host_->Shutdown(); | 904 render_widget_host_->Shutdown(); |
| 917 // Do not touch any members at this point, |this| has been deleted. | 905 // Do not touch any members at this point, |this| has been deleted. |
| 918 } | 906 } |
| 919 | |
| OLD | NEW |