/* * SPDX-License-Identifier: MIT * QEMU vt100 */ #ifndef VT100_H #define VT100_H #include "chardev/char.h" #include "ui/console.h" #include "qemu/fifo8.h" #include "qemu/queue.h" typedef struct TextAttributes { uint8_t fgcol:4; uint8_t bgcol:4; uint8_t bold:1; uint8_t uline:1; uint8_t blink:1; uint8_t invers:1; uint8_t unvisible:1; } TextAttributes; #define TEXT_ATTRIBUTES_DEFAULT ((TextAttributes) { \ .fgcol = QEMU_COLOR_WHITE, \ .bgcol = QEMU_COLOR_BLACK \ }) typedef struct TextCell { uint8_t ch; TextAttributes t_attrib; } TextCell; #define MAX_ESC_PARAMS 3 enum TTYState { TTY_STATE_NORM, TTY_STATE_ESC, TTY_STATE_CSI, TTY_STATE_G0, TTY_STATE_G1, TTY_STATE_OSC, }; typedef struct QemuVT100 QemuVT100; struct QemuVT100 { pixman_image_t *image; void (*image_update)(QemuVT100 *vt, int x, int y, int width, int height); ChardevVCEncoding encoding; int width; int height; int total_height; int backscroll_height; int x, y; int y_displayed; int y_base; TextCell *cells; int text_x[2], text_y[2], cursor_invalidate; int echo; int update_x0; int update_y0; int update_x1; int update_y1; enum TTYState state; int esc_params[MAX_ESC_PARAMS]; int nb_esc_params; uint32_t utf8_state; /* UTF-8 DFA decoder state */ uint32_t utf8_codepoint; /* accumulated UTF-8 code point */ TextAttributes t_attrib; /* currently active text attributes */ TextAttributes t_attrib_saved; int x_saved, y_saved; /* fifo for key pressed */ Fifo8 out_fifo; void (*out_flush)(QemuVT100 *vt); QTAILQ_ENTRY(QemuVT100) list; }; void vt100_init(QemuVT100 *vt, pixman_image_t *image, ChardevVCEncoding encoding, void (*image_update)(QemuVT100 *vt, int x, int y, int width, int height), void (*out_flush)(QemuVT100 *vt)); void vt100_fini(QemuVT100 *vt); void vt100_update_cursor(void); size_t vt100_input(QemuVT100 *vt, const uint8_t *buf, size_t len); void vt100_keysym(QemuVT100 *vt, int keysym); void vt100_set_image(QemuVT100 *vt, pixman_image_t *image); void vt100_refresh(QemuVT100 *vt); #endif