From 476b61322f76eb97bb7718352283224356f34626 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Mar 2015 14:18:37 +0800 Subject: [PATCH] Add SetVisibleOnAllWorkspaces/IsVisibleOnAllWorkspaces API. These two APIs are only available on OS X/Linux platforms. --- atom/browser/api/atom_api_window.cc | 16 ++++++++++++++++ atom/browser/api/atom_api_window.h | 5 +++++ atom/browser/native_window.cc | 7 +++++++ atom/browser/native_window.h | 4 ++++ atom/browser/native_window_mac.h | 5 +++++ atom/browser/native_window_mac.mm | 16 ++++++++++++++++ atom/browser/native_window_views.cc | 12 ++++++++++++ atom/browser/native_window_views.h | 9 +++++++++ 8 files changed, 74 insertions(+) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index d8e18854c744..fdc117d4d7ae 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -424,6 +424,16 @@ void Window::ShowDefinitionForSelection() { } #endif +#if defined(OS_MACOSX) || defined(OS_LINUX) +void Window::SetVisibleOnAllWorkspaces(bool visible) { + return window_->SetVisibleOnAllWorkspaces(visible); +} + +bool Window::IsVisibleOnAllWorkspaces() { + return window_->IsVisibleOnAllWorkspaces(); +} +#endif + mate::Handle Window::GetWebContents(v8::Isolate* isolate) const { return WebContents::CreateFrom(isolate, window_->GetWebContents()); } @@ -494,6 +504,12 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("isMenuBarAutoHide", &Window::IsMenuBarAutoHide) .SetMethod("setMenuBarVisibility", &Window::SetMenuBarVisibility) .SetMethod("isMenuBarVisible", &Window::IsMenuBarVisible) +#if defined(OS_MACOSX) || defined(OS_LINUX) + .SetMethod("setVisibleOnAllWorkspaces", + &Window::SetVisibleOnAllWorkspaces) + .SetMethod("isVisibleOnAllWorkspaces", + &Window::IsVisibleOnAllWorkspaces) +#endif #if defined(OS_MACOSX) .SetMethod("showDefinitionForSelection", &Window::ShowDefinitionForSelection) diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index b6805c83d89a..359fff26e6eb 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -130,6 +130,11 @@ class Window : public mate::EventEmitter, void ShowDefinitionForSelection(); #endif +#if defined(OS_MACOSX) || defined(OS_LINUX) + void SetVisibleOnAllWorkspaces(bool visible); + bool IsVisibleOnAllWorkspaces(); +#endif + // APIs for WebContents. mate::Handle GetWebContents(v8::Isolate* isolate) const; mate::Handle GetDevToolsWebContents(v8::Isolate* isolate) const; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index df36bfa8570a..f39959a87699 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -280,6 +280,13 @@ bool NativeWindow::IsMenuBarVisible() { return true; } +void NativeWindow::SetVisibleOnAllWorkspaces(bool visible) { +} + +bool NativeWindow::IsVisibleOnAllWorkspaces() { + return false; +} + bool NativeWindow::HasModalDialog() { return has_dialog_attached_; } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 2495259d82d8..85b6c5390b80 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -172,6 +172,10 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, virtual void SetMenuBarVisibility(bool visible); virtual bool IsMenuBarVisible(); + // Visible on all workspaces. + virtual void SetVisibleOnAllWorkspaces(bool visible); + virtual bool IsVisibleOnAllWorkspaces(); + // The same with closing a tab in a real browser. // // Should be called by platform code when user want to close the window. diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index 643d885c5dc0..8a45a856764c 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -77,6 +77,9 @@ class NativeWindowMac : public NativeWindow { const std::string& description) override; void ShowDefinitionForSelection() override; + void SetVisibleOnAllWorkspaces(bool visible) override; + bool IsVisibleOnAllWorkspaces() override; + // Returns true if |point| in local Cocoa coordinate system falls within // the draggable region. bool IsWithinDraggableRegion(NSPoint point) const; @@ -112,6 +115,8 @@ class NativeWindowMac : public NativeWindow { bool is_kiosk_; + bool is_visible_on_all_workspaces_; + NSInteger attention_request_id_; // identifier from requestUserAttention // The presentation options before entering kiosk mode. diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 6c3a4e268418..022de9b4ef76 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -310,6 +310,7 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents, const mate::Dictionary& options) : NativeWindow(web_contents, options), is_kiosk_(false), + is_visible_on_all_workspaces_(false), attention_request_id_(0) { int width = 800, height = 600; options.Get(switches::kWidth, &width); @@ -692,6 +693,21 @@ void NativeWindowMac::ShowDefinitionForSelection() { rwhv->ShowDefinitionForSelection(); } +void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible) { + NSUInteger collectionBehavior = [window_ collectionBehavior]; + is_visible_on_all_workspaces_ = visible; + if (visible) { + collectionBehavior |= NSWindowCollectionBehaviorCanJoinAllSpaces; + } else { + collectionBehavior &= ~NSWindowCollectionBehaviorCanJoinAllSpaces; + } + [window_ setCollectionBehavior:collectionBehavior]; +} + +bool NativeWindowMac::IsVisibleOnAllWorkspaces() { + return is_visible_on_all_workspaces_; +} + bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const { if (!draggable_region_) return false; diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 8d34180c9917..0e3941ced964 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -150,6 +150,9 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents, menu_bar_autohide_(false), menu_bar_visible_(false), menu_bar_alt_pressed_(false), +#if defined(OS_LINUX) + is_visible_on_all_workspaces_(false), +#endif #if defined(OS_WIN) is_minimized_(false), #endif @@ -674,6 +677,15 @@ bool NativeWindowViews::IsMenuBarVisible() { return menu_bar_visible_; } +void NativeWindowViews::SetVisibleOnAllWorkspaces(bool visible) { + is_visible_on_all_workspaces_ = visible; + window_->SetVisibleOnAllWorkspaces(visible); +} + +bool NativeWindowViews::IsVisibleOnAllWorkspaces() { + return is_visible_on_all_workspaces_; +} + gfx::AcceleratedWidget NativeWindowViews::GetAcceleratedWidget() { return GetNativeWindow()->GetHost()->GetAcceleratedWidget(); } diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 24cc9c9f436b..df5a02600900 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -81,6 +81,11 @@ class NativeWindowViews : public NativeWindow, void SetMenuBarVisibility(bool visible) override; bool IsMenuBarVisible() override; +#if defined(OS_LINUX) + void SetVisibleOnAllWorkspaces(bool visible) override; + bool IsVisibleOnAllWorkspaces() override; +#endif + gfx::AcceleratedWidget GetAcceleratedWidget(); SkRegion* draggable_region() const { return draggable_region_.get(); } @@ -149,6 +154,10 @@ class NativeWindowViews : public NativeWindow, bool menu_bar_visible_; bool menu_bar_alt_pressed_; +#if defined(OS_LINUX) + bool is_visible_on_all_workspaces_; +#endif + #if defined(USE_X11) scoped_ptr global_menu_bar_;