| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/client/x11_view.h" | 5 #include "remoting/client/x11_view.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 #include <X11/Xutil.h> | 8 #include <X11/Xutil.h> |
| 9 #include <X11/extensions/Xrender.h> | 9 #include <X11/extensions/Xrender.h> |
| 10 #include <X11/extensions/Xcomposite.h> | 10 #include <X11/extensions/Xcomposite.h> |
| 11 | 11 |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "remoting/client/decoder_verbatim.h" | 13 #include "remoting/client/decoder_verbatim.h" |
| 14 | 14 |
| 15 namespace remoting { | 15 namespace remoting { |
| 16 | 16 |
| 17 X11View::X11View() |
| 18 : display_(NULL), |
| 19 window_(0), |
| 20 width_(0), |
| 21 height_(0), |
| 22 picture_(0) { |
| 23 } |
| 24 |
| 17 X11View::X11View(Display* display, XID window, int width, int height) | 25 X11View::X11View(Display* display, XID window, int width, int height) |
| 18 : display_(display), | 26 : display_(display), |
| 19 window_(window), | 27 window_(window), |
| 20 width_(width), | 28 width_(width), |
| 21 height_(height), | 29 height_(height), |
| 22 picture_(0) { | 30 picture_(0) { |
| 23 media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, width_, height_, | 31 media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, width_, height_, |
| 24 base::TimeDelta(), base::TimeDelta(), &frame_); | 32 base::TimeDelta(), base::TimeDelta(), &frame_); |
| 25 DCHECK(frame_); | 33 DCHECK(frame_); |
| 26 } | 34 } |
| 27 | 35 |
| 28 X11View::~X11View() { | 36 X11View::~X11View() { |
| 37 DCHECK(!display_); |
| 38 DCHECK(!window_); |
| 39 } |
| 40 |
| 41 bool X11View::Initialize() { |
| 42 display_ = XOpenDisplay(NULL); |
| 43 if (!display_) { |
| 44 return false; |
| 45 } |
| 46 |
| 47 // Get properties of the screen. |
| 48 int screen = DefaultScreen(display_); |
| 49 int root_window = RootWindow(display_, screen); |
| 50 |
| 51 // Creates the window. |
| 52 window_ = XCreateSimpleWindow(display_, root_window, 1, 1, 640, 480, 0, |
| 53 BlackPixel(display_, screen), |
| 54 BlackPixel(display_, screen)); |
| 55 DCHECK(window_); |
| 56 XStoreName(display_, window_, "X11 Remoting"); |
| 57 |
| 58 // Specifies what kind of messages we want to receive. |
| 59 XSelectInput(display_, window_, ExposureMask | ButtonPressMask); |
| 60 XMapWindow(display_, window_); |
| 61 return true; |
| 62 } |
| 63 |
| 64 void X11View::TearDown() { |
| 65 if (display_ && window_) { |
| 66 // Shutdown the window system. |
| 67 XDestroyWindow(display_, window_); |
| 68 XCloseDisplay(display_); |
| 69 } |
| 70 display_ = NULL; |
| 71 window_ = 0; |
| 29 } | 72 } |
| 30 | 73 |
| 31 void X11View::Paint() { | 74 void X11View::Paint() { |
| 75 // Don't bother attempting to paint if the display hasn't been set up. |
| 76 if (!display_ || !window_ || !height_ || !width_) { |
| 77 return; |
| 78 } |
| 79 |
| 32 // TODO(hclam): Paint only the updated regions. | 80 // TODO(hclam): Paint only the updated regions. |
| 33 all_update_rects_.clear(); | 81 all_update_rects_.clear(); |
| 34 | 82 |
| 35 // If we have not initialized the render target then do it now. | 83 // If we have not initialized the render target then do it now. |
| 36 if (!picture_) | 84 if (!picture_) |
| 37 InitPaintTarget(); | 85 InitPaintTarget(); |
| 38 | 86 |
| 39 // Upload the image to a pixmap. And then create a picture from the pixmap | 87 // Upload the image to a pixmap. And then create a picture from the pixmap |
| 40 // and composite the picture over the picture representing the window. | 88 // and composite the picture over the picture representing the window. |
| 41 | 89 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 // Composite the picture over the picture representing the window. | 121 // Composite the picture over the picture representing the window. |
| 74 XRenderComposite(display_, PictOpSrc, picture, 0, | 122 XRenderComposite(display_, PictOpSrc, picture, 0, |
| 75 picture_, 0, 0, 0, 0, 0, 0, | 123 picture_, 0, 0, 0, 0, 0, 0, |
| 76 width_, height_); | 124 width_, height_); |
| 77 | 125 |
| 78 XRenderFreePicture(display_, picture); | 126 XRenderFreePicture(display_, picture); |
| 79 XFreePixmap(display_, pixmap); | 127 XFreePixmap(display_, pixmap); |
| 80 } | 128 } |
| 81 | 129 |
| 82 void X11View::SetSolidFill(uint32 color) { | 130 void X11View::SetSolidFill(uint32 color) { |
| 83 // TODO(ajwong): Implement. | 131 // TODO(garykac): Implement. |
| 84 NOTIMPLEMENTED(); | 132 // NOTIMPLEMENTED(); |
| 85 } | 133 } |
| 86 | 134 |
| 87 void X11View::UnsetSolidFill() { | 135 void X11View::UnsetSolidFill() { |
| 88 // TODO(ajwong): Implement. | 136 // TODO(garykac): Implement. |
| 89 NOTIMPLEMENTED(); | 137 // NOTIMPLEMENTED(); |
| 90 } | 138 } |
| 91 | 139 |
| 92 void X11View::SetViewport(int x, int y, int width, int height) { | 140 void X11View::SetViewport(int x, int y, int width, int height) { |
| 93 // TODO(ajwong): Implement. | 141 // TODO(garykac): Implement. |
| 94 NOTIMPLEMENTED(); | 142 // NOTIMPLEMENTED(); |
| 95 } | 143 } |
| 96 | 144 |
| 97 void X11View::SetBackingStoreSize(int width, int height) { | 145 void X11View::SetHostScreenSize(int width, int height) { |
| 98 // TODO(ajwong): Implement. | 146 width_ = width; |
| 99 NOTIMPLEMENTED(); | 147 height_ = height; |
| 148 XResizeWindow(display_, window_, width_, height_); |
| 100 } | 149 } |
| 101 | 150 |
| 102 void X11View::InitPaintTarget() { | 151 void X11View::InitPaintTarget() { |
| 103 // Testing XRender support. | 152 // Testing XRender support. |
| 104 int dummy; | 153 int dummy; |
| 105 bool xrender_support = XRenderQueryExtension(display_, &dummy, &dummy); | 154 bool xrender_support = XRenderQueryExtension(display_, &dummy, &dummy); |
| 106 CHECK(xrender_support) << "XRender is not supported!"; | 155 CHECK(xrender_support) << "XRender is not supported!"; |
| 107 | 156 |
| 108 XWindowAttributes attr; | 157 XWindowAttributes attr; |
| 109 XGetWindowAttributes(display_, window_, &attr); | 158 XGetWindowAttributes(display_, window_, &attr); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 XEvent event; | 211 XEvent event; |
| 163 event.type = Expose; | 212 event.type = Expose; |
| 164 XSendEvent(display_, static_cast<int>(window_), true, ExposureMask, &event); | 213 XSendEvent(display_, static_cast<int>(window_), true, ExposureMask, &event); |
| 165 } | 214 } |
| 166 | 215 |
| 167 void X11View::OnDecodeDone() { | 216 void X11View::OnDecodeDone() { |
| 168 // Since we do synchronous decoding here there's nothing in this method. | 217 // Since we do synchronous decoding here there's nothing in this method. |
| 169 } | 218 } |
| 170 | 219 |
| 171 } // namespace remoting | 220 } // namespace remoting |
| OLD | NEW |