| Index: chrome/browser/views/frame/browser_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/frame/browser_view.cc (revision 9882)
|
| +++ chrome/browser/views/frame/browser_view.cc (working copy)
|
| @@ -181,6 +181,7 @@
|
| toolbar_(NULL),
|
| contents_container_(NULL),
|
| initialized_(false),
|
| + fullscreen_(false),
|
| can_drop_(false),
|
| hung_window_detector_(&hung_plugin_action_),
|
| ticker_(0),
|
| @@ -366,11 +367,15 @@
|
| const Browser::Type type = browser_->type();
|
| unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
|
| if (type == Browser::TYPE_NORMAL)
|
| - features |= FEATURE_TABSTRIP | FEATURE_TOOLBAR | FEATURE_BOOKMARKBAR;
|
| - else
|
| - features |= FEATURE_TITLEBAR;
|
| - if (type != Browser::TYPE_APP)
|
| - features |= FEATURE_LOCATIONBAR;
|
| + features |= FEATURE_BOOKMARKBAR;
|
| + if (!fullscreen_) {
|
| + if (type == Browser::TYPE_NORMAL)
|
| + features |= FEATURE_TABSTRIP | FEATURE_TOOLBAR;
|
| + else
|
| + features |= FEATURE_TITLEBAR;
|
| + if (type != Browser::TYPE_APP)
|
| + features |= FEATURE_LOCATIONBAR;
|
| + }
|
| return !!(features & feature);
|
| }
|
|
|
| @@ -531,6 +536,13 @@
|
| }
|
|
|
| gfx::Rect BrowserView::GetNormalBounds() const {
|
| + // If we're in fullscreen mode, we've changed the rect associated with the
|
| + // current window style to the monitor rect. If we weren't maximized, that
|
| + // means it's the rcNormalPosition which has been changed, so we need to
|
| + // return the saved rect here instead of the current one.
|
| + if (fullscreen_ && !IsMaximized())
|
| + return gfx::Rect(saved_window_info_.window_rect);
|
| +
|
| WINDOWPLACEMENT wp;
|
| wp.length = sizeof(wp);
|
| const bool ret = !!GetWindowPlacement(frame_->GetWindow()->GetHWND(), &wp);
|
| @@ -542,6 +554,61 @@
|
| return frame_->GetWindow()->IsMaximized();
|
| }
|
|
|
| +void BrowserView::SetFullscreen(bool fullscreen) {
|
| + if (fullscreen_ == fullscreen)
|
| + return; // Nothing to do.
|
| +
|
| + // Move focus out of the location bar if necessary, and make it unfocusable.
|
| + LocationBarView* location_bar = toolbar_->GetLocationBarView();
|
| + if (!fullscreen_) {
|
| + views::FocusManager* focus_manager = GetFocusManager();
|
| + DCHECK(focus_manager);
|
| + if (focus_manager->GetFocusedView() == location_bar)
|
| + focus_manager->ClearFocus();
|
| + }
|
| + location_bar->SetFocusable(fullscreen_);
|
| +
|
| + // Toggle fullscreen mode.
|
| + fullscreen_ = fullscreen;
|
| +
|
| + // Notify bookmark bar, so it can set itself to the appropriate drawing state.
|
| + if (bookmark_bar_view_.get())
|
| + bookmark_bar_view_->OnFullscreenToggled(fullscreen_);
|
| +
|
| + HWND hwnd = GetWidget()->GetHWND();
|
| + gfx::Rect new_rect;
|
| + if (fullscreen_) {
|
| + // Save current window information.
|
| + saved_window_info_.style = GetWindowLong(hwnd, GWL_STYLE);
|
| + saved_window_info_.ex_style = GetWindowLong(hwnd, GWL_EXSTYLE);
|
| + GetWindowRect(hwnd, &saved_window_info_.window_rect);
|
| +
|
| + // Set new window style and size.
|
| + SetWindowLong(hwnd, GWL_STYLE,
|
| + saved_window_info_.style & ~(WS_CAPTION | WS_THICKFRAME));
|
| + SetWindowLong(hwnd, GWL_EXSTYLE,
|
| + saved_window_info_.ex_style & ~(WS_EX_DLGMODALFRAME |
|
| + WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
|
| + MONITORINFO monitor_info;
|
| + monitor_info.cbSize = sizeof(monitor_info);
|
| + GetMonitorInfo(MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY),
|
| + &monitor_info);
|
| + new_rect = monitor_info.rcMonitor;
|
| + } else {
|
| + // Reset original window style and size.
|
| + SetWindowLong(hwnd, GWL_STYLE, saved_window_info_.style);
|
| + SetWindowLong(hwnd, GWL_EXSTYLE, saved_window_info_.ex_style);
|
| + new_rect = saved_window_info_.window_rect;
|
| + }
|
| + // This will cause the window to re-layout.
|
| + SetWindowPos(hwnd, NULL, new_rect.x(), new_rect.y(), new_rect.width(),
|
| + new_rect.height(), SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
|
| +}
|
| +
|
| +bool BrowserView::IsFullscreen() const {
|
| + return fullscreen_;
|
| +}
|
| +
|
| LocationBar* BrowserView::GetLocationBar() const {
|
| return toolbar_->GetLocationBarView();
|
| }
|
| @@ -858,7 +925,10 @@
|
| void BrowserView::SaveWindowPlacement(const gfx::Rect& bounds,
|
| bool maximized,
|
| bool always_on_top) {
|
| - if (browser_->ShouldSaveWindowPlacement()) {
|
| + // If fullscreen_ is true, we've just changed into fullscreen mode, and we're
|
| + // catching the going-into-fullscreen sizing and positioning calls, which we
|
| + // want to ignore.
|
| + if (!fullscreen_ && browser_->ShouldSaveWindowPlacement()) {
|
| WindowDelegate::SaveWindowPlacement(bounds, maximized, always_on_top);
|
| browser_->SaveWindowPlacement(bounds, maximized);
|
| }
|
|
|