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