Update workspace visible APIs.
authorHaojian Wu <hokein.wu@gmail.com>
Fri, 27 Mar 2015 11:41:07 +0000 (19:41 +0800)
committerHaojian Wu <hokein.wu@gmail.com>
Sun, 29 Mar 2015 02:01:52 +0000 (10:01 +0800)
atom/browser/api/atom_api_window.cc
atom/browser/api/atom_api_window.h
atom/browser/native_window.cc
atom/browser/native_window.h
atom/browser/native_window_mac.h
atom/browser/native_window_mac.mm
atom/browser/native_window_views.cc
atom/browser/native_window_views.h
docs/api/browser-window.md

index fdc117d..78b8609 100644 (file)
@@ -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<WebContents> 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)
index 359fff2..a5a68b7 100644 (file)
@@ -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<WebContents> GetWebContents(v8::Isolate* isolate) const;
index f39959a..df36bfa 100644 (file)
@@ -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_;
 }
index 85b6c53..377898c 100644 (file)
@@ -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.
index 8a45a85..d21b207 100644 (file)
@@ -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.
index 022de9b..0783aac 100644 (file)
@@ -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 {
index 0e3941c..f8a612d 100644 (file)
@@ -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<XAtom> 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() {
index df5a026..92d4f1b 100644 (file)
@@ -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<GlobalMenuBarX11> global_menu_bar_;
 
index f938640..3894f9e 100644 (file)
@@ -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