Enable cropping window capturing for Win7 when Aero is disabled.
BUG=webrtc:496110
R=sergeyu@chromium.org
Review URL: https://codereview.webrtc.org/1199073002 .
Cr-Commit-Position: refs/heads/master@{#9595}
diff --git a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
index deffe66..73a2aa9 100644
--- a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
+++ b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
@@ -119,10 +119,12 @@
// The region from GetWindowRgn in the desktop coordinate if the region is
// rectangular, or the rect from GetWindowRect if the region is not set.
DesktopRect window_region_rect_;
+
+ AeroChecker aero_checker_;
};
bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() {
- if (!rtc::IsWindows8OrLater())
+ if (!rtc::IsWindows8OrLater() && aero_checker_.IsAeroEnabled())
return false;
// Check if the window is a translucent layered window.
diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.cc b/webrtc/modules/desktop_capture/win/window_capture_utils.cc
index bfe7363..83922ea 100644
--- a/webrtc/modules/desktop_capture/win/window_capture_utils.cc
+++ b/webrtc/modules/desktop_capture/win/window_capture_utils.cc
@@ -43,4 +43,27 @@
return true;
}
+AeroChecker::AeroChecker() : dwmapi_library_(nullptr), func_(nullptr) {
+ // Try to load dwmapi.dll dynamically since it is not available on XP.
+ dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
+ if (dwmapi_library_) {
+ func_ = reinterpret_cast<DwmIsCompositionEnabledFunc>(
+ GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
+ }
+}
+
+AeroChecker::~AeroChecker() {
+ if (dwmapi_library_) {
+ FreeLibrary(dwmapi_library_);
+ }
+}
+
+bool AeroChecker::IsAeroEnabled() {
+ BOOL result = FALSE;
+ if (func_) {
+ func_(&result);
+ }
+ return result != FALSE;
+}
+
} // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.h b/webrtc/modules/desktop_capture/win/window_capture_utils.h
index 2a3a470..aa89c12 100644
--- a/webrtc/modules/desktop_capture/win/window_capture_utils.h
+++ b/webrtc/modules/desktop_capture/win/window_capture_utils.h
@@ -22,4 +22,19 @@
DesktopRect* cropped_rect,
DesktopRect* original_rect);
+typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled);
+class AeroChecker {
+ public:
+ AeroChecker();
+ ~AeroChecker();
+
+ bool IsAeroEnabled();
+
+ private:
+ HMODULE dwmapi_library_;
+ DwmIsCompositionEnabledFunc func_;
+
+ DISALLOW_COPY_AND_ASSIGN(AeroChecker);
+};
+
} // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/window_capturer_win.cc b/webrtc/modules/desktop_capture/window_capturer_win.cc
index c7e1fd8..3d96881 100644
--- a/webrtc/modules/desktop_capture/window_capturer_win.cc
+++ b/webrtc/modules/desktop_capture/window_capturer_win.cc
@@ -22,8 +22,6 @@
namespace {
-typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled);
-
BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
WindowCapturer::WindowList* list =
reinterpret_cast<WindowCapturer::WindowList*>(param);
@@ -81,48 +79,25 @@
void Capture(const DesktopRegion& region) override;
private:
- bool IsAeroEnabled();
-
Callback* callback_;
// HWND and HDC for the currently selected window or NULL if window is not
// selected.
HWND window_;
- // dwmapi.dll is used to determine if desktop compositing is enabled.
- HMODULE dwmapi_library_;
- DwmIsCompositionEnabledFunc is_composition_enabled_func_;
-
DesktopSize previous_size_;
+ AeroChecker aero_checker_;
+
DISALLOW_COPY_AND_ASSIGN(WindowCapturerWin);
};
WindowCapturerWin::WindowCapturerWin()
: callback_(NULL),
window_(NULL) {
- // Try to load dwmapi.dll dynamically since it is not available on XP.
- dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
- if (dwmapi_library_) {
- is_composition_enabled_func_ =
- reinterpret_cast<DwmIsCompositionEnabledFunc>(
- GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
- assert(is_composition_enabled_func_);
- } else {
- is_composition_enabled_func_ = NULL;
- }
}
WindowCapturerWin::~WindowCapturerWin() {
- if (dwmapi_library_)
- FreeLibrary(dwmapi_library_);
-}
-
-bool WindowCapturerWin::IsAeroEnabled() {
- BOOL result = FALSE;
- if (is_composition_enabled_func_)
- is_composition_enabled_func_(&result);
- return result != FALSE;
}
bool WindowCapturerWin::GetWindowList(WindowList* windows) {
@@ -228,7 +203,7 @@
// capturing - it somehow affects what we get from BitBlt() on the subsequent
// captures.
- if (!IsAeroEnabled() || !previous_size_.equals(frame->size())) {
+ if (!aero_checker_.IsAeroEnabled() || !previous_size_.equals(frame->size())) {
result = PrintWindow(window_, mem_dc, 0);
}