diff options
author | James McCoy <jamessan@debian.org> | 2023-08-06 16:00:42 -0400 |
---|---|---|
committer | James McCoy <jamessan@debian.org> | 2023-08-06 16:00:42 -0400 |
commit | a87db6fe0a7f51763a57cf66198e278e66e4e3ba (patch) | |
tree | a1d47519734935a007332642948af73ea3d13a89 | |
parent | 3ac12b3fc35b4be522331ad2c086fcce70c49a86 (diff) | |
parent | 199575c9b3aeb8099e8d439a0c88c853f26b48d9 (diff) |
Update to upstream 0.3.3
[git-debrebase anchor: new upstream 0.3.3, merge]
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | include/vterm.h | 2 | ||||
-rw-r--r-- | src/mouse.c | 2 | ||||
-rw-r--r-- | src/state.c | 54 | ||||
-rw-r--r-- | src/vterm.c | 1 | ||||
-rw-r--r-- | src/vterm_internal.h | 1 | ||||
-rw-r--r-- | t/17state_mouse.test | 10 | ||||
-rw-r--r-- | t/25state_input.test | 2 | ||||
-rw-r--r-- | t/30state_pen.test | 8 | ||||
-rw-r--r-- | t/40state_selection.test | 24 | ||||
-rw-r--r-- | t/harness.c | 5 | ||||
-rw-r--r-- | vterm.pc.in | 2 |
12 files changed, 98 insertions, 15 deletions
@@ -40,7 +40,7 @@ VERSION_CURRENT=0 VERSION_REVISION=0 VERSION_AGE=0 -VERSION=0.3.2 +VERSION=0.3.3 PREFIX=/usr/local BINDIR=$(PREFIX)/bin diff --git a/include/vterm.h b/include/vterm.h index c0f0087..44e1502 100644 --- a/include/vterm.h +++ b/include/vterm.h @@ -13,6 +13,7 @@ extern "C" { #define VTERM_VERSION_MAJOR 0 #define VTERM_VERSION_MINOR 3 +#define VTERM_VERSION_PATCH 3 #define VTERM_CHECK_VERSION \ vterm_check_version(VTERM_VERSION_MAJOR, VTERM_VERSION_MINOR) @@ -258,6 +259,7 @@ typedef enum { VTERM_PROP_REVERSE, // bool VTERM_PROP_CURSORSHAPE, // number VTERM_PROP_MOUSE, // number + VTERM_PROP_FOCUSREPORT, // bool VTERM_N_PROPS } VTermProp; diff --git a/src/mouse.c b/src/mouse.c index bd713f8..f74abc3 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -93,7 +93,7 @@ void vterm_mouse_button(VTerm *vt, int button, bool pressed, VTermModifier mod) if(button < 4) { output_mouse(state, button-1, pressed, mod, state->mouse_col, state->mouse_row); } - else if(button < 6) { + else if(button < 8) { output_mouse(state, button-4 + 0x40, pressed, mod, state->mouse_col, state->mouse_row); } } diff --git a/src/state.c b/src/state.c index b22fba7..ce8e034 100644 --- a/src/state.c +++ b/src/state.c @@ -801,6 +801,7 @@ static void set_dec_mode(VTermState *state, int num, int val) break; case 1004: + settermprop_bool(state, VTERM_PROP_FOCUSREPORT, val); state->mode.report_focus = val; break; @@ -949,6 +950,7 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha switch(intermed[0]) { case ' ': + case '!': case '"': case '$': case '\'': @@ -1311,8 +1313,10 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha break; case LEADER('?', 0x68): // DEC private mode set - if(!CSI_ARG_IS_MISSING(args[0])) - set_dec_mode(state, CSI_ARG(args[0]), 1); + for(int i = 0; i < argcount; i++) { + if(!CSI_ARG_IS_MISSING(args[i])) + set_dec_mode(state, CSI_ARG(args[i]), 1); + } break; case 0x6a: // HPB - ECMA-48 8.3.58 @@ -1333,8 +1337,10 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha break; case LEADER('?', 0x6c): // DEC private mode reset - if(!CSI_ARG_IS_MISSING(args[0])) - set_dec_mode(state, CSI_ARG(args[0]), 0); + for(int i = 0; i < argcount; i++) { + if(!CSI_ARG_IS_MISSING(args[i])) + set_dec_mode(state, CSI_ARG(args[i]), 0); + } break; case 0x6d: // SGR - ECMA-48 8.3.117 @@ -1386,7 +1392,7 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha break; - case LEADER('!', 0x70): // DECSTR - DEC soft terminal reset + case INTERMED('!', 0x70): // DECSTR - DEC soft terminal reset vterm_state_reset(state, 0); break; @@ -1652,8 +1658,18 @@ static void osc_selection(VTermState *state, VTermStringFragment frag) frag.len--; } - if(!frag.len) + if(!frag.len) { + /* Clear selection if we're already finished but didn't do anything */ + if(frag.final && state->selection.callbacks->set) { + (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){ + .str = NULL, + .len = 0, + .initial = state->tmp.selection.state != SELECTION_SET, + .final = true, + }, state->selection.user); + } return; + } if(state->tmp.selection.state == SELECTION_SELECTED) { if(frag.str[0] == '?') { @@ -1671,6 +1687,9 @@ static void osc_selection(VTermState *state, VTermStringFragment frag) return; } + if(state->tmp.selection.state == SELECTION_INVALID) + return; + if(state->selection.callbacks->set) { size_t bufcur = 0; char *buffer = state->selection.buffer; @@ -1706,11 +1725,21 @@ static void osc_selection(VTermState *state, VTermStringFragment frag) uint8_t b = unbase64one(frag.str[0]); if(b == 0xFF) { DEBUG_LOG("base64decode bad input %02X\n", (uint8_t)frag.str[0]); + + state->tmp.selection.state = SELECTION_INVALID; + if(state->selection.callbacks->set) { + (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){ + .str = NULL, + .len = 0, + .initial = true, + .final = true, + }, state->selection.user); + } + break; } - else { - x = (x << 6) | b; - n++; - } + + x = (x << 6) | b; + n++; frag.str++, frag.len--; if(n == 4) { @@ -1730,7 +1759,7 @@ static void osc_selection(VTermState *state, VTermStringFragment frag) .str = state->selection.buffer, .len = bufcur, .initial = state->tmp.selection.state == SELECTION_SET_INITIAL, - .final = frag.final, + .final = frag.final && !frag.len, }, state->selection.user); state->tmp.selection.state = SELECTION_SET; } @@ -2196,6 +2225,9 @@ int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val) if(val->number == VTERM_PROP_MOUSE_MOVE) state->mouse_flags |= MOUSE_WANT_MOVE; return 1; + case VTERM_PROP_FOCUSREPORT: + state->mode.report_focus = val->boolean; + return 1; case VTERM_N_PROPS: return 0; diff --git a/src/vterm.c b/src/vterm.c index 0997887..e1f676f 100644 --- a/src/vterm.c +++ b/src/vterm.c @@ -295,6 +295,7 @@ VTermValueType vterm_get_prop_type(VTermProp prop) case VTERM_PROP_REVERSE: return VTERM_VALUETYPE_BOOL; case VTERM_PROP_CURSORSHAPE: return VTERM_VALUETYPE_INT; case VTERM_PROP_MOUSE: return VTERM_VALUETYPE_INT; + case VTERM_PROP_FOCUSREPORT: return VTERM_VALUETYPE_BOOL; case VTERM_N_PROPS: return 0; } diff --git a/src/vterm_internal.h b/src/vterm_internal.h index df9495c..e79d74b 100644 --- a/src/vterm_internal.h +++ b/src/vterm_internal.h @@ -158,6 +158,7 @@ struct VTermState SELECTION_QUERY, SELECTION_SET_INITIAL, SELECTION_SET, + SELECTION_INVALID, } state : 8; uint32_t recvpartial; uint32_t sendpartial; diff --git a/t/17state_mouse.test b/t/17state_mouse.test index e5ba29b..33b7dc2 100644 --- a/t/17state_mouse.test +++ b/t/17state_mouse.test @@ -55,6 +55,10 @@ MOUSEBTN d 4 0 output "\e[M\x60\x36\x2b" MOUSEBTN d 5 0 output "\e[M\x61\x36\x2b" +MOUSEBTN d 6 0 + output "\e[M\x62\x36\x2b" +MOUSEBTN d 7 0 + output "\e[M\x63\x36\x2b" !DECRQM on mouse button mode PUSH "\e[?1000\$p" @@ -179,3 +183,9 @@ RESET MOUSEMOVE 0,0 0 MOUSEBTN d 1 0 MOUSEBTN u 1 0 + +!DECSM can set multiple modes at once +PUSH "\e[?1002;1006h" + settermprop 8 2 +MOUSEBTN d 1 0 + output "\e[<0;1;1M" diff --git a/t/25state_input.test b/t/25state_input.test index 4eb4c6a..11013ed 100644 --- a/t/25state_input.test +++ b/t/25state_input.test @@ -148,7 +148,9 @@ FOCUS IN FOCUS OUT !Focus reporting enabled +WANTSTATE +p PUSH "\e[?1004h" + settermprop 9 true FOCUS IN output "\e[I" FOCUS OUT diff --git a/t/30state_pen.test b/t/30state_pen.test index 92cf01d..1a6cd01 100644 --- a/t/30state_pen.test +++ b/t/30state_pen.test @@ -123,3 +123,11 @@ PUSH "\e[74m" PUSH "\e[75m" ?pen small = off ?pen baseline = normal + +!DECSTR resets pen attributes +PUSH "\e[1;4m" + ?pen bold = on + ?pen underline = 1 +PUSH "\e[!p" + ?pen bold = off + ?pen underline = 0 diff --git a/t/40state_selection.test b/t/40state_selection.test index ccc3d92..03dd183 100644 --- a/t/40state_selection.test +++ b/t/40state_selection.test @@ -26,6 +26,30 @@ PUSH "\e]52;c;SGVsbG" PUSH "8s\e\\" selection-set mask=0001 "lo,"] +!Set clipboard; empty first chunk +PUSH "\e]52;c;" +PUSH "SGVsbG8s\e\\" + selection-set mask=0001 ["Hello,"] + +!Set clipboard; empty final chunk +PUSH "\e]52;c;SGVsbG8s" + selection-set mask=0001 ["Hello," +PUSH "\e\\" + selection-set mask=0001 ] + +!Set clipboard; longer than buffer +PUSH "\e]52;c;" . "LS0t"x10 . "\e\\" + selection-set mask=0001 ["-"x15 + selection-set mask=0001 "-"x15] + +!Clear clipboard +PUSH "\e]52;c;\e\\" + selection-set mask=0001 [] + +!Set invalid data clears and ignores +PUSH "\e]52;c;SGVs*SGVsbG8s\e\\" + selection-set mask=0001 [] + !Query clipboard PUSH "\e]52;c;?\e\\" selection-query mask=0001 diff --git a/t/harness.c b/t/harness.c index 0003e1b..ddd5917 100644 --- a/t/harness.c +++ b/t/harness.c @@ -657,7 +657,10 @@ int main(int argc, char **argv) if(!state) { state = vterm_obtain_state(vt); vterm_state_set_callbacks(state, &state_cbs, NULL); - vterm_state_set_selection_callbacks(state, &selection_cbs, NULL, NULL, 1024); + /* In some tests we want to check the behaviour of overflowing the + * buffer, so make it nicely small + */ + vterm_state_set_selection_callbacks(state, &selection_cbs, NULL, NULL, 16); vterm_state_set_bold_highbright(state, 1); vterm_state_reset(state, 1); } diff --git a/vterm.pc.in b/vterm.pc.in index bcb5ce4..1f5bea4 100644 --- a/vterm.pc.in +++ b/vterm.pc.in @@ -3,6 +3,6 @@ includedir=@INCDIR@ Name: vterm Description: Abstract VT220/Xterm/ECMA-48 emulation library -Version: 0.3.2 +Version: 0.3.3 Libs: -L${libdir} -lvterm Cflags: -I${includedir} |