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 {