| 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/views/frame/browser_frame_win.h" | 5 #include "chrome/browser/views/frame/browser_frame_win.h" |
| 6 | 6 |
| 7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
| 8 #include <shellapi.h> | 8 #include <shellapi.h> |
| 9 | 9 |
| 10 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
| 11 #include "app/win_util.h" | 11 #include "app/win_util.h" |
| 12 #include "chrome/browser/profile.h" | 12 #include "chrome/browser/profile.h" |
| 13 #include "chrome/browser/browser_list.h" | 13 #include "chrome/browser/browser_list.h" |
| 14 #include "chrome/browser/dock_info.h" |
| 14 #include "chrome/browser/views/frame/browser_non_client_frame_view.h" | 15 #include "chrome/browser/views/frame/browser_non_client_frame_view.h" |
| 15 #include "chrome/browser/views/frame/browser_root_view.h" | 16 #include "chrome/browser/views/frame/browser_root_view.h" |
| 16 #include "chrome/browser/views/frame/browser_view.h" | 17 #include "chrome/browser/views/frame/browser_view.h" |
| 17 #include "chrome/browser/views/frame/glass_browser_frame_view.h" | 18 #include "chrome/browser/views/frame/glass_browser_frame_view.h" |
| 18 #include "chrome/browser/views/frame/opaque_browser_frame_view.h" | 19 #include "chrome/browser/views/frame/opaque_browser_frame_view.h" |
| 20 #include "chrome/browser/views/tabs/browser_tab_strip.h" |
| 19 #include "grit/theme_resources.h" | 21 #include "grit/theme_resources.h" |
| 22 #include "views/screen.h" |
| 20 #include "views/window/window_delegate.h" | 23 #include "views/window/window_delegate.h" |
| 21 | 24 |
| 22 // static | 25 // static |
| 23 static const int kClientEdgeThickness = 3; | 26 static const int kClientEdgeThickness = 3; |
| 27 static const int kTabDragWindowAlpha = 200; |
| 24 | 28 |
| 25 // static (Factory method.) | 29 // static (Factory method.) |
| 26 BrowserFrame* BrowserFrame::Create(BrowserView* browser_view, | 30 BrowserFrame* BrowserFrame::Create(BrowserView* browser_view, |
| 27 Profile* profile) { | 31 Profile* profile) { |
| 28 BrowserFrameWin* frame = new BrowserFrameWin(browser_view, profile); | 32 BrowserFrameWin* frame = new BrowserFrameWin(browser_view, profile); |
| 29 frame->Init(); | 33 frame->Init(); |
| 30 return frame; | 34 return frame; |
| 31 } | 35 } |
| 32 | 36 |
| 33 /////////////////////////////////////////////////////////////////////////////// | 37 /////////////////////////////////////////////////////////////////////////////// |
| 34 // BrowserFrame, public: | 38 // BrowserFrame, public: |
| 35 | 39 |
| 36 BrowserFrameWin::BrowserFrameWin(BrowserView* browser_view, Profile* profile) | 40 BrowserFrameWin::BrowserFrameWin(BrowserView* browser_view, Profile* profile) |
| 37 : WindowWin(browser_view), | 41 : WindowWin(browser_view), |
| 38 browser_view_(browser_view), | 42 browser_view_(browser_view), |
| 43 saved_window_style_(0), |
| 44 saved_window_ex_style_(0), |
| 45 detached_drag_mode_(false), |
| 46 drop_tabstrip_(NULL), |
| 39 root_view_(NULL), | 47 root_view_(NULL), |
| 40 frame_initialized_(false), | 48 frame_initialized_(false), |
| 41 profile_(profile) { | 49 profile_(profile) { |
| 42 browser_view_->set_frame(this); | 50 browser_view_->set_frame(this); |
| 43 GetNonClientView()->SetFrameView(CreateFrameViewForWindow()); | 51 GetNonClientView()->SetFrameView(CreateFrameViewForWindow()); |
| 44 // Don't focus anything on creation, selecting a tab will set the focus. | 52 // Don't focus anything on creation, selecting a tab will set the focus. |
| 45 set_focus_on_creation(false); | 53 set_focus_on_creation(false); |
| 46 } | 54 } |
| 47 | 55 |
| 48 void BrowserFrameWin::Init() { | 56 void BrowserFrameWin::Init() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 73 } | 81 } |
| 74 | 82 |
| 75 gfx::Rect BrowserFrameWin::GetBoundsForTabStrip(TabStrip* tabstrip) const { | 83 gfx::Rect BrowserFrameWin::GetBoundsForTabStrip(TabStrip* tabstrip) const { |
| 76 return browser_frame_view_->GetBoundsForTabStrip(tabstrip); | 84 return browser_frame_view_->GetBoundsForTabStrip(tabstrip); |
| 77 } | 85 } |
| 78 | 86 |
| 79 void BrowserFrameWin::UpdateThrobber(bool running) { | 87 void BrowserFrameWin::UpdateThrobber(bool running) { |
| 80 browser_frame_view_->UpdateThrobber(running); | 88 browser_frame_view_->UpdateThrobber(running); |
| 81 } | 89 } |
| 82 | 90 |
| 91 void BrowserFrameWin::ContinueDraggingDetachedTab() { |
| 92 detached_drag_mode_ = true; |
| 93 |
| 94 // Set the frame to partially transparent. |
| 95 UpdateWindowAlphaForTabDragging(detached_drag_mode_); |
| 96 |
| 97 // Send the message directly, so that the window is positioned appropriately. |
| 98 SendMessage(GetNativeWindow(), WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(0, 0)); |
| 99 } |
| 100 |
| 83 ThemeProvider* BrowserFrameWin::GetThemeProviderForFrame() const { | 101 ThemeProvider* BrowserFrameWin::GetThemeProviderForFrame() const { |
| 84 // This is implemented for a different interface than GetThemeProvider is, | 102 // This is implemented for a different interface than GetThemeProvider is, |
| 85 // but they mean the same things. | 103 // but they mean the same things. |
| 86 return GetThemeProvider(); | 104 return GetThemeProvider(); |
| 87 } | 105 } |
| 88 | 106 |
| 89 ThemeProvider* BrowserFrameWin::GetThemeProvider() const { | 107 ThemeProvider* BrowserFrameWin::GetThemeProvider() const { |
| 90 return profile_->GetThemeProvider(); | 108 return profile_->GetThemeProvider(); |
| 91 } | 109 } |
| 92 | 110 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 104 bool BrowserFrameWin::GetAccelerator(int cmd_id, | 122 bool BrowserFrameWin::GetAccelerator(int cmd_id, |
| 105 views::Accelerator* accelerator) { | 123 views::Accelerator* accelerator) { |
| 106 return browser_view_->GetAccelerator(cmd_id, accelerator); | 124 return browser_view_->GetAccelerator(cmd_id, accelerator); |
| 107 } | 125 } |
| 108 | 126 |
| 109 void BrowserFrameWin::OnEndSession(BOOL ending, UINT logoff) { | 127 void BrowserFrameWin::OnEndSession(BOOL ending, UINT logoff) { |
| 110 BrowserList::WindowsSessionEnding(); | 128 BrowserList::WindowsSessionEnding(); |
| 111 } | 129 } |
| 112 | 130 |
| 113 void BrowserFrameWin::OnEnterSizeMove() { | 131 void BrowserFrameWin::OnEnterSizeMove() { |
| 132 drop_tabstrip_ = NULL; |
| 114 browser_view_->WindowMoveOrResizeStarted(); | 133 browser_view_->WindowMoveOrResizeStarted(); |
| 115 } | 134 } |
| 116 | 135 |
| 136 void BrowserFrameWin::OnExitSizeMove() { |
| 137 if (TabStrip2::Enabled()) { |
| 138 if (detached_drag_mode_) { |
| 139 detached_drag_mode_ = false; |
| 140 if (drop_tabstrip_) { |
| 141 gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); |
| 142 BrowserTabStrip* tabstrip = browser_view_->bts(); |
| 143 gfx::Rect tsb = tabstrip->GetDraggedTabScreenBounds(screen_point); |
| 144 drop_tabstrip_->AttachTab(tabstrip->DetachTab(0), screen_point, tsb); |
| 145 } else { |
| 146 UpdateWindowAlphaForTabDragging(detached_drag_mode_); |
| 147 browser_view_->bts()->SendDraggedTabHome(); |
| 148 } |
| 149 } |
| 150 } |
| 151 WidgetWin::OnExitSizeMove(); |
| 152 } |
| 153 |
| 117 void BrowserFrameWin::OnInitMenuPopup(HMENU menu, UINT position, | 154 void BrowserFrameWin::OnInitMenuPopup(HMENU menu, UINT position, |
| 118 BOOL is_system_menu) { | 155 BOOL is_system_menu) { |
| 119 browser_view_->PrepareToRunSystemMenu(menu); | 156 browser_view_->PrepareToRunSystemMenu(menu); |
| 120 } | 157 } |
| 121 | 158 |
| 122 LRESULT BrowserFrameWin::OnMouseActivate(HWND window, UINT hittest_code, | 159 LRESULT BrowserFrameWin::OnMouseActivate(HWND window, UINT hittest_code, |
| 123 UINT message) { | 160 UINT message) { |
| 124 return browser_view_->ActivateAppModalDialog() ? MA_NOACTIVATEANDEAT | 161 return browser_view_->ActivateAppModalDialog() ? MA_NOACTIVATEANDEAT |
| 125 : MA_ACTIVATE; | 162 : MA_ACTIVATE; |
| 126 } | 163 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 if (GetNonClientView()->UseNativeFrame()) { | 257 if (GetNonClientView()->UseNativeFrame()) { |
| 221 LRESULT result; | 258 LRESULT result; |
| 222 if (DwmDefWindowProc(GetNativeView(), WM_NCHITTEST, 0, | 259 if (DwmDefWindowProc(GetNativeView(), WM_NCHITTEST, 0, |
| 223 MAKELPARAM(pt.x, pt.y), &result)) { | 260 MAKELPARAM(pt.x, pt.y), &result)) { |
| 224 return result; | 261 return result; |
| 225 } | 262 } |
| 226 } | 263 } |
| 227 return WindowWin::OnNCHitTest(pt); | 264 return WindowWin::OnNCHitTest(pt); |
| 228 } | 265 } |
| 229 | 266 |
| 267 void BrowserFrameWin::OnWindowPosChanged(WINDOWPOS* window_pos) { |
| 268 if (TabStrip2::Enabled()) { |
| 269 if (detached_drag_mode_) { |
| 270 // TODO(beng): move all to BrowserTabStrip... |
| 271 |
| 272 // We check to see if the mouse cursor is in the magnetism zone of another |
| 273 // visible TabStrip. If so, we should dock to it. |
| 274 std::set<HWND> ignore_windows; |
| 275 ignore_windows.insert(GetNativeWindow()); |
| 276 |
| 277 gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); |
| 278 HWND local_window = |
| 279 DockInfo::GetLocalProcessWindowAtPoint(screen_point, ignore_windows); |
| 280 if (local_window) { |
| 281 drop_tabstrip_ = |
| 282 BrowserView::GetBrowserViewForNativeWindow(local_window)->bts(); |
| 283 if (TabStrip2::IsDragRearrange(drop_tabstrip_, screen_point)) { |
| 284 ReleaseCapture(); |
| 285 return; |
| 286 } |
| 287 } |
| 288 drop_tabstrip_ = NULL; |
| 289 } |
| 290 } |
| 291 |
| 292 // Let the default window procedure handle - IMPORTANT! |
| 293 WindowWin::OnWindowPosChanged(window_pos); |
| 294 } |
| 295 |
| 230 /////////////////////////////////////////////////////////////////////////////// | 296 /////////////////////////////////////////////////////////////////////////////// |
| 231 // BrowserFrame, views::CustomFrameWindow overrides: | 297 // BrowserFrame, views::CustomFrameWindow overrides: |
| 232 | 298 |
| 233 int BrowserFrameWin::GetShowState() const { | 299 int BrowserFrameWin::GetShowState() const { |
| 234 return browser_view_->GetShowState(); | 300 return browser_view_->GetShowState(); |
| 235 } | 301 } |
| 236 | 302 |
| 237 views::NonClientFrameView* BrowserFrameWin::CreateFrameViewForWindow() { | 303 views::NonClientFrameView* BrowserFrameWin::CreateFrameViewForWindow() { |
| 238 if (GetThemeProvider()->ShouldUseNativeFrame()) | 304 if (GetThemeProvider()->ShouldUseNativeFrame()) |
| 239 browser_frame_view_ = new GlassBrowserFrameView(this, browser_view_); | 305 browser_frame_view_ = new GlassBrowserFrameView(this, browser_view_); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 265 // because the GDI-drawn text in the web content composited over it will | 331 // because the GDI-drawn text in the web content composited over it will |
| 266 // become semi-transparent over any glass area. | 332 // become semi-transparent over any glass area. |
| 267 MARGINS margins = { 0 }; | 333 MARGINS margins = { 0 }; |
| 268 if (!IsMaximized() && !IsFullscreen()) { | 334 if (!IsMaximized() && !IsFullscreen()) { |
| 269 margins.cxLeftWidth = kClientEdgeThickness + 1; | 335 margins.cxLeftWidth = kClientEdgeThickness + 1; |
| 270 margins.cxRightWidth = kClientEdgeThickness + 1; | 336 margins.cxRightWidth = kClientEdgeThickness + 1; |
| 271 margins.cyBottomHeight = kClientEdgeThickness + 1; | 337 margins.cyBottomHeight = kClientEdgeThickness + 1; |
| 272 } | 338 } |
| 273 // In maximized mode, we only have a titlebar strip of glass, no side/bottom | 339 // In maximized mode, we only have a titlebar strip of glass, no side/bottom |
| 274 // borders. | 340 // borders. |
| 275 if (!browser_view_->IsFullscreen()) { | 341 if (!browser_view_->IsFullscreen() && !TabStrip2::Enabled()) { |
| 276 margins.cyTopHeight = | 342 margins.cyTopHeight = |
| 277 GetBoundsForTabStrip(browser_view_->tabstrip()).bottom(); | 343 GetBoundsForTabStrip(browser_view_->tabstrip()).bottom(); |
| 278 } | 344 } |
| 279 DwmExtendFrameIntoClientArea(GetNativeView(), &margins); | 345 DwmExtendFrameIntoClientArea(GetNativeView(), &margins); |
| 280 } | 346 } |
| 347 |
| 348 void BrowserFrameWin::UpdateWindowAlphaForTabDragging(bool dragging) { |
| 349 HWND frame_hwnd = GetNativeWindow(); |
| 350 if (dragging) { |
| 351 // Make the frame slightly transparent during the drag operation. |
| 352 saved_window_style_ = ::GetWindowLong(frame_hwnd, GWL_STYLE); |
| 353 saved_window_ex_style_ = ::GetWindowLong(frame_hwnd, GWL_EXSTYLE); |
| 354 ::SetWindowLong(frame_hwnd, GWL_EXSTYLE, |
| 355 saved_window_ex_style_ | WS_EX_LAYERED); |
| 356 // Remove the captions tyle so the window doesn't have window controls for a |
| 357 // more "transparent" look. |
| 358 ::SetWindowLong(frame_hwnd, GWL_STYLE, |
| 359 saved_window_style_ & ~WS_CAPTION); |
| 360 SetLayeredWindowAttributes(frame_hwnd, RGB(0xFF, 0xFF, 0xFF), |
| 361 kTabDragWindowAlpha, LWA_ALPHA); |
| 362 } else { |
| 363 ::SetWindowLong(frame_hwnd, GWL_STYLE, saved_window_style_); |
| 364 ::SetWindowLong(frame_hwnd, GWL_EXSTYLE, saved_window_ex_style_); |
| 365 } |
| 366 } |
| OLD | NEW |