From 8a9e1824c350d2fee3ca518e2b4542fd54015656 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 7 Aug 2014 13:47:58 +0800 Subject: [PATCH] views: Add support for auto-hide menubar. --- atom/browser/native_window_views.cc | 38 +++++++++++++++++++++++----- atom/browser/native_window_views.h | 8 +++++- atom/browser/ui/views/menu_layout.cc | 6 ++--- atom/common/options_switches.cc | 3 +++ atom/common/options_switches.h | 1 + docs/api/browser-window.md | 2 ++ 6 files changed, 47 insertions(+), 11 deletions(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 4153ae1a411a..9a78fa3983b4 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -94,13 +94,15 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents, const mate::Dictionary& options) : NativeWindow(web_contents, options), window_(new views::Widget), - menu_bar_(NULL), web_view_(inspectable_web_contents()->GetView()->GetView()), + menu_bar_autohide_(false), + menu_bar_show_(false), keyboard_event_handler_(new views::UnhandledKeyboardEventHandler), use_content_size_(false), resizable_(true) { options.Get(switches::kResizable, &resizable_); options.Get(switches::kTitle, &title_); + options.Get(switches::kAutoHideMenuBar, &menu_bar_autohide_); int width = 800, height = 600; options.Get(switches::kWidth, &width); @@ -242,7 +244,7 @@ gfx::Size NativeWindowViews::GetContentSize() { gfx::Size content_size = window_->non_client_view()->frame_view()->GetBoundsForClientView().size(); - if (menu_bar_) + if (menu_bar_ && menu_bar_show_) content_size.set_height(content_size.height() - kMenuBarHeight); return content_size; } @@ -383,11 +385,14 @@ void NativeWindowViews::SetMenu(ui::MenuModel* menu_model) { if (!menu_bar_) { gfx::Size content_size = GetContentSize(); - menu_bar_ = new MenuBar; - AddChildViewAt(menu_bar_, 0); + menu_bar_.reset(new MenuBar); + menu_bar_->set_owned_by_client(); - if (use_content_size_) - SetContentSize(content_size); + if (!menu_bar_autohide_) { + SetMenuBarVisibility(true); + if (use_content_size_) + SetContentSize(content_size); + } } menu_bar_->SetMenu(menu_model); @@ -529,6 +534,14 @@ views::NonClientFrameView* NativeWindowViews::CreateNonClientFrameView( void NativeWindowViews::HandleKeyboardEvent( content::WebContents*, const content::NativeWebKeyboardEvent& event) { + if (menu_bar_autohide_ && + (event.modifiers & content::NativeWebKeyboardEvent::AltKey) && + (event.windowsKeyCode == 164 || event.windowsKeyCode == 165) && + (event.type == blink::WebInputEvent::RawKeyDown)) { + SetMenuBarVisibility(!menu_bar_show_); + Layout(); + } + keyboard_event_handler_->HandleKeyboardEvent(event, GetFocusManager()); } @@ -558,11 +571,22 @@ gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds( const gfx::Rect& bounds) { gfx::Rect window_bounds = window_->non_client_view()->GetWindowBoundsForClientBounds(bounds); - if (menu_bar_) + if (menu_bar_ && menu_bar_show_) window_bounds.set_height(window_bounds.height() + kMenuBarHeight); return window_bounds; } +void NativeWindowViews::SetMenuBarVisibility(bool visible) { + if (!menu_bar_) + return; + + menu_bar_show_ = visible; + if (visible) + AddChildView(menu_bar_.get()); + else + RemoveChildView(menu_bar_.get()); +} + // static NativeWindow* NativeWindow::Create(content::WebContents* web_contents, const mate::Dictionary& options) { diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 3c6c006f96ad..d4292191c7bd 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -121,10 +121,16 @@ class NativeWindowViews : public NativeWindow, // in client area we need to substract/add menu bar's height in convertions. gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds); + // Show/Hide the menu bar. + void SetMenuBarVisibility(bool visible); + scoped_ptr window_; - MenuBar* menu_bar_; views::View* web_view_; // Managed by inspectable_web_contents_. + scoped_ptr menu_bar_; + bool menu_bar_autohide_; + bool menu_bar_show_; + #if defined(USE_X11) scoped_ptr global_menu_bar_; #endif diff --git a/atom/browser/ui/views/menu_layout.cc b/atom/browser/ui/views/menu_layout.cc index cb92e98f4ebd..5ed015fb8710 100644 --- a/atom/browser/ui/views/menu_layout.cc +++ b/atom/browser/ui/views/menu_layout.cc @@ -24,10 +24,10 @@ void MenuLayout::Layout(views::View* host) { gfx::Rect web_view_bounds = gfx::Rect( 0, menu_height_, size.width(), size.height() - menu_height_); - views::View* menu_bar = host->child_at(0); - views::View* web_view = host->child_at(1); - menu_bar->SetBoundsRect(menu_Bar_bounds); + views::View* web_view = host->child_at(0); + views::View* menu_bar = host->child_at(1); web_view->SetBoundsRect(web_view_bounds); + menu_bar->SetBoundsRect(menu_Bar_bounds); } gfx::Size MenuLayout::GetPreferredSize(views::View* host) { diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index ba3634e2f80d..8aa7638f4541 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -48,6 +48,9 @@ const char kWebPreferences[] = "web-preferences"; // The factor of which page should be zoomed. const char kZoomFactor[] = "zoom-factor"; +// The menu bar is hidden unless "Alt" is pressed. +const char kAutoHideMenuBar[] = "auto-hide-menu-bar"; + } // namespace switches } // namespace atom diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index 8d06177ed749..f9e202d97e38 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -32,6 +32,7 @@ extern const char kAcceptFirstMouse[]; extern const char kUseContentSize[]; extern const char kWebPreferences[]; extern const char kZoomFactor[]; +extern const char kAutoHideMenuBar[]; } // namespace switches diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 3a9a2815297a..be6357eb9ef9 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -55,6 +55,8 @@ You can also create a window without chrome by using `manual-enable-iframe` or `disable`. * `accept-first-mouse` Boolean - Whether the web view accepts a single mouse-down event that simultaneously activates the window + * `auto-hide-menu-bar` Boolean - Auto hide the menu bar unless the `Alt` + key is pressed. * `web-preferences` Object - Settings of web page's features * `javascript` Boolean * `web-security` Boolean