13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_WM_CORE_CAPTURE_CONTROLLER_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_WM_CORE_CAPTURE_CONTROLLER_H_ 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <set> 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/aura/client/capture_client.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/aura/window_observer.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/wm/wm_export.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace wm { 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Internal CaptureClient implementation. See ScopedCaptureClient for details. 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass WM_EXPORT CaptureController : public aura::client::CaptureClient { 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Adds |root| to the list of RootWindows notified when capture changes. 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void Attach(aura::Window* root); 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Removes |root| from the list of RootWindows notified when capture changes. 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void Detach(aura::Window* root); 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns true if this CaptureController is installed on at least one 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // RootWindow. 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_active() const { return !root_windows_.empty(); } 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Overridden from aura::client::CaptureClient: 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetCapture(aura::Window* window) OVERRIDE; 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void ReleaseCapture(aura::Window* window) OVERRIDE; 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual aura::Window* GetCaptureWindow() OVERRIDE; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual aura::Window* GetGlobalCaptureWindow() OVERRIDE; 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) friend class ScopedCaptureClient; 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef std::set<aura::Window*> RootWindows; 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CaptureController(); 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~CaptureController(); 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The current capture window. NULL if there is no capture window. 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) aura::Window* capture_window_; 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Set of RootWindows notified when capture changes. 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RootWindows root_windows_; 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CaptureController); 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ScopedCaptureClient is responsible for creating a CaptureClient for a 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// RootWindow. Specifically it creates a single CaptureController that is shared 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// among all ScopedCaptureClients and adds the RootWindow to it. 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass WM_EXPORT ScopedCaptureClient : public aura::WindowObserver { 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) explicit ScopedCaptureClient(aura::Window* root); 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~ScopedCaptureClient(); 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns true if there is a CaptureController with at least one RootWindow. 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static bool IsActive(); 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) aura::client::CaptureClient* capture_client() { 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return capture_controller_; 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Overridden from aura::WindowObserver: 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Invoked from destructor and OnWindowDestroyed() to cleanup. 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void Shutdown(); 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The single CaptureController instance. 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static CaptureController* capture_controller_; 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // RootWindow this ScopedCaptureClient was create for. 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window_; 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedCaptureClient); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace wm 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // UI_WM_CORE_CAPTURE_CONTROLLER_H_ 87