blob: 25f624af94ec85a3f0258e6a7fab15ef3a3f881e [file] [log] [blame]
// Copyright 2016 The Fuchsia 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 TOPAZ_APP_TERM_VIEW_CONTROLLER_H_
#define TOPAZ_APP_TERM_VIEW_CONTROLLER_H_
#include <lib/async/cpp/task.h>
#include "examples/ui/lib/skia_font_loader.h"
#include "examples/ui/lib/skia_view.h"
#include "lib/app/cpp/application_context.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkTypeface.h"
#include "topaz/app/term/pty_server.h"
#include "topaz/app/term/term_model.h"
#include "topaz/app/term/term_params.h"
namespace term {
class ViewController : public mozart::SkiaView, public TermModel::Delegate {
public:
using DisconnectCallback = std::function<void(ViewController*)>;
ViewController(views_v1::ViewManagerPtr view_manager,
fidl::InterfaceRequest<views_v1_token::ViewOwner> view_owner_request,
component::ApplicationContext* context,
const TermParams& term_params,
DisconnectCallback disconnect_handler);
~ViewController() override;
ViewController(const ViewController&) = delete;
ViewController& operator=(const ViewController&) = delete;
private:
// |BaseView|:
void OnPropertiesChanged(views_v1::ViewProperties old_properties) override;
void OnSceneInvalidated(
images::PresentationInfo presentation_info) override;
bool OnInputEvent(input::InputEvent event) override;
// |TermModel::Delegate|:
void OnResponse(const void* buf, size_t size) override;
void OnSetKeypadMode(bool application_mode) override;
void ScheduleDraw(bool force);
void DrawContent(SkCanvas* canvas);
void OnKeyPressed(input::InputEvent key_event);
// stdin/stdout
void OnDataReceived(const void* bytes, size_t num_bytes);
void SendData(const void* bytes, size_t num_bytes);
void ComputeMetrics();
void StartCommand();
void Blink();
void Resize();
void OnCommandTerminated();
DisconnectCallback disconnect_;
TermModel model_;
// State changes to the model since last draw.
TermModel::StateChanges model_state_changes_;
// If we skip drawing despite being forced to, we should force the next draw.
bool force_next_draw_;
component::ApplicationContext* context_;
mozart::SkiaFontLoader font_loader_;
sk_sp<SkTypeface> regular_typeface_;
int ascent_;
int line_height_;
int advance_width_;
// Keyboard state.
bool keypad_application_mode_;
async::TaskClosureMethod<ViewController, &ViewController::Blink>
blink_task_{this};
zx::time last_key_;
bool blink_on_ = true;
bool focused_ = false;
TermParams params_;
PTYServer pty_;
};
} // namespace term
#endif // TOPAZ_APP_TERM_VIEW_CONTROLLER_H_