Only recognise DECCPR as a position report, so it is distinct from F3
This commit is contained in:
parent
efc5b7e088
commit
c00f6cd3c6
6
demo.c
6
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);
|
||||
}
|
||||
}
|
||||
|
|
17
driver-csi.c
17
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 'R'|'?'<<8:
|
||||
if(args < 2)
|
||||
return TERMKEY_RES_NONE;
|
||||
|
||||
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;
|
||||
}
|
||||
default:
|
||||
return TERMKEY_RES_NONE;
|
||||
return handle_csi_ss3_full(tk, key, cmd, arg, args);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue