Patch 8.0.1757
Problem: Unnecessary changes in libvterm.
Solution: Bring back // comments and trailing comma in enums.
Files: src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-ctrl.c,
src/libvterm/bin/vterm-dump.c, src/libvterm/include/vterm.h,
src/libvterm/include/vterm_keycodes.h,
src/libvterm/src/encoding.c, src/libvterm/src/keyboard.c,
src/libvterm/src/parser.c, src/libvterm/src/pen.c,
src/libvterm/src/screen.c, src/libvterm/src/state.c,
src/libvterm/src/unicode.c, src/libvterm/src/utf8.h,
src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h
*** ../vim-8.0.1756/src/libvterm/bin/unterm.c 2018-03-25 16:20:18.513264056
+0200
--- src/libvterm/bin/unterm.c 2018-04-24 17:46:22.203589138 +0200
***************
*** 9,15 ****
#include "vterm.h"
#define DEFINE_INLINES
! #include "../src/utf8.h" /* fill_utf8 */
#define streq(a,b) (!strcmp(a,b))
--- 9,15 ----
#include "vterm.h"
#define DEFINE_INLINES
! #include "../src/utf8.h" // fill_utf8
#define streq(a,b) (!strcmp(a,b))
***************
*** 21,27 ****
static enum {
FORMAT_PLAIN,
! FORMAT_SGR
} format = FORMAT_PLAIN;
static int col2index(VTermColor target)
--- 21,27 ----
static enum {
FORMAT_PLAIN,
! FORMAT_SGR,
} format = FORMAT_PLAIN;
static int col2index(VTermColor target)
***************
*** 44,51 ****
break;
case FORMAT_SGR:
{
! /* If all 7 attributes change, that means 7 SGRs max */
! /* Each colour could consume up to 3 */
int sgr[7 + 2*3]; int sgri = 0;
if(!prevcell->attrs.bold && cell->attrs.bold)
--- 44,51 ----
break;
case FORMAT_SGR:
{
! // If all 7 attributes change, that means 7 SGRs max
! // Each colour could consume up to 3
int sgr[7 + 2*3]; int sgri = 0;
if(!prevcell->attrs.bold && cell->attrs.bold)
*** ../vim-8.0.1756/src/libvterm/bin/vterm-ctrl.c 2018-03-25
16:20:18.513264056 +0200
--- src/libvterm/bin/vterm-ctrl.c 2018-04-24 17:50:02.690199506 +0200
***************
*** 35,41 ****
typedef enum {
OFF,
ON,
! QUERY
} BoolQuery;
static BoolQuery getboolq(int *argip, int argc, char *argv[])
--- 35,41 ----
typedef enum {
OFF,
ON,
! QUERY,
} BoolQuery;
static BoolQuery getboolq(int *argip, int argc, char *argv[])
***************
*** 105,111 ****
unsigned char csi[32];
int i = 0;
! await_c1(0x9B); /* CSI */
/* TODO: This really should be a more robust CSI parser
*/
--- 105,111 ----
unsigned char csi[32];
int i = 0;
! await_c1(0x9B); // CSI
/* TODO: This really should be a more robust CSI parser
*/
***************
*** 116,122 ****
}
csi[++i] = 0;
! /* TODO: returns longer than 32? */
return strdup((char *)csi);
}
--- 116,122 ----
}
csi[++i] = 0;
! // TODO: returns longer than 32?
return strdup((char *)csi);
}
***************
*** 131,137 ****
for(i = 0; i < sizeof(dcs)-1; ) {
char c = getchar();
! if(c == 0x9c) /* ST */
break;
if(in_esc && c == 0x5c)
break;
--- 131,137 ----
for(i = 0; i < sizeof(dcs)-1; ) {
char c = getchar();
! if(c == 0x9c) // ST
break;
if(in_esc && c == 0x5c)
break;
***************
*** 301,312 ****
do_dec_mode(12, getboolq(&argi, argc, argv), "curblink");
}
else if(streq(arg, "curshape")) {
! /* TODO: This ought to query the current value of DECSCUSR because it */
! /* may need blinking on or off */
const char *choices[] = {"block", "under", "bar", "query", NULL};
int shape = getchoice(&argi, argc, argv, choices);
switch(shape) {
! case 3: /* query */
shape = query_rqss_numeric(" q");
switch(shape) {
case 1: case 2:
--- 301,312 ----
do_dec_mode(12, getboolq(&argi, argc, argv), "curblink");
}
else if(streq(arg, "curshape")) {
! // TODO: This ought to query the current value of DECSCUSR because it
! // may need blinking on or off
const char *choices[] = {"block", "under", "bar", "query", NULL};
int shape = getchoice(&argi, argc, argv, choices);
switch(shape) {
! case 3: // query
shape = query_rqss_numeric(" q");
switch(shape) {
case 1: case 2:
*** ../vim-8.0.1756/src/libvterm/bin/vterm-dump.c 2018-03-25
16:20:18.513264056 +0200
--- src/libvterm/bin/vterm-dump.c 2018-04-24 17:51:44.369514813 +0200
***************
*** 1,4 ****
! /* Require getopt(3) */
#define _XOPEN_SOURCE
#include <stdio.h>
--- 1,4 ----
! // Require getopt(3)
#define _XOPEN_SOURCE
#include <stdio.h>
***************
*** 22,49 ****
int i;
for(i = 0; i < len; /* none */) {
! if(b[i] < 0x20) /* C0 */
break;
! else if(b[i] < 0x80) /* ASCII */
i++;
! else if(b[i] < 0xa0) /* C1 */
break;
! else if(b[i] < 0xc0) /* UTF-8 continuation */
break;
! else if(b[i] < 0xe0) { /* UTF-8 2-byte */
! /* 2-byte UTF-8 */
if(len < i+2) break;
i += 2;
}
! else if(b[i] < 0xf0) { /* UTF-8 3-byte */
if(len < i+3) break;
i += 3;
}
! else if(b[i] < 0xf8) { /* UTF-8 4-byte */
if(len < i+4) break;
i += 4;
}
! else /* otherwise invalid */
break;
}
--- 22,49 ----
int i;
for(i = 0; i < len; /* none */) {
! if(b[i] < 0x20) // C0
break;
! else if(b[i] < 0x80) // ASCII
i++;
! else if(b[i] < 0xa0) // C1
break;
! else if(b[i] < 0xc0) // UTF-8 continuation
break;
! else if(b[i] < 0xe0) { // UTF-8 2-byte
! // 2-byte UTF-8
if(len < i+2) break;
i += 2;
}
! else if(b[i] < 0xf0) { // UTF-8 3-byte
if(len < i+3) break;
i += 3;
}
! else if(b[i] < 0xf8) { // UTF-8 4-byte
if(len < i+4) break;
i += 4;
}
! else // otherwise invalid
break;
}
***************
*** 200,206 ****
file = argv[optind++];
if(!file || streq(file, "-"))
! fd = 0; /* stdin */
else {
fd = open(file, O_RDONLY);
if(fd == -1) {
--- 200,206 ----
file = argv[optind++];
if(!file || streq(file, "-"))
! fd = 0; // stdin
else {
fd = open(file, O_RDONLY);
if(fd == -1) {
*** ../vim-8.0.1756/src/libvterm/include/vterm.h 2018-03-25
16:20:18.513264056 +0200
--- src/libvterm/include/vterm.h 2018-04-24 17:55:28.072054366 +0200
***************
*** 110,139 ****
typedef enum {
/* VTERM_ATTR_NONE = 0 */
! VTERM_ATTR_BOLD = 1, /* bool: 1, 22 */
! VTERM_ATTR_UNDERLINE, /* number: 4, 21, 24 */
! VTERM_ATTR_ITALIC, /* bool: 3, 23 */
! VTERM_ATTR_BLINK, /* bool: 5, 25 */
! VTERM_ATTR_REVERSE, /* bool: 7, 27 */
! VTERM_ATTR_STRIKE, /* bool: 9, 29 */
! VTERM_ATTR_FONT, /* number: 10-19 */
! VTERM_ATTR_FOREGROUND, /* color: 30-39 90-97 */
! VTERM_ATTR_BACKGROUND, /* color: 40-49 100-107 */
VTERM_N_ATTRS
} VTermAttr;
typedef enum {
/* VTERM_PROP_NONE = 0 */
! VTERM_PROP_CURSORVISIBLE = 1, /* bool */
! VTERM_PROP_CURSORBLINK, /* bool */
! VTERM_PROP_ALTSCREEN, /* bool */
! VTERM_PROP_TITLE, /* string */
! VTERM_PROP_ICONNAME, /* string */
! VTERM_PROP_REVERSE, /* bool */
! VTERM_PROP_CURSORSHAPE, /* number */
! VTERM_PROP_MOUSE, /* number */
! VTERM_PROP_CURSORCOLOR, /* string */
VTERM_N_PROPS
} VTermProp;
--- 110,139 ----
typedef enum {
/* VTERM_ATTR_NONE = 0 */
! VTERM_ATTR_BOLD = 1, // bool: 1, 22
! VTERM_ATTR_UNDERLINE, // number: 4, 21, 24
! VTERM_ATTR_ITALIC, // bool: 3, 23
! VTERM_ATTR_BLINK, // bool: 5, 25
! VTERM_ATTR_REVERSE, // bool: 7, 27
! VTERM_ATTR_STRIKE, // bool: 9, 29
! VTERM_ATTR_FONT, // number: 10-19
! VTERM_ATTR_FOREGROUND, // color: 30-39 90-97
! VTERM_ATTR_BACKGROUND, // color: 40-49 100-107
VTERM_N_ATTRS
} VTermAttr;
typedef enum {
/* VTERM_PROP_NONE = 0 */
! VTERM_PROP_CURSORVISIBLE = 1, // bool
! VTERM_PROP_CURSORBLINK, // bool
! VTERM_PROP_ALTSCREEN, // bool
! VTERM_PROP_TITLE, // string
! VTERM_PROP_ICONNAME, // string
! VTERM_PROP_REVERSE, // bool
! VTERM_PROP_CURSORSHAPE, // number
! VTERM_PROP_MOUSE, // number
! VTERM_PROP_CURSORCOLOR, // string
VTERM_N_PROPS
} VTermProp;
***************
*** 211,219 ****
* Button 4 is scroll wheel down, button 5 is scroll wheel up. */
void vterm_mouse_button(VTerm *vt, int button, int pressed, VTermModifier
mod);
! /* ------------
! * Parser layer
! * ------------ */
/* Flag to indicate non-final subparameters in a single CSI parameter.
* Consider
--- 211,219 ----
* Button 4 is scroll wheel down, button 5 is scroll wheel up. */
void vterm_mouse_button(VTerm *vt, int button, int pressed, VTermModifier
mod);
! // ------------
! // Parser layer
! // ------------
/* Flag to indicate non-final subparameters in a single CSI parameter.
* Consider
***************
*** 249,257 ****
void vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks
*callbacks, void *user);
void *vterm_parser_get_cbdata(VTerm *vt);
! /* -----------
! * State layer
! * ----------- */
typedef struct {
int (*putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user);
--- 249,257 ----
void vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks
*callbacks, void *user);
void *vterm_parser_get_cbdata(VTerm *vt);
! // -----------
! // State layer
! // -----------
typedef struct {
int (*putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user);
***************
*** 287,293 ****
void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks
*callbacks, void *user);
void *vterm_state_get_cbdata(VTermState *state);
! /* Only invokes control, csi, osc, dcs */
void vterm_state_set_unrecognised_fallbacks(VTermState *state, const
VTermParserCallbacks *fallbacks, void *user);
void *vterm_state_get_unrecognised_fbdata(VTermState *state);
--- 287,293 ----
void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks
*callbacks, void *user);
void *vterm_state_get_cbdata(VTermState *state);
! // Only invokes control, csi, osc, dcs
void vterm_state_set_unrecognised_fallbacks(VTermState *state, const
VTermParserCallbacks *fallbacks, void *user);
void *vterm_state_get_unrecognised_fbdata(VTermState *state);
***************
*** 307,315 ****
void vterm_state_focus_out(VTermState *state);
const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int
row);
! /* ------------
! * Screen layer
! * ------------ */
typedef struct {
unsigned int bold : 1;
--- 307,315 ----
void vterm_state_focus_out(VTermState *state);
const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int
row);
! // ------------
! // Screen layer
! // ------------
typedef struct {
unsigned int bold : 1;
***************
*** 356,362 ****
void vterm_screen_set_callbacks(VTermScreen *screen, const
VTermScreenCallbacks *callbacks, void *user);
void *vterm_screen_get_cbdata(VTermScreen *screen);
! /* Only invokes control, csi, osc, dcs */
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const
VTermParserCallbacks *fallbacks, void *user);
void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
--- 356,362 ----
void vterm_screen_set_callbacks(VTermScreen *screen, const
VTermScreenCallbacks *callbacks, void *user);
void *vterm_screen_get_cbdata(VTermScreen *screen);
! // Only invokes control, csi, osc, dcs
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const
VTermParserCallbacks *fallbacks, void *user);
void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
***************
*** 409,417 ****
int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos);
! /* ---------
! * Utilities
! * --------- */
VTermValueType vterm_get_attr_type(VTermAttr attr);
VTermValueType vterm_get_prop_type(VTermProp prop);
--- 409,417 ----
int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos);
! // ---------
! // Utilities
! // ---------
VTermValueType vterm_get_attr_type(VTermAttr attr);
VTermValueType vterm_get_prop_type(VTermProp prop);
*** ../vim-8.0.1756/src/libvterm/include/vterm_keycodes.h 2018-03-25
16:20:18.513264056 +0200
--- src/libvterm/include/vterm_keycodes.h 2018-04-24 17:56:28.243669905
+0200
***************
*** 55,61 ****
VTERM_KEY_KP_ENTER,
VTERM_KEY_KP_EQUAL,
! VTERM_KEY_MAX, /* Must be last */
VTERM_N_KEYS = VTERM_KEY_MAX
} VTermKey;
--- 55,61 ----
VTERM_KEY_KP_ENTER,
VTERM_KEY_KP_EQUAL,
! VTERM_KEY_MAX, // Must be last
VTERM_N_KEYS = VTERM_KEY_MAX
} VTermKey;
*** ../vim-8.0.1756/src/libvterm/src/encoding.c 2018-02-04 14:49:54.019221594
+0100
--- src/libvterm/src/encoding.c 2018-04-24 17:58:04.107063092 +0200
***************
*** 7,17 ****
#endif
struct UTF8DecoderData {
! /* number of bytes remaining in this codepoint */
int bytes_remaining;
! /* number of bytes total in this codepoint once it's finished
! (for detecting overlongs) */
int bytes_total;
int this_cp;
--- 7,17 ----
#endif
struct UTF8DecoderData {
! // number of bytes remaining in this codepoint
int bytes_remaining;
! // number of bytes total in this codepoint once it's finished
! // (for detecting overlongs)
int bytes_total;
int this_cp;
***************
*** 42,48 ****
printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining);
#endif
! if(c < 0x20) /* C0 */
return;
else if(c >= 0x20 && c < 0x7f) {
--- 42,48 ----
printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining);
#endif
! if(c < 0x20) // C0
return;
else if(c >= 0x20 && c < 0x7f) {
***************
*** 58,64 ****
#endif
}
! else if(c == 0x7f) /* DEL */
return;
else if(c >= 0x80 && c < 0xc0) {
--- 58,64 ----
#endif
}
! else if(c == 0x7f) // DEL
return;
else if(c >= 0x80 && c < 0xc0) {
***************
*** 75,81 ****
#ifdef DEBUG_PRINT_UTF8
printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp,
data->bytes_total);
#endif
! /* Check for overlong sequences */
switch(data->bytes_total) {
case 2:
if(data->this_cp < 0x0080) data->this_cp = UNICODE_INVALID;
--- 75,81 ----
#ifdef DEBUG_PRINT_UTF8
printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp,
data->bytes_total);
#endif
! // Check for overlong sequences
switch(data->bytes_total) {
case 2:
if(data->this_cp < 0x0080) data->this_cp = UNICODE_INVALID;
***************
*** 93,99 ****
if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID;
break;
}
! /* Now look for plain invalid ones */
if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) ||
data->this_cp == 0xFFFE ||
data->this_cp == 0xFFFF)
--- 93,99 ----
if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID;
break;
}
! // Now look for plain invalid ones
if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) ||
data->this_cp == 0xFFFE ||
data->this_cp == 0xFFFF)
*** ../vim-8.0.1756/src/libvterm/src/keyboard.c 2017-07-23 22:07:23.041277153
+0200
--- src/libvterm/src/keyboard.c 2018-04-24 18:01:25.177808418 +0200
***************
*** 15,21 ****
mod &= ~VTERM_MOD_SHIFT;
if(mod == 0) {
! /* Normal text - ignore just shift */
char str[6];
int seqlen = fill_utf8(c, str);
vterm_push_output_bytes(vt, str, seqlen);
--- 15,21 ----
mod &= ~VTERM_MOD_SHIFT;
if(mod == 0) {
! // Normal text - ignore just shift
char str[6];
int seqlen = fill_utf8(c, str);
vterm_push_output_bytes(vt, str, seqlen);
***************
*** 62,68 ****
KEYCODE_CSI,
KEYCODE_CSI_CURSOR,
KEYCODE_CSINUM,
! KEYCODE_KEYPAD
} type;
char literal;
int csinum;
--- 62,68 ----
KEYCODE_CSI,
KEYCODE_CSI_CURSOR,
KEYCODE_CSINUM,
! KEYCODE_KEYPAD,
} type;
char literal;
int csinum;
***************
*** 70,130 ****
/* Order here must be exactly the same as VTermKey enum! */
static keycodes_s keycodes[] = {
! { KEYCODE_NONE, 0, 0 }, /* NONE */
! { KEYCODE_ENTER, '\r', 0 }, /* ENTER */
! { KEYCODE_TAB, '\t', 0 }, /* TAB */
! { KEYCODE_LITERAL, '\x7f', 0 }, /* BACKSPACE == ASCII DEL */
! { KEYCODE_LITERAL, '\x1b', 0 }, /* ESCAPE */
!
! { KEYCODE_CSI_CURSOR, 'A', 0 }, /* UP */
! { KEYCODE_CSI_CURSOR, 'B', 0 }, /* DOWN */
! { KEYCODE_CSI_CURSOR, 'D', 0 }, /* LEFT */
! { KEYCODE_CSI_CURSOR, 'C', 0 }, /* RIGHT */
!
! { KEYCODE_CSINUM, '~', 2 }, /* INS */
! { KEYCODE_CSINUM, '~', 3 }, /* DEL */
! { KEYCODE_CSI_CURSOR, 'H', 0 }, /* HOME */
! { KEYCODE_CSI_CURSOR, 'F', 0 }, /* END */
! { KEYCODE_CSINUM, '~', 5 }, /* PAGEUP */
! { KEYCODE_CSINUM, '~', 6 }, /* PAGEDOWN */
};
static keycodes_s keycodes_fn[] = {
! { KEYCODE_NONE, 0, 0 }, /* F0 - shouldn't happen */
! { KEYCODE_CSI_CURSOR, 'P', 0 }, /* F1 */
! { KEYCODE_CSI_CURSOR, 'Q', 0 }, /* F2 */
! { KEYCODE_CSI_CURSOR, 'R', 0 }, /* F3 */
! { KEYCODE_CSI_CURSOR, 'S', 0 }, /* F4 */
! { KEYCODE_CSINUM, '~', 15 }, /* F5 */
! { KEYCODE_CSINUM, '~', 17 }, /* F6 */
! { KEYCODE_CSINUM, '~', 18 }, /* F7 */
! { KEYCODE_CSINUM, '~', 19 }, /* F8 */
! { KEYCODE_CSINUM, '~', 20 }, /* F9 */
! { KEYCODE_CSINUM, '~', 21 }, /* F10 */
! { KEYCODE_CSINUM, '~', 23 }, /* F11 */
! { KEYCODE_CSINUM, '~', 24 }, /* F12 */
};
static keycodes_s keycodes_kp[] = {
! { KEYCODE_KEYPAD, '0', 'p' }, /* KP_0 */
! { KEYCODE_KEYPAD, '1', 'q' }, /* KP_1 */
! { KEYCODE_KEYPAD, '2', 'r' }, /* KP_2 */
! { KEYCODE_KEYPAD, '3', 's' }, /* KP_3 */
! { KEYCODE_KEYPAD, '4', 't' }, /* KP_4 */
! { KEYCODE_KEYPAD, '5', 'u' }, /* KP_5 */
! { KEYCODE_KEYPAD, '6', 'v' }, /* KP_6 */
! { KEYCODE_KEYPAD, '7', 'w' }, /* KP_7 */
! { KEYCODE_KEYPAD, '8', 'x' }, /* KP_8 */
! { KEYCODE_KEYPAD, '9', 'y' }, /* KP_9 */
! { KEYCODE_KEYPAD, '*', 'j' }, /* KP_MULT */
! { KEYCODE_KEYPAD, '+', 'k' }, /* KP_PLUS */
! { KEYCODE_KEYPAD, ',', 'l' }, /* KP_COMMA */
! { KEYCODE_KEYPAD, '-', 'm' }, /* KP_MINUS */
! { KEYCODE_KEYPAD, '.', 'n' }, /* KP_PERIOD */
! { KEYCODE_KEYPAD, '/', 'o' }, /* KP_DIVIDE */
! { KEYCODE_KEYPAD, '\n', 'M' }, /* KP_ENTER */
! { KEYCODE_KEYPAD, '=', 'X' }, /* KP_EQUAL */
};
void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
--- 70,130 ----
/* Order here must be exactly the same as VTermKey enum! */
static keycodes_s keycodes[] = {
! { KEYCODE_NONE, 0, 0 }, // NONE
! { KEYCODE_ENTER, '\r', 0 }, // ENTER
! { KEYCODE_TAB, '\t', 0 }, // TAB
! { KEYCODE_LITERAL, '\x7f', 0 }, // BACKSPACE == ASCII DEL
! { KEYCODE_LITERAL, '\x1b', 0 }, // ESCAPE
!
! { KEYCODE_CSI_CURSOR, 'A', 0 }, // UP
! { KEYCODE_CSI_CURSOR, 'B', 0 }, // DOWN
! { KEYCODE_CSI_CURSOR, 'D', 0 }, // LEFT
! { KEYCODE_CSI_CURSOR, 'C', 0 }, // RIGHT
!
! { KEYCODE_CSINUM, '~', 2 }, // INS
! { KEYCODE_CSINUM, '~', 3 }, // DEL
! { KEYCODE_CSI_CURSOR, 'H', 0 }, // HOME
! { KEYCODE_CSI_CURSOR, 'F', 0 }, // END
! { KEYCODE_CSINUM, '~', 5 }, // PAGEUP
! { KEYCODE_CSINUM, '~', 6 }, // PAGEDOWN
};
static keycodes_s keycodes_fn[] = {
! { KEYCODE_NONE, 0, 0 }, // F0 - shouldn't happen
! { KEYCODE_CSI_CURSOR, 'P', 0 }, // F1
! { KEYCODE_CSI_CURSOR, 'Q', 0 }, // F2
! { KEYCODE_CSI_CURSOR, 'R', 0 }, // F3
! { KEYCODE_CSI_CURSOR, 'S', 0 }, // F4
! { KEYCODE_CSINUM, '~', 15 }, // F5
! { KEYCODE_CSINUM, '~', 17 }, // F6
! { KEYCODE_CSINUM, '~', 18 }, // F7
! { KEYCODE_CSINUM, '~', 19 }, // F8
! { KEYCODE_CSINUM, '~', 20 }, // F9
! { KEYCODE_CSINUM, '~', 21 }, // F10
! { KEYCODE_CSINUM, '~', 23 }, // F11
! { KEYCODE_CSINUM, '~', 24 }, // F12
};
static keycodes_s keycodes_kp[] = {
! { KEYCODE_KEYPAD, '0', 'p' }, // KP_0
! { KEYCODE_KEYPAD, '1', 'q' }, // KP_1
! { KEYCODE_KEYPAD, '2', 'r' }, // KP_2
! { KEYCODE_KEYPAD, '3', 's' }, // KP_3
! { KEYCODE_KEYPAD, '4', 't' }, // KP_4
! { KEYCODE_KEYPAD, '5', 'u' }, // KP_5
! { KEYCODE_KEYPAD, '6', 'v' }, // KP_6
! { KEYCODE_KEYPAD, '7', 'w' }, // KP_7
! { KEYCODE_KEYPAD, '8', 'x' }, // KP_8
! { KEYCODE_KEYPAD, '9', 'y' }, // KP_9
! { KEYCODE_KEYPAD, '*', 'j' }, // KP_MULT
! { KEYCODE_KEYPAD, '+', 'k' }, // KP_PLUS
! { KEYCODE_KEYPAD, ',', 'l' }, // KP_COMMA
! { KEYCODE_KEYPAD, '-', 'm' }, // KP_MINUS
! { KEYCODE_KEYPAD, '.', 'n' }, // KP_PERIOD
! { KEYCODE_KEYPAD, '/', 'o' }, // KP_DIVIDE
! { KEYCODE_KEYPAD, '\n', 'M' }, // KP_ENTER
! { KEYCODE_KEYPAD, '=', 'X' }, // KP_EQUAL
};
void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
*** ../vim-8.0.1756/src/libvterm/src/parser.c 2018-04-08 12:17:01.131208574
+0200
--- src/libvterm/src/parser.c 2018-04-24 18:03:23.569078422 +0200
***************
*** 148,165 ****
for( ; pos < len; pos++) {
unsigned char c = bytes[pos];
! if(c == 0x00 || c == 0x7f) { /* NUL, DEL */
if(vt->parser.state >= STRING) {
more_string(vt, string_start, bytes + pos - string_start);
string_start = bytes + pos + 1;
}
continue;
}
! if(c == 0x18 || c == 0x1a) { /* CAN, SUB */
ENTER_NORMAL_STATE();
continue;
}
! else if(c == 0x1b) { /* ESC */
vt->parser.intermedlen = 0;
if(vt->parser.state == STRING)
vt->parser.state = ESC_IN_STRING;
--- 148,165 ----
for( ; pos < len; pos++) {
unsigned char c = bytes[pos];
! if(c == 0x00 || c == 0x7f) { // NUL, DEL
if(vt->parser.state >= STRING) {
more_string(vt, string_start, bytes + pos - string_start);
string_start = bytes + pos + 1;
}
continue;
}
! if(c == 0x18 || c == 0x1a) { // CAN, SUB
ENTER_NORMAL_STATE();
continue;
}
! else if(c == 0x1b) { // ESC
vt->parser.intermedlen = 0;
if(vt->parser.state == STRING)
vt->parser.state = ESC_IN_STRING;
***************
*** 167,177 ****
ENTER_STATE(ESC);
continue;
}
! else if(c == 0x07 && /* BEL, can stand for ST in OSC or DCS state */
vt->parser.state == STRING) {
! /* fallthrough */
}
! else if(c < 0x20) { /* other C0 */
if(vt->parser.state >= STRING)
more_string(vt, string_start, bytes + pos - string_start);
do_control(vt, c);
--- 167,177 ----
ENTER_STATE(ESC);
continue;
}
! else if(c == 0x07 && // BEL, can stand for ST in OSC or DCS state
vt->parser.state == STRING) {
! // fallthrough
}
! else if(c < 0x20) { // other C0
if(vt->parser.state >= STRING)
more_string(vt, string_start, bytes + pos - string_start);
do_control(vt, c);
***************
*** 179,208 ****
string_start = bytes + pos + 1;
continue;
}
! /* else fallthrough */
switch(vt->parser.state) {
case ESC_IN_STRING:
! if(c == 0x5c) { /* ST */
vt->parser.state = STRING;
done_string(vt, string_start, bytes + pos - string_start - 1);
ENTER_NORMAL_STATE();
break;
}
vt->parser.state = ESC;
! /* else fallthrough */
case ESC:
switch(c) {
! case 0x50: /* DCS */
start_string(vt, VTERM_PARSER_DCS);
ENTER_STRING_STATE();
break;
! case 0x5b: /* CSI */
vt->parser.csi_leaderlen = 0;
ENTER_STATE(CSI_LEADER);
break;
! case 0x5d: /* OSC */
start_string(vt, VTERM_PARSER_OSC);
ENTER_STRING_STATE();
break;
--- 179,208 ----
string_start = bytes + pos + 1;
continue;
}
! // else fallthrough
switch(vt->parser.state) {
case ESC_IN_STRING:
! if(c == 0x5c) { // ST
vt->parser.state = STRING;
done_string(vt, string_start, bytes + pos - string_start - 1);
ENTER_NORMAL_STATE();
break;
}
vt->parser.state = ESC;
! // else fallthrough
case ESC:
switch(c) {
! case 0x50: // DCS
start_string(vt, VTERM_PARSER_DCS);
ENTER_STRING_STATE();
break;
! case 0x5b: // CSI
vt->parser.csi_leaderlen = 0;
ENTER_STATE(CSI_LEADER);
break;
! case 0x5d: // OSC
start_string(vt, VTERM_PARSER_OSC);
ENTER_STRING_STATE();
break;
***************
*** 298,311 ****
case NORMAL:
if(c >= 0x80 && c < 0xa0 && !vt->mode.utf8) {
switch(c) {
! case 0x90: /* DCS */
start_string(vt, VTERM_PARSER_DCS);
ENTER_STRING_STATE();
break;
! case 0x9b: /* CSI */
ENTER_STATE(CSI_LEADER);
break;
! case 0x9d: /* OSC */
start_string(vt, VTERM_PARSER_OSC);
ENTER_STRING_STATE();
break;
--- 298,311 ----
case NORMAL:
if(c >= 0x80 && c < 0xa0 && !vt->mode.utf8) {
switch(c) {
! case 0x90: // DCS
start_string(vt, VTERM_PARSER_DCS);
ENTER_STRING_STATE();
break;
! case 0x9b: // CSI
ENTER_STATE(CSI_LEADER);
break;
! case 0x9d: // OSC
start_string(vt, VTERM_PARSER_OSC);
ENTER_STRING_STATE();
break;
***************
*** 325,331 ****
eaten = 1;
}
! pos += (eaten - 1); /* we'll ++ it again in a moment */
}
break;
}
--- 325,331 ----
eaten = 1;
}
! pos += (eaten - 1); // we'll ++ it again in a moment
}
break;
}
*** ../vim-8.0.1756/src/libvterm/src/pen.c 2018-03-25 16:20:18.517264034
+0200
--- src/libvterm/src/pen.c 2018-04-24 18:12:35.253726764 +0200
***************
*** 4,27 ****
static const VTermColor ansi_colors[] = {
/* R G B index */
! { 0, 0, 0, 1 }, /* black */
! { 224, 0, 0, 2 }, /* red */
! { 0, 224, 0, 3 }, /* green */
! { 224, 224, 0, 4 }, /* yellow */
! { 0, 0, 224, 5 }, /* blue */
! { 224, 0, 224, 6 }, /* magenta */
! { 0, 224, 224, 7 }, /* cyan */
! { 224, 224, 224, 8 }, /* white == light grey */
!
! /* high intensity */
! { 128, 128, 128, 9 }, /* black */
! { 255, 64, 64, 10 }, /* red */
! { 64, 255, 64, 11 }, /* green */
! { 255, 255, 64, 12 }, /* yellow */
! { 64, 64, 255, 13 }, /* blue */
! { 255, 64, 255, 14 }, /* magenta */
! { 64, 255, 255, 15 }, /* cyan */
! { 255, 255, 255, 16 }, /* white for real */
};
static int ramp6[] = {
--- 4,27 ----
static const VTermColor ansi_colors[] = {
/* R G B index */
! { 0, 0, 0, 1 }, // black
! { 224, 0, 0, 2 }, // red
! { 0, 224, 0, 3 }, // green
! { 224, 224, 0, 4 }, // yellow
! { 0, 0, 224, 5 }, // blue
! { 224, 0, 224, 6 }, // magenta
! { 0, 224, 224, 7 }, // cyan
! { 224, 224, 224, 8 }, // white == light grey
!
! // high intensity
! { 128, 128, 128, 9 }, // black
! { 255, 64, 64, 10 }, // red
! { 64, 255, 64, 11 }, // green
! { 255, 255, 64, 12 }, // yellow
! { 64, 64, 255, 13 }, // blue
! { 255, 64, 255, 14 }, // magenta
! { 64, 255, 255, 15 }, // cyan
! { 255, 255, 255, 16 }, // white for real
};
static int ramp6[] = {
***************
*** 47,57 ****
static int lookup_colour_palette(const VTermState *state, long index,
VTermColor *col)
{
if(index >= 0 && index < 16) {
! /* Normal 8 colours or high intensity - parse as palette 0 */
return lookup_colour_ansi(state, index, col);
}
else if(index >= 16 && index < 232) {
! /* 216-colour cube */
index -= 16;
col->blue = ramp6[index % 6];
--- 47,57 ----
static int lookup_colour_palette(const VTermState *state, long index,
VTermColor *col)
{
if(index >= 0 && index < 16) {
! // Normal 8 colours or high intensity - parse as palette 0
return lookup_colour_ansi(state, index, col);
}
else if(index >= 16 && index < 232) {
! // 216-colour cube
index -= 16;
col->blue = ramp6[index % 6];
***************
*** 62,68 ****
return TRUE;
}
else if(index >= 232 && index < 256) {
! /* 24 greyscales */
index -= 232;
col->blue = ramp24[index];
--- 62,68 ----
return TRUE;
}
else if(index >= 232 && index < 256) {
! // 24 greyscales
index -= 232;
col->blue = ramp24[index];
***************
*** 79,85 ****
static int lookup_colour(const VTermState *state, int palette, const long
args[], int argcount, VTermColor *col, int *index)
{
switch(palette) {
! case 2: /* RGB mode - 3 args contain colour values directly */
if(argcount < 3)
return argcount;
--- 79,85 ----
static int lookup_colour(const VTermState *state, int palette, const long
args[], int argcount, VTermColor *col, int *index)
{
switch(palette) {
! case 2: // RGB mode - 3 args contain colour values directly
if(argcount < 3)
return argcount;
***************
*** 90,96 ****
return 3;
! case 5: /* XTerm 256-colour mode */
if(index)
*index = CSI_ARG_OR(args[0], -1);
--- 90,96 ----
return 3;
! case 5: // XTerm 256-colour mode
if(index)
*index = CSI_ARG_OR(args[0], -1);
***************
*** 104,110 ****
}
}
! /* Some conveniences */
static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type
UNUSED, VTermValue *val)
{
--- 104,110 ----
}
}
! // Some conveniences
static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type
UNUSED, VTermValue *val)
{
***************
*** 153,159 ****
{
int col;
! /* 90% grey so that pure white is brighter */
state->default_fg.red = state->default_fg.green = state->default_fg.blue =
240;
state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
state->default_bg.red = state->default_bg.green = state->default_bg.blue =
0;
--- 153,159 ----
{
int col;
! // 90% grey so that pure white is brighter
state->default_fg.red = state->default_fg.green = state->default_fg.blue =
240;
state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
state->default_bg.red = state->default_bg.green = state->default_bg.blue =
0;
***************
*** 232,329 ****
INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int
argcount)
{
! /* SGR - ECMA-48 8.3.117 */
int argi = 0;
int value;
while(argi < argcount) {
! /* This logic is easier to do 'done' backwards; set it true, and make it
! false again in the 'default' case */
int done = 1;
long arg;
switch(arg = CSI_ARG(args[argi])) {
case CSI_ARG_MISSING:
! case 0: /* Reset */
vterm_state_resetpen(state);
break;
! case 1: /* Bold on */
state->pen.bold = 1;
setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
if(state->fg_index > -1 && state->fg_index < 8 &&
state->bold_is_highbright)
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->fg_index +
(state->pen.bold ? 8 : 0));
break;
! case 3: /* Italic on */
state->pen.italic = 1;
setpenattr_bool(state, VTERM_ATTR_ITALIC, 1);
break;
! case 4: /* Underline single */
state->pen.underline = 1;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 1);
break;
! case 5: /* Blink */
state->pen.blink = 1;
setpenattr_bool(state, VTERM_ATTR_BLINK, 1);
break;
! case 7: /* Reverse on */
state->pen.reverse = 1;
setpenattr_bool(state, VTERM_ATTR_REVERSE, 1);
break;
! case 9: /* Strikethrough on */
state->pen.strike = 1;
setpenattr_bool(state, VTERM_ATTR_STRIKE, 1);
break;
case 10: case 11: case 12: case 13: case 14:
! case 15: case 16: case 17: case 18: case 19: /* Select font */
state->pen.font = CSI_ARG(args[argi]) - 10;
setpenattr_int(state, VTERM_ATTR_FONT, state->pen.font);
break;
! case 21: /* Underline double */
state->pen.underline = 2;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 2);
break;
! case 22: /* Bold off */
state->pen.bold = 0;
setpenattr_bool(state, VTERM_ATTR_BOLD, 0);
break;
! case 23: /* Italic and Gothic (currently unsupported) off */
state->pen.italic = 0;
setpenattr_bool(state, VTERM_ATTR_ITALIC, 0);
break;
! case 24: /* Underline off */
state->pen.underline = 0;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 0);
break;
! case 25: /* Blink off */
state->pen.blink = 0;
setpenattr_bool(state, VTERM_ATTR_BLINK, 0);
break;
! case 27: /* Reverse off */
state->pen.reverse = 0;
setpenattr_bool(state, VTERM_ATTR_REVERSE, 0);
break;
! case 29: /* Strikethrough off */
state->pen.strike = 0;
setpenattr_bool(state, VTERM_ATTR_STRIKE, 0);
break;
case 30: case 31: case 32: case 33:
! case 34: case 35: case 36: case 37: /* Foreground colour palette */
value = CSI_ARG(args[argi]) - 30;
state->fg_index = value;
if(state->pen.bold && state->bold_is_highbright)
--- 232,329 ----
INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int
argcount)
{
! // SGR - ECMA-48 8.3.117
int argi = 0;
int value;
while(argi < argcount) {
! // This logic is easier to do 'done' backwards; set it true, and make it
! // false again in the 'default' case
int done = 1;
long arg;
switch(arg = CSI_ARG(args[argi])) {
case CSI_ARG_MISSING:
! case 0: // Reset
vterm_state_resetpen(state);
break;
! case 1: // Bold on
state->pen.bold = 1;
setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
if(state->fg_index > -1 && state->fg_index < 8 &&
state->bold_is_highbright)
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->fg_index +
(state->pen.bold ? 8 : 0));
break;
! case 3: // Italic on
state->pen.italic = 1;
setpenattr_bool(state, VTERM_ATTR_ITALIC, 1);
break;
! case 4: // Underline single
state->pen.underline = 1;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 1);
break;
! case 5: // Blink
state->pen.blink = 1;
setpenattr_bool(state, VTERM_ATTR_BLINK, 1);
break;
! case 7: // Reverse on
state->pen.reverse = 1;
setpenattr_bool(state, VTERM_ATTR_REVERSE, 1);
break;
! case 9: // Strikethrough on
state->pen.strike = 1;
setpenattr_bool(state, VTERM_ATTR_STRIKE, 1);
break;
case 10: case 11: case 12: case 13: case 14:
! case 15: case 16: case 17: case 18: case 19: // Select font
state->pen.font = CSI_ARG(args[argi]) - 10;
setpenattr_int(state, VTERM_ATTR_FONT, state->pen.font);
break;
! case 21: // Underline double
state->pen.underline = 2;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 2);
break;
! case 22: // Bold off
state->pen.bold = 0;
setpenattr_bool(state, VTERM_ATTR_BOLD, 0);
break;
! case 23: // Italic and Gothic (currently unsupported) off
state->pen.italic = 0;
setpenattr_bool(state, VTERM_ATTR_ITALIC, 0);
break;
! case 24: // Underline off
state->pen.underline = 0;
setpenattr_int(state, VTERM_ATTR_UNDERLINE, 0);
break;
! case 25: // Blink off
state->pen.blink = 0;
setpenattr_bool(state, VTERM_ATTR_BLINK, 0);
break;
! case 27: // Reverse off
state->pen.reverse = 0;
setpenattr_bool(state, VTERM_ATTR_REVERSE, 0);
break;
! case 29: // Strikethrough off
state->pen.strike = 0;
setpenattr_bool(state, VTERM_ATTR_STRIKE, 0);
break;
case 30: case 31: case 32: case 33:
! case 34: case 35: case 36: case 37: // Foreground colour palette
value = CSI_ARG(args[argi]) - 30;
state->fg_index = value;
if(state->pen.bold && state->bold_is_highbright)
***************
*** 331,337 ****
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
break;
! case 38: /* Foreground colour alternative palette */
state->fg_index = -1;
if(argcount - argi < 1)
return;
--- 331,337 ----
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
break;
! case 38: // Foreground colour alternative palette
state->fg_index = -1;
if(argcount - argi < 1)
return;
***************
*** 339,358 ****
setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
break;
! case 39: /* Foreground colour default */
state->fg_index = -1;
state->pen.fg = state->default_fg;
setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
break;
case 40: case 41: case 42: case 43:
! case 44: case 45: case 46: case 47: /* Background colour palette */
value = CSI_ARG(args[argi]) - 40;
state->bg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
break;
! case 48: /* Background colour alternative palette */
state->bg_index = -1;
if(argcount - argi < 1)
return;
--- 339,358 ----
setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
break;
! case 39: // Foreground colour default
state->fg_index = -1;
state->pen.fg = state->default_fg;
setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
break;
case 40: case 41: case 42: case 43:
! case 44: case 45: case 46: case 47: // Background colour palette
value = CSI_ARG(args[argi]) - 40;
state->bg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
break;
! case 48: // Background colour alternative palette
state->bg_index = -1;
if(argcount - argi < 1)
return;
***************
*** 360,380 ****
setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
break;
! case 49: /* Default background */
state->bg_index = -1;
state->pen.bg = state->default_bg;
setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
break;
case 90: case 91: case 92: case 93:
! case 94: case 95: case 96: case 97: /* Foreground colour high-intensity
palette */
value = CSI_ARG(args[argi]) - 90 + 8;
state->fg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
break;
case 100: case 101: case 102: case 103:
! case 104: case 105: case 106: case 107: /* Background colour
high-intensity palette */
value = CSI_ARG(args[argi]) - 100 + 8;
state->bg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
--- 360,380 ----
setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
break;
! case 49: // Default background
state->bg_index = -1;
state->pen.bg = state->default_bg;
setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
break;
case 90: case 91: case 92: case 93:
! case 94: case 95: case 96: case 97: // Foreground colour high-intensity
palette
value = CSI_ARG(args[argi]) - 90 + 8;
state->fg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
break;
case 100: case 101: case 102: case 103:
! case 104: case 105: case 106: case 107: // Background colour
high-intensity palette
value = CSI_ARG(args[argi]) - 100 + 8;
state->bg_index = value;
set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
***************
*** 432,438 ****
args[argi++] = state->fg_index;
}
else if(state->fg_index == -1) {
! /* Send palette 2 if the actual FG colour is not default */
if(state->pen.fg.red != state->default_fg.red ||
state->pen.fg.green != state->default_fg.green ||
state->pen.fg.blue != state->default_fg.blue ) {
--- 432,438 ----
args[argi++] = state->fg_index;
}
else if(state->fg_index == -1) {
! // Send palette 2 if the actual FG colour is not default
if(state->pen.fg.red != state->default_fg.red ||
state->pen.fg.green != state->default_fg.green ||
state->pen.fg.blue != state->default_fg.blue ) {
***************
*** 454,460 ****
args[argi++] = state->bg_index;
}
else if(state->bg_index == -1) {
! /* Send palette 2 if the actual BG colour is not default */
if(state->pen.bg.red != state->default_bg.red ||
state->pen.bg.green != state->default_bg.green ||
state->pen.bg.blue != state->default_bg.blue ) {
--- 454,460 ----
args[argi++] = state->bg_index;
}
else if(state->bg_index == -1) {
! // Send palette 2 if the actual BG colour is not default
if(state->pen.bg.red != state->default_bg.red ||
state->pen.bg.green != state->default_bg.green ||
state->pen.bg.blue != state->default_bg.blue ) {
*** ../vim-8.0.1756/src/libvterm/src/screen.c 2018-03-25 16:20:18.517264034
+0200
--- src/libvterm/src/screen.c 2018-04-24 18:13:56.481237547 +0200
***************
*** 115,131 ****
/* Emit damage longer than one row. Try to merge with existing damage in
* the same row */
if(rect.end_row > rect.start_row + 1) {
! /* Bigger than 1 line - flush existing, emit this */
vterm_screen_flush_damage(screen);
emit = rect;
}
else if(screen->damaged.start_row == -1) {
! /* None stored yet */
screen->damaged = rect;
return;
}
else if(rect.start_row == screen->damaged.start_row) {
! /* Merge with the stored line */
if(screen->damaged.start_col > rect.start_col)
screen->damaged.start_col = rect.start_col;
if(screen->damaged.end_col < rect.end_col)
--- 115,131 ----
/* Emit damage longer than one row. Try to merge with existing damage in
* the same row */
if(rect.end_row > rect.start_row + 1) {
! // Bigger than 1 line - flush existing, emit this
vterm_screen_flush_damage(screen);
emit = rect;
}
else if(screen->damaged.start_row == -1) {
! // None stored yet
screen->damaged = rect;
return;
}
else if(rect.start_row == screen->damaged.start_row) {
! // Merge with the stored line
if(screen->damaged.start_col > rect.start_col)
screen->damaged.start_col = rect.start_col;
if(screen->damaged.end_col < rect.end_col)
***************
*** 133,139 ****
return;
}
else {
! /* Emit the currently stored line, store a new one */
emit = screen->damaged;
screen->damaged = rect;
}
--- 133,139 ----
return;
}
else {
! // Emit the currently stored line, store a new one
emit = screen->damaged;
screen->damaged = rect;
}
***************
*** 208,216 ****
VTermScreen *screen = user;
if(screen->callbacks && screen->callbacks->sb_pushline &&
! dest.start_row == 0 && dest.start_col == 0 && /* starts top-left corner
*/
! dest.end_col == screen->cols && /* full width */
! screen->buffer == screen->buffers[0]) { /* not altscreen */
VTermPos pos;
for(pos.row = 0; pos.row < src.start_row; pos.row++) {
for(pos.col = 0; pos.col < screen->cols; pos.col++)
--- 208,216 ----
VTermScreen *screen = user;
if(screen->callbacks && screen->callbacks->sb_pushline &&
! dest.start_row == 0 && dest.start_col == 0 && // starts top-left corner
! dest.end_col == screen->cols && // full width
! screen->buffer == screen->buffers[0]) { // not altscreen
VTermPos pos;
for(pos.row = 0; pos.row < src.start_row; pos.row++) {
for(pos.col = 0; pos.col < screen->cols; pos.col++)
***************
*** 252,258 ****
if(screen->callbacks && screen->callbacks->moverect) {
if(screen->damage_merge != VTERM_DAMAGE_SCROLL)
! /* Avoid an infinite loop */
vterm_screen_flush_damage(screen);
if((*screen->callbacks->moverect)(dest, src, screen->cbdata))
--- 252,258 ----
if(screen->callbacks && screen->callbacks->moverect) {
if(screen->damage_merge != VTERM_DAMAGE_SCROLL)
! // Avoid an infinite loop
vterm_screen_flush_damage(screen);
if((*screen->callbacks->moverect)(dest, src, screen->cbdata))
***************
*** 488,498 ****
int first_blank_row;
if(!is_altscreen && new_rows < old_rows) {
! /* Fewer rows - determine if we're going to scroll at all, and if so, push
! those lines to scrollback */
VTermPos pos = { 0, 0 };
VTermPos cursor = screen->state->pos;
! /* Find the first blank row after the cursor. */
for(pos.row = old_rows - 1; pos.row >= new_rows; pos.row--)
if(!vterm_screen_is_eol(screen, pos) || cursor.row == pos.row)
break;
--- 488,498 ----
int first_blank_row;
if(!is_altscreen && new_rows < old_rows) {
! // Fewer rows - determine if we're going to scroll at all, and if so, push
! // those lines to scrollback
VTermPos pos = { 0, 0 };
VTermPos cursor = screen->state->pos;
! // Find the first blank row after the cursor.
for(pos.row = old_rows - 1; pos.row >= new_rows; pos.row--)
if(!vterm_screen_is_eol(screen, pos) || cursor.row == pos.row)
break;
***************
*** 702,711 ****
int i;
if(cell->chars[0] == 0)
! /* Erased cell, might need a space */
padding++;
else if(cell->chars[0] == (uint32_t)-1)
! /* Gap behind a double-width char, do nothing */
;
else {
while(padding) {
--- 702,711 ----
int i;
if(cell->chars[0] == 0)
! // Erased cell, might need a space
padding++;
else if(cell->chars[0] == (uint32_t)-1)
! // Gap behind a double-width char, do nothing
;
else {
while(padding) {
***************
*** 912,918 ****
ScreenCell *target = getcell(screen, pos.row, pos.col);
! /* TODO: bounds check */
extent->start_row = pos.row;
extent->end_row = pos.row + 1;
--- 912,918 ----
ScreenCell *target = getcell(screen, pos.row, pos.col);
! // TODO: bounds check
extent->start_row = pos.row;
extent->end_row = pos.row + 1;
*** ../vim-8.0.1756/src/libvterm/src/state.c 2018-03-25 16:20:18.517264034
+0200
--- src/libvterm/src/state.c 2018-04-24 18:21:11.918624160 +0200
***************
*** 101,107 ****
else if(rightward < -cols)
rightward = -cols;
! /* Update lineinfo if full line */
if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) {
int height = rect.end_row - rect.start_row - abs(downward);
--- 101,107 ----
else if(rightward < -cols)
rightward = -cols;
! // Update lineinfo if full line
if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) {
int height = rect.end_row - rect.start_row - abs(downward);
***************
*** 221,227 ****
info.doublewidth = DWL_OFF;
else if(dwl == DWL_ON)
info.doublewidth = DWL_ON;
! /* else -1 to ignore */
if(dhl == DHL_OFF)
info.doubleheight = DHL_OFF;
--- 221,227 ----
info.doublewidth = DWL_OFF;
else if(dwl == DWL_ON)
info.doublewidth = DWL_ON;
! // else -1 to ignore
if(dhl == DHL_OFF)
info.doubleheight = DHL_OFF;
***************
*** 248,255 ****
VTermPos oldpos = state->pos;
! /* We'll have at most len codepoints, plus one from a previous incomplete
! * sequence. */
codepoints = vterm_allocator_malloc(state->vt, (len + 1) *
sizeof(uint32_t));
encoding =
--- 248,255 ----
VTermPos oldpos = state->pos;
! // We'll have at most len codepoints, plus one from a previous incomplete
! // sequence.
codepoints = vterm_allocator_malloc(state->vt, (len + 1) *
sizeof(uint32_t));
encoding =
***************
*** 317,323 ****
}
for(; i < npoints; i++) {
! /* Try to find combining characters following this */
int glyph_starts = i;
int glyph_ends;
int width = 0;
--- 317,323 ----
}
for(; i < npoints; i++) {
! // Try to find combining characters following this
int glyph_starts = i;
int glyph_ends;
int width = 0;
***************
*** 422,475 ****
VTermPos oldpos = state->pos;
switch(control) {
! case 0x07: /* BEL - ECMA-48 8.3.3 */
if(state->callbacks && state->callbacks->bell)
(*state->callbacks->bell)(state->cbdata);
break;
! case 0x08: /* BS - ECMA-48 8.3.5 */
if(state->pos.col > 0)
state->pos.col--;
break;
! case 0x09: /* HT - ECMA-48 8.3.60 */
tab(state, 1, +1);
break;
! case 0x0a: /* LF - ECMA-48 8.3.74 */
! case 0x0b: /* VT */
! case 0x0c: /* FF */
linefeed(state);
if(state->mode.newline)
state->pos.col = 0;
break;
! case 0x0d: /* CR - ECMA-48 8.3.15 */
state->pos.col = 0;
break;
! case 0x0e: /* LS1 - ECMA-48 8.3.76 */
state->gl_set = 1;
break;
! case 0x0f: /* LS0 - ECMA-48 8.3.75 */
state->gl_set = 0;
break;
! case 0x84: /* IND - DEPRECATED but implemented for completeness */
linefeed(state);
break;
! case 0x85: /* NEL - ECMA-48 8.3.86 */
linefeed(state);
state->pos.col = 0;
break;
! case 0x88: /* HTS - ECMA-48 8.3.62 */
set_col_tabstop(state, state->pos.col);
break;
! case 0x8d: /* RI - ECMA-48 8.3.104 */
if(state->pos.row == state->scrollregion_top) {
VTermRect rect;
rect.start_row = state->scrollregion_top;
--- 422,475 ----
VTermPos oldpos = state->pos;
switch(control) {
! case 0x07: // BEL - ECMA-48 8.3.3
if(state->callbacks && state->callbacks->bell)
(*state->callbacks->bell)(state->cbdata);
break;
! case 0x08: // BS - ECMA-48 8.3.5
if(state->pos.col > 0)
state->pos.col--;
break;
! case 0x09: // HT - ECMA-48 8.3.60
tab(state, 1, +1);
break;
! case 0x0a: // LF - ECMA-48 8.3.74
! case 0x0b: // VT
! case 0x0c: // FF
linefeed(state);
if(state->mode.newline)
state->pos.col = 0;
break;
! case 0x0d: // CR - ECMA-48 8.3.15
state->pos.col = 0;
break;
! case 0x0e: // LS1 - ECMA-48 8.3.76
state->gl_set = 1;
break;
! case 0x0f: // LS0 - ECMA-48 8.3.75
state->gl_set = 0;
break;
! case 0x84: // IND - DEPRECATED but implemented for completeness
linefeed(state);
break;
! case 0x85: // NEL - ECMA-48 8.3.86
linefeed(state);
state->pos.col = 0;
break;
! case 0x88: // HTS - ECMA-48 8.3.62
set_col_tabstop(state, state->pos.col);
break;
! case 0x8d: // RI - ECMA-48 8.3.104
if(state->pos.row == state->scrollregion_top) {
VTermRect rect;
rect.start_row = state->scrollregion_top;
***************
*** 483,493 ****
state->pos.row--;
break;
! case 0x8e: /* SS2 - ECMA-48 8.3.141 */
state->gsingle_set = 2;
break;
! case 0x8f: /* SS3 - ECMA-48 8.3.142 */
state->gsingle_set = 3;
break;
--- 483,493 ----
state->pos.row--;
break;
! case 0x8e: // SS2 - ECMA-48 8.3.141
state->gsingle_set = 2;
break;
! case 0x8f: // SS3 - ECMA-48 8.3.142
state->gsingle_set = 3;
break;
***************
*** 580,590 ****
return 0;
switch(bytes[1]) {
! case 'F': /* S7C1T */
state->vt->mode.ctrl8bit = 0;
break;
! case 'G': /* S8C1T */
state->vt->mode.ctrl8bit = 1;
break;
--- 580,590 ----
return 0;
switch(bytes[1]) {
! case 'F': // S7C1T
state->vt->mode.ctrl8bit = 0;
break;
! case 'G': // S8C1T
state->vt->mode.ctrl8bit = 1;
break;
***************
*** 598,628 ****
return 0;
switch(bytes[1]) {
! case '3': /* DECDHL top */
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP);
break;
! case '4': /* DECDHL bottom */
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM);
break;
! case '5': /* DECSWL */
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF);
break;
! case '6': /* DECDWL */
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF);
break;
! case '8': /* DECALN */
{
VTermPos pos;
uint32_t E[] = { 'E', 0 };
--- 598,628 ----
return 0;
switch(bytes[1]) {
! case '3': // DECDHL top
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP);
break;
! case '4': // DECDHL bottom
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM);
break;
! case '5': // DECSWL
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF);
break;
! case '6': // DECDWL
if(state->mode.leftrightmargin)
break;
set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF);
break;
! case '8': // DECALN
{
VTermPos pos;
uint32_t E[] = { 'E', 0 };
***************
*** 637,643 ****
}
return 2;
! case '(': case ')': case '*': case '+': /* SCS */
if(len != 2)
return 0;
--- 637,643 ----
}
return 2;
! case '(': case ')': case '*': case '+': // SCS
if(len != 2)
return 0;
***************
*** 655,680 ****
return 2;
! case '7': /* DECSC */
savecursor(state, 1);
return 1;
! case '8': /* DECRC */
savecursor(state, 0);
return 1;
! case '<': /* Ignored by VT100. Used in VT52 mode to switch up to VT100 */
return 1;
! case '=': /* DECKPAM */
state->mode.keypad = 1;
return 1;
! case '>': /* DECKPNM */
state->mode.keypad = 0;
return 1;
! case 'c': /* RIS - ECMA-48 8.3.105 */
{
VTermPos oldpos = state->pos;
vterm_state_reset(state, 1);
--- 655,680 ----
return 2;
! case '7': // DECSC
savecursor(state, 1);
return 1;
! case '8': // DECRC
savecursor(state, 0);
return 1;
! case '<': // Ignored by VT100. Used in VT52 mode to switch up to VT100
return 1;
! case '=': // DECKPAM
state->mode.keypad = 1;
return 1;
! case '>': // DECKPNM
state->mode.keypad = 0;
return 1;
! case 'c': // RIS - ECMA-48 8.3.105
{
VTermPos oldpos = state->pos;
vterm_state_reset(state, 1);
***************
*** 683,705 ****
return 1;
}
! case 'n': /* LS2 - ECMA-48 8.3.78 */
state->gl_set = 2;
return 1;
! case 'o': /* LS3 - ECMA-48 8.3.80 */
state->gl_set = 3;
return 1;
! case '~': /* LS1R - ECMA-48 8.3.77 */
state->gr_set = 1;
return 1;
! case '}': /* LS2R - ECMA-48 8.3.79 */
state->gr_set = 2;
return 1;
! case '|': /* LS3R - ECMA-48 8.3.81 */
state->gr_set = 3;
return 1;
--- 683,705 ----
return 1;
}
! case 'n': // LS2 - ECMA-48 8.3.78
state->gl_set = 2;
return 1;
! case 'o': // LS3 - ECMA-48 8.3.80
state->gl_set = 3;
return 1;
! case '~': // LS1R - ECMA-48 8.3.77
state->gr_set = 1;
return 1;
! case '}': // LS2R - ECMA-48 8.3.79
state->gr_set = 2;
return 1;
! case '|': // LS3R - ECMA-48 8.3.81
state->gr_set = 3;
return 1;
***************
*** 711,721 ****
static void set_mode(VTermState *state, int num, int val)
{
switch(num) {
! case 4: /* IRM - ECMA-48 7.2.10 */
state->mode.insert = val;
break;
! case 20: /* LNM - ANSI X3.4-1977 */
state->mode.newline = val;
break;
--- 711,721 ----
static void set_mode(VTermState *state, int num, int val)
{
switch(num) {
! case 4: // IRM - ECMA-48 7.2.10
state->mode.insert = val;
break;
! case 20: // LNM - ANSI X3.4-1977
state->mode.newline = val;
break;
***************
*** 732,742 ****
state->mode.cursor = val;
break;
! case 5: /* DECSCNM - screen mode */
settermprop_bool(state, VTERM_PROP_REVERSE, val);
break;
! case 6: /* DECOM - origin mode */
{
VTermPos oldpos = state->pos;
state->mode.origin = val;
--- 732,742 ----
state->mode.cursor = val;
break;
! case 5: // DECSCNM - screen mode
settermprop_bool(state, VTERM_PROP_REVERSE, val);
break;
! case 6: // DECOM - origin mode
{
VTermPos oldpos = state->pos;
state->mode.origin = val;
***************
*** 758,770 ****
settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val);
break;
! case 69: /* DECVSSM - vertical split screen mode */
! /* DECLRMM - left/right margin mode */
state->mode.leftrightmargin = val;
if(val) {
int row;
! /* Setting DECVSSM must clear doublewidth/doubleheight state of every
line */
for(row = 0; row < state->rows; row++)
set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF);
}
--- 758,770 ----
settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val);
break;
! case 69: // DECVSSM - vertical split screen mode
! // DECLRMM - left/right margin mode
state->mode.leftrightmargin = val;
if(val) {
int row;
! // Setting DECVSSM must clear doublewidth/doubleheight state of every
line
for(row = 0; row < state->rows; row++)
set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF);
}
***************
*** 911,917 ****
int selective;
if(leader && leader[0]) {
! if(leader[1]) /* longer than 1 char */
return 0;
switch(leader[0]) {
--- 911,917 ----
int selective;
if(leader && leader[0]) {
! if(leader[1]) // longer than 1 char
return 0;
switch(leader[0]) {
***************
*** 925,931 ****
}
if(intermed && intermed[0]) {
! if(intermed[1]) /* longer than 1 char */
return 0;
switch(intermed[0]) {
--- 925,931 ----
}
if(intermed && intermed[0]) {
! if(intermed[1]) // longer than 1 char
return 0;
switch(intermed[0]) {
***************
*** 949,955 ****
#define INTERMED(i,b) ((i << 16) | b)
switch(intermed_byte << 16 | leader_byte << 8 | command) {
! case 0x40: /* ICH - ECMA-48 8.3.64 */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 949,955 ----
#define INTERMED(i,b) ((i << 16) | b)
switch(intermed_byte << 16 | leader_byte << 8 | command) {
! case 0x40: // ICH - ECMA-48 8.3.64
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 967,1020 ****
break;
! case 0x41: /* CUU - ECMA-48 8.3.22 */
count = CSI_ARG_COUNT(args[0]);
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x42: /* CUD - ECMA-48 8.3.19 */
count = CSI_ARG_COUNT(args[0]);
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x43: /* CUF - ECMA-48 8.3.20 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col += count;
state->at_phantom = 0;
break;
! case 0x44: /* CUB - ECMA-48 8.3.18 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col -= count;
state->at_phantom = 0;
break;
! case 0x45: /* CNL - ECMA-48 8.3.12 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col = 0;
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x46: /* CPL - ECMA-48 8.3.13 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col = 0;
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x47: /* CHA - ECMA-48 8.3.9 */
val = CSI_ARG_OR(args[0], 1);
state->pos.col = val-1;
state->at_phantom = 0;
break;
! case 0x48: /* CUP - ECMA-48 8.3.21 */
row = CSI_ARG_OR(args[0], 1);
col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
! /* zero-based */
state->pos.row = row-1;
state->pos.col = col-1;
if(state->mode.origin) {
--- 967,1020 ----
break;
! case 0x41: // CUU - ECMA-48 8.3.22
count = CSI_ARG_COUNT(args[0]);
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x42: // CUD - ECMA-48 8.3.19
count = CSI_ARG_COUNT(args[0]);
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x43: // CUF - ECMA-48 8.3.20
count = CSI_ARG_COUNT(args[0]);
state->pos.col += count;
state->at_phantom = 0;
break;
! case 0x44: // CUB - ECMA-48 8.3.18
count = CSI_ARG_COUNT(args[0]);
state->pos.col -= count;
state->at_phantom = 0;
break;
! case 0x45: // CNL - ECMA-48 8.3.12
count = CSI_ARG_COUNT(args[0]);
state->pos.col = 0;
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x46: // CPL - ECMA-48 8.3.13
count = CSI_ARG_COUNT(args[0]);
state->pos.col = 0;
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x47: // CHA - ECMA-48 8.3.9
val = CSI_ARG_OR(args[0], 1);
state->pos.col = val-1;
state->at_phantom = 0;
break;
! case 0x48: // CUP - ECMA-48 8.3.21
row = CSI_ARG_OR(args[0], 1);
col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
! // zero-based
state->pos.row = row-1;
state->pos.col = col-1;
if(state->mode.origin) {
***************
*** 1024,1036 ****
state->at_phantom = 0;
break;
! case 0x49: /* CHT - ECMA-48 8.3.10 */
count = CSI_ARG_COUNT(args[0]);
tab(state, count, +1);
break;
! case 0x4a: /* ED - ECMA-48 8.3.39 */
! case LEADER('?', 0x4a): /* DECSED - Selective Erase in Display */
selective = (leader_byte == '?');
switch(CSI_ARG(args[0])) {
case CSI_ARG_MISSING:
--- 1024,1036 ----
state->at_phantom = 0;
break;
! case 0x49: // CHT - ECMA-48 8.3.10
count = CSI_ARG_COUNT(args[0]);
tab(state, count, +1);
break;
! case 0x4a: // ED - ECMA-48 8.3.39
! case LEADER('?', 0x4a): // DECSED - Selective Erase in Display
selective = (leader_byte == '?');
switch(CSI_ARG(args[0])) {
case CSI_ARG_MISSING:
***************
*** 1072,1079 ****
}
break;
! case 0x4b: /* EL - ECMA-48 8.3.41 */
! case LEADER('?', 0x4b): /* DECSEL - Selective Erase in Line */
selective = (leader_byte == '?');
rect.start_row = state->pos.row;
rect.end_row = state->pos.row + 1;
--- 1072,1079 ----
}
break;
! case 0x4b: // EL - ECMA-48 8.3.41
! case LEADER('?', 0x4b): // DECSEL - Selective Erase in Line
selective = (leader_byte == '?');
rect.start_row = state->pos.row;
rect.end_row = state->pos.row + 1;
***************
*** 1095,1101 ****
break;
! case 0x4c: /* IL - ECMA-48 8.3.67 */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 1095,1101 ----
break;
! case 0x4c: // IL - ECMA-48 8.3.67
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 1110,1116 ****
break;
! case 0x4d: /* DL - ECMA-48 8.3.32 */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 1110,1116 ----
break;
! case 0x4d: // DL - ECMA-48 8.3.32
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 1125,1131 ****
break;
! case 0x50: /* DCH - ECMA-48 8.3.26 */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 1125,1131 ----
break;
! case 0x50: // DCH - ECMA-48 8.3.26
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 1143,1149 ****
break;
! case 0x53: /* SU - ECMA-48 8.3.147 */
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->scrollregion_top;
--- 1143,1149 ----
break;
! case 0x53: // SU - ECMA-48 8.3.147
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->scrollregion_top;
***************
*** 1155,1161 ****
break;
! case 0x54: /* SD - ECMA-48 8.3.113 */
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->scrollregion_top;
--- 1155,1161 ----
break;
! case 0x54: // SD - ECMA-48 8.3.113
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->scrollregion_top;
***************
*** 1167,1173 ****
break;
! case 0x58: /* ECH - ECMA-48 8.3.38 */
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->pos.row;
--- 1167,1173 ----
break;
! case 0x58: // ECH - ECMA-48 8.3.38
count = CSI_ARG_COUNT(args[0]);
rect.start_row = state->pos.row;
***************
*** 1179,1214 ****
erase(state, rect, 0);
break;
! case 0x5a: /* CBT - ECMA-48 8.3.7 */
count = CSI_ARG_COUNT(args[0]);
tab(state, count, -1);
break;
! case 0x60: /* HPA - ECMA-48 8.3.57 */
col = CSI_ARG_OR(args[0], 1);
state->pos.col = col-1;
state->at_phantom = 0;
break;
! case 0x61: /* HPR - ECMA-48 8.3.59 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col += count;
state->at_phantom = 0;
break;
! case 0x63: /* DA - ECMA-48 8.3.24 */
val = CSI_ARG_OR(args[0], 0);
if(val == 0)
! /* DEC VT100 response */
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c");
break;
! case LEADER('>', 0x63): /* DEC secondary Device Attributes */
! /* This returns xterm version number 100. */
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100,
0);
break;
! case 0x64: /* VPA - ECMA-48 8.3.158 */
row = CSI_ARG_OR(args[0], 1);
state->pos.row = row-1;
if(state->mode.origin)
--- 1179,1214 ----
erase(state, rect, 0);
break;
! case 0x5a: // CBT - ECMA-48 8.3.7
count = CSI_ARG_COUNT(args[0]);
tab(state, count, -1);
break;
! case 0x60: // HPA - ECMA-48 8.3.57
col = CSI_ARG_OR(args[0], 1);
state->pos.col = col-1;
state->at_phantom = 0;
break;
! case 0x61: // HPR - ECMA-48 8.3.59
count = CSI_ARG_COUNT(args[0]);
state->pos.col += count;
state->at_phantom = 0;
break;
! case 0x63: // DA - ECMA-48 8.3.24
val = CSI_ARG_OR(args[0], 0);
if(val == 0)
! // DEC VT100 response
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c");
break;
! case LEADER('>', 0x63): // DEC secondary Device Attributes
! // This returns xterm version number 100.
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100,
0);
break;
! case 0x64: // VPA - ECMA-48 8.3.158
row = CSI_ARG_OR(args[0], 1);
state->pos.row = row-1;
if(state->mode.origin)
***************
*** 1216,1231 ****
state->at_phantom = 0;
break;
! case 0x65: /* VPR - ECMA-48 8.3.160 */
count = CSI_ARG_COUNT(args[0]);
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x66: /* HVP - ECMA-48 8.3.63 */
row = CSI_ARG_OR(args[0], 1);
col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
! /* zero-based */
state->pos.row = row-1;
state->pos.col = col-1;
if(state->mode.origin) {
--- 1216,1231 ----
state->at_phantom = 0;
break;
! case 0x65: // VPR - ECMA-48 8.3.160
count = CSI_ARG_COUNT(args[0]);
state->pos.row += count;
state->at_phantom = 0;
break;
! case 0x66: // HVP - ECMA-48 8.3.63
row = CSI_ARG_OR(args[0], 1);
col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
! // zero-based
state->pos.row = row-1;
state->pos.col = col-1;
if(state->mode.origin) {
***************
*** 1235,1241 ****
state->at_phantom = 0;
break;
! case 0x67: /* TBC - ECMA-48 8.3.154 */
val = CSI_ARG_OR(args[0], 0);
switch(val) {
--- 1235,1241 ----
state->at_phantom = 0;
break;
! case 0x67: // TBC - ECMA-48 8.3.154
val = CSI_ARG_OR(args[0], 0);
switch(val) {
***************
*** 1257,1300 ****
}
break;
! case 0x68: /* SM - ECMA-48 8.3.125 */
if(!CSI_ARG_IS_MISSING(args[0]))
set_mode(state, CSI_ARG(args[0]), 1);
break;
! case LEADER('?', 0x68): /* DEC private mode set */
if(!CSI_ARG_IS_MISSING(args[0]))
set_dec_mode(state, CSI_ARG(args[0]), 1);
break;
! case 0x6a: /* HPB - ECMA-48 8.3.58 */
count = CSI_ARG_COUNT(args[0]);
state->pos.col -= count;
state->at_phantom = 0;
break;
! case 0x6b: /* VPB - ECMA-48 8.3.159 */
count = CSI_ARG_COUNT(args[0]);
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x6c: /* RM - ECMA-48 8.3.106 */
if(!CSI_ARG_IS_MISSING(args[0]))
set_mode(state, CSI_ARG(args[0]), 0);
break;
! case LEADER('?', 0x6c): /* DEC private mode reset */
if(!CSI_ARG_IS_MISSING(args[0]))
set_dec_mode(state, CSI_ARG(args[0]), 0);
break;
! case 0x6d: /* SGR - ECMA-48 8.3.117 */
vterm_state_setpen(state, args, argcount);
break;
! case 0x6e: /* DSR - ECMA-48 8.3.35 */
! case LEADER('?', 0x6e): /* DECDSR */
val = CSI_ARG_OR(args[0], 0);
{
--- 1257,1300 ----
}
break;
! case 0x68: // SM - ECMA-48 8.3.125
if(!CSI_ARG_IS_MISSING(args[0]))
set_mode(state, CSI_ARG(args[0]), 1);
break;
! case LEADER('?', 0x68): // DEC private mode set
if(!CSI_ARG_IS_MISSING(args[0]))
set_dec_mode(state, CSI_ARG(args[0]), 1);
break;
! case 0x6a: // HPB - ECMA-48 8.3.58
count = CSI_ARG_COUNT(args[0]);
state->pos.col -= count;
state->at_phantom = 0;
break;
! case 0x6b: // VPB - ECMA-48 8.3.159
count = CSI_ARG_COUNT(args[0]);
state->pos.row -= count;
state->at_phantom = 0;
break;
! case 0x6c: // RM - ECMA-48 8.3.106
if(!CSI_ARG_IS_MISSING(args[0]))
set_mode(state, CSI_ARG(args[0]), 0);
break;
! case LEADER('?', 0x6c): // DEC private mode reset
if(!CSI_ARG_IS_MISSING(args[0]))
set_dec_mode(state, CSI_ARG(args[0]), 0);
break;
! case 0x6d: // SGR - ECMA-48 8.3.117
vterm_state_setpen(state, args, argcount);
break;
! case 0x6e: // DSR - ECMA-48 8.3.35
! case LEADER('?', 0x6e): // DECDSR
val = CSI_ARG_OR(args[0], 0);
{
***************
*** 1302,1313 ****
switch(val) {
case 0: case 1: case 2: case 3: case 4:
! /* ignore - these are replies */
break;
case 5:
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark);
break;
! case 6: /* CPR - cursor position report */
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark,
state->pos.row + 1, state->pos.col + 1);
break;
}
--- 1302,1313 ----
switch(val) {
case 0: case 1: case 2: case 3: case 4:
! // ignore - these are replies
break;
case 5:
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark);
break;
! case 6: // CPR - cursor position report
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark,
state->pos.row + 1, state->pos.col + 1);
break;
}
***************
*** 1315,1321 ****
break;
! case LEADER('!', 0x70): /* DECSTR - DEC soft terminal reset */
vterm_state_reset(state, 0);
break;
--- 1315,1321 ----
break;
! case LEADER('!', 0x70): // DECSTR - DEC soft terminal reset
vterm_state_reset(state, 0);
break;
***************
*** 1323,1329 ****
request_dec_mode(state, CSI_ARG(args[0]));
break;
! case INTERMED(' ', 0x71): /* DECSCUSR - DEC set cursor shape */
val = CSI_ARG_OR(args[0], 1);
switch(val) {
--- 1323,1329 ----
request_dec_mode(state, CSI_ARG(args[0]));
break;
! case INTERMED(' ', 0x71): // DECSCUSR - DEC set cursor shape
val = CSI_ARG_OR(args[0], 1);
switch(val) {
***************
*** 1355,1361 ****
break;
! case INTERMED('"', 0x71): /* DECSCA - DEC select character protection
attribute */
val = CSI_ARG_OR(args[0], 0);
switch(val) {
--- 1355,1361 ----
break;
! case INTERMED('"', 0x71): // DECSCA - DEC select character protection
attribute
val = CSI_ARG_OR(args[0], 0);
switch(val) {
***************
*** 1369,1375 ****
break;
! case 0x72: /* DECSTBM - DEC custom */
state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1;
state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1])
? -1 : CSI_ARG(args[1]);
LBOUND(state->scrollregion_top, 0);
--- 1369,1375 ----
break;
! case 0x72: // DECSTBM - DEC custom
state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1;
state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1])
? -1 : CSI_ARG(args[1]);
LBOUND(state->scrollregion_top, 0);
***************
*** 1381,1395 ****
UBOUND(state->scrollregion_bottom, state->rows);
if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) {
! /* Invalid */
state->scrollregion_top = 0;
state->scrollregion_bottom = -1;
}
break;
! case 0x73: /* DECSLRM - DEC custom */
! /* Always allow setting these margins, just they won't take effect
without DECVSSM */
state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1;
state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ?
-1 : CSI_ARG(args[1]);
LBOUND(state->scrollregion_left, 0);
--- 1381,1395 ----
UBOUND(state->scrollregion_bottom, state->rows);
if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) {
! // Invalid
state->scrollregion_top = 0;
state->scrollregion_bottom = -1;
}
break;
! case 0x73: // DECSLRM - DEC custom
! // Always allow setting these margins, just they won't take effect
without DECVSSM
state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1;
state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ?
-1 : CSI_ARG(args[1]);
LBOUND(state->scrollregion_left, 0);
***************
*** 1402,1408 ****
if(state->scrollregion_right > -1 &&
state->scrollregion_right <= state->scrollregion_left) {
! /* Invalid */
state->scrollregion_left = 0;
state->scrollregion_right = -1;
}
--- 1402,1408 ----
if(state->scrollregion_right > -1 &&
state->scrollregion_right <= state->scrollregion_left) {
! // Invalid
state->scrollregion_left = 0;
state->scrollregion_right = -1;
}
***************
*** 1417,1423 ****
}
break;
! case INTERMED('\'', 0x7D): /* DECIC */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 1417,1423 ----
}
break;
! case INTERMED('\'', 0x7D): // DECIC
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 1432,1438 ****
break;
! case INTERMED('\'', 0x7E): /* DECDC */
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
--- 1432,1438 ----
break;
! case INTERMED('\'', 0x7E): // DECDC
count = CSI_ARG_COUNT(args[0]);
if(!is_cursor_in_scrollregion(state))
***************
*** 1545,1551 ****
{
if(cmdlen == 1)
switch(command[0]) {
! case 'm': /* Query SGR */
{
long args[20];
int argc = vterm_state_getpen(state, args,
sizeof(args)/sizeof(args[0]));
--- 1545,1551 ----
{
if(cmdlen == 1)
switch(command[0]) {
! case 'm': // Query SGR
{
long args[20];
int argc = vterm_state_getpen(state, args,
sizeof(args)/sizeof(args[0]));
***************
*** 1561,1570 ****
vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
}
return;
! case 'r': /* Query DECSTBM */
vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr",
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
return;
! case 's': /* Query DECSLRM */
vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds",
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
return;
}
--- 1561,1570 ----
vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
}
return;
! case 'r': // Query DECSTBM
vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr",
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
return;
! case 's': // Query DECSLRM
vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds",
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
return;
}
***************
*** 1779,1785 ****
state->protected_cell = 0;
! /* Initialise the props */
settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1);
settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1);
settermprop_int (state, VTERM_PROP_CURSORSHAPE,
VTERM_PROP_CURSORSHAPE_BLOCK);
--- 1779,1785 ----
state->protected_cell = 0;
! // Initialise the props
settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1);
settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1);
settermprop_int (state, VTERM_PROP_CURSORSHAPE,
VTERM_PROP_CURSORSHAPE_BLOCK);
***************
*** 1859,1865 ****
case VTERM_PROP_TITLE:
case VTERM_PROP_ICONNAME:
case VTERM_PROP_CURSORCOLOR:
! /* we don't store these, just transparently pass through */
return 1;
case VTERM_PROP_CURSORVISIBLE:
state->mode.cursor_visible = val->boolean;
--- 1859,1865 ----
case VTERM_PROP_TITLE:
case VTERM_PROP_ICONNAME:
case VTERM_PROP_CURSORCOLOR:
! // we don't store these, just transparently pass through
return 1;
case VTERM_PROP_CURSORVISIBLE:
state->mode.cursor_visible = val->boolean;
*** ../vim-8.0.1756/src/libvterm/src/unicode.c 2017-08-22 22:12:12.936882219
+0200
--- src/libvterm/src/unicode.c 2018-04-24 18:21:55.382363889 +0200
***************
*** 1,11 ****
#include "vterm_internal.h"
! /* ### The following from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
! * With modifications:
! * made functions static
! * moved 'combining' table to file scope, so other functions can see it
! * ###################################################################
! */
/*
* This is an implementation of wcwidth() and wcswidth() (defined in
--- 1,10 ----
#include "vterm_internal.h"
! // ### The following from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
! // With modifications:
! // made functions static
! // moved 'combining' table to file scope, so other functions can see it
! // ###################################################################
/*
* This is an implementation of wcwidth() and wcswidth() (defined in
***************
*** 336,344 ****
}
#endif
!
! /* ################################
! * ### The rest added by Paul Evans */
INTERNAL int vterm_unicode_width(uint32_t codepoint)
{
--- 335,342 ----
}
#endif
! // ################################
! // ### The rest added by Paul Evans
INTERNAL int vterm_unicode_width(uint32_t codepoint)
{
*** ../vim-8.0.1756/src/libvterm/src/utf8.h 2017-07-07 11:53:29.523876467
+0200
--- src/libvterm/src/utf8.h 2018-04-24 18:22:56.317969728 +0200
***************
*** 24,30 ****
{
int nbytes = utf8_seqlen(codepoint);
! /* This is easier done backwards */
int b = nbytes;
while(b > 1) {
b--;
--- 24,30 ----
{
int nbytes = utf8_seqlen(codepoint);
! // This is easier done backwards
int b = nbytes;
while(b > 1) {
b--;
*** ../vim-8.0.1756/src/libvterm/src/vterm.c 2018-04-07 21:42:50.782097432
+0200
--- src/libvterm/src/vterm.c 2018-04-24 18:23:45.637603837 +0200
***************
*** 27,34 ****
}
static VTermAllocatorFunctions default_allocator = {
! &default_malloc, /* malloc */
! &default_free /* free */
};
VTerm *vterm_new(int rows, int cols)
--- 27,34 ----
}
static VTermAllocatorFunctions default_allocator = {
! &default_malloc, // malloc
! &default_free // free
};
VTerm *vterm_new(int rows, int cols)
*** ../vim-8.0.1756/src/libvterm/src/vterm_internal.h 2018-03-25
16:20:18.517264034 +0200
--- src/libvterm/src/vterm_internal.h 2018-04-24 18:37:30.240041538 +0200
***************
*** 37,43 ****
typedef struct {
VTermEncoding *enc;
! /* This size should be increased if required by other stateful encodings */
char data[4*sizeof(uint32_t)];
} VTermEncodingInstance;
--- 37,43 ----
typedef struct {
VTermEncoding *enc;
! // This size should be increased if required by other stateful encodings
char data[4*sizeof(uint32_t)];
} VTermEncodingInstance;
***************
*** 105,113 ****
/* Last glyph output, for Unicode recombining purposes */
uint32_t *combine_chars;
! size_t combine_chars_size; /* Number of ELEMENTS in the above */
! int combine_width; /* The width of the glyph above */
! VTermPos combine_pos; /* Position before movement */
struct {
unsigned int keypad:1;
--- 105,113 ----
/* Last glyph output, for Unicode recombining purposes */
uint32_t *combine_chars;
! size_t combine_chars_size; // Number of ELEMENTS in the above
! int combine_width; // The width of the glyph above
! VTermPos combine_pos; // Position before movement
struct {
unsigned int keypad:1;
***************
*** 133,139 ****
VTermColor default_fg;
VTermColor default_bg;
! VTermColor colors[16]; /* Store the 8 ANSI and the 8 ANSI high-brights only
*/
int fg_index;
int bg_index;
--- 133,139 ----
VTermColor default_fg;
VTermColor default_bg;
! VTermColor colors[16]; // Store the 8 ANSI and the 8 ANSI high-brights only
int fg_index;
int bg_index;
***************
*** 183,189 ****
ESC,
/* below here are the "string states" */
STRING,
! ESC_IN_STRING
} state;
int intermedlen;
--- 183,189 ----
ESC,
/* below here are the "string states" */
STRING,
! ESC_IN_STRING,
} state;
int intermedlen;
***************
*** 248,254 ****
C1_DCS = 0x90,
C1_CSI = 0x9b,
C1_ST = 0x9c,
! C1_OSC = 0x9d
};
void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format,
...);
--- 248,254 ----
C1_DCS = 0x90,
C1_CSI = 0x9b,
C1_ST = 0x9c,
! C1_OSC = 0x9d,
};
void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format,
...);
*** ../vim-8.0.1756/src/version.c 2018-04-24 17:41:52.077176530 +0200
--- src/version.c 2018-04-24 18:38:11.131780879 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 1757,
/**/
--
hundred-and-one symptoms of being an internet addict:
10E. You start counting in hex.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.