test_compositor_host_x11.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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/thread_task_runner_handle.h" 16#include "ui/compositor/compositor.h" 17#include "ui/gfx/rect.h" 18#include "ui/gfx/x/x11_types.h" 19 20namespace ui { 21 22class 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 46TestCompositorHostX11::TestCompositorHostX11( 47 const gfx::Rect& bounds, 48 ui::ContextFactory* context_factory) 49 : bounds_(bounds), 50 context_factory_(context_factory) { 51} 52 53TestCompositorHostX11::~TestCompositorHostX11() { 54} 55 56void 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_, 79 context_factory_, 80 base::ThreadTaskRunnerHandle::Get())); 81 compositor_->SetScaleAndSize(1.0f, bounds_.size()); 82} 83 84ui::Compositor* TestCompositorHostX11::GetCompositor() { 85 return compositor_.get(); 86} 87 88void TestCompositorHostX11::Draw() { 89 if (compositor_.get()) 90 compositor_->Draw(); 91} 92 93// static 94TestCompositorHost* TestCompositorHost::Create( 95 const gfx::Rect& bounds, 96 ui::ContextFactory* context_factory) { 97 return new TestCompositorHostX11(bounds, context_factory); 98} 99 100} // namespace ui 101