blob: d247aa2d2ed25c345ab6c3ce6399233c4fde0d7e [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_UI_DEMO_MUS_DEMO_H_
#define SERVICES_UI_DEMO_MUS_DEMO_H_
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "base/timer/timer.h"
#include "services/service_manager/public/cpp/service.h"
#include "services/ui/public/cpp/window_manager_delegate.h"
#include "services/ui/public/cpp/window_tree_client_delegate.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace ui {
class BitmapUploader;
class GpuService;
namespace demo {
// A simple MUS Demo. It connects to the service:ui, creates a new window and
// draws a spinning square in the center of the window. Provides a simple way
// to demonstrate that the graphic stack works as intended.
class MusDemo : public WindowTreeClientDelegate,
public WindowManagerDelegate {
public:
MusDemo();
~MusDemo() override;
void Start(service_manager::Connector* connector);
private:
// WindowTreeClientDelegate:
void OnEmbed(Window* root) override;
void OnEmbedRootDestroyed(Window* root) override;
void OnLostConnection(WindowTreeClient* client) override;
void OnPointerEventObserved(const PointerEvent& event,
Window* target) override;
// WindowManagerDelegate:
void SetWindowManagerClient(WindowManagerClient* client) override;
bool OnWmSetBounds(Window* window, gfx::Rect* bounds) override;
bool OnWmSetProperty(
Window* window,
const std::string& name,
std::unique_ptr<std::vector<uint8_t>>* new_data) override;
Window* OnWmCreateTopLevelWindow(
std::map<std::string, std::vector<uint8_t>>* properties) override;
void OnWmClientJankinessChanged(const std::set<Window*>& client_windows,
bool janky) override;
void OnWmNewDisplay(Window* window, const display::Display& display) override;
void OnWmDisplayRemoved(ui::Window* window) override;
void OnWmDisplayModified(const display::Display& display) override;
void OnWmPerformMoveLoop(Window* window,
mojom::MoveLoopSource source,
const gfx::Point& cursor_location,
const base::Callback<void(bool)>& on_done) override;
void OnWmCancelMoveLoop(Window* window) override;
// Allocate a bitmap the same size as the window to draw into.
void AllocBitmap();
// Draws one frame, incrementing the rotation angle.
void DrawFrame();
Window* window_ = nullptr;
std::unique_ptr<WindowTreeClient> window_tree_client_;
std::unique_ptr<GpuService> gpu_service_;
// Used to send frames to mus.
std::unique_ptr<BitmapUploader> uploader_;
// Bitmap that is the same size as our client window area.
SkBitmap bitmap_;
// Timer for calling DrawFrame().
base::RepeatingTimer timer_;
// Current rotation angle for drawing.
double angle_ = 0.0;
// Last time a frame was drawn.
base::TimeTicks last_draw_frame_time_;
DISALLOW_COPY_AND_ASSIGN(MusDemo);
};
} // namespace demo
} // namespace ui
#endif // SERVICES_UI_DEMO_MUS_DEMO_H_