Mercurial > vim
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 |