1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/test/test_compositor_host.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/thread_task_runner_handle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class TestCompositorHostX11 : public TestCompositorHost {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestCompositorHostX11(const gfx::Rect& bounds,
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        ui::ContextFactory* context_factory);
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~TestCompositorHostX11();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from TestCompositorHost:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Show() OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::Compositor* GetCompositor() OVERRIDE;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Draw();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ui::ContextFactory* context_factory_;
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Compositor> compositor_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XID window_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestCompositorHostX11);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TestCompositorHostX11::TestCompositorHostX11(
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Rect& bounds,
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::ContextFactory* context_factory)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : bounds_(bounds),
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      context_factory_(context_factory) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestCompositorHostX11::~TestCompositorHostX11() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestCompositorHostX11::Show() {
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  XDisplay* display = gfx::GetXDisplay();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XSetWindowAttributes swa;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swa.event_mask = StructureNotifyMask | ExposureMask;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swa.override_redirect = True;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_ = XCreateWindow(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RootWindow(display, DefaultScreen(display)),  // parent
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds_.x(), bounds_.y(), bounds_.width(), bounds_.height(),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // border width
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CopyFromParent,  // depth
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InputOutput,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CopyFromParent,  // visual
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CWEventMask | CWOverrideRedirect, &swa);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XMapWindow(display, window_);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (1) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XEvent event;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNextEvent(display, &event);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event.type == MapNotify && event.xmap.window == window_)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  compositor_.reset(new ui::Compositor(window_,
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       context_factory_,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       base::ThreadTaskRunnerHandle::Get()));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compositor_->SetScaleAndSize(1.0f, bounds_.size());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochui::Compositor* TestCompositorHostX11::GetCompositor() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return compositor_.get();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestCompositorHostX11::Draw() {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (compositor_.get())
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    compositor_->Draw();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TestCompositorHost* TestCompositorHost::Create(
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Rect& bounds,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::ContextFactory* context_factory) {
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new TestCompositorHostX11(bounds, context_factory);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
101