16c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org/*
26c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
36c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *
46c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
56c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
66c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
76c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
86c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org */
106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DESKTOP_H_
126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DESKTOP_H_
136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
140a9ed7c31eab2a2c73eb0020c8b278762ad58ea5mcasas@webrtc.org#include <windows.h>
15774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include <string>
166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
17774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h"
186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgnamespace webrtc {
216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgclass Desktop {
236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org public:
246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  ~Desktop();
256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns the name of the desktop represented by the object. Return false if
276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // quering the name failed for any reason.
286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  bool GetName(std::wstring* desktop_name_out) const;
296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns true if |other| has the same name as this desktop. Returns false
316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // in any other case including failing Win32 APIs and uninitialized desktop
326c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // handles.
336c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  bool IsSame(const Desktop& other) const;
346c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
356c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Assigns the desktop to the current thread. Returns false is the operation
366c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // failed for any reason.
376c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  bool SetThreadDesktop() const;
386c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
396c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns the desktop by its name or NULL if an error occurs.
406c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  static Desktop* GetDesktop(const wchar_t* desktop_name);
416c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
426c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns the desktop currently receiving user input or NULL if an error
436c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // occurs.
446c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  static Desktop* GetInputDesktop();
456c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
466c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns the desktop currently assigned to the calling thread or NULL if
476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // an error occurs.
486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  static Desktop* GetThreadDesktop();
496c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
506c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org private:
516c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  Desktop(HDESK desktop, bool own);
526c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
536c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // The desktop handle.
546c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  HDESK desktop_;
556c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
566c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // True if |desktop_| must be closed on teardown.
576c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  bool own_;
586c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
596c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  DISALLOW_COPY_AND_ASSIGN(Desktop);
606c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org};
616c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
626c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}  // namespace webrtc
636c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
646c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DESKTOP_H_
65