blob: 53b87f68693d73fe55c51205ce24b03d5ec64f62 [file] [log] [blame]
[email protected]538f9562012-01-17 17:46:041// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]81585f32011-07-29 19:32:062// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]81585f32011-07-29 19:32:065#include "base/at_exit.h"
6#include "base/command_line.h"
7#include "base/i18n/icu_util.h"
8#include "base/memory/scoped_ptr.h"
[email protected]59e69e742013-06-18 20:27:529#include "base/message_loop/message_loop.h"
[email protected]81585f32011-07-29 19:32:0610#include "third_party/skia/include/core/SkXfermode.h"
[email protected]48dea152012-11-02 20:26:4611#include "ui/aura/client/default_capture_client.h"
[email protected]e3225e02013-10-23 20:44:3712#include "ui/aura/client/window_tree_client.h"
[email protected]e050ef142012-03-21 01:04:2413#include "ui/aura/env.h"
[email protected]980969542013-10-18 22:07:3414#include "ui/aura/test/test_focus_client.h"
[email protected]6bdf7952012-11-14 10:10:5815#include "ui/aura/test/test_screen.h"
[email protected]dbf3d402011-09-14 21:32:1616#include "ui/aura/window.h"
17#include "ui/aura/window_delegate.h"
[email protected]2f2620332014-02-28 10:07:3818#include "ui/aura/window_tree_host.h"
[email protected]912be0e2011-11-09 19:05:2419#include "ui/base/hit_test.h"
[email protected]27a80e752014-03-13 20:36:4120#include "ui/compositor/test/in_process_context_factory.h"
[email protected]86ccbd42013-09-18 18:11:5421#include "ui/events/event.h"
[email protected]94a0d2582012-03-09 00:30:5922#include "ui/gfx/canvas.h"
[email protected]81585f32011-07-29 19:32:0623#include "ui/gfx/rect.h"
[email protected]af7c5d92014-02-03 19:53:1524#include "ui/gl/gl_surface.h"
[email protected]81585f32011-07-29 19:32:0625
[email protected]4a6bef32011-09-07 02:06:0126#if defined(USE_X11)
[email protected]82f884d6ffb2014-04-15 03:34:5427#include "ui/gfx/x/x11_connection.h"
[email protected]4a6bef32011-09-07 02:06:0128#endif
29
[email protected]804f4792014-04-22 22:54:3730#if defined(OS_WIN)
31#include "ui/gfx/win/dpi.h"
32#endif
33
[email protected]81585f32011-07-29 19:32:0634namespace {
35
[email protected]8d8c7732011-08-25 22:35:1336// Trivial WindowDelegate implementation that draws a colored background.
[email protected]81585f32011-07-29 19:32:0637class DemoWindowDelegate : public aura::WindowDelegate {
38 public:
[email protected]8d8c7732011-08-25 22:35:1339 explicit DemoWindowDelegate(SkColor color) : color_(color) {}
[email protected]81585f32011-07-29 19:32:0640
[email protected]8dd791d2011-09-16 16:37:3041 // Overridden from WindowDelegate:
dcheng5bdeb6b2014-10-27 20:58:0542 gfx::Size GetMinimumSize() const override { return gfx::Size(); }
[email protected]fa574b62012-11-26 04:11:3843
dcheng5bdeb6b2014-10-27 20:58:0544 gfx::Size GetMaximumSize() const override { return gfx::Size(); }
[email protected]fa574b62012-11-26 04:11:3845
dcheng5bdeb6b2014-10-27 20:58:0546 void OnBoundsChanged(const gfx::Rect& old_bounds,
47 const gfx::Rect& new_bounds) override {}
48 gfx::NativeCursor GetCursor(const gfx::Point& point) override {
[email protected]62c9f102014-03-27 06:07:0449 return gfx::kNullCursor;
50 }
dcheng5bdeb6b2014-10-27 20:58:0551 int GetNonClientComponent(const gfx::Point& point) const override {
[email protected]eaf6dd52011-09-02 00:39:2652 return HTCAPTION;
53 }
dcheng5bdeb6b2014-10-27 20:58:0554 bool ShouldDescendIntoChildForEventHandling(
[email protected]334b81892012-06-16 16:38:1455 aura::Window* child,
mostynb3b3d52b2014-10-09 10:54:2756 const gfx::Point& location) override {
[email protected]334b81892012-06-16 16:38:1457 return true;
58 }
dcheng5bdeb6b2014-10-27 20:58:0559 bool CanFocus() override { return true; }
60 void OnCaptureLost() override {}
61 void OnPaint(gfx::Canvas* canvas) override {
[email protected]6fae7972012-04-10 20:12:0862 canvas->DrawColor(color_, SkXfermode::kSrc_Mode);
[email protected]8d8c7732011-08-25 22:35:1363 }
dcheng5bdeb6b2014-10-27 20:58:0564 void OnDeviceScaleFactorChanged(float device_scale_factor) override {}
65 void OnWindowDestroying(aura::Window* window) override {}
66 void OnWindowDestroyed(aura::Window* window) override {}
67 void OnWindowTargetVisibilityChanged(bool visible) override {}
68 bool HasHitTestMask() const override { return false; }
69 void GetHitTestMask(gfx::Path* mask) const override {}
[email protected]970aa362011-08-30 20:03:3470
[email protected]81585f32011-07-29 19:32:0671 private:
[email protected]b1b155512011-08-18 22:47:5072 SkColor color_;
73
[email protected]81585f32011-07-29 19:32:0674 DISALLOW_COPY_AND_ASSIGN(DemoWindowDelegate);
75};
76
[email protected]e3225e02013-10-23 20:44:3777class DemoWindowTreeClient : public aura::client::WindowTreeClient {
[email protected]b370f4f2012-03-12 20:16:2378 public:
[email protected]e3225e02013-10-23 20:44:3779 explicit DemoWindowTreeClient(aura::Window* window) : window_(window) {
80 aura::client::SetWindowTreeClient(window_, this);
[email protected]b370f4f2012-03-12 20:16:2381 }
82
dcheng5bdeb6b2014-10-27 20:58:0583 ~DemoWindowTreeClient() override {
[email protected]e3225e02013-10-23 20:44:3784 aura::client::SetWindowTreeClient(window_, NULL);
[email protected]b370f4f2012-03-12 20:16:2385 }
86
[email protected]e3225e02013-10-23 20:44:3787 // Overridden from aura::client::WindowTreeClient:
dcheng5bdeb6b2014-10-27 20:58:0588 aura::Window* GetDefaultParent(aura::Window* context,
89 aura::Window* window,
90 const gfx::Rect& bounds) override {
[email protected]363e7542013-04-23 22:33:1491 if (!capture_client_) {
[email protected]be2a0ac2012-07-24 11:23:2292 capture_client_.reset(
[email protected]e3225e02013-10-23 20:44:3793 new aura::client::DefaultCaptureClient(window_->GetRootWindow()));
[email protected]be2a0ac2012-07-24 11:23:2294 }
[email protected]e3225e02013-10-23 20:44:3795 return window_;
[email protected]b370f4f2012-03-12 20:16:2396 }
97
98 private:
[email protected]e3225e02013-10-23 20:44:3799 aura::Window* window_;
[email protected]b370f4f2012-03-12 20:16:23100
[email protected]48dea152012-11-02 20:26:46101 scoped_ptr<aura::client::DefaultCaptureClient> capture_client_;
[email protected]be2a0ac2012-07-24 11:23:22102
[email protected]e3225e02013-10-23 20:44:37103 DISALLOW_COPY_AND_ASSIGN(DemoWindowTreeClient);
[email protected]b370f4f2012-03-12 20:16:23104};
[email protected]81585f32011-07-29 19:32:06105
[email protected]f7a0b4d22012-09-18 16:31:01106int DemoMain() {
[email protected]27a80e752014-03-13 20:36:41107#if defined(USE_X11)
108 // This demo uses InProcessContextFactory which uses X on a separate Gpu
109 // thread.
[email protected]82f884d6ffb2014-04-15 03:34:54110 gfx::InitializeThreadedX11();
[email protected]27a80e752014-03-13 20:36:41111#endif
[email protected]f321f80b2013-09-11 22:59:14112
[email protected]af7c5d92014-02-03 19:53:15113 gfx::GLSurface::InitializeOneOff();
114
[email protected]804f4792014-04-22 22:54:37115#if defined(OS_WIN)
116 gfx::InitDeviceScaleFactor(1.0f);
117#endif
118
[email protected]f321f80b2013-09-11 22:59:14119 // The ContextFactory must exist before any Compositors are created.
[email protected]27a80e752014-03-13 20:36:41120 scoped_ptr<ui::InProcessContextFactory> context_factory(
121 new ui::InProcessContextFactory());
[email protected]27a80e752014-03-13 20:36:41122
123 // Create the message-loop here before creating the root window.
124 base::MessageLoopForUI message_loop;
[email protected]f321f80b2013-09-11 22:59:14125
[email protected]5b883abb2014-05-05 06:44:10126 aura::Env::CreateInstance(true);
[email protected]fa69f2b62014-05-22 21:47:58127 aura::Env::GetInstance()->set_context_factory(context_factory.get());
[email protected]ad3a62c2014-06-20 13:18:34128 scoped_ptr<aura::TestScreen> test_screen(
129 aura::TestScreen::Create(gfx::Size()));
[email protected]2ad669a2013-02-15 04:36:56130 gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, test_screen.get());
[email protected]2f2620332014-02-28 10:07:38131 scoped_ptr<aura::WindowTreeHost> host(
132 test_screen->CreateHostForPrimaryDisplay());
133 scoped_ptr<DemoWindowTreeClient> window_tree_client(
134 new DemoWindowTreeClient(host->window()));
[email protected]980969542013-10-18 22:07:34135 aura::test::TestFocusClient focus_client;
[email protected]2f2620332014-02-28 10:07:38136 aura::client::SetFocusClient(host->window(), &focus_client);
[email protected]81585f32011-07-29 19:32:06137
[email protected]b1b155512011-08-18 22:47:50138 // Create a hierarchy of test windows.
[email protected]8d8c7732011-08-25 22:35:13139 DemoWindowDelegate window_delegate1(SK_ColorBLUE);
140 aura::Window window1(&window_delegate1);
[email protected]b1b155512011-08-18 22:47:50141 window1.set_id(1);
[email protected]52b02a72014-01-08 21:41:50142 window1.Init(aura::WINDOW_LAYER_TEXTURED);
[email protected]7fca53d42011-09-29 15:38:12143 window1.SetBounds(gfx::Rect(100, 100, 400, 400));
[email protected]a3929aba2011-09-30 18:30:17144 window1.Show();
[email protected]2f2620332014-02-28 10:07:38145 aura::client::ParentWindowWithContext(&window1, host->window(), gfx::Rect());
[email protected]b1b155512011-08-18 22:47:50146
[email protected]8d8c7732011-08-25 22:35:13147 DemoWindowDelegate window_delegate2(SK_ColorRED);
148 aura::Window window2(&window_delegate2);
[email protected]b1b155512011-08-18 22:47:50149 window2.set_id(2);
[email protected]52b02a72014-01-08 21:41:50150 window2.Init(aura::WINDOW_LAYER_TEXTURED);
[email protected]7fca53d42011-09-29 15:38:12151 window2.SetBounds(gfx::Rect(200, 200, 350, 350));
[email protected]a3929aba2011-09-30 18:30:17152 window2.Show();
[email protected]2f2620332014-02-28 10:07:38153 aura::client::ParentWindowWithContext(&window2, host->window(), gfx::Rect());
[email protected]b1b155512011-08-18 22:47:50154
[email protected]8d8c7732011-08-25 22:35:13155 DemoWindowDelegate window_delegate3(SK_ColorGREEN);
156 aura::Window window3(&window_delegate3);
[email protected]b1b155512011-08-18 22:47:50157 window3.set_id(3);
[email protected]52b02a72014-01-08 21:41:50158 window3.Init(aura::WINDOW_LAYER_TEXTURED);
[email protected]7fca53d42011-09-29 15:38:12159 window3.SetBounds(gfx::Rect(10, 10, 50, 50));
[email protected]a3929aba2011-09-30 18:30:17160 window3.Show();
[email protected]5ebe6102012-11-28 21:00:03161 window2.AddChild(&window3);
[email protected]b1b155512011-08-18 22:47:50162
[email protected]2f2620332014-02-28 10:07:38163 host->Show();
[email protected]7060d6592013-04-29 19:01:48164 base::MessageLoopForUI::current()->Run();
[email protected]9783633c2011-10-27 15:41:52165
[email protected]81585f32011-07-29 19:32:06166 return 0;
167}
[email protected]f7a0b4d22012-09-18 16:31:01168
[email protected]f7a0b4d22012-09-18 16:31:01169} // namespace
170
171int main(int argc, char** argv) {
172 CommandLine::Init(argc, argv);
173
174 // The exit manager is in charge of calling the dtors of singleton objects.
175 base::AtExitManager exit_manager;
176
[email protected]d7477f02013-08-23 00:39:09177 base::i18n::InitializeICU();
[email protected]f7a0b4d22012-09-18 16:31:01178
[email protected]56deede2012-10-01 21:25:12179 return DemoMain();
[email protected]f7a0b4d22012-09-18 16:31:01180}