Fix a regression in 0.17 that broke displaying graphics over SSH
The new types GraphicsCommand can generate a command with only a payload and no control keys, as the last command during chunked transfer. Fix the parser to handle this. Fixes #2568
This commit is contained in:
parent
98801b6fa6
commit
1ab4f7d2d0
@ -43,6 +43,9 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
|
|||||||
|
|
||||||
- Add ncurses specific terminfo definitions for strikethrough (:pull:`2567`)
|
- Add ncurses specific terminfo definitions for strikethrough (:pull:`2567`)
|
||||||
|
|
||||||
|
- Fix a regression in 0.17 that broke displaying graphics over SSH
|
||||||
|
(:iss:`2568`)
|
||||||
|
|
||||||
|
|
||||||
0.17.2 [2020-03-29]
|
0.17.2 [2020-03-29]
|
||||||
--------------------
|
--------------------
|
||||||
|
|||||||
@ -137,6 +137,7 @@ static inline void
|
|||||||
{parr}
|
{parr}
|
||||||
{keys_enum}
|
{keys_enum}
|
||||||
enum KEYS key = '{initial_key}';
|
enum KEYS key = '{initial_key}';
|
||||||
|
if (screen->parser_buf[pos] == ';') state = AFTER_VALUE;
|
||||||
|
|
||||||
while (pos < screen->parser_buf_pos) {{
|
while (pos < screen->parser_buf_pos) {{
|
||||||
switch(state) {{
|
switch(state) {{
|
||||||
|
|||||||
28
kitty/parse-graphics-command.h
generated
28
kitty/parse-graphics-command.h
generated
@ -11,7 +11,7 @@ static inline void parse_graphics_code(Screen *screen,
|
|||||||
unsigned int i, code;
|
unsigned int i, code;
|
||||||
uint64_t lcode;
|
uint64_t lcode;
|
||||||
bool is_negative;
|
bool is_negative;
|
||||||
zero_at_ptr(&g);
|
memset(&g, 0, sizeof(g));
|
||||||
size_t sz;
|
size_t sz;
|
||||||
static uint8_t payload[4096];
|
static uint8_t payload[4096];
|
||||||
|
|
||||||
@ -39,6 +39,8 @@ static inline void parse_graphics_code(Screen *screen,
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum KEYS key = 'a';
|
enum KEYS key = 'a';
|
||||||
|
if (screen->parser_buf[pos] == ';')
|
||||||
|
state = AFTER_VALUE;
|
||||||
|
|
||||||
while (pos < screen->parser_buf_pos) {
|
while (pos < screen->parser_buf_pos) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
@ -129,8 +131,8 @@ static inline void parse_graphics_code(Screen *screen,
|
|||||||
|
|
||||||
case action: {
|
case action: {
|
||||||
g.action = screen->parser_buf[pos++] & 0xff;
|
g.action = screen->parser_buf[pos++] & 0xff;
|
||||||
if (g.action != 'q' && g.action != 'd' && g.action != 't' &&
|
if (g.action != 't' && g.action != 'd' && g.action != 'p' &&
|
||||||
g.action != 'T' && g.action != 'p') {
|
g.action != 'q' && g.action != 'T') {
|
||||||
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
||||||
"value for action: 0x%x",
|
"value for action: 0x%x",
|
||||||
g.action);
|
g.action);
|
||||||
@ -140,14 +142,14 @@ static inline void parse_graphics_code(Screen *screen,
|
|||||||
|
|
||||||
case delete_action: {
|
case delete_action: {
|
||||||
g.delete_action = screen->parser_buf[pos++] & 0xff;
|
g.delete_action = screen->parser_buf[pos++] & 0xff;
|
||||||
if (g.delete_action != 'q' && g.delete_action != 'c' &&
|
if (g.delete_action != 'X' && g.delete_action != 'y' &&
|
||||||
g.delete_action != 'Z' && g.delete_action != 'z' &&
|
g.delete_action != 'i' && g.delete_action != 'I' &&
|
||||||
g.delete_action != 'x' && g.delete_action != 'X' &&
|
g.delete_action != 'A' && g.delete_action != 'p' &&
|
||||||
g.delete_action != 'I' && g.delete_action != 'i' &&
|
g.delete_action != 'Y' && g.delete_action != 'z' &&
|
||||||
g.delete_action != 'P' && g.delete_action != 'y' &&
|
g.delete_action != 'a' && g.delete_action != 'P' &&
|
||||||
g.delete_action != 'a' && g.delete_action != 'A' &&
|
g.delete_action != 'x' && g.delete_action != 'q' &&
|
||||||
g.delete_action != 'Q' && g.delete_action != 'C' &&
|
g.delete_action != 'Z' && g.delete_action != 'Q' &&
|
||||||
g.delete_action != 'p' && g.delete_action != 'Y') {
|
g.delete_action != 'c' && g.delete_action != 'C') {
|
||||||
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
||||||
"value for delete_action: 0x%x",
|
"value for delete_action: 0x%x",
|
||||||
g.delete_action);
|
g.delete_action);
|
||||||
@ -157,8 +159,8 @@ static inline void parse_graphics_code(Screen *screen,
|
|||||||
|
|
||||||
case transmission_type: {
|
case transmission_type: {
|
||||||
g.transmission_type = screen->parser_buf[pos++] & 0xff;
|
g.transmission_type = screen->parser_buf[pos++] & 0xff;
|
||||||
if (g.transmission_type != 's' && g.transmission_type != 'f' &&
|
if (g.transmission_type != 'f' && g.transmission_type != 'd' &&
|
||||||
g.transmission_type != 't' && g.transmission_type != 'd') {
|
g.transmission_type != 's' && g.transmission_type != 't') {
|
||||||
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
REPORT_ERROR("Malformed GraphicsCommand control block, unknown flag "
|
||||||
"value for transmission_type: 0x%x",
|
"value for transmission_type: 0x%x",
|
||||||
g.transmission_type);
|
g.transmission_type);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user