From 79d4724a15667f4abb396726a38159aa148cc43e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 12 Nov 2014 17:36:20 +0800 Subject: [PATCH 1/5] Add a bunch of menu bar related APIs --- atom/browser/native_window.cc | 14 ++++++++++++++ atom/browser/native_window.h | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 95dc491ed43d..0035ab48b8bf 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -243,6 +243,20 @@ void NativeWindow::Print(bool silent, bool print_background) { PrintNow(silent, print_background); } +void NativeWindow::SetAutoHideMenuBar(bool auto_hide) { +} + +bool NativeWindow::IsMenuBarAutoHide() { + return false; +} + +void NativeWindow::SetMenuBarVisibility(bool visible) { +} + +bool NativeWindow::IsMenuBarVisible() { + return true; +} + bool NativeWindow::HasModalDialog() { return has_dialog_attached_; } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index a57a1a9dbe2b..a434d28175ad 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -161,6 +161,12 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, // Print current page. virtual void Print(bool silent, bool print_background); + // Toggle the menu bar. + virtual void SetAutoHideMenuBar(bool auto_hide); + virtual bool IsMenuBarAutoHide(); + virtual void SetMenuBarVisibility(bool visible); + virtual bool IsMenuBarVisible(); + // The same with closing a tab in a real browser. // // Should be called by platform code when user want to close the window. From 42afc071eb4be78411e8b0fff0d3d8b1de6ce030 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 12 Nov 2014 20:08:51 +0800 Subject: [PATCH 2/5] OVERRIDE => override in native_window_views.h --- atom/browser/native_window_views.h | 132 ++++++++++++++--------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 56eedddeb8a4..dcb013871497 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -32,47 +32,47 @@ class NativeWindowViews : public NativeWindow, virtual ~NativeWindowViews(); // NativeWindow: - virtual void Close() OVERRIDE; - virtual void CloseImmediately() OVERRIDE; - virtual void Move(const gfx::Rect& pos) OVERRIDE; - virtual void Focus(bool focus) OVERRIDE; - virtual bool IsFocused() OVERRIDE; - virtual void Show() OVERRIDE; - virtual void ShowInactive() OVERRIDE; - virtual void Hide() OVERRIDE; - virtual bool IsVisible() OVERRIDE; - virtual void Maximize() OVERRIDE; - virtual void Unmaximize() OVERRIDE; - virtual bool IsMaximized() OVERRIDE; - virtual void Minimize() OVERRIDE; - virtual void Restore() OVERRIDE; - virtual bool IsMinimized() OVERRIDE; - virtual void SetFullscreen(bool fullscreen) OVERRIDE; - virtual bool IsFullscreen() OVERRIDE; - virtual void SetSize(const gfx::Size& size) OVERRIDE; - virtual gfx::Size GetSize() OVERRIDE; - virtual void SetContentSize(const gfx::Size& size) OVERRIDE; - virtual gfx::Size GetContentSize() OVERRIDE; - virtual void SetMinimumSize(const gfx::Size& size) OVERRIDE; - virtual gfx::Size GetMinimumSize() OVERRIDE; - virtual void SetMaximumSize(const gfx::Size& size) OVERRIDE; - virtual gfx::Size GetMaximumSize() OVERRIDE; - virtual void SetResizable(bool resizable) OVERRIDE; - virtual bool IsResizable() OVERRIDE; - virtual void SetAlwaysOnTop(bool top) OVERRIDE; - virtual bool IsAlwaysOnTop() OVERRIDE; - virtual void Center() OVERRIDE; - virtual void SetPosition(const gfx::Point& position) OVERRIDE; - virtual gfx::Point GetPosition() OVERRIDE; - virtual void SetTitle(const std::string& title) OVERRIDE; - virtual std::string GetTitle() OVERRIDE; - virtual void FlashFrame(bool flash) OVERRIDE; - virtual void SetSkipTaskbar(bool skip) OVERRIDE; - virtual void SetKiosk(bool kiosk) OVERRIDE; - virtual bool IsKiosk() OVERRIDE; - virtual void SetMenu(ui::MenuModel* menu_model) OVERRIDE; - virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; - virtual void SetProgressBar(double value) OVERRIDE; + void Close() override; + void CloseImmediately() override; + void Move(const gfx::Rect& pos) override; + void Focus(bool focus) override; + bool IsFocused() override; + void Show() override; + void ShowInactive() override; + void Hide() override; + bool IsVisible() override; + void Maximize() override; + void Unmaximize() override; + bool IsMaximized() override; + void Minimize() override; + void Restore() override; + bool IsMinimized() override; + void SetFullscreen(bool fullscreen) override; + bool IsFullscreen() override; + void SetSize(const gfx::Size& size) override; + gfx::Size GetSize() override; + void SetContentSize(const gfx::Size& size) override; + gfx::Size GetContentSize() override; + void SetMinimumSize(const gfx::Size& size) override; + gfx::Size GetMinimumSize() override; + void SetMaximumSize(const gfx::Size& size) override; + gfx::Size GetMaximumSize() override; + void SetResizable(bool resizable) override; + bool IsResizable() override; + void SetAlwaysOnTop(bool top) override; + bool IsAlwaysOnTop() override; + void Center() override; + void SetPosition(const gfx::Point& position) override; + gfx::Point GetPosition() override; + void SetTitle(const std::string& title) override; + std::string GetTitle() override; + void FlashFrame(bool flash) override; + void SetSkipTaskbar(bool skip) override; + void SetKiosk(bool kiosk) override; + bool IsKiosk() override; + void SetMenu(ui::MenuModel* menu_model) override; + gfx::NativeWindow GetNativeWindow() override; + void SetProgressBar(double value) override; gfx::AcceleratedWidget GetAcceleratedWidget(); @@ -81,43 +81,43 @@ class NativeWindowViews : public NativeWindow, private: // NativeWindow: - virtual void UpdateDraggableRegions( - const std::vector& regions) OVERRIDE; + void UpdateDraggableRegions( + const std::vector& regions) override; // views::WidgetObserver: - virtual void OnWidgetActivationChanged( - views::Widget* widget, bool active) OVERRIDE; + void OnWidgetActivationChanged( + views::Widget* widget, bool active) override; // views::WidgetDelegate: - virtual void DeleteDelegate() OVERRIDE; - virtual views::View* GetInitiallyFocusedView() OVERRIDE; - virtual bool CanResize() const OVERRIDE; - virtual bool CanMaximize() const OVERRIDE; - virtual base::string16 GetWindowTitle() const OVERRIDE; - virtual bool ShouldHandleSystemCommands() const OVERRIDE; - virtual gfx::ImageSkia GetWindowAppIcon() OVERRIDE; - virtual gfx::ImageSkia GetWindowIcon() OVERRIDE; - virtual views::Widget* GetWidget() OVERRIDE; - virtual const views::Widget* GetWidget() const OVERRIDE; - virtual views::View* GetContentsView() OVERRIDE; - virtual bool ShouldDescendIntoChildForEventHandling( + void DeleteDelegate() override; + views::View* GetInitiallyFocusedView() override; + bool CanResize() const override; + bool CanMaximize() const override; + base::string16 GetWindowTitle() const override; + bool ShouldHandleSystemCommands() const override; + gfx::ImageSkia GetWindowAppIcon() override; + gfx::ImageSkia GetWindowIcon() override; + views::Widget* GetWidget() override; + const views::Widget* GetWidget() const override; + views::View* GetContentsView() override; + bool ShouldDescendIntoChildForEventHandling( gfx::NativeView child, - const gfx::Point& location) OVERRIDE; - virtual views::ClientView* CreateClientView(views::Widget* widget) OVERRIDE; - virtual views::NonClientFrameView* CreateNonClientFrameView( - views::Widget* widget) OVERRIDE; + const gfx::Point& location) override; + views::ClientView* CreateClientView(views::Widget* widget) override; + views::NonClientFrameView* CreateNonClientFrameView( + views::Widget* widget) override; // brightray::InspectableWebContentsDelegate: - virtual gfx::ImageSkia GetDevToolsWindowIcon() OVERRIDE; + gfx::ImageSkia GetDevToolsWindowIcon() override; // content::WebContentsDelegate: - virtual void HandleMouseDown() OVERRIDE; - virtual void HandleKeyboardEvent( + void HandleMouseDown() override; + void HandleKeyboardEvent( content::WebContents*, - const content::NativeWebKeyboardEvent& event) OVERRIDE; + const content::NativeWebKeyboardEvent& event) override; // views::View: - virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; + bool AcceleratorPressed(const ui::Accelerator& accelerator) override; // Register accelerators supported by the menu model. void RegisterAccelerators(ui::MenuModel* menu_model); From cb8f97552822556f95e6e6b52ba88c17f63d6873 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 12 Nov 2014 20:31:55 +0800 Subject: [PATCH 3/5] Add JS menubar APIs --- atom/browser/api/atom_api_window.cc | 20 ++++++++++++++++++++ atom/browser/api/atom_api_window.h | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 1f4a4bbe6ce4..49ba2c8df7b2 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -378,6 +378,22 @@ void Window::SetProgressBar(double progress) { window_->SetProgressBar(progress); } +void Window::SetAutoHideMenuBar(bool auto_hide) { + window_->SetAutoHideMenuBar(auto_hide); +} + +bool Window::IsMenuBarAutoHide() { + return window_->IsMenuBarAutoHide(); +} + +void Window::SetMenuBarVisibility(bool visible) { + window_->SetMenuBarVisibility(visible); +} + +bool Window::IsMenuBarVisible() { + return window_->IsMenuBarVisible(); +} + mate::Handle Window::GetWebContents(v8::Isolate* isolate) const { return WebContents::CreateFrom(isolate, window_->GetWebContents()); } @@ -443,6 +459,10 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("capturePage", &Window::CapturePage) .SetMethod("print", &Window::Print) .SetMethod("setProgressBar", &Window::SetProgressBar) + .SetMethod("setAutoHideMenuBar", &Window::SetAutoHideMenuBar) + .SetMethod("isMenuBarAutoHide", &Window::IsMenuBarAutoHide) + .SetMethod("setMenuBarVisibility", &Window::SetMenuBarVisibility) + .SetMethod("isMenuBarVisible", &Window::IsMenuBarVisible) .SetMethod("_getWebContents", &Window::GetWebContents) .SetMethod("_getDevToolsWebContents", &Window::GetDevToolsWebContents); } diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 905559a8c35f..370634f13105 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -111,6 +111,10 @@ class Window : public mate::EventEmitter, void CapturePage(mate::Arguments* args); void Print(mate::Arguments* args); void SetProgressBar(double progress); + void SetAutoHideMenuBar(bool auto_hide); + bool IsMenuBarAutoHide(); + void SetMenuBarVisibility(bool visible); + bool IsMenuBarVisible(); // APIs for WebContents. mate::Handle GetWebContents(v8::Isolate* isolate) const; From 1cd391849446d6b7d1c155648302645991d9923d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 12 Nov 2014 20:32:14 +0800 Subject: [PATCH 4/5] views: Implement menubar APIs --- atom/browser/native_window_views.cc | 65 ++++++++++++++++------------- atom/browser/native_window_views.h | 7 ++-- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index dd0e662d5f5c..eb5f31d45974 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -237,6 +237,8 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents, } #endif + // TODO(zcbenz): This was used to force using native frame on Windows 2003, we + // should check whether setting it in InitParams can work. if (has_frame_) { window_->set_frame_type(views::Widget::FrameType::FRAME_TYPE_FORCE_NATIVE); window_->FrameTypeChanged(); @@ -559,6 +561,38 @@ void NativeWindowViews::SetProgressBar(double progress) { #endif } +void NativeWindowViews::SetAutoHideMenuBar(bool auto_hide) { + menu_bar_autohide_ = auto_hide; +} + +bool NativeWindowViews::IsMenuBarAutoHide() { + return menu_bar_autohide_; +} + +void NativeWindowViews::SetMenuBarVisibility(bool visible) { + if (!menu_bar_ || menu_bar_visible_ == visible) + return; + + // Always show the accelerator when the auto-hide menu bar shows. + if (menu_bar_autohide_) + menu_bar_->SetAcceleratorVisibility(visible); + + menu_bar_visible_ = visible; + if (visible) { + DCHECK_EQ(child_count(), 1); + AddChildView(menu_bar_.get()); + } else { + DCHECK_EQ(child_count(), 2); + RemoveChildView(menu_bar_.get()); + } + + Layout(); +} + +bool NativeWindowViews::IsMenuBarVisible() { + return menu_bar_visible_; +} + gfx::AcceleratedWidget NativeWindowViews::GetAcceleratedWidget() { return GetNativeWindow()->GetHost()->GetAcceleratedWidget(); } @@ -600,10 +634,8 @@ void NativeWindowViews::OnWidgetActivationChanged( GetWebContents()->Focus(); // Hide menu bar when window is blured. - if (!active && menu_bar_autohide_ && menu_bar_visible_) { + if (!active && menu_bar_autohide_ && menu_bar_visible_) SetMenuBarVisibility(false); - Layout(); - } } void NativeWindowViews::DeleteDelegate() { @@ -695,10 +727,8 @@ gfx::ImageSkia NativeWindowViews::GetDevToolsWindowIcon() { void NativeWindowViews::HandleMouseDown() { // Hide menu bar when web view is clicked. - if (menu_bar_autohide_ && menu_bar_visible_) { + if (menu_bar_autohide_ && menu_bar_visible_) SetMenuBarVisibility(false); - Layout(); - } } void NativeWindowViews::HandleKeyboardEvent( @@ -718,10 +748,8 @@ void NativeWindowViews::HandleKeyboardEvent( if (event.type == blink::WebInputEvent::RawKeyDown && !IsAltKey(event) && IsAltModifier(event)) { if (!menu_bar_visible_ && - (menu_bar_->GetAcceleratorIndex(event.windowsKeyCode) != -1)) { + (menu_bar_->GetAcceleratorIndex(event.windowsKeyCode) != -1)) SetMenuBarVisibility(true); - Layout(); - } menu_bar_->ActivateAccelerator(event.windowsKeyCode); return; } @@ -741,7 +769,6 @@ void NativeWindowViews::HandleKeyboardEvent( // When a single Alt is released right after a Alt is pressed: menu_bar_alt_pressed_ = false; SetMenuBarVisibility(!menu_bar_visible_); - Layout(); } else { // When any other keys except single Alt have been pressed/released: menu_bar_alt_pressed_ = false; @@ -779,24 +806,6 @@ gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds( return window_bounds; } -void NativeWindowViews::SetMenuBarVisibility(bool visible) { - if (!menu_bar_) - return; - - // Always show the accelerator when the auto-hide menu bar shows. - if (menu_bar_autohide_) - menu_bar_->SetAcceleratorVisibility(visible); - - menu_bar_visible_ = visible; - if (visible) { - DCHECK_EQ(child_count(), 1); - AddChildView(menu_bar_.get()); - } else { - DCHECK_EQ(child_count(), 2); - 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 dcb013871497..fe7df269173a 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -73,6 +73,10 @@ class NativeWindowViews : public NativeWindow, void SetMenu(ui::MenuModel* menu_model) override; gfx::NativeWindow GetNativeWindow() override; void SetProgressBar(double value) override; + void SetAutoHideMenuBar(bool auto_hide) override; + bool IsMenuBarAutoHide() override; + void SetMenuBarVisibility(bool visible) override; + bool IsMenuBarVisible() override; gfx::AcceleratedWidget GetAcceleratedWidget(); @@ -126,9 +130,6 @@ 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_; views::View* web_view_; // Managed by inspectable_web_contents_. From f2b91d5e1d6069bea15d2b19081c607373589e86 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 12 Nov 2014 20:49:38 +0800 Subject: [PATCH 5/5] docs: Menu bar APIs --- docs/api/browser-window.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 222df14dabc8..711a09d10cea 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -506,6 +506,31 @@ On Linux platform, only supports Unity desktop environment, you need to specify the `*.desktop` file name to `desktopName` field in `package.json`. By default, it will assume `app.getName().desktop`. +### BrowserWindow.setAutoHideMenuBar(hide) + +* `hide` Boolean + +Sets whether the window menu bar should hide itself automatically. Once set the +menu bar will only show when users press the single `Alt` key. + +If the menu bar is already visible, calling `setAutoHideMenuBar(true)` won't +hide it immediately. + +### BrowserWindow.isMenuBarAutoHide() + +Returns whether menu bar automatically hides itself. + +### BrowserWindow.setMenuBarVisibility(visible) + +* `visible` Boolean + +Sets whether the menu bar should be visible. If the menu bar is auto-hide, users +can still bring up the menu bar by pressing the single `Alt` key. + +### BrowserWindow.isMenuBarVisible() + +Returns whether the menu bar is visible. + ## Class: WebContents A `WebContents` is responsible for rendering and controlling a web page.