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 typedef struct VTermEncoding VTermEncoding;
      9 
     10 typedef struct {
     11   VTermEncoding *enc;
     12 
     13   // This size should be increased if required by other stateful encodings
     14   char           data[4*sizeof(uint32_t)];
     15 } VTermEncodingInstance;
     16 
     17 struct VTermPen
     18 {
     19   VTermColor fg;
     20   VTermColor bg;
     21   unsigned int bold:1;
     22   unsigned int underline:2;
     23   unsigned int italic:1;
     24   unsigned int blink:1;
     25   unsigned int reverse:1;
     26   unsigned int strike:1;
     27   unsigned int font:4; /* To store 0-9 */
     28 };
     29 
     30 static inline int vterm_color_equal(VTermColor a, VTermColor b)
     31 {
     32   return a.red == b.red && a.green == b.green && a.blue == b.blue;
     33 }
     34 
     35 struct VTermState
     36 {
     37   VTerm *vt;
     38 
     39   const VTermStateCallbacks *callbacks;
     40   void *cbdata;
     41 
     42   int rows;
     43   int cols;
     44 
     45   /* Current cursor position */
     46   VTermPos pos;
     47 
     48   int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */
     49 
     50   int scrollregion_top;
     51   int scrollregion_bottom; /* -1 means unbounded */
     52 #define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows)
     53   int scrollregion_left;
     54 #define SCROLLREGION_LEFT(state)  ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0)
     55   int scrollregion_right; /* -1 means unbounded */
     56 #define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols)
     57 
     58   /* Bitvector of tab stops */
     59   unsigned char *tabstops;
     60 
     61   /* Mouse state */
     62   int mouse_col, mouse_row;
     63   int mouse_buttons;
     64   int mouse_flags;
     65   enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol;
     66 
     67   /* Last glyph output, for Unicode recombining purposes */
     68   uint32_t *combine_chars;
     69   size_t combine_chars_size; // Number of ELEMENTS in the above
     70   int combine_width; // The width of the glyph above
     71   VTermPos combine_pos;   // Position before movement
     72 
     73   struct {
     74     int keypad:1;
     75     int cursor:1;
     76     int autowrap:1;
     77     int insert:1;
     78     int newline:1;
     79     int cursor_visible:1;
     80     int cursor_blink:1;
     81     unsigned int cursor_shape:2;
     82     int alt_screen:1;
     83     int origin:1;
     84     int screen:1;
     85     int leftrightmargin:1;
     86   } mode;
     87 
     88   VTermEncodingInstance encoding[4], encoding_utf8;
     89   int gl_set, gr_set, gsingle_set;
     90 
     91   struct VTermPen pen;
     92 
     93   VTermColor default_fg;
     94   VTermColor default_bg;
     95   int fg_index;
     96   int bg_index;
     97   int bold_is_highbright;
     98 
     99   unsigned int protected_cell : 1;
    100 
    101   /* Saved state under DEC mode 1048/1049 */
    102   struct {
    103     VTermPos pos;
    104     struct VTermPen pen;
    105 
    106     struct {
    107       int cursor_visible:1;
    108       int cursor_blink:1;
    109       unsigned int cursor_shape:2;
    110     } mode;
    111   } saved;
    112 };
    113 
    114 struct VTerm
    115 {
    116   VTermAllocatorFunctions *allocator;
    117   void *allocdata;
    118 
    119   int rows;
    120   int cols;
    121 
    122   struct {
    123     int utf8:1;
    124     int ctrl8bit:1;
    125   } mode;
    126 
    127   enum VTermParserState {
    128     NORMAL,
    129     CSI,
    130     OSC,
    131     DCS,
    132     ESC,
    133     ESC_IN_OSC,
    134     ESC_IN_DCS,
    135   } parser_state;
    136   const VTermParserCallbacks *parser_callbacks;
    137   void *cbdata;
    138 
    139   /* len == malloc()ed size; cur == number of valid bytes */
    140   char  *strbuffer;
    141   size_t strbuffer_len;
    142   size_t strbuffer_cur;
    143 
    144   char  *outbuffer;
    145   size_t outbuffer_len;
    146   size_t outbuffer_cur;
    147 
    148   VTermState *state;
    149   VTermScreen *screen;
    150 };
    151 
    152 struct VTermEncoding {
    153   void (*init) (VTermEncoding *enc, void *data);
    154   void (*decode)(VTermEncoding *enc, void *data,
    155                  uint32_t cp[], int *cpi, int cplen,
    156                  const char bytes[], size_t *pos, size_t len);
    157 };
    158 
    159 typedef enum {
    160   ENC_UTF8,
    161   ENC_SINGLE_94
    162 } VTermEncodingType;
    163 
    164 void *vterm_allocator_malloc(VTerm *vt, size_t size);
    165 void  vterm_allocator_free(VTerm *vt, void *ptr);
    166 
    167 void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len);
    168 void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args);
    169 void vterm_push_output_sprintf(VTerm *vt, const char *format, ...);
    170 void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...);
    171 void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...);
    172 
    173 void vterm_state_free(VTermState *state);
    174 
    175 void vterm_state_resetpen(VTermState *state);
    176 void vterm_state_setpen(VTermState *state, const long args[], int argcount);
    177 int  vterm_state_getpen(VTermState *state, long args[], int argcount);
    178 void vterm_state_savepen(VTermState *state, int save);
    179 
    180 enum {
    181   C1_SS3 = 0x8f,
    182   C1_DCS = 0x90,
    183   C1_CSI = 0x9b,
    184   C1_ST  = 0x9c,
    185 };
    186 
    187 void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...);
    188 
    189 void vterm_screen_free(VTermScreen *screen);
    190 
    191 VTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation);
    192 
    193 int vterm_unicode_width(int codepoint);
    194 int vterm_unicode_is_combining(int codepoint);
    195 
    196 #endif
    197