From 476b61322f76eb97bb7718352283224356f34626 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Mar 2015 14:18:37 +0800 Subject: [PATCH 1/3] 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_; From 296d5c451575e5c977127403081c46bcfed80274 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Mar 2015 18:59:24 +0800 Subject: [PATCH 2/3] :memo: Add document for workspace visible APIs. --- docs/api/browser-window.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index a8456b5767de..f9386406841a 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -586,6 +586,20 @@ can still bring up the menu bar by pressing the single `Alt` key. Returns whether the menu bar is visible. +### BrowserWindow.setVisibleOnAllWorkspaces(visible) + +* `visible` Boolean + +Sets whether the window should be visible on all workspaces. + +**Note:** This API is only available on Mac/Linux. + +### BrowserWindow.isVisibleOnAllWorkspaces() + +Returns whether the window is visible on all workspaces. + +**Note:** This API is only available on Mac/Linux. + ## Class: WebContents A `WebContents` is responsible for rendering and controlling a web page. From 0342854e25ca8a4dfc5449556e9bf40c61b4325f Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Fri, 27 Mar 2015 19:41:07 +0800 Subject: [PATCH 3/3] Update workspace visible APIs. --- atom/browser/api/atom_api_window.cc | 4 ---- atom/browser/api/atom_api_window.h | 2 -- atom/browser/native_window.cc | 7 ------- atom/browser/native_window.h | 6 ++---- atom/browser/native_window_mac.h | 2 -- atom/browser/native_window_mac.mm | 5 ++--- atom/browser/native_window_views.cc | 15 ++++++++++----- atom/browser/native_window_views.h | 7 ------- docs/api/browser-window.md | 4 ++-- 9 files changed, 16 insertions(+), 36 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index fdc117d4d7ae..78b8609582ea 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -424,7 +424,6 @@ void Window::ShowDefinitionForSelection() { } #endif -#if defined(OS_MACOSX) || defined(OS_LINUX) void Window::SetVisibleOnAllWorkspaces(bool visible) { return window_->SetVisibleOnAllWorkspaces(visible); } @@ -432,7 +431,6 @@ void Window::SetVisibleOnAllWorkspaces(bool visible) { bool Window::IsVisibleOnAllWorkspaces() { return window_->IsVisibleOnAllWorkspaces(); } -#endif mate::Handle Window::GetWebContents(v8::Isolate* isolate) const { return WebContents::CreateFrom(isolate, window_->GetWebContents()); @@ -504,12 +502,10 @@ 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 359fff26e6eb..a5a68b7cbdef 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -130,10 +130,8 @@ 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; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index f39959a87699..df36bfa8570a 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -280,13 +280,6 @@ 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 85b6c5390b80..377898c5b5f6 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -144,6 +144,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, virtual void SetProgressBar(double progress) = 0; virtual void SetOverlayIcon(const gfx::Image& overlay, const std::string& description) = 0; + virtual void SetVisibleOnAllWorkspaces(bool visible) = 0; + virtual bool IsVisibleOnAllWorkspaces() = 0; virtual bool IsClosed() const { return is_closed_; } virtual void OpenDevTools(); @@ -172,10 +174,6 @@ 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 8a45a856764c..d21b207841e2 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -115,8 +115,6 @@ 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 022de9b4ef76..0783aac833a4 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -310,7 +310,6 @@ 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); @@ -695,7 +694,6 @@ void NativeWindowMac::ShowDefinitionForSelection() { void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible) { NSUInteger collectionBehavior = [window_ collectionBehavior]; - is_visible_on_all_workspaces_ = visible; if (visible) { collectionBehavior |= NSWindowCollectionBehaviorCanJoinAllSpaces; } else { @@ -705,7 +703,8 @@ void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible) { } bool NativeWindowMac::IsVisibleOnAllWorkspaces() { - return is_visible_on_all_workspaces_; + NSUInteger collectionBehavior = [window_ collectionBehavior]; + return collectionBehavior & NSWindowCollectionBehaviorCanJoinAllSpaces; } bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const { diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 0e3941ced964..f8a612de90ea 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -150,9 +150,6 @@ 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 @@ -678,12 +675,20 @@ bool NativeWindowViews::IsMenuBarVisible() { } void NativeWindowViews::SetVisibleOnAllWorkspaces(bool visible) { - is_visible_on_all_workspaces_ = visible; window_->SetVisibleOnAllWorkspaces(visible); } bool NativeWindowViews::IsVisibleOnAllWorkspaces() { - return is_visible_on_all_workspaces_; +#if defined(USE_X11) + // Use the presence/absence of _NET_WM_STATE_STICKY in _NET_WM_STATE to + // determine whether the current window is visible on all workspaces. + XAtom sticky_atom = gfx::GetAtom("_NET_WM_STATE_STICKY"); + std::vector atom_properties; + gfx::GetAtomArrayProperty(GetNativeWindow(), "_NET_WM_STATE", &atom_properties); + return std::find(atom_properties.begin(), + atom_properties.end(), sticky_atom) != atom_properties.end(); +#endif + return false; } gfx::AcceleratedWidget NativeWindowViews::GetAcceleratedWidget() { diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index df5a02600900..92d4f1b1713e 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -80,11 +80,8 @@ class NativeWindowViews : public NativeWindow, bool IsMenuBarAutoHide() override; void SetMenuBarVisibility(bool visible) override; bool IsMenuBarVisible() override; - -#if defined(OS_LINUX) void SetVisibleOnAllWorkspaces(bool visible) override; bool IsVisibleOnAllWorkspaces() override; -#endif gfx::AcceleratedWidget GetAcceleratedWidget(); @@ -154,10 +151,6 @@ 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_; diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index f9386406841a..3894f9ed4862 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -592,13 +592,13 @@ Returns whether the menu bar is visible. Sets whether the window should be visible on all workspaces. -**Note:** This API is only available on Mac/Linux. +**Note:** This API does nothing on Windows. ### BrowserWindow.isVisibleOnAllWorkspaces() Returns whether the window is visible on all workspaces. -**Note:** This API is only available on Mac/Linux. +**Note:** This API always return false on Windows. ## Class: WebContents