Files
qemu/ui/vt100.h
Marc-André Lureau c3cb2067d9 ui/console-vc: move VT100 emulation into separate unit
Move the VT100 terminal emulation code into dedicated ui/vt100.c and
ui/vt100.h files, completing the extraction from console-vc.c started
in the previous patches. This makes the VT100 layer a self-contained
module that can be reused independently of the chardev/console
infrastructure.

The code is moved as-is, with minor coding style fixes (adding missing
braces, fixing whitespace) applied during the move.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
2026-05-09 10:24:48 +04:00

96 lines
2.2 KiB
C

/*
* 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