2019-01-15 04:30:55 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <AK/AKString.h>
|
|
|
|
#include <AK/Types.h>
|
|
|
|
#include <AK/Vector.h>
|
|
|
|
#include <Widgets/GraphicsBitmap.h>
|
2019-01-17 16:19:49 +01:00
|
|
|
#include <Widgets/Rect.h>
|
2019-01-15 04:30:55 +01:00
|
|
|
|
2019-01-17 16:19:49 +01:00
|
|
|
class Font;
|
2019-01-15 04:30:55 +01:00
|
|
|
|
|
|
|
class Terminal {
|
|
|
|
public:
|
|
|
|
Terminal();
|
|
|
|
~Terminal();
|
|
|
|
|
|
|
|
void create_window();
|
|
|
|
void paint();
|
|
|
|
void on_char(byte);
|
|
|
|
|
|
|
|
private:
|
2019-01-17 16:19:49 +01:00
|
|
|
Font& font() { return *m_font; }
|
2019-01-15 04:30:55 +01:00
|
|
|
void scroll_up();
|
|
|
|
void set_cursor(unsigned row, unsigned column);
|
|
|
|
void put_character_at(unsigned row, unsigned column, byte ch);
|
|
|
|
|
|
|
|
void escape$A(const Vector<unsigned>&);
|
|
|
|
void escape$D(const Vector<unsigned>&);
|
|
|
|
void escape$H(const Vector<unsigned>&);
|
|
|
|
void escape$J(const Vector<unsigned>&);
|
|
|
|
void escape$m(const Vector<unsigned>&);
|
|
|
|
void escape$s(const Vector<unsigned>&);
|
|
|
|
void escape$u(const Vector<unsigned>&);
|
|
|
|
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
void set_size(word columns, word rows);
|
|
|
|
word columns() const { return m_columns; }
|
|
|
|
word rows() const { return m_rows; }
|
2019-01-17 16:19:49 +01:00
|
|
|
Rect glyph_rect(word row, word column);
|
2019-01-15 04:30:55 +01:00
|
|
|
|
2019-01-15 07:30:24 +01:00
|
|
|
struct Attribute {
|
|
|
|
Attribute() { reset(); }
|
|
|
|
void reset()
|
|
|
|
{
|
|
|
|
foreground_color = 7;
|
|
|
|
background_color = 0;
|
|
|
|
bold = false;
|
2019-01-15 10:20:20 +01:00
|
|
|
dirty = true;
|
2019-01-15 07:30:24 +01:00
|
|
|
}
|
|
|
|
unsigned foreground_color : 4;
|
|
|
|
unsigned background_color : 4;
|
|
|
|
bool bold : 1;
|
2019-01-15 10:20:20 +01:00
|
|
|
bool dirty : 1;
|
2019-01-15 07:30:24 +01:00
|
|
|
};
|
2019-01-15 04:30:55 +01:00
|
|
|
|
|
|
|
byte* m_buffer { nullptr };
|
2019-01-15 07:30:24 +01:00
|
|
|
Attribute* m_attributes { nullptr };
|
2019-01-15 04:30:55 +01:00
|
|
|
|
|
|
|
word m_columns { 0 };
|
|
|
|
word m_rows { 0 };
|
|
|
|
|
|
|
|
byte m_cursor_row { 0 };
|
|
|
|
byte m_cursor_column { 0 };
|
|
|
|
byte m_saved_cursor_row { 0 };
|
|
|
|
byte m_saved_cursor_column { 0 };
|
2019-01-15 07:30:24 +01:00
|
|
|
|
|
|
|
Attribute m_current_attribute;
|
2019-01-15 04:30:55 +01:00
|
|
|
|
2019-01-17 16:19:49 +01:00
|
|
|
Attribute& attribute_at(word row, word column);
|
|
|
|
|
2019-01-15 04:30:55 +01:00
|
|
|
void execute_escape_sequence(byte final);
|
|
|
|
|
|
|
|
enum EscapeState {
|
|
|
|
Normal,
|
|
|
|
ExpectBracket,
|
|
|
|
ExpectParameter,
|
|
|
|
ExpectIntermediate,
|
|
|
|
ExpectFinal,
|
|
|
|
};
|
|
|
|
EscapeState m_escape_state { Normal };
|
|
|
|
Vector<byte> m_parameters;
|
|
|
|
Vector<byte> m_intermediates;
|
|
|
|
byte* m_horizontal_tabs { nullptr };
|
|
|
|
bool m_belling { false };
|
|
|
|
|
|
|
|
int m_window_id { 0 };
|
|
|
|
RetainPtr<GraphicsBitmap> m_backing;
|
|
|
|
|
|
|
|
int m_pixel_width { 0 };
|
|
|
|
int m_pixel_height { 0 };
|
2019-01-15 10:20:20 +01:00
|
|
|
int m_rows_to_scroll_backing_store { 0 };
|
2019-01-15 07:39:51 +01:00
|
|
|
|
|
|
|
int m_inset { 2 };
|
|
|
|
int m_line_spacing { 4 };
|
2019-01-17 16:19:49 +01:00
|
|
|
int m_line_height { 0 };
|
|
|
|
|
|
|
|
RetainPtr<Font> m_font;
|
2019-01-15 04:30:55 +01:00
|
|
|
};
|