From c00f6cd3c63e01c84220b607eccf5a2ba2df8f63 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Fri, 30 Nov 2012 16:12:26 +0000 Subject: Only recognise DECCPR as a position report, so it is distinct from F3 --- demo.c | 6 +++--- driver-csi.c | 27 ++++++++++----------------- man/termkey.7 | 2 +- t/31position.c | 2 +- 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 */ 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"); -- cgit v1.2.3-70-g09d2