Home | History | Annotate | Download | only in test
      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 
     20 namespace ui {
     21 
     22 class 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 
     46 TestCompositorHostX11::TestCompositorHostX11(
     47     const gfx::Rect& bounds,
     48     ui::ContextFactory* context_factory)
     49     : bounds_(bounds),
     50       context_factory_(context_factory) {
     51 }
     52 
     53 TestCompositorHostX11::~TestCompositorHostX11() {
     54 }
     55 
     56 void 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_, context_factory_));
     79   compositor_->SetScaleAndSize(1.0f, bounds_.size());
     80 }
     81 
     82 ui::Compositor* TestCompositorHostX11::GetCompositor() {
     83   return compositor_.get();
     84 }
     85 
     86 void TestCompositorHostX11::Draw() {
     87   if (compositor_.get())
     88     compositor_->Draw();
     89 }
     90 
     91 // static
     92 TestCompositorHost* TestCompositorHost::Create(
     93     const gfx::Rect& bounds,
     94     ui::ContextFactory* context_factory) {
     95   return new TestCompositorHostX11(bounds, context_factory);
     96 }
     97 
     98 }  // namespace ui
     99