vterm_internal.h revision 5b78a3aa7741c3f44b676ccffa765cecee1cbd4c
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
305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermState
315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{
325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTerm *vt;
335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  const VTermStateCallbacks *callbacks;
355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *cbdata;
365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int rows;
385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int cols;
395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Current cursor position */
415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermPos pos;
425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */
445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_top;
465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_bottom; /* -1 means unbounded */
475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows)
485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_left;
495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_LEFT(state)  ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0)
505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int scrollregion_right; /* -1 means unbounded */
515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols)
525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Bitvector of tab stops */
545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  unsigned char *tabstops;
555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Mouse state */
575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_col, mouse_row;
585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_buttons;
595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int mouse_flags;
605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol;
615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Last glyph output, for Unicode recombining purposes */
635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  uint32_t *combine_chars;
645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t combine_chars_size; // Number of ELEMENTS in the above
655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int combine_width; // The width of the glyph above
665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermPos combine_pos;   // Position before movement
675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int keypad:1;
705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor:1;
715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int autowrap:1;
725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int insert:1;
735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int newline:1;
745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor_visible:1;
755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int cursor_blink:1;
765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    unsigned int cursor_shape:2;
775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int alt_screen:1;
785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int origin:1;
795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int screen:1;
805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int leftrightmargin:1;
815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } mode;
825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermEncodingInstance encoding[4], encoding_utf8;
845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int gl_set, gr_set, gsingle_set;
855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct VTermPen pen;
875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor default_fg;
895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermColor default_bg;
905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int fg_ansi;
915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int bold_is_highbright;
925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int protected_cell;
945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* Saved state under DEC mode 1048/1049 */
965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    VTermPos pos;
985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    struct VTermPen pen;
995b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    struct {
1015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      int cursor_visible:1;
1025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      int cursor_blink:1;
1035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey      unsigned int cursor_shape:2;
1045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    } mode;
1055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } saved;
1065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTerm
1095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{
1105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermAllocatorFunctions *allocator;
1115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *allocdata;
1125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int rows;
1145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  int cols;
1155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  struct {
1175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int utf8:1;
1185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    int ctrl8bit:1;
1195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } mode;
1205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  enum VTermParserState {
1225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    NORMAL,
1235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    CSI,
1245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    OSC,
1255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    DCS,
1265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC,
1275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC_IN_OSC,
1285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey    ESC_IN_DCS,
1295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  } parser_state;
1305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  const VTermParserCallbacks *parser_callbacks;
1315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void *cbdata;
1325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  /* len == malloc()ed size; cur == number of valid bytes */
1345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  char  *strbuffer;
1355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t strbuffer_len;
1365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t strbuffer_cur;
1375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  char  *outbuffer;
1395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t outbuffer_len;
1405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  size_t outbuffer_cur;
1415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermState *state;
1435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  VTermScreen *screen;
1445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermEncoding {
1475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void (*init) (VTermEncoding *enc, void *data);
1485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  void (*decode)(VTermEncoding *enc, void *data,
1495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey                 uint32_t cp[], int *cpi, int cplen,
1505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey                 const char bytes[], size_t *pos, size_t len);
1515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef enum {
1545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  ENC_UTF8,
1555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  ENC_SINGLE_94
1565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingType;
1575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid *vterm_allocator_malloc(VTerm *vt, size_t size);
1595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid  vterm_allocator_free(VTerm *vt, void *ptr);
1605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len);
1625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args);
1635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf(VTerm *vt, const char *format, ...);
1645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...);
1655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_free(VTermState *state);
1675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_resetpen(VTermState *state);
1695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_setpen(VTermState *state, const long args[], int argcount);
1705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_savepen(VTermState *state, int save);
1715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyenum {
1735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_SS3 = 0x8f,
1745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_DCS = 0x90,
1755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_CSI = 0x9b,
1765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey  C1_ST  = 0x9c,
1775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey};
1785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...);
1805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_screen_free(VTermScreen *screen);
1825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff SharkeyVTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation);
1845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_width(int codepoint);
1865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_is_combining(int codepoint);
1875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey
1885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif
189