#ifndef TSM_LIBTSM_H
#define TSM_LIBTSM_H
#include <errno.h>
#include <inttypes.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include "shl-array.h"
#include "shl-htable.h"
#define TSM_UCS4_MAX (0x7fffffffUL)
unsigned int tsm_ucs4_get_width(uint32_t ucs4);
typedef uint32_t tsm_symbol_t;
struct tsm_screen;
typedef uint_fast32_t tsm_age_t;
#define TSM_SCREEN_INSERT_MODE 0x01
#define TSM_SCREEN_AUTO_WRAP 0x02
#define TSM_SCREEN_REL_ORIGIN 0x04
#define TSM_SCREEN_INVERSE 0x08
#define TSM_SCREEN_HIDE_CURSOR 0x10
#define TSM_SCREEN_FIXED_POS 0x20
#define TSM_SCREEN_ALTERNATE 0x40
struct tsm_screen_attr {
int8_t fccode;
int8_t bccode;
uint8_t fr;
uint8_t fg;
uint8_t fb;
uint8_t br;
uint8_t bg;
uint8_t bb;
unsigned int flags;
};
#define TSM_ATTR_BOLD (1 << 0)
#define TSM_ATTR_UNDERLINE (1 << 1)
#define TSM_ATTR_INVERSE (1 << 2)
#define TSM_ATTR_PROTECT (1 << 3)
#define TSM_ATTR_BLINK (1 << 4)
typedef int (*tsm_screen_draw_cb) (struct tsm_screen *con,
uint32_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);
int tsm_screen_new(struct tsm_screen *con, unsigned int x, unsigned int y);
void tsm_screen_old(struct tsm_screen *con);
int tsm_screen_resize(struct tsm_screen *con, unsigned int x,
unsigned int y);
int tsm_screen_set_margins(struct tsm_screen *con,
unsigned int top, unsigned int bottom);
void tsm_screen_set_max_sb(struct tsm_screen *con, unsigned int max);
void tsm_screen_clear_sb(struct tsm_screen *con);
void tsm_screen_sb_up(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_down(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_page_up(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_page_down(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_reset(struct tsm_screen *con);
void tsm_screen_reset(struct tsm_screen *con);
void tsm_screen_set_flags(struct tsm_screen *con, unsigned int flags);
void tsm_screen_set_tabstop(struct tsm_screen *con);
void tsm_screen_reset_tabstop(struct tsm_screen *con);
void tsm_screen_reset_all_tabstops(struct tsm_screen *con);
void tsm_screen_write(struct tsm_screen *con, tsm_symbol_t ch,
const struct tsm_screen_attr *attr);
void tsm_screen_newline(struct tsm_screen *con);
void tsm_screen_scroll_up(struct tsm_screen *con, unsigned int num);
void tsm_screen_scroll_down(struct tsm_screen *con, unsigned int num);
void tsm_screen_move_to(struct tsm_screen *con, unsigned int x,
unsigned int y);
void tsm_screen_move_up(struct tsm_screen *con, unsigned int num,
bool scroll);
void tsm_screen_move_down(struct tsm_screen *con, unsigned int num,
bool scroll);
void tsm_screen_move_left(struct tsm_screen *con, unsigned int num);
void tsm_screen_move_right(struct tsm_screen *con, unsigned int num);
void tsm_screen_move_line_end(struct tsm_screen *con);
void tsm_screen_move_line_home(struct tsm_screen *con);
void tsm_screen_tab_right(struct tsm_screen *con, unsigned int num);
void tsm_screen_tab_left(struct tsm_screen *con, unsigned int num);
void tsm_screen_insert_lines(struct tsm_screen *con, unsigned int num);
void tsm_screen_delete_lines(struct tsm_screen *con, unsigned int num);
void tsm_screen_insert_chars(struct tsm_screen *con, unsigned int num);
void tsm_screen_delete_chars(struct tsm_screen *con, unsigned int num);
void tsm_screen_erase_cursor(struct tsm_screen *con);
void tsm_screen_erase_chars(struct tsm_screen *con, unsigned int num);
void screen_erase_region(struct tsm_screen *, unsigned int, unsigned int,
unsigned int, unsigned int, bool);
void tsm_screen_selection_reset(struct tsm_screen *con);
void tsm_screen_selection_start(struct tsm_screen *con,
unsigned int posx,
unsigned int posy);
void tsm_screen_selection_target(struct tsm_screen *con,
unsigned int posx,
unsigned int posy);
int tsm_screen_selection_copy(struct tsm_screen *con, char **out);
tsm_age_t tsm_screen_draw(struct tsm_screen *con, tsm_screen_draw_cb draw_cb,
void *data);
#define SHL_EXPORT __attribute__((visibility("default")))
#define TSM_UCS4_MAXLEN 10
struct tsm_symbol_table;
extern const tsm_symbol_t tsm_symbol_default;
int tsm_symbol_table_new(struct tsm_symbol_table *tbl);
void tsm_symbol_table_old(struct tsm_symbol_table *tbl);
const uint32_t *tsm_symbol_get(struct tsm_symbol_table *tbl,
tsm_symbol_t *sym, size_t *size);
unsigned int tsm_symbol_get_width(struct tsm_symbol_table *tbl,
tsm_symbol_t sym);
struct cell {
tsm_symbol_t ch;
unsigned int width;
struct tsm_screen_attr attr;
tsm_age_t age;
};
struct line {
struct line *next;
struct line *prev;
unsigned int size;
struct cell *cells;
uint64_t sb_id;
tsm_age_t age;
};
#define SELECTION_TOP -1
struct selection_pos {
struct line *line;
unsigned int x;
int y;
};
struct tsm_symbol_table {
uint32_t next_id;
struct shl_array index;
struct shl_htable symbols;
};
struct tsm_screen {
unsigned int opts;
unsigned int flags;
struct tsm_symbol_table sym_table;
struct tsm_screen_attr def_attr;
tsm_age_t age_cnt;
unsigned int age_reset : 1;
unsigned int size_x;
unsigned int size_y;
unsigned int margin_top;
unsigned int margin_bottom;
unsigned int line_num;
struct line **lines;
struct line **main_lines;
struct line **alt_lines;
tsm_age_t age;
unsigned int sb_count;
struct line *sb_first;
struct line *sb_last;
unsigned int sb_max;
struct line *sb_pos;
uint64_t sb_last_id;
unsigned int cursor_x;
unsigned int cursor_y;
bool *tab_ruler;
bool sel_active;
struct selection_pos sel_start;
struct selection_pos sel_end;
};
void screen_cell_init(struct tsm_screen *con, struct cell *cell);
void tsm_screen_set_opts(struct tsm_screen *scr, unsigned int opts);
void tsm_screen_reset_opts(struct tsm_screen *scr, unsigned int opts);
static inline void screen_inc_age(struct tsm_screen *con)
{
if (!++con->age_cnt) {
con->age_reset = 1;
++con->age_cnt;
}
}
#endif