76 lines
1.9 KiB
Markdown
76 lines
1.9 KiB
Markdown
|
# 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.
|