Mercurial > vim
comparison src/libvterm/src/state.c @ 20488:1d595fada804 v8.2.0798
patch 8.2.0798: libvterm code lags behind the upstream version
Commit: https://github.com/vim/vim/commit/be593bf135f6967335b14ba188bd5f8f32175c75
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue May 19 21:20:04 2020 +0200
patch 8.2.0798: libvterm code lags behind the upstream version
Problem: Libvterm code lags behind the upstream version.
Solution: Include revisions 755 - 758.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 19 May 2020 21:30:07 +0200 |
parents | 8ddcdb0d1074 |
children | 1ee7baa5173b |
comparison
equal
deleted
inserted
replaced
20487:f4ada29cdf4b | 20488:1d595fada804 |
---|---|
580 VTermValue val; | 580 VTermValue val; |
581 val.number = v; | 581 val.number = v; |
582 return vterm_state_set_termprop(state, prop, &val); | 582 return vterm_state_set_termprop(state, prop, &val); |
583 } | 583 } |
584 | 584 |
585 static int settermprop_string(VTermState *state, VTermProp prop, const char *str, size_t len) | 585 static int settermprop_string(VTermState *state, VTermProp prop, VTermStringFragment frag) |
586 { | 586 { |
587 char *strvalue; | |
588 int r; | |
589 VTermValue val; | 587 VTermValue val; |
590 strvalue = vterm_allocator_malloc(state->vt, (len+1) * sizeof(char)); | 588 |
591 strncpy(strvalue, str, len); | 589 val.string = frag; |
592 strvalue[len] = 0; | 590 return vterm_state_set_termprop(state, prop, &val); |
593 | |
594 val.string = strvalue; | |
595 r = vterm_state_set_termprop(state, prop, &val); | |
596 vterm_allocator_free(state->vt, strvalue); | |
597 return r; | |
598 } | 591 } |
599 | 592 |
600 static void savecursor(VTermState *state, int save) | 593 static void savecursor(VTermState *state, int save) |
601 { | 594 { |
602 if(save) { | 595 if(save) { |
1600 #endif | 1593 #endif |
1601 | 1594 |
1602 return 1; | 1595 return 1; |
1603 } | 1596 } |
1604 | 1597 |
1605 static int on_osc(const char *command, size_t cmdlen, void *user) | 1598 static int on_osc(int command, VTermStringFragment frag, void *user) |
1606 { | 1599 { |
1607 VTermState *state = user; | 1600 VTermState *state = user; |
1608 | 1601 |
1609 if(cmdlen < 2) | 1602 switch(command) { |
1610 return 0; | 1603 case 0: |
1611 | 1604 settermprop_string(state, VTERM_PROP_ICONNAME, frag); |
1612 if(strneq(command, "0;", 2)) { | 1605 settermprop_string(state, VTERM_PROP_TITLE, frag); |
1613 settermprop_string(state, VTERM_PROP_ICONNAME, command + 2, cmdlen - 2); | |
1614 settermprop_string(state, VTERM_PROP_TITLE, command + 2, cmdlen - 2); | |
1615 return 1; | |
1616 } | |
1617 else if(strneq(command, "1;", 2)) { | |
1618 settermprop_string(state, VTERM_PROP_ICONNAME, command + 2, cmdlen - 2); | |
1619 return 1; | |
1620 } | |
1621 else if(strneq(command, "2;", 2)) { | |
1622 settermprop_string(state, VTERM_PROP_TITLE, command + 2, cmdlen - 2); | |
1623 return 1; | |
1624 } | |
1625 else if(strneq(command, "10;", 3)) { | |
1626 // request foreground color: <Esc>]10;?<0x07> | |
1627 int red = state->default_fg.red; | |
1628 int blue = state->default_fg.blue; | |
1629 int green = state->default_fg.green; | |
1630 vterm_push_output_sprintf_ctrl(state->vt, C1_OSC, "10;rgb:%02x%02x/%02x%02x/%02x%02x\x07", red, red, green, green, blue, blue); | |
1631 return 1; | |
1632 } | |
1633 else if(strneq(command, "11;", 3)) { | |
1634 // request background color: <Esc>]11;?<0x07> | |
1635 int red = state->default_bg.red; | |
1636 int blue = state->default_bg.blue; | |
1637 int green = state->default_bg.green; | |
1638 vterm_push_output_sprintf_ctrl(state->vt, C1_OSC, "11;rgb:%02x%02x/%02x%02x/%02x%02x\x07", red, red, green, green, blue, blue); | |
1639 return 1; | |
1640 } | |
1641 else if(strneq(command, "12;", 3)) { | |
1642 settermprop_string(state, VTERM_PROP_CURSORCOLOR, command + 3, cmdlen - 3); | |
1643 return 1; | |
1644 } | |
1645 else if(state->fallbacks && state->fallbacks->osc) | |
1646 if((*state->fallbacks->osc)(command, cmdlen, state->fbdata)) | |
1647 return 1; | 1606 return 1; |
1648 | 1607 |
1608 case 1: | |
1609 settermprop_string(state, VTERM_PROP_ICONNAME, frag); | |
1610 return 1; | |
1611 | |
1612 case 2: | |
1613 settermprop_string(state, VTERM_PROP_TITLE, frag); | |
1614 return 1; | |
1615 | |
1616 case 10: | |
1617 { | |
1618 // request foreground color: <Esc>]10;?<0x07> | |
1619 int red = state->default_fg.red; | |
1620 int blue = state->default_fg.blue; | |
1621 int green = state->default_fg.green; | |
1622 vterm_push_output_sprintf_ctrl(state->vt, C1_OSC, "10;rgb:%02x%02x/%02x%02x/%02x%02x\x07", red, red, green, green, blue, blue); | |
1623 return 1; | |
1624 } | |
1625 | |
1626 case 11: | |
1627 { | |
1628 // request background color: <Esc>]11;?<0x07> | |
1629 int red = state->default_bg.red; | |
1630 int blue = state->default_bg.blue; | |
1631 int green = state->default_bg.green; | |
1632 vterm_push_output_sprintf_ctrl(state->vt, C1_OSC, "11;rgb:%02x%02x/%02x%02x/%02x%02x\x07", red, red, green, green, blue, blue); | |
1633 return 1; | |
1634 } | |
1635 case 12: | |
1636 settermprop_string(state, VTERM_PROP_CURSORCOLOR, frag); | |
1637 return 1; | |
1638 | |
1639 default: | |
1640 if(state->fallbacks && state->fallbacks->osc) | |
1641 if((*state->fallbacks->osc)(command, frag, state->fbdata)) | |
1642 return 1; | |
1643 } | |
1644 | |
1649 return 0; | 1645 return 0; |
1650 } | 1646 } |
1651 | 1647 |
1652 static void request_status_string(VTermState *state, const char *command, size_t cmdlen) | 1648 static void request_status_string(VTermState *state, VTermStringFragment frag) |
1653 { | 1649 { |
1654 VTerm *vt = state->vt; | 1650 VTerm *vt = state->vt; |
1655 | 1651 |
1656 if(cmdlen == 1) | 1652 char *tmp = state->tmp.decrqss; |
1657 switch(command[0]) { | 1653 size_t i = 0; |
1658 case 'm': // Query SGR | 1654 |
1659 { | 1655 if(frag.initial) |
1660 long args[20]; | 1656 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; |
1661 int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); | 1657 |
1662 int argi; | 1658 while(i < sizeof(state->tmp.decrqss)-1 && tmp[i]) |
1663 size_t cur = 0; | 1659 i++; |
1664 | 1660 while(i < sizeof(state->tmp.decrqss)-1 && frag.len--) |
1665 cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, | 1661 tmp[i++] = (frag.str++)[0]; |
1666 vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r ... | 1662 tmp[i] = 0; |
1667 if(cur >= vt->tmpbuffer_len) | 1663 |
1668 return; | 1664 if(!frag.final) |
1669 | 1665 return; |
1670 for(argi = 0; argi < argc; argi++) { | 1666 |
1671 cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, | 1667 fprintf(stderr, "DECRQSS on <%s>\n", tmp); |
1672 argi == argc - 1 ? "%ld" : | 1668 |
1673 CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" : | 1669 switch(tmp[0] | tmp[1]<<8 | tmp[2]<<16) { |
1674 "%ld;", | 1670 case 'm': { |
1675 CSI_ARG(args[argi])); | 1671 // Query SGR |
1676 | 1672 long args[20]; |
1677 if(cur >= vt->tmpbuffer_len) | 1673 int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); |
1678 return; | 1674 size_t cur = 0; |
1679 } | 1675 int argi; |
1680 | 1676 |
1681 cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, | 1677 cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, |
1682 vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST | 1678 vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r ... |
1683 if(cur >= vt->tmpbuffer_len) | 1679 if(cur >= vt->tmpbuffer_len) |
1684 return; | |
1685 | |
1686 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | |
1687 } | |
1688 return; | 1680 return; |
1689 case 'r': // Query DECSTBM | 1681 |
1690 vterm_push_output_sprintf_dcs(vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state)); | 1682 for(argi = 0; argi < argc; argi++) { |
1683 cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, | |
1684 argi == argc - 1 ? "%ld" : | |
1685 CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" : | |
1686 "%ld;", | |
1687 CSI_ARG(args[argi])); | |
1688 if(cur >= vt->tmpbuffer_len) | |
1689 return; | |
1690 } | |
1691 | |
1692 cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, | |
1693 vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST | |
1694 if(cur >= vt->tmpbuffer_len) | |
1691 return; | 1695 return; |
1692 case 's': // Query DECSLRM | 1696 |
1693 vterm_push_output_sprintf_dcs(vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state)); | 1697 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); |
1694 return; | 1698 return; |
1695 } | 1699 } |
1696 | 1700 |
1697 if(cmdlen == 2) { | 1701 case 'r': |
1698 if(strneq(command, " q", 2)) { | 1702 // Query DECSTBM |
1703 vterm_push_output_sprintf_dcs(vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state)); | |
1704 return; | |
1705 | |
1706 case 's': | |
1707 // Query DECSLRM | |
1708 vterm_push_output_sprintf_dcs(vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state)); | |
1709 return; | |
1710 | |
1711 case ' '|('q'<<8): { | |
1712 // Query DECSCUSR | |
1699 int reply; | 1713 int reply; |
1700 switch(state->mode.cursor_shape) { | 1714 switch(state->mode.cursor_shape) { |
1701 case VTERM_PROP_CURSORSHAPE_BLOCK: reply = 2; break; | 1715 case VTERM_PROP_CURSORSHAPE_BLOCK: reply = 2; break; |
1702 case VTERM_PROP_CURSORSHAPE_UNDERLINE: reply = 4; break; | 1716 case VTERM_PROP_CURSORSHAPE_UNDERLINE: reply = 4; break; |
1703 default: /* VTERM_PROP_CURSORSHAPE_BAR_LEFT */ reply = 6; break; | 1717 default: /* VTERM_PROP_CURSORSHAPE_BAR_LEFT */ reply = 6; break; |
1705 if(state->mode.cursor_blink) | 1719 if(state->mode.cursor_blink) |
1706 reply--; | 1720 reply--; |
1707 vterm_push_output_sprintf_dcs(vt, "1$r%d q", reply); | 1721 vterm_push_output_sprintf_dcs(vt, "1$r%d q", reply); |
1708 return; | 1722 return; |
1709 } | 1723 } |
1710 else if(strneq(command, "\"q", 2)) { | 1724 |
1725 case '\"'|('q'<<8): | |
1726 // Query DECSCA | |
1711 vterm_push_output_sprintf_dcs(vt, "1$r%d\"q", state->protected_cell ? 1 : 2); | 1727 vterm_push_output_sprintf_dcs(vt, "1$r%d\"q", state->protected_cell ? 1 : 2); |
1712 return; | 1728 return; |
1713 } | 1729 } |
1714 } | 1730 |
1715 | 1731 vterm_push_output_sprintf_dcs(state->vt, "0$r%s", tmp); |
1716 vterm_push_output_sprintf_dcs(state->vt, "0$r%.s", (int)cmdlen, command); | 1732 } |
1717 } | 1733 |
1718 | 1734 static int on_dcs(const char *command, size_t commandlen, VTermStringFragment frag, void *user) |
1719 static int on_dcs(const char *command, size_t cmdlen, void *user) | |
1720 { | 1735 { |
1721 VTermState *state = user; | 1736 VTermState *state = user; |
1722 | 1737 |
1723 if(cmdlen >= 2 && strneq(command, "$q", 2)) { | 1738 if(commandlen == 2 && strneq(command, "$q", 2)) { |
1724 request_status_string(state, command+2, cmdlen-2); | 1739 request_status_string(state, frag); |
1725 return 1; | 1740 return 1; |
1726 } | 1741 } |
1727 else if(state->fallbacks && state->fallbacks->dcs) | 1742 else if(state->fallbacks && state->fallbacks->dcs) |
1728 if((*state->fallbacks->dcs)(command, cmdlen, state->fbdata)) | 1743 if((*state->fallbacks->dcs)(command, commandlen, frag, state->fbdata)) |
1729 return 1; | 1744 return 1; |
1730 | 1745 |
1746 DEBUG_LOG2("libvterm: Unhandled DCS %.*s\n", (int)commandlen, command); | |
1731 return 0; | 1747 return 0; |
1732 } | 1748 } |
1733 | 1749 |
1734 static int on_resize(int rows, int cols, void *user) | 1750 static int on_resize(int rows, int cols, void *user) |
1735 { | 1751 { |