Home | History | Annotate | Download | only in src
      1 #ifndef __VTERM_INTERNAL_H__
      2 #define __VTERM_INTERNAL_H__
      3 
      4 #include "vterm.h"
      5 
      6 #include <stdarg.h>
      7 
      8 #if defined(__GNUC__)
      9 # define INTERNAL __attribute__((visibility("internal")))
     10 #else
     11 # define INTERNAL
     12 #endif
     13 
     14 #ifdef DEBUG
     15 # define DEBUG_LOG(...) fprintf(stderr, __VA_ARGS__)
     16 #else
     17 # define DEBUG_LOG(...)
     18 #endif
     19 
     20 #define ESC_S "\x1b"
     21 
     22 #define INTERMED_MAX 16
     23 
     24 #define CSI_ARGS_MAX 16
     25 #define CSI_LEADER_MAX 16
     26 
     27 typedef struct VTermEncoding VTermEncoding;
     28 
     29 typedef struct {
     30   VTermEncoding *enc;
     31 
     32   // This size should be increased if required by other stateful encodings
     33   char           data[4*sizeof(uint32_t)];
     34 } VTermEncodingInstance;
     35 
     36 struct VTermPen
     37 {
     38   VTermColor fg;
     39   VTermColor bg;
     40   unsigned int bold:1;
     41   unsigned int underline:2;
     42   unsigned int italic:1;
     43   unsigned int blink:1;
     44   unsigned int reverse:1;
     45   unsigned int strike:1;
     46   unsigned int font:4; /* To store 0-9 */
     47 };
     48 
     49 struct VTermState
     50 {
     51   VTerm *vt;
     52 
     53   const VTermStateCallbacks *callbacks;
     54   void *cbdata;
     55 
     56   const VTermParserCallbacks *fallbacks;
     57   void *fbdata;
     58 
     59   int rows;
     60   int cols;
     61 
     62   /* Current cursor position */
     63   VTermPos pos;
     64 
     65   int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */
     66 
     67   int scrollregion_top;
     68   int scrollregion_bottom; /* -1 means unbounded */
     69 #define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows)
     70   int scrollregion_left;
     71 #define SCROLLREGION_LEFT(state)  ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0)
     72   int scrollregion_right; /* -1 means unbounded */
     73 #define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols)
     74 
     75   /* Bitvector of tab stops */
     76   unsigned char *tabstops;
     77 
     78   VTermLineInfo *lineinfo;
     79 #define ROWWIDTH(state,row) ((state)->lineinfo[(row)].doublewidth ? ((state)->cols / 2) : (state)->cols)
     80 #define THISROWWIDTH(state) ROWWIDTH(state, (state)->pos.row)
     81 
     82   /* Mouse state */
     83   int mouse_col, mouse_row;
     84   int mouse_buttons;
     85   int mouse_flags;
     86 #define MOUSE_WANT_CLICK 0x01
     87 #define MOUSE_WANT_DRAG  0x02
     88 #define MOUSE_WANT_MOVE  0x04
     89 
     90   enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol;
     91 
     92   /* Last glyph output, for Unicode recombining purposes */
     93   uint32_t *combine_chars;
     94   size_t combine_chars_size; // Number of ELEMENTS in the above
     95   int combine_width; // The width of the glyph above
     96   VTermPos combine_pos;   // Position before movement
     97 
     98   struct {
     99     unsigned int keypad:1;
    100     unsigned int cursor:1;
    101     unsigned int autowrap:1;
    102     unsigned int insert:1;
    103     unsigned int newline:1;
    104     unsigned int cursor_visible:1;
    105     unsigned int cursor_blink:1;
    106     unsigned int cursor_shape:2;
    107     unsigned int alt_screen:1;
    108     unsigned int origin:1;
    109     unsigned int screen:1;
    110     unsigned int leftrightmargin:1;
    111     unsigned int bracketpaste:1;
    112     unsigned int report_focus:1;
    113   } mode;
    114 
    115   VTermEncodingInstance encoding[4], encoding_utf8;
    116   int gl_set, gr_set, gsingle_set;
    117 
    118   struct VTermPen pen;
    119 
    120   VTermColor default_fg;
    121   VTermColor default_bg;
    122   VTermColor colors[16]; // Store the 8 ANSI and the 8 ANSI high-brights only
    123 
    124   int bold_is_highbright;
    125 
    126   unsigned int protected_cell : 1;
    127 
    128   /* Saved state under DEC mode 1048/1049 */
    129   struct {
    130     VTermPos pos;
    131     struct VTermPen pen;
    132 
    133     struct {
    134       unsigned int cursor_visible:1;
    135       unsigned int cursor_blink:1;
    136       unsigned int cursor_shape:2;
    137     } mode;
    138   } saved;
    139 };
    140 
    141 typedef enum {
    142   VTERM_PARSER_OSC,
    143   VTERM_PARSER_DCS,
    144 
    145   VTERM_N_PARSER_TYPES
    146 } VTermParserStringType;
    147 
    148 struct VTerm
    149 {
    150   VTermAllocatorFunctions *allocator;
    151   void *allocdata;
    152 
    153   int rows;
    154   int cols;
    155 
    156   struct {
    157     unsigned int utf8:1;
    158     unsigned int ctrl8bit:1;
    159   } mode;
    160 
    161   struct {
    162     enum VTermParserState {
    163       NORMAL,
    164       CSI_LEADER,
    165       CSI_ARGS,
    166       CSI_INTERMED,
    167       ESC,
    168       /* below here are the "string states" */
    169       STRING,
    170       ESC_IN_STRING,
    171     } state;
    172 
    173     int intermedlen;
    174     char intermed[INTERMED_MAX];
    175 
    176     int csi_leaderlen;
    177     char csi_leader[CSI_LEADER_MAX];
    178 
    179     int csi_argi;
    180     long csi_args[CSI_ARGS_MAX];
    181 
    182     const VTermParserCallbacks *callbacks;
    183     void *cbdata;
    184 
    185     VTermParserStringType stringtype;
    186     char  *strbuffer;
    187     size_t strbuffer_len;
    188     size_t strbuffer_cur;
    189   } parser;
    190 
    191   /* len == malloc()ed size; cur == number of valid bytes */
    192 
    193   char  *outbuffer;
    194   size_t outbuffer_len;
    195   size_t outbuffer_cur;
    196 
    197   VTermState *state;
    198   VTermScreen *screen;
    199 };
    200 
    201 struct VTermEncoding {
    202   void (*init) (VTermEncoding *enc, void *data);
    203   void (*decode)(VTermEncoding *enc, void *data,
    204                  uint32_t cp[], int *cpi, int cplen,
    205                  const char bytes[], size_t *pos, size_t len);
    206 };
    207 
    208 typedef enum {
    209   ENC_UTF8,
    210   ENC_SINGLE_94
    211 } VTermEncodingType;
    212 
    213 void *vterm_allocator_malloc(VTerm *vt, size_t size);
    214 void  vterm_allocator_free(VTerm *vt, void *ptr);
    215 
    216 void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len);
    217 void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args);
    218 void vterm_push_output_sprintf(VTerm *vt, const char *format, ...);
    219 void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...);
    220 void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...);
    221 
    222 void vterm_state_free(VTermState *state);
    223 
    224 void vterm_state_newpen(VTermState *state);
    225 void vterm_state_resetpen(VTermState *state);
    226 void vterm_state_setpen(VTermState *state, const long args[], int argcount);
    227 int  vterm_state_getpen(VTermState *state, long args[], int argcount);
    228 void vterm_state_savepen(VTermState *state, int save);
    229 
    230 enum {
    231   C1_SS3 = 0x8f,
    232   C1_DCS = 0x90,
    233   C1_CSI = 0x9b,
    234   C1_ST  = 0x9c,
    235 };
    236 
    237 void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...);
    238 
    239 void vterm_screen_free(VTermScreen *screen);
    240 
    241 VTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation);
    242 
    243 int vterm_unicode_width(uint32_t codepoint);
    244 int vterm_unicode_is_combining(uint32_t codepoint);
    245 
    246 #endif
    247