| Index: remoting/host/desktop_shape_tracker_win.cc
|
| diff --git a/remoting/host/desktop_shape_tracker_win.cc b/remoting/host/desktop_shape_tracker_win.cc
|
| deleted file mode 100644
|
| index 547d9e33f4494cb7885aedc6abfc1d063d78e950..0000000000000000000000000000000000000000
|
| --- a/remoting/host/desktop_shape_tracker_win.cc
|
| +++ /dev/null
|
| @@ -1,146 +0,0 @@
|
| -// Copyright 2013 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 "remoting/host/desktop_shape_tracker.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/win/scoped_gdi_object.h"
|
| -#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
|
| -#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
|
| -
|
| -namespace remoting {
|
| -
|
| -namespace {
|
| -
|
| -struct EnumDesktopShapeData {
|
| - EnumDesktopShapeData()
|
| - : window_region(CreateRectRgn(0, 0, 0, 0)),
|
| - desktop_region(CreateRectRgn(0, 0, 0, 0)) {
|
| - }
|
| - base::win::ScopedRegion window_region;
|
| - base::win::ScopedRegion desktop_region;
|
| -};
|
| -
|
| -class DesktopShapeTrackerWin : public DesktopShapeTracker {
|
| - public:
|
| - DesktopShapeTrackerWin();
|
| - ~DesktopShapeTrackerWin() override;
|
| -
|
| - void RefreshDesktopShape() override;
|
| - const webrtc::DesktopRegion& desktop_shape() override;
|
| -
|
| - private:
|
| - // Callback passed to EnumWindows() to enumerate windows.
|
| - static BOOL CALLBACK EnumWindowsCallback(HWND window, LPARAM lparam);
|
| -
|
| - // The most recently calculated desktop region.
|
| - webrtc::DesktopRegion desktop_shape_;
|
| -
|
| - // Stored to compare with newly calculated desktop shapes, to avoid converting
|
| - // to an DesktopRegion unless the shape has actually changed.
|
| - base::win::ScopedRegion old_desktop_region_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DesktopShapeTrackerWin);
|
| -};
|
| -
|
| -DesktopShapeTrackerWin::DesktopShapeTrackerWin()
|
| - : old_desktop_region_(CreateRectRgn(0, 0, 0, 0)) {
|
| -}
|
| -
|
| -DesktopShapeTrackerWin::~DesktopShapeTrackerWin() {
|
| -}
|
| -
|
| -void DesktopShapeTrackerWin::RefreshDesktopShape() {
|
| - // Accumulate a new desktop shape from current window positions.
|
| - scoped_ptr<EnumDesktopShapeData> shape_data(new EnumDesktopShapeData);
|
| - if (!EnumWindows(EnumWindowsCallback, (LPARAM)shape_data.get())) {
|
| - PLOG(ERROR) << "Failed to enumerate windows";
|
| - desktop_shape_.Clear();
|
| - return;
|
| - }
|
| -
|
| - // If the shape has changed, refresh |desktop_shape_|.
|
| - if (!EqualRgn(shape_data->desktop_region.get(), old_desktop_region_.get())) {
|
| - old_desktop_region_ = std::move(shape_data->desktop_region);
|
| -
|
| - // Determine the size of output buffer required to receive the region.
|
| - DWORD bytes_size = GetRegionData(old_desktop_region_.get(), 0, nullptr);
|
| - CHECK(bytes_size != 0);
|
| -
|
| - // Fetch the Windows RECTs that comprise the region.
|
| - std::vector<char> buffer(bytes_size);
|
| - LPRGNDATA region_data = reinterpret_cast<LPRGNDATA>(buffer.data());
|
| - DWORD result =
|
| - GetRegionData(old_desktop_region_.get(), bytes_size, region_data);
|
| - CHECK(result == bytes_size);
|
| - const LPRECT rects = reinterpret_cast<LPRECT>(®ion_data->Buffer[0]);
|
| -
|
| - // Reset |desktop_shape_| and add new rectangles into it.
|
| - desktop_shape_.Clear();
|
| - for (size_t i = 0; i < region_data->rdh.nCount; ++i) {
|
| - desktop_shape_.AddRect(webrtc::DesktopRect::MakeLTRB(
|
| - rects[i].left, rects[i].top, rects[i].right, rects[i].bottom));
|
| - }
|
| - }
|
| -}
|
| -
|
| -const webrtc::DesktopRegion& DesktopShapeTrackerWin::desktop_shape() {
|
| - return desktop_shape_;
|
| -}
|
| -
|
| -// static
|
| -BOOL DesktopShapeTrackerWin::EnumWindowsCallback(HWND window, LPARAM lparam) {
|
| - EnumDesktopShapeData* data = reinterpret_cast<EnumDesktopShapeData*>(lparam);
|
| - HRGN desktop_region = data->desktop_region.get();
|
| - HRGN window_region = data->window_region.get();
|
| -
|
| - // Is the window visible?
|
| - if (!IsWindow(window) || !IsWindowVisible(window) || IsIconic(window))
|
| - return TRUE;
|
| -
|
| - // Find the desktop position of the window (including non-client-area).
|
| - RECT window_rect;
|
| - if (!GetWindowRect(window, &window_rect))
|
| - return TRUE;
|
| -
|
| - // Find the shape of the window, in window coords.
|
| - // GetWindowRgn will overwrite the current contents of |window_region|.
|
| - if (GetWindowRgn(window, window_region) != ERROR) {
|
| - // Translate the window region into desktop coordinates.
|
| - OffsetRgn(window_region, window_rect.left, window_rect.top);
|
| - } else {
|
| - // Window has no shape, or an error occurred, so assume it's rectangular.
|
| - SetRectRgn(window_region, window_rect.left, window_rect.top,
|
| - window_rect.right, window_rect.bottom);
|
| - }
|
| -
|
| - // TODO(wez): If the window is maximized then we should clip it to the
|
| - // display on which it is maximized.
|
| - // if (IsZoomed(window))
|
| - // CombineRgn(window_region, window_region, screen_region, RGN_AND);
|
| -
|
| - // Merge the window region into the accumulated desktop region. Window
|
| - // regions are combined together before converting the result to
|
| - // DesktopRegion. It assumed that this approach is more efficient than
|
| - // converting each window region individually.
|
| - CombineRgn(desktop_region, desktop_region, window_region, RGN_OR);
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// static
|
| -scoped_ptr<DesktopShapeTracker> DesktopShapeTracker::Create(
|
| - webrtc::DesktopCaptureOptions options) {
|
| - return make_scoped_ptr(new DesktopShapeTrackerWin());
|
| -}
|
| -
|
| -} // namespace remoting
|
|
|