diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index fdc117d4d..78b860958 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 359fff26e..a5a68b7cb 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 f39959a87..df36bfa85 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 85b6c5390..377898c5b 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 8a45a8567..d21b20784 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 022de9b4e..0783aac83 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 0e3941ced..f8a612de9 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 df5a02600..92d4f1b17 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 f93864068..3894f9ed4 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