2d6c751fb2
xterm.js sends one wheel report per event whatever its size and damps a touchpad's pixel deltas x0.3, so a swipe crawled. With mouse tracking on, TerminalView now sends the SGR reports itself (lib/wheelReports.ts): one per 5 rows of travel (what one report scrolls in a Claude pane), the remainder carried between events, at least one per wheel notch, at the pointer's cell with xterm's modifier bits.
43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
/**
|
|
* @file wheelReports.test.ts
|
|
* @description A touchpad scrolls 1:1 with the finger (one report per
|
|
* LINES_PER_REPORT rows, remainder carried), a wheel notch always sends one.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
import { LINES_PER_REPORT, wheelReports, type WheelState } from "../wheelReports";
|
|
|
|
const ROW = 20;
|
|
const px = (deltaY: number) => ({ deltaY, deltaMode: 0 });
|
|
|
|
describe("wheelReports", () => {
|
|
it("adds small touchpad steps up to one report per LINES_PER_REPORT rows", () => {
|
|
const s: WheelState = { partial: 0 };
|
|
let sent = 0;
|
|
// 30 steps of 10px = 300px = 15 rows.
|
|
for (let i = 0; i < 30; i++) sent += wheelReports(s, px(10), ROW, 40);
|
|
expect(sent).toBe(15 / LINES_PER_REPORT);
|
|
});
|
|
|
|
it("drops the carried remainder when the swipe turns around", () => {
|
|
const s: WheelState = { partial: 0 };
|
|
wheelReports(s, px(40), ROW, 40); // 2 rows down, nothing sent yet
|
|
let sent = 0;
|
|
for (let i = 0; i < 5; i++) sent += wheelReports(s, px(-20), ROW, 40); // 5 rows up
|
|
expect(sent).toBe(-1);
|
|
});
|
|
|
|
it("sends at least one report for a wheel notch, in either delta mode", () => {
|
|
expect(wheelReports({ partial: 0 }, px(100), ROW, 40)).toBe(1);
|
|
expect(wheelReports({ partial: 0 }, px(-100), ROW, 40)).toBe(-1);
|
|
expect(wheelReports({ partial: 0 }, { deltaY: 3, deltaMode: 1 }, ROW, 40)).toBe(1);
|
|
expect(wheelReports({ partial: 0 }, { deltaY: 1, deltaMode: 2 }, ROW, 40)).toBe(8);
|
|
});
|
|
|
|
it("sends nothing for a horizontal-only event or an unmeasured terminal", () => {
|
|
expect(wheelReports({ partial: 0 }, px(0), ROW, 40)).toBe(0);
|
|
expect(wheelReports({ partial: 0 }, px(10), 0, 40)).toBe(0);
|
|
});
|
|
});
|