| 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 08d8195b42dd66601351d02d138e081137e8220d..2aff80b6c7ce1259f48f32ef94b12121f0256ac5 100644
|
| --- a/webrtc/modules/desktop_capture/screen_drawer_linux.cc
|
| +++ b/webrtc/modules/desktop_capture/screen_drawer_linux.cc
|
| @@ -13,7 +13,6 @@
|
| #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 {
|
|
|
| @@ -27,12 +26,12 @@
|
|
|
| // ScreenDrawer interface.
|
| DesktopRect DrawableRegion() override;
|
| - void DrawRectangle(DesktopRect rect, RgbaColor color) override;
|
| + void DrawRectangle(DesktopRect rect, uint32_t rgba) override;
|
| void Clear() override;
|
| - void WaitForPendingDraws() override;
|
|
|
| private:
|
| rtc::scoped_refptr<SharedXDisplay> display_;
|
| + Screen* screen_;
|
| int screen_num_;
|
| DesktopRect rect_;
|
| Window window_;
|
| @@ -43,18 +42,15 @@
|
| ScreenDrawerLinux::ScreenDrawerLinux() {
|
| display_ = SharedXDisplay::CreateDefault();
|
| RTC_CHECK(display_.get());
|
| + screen_ = DefaultScreenOfDisplay(display_->display());
|
| + RTC_CHECK(screen_);
|
| screen_num_ = DefaultScreen(display_->display());
|
| - 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_));
|
| + 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_));
|
| XSelectInput(display_->display(), window_, StructureNotifyMask);
|
| XMapWindow(display_->display(), window_);
|
| while (true) {
|
| @@ -65,23 +61,8 @@
|
| }
|
| }
|
| 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.";
|
| - }
|
| - // Some window manager does not allow a window to cover two or more monitors.
|
| - // So if the window is on the first monitor of a two-monitor system, the
|
| - // second half won't be able to show up without changing configurations of WM,
|
| - // and its DrawableRegion() is not accurate.
|
| - rect_ = DesktopRect::MakeLTRB(x, y, root_attributes.width,
|
| - root_attributes.height);
|
| context_ = DefaultGC(display_->display(), screen_num_);
|
| colormap_ = DefaultColormap(display_->display(), screen_num_);
|
| - // Wait for window animations.
|
| - SleepMs(200);
|
| }
|
|
|
| ScreenDrawerLinux::~ScreenDrawerLinux() {
|
| @@ -93,42 +74,33 @@
|
| return rect_;
|
| }
|
|
|
| -void ScreenDrawerLinux::DrawRectangle(DesktopRect rect, RgbaColor color) {
|
| - rect.Translate(-rect_.left(), -rect_.top());
|
| - XColor xcolor;
|
| +void ScreenDrawerLinux::DrawRectangle(DesktopRect rect, uint32_t rgba) {
|
| + int r = (rgba & 0xff00) >> 8;
|
| + int g = (rgba & 0xff0000) >> 16;
|
| + int b = (rgba & 0xff000000) >> 24;
|
| // X11 does not support Alpha.
|
| - // X11 uses 16 bits for each primary color, so we need to slightly normalize
|
| - // a 8 bits channel to 16 bits channel, by setting the low 8 bits as its high
|
| - // 8 bits to avoid a mismatch of color returned by capturer.
|
| - xcolor.red = (color.red << 8) + color.red;
|
| - xcolor.green = (color.green << 8) + color.green;
|
| - xcolor.blue = (color.blue << 8) + color.blue;
|
| - xcolor.flags = DoRed | DoGreen | DoBlue;
|
| - XAllocColor(display_->display(), colormap_, &xcolor);
|
| - XSetForeground(display_->display(), context_, xcolor.pixel);
|
| + 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);
|
| XFillRectangle(display_->display(), window_, context_, rect.left(),
|
| rect.top(), rect.width(), rect.height());
|
| XFlush(display_->display());
|
| }
|
|
|
| void ScreenDrawerLinux::Clear() {
|
| - DrawRectangle(rect_, RgbaColor(0, 0, 0));
|
| -}
|
| -
|
| -// TODO(zijiehe): Find the right signal from X11 to indicate the finish of all
|
| -// pending paintings.
|
| -void ScreenDrawerLinux::WaitForPendingDraws() {
|
| - SleepMs(50);
|
| + DrawRectangle(DrawableRegion(), 0);
|
| }
|
|
|
| } // namespace
|
|
|
| // static
|
| std::unique_ptr<ScreenDrawer> ScreenDrawer::Create() {
|
| - if (SharedXDisplay::CreateDefault().get()) {
|
| - return std::unique_ptr<ScreenDrawer>(new ScreenDrawerLinux());
|
| - }
|
| - return nullptr;
|
| + return std::unique_ptr<ScreenDrawer>(new ScreenDrawerLinux());
|
| }
|
|
|
| } // namespace webrtc
|
|
|