Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: webrtc/modules/desktop_capture/screen_drawer_linux.cc

Issue 2268093002: [WebRTC] A real ScreenCapturer test (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Resolve review comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/desktop_capture/screen_drawer_linux.cc
diff --git a/webrtc/modules/desktop_capture/screen_drawer_linux.cc b/webrtc/modules/desktop_capture/screen_drawer_linux.cc
index 2aff80b6c7ce1259f48f32ef94b12121f0256ac5..f73271422e58175cb4d5b32eada6fe32faf5223e 100644
--- a/webrtc/modules/desktop_capture/screen_drawer_linux.cc
+++ b/webrtc/modules/desktop_capture/screen_drawer_linux.cc
@@ -13,6 +13,7 @@
#include "webrtc/base/checks.h"
#include "webrtc/modules/desktop_capture/screen_drawer.h"
#include "webrtc/modules/desktop_capture/x11/shared_x_display.h"
+#include "webrtc/system_wrappers/include/sleep.h"
namespace webrtc {
@@ -26,12 +27,12 @@ class ScreenDrawerLinux : public ScreenDrawer {
// ScreenDrawer interface.
DesktopRect DrawableRegion() override;
- void DrawRectangle(DesktopRect rect, uint32_t rgba) override;
+ void DrawRectangle(DesktopRect rect, Color color) override;
void Clear() override;
+ void WaitForPendingPaintings() override;
private:
rtc::scoped_refptr<SharedXDisplay> display_;
- Screen* screen_;
int screen_num_;
DesktopRect rect_;
Window window_;
@@ -42,15 +43,18 @@ class ScreenDrawerLinux : public ScreenDrawer {
ScreenDrawerLinux::ScreenDrawerLinux() {
display_ = SharedXDisplay::CreateDefault();
RTC_CHECK(display_.get());
- screen_ = DefaultScreenOfDisplay(display_->display());
- RTC_CHECK(screen_);
screen_num_ = DefaultScreen(display_->display());
- rect_ = DesktopRect::MakeWH(screen_->width, screen_->height);
- window_ = XCreateSimpleWindow(display_->display(),
- RootWindow(display_->display(), screen_num_), 0,
- 0, rect_.width(), rect_.height(), 0,
- BlackPixel(display_->display(), screen_num_),
- BlackPixel(display_->display(), screen_num_));
+ XWindowAttributes root_attributes;
+ if (!XGetWindowAttributes(display_->display(),
+ RootWindow(display_->display(), screen_num_),
+ &root_attributes)) {
+ RTC_DCHECK(false) << "Failed to get root window size.";
+ }
+ window_ = XCreateSimpleWindow(
+ display_->display(), RootWindow(display_->display(), screen_num_), 0, 0,
+ root_attributes.width, root_attributes.height, 0,
+ BlackPixel(display_->display(), screen_num_),
+ BlackPixel(display_->display(), screen_num_));
XSelectInput(display_->display(), window_, StructureNotifyMask);
XMapWindow(display_->display(), window_);
while (true) {
@@ -61,6 +65,17 @@ ScreenDrawerLinux::ScreenDrawerLinux() {
}
}
XFlush(display_->display());
+ Window child;
+ int x, y;
+ if (!XTranslateCoordinates(display_->display(), window_,
+ RootWindow(display_->display(), screen_num_), 0, 0,
+ &x, &y, &child)) {
+ RTC_DCHECK(false) << "Failed to get window position.";
+ }
+ // In two monitor system, if this window is on the first monitor, part of the
+ // DrawableRegion() may be covered by another window.
Jamie 2016/08/26 22:29:10 I don't understand this comment. If you're explain
Hzj_jie 2016/08/29 21:57:28 Not really, AFAICT, this comment is for unity only
Jamie 2016/08/31 17:39:39 If I'm understanding the code correctly, I think t
Hzj_jie 2016/08/31 21:22:39 No, the size of window does not need to be adjuste
+ rect_ = DesktopRect::MakeLTRB(x, y, root_attributes.width,
+ root_attributes.height);
Jamie 2016/08/26 22:29:10 I think you need to add x and y to width and heigh
Hzj_jie 2016/08/29 21:57:28 The explanation is same as the one above. i.e. roo
context_ = DefaultGC(display_->display(), screen_num_);
colormap_ = DefaultColormap(display_->display(), screen_num_);
}
@@ -74,33 +89,42 @@ DesktopRect ScreenDrawerLinux::DrawableRegion() {
return rect_;
}
-void ScreenDrawerLinux::DrawRectangle(DesktopRect rect, uint32_t rgba) {
- int r = (rgba & 0xff00) >> 8;
- int g = (rgba & 0xff0000) >> 16;
- int b = (rgba & 0xff000000) >> 24;
+void ScreenDrawerLinux::DrawRectangle(DesktopRect rect, Color color) {
+ XColor xcolor;
// X11 does not support Alpha.
- XColor color;
// X11 uses 16 bits for each primary color.
- color.red = r * 256;
- color.green = g * 256;
- color.blue = b * 256;
- color.flags = DoRed | DoGreen | DoBlue;
- XAllocColor(display_->display(), colormap_, &color);
- XSetForeground(display_->display(), context_, color.pixel);
+ xcolor.red = color.red() * 256 + color.red();
+ xcolor.green = color.green() * 256 + color.green();
+ xcolor.blue = color.blue() * 256 + color.blue();
+ xcolor.flags = DoRed | DoGreen | DoBlue;
+ XAllocColor(display_->display(), colormap_, &xcolor);
+ XSetForeground(display_->display(), context_, xcolor.pixel);
XFillRectangle(display_->display(), window_, context_, rect.left(),
rect.top(), rect.width(), rect.height());
XFlush(display_->display());
}
void ScreenDrawerLinux::Clear() {
- DrawRectangle(DrawableRegion(), 0);
+ DesktopRect rect =
+ DesktopRect::MakeWH(DrawableRegion().width(), DrawableRegion().height());
+ DrawRectangle(rect, Color::FromBGR(0));
Jamie 2016/08/26 22:29:10 I think this method is simpler (doesn't need to be
Hzj_jie 2016/08/29 21:57:28 Done.
+}
+
+// TODO(zijiehe): Find the right signal from X11 to indicate the finish of all
+// pending paintings.
+void ScreenDrawerLinux::WaitForPendingPaintings() {
+ SleepMs(50);
}
} // namespace
// static
std::unique_ptr<ScreenDrawer> ScreenDrawer::Create() {
- return std::unique_ptr<ScreenDrawer>(new ScreenDrawerLinux());
+ if (SharedXDisplay::CreateDefault().get()) {
Jamie 2016/08/26 22:29:10 What is this needed for? Does it belong in this CL
Hzj_jie 2016/08/29 21:57:28 Before this change, this function does not use in
+ return std::unique_ptr<ScreenDrawer>(new ScreenDrawerLinux());
+ } else {
+ return nullptr;
+ }
}
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698