test_compositor_host_x11.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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:
24  TestCompositorHostX11(const gfx::Rect& bounds);
25  virtual ~TestCompositorHostX11();
26
27 private:
28  // Overridden from TestCompositorHost:
29  virtual void Show() OVERRIDE;
30  virtual ui::Compositor* GetCompositor() OVERRIDE;
31
32  void Draw();
33
34  gfx::Rect bounds_;
35
36  scoped_ptr<ui::Compositor> compositor_;
37
38  XID window_;
39
40  DISALLOW_COPY_AND_ASSIGN(TestCompositorHostX11);
41};
42
43TestCompositorHostX11::TestCompositorHostX11(const gfx::Rect& bounds)
44    : bounds_(bounds) {
45}
46
47TestCompositorHostX11::~TestCompositorHostX11() {
48}
49
50void TestCompositorHostX11::Show() {
51  XDisplay* display = gfx::GetXDisplay();
52  XSetWindowAttributes swa;
53  swa.event_mask = StructureNotifyMask | ExposureMask;
54  swa.override_redirect = True;
55  window_ = XCreateWindow(
56      display,
57      RootWindow(display, DefaultScreen(display)),  // parent
58      bounds_.x(), bounds_.y(), bounds_.width(), bounds_.height(),
59      0,  // border width
60      CopyFromParent,  // depth
61      InputOutput,
62      CopyFromParent,  // visual
63      CWEventMask | CWOverrideRedirect, &swa);
64  XMapWindow(display, window_);
65
66  while (1) {
67    XEvent event;
68    XNextEvent(display, &event);
69    if (event.type == MapNotify && event.xmap.window == window_)
70      break;
71  }
72  compositor_.reset(new ui::Compositor(window_));
73  compositor_->SetScaleAndSize(1.0f, bounds_.size());
74}
75
76ui::Compositor* TestCompositorHostX11::GetCompositor() {
77  return compositor_.get();
78}
79
80void TestCompositorHostX11::Draw() {
81  if (compositor_.get())
82    compositor_->Draw();
83}
84
85// static
86TestCompositorHost* TestCompositorHost::Create(const gfx::Rect& bounds) {
87  return new TestCompositorHostX11(bounds);
88}
89
90}  // namespace ui
91