15b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifndef __VTERM_INTERNAL_H__
25b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define __VTERM_INTERNAL_H__
35b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
45b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include "vterm.h"
55b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
65b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include <stdarg.h>
75b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
85b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef struct VTermEncoding VTermEncoding;
95b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef struct {
115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermEncoding *enc;
125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  // This size should be increased if required by other stateful encodings
145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  char           data[4*sizeof(uint32_t)];
155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingInstance;
165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermPen
185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{
195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor fg;
205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor bg;
215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int bold:1;
225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int underline:2;
235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int italic:1;
245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int blink:1;
255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int reverse:1;
265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int strike:1;
275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned int font:4; /* To store 0-9 */
285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
3073fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeystatic inline int vterm_color_equal(VTermColor a, VTermColor b)
3173fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey{
3273fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey  return a.red == b.red && a.green == b.green && a.blue == b.blue;
3373fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey}
3473fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey
355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermState
365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{
375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTerm *vt;
385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  const VTermStateCallbacks *callbacks;
405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *cbdata;
415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int rows;
435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int cols;
445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Current cursor position */
465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermPos pos;
475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */
495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_top;
515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_bottom; /* -1 means unbounded */
525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows)
535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_left;
545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_LEFT(state)  ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0)
555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_right; /* -1 means unbounded */
565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols)
575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Bitvector of tab stops */
595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned char *tabstops;
605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Mouse state */
625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_col, mouse_row;
635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_buttons;
645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_flags;
655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol;
665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Last glyph output, for Unicode recombining purposes */
685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  uint32_t *combine_chars;
695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t combine_chars_size; // Number of ELEMENTS in the above
705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int combine_width; // The width of the glyph above
715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermPos combine_pos;   // Position before movement
725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int keypad:1;
755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor:1;
765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int autowrap:1;
775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int insert:1;
785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int newline:1;
795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor_visible:1;
805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor_blink:1;
815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    unsigned int cursor_shape:2;
825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int alt_screen:1;
835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int origin:1;
845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int screen:1;
855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int leftrightmargin:1;
865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } mode;
875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermEncodingInstance encoding[4], encoding_utf8;
895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int gl_set, gr_set, gsingle_set;
905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct VTermPen pen;
925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor default_fg;
945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor default_bg;
9573fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey  int fg_index;
9673fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey  int bg_index;
975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int bold_is_highbright;
985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
9973fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey  unsigned int protected_cell : 1;
1005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Saved state under DEC mode 1048/1049 */
1025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
1035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    VTermPos pos;
1045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    struct VTermPen pen;
1055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    struct {
1075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      int cursor_visible:1;
1085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      int cursor_blink:1;
1095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      unsigned int cursor_shape:2;
1105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    } mode;
1115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } saved;
1125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTerm
1155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{
1165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermAllocatorFunctions *allocator;
1175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *allocdata;
1185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int rows;
1205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int cols;
1215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
1235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int utf8:1;
1245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int ctrl8bit:1;
1255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } mode;
1265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  enum VTermParserState {
1285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    NORMAL,
1295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    CSI,
1305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    OSC,
1315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    DCS,
1325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC,
1335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC_IN_OSC,
1345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC_IN_DCS,
1355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } parser_state;
1365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  const VTermParserCallbacks *parser_callbacks;
1375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *cbdata;
1385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* len == malloc()ed size; cur == number of valid bytes */
1405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  char  *strbuffer;
1415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t strbuffer_len;
1425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t strbuffer_cur;
1435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  char  *outbuffer;
1455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t outbuffer_len;
1465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t outbuffer_cur;
1475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermState *state;
1495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermScreen *screen;
1505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermEncoding {
1535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void (*init) (VTermEncoding *enc, void *data);
1545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void (*decode)(VTermEncoding *enc, void *data,
1555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey                 uint32_t cp[], int *cpi, int cplen,
1565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey                 const char bytes[], size_t *pos, size_t len);
1575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef enum {
1605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  ENC_UTF8,
1615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  ENC_SINGLE_94
1625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingType;
1635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid *vterm_allocator_malloc(VTerm *vt, size_t size);
1655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid  vterm_allocator_free(VTerm *vt, void *ptr);
1665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len);
1685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args);
1695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf(VTerm *vt, const char *format, ...);
1705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...);
17173fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeyvoid vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...);
1725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_free(VTermState *state);
1745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_resetpen(VTermState *state);
1765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_setpen(VTermState *state, const long args[], int argcount);
17773fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeyint  vterm_state_getpen(VTermState *state, long args[], int argcount);
1785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_savepen(VTermState *state, int save);
1795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyenum {
1815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_SS3 = 0x8f,
1825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_DCS = 0x90,
1835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_CSI = 0x9b,
1845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_ST  = 0x9c,
1855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...);
1885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_screen_free(VTermScreen *screen);
1905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff SharkeyVTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation);
1925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_width(int codepoint);
1945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_is_combining(int codepoint);
1955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif
197