6#define strneq(a,b,n) (strncmp(a,b,n)==0)
8#if defined(DEBUG) && DEBUG > 1
9# define DEBUG_GLYPH_COMBINE
28 DEBUG_LOG(
"libvterm: Unhandled putglyph U+%04x at (%d,%d)\n", chars[0], pos.
col, pos.
row);
114 if(!downward && !rightward)
120 else if(downward < -
rows)
126 else if(rightward < -
cols)
189 unsigned char mask = 1 << (col & 7);
195 unsigned char mask = 1 << (col & 7);
201 unsigned char mask = 1 << (col & 7);
226 else if(direction < 0) {
272static int on_text(
const char bytes[],
size_t len,
void *user)
310#ifdef DEBUG_GLYPH_COMBINE
312 printf(
"DEBUG: COMBINING SPLIT GLYPH of chars {");
333#ifdef DEBUG_GLYPH_COMBINE
343 DEBUG_LOG(
"libvterm: TODO: Skip over split char+combining\n");
347 for(; i < npoints; i++) {
349 int glyph_starts = i;
351 for(glyph_ends = i + 1;
361 for( ; i < glyph_ends; i++) {
362 chars[i - glyph_starts] = codepoints[i];
366 fprintf(stderr,
"Text with negative-width codepoint U+%04x\n", codepoints[i]);
376 chars[glyph_ends - glyph_starts] = 0;
379#ifdef DEBUG_GLYPH_COMBINE
381 printf(
"DEBUG: COMBINED GLYPH of %d chars {", glyph_ends - glyph_starts);
382 for(printpos = 0; printpos < glyph_ends - glyph_starts; printpos++)
383 printf(
"U+%04x ", chars[printpos]);
384 printf(
"}, onscreen width %d\n",
width);
410 if(i == npoints - 1) {
414 for(save_i = 0; chars[save_i]; save_i++) {
440 fprintf(stderr,
"Position out of bounds after text: (%d,%d)\n",
539 fprintf(stderr,
"Position out of bounds after Ctrl %02x: (%d,%d)\n",
591static int on_escape(
const char *bytes,
size_t len,
void *user)
661 case '(':
case ')':
case '*':
case '+':
666 int setnum = bytes[0] - 0x28;
787 for(
int row = 0; row <
state->
rows; row++)
926static int on_csi(
const char *leader,
const long args[],
int argcount,
const char *intermed,
char command,
void *user)
930 int intermed_byte = 0;
931 int cancel_phantom = 1;
933 if(leader && leader[0]) {
940 leader_byte = leader[0];
947 if(intermed && intermed[0]) {
951 switch(intermed[0]) {
957 intermed_byte = intermed[0];
972#define LBOUND(v,min) if((v) < (min)) (v) = (min)
973#define UBOUND(v,max) if((v) > (max)) (v) = (max)
975#define LEADER(l,b) ((l << 8) | b)
976#define INTERMED(i,b) ((i << 16) | b)
978 switch(intermed_byte << 16 | leader_byte << 8 |
command) {
1061 selective = (leader_byte ==
'?');
1110 selective = (leader_byte ==
'?');
1316 for(
int i = 0; i < argcount; i++) {
1340 for(
int i = 0; i < argcount; i++) {
1354 for(
int argi = 0; argi < argcount; argi++) {
1356 switch(arg =
CSI_ARG(args[argi])) {
1378 char *qmark = (leader_byte ==
'?') ?
"?" :
"";
1381 case 0:
case 1:
case 2:
case 3:
case 4:
1565 fprintf(stderr,
"Position out of bounds after CSI %c: (%d,%d)\n",
1571 fprintf(stderr,
"Scroll region height out of bounds after CSI %c: %d <= %d\n",
1577 fprintf(stderr,
"Scroll region width out of bounds after CSI %c: %d <= %d\n",
1591 return 'a' + b - 26;
1593 return '0' + b - 52;
1603 if(c >=
'A' && c <=
'Z')
1605 else if(c >=
'a' && c <=
'z')
1606 return c -
'a' + 26;
1607 else if(c >=
'0' && c <=
'9')
1608 return c -
'0' + 52;
1626 switch(frag.
str[0]) {
1675 if(frag.
str[0] ==
'?') {
1708 if(frag.
str[0] ==
'=') {
1710 buffer[0] = (x >> 4) & 0xFF;
1711 buffer += 1, bufcur += 1;
1714 buffer[0] = (x >> 10) & 0xFF;
1715 buffer[1] = (x >> 2) & 0xFF;
1716 buffer += 2, bufcur += 2;
1719 while(frag.
len && frag.
str[0] ==
'=')
1746 buffer[0] = (x >> 16) & 0xFF;
1747 buffer[1] = (x >> 8) & 0xFF;
1748 buffer[2] = (x >> 0) & 0xFF;
1750 buffer += 3, bufcur += 3;
1817 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;
1820 while(i <
sizeof(
state->
tmp.decrqss)-1 && tmp[i])
1822 while(i <
sizeof(
state->
tmp.decrqss)-1 && frag.
len--)
1823 tmp[i++] = (frag.
str++)[0];
1829 switch(tmp[0] | tmp[1]<<8 | tmp[2]<<16) {
1837 vt->
mode.ctrl8bit ?
"\x90" "1$r" :
ESC_S "P" "1$r");
1841 for(
int argi = 0; argi < argc; argi++) {
1843 argi == argc - 1 ?
"%ld" :
1872 case ' '|(
'q'<<8): {
1960 unsigned char mask = 1 << (col & 7);
1962 newtabstops[col >> 3] |= mask;
1964 newtabstops[col >> 3] &= ~mask;
1967 for( ; col <
cols; col++) {
1968 unsigned char mask = 1 << (col & 7);
1970 newtabstops[col >> 3] |= mask;
1972 newtabstops[col >> 3] &= ~mask;
2010 newlineinfo[row] = oldlineinfo[row];
2013 for( ; row <
rows; row++) {
2094 for(
int col = 0; col <
state->
cols; col++)
2100 for(
int row = 0; row <
state->
rows; row++)
2112 for(
int i = 0; i < 4; i++) {
2114 if(default_enc->
init)
2257 char *buffer,
size_t buflen)
2259 if(buflen && !buffer)
2274 const static char selection_chars[] =
"cpqs";
2276 for(idx = 0; idx < 4; idx++)
2277 if(mask & (1 << idx))
2300 x = (x << 8) | frag.
str[0];
2310 buffer += 4, bufcur += 4;
2335 x <<= (n == 1) ? 16 : 8;
2339 buffer[2] = (n == 1) ?
'=' :
base64_one((x >> 6) & 0x3F);
VTermEncoding * vterm_lookup_encoding(VTermEncodingType type, char designation)
static VTermState * state
static VTermEncodingInstance encoding
static VTermStateFallbacks fallbacks
void * memcpy(void *dest, void const *source, size_t size)
void * memmove(void *dest, const void *source, size_t size)
INTERNAL void vterm_state_savepen(VTermState *state, int save)
INTERNAL int vterm_state_getpen(VTermState *state, long args[], int argcount)
INTERNAL void vterm_state_resetpen(VTermState *state)
INTERNAL void vterm_state_newpen(VTermState *state)
INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int argcount)
static uint8_t unbase64one(char c)
void vterm_state_send_selection(VTermState *state, VTermSelectionMask mask, VTermStringFragment frag)
static void request_status_string(VTermState *state, VTermStringFragment frag)
void * vterm_state_get_cbdata(VTermState *state)
static void savecursor(VTermState *state, int save)
static void scroll(VTermState *state, VTermRect rect, int downward, int rightward)
static int on_apc(VTermStringFragment frag, void *user)
void vterm_state_set_selection_callbacks(VTermState *state, const VTermSelectionCallbacks *callbacks, void *user, char *buffer, size_t buflen)
void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks *callbacks, void *user)
static int on_sos(VTermStringFragment frag, void *user)
static int settermprop_bool(VTermState *state, VTermProp prop, int v)
static void set_lineinfo(VTermState *state, int row, int force, int dwl, int dhl)
static void set_dec_mode(VTermState *state, int num, int val)
static int on_control(unsigned char control, void *user)
static void set_mode(VTermState *state, int num, int val)
static void putglyph(VTermState *state, const uint32_t chars[], int width, VTermPos pos)
void * vterm_state_get_unrecognised_fbdata(VTermState *state)
int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val)
static void grow_combine_buffer(VTermState *state)
static void linefeed(VTermState *state)
static int settermprop_string(VTermState *state, VTermProp prop, VTermStringFragment frag)
void vterm_state_reset(VTermState *state, int hard)
INTERNAL void vterm_state_free(VTermState *state)
static void request_dec_mode(VTermState *state, int num)
void vterm_state_get_cursorpos(const VTermState *state, VTermPos *cursorpos)
static int on_csi(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user)
static int on_dcs(const char *command, size_t commandlen, VTermStringFragment frag, void *user)
static char base64_one(uint8_t b)
static void updatecursor(VTermState *state, VTermPos *oldpos, int cancel_phantom)
static const VTermParserCallbacks parser_callbacks
static int settermprop_int(VTermState *state, VTermProp prop, int v)
static void request_version_string(VTermState *state)
static void tab(VTermState *state, int count, int direction)
static void erase(VTermState *state, VTermRect rect, int selective)
const VTermLineInfo * vterm_state_get_lineinfo(const VTermState *state, int row)
static int on_pm(VTermStringFragment frag, void *user)
static VTermState * vterm_state_new(VTerm *vt)
static int is_cursor_in_scrollregion(const VTermState *state)
void vterm_state_focus_out(VTermState *state)
static int on_text(const char bytes[], size_t len, void *user)
VTermState * vterm_obtain_state(VTerm *vt)
static int on_resize(int rows, int cols, void *user)
void vterm_state_focus_in(VTermState *state)
static void clear_col_tabstop(VTermState *state, int col)
static int is_col_tabstop(VTermState *state, int col)
static int on_escape(const char *bytes, size_t len, void *user)
void vterm_state_set_unrecognised_fallbacks(VTermState *state, const VTermStateFallbacks *fallbacks, void *user)
static int on_osc(int command, VTermStringFragment frag, void *user)
static void set_col_tabstop(VTermState *state, int col)
static void osc_selection(VTermState *state, VTermStringFragment frag)
void(* init)(VTermEncoding *enc, void *data)
void(* decode)(VTermEncoding *enc, void *data, uint32_t cp[], int *cpi, int cplen, const char bytes[], size_t *pos, size_t len)
int(* text)(const char *bytes, size_t len, void *user)
int(* settermprop)(VTermProp prop, VTermValue *val, void *user)
int(* initpen)(void *user)
int(* erase)(VTermRect rect, int selective, void *user)
int(* resize)(int rows, int cols, VTermStateFields *fields, void *user)
int(* moverect)(VTermRect dest, VTermRect src, void *user)
int(* putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user)
int(* scrollrect)(VTermRect rect, int downward, int rightward, void *user)
int(* sb_clear)(void *user)
int(* setlineinfo)(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo, void *user)
int(* movecursor)(VTermPos pos, VTermPos oldpos, int visible, void *user)
int(* control)(unsigned char control, void *user)
int(* csi)(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user)
int(* sos)(VTermStringFragment frag, void *user)
int(* pm)(VTermStringFragment frag, void *user)
int(* apc)(VTermStringFragment frag, void *user)
int(* dcs)(const char *command, size_t commandlen, VTermStringFragment frag, void *user)
int(* osc)(int command, VTermStringFragment frag, void *user)
struct VTermState::@19 selection
VTermEncodingInstance encoding[4]
VTermLineInfo * lineinfos[2]
unsigned int protected_cell
union VTermState::@18 tmp
size_t combine_chars_size
const VTermStateCallbacks * callbacks
VTermEncodingInstance encoding_utf8
enum VTermState::@15 mouse_protocol
struct VTermState::@17 saved
struct VTermState::@16 mode
const VTermStateFallbacks * fallbacks
static uint16_t uint16_t * height
INTERNAL int vterm_unicode_is_combining(uint32_t codepoint)
INTERNAL int vterm_unicode_width(uint32_t codepoint)
INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt,...)
INTERNAL void vterm_push_output_sprintf_str(VTerm *vt, unsigned char ctrl, bool term, const char *fmt,...)
INTERNAL void * vterm_allocator_malloc(VTerm *vt, size_t size)
INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len)
INTERNAL void vterm_allocator_free(VTerm *vt, void *ptr)
#define VTERM_MAX_CHARS_PER_CELL
#define CSI_ARG_OR(a, def)
#define VTERM_VERSION_MAJOR
VTermLineInfo * lineinfos[2]
unsigned int doubleheight
#define CSI_ARG_HAS_MORE(a)
void vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks *callbacks, void *user)
@ VTERM_PROP_CURSORSHAPE_BLOCK
@ VTERM_PROP_CURSORSHAPE_UNDERLINE
@ VTERM_PROP_CURSORSHAPE_BAR_LEFT
void vterm_scroll_rect(VTermRect rect, int downward, int rightward, int(*moverect)(VTermRect src, VTermRect dest, void *user), int(*eraserect)(VTermRect rect, int selective, void *user), void *user)
unsigned int continuation
#define VTERM_VERSION_MINOR
VTermStringFragment string
#define CSI_ARG_IS_MISSING(a)
@ VTERM_PROP_CURSORVISIBLE
@ VTERM_SELECTION_CLIPBOARD
@ VTERM_SELECTION_SECONDARY
@ VTERM_SELECTION_PRIMARY
#define SCROLLREGION_RIGHT(state)
#define THISROWWIDTH(state)
char data[4 *sizeof(uint32_t)]
#define SCROLLREGION_LEFT(state)
#define SCROLLREGION_BOTTOM(state)
#define ROWWIDTH(state, row)