aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul LeoNerd Evans <leonerd@leonerd.org.uk>2012-11-30 16:12:26 +0000
committerPaul LeoNerd Evans <leonerd@leonerd.org.uk>2012-11-30 16:12:26 +0000
commitc00f6cd3c63e01c84220b607eccf5a2ba2df8f63 (patch)
treeb7b183e4235f6bf88aaac1964a35ea8ea598ee86
parentefc5b7e088fc219993f22dc827022b143913c1f8 (diff)
downloadtermo-c00f6cd3c63e01c84220b607eccf5a2ba2df8f63.tar.gz
termo-c00f6cd3c63e01c84220b607eccf5a2ba2df8f63.tar.xz
termo-c00f6cd3c63e01c84220b607eccf5a2ba2df8f63.zip
Only recognise DECCPR as a position report, so it is distinct from F3
-rw-r--r--demo.c6
-rw-r--r--driver-csi.c27
-rw-r--r--man/termkey.72
-rw-r--r--t/31position.c2
4 files changed, 15 insertions, 22 deletions
diff --git a/demo.c b/demo.c
index 646fe9a..2cd8ebc 100644
--- a/demo.c
+++ b/demo.c
@@ -61,12 +61,12 @@ int main(int argc, char *argv[])
if(key.type == TERMKEY_TYPE_MOUSE) {
int line, col;
termkey_interpret_mouse(tk, &key, NULL, NULL, &line, &col);
- printf("%s at line=%d, col=%d)\n", buffer, line, col);
+ printf("%s at line=%d, col=%d\n", buffer, line, col);
}
else if(key.type == TERMKEY_TYPE_POSITION) {
int line, col;
termkey_interpret_position(tk, &key, &line, &col);
- printf("Cursor position report at line=%d, col=%d)\n", line, col);
+ printf("Cursor position report at line=%d, col=%d\n", line, col);
}
else {
printf("%s\n", buffer);
@@ -80,7 +80,7 @@ int main(int argc, char *argv[])
if(key.type == TERMKEY_TYPE_UNICODE &&
key.modifiers == 0 &&
key.code.codepoint == '?') {
- printf("\033[6n");
+ printf("\033[?6n");
fflush(stdout);
}
}
diff --git a/driver-csi.c b/driver-csi.c
index ae0b50d..3ff41e0 100644
--- a/driver-csi.c
+++ b/driver-csi.c
@@ -257,30 +257,23 @@ TermKeyResult termkey_interpret_mouse(TermKey *tk, const TermKeyKey *key, TermKe
}
/*
- * Handler for CSI R position reports
+ * Handler for CSI ? R position reports
* A plain CSI R with no arguments is probably actually <F3>
*/
static TermKeyResult handle_csi_R(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args)
{
switch(cmd) {
- case 'R':
- switch(args) {
- case 0:
- key->type = TERMKEY_TYPE_FUNCTION;
- key->code.number = 3;
- return TERMKEY_RES_KEY;
-
- case 2:
- key->type = TERMKEY_TYPE_POSITION;
- termkey_key_set_linecol(key, arg[1], arg[0]);
- return TERMKEY_RES_KEY;
-
- default:
- return TERMKEY_RES_NONE;
- }
+ case 'R'|'?'<<8:
+ if(args < 2)
+ return TERMKEY_RES_NONE;
+
+ key->type = TERMKEY_TYPE_POSITION;
+ termkey_key_set_linecol(key, arg[1], arg[0]);
+ return TERMKEY_RES_KEY;
+
default:
- return TERMKEY_RES_NONE;
+ return handle_csi_ss3_full(tk, key, cmd, arg, args);
}
}
diff --git a/man/termkey.7 b/man/termkey.7
index c96c4b4..2313fb5 100644
--- a/man/termkey.7
+++ b/man/termkey.7
@@ -132,7 +132,7 @@ protocol (\f(CWCSI M\fP followed by three bytes),
.SM SGR
encoding (\f(CWCSI < ... M\fP, as requested by \f(CWCSI ? 1006 h\fP), and rxvt encoding (\f(CWCSI ... M\fP, as requested by \f(CWCSI ? 1015 h\fP). Which encoding is in use is inferred automatically by \fBtermkey\fP, and does not need to be specified explicitly.
.SS Position Events
-The \fBTERMKEY_TYPE_POSITION\fP event type indicates a cursor position report. This is typically sent by a terminal in response to the Report Cursor Position command (\f(CWCSI 6 n\fP). The event bytes are opaque, but can be obtained by calling \fBtermkey_interpret_position\fP(3) passing the event structure and pointers to integers to store the result in.
+The \fBTERMKEY_TYPE_POSITION\fP event type indicates a cursor position report. This is typically sent by a terminal in response to the Report Cursor Position command (\f(CWCSI ? 6 n\fP). The event bytes are opaque, but can be obtained by calling \fBtermkey_interpret_position\fP(3) passing the event structure and pointers to integers to store the result in. Note that only a DEC CPR sequence (\f(CWCSI ? R\fP) is recognised, and not the non-DEC prefixed \f(CWCSI R\fP because the latter could be interpreted as the \f(CWF3\fP function key instead.
.SS Unrecognised CSIs
The \fBTERMKEY_TYPE_UNKNOWN_CSI\fP event type indicates a CSI sequence that the \fBtermkey\fP does not recognise. It will have been extracted from the stream, but is available to the application to inspect by calling \fBtermkey_interpret_csi\fP(3). It is important that if the application wishes to inspect this sequence it is done immediately, before any other IO operations on the \fBtermkey\fP instance (specifically, before calling \fBtermkey_waitkey\fP() or \fBtermkey_getkey\fP() again), otherwise the buffer space consumed by the sequence will be overwritten.
.SH "SEE ALSO"
diff --git a/t/31position.c b/t/31position.c
index 3304643..1748211 100644
--- a/t/31position.c
+++ b/t/31position.c
@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
tk = termkey_new_abstract("vt100", 0);
- termkey_push_bytes(tk, "\e[15;7R", 7);
+ termkey_push_bytes(tk, "\e[?15;7R", 8);
is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for position report");