diff options
| author | David Walter Seikel | 2014-02-01 14:57:08 +1000 |
|---|---|---|
| committer | David Walter Seikel | 2014-02-01 14:57:08 +1000 |
| commit | 3715a176851a786c071e5bb18c00fbb80040ff04 (patch) | |
| tree | 2ea4ac982d36638e2731e99b4538669463e88537 | |
| parent | Fix typo in key definitions. (diff) | |
| download | boxes-3715a176851a786c071e5bb18c00fbb80040ff04.zip boxes-3715a176851a786c071e5bb18c00fbb80040ff04.tar.gz boxes-3715a176851a786c071e5bb18c00fbb80040ff04.tar.bz2 boxes-3715a176851a786c071e5bb18c00fbb80040ff04.tar.xz | |
Smarten up the CSI parser a little.
| -rw-r--r-- | handlekeys.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/handlekeys.c b/handlekeys.c index ea99d57..f1fe56c 100644 --- a/handlekeys.c +++ b/handlekeys.c | |||
| @@ -287,20 +287,15 @@ void handle_keys(long extra, | |||
| 287 | if (pendingEsc) continue; | 287 | if (pendingEsc) continue; |
| 288 | 288 | ||
| 289 | // Check if it's a CSI before we check for the known key sequences. | 289 | // Check if it's a CSI before we check for the known key sequences. |
| 290 | if ('\x9B' == buffer[0]) | 290 | if ((('\x1B' == buffer[0]) && ('[' == buffer[1])) |
| 291 | csi = 1; | 291 | || (('\xC2' == buffer[0]) && ('\x9B' == buffer[1]))) |
| 292 | if (('\x1B' == buffer[0]) && ('[' == buffer[1])) | ||
| 293 | csi = 2; | ||
| 294 | if (('\xC2' == buffer[0]) && ('\x9B' == buffer[1])) | ||
| 295 | csi = 2; | ||
| 296 | if (2 == csi) | ||
| 297 | { | 292 | { |
| 298 | buffer[0] = '\x9B'; | 293 | buffer[0] = '\x9B'; |
| 299 | for (j = 1; buffer[j]; j++) | 294 | for (j = 1; buffer[j]; j++) |
| 300 | buffer[j] = buffer[j + 1]; | 295 | buffer[j] = buffer[j + 1]; |
| 301 | buffIndex--; | 296 | buffIndex--; |
| 302 | csi = 1; | ||
| 303 | } | 297 | } |
| 298 | csi = ('\x9B' == buffer[0]); | ||
| 304 | 299 | ||
| 305 | // Check for known key sequences. | 300 | // Check for known key sequences. |
| 306 | // For a real timeout checked Esc, buffer is now empty, so this for loop | 301 | // For a real timeout checked Esc, buffer is now empty, so this for loop |
| @@ -347,6 +342,7 @@ void handle_keys(long extra, | |||
| 347 | { | 342 | { |
| 348 | // TODO - We have a mouse report, which is CSI M ..., where the rest is | 343 | // TODO - We have a mouse report, which is CSI M ..., where the rest is |
| 349 | // binary encoded, more or less. Not fitting into the CSI format. | 344 | // binary encoded, more or less. Not fitting into the CSI format. |
| 345 | // To make things worse, can't tell how long this will be. | ||
| 350 | } | 346 | } |
| 351 | else | 347 | else |
| 352 | { | 348 | { |
| @@ -397,16 +393,17 @@ void handle_keys(long extra, | |||
| 397 | } | 393 | } |
| 398 | while (t); | 394 | while (t); |
| 399 | 395 | ||
| 400 | // Get the final command sequence, and pass it to the callback. | 396 | // Check if we got the final byte, and send it to the callback. |
| 401 | strcat(csFinal, &buffer[csIndex]); | 397 | strcat(csFinal, &buffer[csIndex]); |
| 402 | if (handle_CSI) | 398 | t = csFinal + strlen(csFinal) - 1; |
| 403 | handle_CSI(extra, csFinal, csParams, p); | 399 | if (('\x40' <= (*t)) && ((*t) <= '\x7e')) |
| 400 | { | ||
| 401 | if (handle_CSI) | ||
| 402 | handle_CSI(extra, csFinal, csParams, p); | ||
| 403 | buffer[0] = buffIndex = 0; | ||
| 404 | sequence[0] = 0; | ||
| 405 | } | ||
| 404 | } | 406 | } |
| 405 | |||
| 406 | csi = 0; | ||
| 407 | // Wether or not it's a CSI we understand, it's been handled either here | ||
| 408 | // or in the key sequence scanning above. | ||
| 409 | buffer[0] = buffIndex = 0; | ||
| 410 | } | 407 | } |
| 411 | 408 | ||
| 412 | // Pass the result to the callback. | 409 | // Pass the result to the callback. |
