diff options
-rw-r--r-- | chrome/app/chrome_dll.rc | 1 | ||||
-rw-r--r-- | chrome/app/chrome_dll_resource.h | 3 | ||||
-rw-r--r-- | chrome/browser/browser.cc | 73 | ||||
-rw-r--r-- | chrome/browser/browser.h | 8 | ||||
-rw-r--r-- | chrome/browser/browser_window.h | 4 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bar_view.cc | 7 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bar_view.h | 3 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.cc | 82 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.h | 16 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_non_client_view.cc | 14 | ||||
-rw-r--r-- | chrome/test/test_browser_window.h | 2 |
11 files changed, 174 insertions, 39 deletions
diff --git a/chrome/app/chrome_dll.rc b/chrome/app/chrome_dll.rc index 07cf3ca..28f3355 100644 --- a/chrome/app/chrome_dll.rc +++ b/chrome/app/chrome_dll.rc @@ -51,6 +51,7 @@ BEGIN "T", IDC_FOCUS_TOOLBAR, VIRTKEY, SHIFT, ALT VK_RIGHT, IDC_FORWARD, VIRTKEY, ALT VK_BACK, IDC_FORWARD, VIRTKEY, SHIFT + VK_F11, IDC_FULLSCREEN, VIRTKEY VK_F1, IDC_HELP_PAGE, VIRTKEY "J", IDC_JS_CONSOLE, VIRTKEY, CONTROL, SHIFT "N", IDC_NEW_INCOGNITO_WINDOW, VIRTKEY, CONTROL, SHIFT diff --git a/chrome/app/chrome_dll_resource.h b/chrome/app/chrome_dll_resource.h index a720c68..7b70101 100644 --- a/chrome/app/chrome_dll_resource.h +++ b/chrome/app/chrome_dll_resource.h @@ -75,7 +75,8 @@ #define IDC_DUPLICATE_TAB 34027 #define IDC_RESTORE_TAB 34028 #define IDC_SHOW_AS_TAB 34029 -#define IDC_EXIT 34030 +#define IDC_FULLSCREEN 34030 +#define IDC_EXIT 34031 // Page-related commands #define IDC_STAR 35000 diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 9ac4ed5..4be39fb 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -711,6 +711,12 @@ void Browser::ConvertPopupToTabbedBrowser() { browser->window()->Show(); } +void Browser::ToggleFullscreenMode() { + UserMetrics::RecordAction(L"ToggleFullscreen", profile_); + window_->SetFullscreen(!window_->IsFullscreen()); + UpdateCommandsForFullscreenMode(window_->IsFullscreen()); +} + void Browser::Exit() { UserMetrics::RecordAction(L"Exit", profile_); BrowserList::CloseAllBrowsers(true); @@ -1103,6 +1109,7 @@ void Browser::ExecuteCommand(int id) { case IDC_DUPLICATE_TAB: DuplicateTab(); break; case IDC_RESTORE_TAB: RestoreTab(); break; case IDC_SHOW_AS_TAB: ConvertPopupToTabbedBrowser(); break; + case IDC_FULLSCREEN: ToggleFullscreenMode(); break; case IDC_EXIT: Exit(); break; // Page-related commands @@ -1934,6 +1941,7 @@ void Browser::InitCommandState() { command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true); command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true); command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true); + command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN, true); command_updater_.UpdateCommandEnabled(IDC_EXIT, true); // Page-related commands @@ -1998,10 +2006,8 @@ void Browser::InitCommandState() { // Navigation commands command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window); - command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, normal_window); // Window management commands - command_updater_.UpdateCommandEnabled(IDC_PROFILE_MENU, normal_window); command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window); command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB, normal_window); @@ -2016,33 +2022,10 @@ void Browser::InitCommandState() { command_updater_.UpdateCommandEnabled(IDC_SELECT_LAST_TAB, normal_window); command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, normal_window && !profile_->IsOffTheRecord()); - command_updater_.UpdateCommandEnabled(IDC_SHOW_AS_TAB, - (type() == TYPE_POPUP)); - - // Focus various bits of UI - command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, normal_window); - command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, normal_window); - command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, normal_window); - - // Show various bits of UI - command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, normal_window); -#if defined(OS_WIN) - command_updater_.UpdateCommandEnabled(IDC_DEBUGGER, - // The debugger doesn't work in single process mode. - normal_window && !RenderProcessHost::run_renderer_in_process()); -#endif - command_updater_.UpdateCommandEnabled(IDC_NEW_PROFILE, normal_window); - command_updater_.UpdateCommandEnabled(IDC_REPORT_BUG, normal_window); - command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR, normal_window); - command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, - normal_window); - command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, normal_window); - command_updater_.UpdateCommandEnabled(IDC_OPTIONS, normal_window); - command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, - normal_window); - command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, normal_window); - command_updater_.UpdateCommandEnabled(IDC_ABOUT, normal_window); } + + // Initialize other commands whose state changes based on fullscreen mode. + UpdateCommandsForFullscreenMode(false); } void Browser::UpdateCommandsForTabState() { @@ -2099,6 +2082,40 @@ void Browser::UpdateCommandsForTabState() { } } +void Browser::UpdateCommandsForFullscreenMode(bool is_fullscreen) { + const bool show_main_ui = (type() == TYPE_NORMAL) && !is_fullscreen; + + // Navigation commands + command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui); + + // Window management commands + command_updater_.UpdateCommandEnabled(IDC_PROFILE_MENU, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_SHOW_AS_TAB, + (type() == TYPE_POPUP) && !is_fullscreen); + + // Focus various bits of UI + command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui); + + // Show various bits of UI + command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui); +#if defined(OS_WIN) + command_updater_.UpdateCommandEnabled(IDC_DEBUGGER, + // The debugger doesn't work in single process mode. + show_main_ui && !RenderProcessHost::run_renderer_in_process()); +#endif + command_updater_.UpdateCommandEnabled(IDC_NEW_PROFILE, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_REPORT_BUG, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_OPTIONS, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui); + command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui); +} + void Browser::UpdateStopGoState(bool is_loading) { window_->UpdateStopGoState(is_loading); command_updater_.UpdateCommandEnabled(IDC_GO, !is_loading); diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h index 8a584ff..cce7bfc 100644 --- a/chrome/browser/browser.h +++ b/chrome/browser/browser.h @@ -243,6 +243,7 @@ class Browser : public TabStripModelDelegate, void DuplicateTab(); void RestoreTab(); void ConvertPopupToTabbedBrowser(); + void ToggleFullscreenMode(); void Exit(); // Page-related commands @@ -405,10 +406,13 @@ class Browser : public TabStripModelDelegate, // Initialize state for all browser commands. void InitCommandState(); - // Update commands which may be enabled or disabled depending on the tab's - // state. + // Update commands whose state depends on the tab's state. void UpdateCommandsForTabState(); + // Update commands whose state depends on whether the window is in fullscreen + // mode. + void UpdateCommandsForFullscreenMode(bool is_fullscreen); + // Set the correct stop/go icon and update the Go and Stop command states. // |is_loading| is true if the current TabContents is loading. void UpdateStopGoState(bool is_loading); diff --git a/chrome/browser/browser_window.h b/chrome/browser/browser_window.h index 7491ee0..902cbf5 100644 --- a/chrome/browser/browser_window.h +++ b/chrome/browser/browser_window.h @@ -85,6 +85,10 @@ class BrowserWindow { // Returns true if the frame is maximized (aka zoomed). virtual bool IsMaximized() const = 0; + // Accessors for fullscreen mode state. + virtual void SetFullscreen(bool fullscreen) = 0; + virtual bool IsFullscreen() const = 0; + // Returns the location bar. virtual LocationBar* GetLocationBar() const = 0; diff --git a/chrome/browser/views/bookmark_bar_view.cc b/chrome/browser/views/bookmark_bar_view.cc index 1848bad..2de1bf4 100644 --- a/chrome/browser/views/bookmark_bar_view.cc +++ b/chrome/browser/views/bookmark_bar_view.cc @@ -1105,6 +1105,13 @@ int BookmarkBarView::OnPerformDrop(const DropTargetEvent& event) { return PerformDropImpl(data, parent_node, index); } +void BookmarkBarView::OnFullscreenToggled(bool fullscreen) { + if (!fullscreen) + size_animation_->Reset(IsAlwaysShown() ? 1 : 0); + else if (IsAlwaysShown()) + size_animation_->Reset(0); +} + bool BookmarkBarView::IsDetachedStyle() { return OnNewTabPage() && (size_animation_->GetCurrentValue() != 1); } diff --git a/chrome/browser/views/bookmark_bar_view.h b/chrome/browser/views/bookmark_bar_view.h index d8ab41e..479e4a7 100644 --- a/chrome/browser/views/bookmark_bar_view.h +++ b/chrome/browser/views/bookmark_bar_view.h @@ -106,6 +106,9 @@ class BookmarkBarView : public views::View, virtual void OnDragExited(); virtual int OnPerformDrop(const views::DropTargetEvent& event); + // Called when fullscreen mode toggles on or off; this affects our layout. + void OnFullscreenToggled(bool fullscreen); + // Sets the model change listener to listener. void SetModelChangedListener(ModelChangedListener* listener) { model_changed_listener_ = listener; diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc index 6e07b23..8a8b2cf 100644 --- a/chrome/browser/views/frame/browser_view.cc +++ b/chrome/browser/views/frame/browser_view.cc @@ -181,6 +181,7 @@ BrowserView::BrowserView(Browser* browser) toolbar_(NULL), contents_container_(NULL), initialized_(false), + fullscreen_(false), can_drop_(false), hung_window_detector_(&hung_plugin_action_), ticker_(0), @@ -366,11 +367,15 @@ bool BrowserView::SupportsWindowFeature(WindowFeature feature) const { 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 @@ void BrowserView::SetStarredState(bool is_starred) { } 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 @@ bool BrowserView::IsMaximized() const { 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 @@ std::wstring BrowserView::GetWindowName() const { 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); } diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index e2e8063..bc7aad7 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -169,6 +169,8 @@ class BrowserView : public BrowserWindow, virtual void SetStarredState(bool is_starred); virtual gfx::Rect GetNormalBounds() const; virtual bool IsMaximized() const; + virtual void SetFullscreen(bool fullscreen); + virtual bool IsFullscreen() const; virtual LocationBar* GetLocationBar() const; virtual void SetFocusToLocationBar(); virtual void UpdateStopGoState(bool is_loading); @@ -259,6 +261,14 @@ class BrowserView : public BrowserWindow, virtual int OnPerformDrop(const views::DropTargetEvent& event); private: + // Information saved before going into fullscreen mode, used to restore the + // window afterwards. + struct SavedWindowInfo { + LONG style; + LONG ex_style; + RECT window_rect; + }; + // Creates the system menu. void InitSystemMenu(); @@ -374,6 +384,12 @@ class BrowserView : public BrowserWindow, // True if we have already been initialized. bool initialized_; + // True if we're in fullscreen mode. + bool fullscreen_; + + // Saved window information from before entering fullscreen mode. + SavedWindowInfo saved_window_info_; + // Lazily created representation of the system menu. scoped_ptr<Menu> system_menu_; diff --git a/chrome/browser/views/frame/opaque_non_client_view.cc b/chrome/browser/views/frame/opaque_non_client_view.cc index af3a77d..8e19e2b 100644 --- a/chrome/browser/views/frame/opaque_non_client_view.cc +++ b/chrome/browser/views/frame/opaque_non_client_view.cc @@ -522,6 +522,9 @@ void OpaqueNonClientView::GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) { DCHECK(window_mask); + if (browser_view_->IsFullscreen()) + return; + // Redefine the window visible region for the new size. window_mask->moveTo(0, 3); window_mask->lineTo(1, 2); @@ -556,6 +559,9 @@ void OpaqueNonClientView::ResetWindowControls() { // OpaqueNonClientView, views::View overrides: void OpaqueNonClientView::Paint(ChromeCanvas* canvas) { + if (browser_view_->IsFullscreen()) + return; // Nothing is visible, so don't bother to paint. + if (frame_->IsMaximized()) PaintMaximizedFrameBorder(canvas); else @@ -662,6 +668,8 @@ SkBitmap OpaqueNonClientView::GetFavIconForTabIconView() { // OpaqueNonClientView, private: int OpaqueNonClientView::FrameBorderThickness() const { + if (browser_view_->IsFullscreen()) + return 0; return frame_->IsMaximized() ? GetSystemMetrics(SM_CXSIZEFRAME) : kFrameBorderThickness; } @@ -673,7 +681,8 @@ int OpaqueNonClientView::TopResizeHeight() const { int OpaqueNonClientView::NonClientBorderThickness() const { // In maximized mode, we don't show a client edge. return FrameBorderThickness() + - (frame_->IsMaximized() ? 0 : kClientEdgeThickness); + ((frame_->IsMaximized() || browser_view_->IsFullscreen()) ? + 0 : kClientEdgeThickness); } int OpaqueNonClientView::NonClientTopBorderHeight() const { @@ -683,7 +692,8 @@ int OpaqueNonClientView::NonClientTopBorderHeight() const { } return FrameBorderThickness() + - (frame_->IsMaximized() ? 0 : kNonClientRestoredExtraThickness); + ((frame_->IsMaximized() || browser_view_->IsFullscreen()) ? + 0 : kNonClientRestoredExtraThickness); } int OpaqueNonClientView::BottomEdgeThicknessWithinNonClientHeight() const { diff --git a/chrome/test/test_browser_window.h b/chrome/test/test_browser_window.h index 99e25a2..c3526f7 100644 --- a/chrome/test/test_browser_window.h +++ b/chrome/test/test_browser_window.h @@ -35,6 +35,8 @@ class TestBrowserWindow : public BrowserWindow { virtual void SetStarredState(bool is_starred) {} virtual gfx::Rect GetNormalBounds() const { return gfx::Rect(); } virtual bool IsMaximized() const { return false; } + virtual void SetFullscreen(bool fullscreen) {} + virtual bool IsFullscreen() const { return false; } virtual LocationBar* GetLocationBar() const { return const_cast<TestLocationBar*>(&location_bar_); } |