test_compositor_host_x11.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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
20namespace ui {
21
22class TestCompositorHostX11 : public TestCompositorHost,
23                              public CompositorDelegate {
24 public:
25  TestCompositorHostX11(const gfx::Rect& bounds);
26  virtual ~TestCompositorHostX11();
27
28 private:
29  // Overridden from TestCompositorHost:
30  virtual void Show() OVERRIDE;
31  virtual ui::Compositor* GetCompositor() OVERRIDE;
32
33  // Overridden from CompositorDelegate:
34  virtual void ScheduleDraw() OVERRIDE;
35
36  void Draw();
37
38  gfx::Rect bounds_;
39
40  scoped_ptr<ui::Compositor> compositor_;
41
42  XID window_;
43
44  base::WeakPtrFactory<TestCompositorHostX11> method_factory_;
45
46  DISALLOW_COPY_AND_ASSIGN(TestCompositorHostX11);
47};
48
49TestCompositorHostX11::TestCompositorHostX11(const gfx::Rect& bounds)
50    : bounds_(bounds),
51      method_factory_(this) {
52}
53
54TestCompositorHostX11::~TestCompositorHostX11() {
55}
56
57void TestCompositorHostX11::Show() {
58  XDisplay* display = gfx::GetXDisplay();
59  XSetWindowAttributes swa;
60  swa.event_mask = StructureNotifyMask | ExposureMask;
61  swa.override_redirect = True;
62  window_ = XCreateWindow(
63      display,
64      RootWindow(display, DefaultScreen(display)),  // parent
65      bounds_.x(), bounds_.y(), bounds_.width(), bounds_.height(),
66      0,  // border width
67      CopyFromParent,  // depth
68      InputOutput,
69      CopyFromParent,  // visual
70      CWEventMask | CWOverrideRedirect, &swa);
71  XMapWindow(display, window_);
72
73  while (1) {
74    XEvent event;
75    XNextEvent(display, &event);
76    if (event.type == MapNotify && event.xmap.window == window_)
77      break;
78  }
79  compositor_.reset(new ui::Compositor(this, window_));
80  compositor_->SetScaleAndSize(1.0f, bounds_.size());
81}
82
83ui::Compositor* TestCompositorHostX11::GetCompositor() {
84  return compositor_.get();
85}
86
87void TestCompositorHostX11::ScheduleDraw() {
88  DCHECK(!ui::Compositor::WasInitializedWithThread());
89  if (!method_factory_.HasWeakPtrs()) {
90    base::MessageLoopForUI::current()->PostTask(
91        FROM_HERE,
92        base::Bind(&TestCompositorHostX11::Draw,
93                   method_factory_.GetWeakPtr()));
94  }
95}
96
97void TestCompositorHostX11::Draw() {
98  if (compositor_.get())
99    compositor_->Draw();
100}
101
102// static
103TestCompositorHost* TestCompositorHost::Create(const gfx::Rect& bounds) {
104  return new TestCompositorHostX11(bounds);
105}
106
107}  // namespace ui
108