Skip to content

fix(desktop): adopt Ghostty keyboard model in v2 terminal#3700

Merged
Kitenite merged 4 commits into
mainfrom
speckled-jodhpur
Apr 24, 2026
Merged

fix(desktop): adopt Ghostty keyboard model in v2 terminal#3700
Kitenite merged 4 commits into
mainfrom
speckled-jodhpur

Conversation

@Kitenite
Copy link
Copy Markdown
Collaborator

@Kitenite Kitenite commented Apr 24, 2026

Summary

v2 terminal runtime only filtered app hotkeys, so with kitty keyboard protocol enabled (required for Shift+Enter disambiguation in claude-code, modifier reporting in neovim/helix), every Mac Cmd chord xterm saw got CSI-u encoded and leaked into TUIs as a literal char — Cmd+V → v, Cmd+C → c. Line-edit niceties that v1 handles (Cmd+←/→/⌫, Option+←/→) never worked in v2 at all.

Mirrors Ghostty's approach (src/input/key_encode.zig:534-545: "on macOS, command+keys do not encode text"): bubble every Mac Cmd chord out to the host before xterm's kitty encoder runs, then port v1's line-edit chord translators so shell navigation is identical in both renderers.

  • Broaden shouldBubbleClipboardShortcut's Mac branch: bubble all Cmd chords (not just Cmd+C/V with selection gating). v1 benefits too.
  • Port v1's line-edit translators into v2's custom key handler: Cmd+←/→/⌫, Option+←/→, Windows Ctrl+←/→. Duplicates v1 for now; a follow-up can share the handler.
  • Wire shouldSelectAllShortcut into v2 so Cmd+A selects the terminal buffer.
  • Use xterm.input(data, true) to inject translated sequences into the PTY (fires onData, forwarded by terminal-ws-transport).
  • Restructure tests around the new Mac rule.

This is a cherry-pick of 70bd191 from the debug branch — the fix is complementary to the TERM_PROGRAM=kitty change that already landed (TERM_PROGRAM=kitty lets TUIs parse CSI-u; this stops us from sending CSI-u for chords the host should own).

Related upstream fix against codex: https://github.com/openai/codex/pull/new/fix/cmd-key-text-insertion-on-macos — widens codex's "is this key text?" gate to treat SUPER as a shortcut modifier. Not needed once Cmd chords are bubbled at the xterm layer, but defends against other kitty-speaking terminals that don't.

Test plan

  • bun test for clipboardShortcuts.test.ts — 4 pass, 22 assertions.
  • bun typecheck for @superset/desktop — clean.
  • Manual smoke: inside a v2 terminal pane, run codex / claude-code / vim / less:
    • Cmd+V pastes from host clipboard (no v leak).
    • Cmd+C copies selection (no c leak when nothing selected).
    • Cmd+← / Cmd+→ / Cmd+⌫ behave in shell like v1.
    • Option+← / Option+→ word-navigate in shell.
    • Cmd+A selects terminal buffer.
    • Shift+Enter still disambiguates correctly in claude-code.

Summary by cubic

Adopts Ghostty’s keyboard model in the v2 terminal so macOS Cmd chords never become CSI‑u input and v1 shell navigation matches. Restores reliable copy/paste, Select All, and line‑edit shortcuts across platforms.

  • Bug Fixes

    • macOS: bubble all Cmd chords to the host before kitty encoding; no more Cmd+V/C leaks into TUIs. Do not preventDefault on bubbled clipboard chords so the browser paste pipeline runs.
    • Translate line‑edit chords (Cmd+←/→/⌫, Option+←/→, Windows Ctrl+←/→) and inject via xterm.input(..., true) so shells respond correctly.
    • Cmd+A selects the terminal buffer.
    • Windows/Linux: standard clipboard rules—Ctrl+V and Ctrl+Shift+V paste; Ctrl+C bubbles only with selection; Ctrl+Shift+C always bubbles; Shift+Insert pastes on Linux. Tests updated.
  • Refactors

    • Collapsed line‑edit translation into a grouped form with a small onlyMod helper; behavior unchanged and easier to extend.

Written for commit cd821a5. Summary will update on new commits.

Summary by CodeRabbit

  • Bug Fixes

    • Terminal keyboard handling improved: host hotkeys take precedence, Select All is consistently honored, platform-specific line-edit chords are delivered correctly, and clipboard shortcuts follow clearer macOS/Windows/Linux bubbling rules to avoid duplicate or suppressed copy/paste actions.
  • Tests

    • Clipboard shortcut tests updated to reflect the new platform-specific behaviors.

v2's terminal runtime only filtered app hotkeys. With kitty keyboard
protocol enabled (needed for Shift+Enter disambiguation in claude-code,
modifier reporting in neovim/helix), every Mac Cmd chord xterm saw got
CSI-u encoded and leaked into TUIs as a literal char — and line-edit
niceties like Cmd+Left/Right/Backspace and Option+Left/Right that v1
handles never worked at all.

Mirror Ghostty's approach (src/input/key_encode.zig:534-545: "on macOS,
command+keys do not encode text"): bubble every Mac Cmd chord out to
the host before xterm's kitty encoder runs, then port v1's line-edit
chord translators so shell navigation works the same in both renderers.

Changes:
- Broaden shouldBubbleClipboardShortcut's Mac branch to bubble all Cmd
  chords (not just Cmd+C/V with selection gating). v1 benefits too.
- Port v1's line-edit translators into v2's custom key handler:
  Cmd+Left/Right/Backspace, Option+Left/Right, Windows Ctrl+Left/Right.
  Duplicates v1 for now; a follow-up can share the handler properly.
- Wire shouldSelectAllShortcut into v2 so Cmd+A selects terminal buffer.
- Use xterm.input(data, true) to inject translated sequences into the
  PTY (fires onData, forwarded by terminal-ws-transport).
- Restructure tests around the new Mac rule.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: be62260c-41d9-4c85-a56c-e65f7de7abbb

📥 Commits

Reviewing files that changed from the base of the PR and between 4741cce and cd821a5.

📒 Files selected for processing (1)
  • apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts

📝 Walkthrough

Walkthrough

Replaces the prior xterm key handler with a factory-produced handler attached to the terminal. The new handler short-circuits host hotkeys, translates platform line-edit chords into escape bytes and injects them, handles select-all, and conditionally bubbles clipboard shortcuts per platform/selection.

Changes

Cohort / File(s) Summary
Terminal Key Handler
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
Installs createKeyEventHandler(terminal) replacing previous custom logic. New handler resolves host hotkeys, prevents xterm processing for them, translates platform-specific line-edit chords into escape sequences and injects via terminal.input(..., true), handles select-all, and integrates clipboard-bubbling checks.
Clipboard Bubbling Logic
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.ts
Rewrites shouldBubbleClipboardShortcut rules: macOS now bubbles any metaKey chord; Windows bubbles Ctrl/Ctrl+Shift C/V (plain Ctrl+C requires selection); Linux/non-mac bubbles Ctrl+Shift+V, Shift+Insert, and Ctrl+Shift+C.
Clipboard Test Suite
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.test.ts
Updates and reorganizes tests into table-driven cases to reflect the new platform-specific bubbling model and selection rules.

Sequence Diagram

sequenceDiagram
    participant User as User Input
    participant Handler as Custom Key Handler
    participant HotKey as Host Hotkey Resolver
    participant Translate as Line-Edit Translator
    participant SelectAll as Select-All Checker
    participant Clipboard as Clipboard-Bubble Checker
    participant Terminal as Terminal/PTY
    participant Host as Host App

    User->>Handler: keydown
    Handler->>HotKey: resolveHotkeyFromEvent(event)
    alt Host hotkey detected
        HotKey-->>Handler: hotkey
        Handler->>Terminal: preventDefault (suppress xterm processing)
        Handler->>Host: dispatch host hotkey action
    else Not a host hotkey
        HotKey-->>Handler: none
        Handler->>Translate: match line-edit chord?
        alt Line-edit matched
            Translate-->>Handler: escape bytes
            Handler->>Terminal: terminal.input(bytes, true) + preventDefault
        else Not line-edit
            Handler->>SelectAll: shouldSelectAllShortcut?
            alt Select-all matched
                SelectAll-->>Handler: true
                Handler->>Terminal: terminal.selectAll() + preventDefault
            else Not select-all
                Handler->>Clipboard: shouldBubbleClipboardShortcut?
                alt Should bubble
                    Clipboard-->>Handler: true
                    Handler->>Host: allow event to bubble (no preventDefault)
                else Keep in terminal
                    Clipboard-->>Handler: false
                    Handler->>Terminal: preventDefault (consume)
                end
            end
        end
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Poem

🐇 I nibble keys and hop with delight,

Cmds now pass, some stay for the night,
Escape bytes tumble in a neat row,
Clips may bubble or stay down low,
Hooray — the terminal hums, carrot glow! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix(desktop): adopt Ghostty keyboard model in v2 terminal' accurately summarizes the main change: adopting Ghostty's keyboard handling approach for macOS Cmd chords in the v2 terminal.
Description check ✅ Passed The pull request description comprehensively covers the issue, approach, concrete changes, test plan, and additional context. It exceeds the template requirements with detailed explanations and manual test steps.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch speckled-jodhpur

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Apr 24, 2026

Greptile Summary

This PR adopts Ghostty's keyboard model in the v2 terminal: all Mac Cmd chords are bubbled to the host before xterm's kitty encoder runs, preventing CSI-u sequences from leaking into TUIs as literal characters (e.g. Cmd+V → v). It also ports v1's line-edit chord translators (Cmd+←/→/⌫, Option+←/→, Windows Ctrl+←/→) into v2 and wires up Cmd+A for select-all.

Confidence Score: 5/5

Safe to merge; all remaining findings are minor style/future-proofing suggestions with no correctness impact.

The handler ordering (hotkey → line-edit translation → select-all → bubble → pass-through) is correct, escape sequences are hardcoded constants with no injection risk, the Linux Ctrl+Shift+C behavioural change is intentional and tested, and the test suite covers the new Mac rule comprehensively. Only P2 items remain.

No files require special attention.

Important Files Changed

Filename Overview
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts Replaces the minimal isAppHotkey guard with a full createKeyEventHandler that translates Mac/Windows line-edit chords and bubbles all Mac Cmd chords (Ghostty pattern) before xterm's kitty encoder runs. Logic order (resolve hotkey → translate → selectAll → bubble → pass through) is correct.
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.ts Mac branch simplified to return event.metaKey (all Cmd chords bubble). Windows/Linux paths refactored slightly; Linux Ctrl+Shift+C now bubbles without requiring a selection — intentional behavioural change matching the new test assertions.
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.test.ts Tests restructured into three clear groups (Mac all-Cmd, Mac non-Cmd, Windows/Linux standard bindings). Coverage is thorough and correctly validates the new Ghostty-style rule and the unchanged platform-specific paths.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[KeyboardEvent fires] --> B{resolveHotkeyFromEvent?}
    B -- yes --> C[return false\nbubble to react-hotkeys-hook]
    B -- no --> D{translateLineEditChord?}
    D -- match --> E[keydown? → terminal.input seq\nreturn false]
    D -- no match --> F{shouldSelectAllShortcut\nCmd+A on Mac?}
    F -- yes --> G[keydown? → terminal.selectAll\nreturn false]
    F -- no --> H{shouldBubbleClipboardShortcut?}
    H -- Mac: any metaKey\nWin/Linux: specific binds --> I[return false\nbubble to Electron menu / OS]
    H -- no --> J[return true\nxterm handles normally]
Loading
Prompt To Fix All With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
Line: 32-35

Comment:
**`navigator.platform` is deprecated**

`navigator.platform` was deprecated in the Living Standard and may be removed in future browser/Electron versions. The recommended replacement is `navigator.userAgentData?.platform` (available in Chromium-based Electron builds), with a graceful fallback.

```suggestion
	const platform =
		typeof navigator !== "undefined"
			? (navigator.userAgentData?.platform ?? navigator.platform).toLowerCase()
			: "";
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
Line: 40-47

Comment:
**`translateLineEditChord` suppresses `keyup` for matched chords**

When a chord (e.g. Cmd+Left) is matched, the handler returns `false` for every event type, including `keyup`. Only `keydown` sends `terminal.input`, but xterm never sees the `keyup` for that chord. In practice xterm's custom key handler is primarily meaningful for `keydown`, so this is unlikely to cause problems, but a comment clarifying the intent would improve readability.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(desktop): adopt Ghostty keyboard mod..." | Re-trigger Greptile

Comment on lines +32 to +35
const platform =
typeof navigator !== "undefined" ? navigator.platform.toLowerCase() : "";
const isMac = platform.includes("mac");
const isWindows = platform.includes("win");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 navigator.platform is deprecated

navigator.platform was deprecated in the Living Standard and may be removed in future browser/Electron versions. The recommended replacement is navigator.userAgentData?.platform (available in Chromium-based Electron builds), with a graceful fallback.

Suggested change
const platform =
typeof navigator !== "undefined" ? navigator.platform.toLowerCase() : "";
const isMac = platform.includes("mac");
const isWindows = platform.includes("win");
const platform =
typeof navigator !== "undefined"
? (navigator.userAgentData?.platform ?? navigator.platform).toLowerCase()
: "";
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
Line: 32-35

Comment:
**`navigator.platform` is deprecated**

`navigator.platform` was deprecated in the Living Standard and may be removed in future browser/Electron versions. The recommended replacement is `navigator.userAgentData?.platform` (available in Chromium-based Electron builds), with a graceful fallback.

```suggestion
	const platform =
		typeof navigator !== "undefined"
			? (navigator.userAgentData?.platform ?? navigator.platform).toLowerCase()
			: "";
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +40 to +47
const translation = translateLineEditChord(event, { isMac, isWindows });
if (translation !== null) {
if (event.type === "keydown") {
event.preventDefault();
terminal.input(translation, true);
}
return false;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 translateLineEditChord suppresses keyup for matched chords

When a chord (e.g. Cmd+Left) is matched, the handler returns false for every event type, including keyup. Only keydown sends terminal.input, but xterm never sees the keyup for that chord. In practice xterm's custom key handler is primarily meaningful for keydown, so this is unlikely to cause problems, but a comment clarifying the intent would improve readability.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
Line: 40-47

Comment:
**`translateLineEditChord` suppresses `keyup` for matched chords**

When a chord (e.g. Cmd+Left) is matched, the handler returns `false` for every event type, including `keyup`. Only `keydown` sends `terminal.input`, but xterm never sees the `keyup` for that chord. In practice xterm's custom key handler is primarily meaningful for `keydown`, so this is unlikely to cause problems, but a comment clarifying the intent would improve readability.

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts (1)

80-164: Optional: collapse the repeated modifier checks into a small lookup table.

Seven near-identical blocks differ only in (platform, key, required-modifier, output). A table-driven form keeps the exact-modifier-match invariant in one helper and makes it easier to add chords later (e.g., Option+Backspace → \x1b\x7f) without another copy-paste.

♻️ Proposed refactor sketch
-function translateLineEditChord(
-	event: KeyboardEvent,
-	options: { isMac: boolean; isWindows: boolean },
-): string | null {
-	const { isMac, isWindows } = options;
-
-	if (
-		isMac &&
-		event.key === "Backspace" &&
-		event.metaKey &&
-		!event.ctrlKey &&
-		!event.altKey &&
-		!event.shiftKey
-	) {
-		return "\x15\x1b[D";
-	}
-	// ... six more near-identical blocks
-	return null;
-}
+type Mod = "meta" | "alt" | "ctrl";
+type ChordRule = {
+	platform: "mac" | "win";
+	key: string;
+	mod: Mod;
+	seq: string;
+};
+
+const LINE_EDIT_CHORDS: readonly ChordRule[] = [
+	{ platform: "mac", key: "Backspace", mod: "meta", seq: "\x15\x1b[D" },
+	{ platform: "mac", key: "ArrowLeft", mod: "meta", seq: "\x01" },
+	{ platform: "mac", key: "ArrowRight", mod: "meta", seq: "\x05" },
+	{ platform: "mac", key: "ArrowLeft", mod: "alt", seq: "\x1bb" },
+	{ platform: "mac", key: "ArrowRight", mod: "alt", seq: "\x1bf" },
+	{ platform: "win", key: "ArrowLeft", mod: "ctrl", seq: "\x1bb" },
+	{ platform: "win", key: "ArrowRight", mod: "ctrl", seq: "\x1bf" },
+];
+
+function hasOnlyModifier(event: KeyboardEvent, mod: Mod): boolean {
+	return (
+		event.metaKey === (mod === "meta") &&
+		event.altKey === (mod === "alt") &&
+		event.ctrlKey === (mod === "ctrl") &&
+		!event.shiftKey
+	);
+}
+
+function translateLineEditChord(
+	event: KeyboardEvent,
+	options: { isMac: boolean; isWindows: boolean },
+): string | null {
+	for (const rule of LINE_EDIT_CHORDS) {
+		const platformMatches =
+			(rule.platform === "mac" && options.isMac) ||
+			(rule.platform === "win" && options.isWindows);
+		if (
+			platformMatches &&
+			event.key === rule.key &&
+			hasOnlyModifier(event, rule.mod)
+		) {
+			return rule.seq;
+		}
+	}
+	return null;
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts` around lines 80 -
164, Refactor translateLineEditChord to replace the seven repeated if-blocks
with a table-driven approach: define a mapping array of entries (referencing
translateLineEditChord) where each entry specifies platform predicate (e.g.,
isMac/isWindows), key, exact modifier requirements (meta, ctrl, alt, shift) and
the output string, and implement a small helper (e.g.,
matchExactModifiers(event, requiredModifiers)) that returns true only when each
modifier exactly matches the required boolean; iterate the mapping and return
the first matching entry's output or null. Ensure the helper checks exact
equality for all four modifiers so behavior remains identical to the current
checks and include existing outputs like "\x15\x1b[D", "\x01", "\x05", "\x1bb",
"\x1bf".
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts`:
- Around line 80-164: Refactor translateLineEditChord to replace the seven
repeated if-blocks with a table-driven approach: define a mapping array of
entries (referencing translateLineEditChord) where each entry specifies platform
predicate (e.g., isMac/isWindows), key, exact modifier requirements (meta, ctrl,
alt, shift) and the output string, and implement a small helper (e.g.,
matchExactModifiers(event, requiredModifiers)) that returns true only when each
modifier exactly matches the required boolean; iterate the mapping and return
the first matching entry's output or null. Ensure the helper checks exact
equality for all four modifiers so behavior remains identical to the current
checks and include existing outputs like "\x15\x1b[D", "\x01", "\x05", "\x1bb",
"\x1bf".

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 51216c8a-eec6-4ff8-8415-ffe9bcc2b0f8

📥 Commits

Reviewing files that changed from the base of the PR and between 8ce1519 and 07755a8.

📒 Files selected for processing (3)
  • apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.test.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/clipboardShortcuts.ts

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 3 files

Matches VS Code (terminalInstance.ts:1116-1175) and Tabby (xtermFrontend.ts:199-214):
call `event.preventDefault()` before returning false from the custom key
handler so the browser's default action can't double-fire alongside the
Electron `role: 'paste'`/`'copy'` accelerator registered in
src/main/lib/menu.ts. Paste still flows — webContents.paste() dispatches
the paste event on the focused textarea independently of the DOM keydown
default, and xterm's paste listener picks it up.

Keydown-only — preventDefault on keyup is a no-op and would suppress
kitty protocol release events we still want xterm to handle.
Seven near-identical 8-line blocks collapsed to a platform+modifier
grouped structure with a tiny onlyMod helper. Same behavior, ~55 fewer
lines, adding a new chord is one line instead of ten.
Broke Cmd+C/V. On Electron macOS, the browser's keydown → paste-command
pipeline is what dispatches the paste event on xterm's textarea, and
preventDefault blocks that pipeline. VS Code and Tabby can preventDefault
because they implement paste themselves (command system / ClipboardAddon);
we rely on xterm's built-in paste listener, so the default must run.

Revert of 36cf276.
@Kitenite Kitenite merged commit 9268654 into main Apr 24, 2026
7 checks passed
@Kitenite Kitenite deleted the speckled-jodhpur branch April 24, 2026 06:01
@github-actions
Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ⚠️ Neon database branch

Thank you for your contribution! 🎉

MocA-Love added a commit to MocA-Love/superset that referenced this pull request Apr 24, 2026
sync: merge upstream/main through superset-sh#3700 (ours) to reduce behind count
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant