<html aria-label="message body"><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><p style="box-sizing: border-box; margin: 0px auto; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Hello,</p><p style="box-sizing: border-box; margin: 0px auto; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><br></p><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Submitting a stack of four PRs that together make brltty practical to run on macOS — particularly with HID-class braille displays while VoiceOver is also active — and incidentally tighten a few cross-platform paths along the way.</p><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">Current state on macOS (before this work)</h2><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Plugging in a HID-class braille display (Baum VarioUltra, Brailliant, etc.) makes IOHIDFamily claim it exclusively at the kernel level. brltty's existing USB acquisition path hits <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">kIOReturnExclusiveAccess</code> and gives up — the display is unreachable unless VoiceOver is fully quit and the device is replugged in a specific order.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">The IOKit USB layer's synchronous <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">WritePipe</code> on interrupt OUT pipes blocks indefinitely when the device NAKs (which HID-class displays do while they're streaming IN reports). Result: occasional 10–60 s freezes during fast typing.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">No screen driver knows how to read macOS application content. Even if the device worked, brltty would just see an empty screen.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Input-side latency profile: ~200 ms keystroke → braille refresh. Most of that is brltty-internal (USB poll cadence, alarm-suspend re-queueing, update-schedule debounce).</p></li></ul><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">The stack</h2><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Four PRs, each self-contained and reviewable in isolation, intended to be merged in order:</p><ol style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><a class="autolink" href="https://github.com/brltty/brltty/pull/529" style="box-sizing: border-box; color: rgb(204, 204, 204);">https://github.com/brltty/brltty/pull/529</a> — Cross-platform responsiveness tuning (5 commits, no Darwin code)</li><li style="box-sizing: border-box;"><a class="autolink" href="https://github.com/brltty/brltty/pull/530" style="box-sizing: border-box; color: rgb(204, 204, 204);">https://github.com/brltty/brltty/pull/530</a> — Darwin: USB transport for HID-class displays</li><li style="box-sizing: border-box;"><a class="autolink" href="https://github.com/brltty/brltty/pull/531" style="box-sizing: border-box; color: rgb(204, 204, 204);">https://github.com/brltty/brltty/pull/531</a> — Darwin: add the MacOSAccessibility screen driver (mo)</li><li style="box-sizing: border-box;"><a class="autolink" href="https://github.com/brltty/brltty/pull/532" style="box-sizing: border-box; color: rgb(204, 204, 204);">https://github.com/brltty/brltty/pull/532</a> — Darwin: register FileViewer / Tmux / Screen / TerminalEmulator drivers</li></ol><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Each PR's description has the per-commit rationale; below is the shape of the analysis behind them.</p><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">Cross-platform tuning (PR #529)</h2><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">While instrumenting the input path on macOS, five issues turned out to be platform-agnostic and worth fixing independently:</p><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;"><code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">BRAILLE_DRIVER_INPUT_POLL_INTERVAL</code> interacts badly with the per-host-controller <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">bInterval</code>calculation in <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">usbAwaitInput</code>: on USB 2.0 high-speed devices with <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">bInterval=10</code> the per-iteration sleep ends up at 64 ms. Capped at the existing <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">USB_INPUT_AWAIT_RETRY_INTERVAL_MINIMUM</code>.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;"><code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">setCommandAlarm</code> refused to schedule while <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">commandQueueSuspendCount > 0</code>, which adds the input-handler's full duration to command-dispatch latency. The suspend region is inside the alarm loop, not synchronous user code, and <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">env->handlingCommand</code>already guards re-entry — the gate is safe to drop.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;"><code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">UPDATE_SCHEDULE_DELAY</code> was 15 ms (sized for slow USB writes on older hardware). On modern USB it shows up directly in keystroke → refresh latency. Lowered to 5 ms.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Default HID timeouts in <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">gioInitializeDescriptor</code>were left at 0. Aligned with the USB / Bluetooth defaults (1000 ms).</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Baum's HID probe path was treating user input that happens to arrive during probing as unexpected packets and aborting. Made it skip routing / display / entry / joystick reports cleanly.</p></li></ul><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">Darwin USB transport (PR #530)</h2><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Two coordinated changes in <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Programs/usb_darwin.c</code>:</p><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Device capture: <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">USBDeviceReEnumerate(kUSBReEnumerateCaptureDeviceMask)</code> detaches the device from IOHIDFamily so brltty can claim the USB interface. Released on shutdown.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Async I/O: a pthread-managed CFRunLoop thread owns the IOKit async event source; <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">completedRequests</code> is mutex-protected; IN endpoints wake brltty's main loop through a self-pipe + <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">asyncMonitorFileInput</code>; OUT writes go through <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">WritePipeAsync</code> + <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">pthread_cond_timedwait</code> + <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">AbortPipe</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">ClearPipeStallBothEnds</code> on timeout. The synchronous <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">WritePipe</code>-blocks-forever pathology is gone.</p></li></ul><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Effect: input latency drops to ~50–80 ms; no more multi-second hangs.</p><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">MacOSAccessibility screen driver (PR #531)</h2><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">New <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Drivers/Screen/MacOSAccessibility</code> driver code <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">mo</code>:</p><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Reads frontmost app content via AX (visible character range + cursor via parameterized attributes). AXObserver runs on a dedicated CFRunLoop thread; main loop wakes via self-pipe.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Posts CGEvents for key injection. Layout-aware keycode lookup via <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">UCKeyTranslate</code> so <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Cmd+A</code> on AZERTY actually triggers Select All (rather than the keycode-0 → <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">kVK_ANSI_A</code> coincidence that masks the bug on QWERTY).</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;"><code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">SWITCHVT_PREV</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">NEXT</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">N</code> mapped to <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Ctrl+Shift+Tab</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Ctrl+Tab</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">Cmd+N</code>, with post-switch focus repair on the new tab's text view.</p></li></ul><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">Additional drivers (PR #532)</h2><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;"><code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">brltty-pty</code>: skip the isatty checks when invoked with <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">--driver-directives</code> so the <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">em</code> screen driver can spawn it as a daemon child.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Build <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">fv</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">tx</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">sc</code> / <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">em</code> on darwin too. <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">fv</code> is needed for the built-in help and learn-mode; it links against <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">-lncurses</code> on macOS (no separate <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">libtinfo</code>).</p></li></ul><h2 style="box-sizing: border-box; margin-top: calc(2.857143em); margin-bottom: calc(1.666667em); font-size: calc(1.166667em); line-height: calc(1.428571); font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; text-align: center; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204);">What I'd appreciate</h2><ul style="box-sizing: border-box; padding-left: 1.5rem; margin: calc(1.666667em) auto 0px; list-style: none; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;"><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Architectural sanity check on PR #530's CFRunLoop-thread approach — there might be an idiom in brltty I missed.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Confirmation on the chosen default modifier + character behaviour (explicit press/release of <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">kVK_Command</code> etc.) in PR #531 — was considered for upstream but I haven't seen it elsewhere in the codebase.</p></li><li style="box-sizing: border-box;"><p style="box-sizing: border-box; margin: 0px auto;">Whether the existing <code style="box-sizing: border-box; font-family: iAWriterMono, monospace; font-size: 0.94em; border-radius: 2px; white-space: pre-wrap; background-color: rgba(245, 245, 245, 0.06); padding: 0.08333em 0.1667em 0.1667em;">brltty-pty</code> TTY check (PR #532) was intentional for some scenario I'm overlooking.</p></li></ul><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Each PR is currently in draft so it doesn't trigger CI prematurely; I'll flip them ready as soon as discussion starts. Happy to split, squash, or rebase as the review prefers.</p><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Thanks, </p><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">— </p><p style="box-sizing: border-box; margin: calc(1.666667em) auto 0px; font-family: IBMPlexSans, iAWriterEmphasis, iAWriterDuo5, -apple-system, "Helvetica Neue", Arial, sans-serif; caret-color: rgb(204, 204, 204); color: rgb(204, 204, 204); font-size: 18px;">Yannick</p></body></html>