Send cursor position every second
This commit is contained in:
+56
-21
@@ -11,6 +11,7 @@ export function startMonitoring(useLocalhost: boolean, runId: string) {
|
|||||||
let moves: LiveRunMove[] = [];
|
let moves: LiveRunMove[] = [];
|
||||||
|
|
||||||
let lastText = "";
|
let lastText = "";
|
||||||
|
let lastCursorOffset: number | undefined;
|
||||||
let lastEventTime = Date.now();
|
let lastEventTime = Date.now();
|
||||||
let idleTimeout: NodeJS.Timeout | undefined;
|
let idleTimeout: NodeJS.Timeout | undefined;
|
||||||
let isSending = false;
|
let isSending = false;
|
||||||
@@ -18,7 +19,9 @@ export function startMonitoring(useLocalhost: boolean, runId: string) {
|
|||||||
const IDLE_MS = 350;
|
const IDLE_MS = 350;
|
||||||
|
|
||||||
if (vscode.window.activeTextEditor) {
|
if (vscode.window.activeTextEditor) {
|
||||||
lastText = vscode.window.activeTextEditor.document.getText();
|
const editor = vscode.window.activeTextEditor;
|
||||||
|
lastText = editor.document.getText();
|
||||||
|
lastCursorOffset = editor.document.offsetAt(editor.selection.active);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function flush(file: string | null, language: string | null) {
|
async function flush(file: string | null, language: string | null) {
|
||||||
@@ -42,41 +45,72 @@ export function startMonitoring(useLocalhost: boolean, runId: string) {
|
|||||||
return latency;
|
return latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Existing text change interval ---
|
||||||
const readInterval = setInterval(() => {
|
const readInterval = setInterval(() => {
|
||||||
const editor = vscode.window.activeTextEditor;
|
const editor = vscode.window.activeTextEditor;
|
||||||
if (!editor) return;
|
if (!editor) return;
|
||||||
|
|
||||||
const newText = editor.document.getText();
|
const newText = editor.document.getText();
|
||||||
if (newText === lastText) return;
|
if (newText !== lastText) {
|
||||||
|
let latency = getLatency();
|
||||||
|
|
||||||
let latency = getLatency();
|
const diffs = dmp.diff_main(lastText, newText);
|
||||||
|
dmp.diff_cleanupEfficiency(diffs);
|
||||||
|
|
||||||
const diffs = dmp.diff_main(lastText, newText);
|
const changes = diffsToChanges(diffs);
|
||||||
dmp.diff_cleanupEfficiency(diffs);
|
|
||||||
|
|
||||||
const changes = diffsToChanges(diffs);
|
lastText = newText;
|
||||||
|
|
||||||
lastText = newText;
|
for (const change of changes) {
|
||||||
|
moves.push({
|
||||||
|
moveId: moveId++,
|
||||||
|
latency,
|
||||||
|
cursor: editor.document.offsetAt(editor.selection.active),
|
||||||
|
changes: change,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idleTimeout) clearTimeout(idleTimeout);
|
||||||
|
idleTimeout = setTimeout(
|
||||||
|
() =>
|
||||||
|
flush(
|
||||||
|
path.basename(editor?.document.fileName || "") || null,
|
||||||
|
editor?.document.languageId || null,
|
||||||
|
),
|
||||||
|
IDLE_MS,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
// --- New cursor tracking interval ---
|
||||||
|
const cursorInterval = setInterval(() => {
|
||||||
|
const editor = vscode.window.activeTextEditor;
|
||||||
|
if (!editor) return;
|
||||||
|
|
||||||
|
const cursorOffset = editor.document.offsetAt(editor.selection.active);
|
||||||
|
|
||||||
|
if (cursorOffset !== lastCursorOffset) {
|
||||||
|
const latency = getLatency();
|
||||||
|
|
||||||
for (const change of changes) {
|
|
||||||
moves.push({
|
moves.push({
|
||||||
moveId: moveId++,
|
moveId: moveId++,
|
||||||
latency,
|
latency,
|
||||||
cursor: editor.document.offsetAt(editor.selection.active),
|
cursor: cursorOffset,
|
||||||
changes: change,
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (idleTimeout) clearTimeout(idleTimeout);
|
lastCursorOffset = cursorOffset;
|
||||||
idleTimeout = setTimeout(
|
|
||||||
() =>
|
if (idleTimeout) clearTimeout(idleTimeout);
|
||||||
flush(
|
idleTimeout = setTimeout(
|
||||||
path.basename(editor?.document.fileName || "") || null,
|
() =>
|
||||||
editor?.document.languageId || null,
|
flush(
|
||||||
),
|
path.basename(editor.document.fileName || "") || null,
|
||||||
IDLE_MS,
|
editor.document.languageId || null,
|
||||||
);
|
),
|
||||||
}, 500);
|
IDLE_MS,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, 1000); // every second
|
||||||
|
|
||||||
vscode.window.onDidChangeActiveTextEditor((editor) => {
|
vscode.window.onDidChangeActiveTextEditor((editor) => {
|
||||||
let latency = getLatency();
|
let latency = getLatency();
|
||||||
@@ -99,6 +133,7 @@ export function startMonitoring(useLocalhost: boolean, runId: string) {
|
|||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
clearInterval(readInterval);
|
clearInterval(readInterval);
|
||||||
|
clearInterval(cursorInterval);
|
||||||
if (idleTimeout) clearTimeout(idleTimeout);
|
if (idleTimeout) clearTimeout(idleTimeout);
|
||||||
flush(
|
flush(
|
||||||
path.basename(vscode.window.activeTextEditor?.document.fileName || "") ||
|
path.basename(vscode.window.activeTextEditor?.document.fileName || "") ||
|
||||||
|
|||||||
Reference in New Issue
Block a user