1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/compositor/test/test_compositor_host.h" 6 7 #include <X11/Xlib.h> 8 9 #include "base/basictypes.h" 10 #include "base/bind.h" 11 #include "base/compiler_specific.h" 12 #include "base/logging.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/message_loop/message_loop.h" 16 #include "ui/compositor/compositor.h" 17 #include "ui/gfx/rect.h" 18 #include "ui/gfx/x/x11_types.h" 19 20 namespace ui { 21 22 class TestCompositorHostX11 : public TestCompositorHost { 23 public: 24 TestCompositorHostX11(const gfx::Rect& bounds, 25 ui::ContextFactory* context_factory); 26 virtual ~TestCompositorHostX11(); 27 28 private: 29 // Overridden from TestCompositorHost: 30 virtual void Show() OVERRIDE; 31 virtual ui::Compositor* GetCompositor() OVERRIDE; 32 33 void Draw(); 34 35 gfx::Rect bounds_; 36 37 ui::ContextFactory* context_factory_; 38 39 scoped_ptr<ui::Compositor> compositor_; 40 41 XID window_; 42 43 DISALLOW_COPY_AND_ASSIGN(TestCompositorHostX11); 44 }; 45 46 TestCompositorHostX11::TestCompositorHostX11( 47 const gfx::Rect& bounds, 48 ui::ContextFactory* context_factory) 49 : bounds_(bounds), 50 context_factory_(context_factory) { 51 } 52 53 TestCompositorHostX11::~TestCompositorHostX11() { 54 } 55 56 void TestCompositorHostX11::Show() { 57 XDisplay* display = gfx::GetXDisplay(); 58 XSetWindowAttributes swa; 59 swa.event_mask = StructureNotifyMask | ExposureMask; 60 swa.override_redirect = True; 61 window_ = XCreateWindow( 62 display, 63 RootWindow(display, DefaultScreen(display)), // parent 64 bounds_.x(), bounds_.y(), bounds_.width(), bounds_.height(), 65 0, // border width 66 CopyFromParent, // depth 67 InputOutput, 68 CopyFromParent, // visual 69 CWEventMask | CWOverrideRedirect, &swa); 70 XMapWindow(display, window_); 71 72 while (1) { 73 XEvent event; 74 XNextEvent(display, &event); 75 if (event.type == MapNotify && event.xmap.window == window_) 76 break; 77 } 78 compositor_.reset(new ui::Compositor(window_, context_factory_)); 79 compositor_->SetScaleAndSize(1.0f, bounds_.size()); 80 } 81 82 ui::Compositor* TestCompositorHostX11::GetCompositor() { 83 return compositor_.get(); 84 } 85 86 void TestCompositorHostX11::Draw() { 87 if (compositor_.get()) 88 compositor_->Draw(); 89 } 90 91 // static 92 TestCompositorHost* TestCompositorHost::Create( 93 const gfx::Rect& bounds, 94 ui::ContextFactory* context_factory) { 95 return new TestCompositorHostX11(bounds, context_factory); 96 } 97 98 } // namespace ui 99