fix: 支持终端GUI应用鼠标追踪模式下的滚轮事件
This commit is contained in:
@@ -112,6 +112,7 @@ const TerminalViewport = React.forwardRef<TerminalController, TerminalViewportPr
|
|||||||
const lastProcessedChunkIdRef = React.useRef<number | null>(null);
|
const lastProcessedChunkIdRef = React.useRef<number | null>(null);
|
||||||
const followOutputRef = React.useRef(true);
|
const followOutputRef = React.useRef(true);
|
||||||
const touchScrollCleanupRef = React.useRef<(() => void) | null>(null);
|
const touchScrollCleanupRef = React.useRef<(() => void) | null>(null);
|
||||||
|
const mouseTrackingWheelCleanupRef = React.useRef<(() => void) | null>(null);
|
||||||
const viewportDiscoveryTimeoutRef = React.useRef<number | null>(null);
|
const viewportDiscoveryTimeoutRef = React.useRef<number | null>(null);
|
||||||
const viewportDiscoveryAttemptsRef = React.useRef(0);
|
const viewportDiscoveryAttemptsRef = React.useRef(0);
|
||||||
const hiddenInputRef = React.useRef<HTMLTextAreaElement | null>(null);
|
const hiddenInputRef = React.useRef<HTMLTextAreaElement | null>(null);
|
||||||
@@ -996,6 +997,26 @@ const TerminalViewport = React.forwardRef<TerminalController, TerminalViewportPr
|
|||||||
bumpTerminalReady();
|
bumpTerminalReady();
|
||||||
cursorBlinkStateRef.current = false;
|
cursorBlinkStateRef.current = false;
|
||||||
|
|
||||||
|
const canvas = (terminal as unknown as { canvas?: HTMLCanvasElement }).canvas;
|
||||||
|
if (canvas) {
|
||||||
|
mouseTrackingWheelCleanupRef.current = () => {
|
||||||
|
canvas.removeEventListener('wheel', handleMouseTrackingWheel, { capture: true });
|
||||||
|
};
|
||||||
|
const handleMouseTrackingWheel = (event: WheelEvent) => {
|
||||||
|
const wasmTerm = terminal.wasmTerm;
|
||||||
|
if (wasmTerm && wasmTerm.hasMouseTracking()) {
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
const rect = canvas.getBoundingClientRect();
|
||||||
|
const x = Math.round((event.clientX - rect.left) / (rect.width / terminal.cols));
|
||||||
|
const y = Math.round((event.clientY - rect.top) / (rect.height / terminal.rows));
|
||||||
|
const button = event.deltaY < 0 ? 64 : 65;
|
||||||
|
terminal.input(`\x1b[<${button};${x};${y}M`);
|
||||||
|
terminal.input(`\x1b[<${button - 32};${x};${y}m`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
canvas.addEventListener('wheel', handleMouseTrackingWheel, { capture: true });
|
||||||
|
}
|
||||||
|
|
||||||
localTerminalTextarea =
|
localTerminalTextarea =
|
||||||
(terminal as unknown as { textarea?: HTMLTextAreaElement | null }).textarea
|
(terminal as unknown as { textarea?: HTMLTextAreaElement | null }).textarea
|
||||||
?? container.querySelector('textarea');
|
?? container.querySelector('textarea');
|
||||||
@@ -1082,6 +1103,8 @@ const TerminalViewport = React.forwardRef<TerminalController, TerminalViewportPr
|
|||||||
localDisposables.forEach((disposable) => disposable.dispose());
|
localDisposables.forEach((disposable) => disposable.dispose());
|
||||||
restorePatchedScrollToBottom?.();
|
restorePatchedScrollToBottom?.();
|
||||||
restorePatchedScrollToBottom = null;
|
restorePatchedScrollToBottom = null;
|
||||||
|
mouseTrackingWheelCleanupRef.current?.();
|
||||||
|
mouseTrackingWheelCleanupRef.current = null;
|
||||||
if (localTerminalTextarea) {
|
if (localTerminalTextarea) {
|
||||||
localTerminalTextarea.removeEventListener('focus', handleTerminalTextareaFocus);
|
localTerminalTextarea.removeEventListener('focus', handleTerminalTextareaFocus);
|
||||||
localTerminalTextarea.removeEventListener('blur', handleTerminalTextareaBlur);
|
localTerminalTextarea.removeEventListener('blur', handleTerminalTextareaBlur);
|
||||||
|
|||||||
Reference in New Issue
Block a user