summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/chrome_dll.rc1
-rw-r--r--chrome/app/chrome_dll_resource.h3
-rw-r--r--chrome/browser/browser.cc73
-rw-r--r--chrome/browser/browser.h8
-rw-r--r--chrome/browser/browser_window.h4
-rw-r--r--chrome/browser/views/bookmark_bar_view.cc7
-rw-r--r--chrome/browser/views/bookmark_bar_view.h3
-rw-r--r--chrome/browser/views/frame/browser_view.cc82
-rw-r--r--chrome/browser/views/frame/browser_view.h16
-rw-r--r--chrome/browser/views/frame/opaque_non_client_view.cc14
-rw-r--r--chrome/test/test_browser_window.h2
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_);
}