diff options
author | rijubrata.bhaumik@intel.com <rijubrata.bhaumik@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-07 14:11:47 +0000 |
---|---|---|
committer | rijubrata.bhaumik@intel.com <rijubrata.bhaumik@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-07 14:11:47 +0000 |
commit | e654138276a87815d326456c61d81a55f83bf24e (patch) | |
tree | 6849a620ba2118fa289a32372aa6ac87930a65df | |
parent | 23c81d55ae8ecd9f10a8a2f4c92b39e3c2b182d9 (diff) | |
download | chromium_src-e654138276a87815d326456c61d81a55f83bf24e.zip chromium_src-e654138276a87815d326456c61d81a55f83bf24e.tar.gz chromium_src-e654138276a87815d326456c61d81a55f83bf24e.tar.bz2 |
Implement aura isFullScreenMode() for desktop-X11 only
IsFullScreenMode() in fullscreen_aura was not implemented.
This CL provides an implementation of the IsFullScreenMode()
and is inspired by the GTK counterpart
Review URL: https://codereview.chromium.org/118703004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243289 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/fullscreen_aurawin.cc (renamed from chrome/browser/fullscreen_aura.cc) | 2 | ||||
-rw-r--r-- | chrome/browser/fullscreen_aurax11.cc | 123 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 | ||||
-rw-r--r-- | ui/base/x/x11_util.h | 2 |
4 files changed, 128 insertions, 3 deletions
diff --git a/chrome/browser/fullscreen_aura.cc b/chrome/browser/fullscreen_aurawin.cc index db768be..d6a8294 100644 --- a/chrome/browser/fullscreen_aura.cc +++ b/chrome/browser/fullscreen_aurawin.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/chrome/browser/fullscreen_aurax11.cc b/chrome/browser/fullscreen_aurax11.cc new file mode 100644 index 0000000..46ff522 --- /dev/null +++ b/chrome/browser/fullscreen_aurax11.cc @@ -0,0 +1,123 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/fullscreen.h" + +#include <X11/Xlib.h> +#include "base/basictypes.h" +#include "base/logging.h" +#include "ui/base/x/x11_util.h" +#include "ui/gfx/rect.h" + +namespace { + +void EnumerateAllChildWindows(ui::EnumerateWindowsDelegate* delegate, + XID window) { + std::vector<XID> windows; + + if (!ui::GetXWindowStack(window, &windows)) { + // Window Manager doesn't support _NET_CLIENT_LIST_STACKING, so fall back + // to old school enumeration of all X windows. + XID root, parent, *children; + unsigned int num_children; + int status = XQueryTree(gfx::GetXDisplay(), window, &root, &parent, + &children, &num_children); + if (status) { + for (long i = static_cast<long>(num_children) - 1; i >= 0; i--) + windows.push_back(children[i]); + XFree(children); + } + } + + std::vector<XID>::iterator iter; + for (iter = windows.begin(); iter != windows.end(); iter++) { + if (delegate->ShouldStopIterating(*iter)) + return; + } +} + +// To find the top-most window: +// 1) Enumerate all top-level windows from the top to the bottom. +// 2) For each window: +// 2.1) If it is hidden, continue the iteration. +// 2.2) If it is managed by the Window Manager (has a WM_STATE property). +// Return this window as the top-most window. +// 2.3) Enumerate all its child windows. If there is a child window that is +// managed by the Window Manager (has a WM_STATE property). Return this +// child window as the top-most window. +// 2.4) Otherwise, continue the iteration. + +class WindowManagerWindowFinder : public ui::EnumerateWindowsDelegate { + public: + WindowManagerWindowFinder() : window_(None) { } + + XID window() const { return window_; } + + protected: + virtual bool ShouldStopIterating(XID window) OVERRIDE { + if (ui::PropertyExists(window, "WM_STATE")) { + window_ = window; + return true; + } + return false; + } + + private: + XID window_; + + DISALLOW_COPY_AND_ASSIGN(WindowManagerWindowFinder); +}; + +class TopMostWindowFinder : public ui::EnumerateWindowsDelegate { + public: + TopMostWindowFinder() + : top_most_window_(None) {} + + XID top_most_window() const { return top_most_window_; } + + protected: + virtual bool ShouldStopIterating(XID window) OVERRIDE { + if (!ui::IsWindowVisible(window)) + return false; + if (ui::PropertyExists(window, "WM_STATE")) { + top_most_window_ = window; + return true; + } + + WindowManagerWindowFinder child_finder; + EnumerateAllChildWindows(&child_finder, window); + XID child_window = child_finder.window(); + if (child_window == None) + return false; + top_most_window_ = child_window; + return true; + } + + private: + XID top_most_window_; + + DISALLOW_COPY_AND_ASSIGN(TopMostWindowFinder); +}; + +bool IsTopMostWindowFullScreen() { + // Find the topmost window + TopMostWindowFinder finder; + EnumerateAllChildWindows(&finder, ui::GetX11RootWindow()); + XID window = finder.top_most_window(); + if (window == None) + return false; + + // Make sure it is not the desktop window. + int window_desktop; + if (!ui::GetWindowDesktop(window, &window_desktop)) + return false; + + return ui::IsX11WindowFullScreen(window); +} + +} // namespace + +bool IsFullScreenMode() { + return IsTopMostWindowFullScreen(); +} diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index e07f8cd..870f304 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -660,7 +660,8 @@ 'browser/first_run/upgrade_util_win.h', 'browser/flags_storage.h', 'browser/fullscreen.h', - 'browser/fullscreen_aura.cc', + 'browser/fullscreen_aurax11.cc', + 'browser/fullscreen_aurawin.cc', 'browser/fullscreen_chromeos.cc', 'browser/fullscreen_gtk.cc', 'browser/fullscreen_mac.mm', @@ -2918,6 +2919,7 @@ 'browser/first_run/upgrade_util.cc', 'browser/first_run/upgrade_util.h', 'browser/first_run/upgrade_util_linux.cc', + 'browser/fullscreen_aurax11.cc', 'browser/icon_loader_auralinux.cc', 'browser/icon_loader_linux.cc', 'browser/icon_manager_linux.cc', diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h index 92ad3f0..ac71b68 100644 --- a/ui/base/x/x11_util.h +++ b/ui/base/x/x11_util.h @@ -227,7 +227,7 @@ XID GetHighestAncestorWindow(XID window, XID root); static const int kAllDesktops = -1; // Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if // property not found. -bool GetWindowDesktop(XID window, int* desktop); +UI_BASE_EXPORT bool GetWindowDesktop(XID window, int* desktop); // Translates an X11 error code into a printable string. UI_BASE_EXPORT std::string GetX11ErrorString(XDisplay* display, int err); |