summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames McCoy <jamessan@debian.org>2023-08-06 16:00:42 -0400
committerJames McCoy <jamessan@debian.org>2023-08-06 16:00:42 -0400
commita87db6fe0a7f51763a57cf66198e278e66e4e3ba (patch)
treea1d47519734935a007332642948af73ea3d13a89
parent3ac12b3fc35b4be522331ad2c086fcce70c49a86 (diff)
parent199575c9b3aeb8099e8d439a0c88c853f26b48d9 (diff)
Update to upstream 0.3.3
[git-debrebase anchor: new upstream 0.3.3, merge]
-rw-r--r--Makefile2
-rw-r--r--include/vterm.h2
-rw-r--r--src/mouse.c2
-rw-r--r--src/state.c54
-rw-r--r--src/vterm.c1
-rw-r--r--src/vterm_internal.h1
-rw-r--r--t/17state_mouse.test10
-rw-r--r--t/25state_input.test2
-rw-r--r--t/30state_pen.test8
-rw-r--r--t/40state_selection.test24
-rw-r--r--t/harness.c5
-rw-r--r--vterm.pc.in2
12 files changed, 98 insertions, 15 deletions
diff --git a/Makefile b/Makefile
index de2a174..41b08ed 100644
--- a/Makefile
+++ b/Makefile
@@ -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}