scroll/src/bun/ffi.ts

55 lines
1.2 KiB
JavaScript
Raw Normal View History

// Bun-specific ffi code
import { dlopen, ptr, FFIType, suffix, toArrayBuffer } from "bun:ffi";
import {STDIN_FILENO, TCSANOW} from "../common/ffi";
const termiosArray = new Uint8Array(60);
const getLib = (name: string) => {
return dlopen(
name,
{
tcgetattr: {
args: ['i32', 'pointer'],
returns: 'i32',
},
tcsetattr: {
args: ['i32', 'i32', 'pointer'],
returns: 'i32',
},
cfmakeraw: {
args: ['pointer'],
returns: 'void',
},
},
);
}
let cStdLib = {symbols: {}};
try {
cStdLib = getLib(`libc.${suffix}`);
} catch {
cStdLib = getLib(`libc.${suffix}.6`);
}
export const enableRawMode = () => {
// Get the current termios settings
const termiosPtr = ptr(termiosArray);
cStdLib.symbols.tcgetattr(STDIN_FILENO, termiosPtr);
const oldTermios = new Uint8Array(toArrayBuffer(termiosPtr, 0, 60), 0, 60);
console.info(oldTermios);
// Update termios struct with raw settings
cStdLib.symbols.cfmakeraw(termiosPtr);
// Actually set the new termios settings
cStdLib.symbols.tcsetattr(STDIN_FILENO, TCSANOW, termiosPtr);
return () => {
const oldTermiosPtr = ptr(oldTermios);
cStdLib.symbols.tcsetattr(STDIN_FILENO, TCSANOW, oldTermiosPtr);
}
}