blob: 3595c4e859d24f5c0938d801c0beef5ca3375b15 [file] [log] [blame]
// Copyright 2015 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 APPS_MOTERM_MOTERM_VIEW_H_
#define APPS_MOTERM_MOTERM_VIEW_H_
#include <memory>
#include "apps/moterm/moterm_driver.h"
#include "apps/moterm/moterm_model.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "mojo/common/binding_set.h"
#include "mojo/public/cpp/application/service_provider_impl.h"
#include "mojo/public/cpp/bindings/callback.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/services/input_events/interfaces/input_event_constants.mojom.h"
#include "mojo/services/input_events/interfaces/input_events.mojom.h"
#include "mojo/services/terminal/interfaces/terminal.mojom.h"
#include "mojo/ui/choreographer.h"
#include "mojo/ui/ganesh_view.h"
#include "mojo/ui/input_handler.h"
#include "third_party/skia/include/core/SkBitmapDevice.h"
#include "third_party/skia/include/core/SkTypeface.h"
class MotermView : public mojo::ui::GaneshView,
public mojo::ui::ChoreographerDelegate,
public mojo::ui::InputListener,
public MotermModel::Delegate,
public MotermDriver::Client,
public mojo::terminal::Terminal {
public:
MotermView(
mojo::ApplicationImpl* app_impl,
mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request,
mojo::InterfaceRequest<mojo::ServiceProvider> service_provider_request);
~MotermView() override;
private:
// |mojo::ui::GaneshView|:
void OnPropertiesChanged(uint32_t old_scene_version,
mojo::ui::ViewPropertiesPtr old_properties) override;
// |mojo::ui::ChoreographerDelegate|:
void OnDraw(const mojo::gfx::composition::FrameInfo& frame_info,
const base::TimeDelta& time_delta) override;
// |mojo::ui::InputListener|:
void OnEvent(mojo::EventPtr event, const OnEventCallback& callback) override;
// |MotermModel::Delegate|:
void OnResponse(const void* buf, size_t size) override;
void OnSetKeypadMode(bool application_mode) override;
// |MotermDriver::Client|:
void OnDataReceived(const void* bytes, size_t num_bytes) override;
void OnClosed() override;
void OnDestroyed() override;
// |mojo::terminal::Terminal| implementation:
void Connect(mojo::InterfaceRequest<mojo::files::File> terminal_file,
bool force,
const ConnectCallback& callback) override;
void ConnectToClient(
mojo::InterfaceHandle<mojo::terminal::TerminalClient> terminal_client,
bool force,
const ConnectToClientCallback& callback) override;
void GetSize(const GetSizeCallback& callback) override;
void SetSize(uint32_t rows,
uint32_t columns,
bool reset,
const SetSizeCallback& callback) override;
// If |force| is true, it will draw everything. Otherwise it will draw only if
// |model_state_changes_| is dirty.
void ScheduleDraw(bool force);
void DrawContent(const mojo::skia::GaneshContext::Scope& ganesh_scope,
const mojo::Size& texture_size,
SkCanvas* canvas);
void OnKeyPressed(mojo::EventPtr key_event);
mojo::ui::Choreographer choreographer_;
mojo::ui::InputHandler input_handler_;
// TODO(vtl): Consider the structure of this app. Do we really want the "view"
// owning the model?
// The terminal model.
MotermModel model_;
// State changes to the model since last draw.
MotermModel::StateChanges model_state_changes_;
base::WeakPtr<MotermDriver> driver_;
// If set, called when we get |OnClosed()| or |OnDestroyed()| from the driver.
mojo::Closure on_closed_callback_;
mojo::ServiceProviderImpl service_provider_impl_;
mojo::BindingSet<mojo::terminal::Terminal> terminal_bindings_;
// If we skip drawing despite being forced to, we should force the next draw.
bool force_next_draw_;
skia::RefPtr<SkTypeface> regular_typeface_;
int ascent_;
int line_height_;
int advance_width_;
// Keyboard state.
bool keypad_application_mode_;
DISALLOW_COPY_AND_ASSIGN(MotermView);
};
#endif // APPS_MOTERM_MOTERM_VIEW_H_