comparison src/libvterm/src/state.c @ 32728:b13f723a7ec6 v9.0.1684

patch 9.0.1684: Update libvterm to rev 839 Commit: https://github.com/vim/vim/commit/b00df7aa388994119346a21d77b0d0db2a0a5e9f Author: zeertzjq <zeertzjq@outlook.com> Date: Tue Aug 8 11:03:00 2023 +0800 patch 9.0.1684: Update libvterm to rev 839 Problem: libvterm slightly outdated Solution: Update libvterm from rev 818 to rev 839 Notable fix: libvterm now handles DECSM/DECRM with multiple arguents, so several ncurses programs (e.g. nnn) can enable mouse properly when run in Vim's terminal in XTerm. closes: #12746 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 11 Aug 2023 21:30:03 +0200
parents 984ebd1f6605
children
comparison
equal deleted inserted replaced
32727:6beeb2e0105d 32728:b13f723a7ec6
835 (num == 1002) ? VTERM_PROP_MOUSE_DRAG : 835 (num == 1002) ? VTERM_PROP_MOUSE_DRAG :
836 VTERM_PROP_MOUSE_MOVE); 836 VTERM_PROP_MOUSE_MOVE);
837 break; 837 break;
838 838
839 case 1004: 839 case 1004:
840 settermprop_bool(state, VTERM_PROP_FOCUSREPORT, val);
840 state->mode.report_focus = val; 841 state->mode.report_focus = val;
841 break; 842 break;
842 843
843 case 1005: 844 case 1005:
844 state->mouse_protocol = val ? MOUSE_UTF8 : MOUSE_X10; 845 state->mouse_protocol = val ? MOUSE_UTF8 : MOUSE_X10;
991 if(intermed[1]) // longer than 1 char 992 if(intermed[1]) // longer than 1 char
992 return 0; 993 return 0;
993 994
994 switch(intermed[0]) { 995 switch(intermed[0]) {
995 case ' ': 996 case ' ':
997 case '!':
996 case '"': 998 case '"':
997 case '$': 999 case '$':
998 case '\'': 1000 case '\'':
999 intermed_byte = intermed[0]; 1001 intermed_byte = intermed[0];
1000 break; 1002 break;
1368 if(!CSI_ARG_IS_MISSING(args[0])) 1370 if(!CSI_ARG_IS_MISSING(args[0]))
1369 set_mode(state, CSI_ARG(args[0]), 1); 1371 set_mode(state, CSI_ARG(args[0]), 1);
1370 break; 1372 break;
1371 1373
1372 case LEADER('?', 0x68): // DEC private mode set 1374 case LEADER('?', 0x68): // DEC private mode set
1373 if(!CSI_ARG_IS_MISSING(args[0])) 1375 for(int i = 0; i < argcount; i++) {
1374 set_dec_mode(state, CSI_ARG(args[0]), 1); 1376 if(!CSI_ARG_IS_MISSING(args[i]))
1377 set_dec_mode(state, CSI_ARG(args[i]), 1);
1378 }
1375 break; 1379 break;
1376 1380
1377 case 0x6a: // HPB - ECMA-48 8.3.58 1381 case 0x6a: // HPB - ECMA-48 8.3.58
1378 count = CSI_ARG_COUNT(args[0]); 1382 count = CSI_ARG_COUNT(args[0]);
1379 state->pos.col -= count; 1383 state->pos.col -= count;
1390 if(!CSI_ARG_IS_MISSING(args[0])) 1394 if(!CSI_ARG_IS_MISSING(args[0]))
1391 set_mode(state, CSI_ARG(args[0]), 0); 1395 set_mode(state, CSI_ARG(args[0]), 0);
1392 break; 1396 break;
1393 1397
1394 case LEADER('?', 0x6c): // DEC private mode reset 1398 case LEADER('?', 0x6c): // DEC private mode reset
1395 if(!CSI_ARG_IS_MISSING(args[0])) 1399 for(int i = 0; i < argcount; i++) {
1396 set_dec_mode(state, CSI_ARG(args[0]), 0); 1400 if(!CSI_ARG_IS_MISSING(args[i]))
1401 set_dec_mode(state, CSI_ARG(args[i]), 0);
1402 }
1397 break; 1403 break;
1398 1404
1399 case 0x6d: // SGR - ECMA-48 8.3.117 1405 case 0x6d: // SGR - ECMA-48 8.3.117
1400 vterm_state_setpen(state, args, argcount); 1406 vterm_state_setpen(state, args, argcount);
1401 break; 1407 break;
1484 } 1490 }
1485 } 1491 }
1486 break; 1492 break;
1487 1493
1488 1494
1489 case LEADER('!', 0x70): // DECSTR - DEC soft terminal reset 1495 case INTERMED('!', 0x70): // DECSTR - DEC soft terminal reset
1490 vterm_state_reset(state, 0); 1496 vterm_state_reset(state, 0);
1491 break; 1497 break;
1492 1498
1493 case LEADER('?', INTERMED('$', 0x70)): 1499 case LEADER('?', INTERMED('$', 0x70)):
1494 request_dec_mode(state, CSI_ARG(args[0])); 1500 request_dec_mode(state, CSI_ARG(args[0]));
1767 1773
1768 frag.str++; 1774 frag.str++;
1769 frag.len--; 1775 frag.len--;
1770 } 1776 }
1771 1777
1772 if(!frag.len) 1778 if(!frag.len) {
1779 /* Clear selection if we're already finished but didn't do anything */
1780 if(frag.final && state->selection.callbacks->set) {
1781 (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){
1782 .str = NULL,
1783 .len = 0,
1784 .initial = state->tmp.selection.state != SELECTION_SET,
1785 .final = TRUE,
1786 }, state->selection.user);
1787 }
1773 return; 1788 return;
1789 }
1774 1790
1775 if(state->tmp.selection.state == SELECTION_SELECTED) { 1791 if(state->tmp.selection.state == SELECTION_SELECTED) {
1776 if(frag.str[0] == '?') { 1792 if(frag.str[0] == '?') {
1777 state->tmp.selection.state = SELECTION_QUERY; 1793 state->tmp.selection.state = SELECTION_QUERY;
1778 } 1794 }
1785 if(state->tmp.selection.state == SELECTION_QUERY) { 1801 if(state->tmp.selection.state == SELECTION_QUERY) {
1786 if(state->selection.callbacks->query) 1802 if(state->selection.callbacks->query)
1787 (*state->selection.callbacks->query)(state->tmp.selection.mask, state->selection.user); 1803 (*state->selection.callbacks->query)(state->tmp.selection.mask, state->selection.user);
1788 return; 1804 return;
1789 } 1805 }
1806
1807 if(state->tmp.selection.state == SELECTION_INVALID)
1808 return;
1790 1809
1791 if(state->selection.callbacks->set) { 1810 if(state->selection.callbacks->set) {
1792 size_t bufcur = 0; 1811 size_t bufcur = 0;
1793 char *buffer = state->selection.buffer; 1812 char *buffer = state->selection.buffer;
1794 1813
1821 } 1840 }
1822 else { 1841 else {
1823 uint8_t b = unbase64one(frag.str[0]); 1842 uint8_t b = unbase64one(frag.str[0]);
1824 if(b == 0xFF) { 1843 if(b == 0xFF) {
1825 DEBUG_LOG1("base64decode bad input %02X\n", (uint8_t)frag.str[0]); 1844 DEBUG_LOG1("base64decode bad input %02X\n", (uint8_t)frag.str[0]);
1845
1846 state->tmp.selection.state = SELECTION_INVALID;
1847 if(state->selection.callbacks->set) {
1848 (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){
1849 .str = NULL,
1850 .len = 0,
1851 .initial = TRUE,
1852 .final = TRUE,
1853 }, state->selection.user);
1854 }
1855 break;
1826 } 1856 }
1827 else { 1857
1828 x = (x << 6) | b; 1858 x = (x << 6) | b;
1829 n++; 1859 n++;
1830 }
1831 frag.str++, frag.len--; 1860 frag.str++, frag.len--;
1832 1861
1833 if(n == 4) { 1862 if(n == 4) {
1834 buffer[0] = (x >> 16) & 0xFF; 1863 buffer[0] = (x >> 16) & 0xFF;
1835 buffer[1] = (x >> 8) & 0xFF; 1864 buffer[1] = (x >> 8) & 0xFF;
1845 if(bufcur) { 1874 if(bufcur) {
1846 VTermStringFragment setfrag = { 1875 VTermStringFragment setfrag = {
1847 state->selection.buffer, // str 1876 state->selection.buffer, // str
1848 bufcur, // len 1877 bufcur, // len
1849 state->tmp.selection.state == SELECTION_SET_INITIAL, // initial 1878 state->tmp.selection.state == SELECTION_SET_INITIAL, // initial
1850 frag.final // final 1879 frag.final && !frag.len // final
1851 }; 1880 };
1852 (*state->selection.callbacks->set)(state->tmp.selection.mask, 1881 (*state->selection.callbacks->set)(state->tmp.selection.mask,
1853 setfrag, state->selection.user); 1882 setfrag, state->selection.user);
1854 state->tmp.selection.state = SELECTION_SET; 1883 state->tmp.selection.state = SELECTION_SET;
1855 } 1884 }
2002 vterm_push_output_sprintf_str(vt, C1_DCS, TRUE, 2031 vterm_push_output_sprintf_str(vt, C1_DCS, TRUE,
2003 "1$r%d\"q", state->protected_cell ? 1 : 2); 2032 "1$r%d\"q", state->protected_cell ? 1 : 2);
2004 return; 2033 return;
2005 } 2034 }
2006 2035
2007 vterm_push_output_sprintf_str(state->vt, C1_DCS, TRUE, "0$r%s", tmp); 2036 vterm_push_output_sprintf_str(state->vt, C1_DCS, TRUE, "0$r");
2008 } 2037 }
2009 2038
2010 static int on_dcs(const char *command, size_t commandlen, VTermStringFragment frag, void *user) 2039 static int on_dcs(const char *command, size_t commandlen, VTermStringFragment frag, void *user)
2011 { 2040 {
2012 VTermState *state = user; 2041 VTermState *state = user;
2352 if(val->number == VTERM_PROP_MOUSE_DRAG) 2381 if(val->number == VTERM_PROP_MOUSE_DRAG)
2353 state->mouse_flags |= MOUSE_WANT_DRAG; 2382 state->mouse_flags |= MOUSE_WANT_DRAG;
2354 if(val->number == VTERM_PROP_MOUSE_MOVE) 2383 if(val->number == VTERM_PROP_MOUSE_MOVE)
2355 state->mouse_flags |= MOUSE_WANT_MOVE; 2384 state->mouse_flags |= MOUSE_WANT_MOVE;
2356 return 1; 2385 return 1;
2386 case VTERM_PROP_FOCUSREPORT:
2387 state->mode.report_focus = val->boolean;
2388 return 1;
2357 2389
2358 case VTERM_N_PROPS: 2390 case VTERM_N_PROPS:
2359 return 0; 2391 return 0;
2360 } 2392 }
2361 2393