bug report
This commit is contained in:
commit
4ae458f1b7
|
@ -0,0 +1,75 @@
|
||||||
|
# Bug Report for XTerm
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
With 1002 and 1016 mode enabled, XTerm may produce invalid CSI sequence.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
* XTerm version: 365
|
||||||
|
* XTerm configuration: default
|
||||||
|
* Operating System: GNU/Linux
|
||||||
|
|
||||||
|
## Steps to Reproduce
|
||||||
|
|
||||||
|
1. Compile [test.c](test.c) with `gcc -o test-xterm test.c`.
|
||||||
|
2. In XTerm, run `script -I input.esc`.
|
||||||
|
3. Run `./test-xterm`.
|
||||||
|
4. Move mouse pointer into the terminal window.
|
||||||
|
5. Press down mouse button (do not release yet).
|
||||||
|
6. Move mouse pointer across the top or left border of the terminal window.
|
||||||
|
7. Release mouse button.
|
||||||
|
8. Press Ctrl+D to quit the test program.
|
||||||
|
9. Execute `exit` to quit the `script` session.
|
||||||
|
10. Run `teseq -L input.esc | less`.
|
||||||
|
|
||||||
|
## Analyze the Input Log
|
||||||
|
|
||||||
|
In Teseq's output, you may see something like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
: Esc [ < 32 ; 9 ; 492 M
|
||||||
|
: Esc [ < 32 ; 5 ; 492 M
|
||||||
|
: Esc [ < 32 ; 1 ; 492 M
|
||||||
|
: Esc [
|
||||||
|
|<32;-3;492M|
|
||||||
|
: Esc [
|
||||||
|
|<32;-5;492M|
|
||||||
|
: Esc [
|
||||||
|
|<32;-7;492M|
|
||||||
|
```
|
||||||
|
|
||||||
|
After the mouse pointer moves across the window border, XTerm prints the negative coordinates in the CSI sequence.
|
||||||
|
|
||||||
|
However, the hyphen character "-" is not a valid CSI parameter byte, according to ECMA-48.
|
||||||
|
|
||||||
|
## Bugfix
|
||||||
|
|
||||||
|
The bug is caused by the following code in button.c:
|
||||||
|
|
||||||
|
```C
|
||||||
|
// ...
|
||||||
|
if (screen->extend_coords == SET_PIXEL_POSITION_MOUSE) {
|
||||||
|
row = event->y - OriginY(screen);
|
||||||
|
col = event->x - OriginX(screen);
|
||||||
|
} else {
|
||||||
|
/* Compute character position of mouse pointer */
|
||||||
|
row = (event->y - screen->border) / FontHeight(screen);
|
||||||
|
col = (event->x - OriginX(screen)) / FontWidth(screen);
|
||||||
|
|
||||||
|
/* Limit to screen dimensions */
|
||||||
|
if (row < 0)
|
||||||
|
row = 0;
|
||||||
|
else if (row > screen->max_row)
|
||||||
|
row = screen->max_row;
|
||||||
|
|
||||||
|
if (col < 0)
|
||||||
|
col = 0;
|
||||||
|
else if (col > screen->max_col)
|
||||||
|
col = screen->max_col;
|
||||||
|
// ...
|
||||||
|
```
|
||||||
|
|
||||||
|
When 1016 mode is enabled, XTerm does not limit the coordinates to the screen dimensions, so that negative values may be produced.
|
||||||
|
|
||||||
|
Apply the patch [button.c.patch](button.c.patch) to button.c to fix the bug.
|
|
@ -0,0 +1,13 @@
|
||||||
|
--- button.c 2021-02-04 09:00:26.000000000 +0800
|
||||||
|
+++ button.patched.c 2021-02-07 21:31:45.960978282 +0800
|
||||||
|
@@ -5258,6 +5258,10 @@
|
||||||
|
if (screen->extend_coords == SET_PIXEL_POSITION_MOUSE) {
|
||||||
|
row = event->y - OriginY(screen);
|
||||||
|
col = event->x - OriginX(screen);
|
||||||
|
+ if (row < 0)
|
||||||
|
+ row = 0;
|
||||||
|
+ if (col < 0)
|
||||||
|
+ col = 0;
|
||||||
|
} else {
|
||||||
|
/* Compute character position of mouse pointer */
|
||||||
|
row = (event->y - screen->border) / FontHeight(screen);
|
|
@ -0,0 +1,25 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
struct termios old_termios, new_termios;
|
||||||
|
int ch, fd_in = STDIN_FILENO;
|
||||||
|
tcgetattr(fd_in, &old_termios);
|
||||||
|
new_termios = old_termios;
|
||||||
|
new_termios.c_lflag &= ~(ICANON | ECHO);
|
||||||
|
tcsetattr(fd_in, TCSANOW, &new_termios);
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
printf("\033[?1002h");
|
||||||
|
printf("\033[?1016h");
|
||||||
|
while (EOF != (ch = getchar())) {
|
||||||
|
if (ch == 0x04) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\033[?1016l");
|
||||||
|
printf("\033[?1002l");
|
||||||
|
tcsetattr(fd_in, TCSANOW, &old_termios);
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in New Issue