summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc')
-rw-r--r--chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc44
1 files changed, 29 insertions, 15 deletions
diff --git a/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc b/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc
index 95f41db73b2..a0021856203 100644
--- a/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc
+++ b/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_win.cc
@@ -11,9 +11,9 @@
#include "webrtc/modules/desktop_capture/window_capturer.h"
#include <assert.h>
-#include <windows.h>
#include "webrtc/modules/desktop_capture/desktop_frame_win.h"
+#include "webrtc/modules/desktop_capture/win/window_capture_utils.h"
#include "webrtc/system_wrappers/interface/logging.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
@@ -89,6 +89,7 @@ class WindowCapturerWin : public WindowCapturer {
// WindowCapturer interface.
virtual bool GetWindowList(WindowList* windows) OVERRIDE;
virtual bool SelectWindow(WindowId id) OVERRIDE;
+ virtual bool BringSelectedWindowToFront() OVERRIDE;
// DesktopCapturer interface.
virtual void Start(Callback* callback) OVERRIDE;
@@ -157,6 +158,16 @@ bool WindowCapturerWin::SelectWindow(WindowId id) {
return true;
}
+bool WindowCapturerWin::BringSelectedWindowToFront() {
+ if (!window_)
+ return false;
+
+ if (!IsWindow(window_) || !IsWindowVisible(window_) || IsIconic(window_))
+ return false;
+
+ return SetForegroundWindow(window_) != 0;
+}
+
void WindowCapturerWin::Start(Callback* callback) {
assert(!callback_);
assert(callback);
@@ -171,15 +182,16 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) {
return;
}
- // Stop capturing if the window has been minimized or hidden.
- if (IsIconic(window_) || !IsWindowVisible(window_)) {
+ // Stop capturing if the window has been closed or hidden.
+ if (!IsWindow(window_) || !IsWindowVisible(window_)) {
callback_->OnCaptureCompleted(NULL);
return;
}
- RECT rect;
- if (!GetWindowRect(window_, &rect)) {
- LOG(LS_WARNING) << "Failed to get window size: " << GetLastError();
+ DesktopRect original_rect;
+ DesktopRect cropped_rect;
+ if (!GetCroppedWindowRect(window_, &cropped_rect, &original_rect)) {
+ LOG(LS_WARNING) << "Failed to get window info: " << GetLastError();
callback_->OnCaptureCompleted(NULL);
return;
}
@@ -192,8 +204,7 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) {
}
scoped_ptr<DesktopFrameWin> frame(DesktopFrameWin::Create(
- DesktopSize(rect.right - rect.left, rect.bottom - rect.top),
- NULL, window_dc));
+ cropped_rect.size(), NULL, window_dc));
if (!frame.get()) {
ReleaseDC(window_, window_dc);
callback_->OnCaptureCompleted(NULL);
@@ -201,7 +212,7 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) {
}
HDC mem_dc = CreateCompatibleDC(window_dc);
- SelectObject(mem_dc, frame->bitmap());
+ HGDIOBJ previous_object = SelectObject(mem_dc, frame->bitmap());
BOOL result = FALSE;
// When desktop composition (Aero) is enabled each window is rendered to a
@@ -217,21 +228,24 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) {
// When composition is enabled the DC returned by GetWindowDC() doesn't always
// have window frame rendered correctly. Windows renders it only once and then
// caches the result between captures. We hack it around by calling
- // PrintWindow() whenever window size changes - it somehow affects what we
- // get from BitBlt() on the subsequent captures.
+ // PrintWindow() whenever window size changes, including the first time of
+ // capturing - it somehow affects what we get from BitBlt() on the subsequent
+ // captures.
- if (!IsAeroEnabled() ||
- (!previous_size_.is_empty() && !previous_size_.equals(frame->size()))) {
+ if (!IsAeroEnabled() || !previous_size_.equals(frame->size())) {
result = PrintWindow(window_, mem_dc, 0);
}
// Aero is enabled or PrintWindow() failed, use BitBlt.
if (!result) {
result = BitBlt(mem_dc, 0, 0, frame->size().width(), frame->size().height(),
- window_dc, 0, 0, SRCCOPY);
+ window_dc,
+ cropped_rect.left() - original_rect.left(),
+ cropped_rect.top() - original_rect.top(),
+ SRCCOPY);
}
- SelectObject(mem_dc, NULL);
+ SelectObject(mem_dc, previous_object);
DeleteDC(mem_dc);
ReleaseDC(window_, window_dc);