2024-02-06 12:01:14 +01:00
|
|
|
// SPDX-FileCopyrightText: 2021-2024 Leroy Hopson <godot-xterm@leroy.nix.nz>
|
2022-12-29 10:52:13 +01:00
|
|
|
// SPDX-License-Identifier: MIT
|
2021-07-02 19:04:34 +02:00
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
#pragma once
|
2020-07-11 12:45:21 +02:00
|
|
|
|
2024-02-10 05:15:33 +01:00
|
|
|
#include<map>
|
|
|
|
|
2022-12-29 10:52:13 +01:00
|
|
|
#include <godot_cpp/classes/control.hpp>
|
2024-02-06 12:01:14 +01:00
|
|
|
#include <godot_cpp/classes/image_texture.hpp>
|
|
|
|
#include <godot_cpp/classes/rendering_server.hpp>
|
|
|
|
#include <godot_cpp/classes/shader_material.hpp>
|
2021-06-06 14:58:50 +02:00
|
|
|
#include <libtsm.h>
|
2020-07-11 12:45:21 +02:00
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
namespace godot
|
|
|
|
{
|
|
|
|
|
|
|
|
class Terminal : public Control
|
|
|
|
{
|
|
|
|
GDCLASS(Terminal, Control)
|
|
|
|
|
|
|
|
private:
|
|
|
|
static constexpr const char *COLOR_NAMES[] = {
|
|
|
|
"ansi_0_color", "ansi_1_color", "ansi_2_color", "ansi_3_color", "ansi_4_color", "ansi_5_color", "ansi_6_color", "ansi_7_color",
|
|
|
|
"ansi_8_color", "ansi_9_color", "ansi_10_color", "ansi_11_color", "ansi_12_color", "ansi_13_color", "ansi_14_color", "ansi_15_color",
|
|
|
|
"foreground_color", "background_color",
|
|
|
|
};
|
|
|
|
|
|
|
|
static constexpr const char *FONT_TYPES[] = {
|
|
|
|
"normal_font", "bold_font", "italics_font", "bold_italics_font",
|
|
|
|
};
|
|
|
|
|
2024-02-10 05:15:33 +01:00
|
|
|
enum FontType {
|
|
|
|
NORMAL,
|
|
|
|
BOLD,
|
|
|
|
ITALICS,
|
|
|
|
BOLD_ITALICS,
|
|
|
|
};
|
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
public:
|
2024-02-10 03:53:03 +01:00
|
|
|
enum AttrFlag
|
2024-02-06 12:01:14 +01:00
|
|
|
{
|
|
|
|
INVERSE = 1 << 0,
|
|
|
|
BLINK = 1 << 1,
|
|
|
|
};
|
|
|
|
|
2024-02-07 11:03:11 +01:00
|
|
|
enum InverseMode {
|
|
|
|
INVERSE_MODE_INVERT,
|
|
|
|
INVERSE_MODE_SWAP,
|
|
|
|
};
|
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
Terminal();
|
|
|
|
~Terminal();
|
|
|
|
|
|
|
|
void set_cols(const int p_cols);
|
|
|
|
int get_cols() const;
|
|
|
|
|
|
|
|
void set_rows(const int p_rows);
|
|
|
|
int get_rows() const;
|
|
|
|
|
2024-02-07 11:14:52 +01:00
|
|
|
Vector2 get_cursor_pos() const;
|
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
void set_max_scrollback(const int p_max_scrollback);
|
|
|
|
int get_max_scrollback() const;
|
|
|
|
|
2024-02-07 10:26:45 +01:00
|
|
|
void set_blink_on_time(const float p_blink_on_time);
|
|
|
|
float get_blink_on_time() const;
|
|
|
|
|
|
|
|
void set_blink_off_time(const float p_blink_off_time);
|
|
|
|
float get_blink_off_time() const;
|
|
|
|
|
2024-02-07 11:03:11 +01:00
|
|
|
void set_inverse_mode(const int mode);
|
|
|
|
int get_inverse_mode() const;
|
|
|
|
|
2024-02-10 09:09:31 +01:00
|
|
|
String write(const Variant data);
|
2024-02-06 12:01:14 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
|
|
|
|
|
|
|
private:
|
|
|
|
unsigned int max_scrollback;
|
|
|
|
|
|
|
|
unsigned int cols;
|
|
|
|
unsigned int rows;
|
|
|
|
|
2024-02-07 10:26:45 +01:00
|
|
|
float blink_on_time;
|
|
|
|
float blink_off_time;
|
|
|
|
|
2024-02-07 11:03:11 +01:00
|
|
|
InverseMode inverse_mode;
|
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
RenderingServer *rs;
|
|
|
|
|
|
|
|
tsm_screen *screen;
|
|
|
|
tsm_vte *vte;
|
|
|
|
tsm_age_t framebuffer_age;
|
|
|
|
|
2024-02-10 09:09:31 +01:00
|
|
|
PackedByteArray response;
|
2024-02-06 12:01:14 +01:00
|
|
|
static void _write_cb(struct tsm_vte *vte, const char *u8, size_t len,
|
|
|
|
void *data);
|
2024-02-10 09:09:31 +01:00
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
static int _draw_cb(struct tsm_screen *con, uint64_t id, const uint32_t *ch,
|
|
|
|
size_t len, unsigned int width, unsigned int posx,
|
|
|
|
unsigned int posy, const struct tsm_screen_attr *attr,
|
|
|
|
tsm_age_t age, void *data);
|
|
|
|
|
|
|
|
PackedColorArray palette;
|
2024-02-10 05:15:33 +01:00
|
|
|
std::map<FontType, Ref<Font>> fonts;
|
2024-02-06 12:01:14 +01:00
|
|
|
int32_t font_size;
|
2024-02-10 05:15:33 +01:00
|
|
|
double font_offset;
|
2024-02-06 12:01:14 +01:00
|
|
|
Vector2 size;
|
|
|
|
Vector2 cell_size;
|
|
|
|
|
|
|
|
Ref<Image> attr_image;
|
|
|
|
Ref<ImageTexture> attr_texture;
|
|
|
|
|
|
|
|
// Background.
|
|
|
|
Ref<Image> back_image;
|
|
|
|
Ref<ImageTexture> back_texture;
|
|
|
|
Ref<Shader> back_shader;
|
|
|
|
Ref<ShaderMaterial> back_material;
|
|
|
|
RID back_canvas_item;
|
|
|
|
|
|
|
|
// Foreground.
|
|
|
|
RID char_shader, char_material, char_canvas_item, canvas, viewport,
|
|
|
|
fore_canvas_item;
|
|
|
|
Ref<Shader> fore_shader;
|
|
|
|
Ref<ShaderMaterial> fore_material;
|
|
|
|
|
|
|
|
void _notification(const int what);
|
|
|
|
|
|
|
|
void initialize_rendering();
|
|
|
|
void update_theme();
|
|
|
|
void update_sizes(bool force = false);
|
2024-02-07 09:37:50 +01:00
|
|
|
void update_shader_parameters(Ref<ShaderMaterial> material);
|
2024-02-06 12:01:14 +01:00
|
|
|
void draw_screen();
|
|
|
|
void refresh();
|
|
|
|
void cleanup_rendering();
|
|
|
|
|
|
|
|
bool _set(const StringName &p_name, const Variant &p_value);
|
|
|
|
void _get_property_list(List<PropertyInfo> *p_list) const;
|
|
|
|
bool _is_valid_color_name(const String &p_name);
|
|
|
|
bool _is_valid_font_type(const String &p_name);
|
2023-01-08 10:41:48 +01:00
|
|
|
};
|
|
|
|
|
2024-02-06 12:01:14 +01:00
|
|
|
} // namespace godot
|
2024-02-07 11:03:11 +01:00
|
|
|
|
|
|
|
VARIANT_ENUM_CAST(Terminal::InverseMode);
|