diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4e3d976..571236b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,10 @@ jobs: env: DisableRealDriverIO: "1" + # Splat.Core's author signing cert was revoked, which fails `dotnet restore` + # with NU3012 under online revocation checks. Offline mode skips the online + # OCSP/CRL lookup so restore succeeds. Unrelated to the gui-cs→tui-cs rename. + NUGET_CERT_REVOCATION_MODE: offline steps: - uses: actions/checkout@v4 diff --git a/AGENTS.md b/AGENTS.md index e49e748..bdb6311 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,12 +1,12 @@ # Terminal.Gui Examples — AI Agent Instructions -Community examples for [Terminal.Gui](https://github.com/gui-cs/Terminal.Gui). +Community examples for [Terminal.Gui](https://github.com/tui-cs/Terminal.Gui). ## CRITICAL: Discard v1 Training Data Terminal.Gui v2 is a **complete rewrite**. Pre-2025 training data is **wrong**. -> Read the [ai-v2-primer](https://github.com/gui-cs/Terminal.Gui/blob/develop/ai-v2-primer.md) FIRST. +> Read the [ai-v2-primer](https://github.com/tui-cs/Terminal.Gui/blob/develop/ai-v2-primer.md) FIRST. ### v1 → v2 Quick Corrections diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3ef3254..bc91c94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ Thank you for your interest in contributing examples! 1. **One example per directory** — each example should be self-contained 2. **Use NuGet references** — reference Terminal.Gui via ``, not ProjectReference -3. **Follow coding conventions** — see the `.editorconfig` and [Terminal.Gui CONTRIBUTING.md](https://github.com/gui-cs/Terminal.Gui/blob/develop/CONTRIBUTING.md) +3. **Follow coding conventions** — see the `.editorconfig` and [Terminal.Gui CONTRIBUTING.md](https://github.com/tui-cs/Terminal.Gui/blob/develop/CONTRIBUTING.md) 4. **Include a README** — explain what the example demonstrates and how to run it 5. **Keep it focused** — each example should demonstrate one concept or integration pattern 6. **Ensure it builds** — run `dotnet build` before submitting diff --git a/Config/example_config.json b/Config/example_config.json index 5e553b0..dc8710d 100644 --- a/Config/example_config.json +++ b/Config/example_config.json @@ -1 +1 @@ -{ "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "ConfigurationManager.ThrowOnJsonErrors": false, "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc"] }, "Suspend": { "Linux": ["Ctrl+Z"], "Macos": ["Ctrl+Z"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup": { "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "Driver.Force16Colors": false, "Application.ForceDriver": "", "Application.IsMouseDisabled": false, "Key.Separator": "+", "MenuBar.DefaultKey": "F10", "PopoverMenu.DefaultKey": "Shift+F10", "FileDialog.MaxSearchResults": 10000, "FileDialogStyle.DefaultUseColors": false, "FileDialogStyle.DefaultUseUnicodeCharacters": false, "Theme": "Gruntled", "Themes": [ { "Gruntled": { "Glyphs": { "CheckStateChecked": "Γ£ô" }, "Schemes": [ { "TopLevel": { "Normal": { "Foreground": "OrangeRed", "Background": "AntiqueWhite" }, "Focus": { "Foreground": "White", "Background": "Maroon" }, "HotNormal": { "Foreground": "DarkRed", "Background": "AntiqueWhite" }, "HotFocus": { "Foreground": "Yellow", "Background": "Maroon" }, "Disabled": { "Foreground": "LightPink", "Background": "AntiqueWhite" } } }, { "Base": { "Normal": { "Foreground": "White", "Background": "OrangeRed" }, "Focus": { "Foreground": "FireBrick", "Background": "AntiqueWhite" }, "HotNormal": { "Foreground": "Gold", "Background": "OrangeRed" }, "HotFocus": { "Foreground": "FireBrick", "Background": "AntiqueWhite" }, "Disabled": { "Foreground": "LightPink", "Background": "OrangeRed" } } }, { "Dialog": { "Normal": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "Focus": { "Foreground": "DarkGray", "Background": "LightGray" }, "HotNormal": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "HotFocus": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "Disabled": { "Foreground": "Gray", "Background": "DarkGray" } } }, { "Menu": { "Normal": { "Foreground": "White", "Background": "FireBrick" }, "Focus": { "Foreground": "White", "Background": "DarkRed" }, "HotNormal": { "Foreground": "Yellow", "Background": "FireBrick" }, "HotFocus": { "Foreground": "Yellow", "Background": "DarkRed" }, "Disabled": { "Foreground": "Gray", "Background": "DarkGray" } } }, { "Error": { "Normal": { "Foreground": "Yellow", "Background": "DarkRed" }, "Focus": { "Foreground": "DarkSalmon", "Background": "Brown" }, "HotNormal": { "Foreground": "Black", "Background": "DarkRed" }, "HotFocus": { "Foreground": "FireBrick", "Background": "Brown" }, "Disabled": { "Foreground": "DarkGray", "Background": "DarkRed" } } } ] } } ]} \ No newline at end of file +{ "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "ConfigurationManager.ThrowOnJsonErrors": false, "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc"] }, "Suspend": { "Linux": ["Ctrl+Z"], "Macos": ["Ctrl+Z"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup": { "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "Driver.Force16Colors": false, "Application.ForceDriver": "", "Application.IsMouseDisabled": false, "Key.Separator": "+", "MenuBar.DefaultKey": "F10", "PopoverMenu.DefaultKey": "Shift+F10", "FileDialog.MaxSearchResults": 10000, "FileDialogStyle.DefaultUseColors": false, "FileDialogStyle.DefaultUseUnicodeCharacters": false, "Theme": "Gruntled", "Themes": [ { "Gruntled": { "Glyphs": { "CheckStateChecked": "Γ£ô" }, "Schemes": [ { "TopLevel": { "Normal": { "Foreground": "OrangeRed", "Background": "AntiqueWhite" }, "Focus": { "Foreground": "White", "Background": "Maroon" }, "HotNormal": { "Foreground": "DarkRed", "Background": "AntiqueWhite" }, "HotFocus": { "Foreground": "Yellow", "Background": "Maroon" }, "Disabled": { "Foreground": "LightPink", "Background": "AntiqueWhite" } } }, { "Base": { "Normal": { "Foreground": "White", "Background": "OrangeRed" }, "Focus": { "Foreground": "FireBrick", "Background": "AntiqueWhite" }, "HotNormal": { "Foreground": "Gold", "Background": "OrangeRed" }, "HotFocus": { "Foreground": "FireBrick", "Background": "AntiqueWhite" }, "Disabled": { "Foreground": "LightPink", "Background": "OrangeRed" } } }, { "Dialog": { "Normal": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "Focus": { "Foreground": "DarkGray", "Background": "LightGray" }, "HotNormal": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "HotFocus": { "Foreground": "FireBrick", "Background": "GhostWhite" }, "Disabled": { "Foreground": "Gray", "Background": "DarkGray" } } }, { "Menu": { "Normal": { "Foreground": "White", "Background": "FireBrick" }, "Focus": { "Foreground": "White", "Background": "DarkRed" }, "HotNormal": { "Foreground": "Yellow", "Background": "FireBrick" }, "HotFocus": { "Foreground": "Yellow", "Background": "DarkRed" }, "Disabled": { "Foreground": "Gray", "Background": "DarkGray" } } }, { "Error": { "Normal": { "Foreground": "Yellow", "Background": "DarkRed" }, "Focus": { "Foreground": "DarkSalmon", "Background": "Brown" }, "HotNormal": { "Foreground": "Black", "Background": "DarkRed" }, "HotFocus": { "Foreground": "FireBrick", "Background": "Brown" }, "Disabled": { "Foreground": "DarkGray", "Background": "DarkRed" } } } ] } } ]} \ No newline at end of file diff --git a/Config/macos.json b/Config/macos.json index c27bab9..e26deb9 100644 --- a/Config/macos.json +++ b/Config/macos.json @@ -1 +1 @@ -{ "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc", "Ctrl+Q"] }, "Suspend": { "All": ["Ctrl+Z"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup":{ "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "View.DefaultKeyBindings": { "Left": { "All": ["CursorLeft"] }, "Right": { "All": ["CursorRight"] }, "Up": { "All": ["CursorUp"] }, "Down": { "All": ["CursorDown"] }, "PageUp": { "All": ["PageUp"] }, "PageDown": { "All": ["PageDown"] }, "LeftStart": { "All": ["Home"] }, "RightEnd": { "All": ["End"] }, "Start": { "All": ["Ctrl+Home"] }, "End": { "All": ["Ctrl+End"] }, "LeftExtend": { "All": ["Shift+CursorLeft"] }, "RightExtend": { "All": ["Shift+CursorRight"] }, "UpExtend": { "All": ["Shift+CursorUp"] }, "DownExtend": { "All": ["Shift+CursorDown"] }, "PageUpExtend": { "All": ["Shift+PageUp"] }, "PageDownExtend": { "All": ["Shift+PageDown"] }, "LeftStartExtend": { "All": ["Shift+Home"] }, "RightEndExtend": { "All": ["Shift+End"] }, "StartExtend": { "All": ["Ctrl+Shift+Home"] }, "EndExtend": { "All": ["Ctrl+Shift+End"] }, "Copy": { "All": ["Ctrl+C"] }, "Cut": { "All": ["Ctrl+X"] }, "Paste": { "All": ["Ctrl+V"] }, "Undo": { "All": ["Ctrl+Z", "Ctrl+/"] }, "Redo": { "All": ["Ctrl+Y", "Ctrl+Shift+Z"] }, "SelectAll": { "All": ["Ctrl+A"] }, "DeleteCharLeft": { "All": ["Backspace"] }, "DeleteCharRight": { "All": ["Delete", "Ctrl+D"] } }, "View.ViewKeyBindings": { "TextField": { "CutToEndOfLine": { "All": ["Ctrl+K"] }, "KillWordRight": { "All": ["Ctrl+W"] } } }} \ No newline at end of file +{ "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc", "Ctrl+Q"] }, "Suspend": { "All": ["Ctrl+Z"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup":{ "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "View.DefaultKeyBindings": { "Left": { "All": ["CursorLeft"] }, "Right": { "All": ["CursorRight"] }, "Up": { "All": ["CursorUp"] }, "Down": { "All": ["CursorDown"] }, "PageUp": { "All": ["PageUp"] }, "PageDown": { "All": ["PageDown"] }, "LeftStart": { "All": ["Home"] }, "RightEnd": { "All": ["End"] }, "Start": { "All": ["Ctrl+Home"] }, "End": { "All": ["Ctrl+End"] }, "LeftExtend": { "All": ["Shift+CursorLeft"] }, "RightExtend": { "All": ["Shift+CursorRight"] }, "UpExtend": { "All": ["Shift+CursorUp"] }, "DownExtend": { "All": ["Shift+CursorDown"] }, "PageUpExtend": { "All": ["Shift+PageUp"] }, "PageDownExtend": { "All": ["Shift+PageDown"] }, "LeftStartExtend": { "All": ["Shift+Home"] }, "RightEndExtend": { "All": ["Shift+End"] }, "StartExtend": { "All": ["Ctrl+Shift+Home"] }, "EndExtend": { "All": ["Ctrl+Shift+End"] }, "Copy": { "All": ["Ctrl+C"] }, "Cut": { "All": ["Ctrl+X"] }, "Paste": { "All": ["Ctrl+V"] }, "Undo": { "All": ["Ctrl+Z", "Ctrl+/"] }, "Redo": { "All": ["Ctrl+Y", "Ctrl+Shift+Z"] }, "SelectAll": { "All": ["Ctrl+A"] }, "DeleteCharLeft": { "All": ["Backspace"] }, "DeleteCharRight": { "All": ["Delete", "Ctrl+D"] } }, "View.ViewKeyBindings": { "TextField": { "CutToEndOfLine": { "All": ["Ctrl+K"] }, "KillWordRight": { "All": ["Ctrl+W"] } } }} \ No newline at end of file diff --git a/Config/windows.json b/Config/windows.json index 9d9a15b..44df4d9 100644 --- a/Config/windows.json +++ b/Config/windows.json @@ -1 +1 @@ -{ "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup":{ "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "View.DefaultKeyBindings": { "Left": { "All": ["CursorLeft"] }, "Right": { "All": ["CursorRight"] }, "Up": { "All": ["CursorUp"] }, "Down": { "All": ["CursorDown"] }, "PageUp": { "All": ["PageUp"] }, "PageDown": { "All": ["PageDown"] }, "LeftStart": { "All": ["Home"] }, "RightEnd": { "All": ["End"] }, "Start": { "All": ["Ctrl+Home"] }, "End": { "All": ["Ctrl+End"] }, "LeftExtend": { "All": ["Shift+CursorLeft"] }, "RightExtend": { "All": ["Shift+CursorRight"] }, "UpExtend": { "All": ["Shift+CursorUp"] }, "DownExtend": { "All": ["Shift+CursorDown"] }, "PageUpExtend": { "All": ["Shift+PageUp"] }, "PageDownExtend": { "All": ["Shift+PageDown"] }, "LeftStartExtend": { "All": ["Shift+Home"] }, "RightEndExtend": { "All": ["Shift+End"] }, "StartExtend": { "All": ["Ctrl+Shift+Home"] }, "EndExtend": { "All": ["Ctrl+Shift+End"] }, "Copy": { "All": ["Ctrl+C"] }, "Cut": { "All": ["Ctrl+X"] }, "Paste": { "All": ["Ctrl+V"] }, "Undo": { "All": ["Ctrl+Z"] }, "Redo": { "All": ["Ctrl+Y"] }, "SelectAll": { "All": ["Ctrl+A"] }, "DeleteCharLeft": { "All": ["Backspace"] }, "DeleteCharRight": { "All": ["Delete"] } }, "View.ViewKeyBindings": { "TextField": { "WordLeft": { "All": ["Ctrl+CursorLeft"] }, "WordRight": { "All": ["Ctrl+CursorRight"] }, "WordLeftExtend": { "All": ["Ctrl+Shift+CursorLeft"] }, "WordRightExtend":{ "All": ["Ctrl+Shift+CursorRight"] } } }} \ No newline at end of file +{ "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Application.DefaultKeyBindings": { "Quit": { "All": ["Esc"] }, "Arrange": { "All": ["Ctrl+F5"] }, "NextTabStop": { "All": ["Tab"] }, "PreviousTabStop": { "All": ["Shift+Tab"] }, "NextTabGroup": { "All": ["F6"] }, "PreviousTabGroup":{ "All": ["Shift+F6"] }, "Refresh": { "All": ["F5"] } }, "View.DefaultKeyBindings": { "Left": { "All": ["CursorLeft"] }, "Right": { "All": ["CursorRight"] }, "Up": { "All": ["CursorUp"] }, "Down": { "All": ["CursorDown"] }, "PageUp": { "All": ["PageUp"] }, "PageDown": { "All": ["PageDown"] }, "LeftStart": { "All": ["Home"] }, "RightEnd": { "All": ["End"] }, "Start": { "All": ["Ctrl+Home"] }, "End": { "All": ["Ctrl+End"] }, "LeftExtend": { "All": ["Shift+CursorLeft"] }, "RightExtend": { "All": ["Shift+CursorRight"] }, "UpExtend": { "All": ["Shift+CursorUp"] }, "DownExtend": { "All": ["Shift+CursorDown"] }, "PageUpExtend": { "All": ["Shift+PageUp"] }, "PageDownExtend": { "All": ["Shift+PageDown"] }, "LeftStartExtend": { "All": ["Shift+Home"] }, "RightEndExtend": { "All": ["Shift+End"] }, "StartExtend": { "All": ["Ctrl+Shift+Home"] }, "EndExtend": { "All": ["Ctrl+Shift+End"] }, "Copy": { "All": ["Ctrl+C"] }, "Cut": { "All": ["Ctrl+X"] }, "Paste": { "All": ["Ctrl+V"] }, "Undo": { "All": ["Ctrl+Z"] }, "Redo": { "All": ["Ctrl+Y"] }, "SelectAll": { "All": ["Ctrl+A"] }, "DeleteCharLeft": { "All": ["Backspace"] }, "DeleteCharRight": { "All": ["Delete"] } }, "View.ViewKeyBindings": { "TextField": { "WordLeft": { "All": ["Ctrl+CursorLeft"] }, "WordRight": { "All": ["Ctrl+CursorRight"] }, "WordLeftExtend": { "All": ["Ctrl+Shift+CursorLeft"] }, "WordRightExtend":{ "All": ["Ctrl+Shift+CursorRight"] } } }} \ No newline at end of file diff --git a/InlineColorPicker/Program.cs b/InlineColorPicker/Program.cs index 99e8dc0..0aa9ff9 100644 --- a/InlineColorPicker/Program.cs +++ b/InlineColorPicker/Program.cs @@ -1,6 +1,6 @@ // Inline ColorPicker — demonstrates using RunnableWrapper in inline mode. // -// NOTE: See https://github.com/gui-cs/clet that turns every Terminal.Gui View into a CLI command +// NOTE: See https://github.com/tui-cs/clet that turns every Terminal.Gui View into a CLI command // NOTE: — typed inputs, a real file picker, a Markdown viewer — with consistent JSON output, // NOTE: predictable exit codes, and full keyboard/mouse support. Works for humans and AI agents alike. // diff --git a/InlineSelect/Program.cs b/InlineSelect/Program.cs index b42b269..87ede12 100644 --- a/InlineSelect/Program.cs +++ b/InlineSelect/Program.cs @@ -1,6 +1,6 @@ // InlineSelect — demonstrates using RunnableWrapper in inline mode. // -// NOTE: See https://github.com/gui-cs/clet that turns every Terminal.Gui View into a CLI command +// NOTE: See https://github.com/tui-cs/clet that turns every Terminal.Gui View into a CLI command // NOTE: — typed inputs, a real file picker, a Markdown viewer — with consistent JSON output, // NOTE: predictable exit codes, and full keyboard/mouse support. Works for humans and AI agents alike. // diff --git a/PromptExample/Program.cs b/PromptExample/Program.cs index 80ac76e..a76394f 100644 --- a/PromptExample/Program.cs +++ b/PromptExample/Program.cs @@ -1,5 +1,5 @@ // Example demonstrating the Prompt API for getting typed input from users -// NOTE: See https://github.com/gui-cs/clet that turns every Terminal.Gui View into a CLI command +// NOTE: See https://github.com/tui-cs/clet that turns every Terminal.Gui View into a CLI command // NOTE: — typed inputs, a real file picker, a Markdown viewer — with consistent JSON output, // NOTE: predictable exit codes, and full keyboard/mouse support. Works for humans and AI agents alike. diff --git a/README.md b/README.md index 00fda8c..47c3a5d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Terminal.Gui Examples -Community examples and standalone demos for [Terminal.Gui](https://github.com/gui-cs/Terminal.Gui) — the cross-platform .NET console UI toolkit. +Community examples and standalone demos for [Terminal.Gui](https://github.com/tui-cs/Terminal.Gui) — the cross-platform .NET console UI toolkit. > **Note:** These examples are companion projects to the main Terminal.Gui repository. -> For the UICatalog demo app and ScenarioRunner, see [gui-cs/Terminal.Gui/Examples](https://github.com/gui-cs/Terminal.Gui/tree/develop/Examples). +> For the UICatalog demo app and ScenarioRunner, see [tui-cs/Terminal.Gui/Examples](https://github.com/tui-cs/Terminal.Gui/tree/develop/Examples). ## Prerequisites @@ -70,7 +70,7 @@ This replaces the NuGet `PackageReference` with a `ProjectReference`, so any bre ## Contributing -1. Follow Terminal.Gui [coding conventions](https://github.com/gui-cs/Terminal.Gui/blob/develop/CONTRIBUTING.md) +1. Follow Terminal.Gui [coding conventions](https://github.com/tui-cs/Terminal.Gui/blob/develop/CONTRIBUTING.md) 2. Examples reference Terminal.Gui via NuGet by default; use `TerminalGuiRoot` for local development 3. Each example should have its own project directory with a descriptive name 4. Include a README.md in each example explaining what it demonstrates diff --git a/Themes/code-dark.config.json b/Themes/code-dark.config.json index 372bf9c..71a1dbc 100644 --- a/Themes/code-dark.config.json +++ b/Themes/code-dark.config.json @@ -1 +1 @@ -{ "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Themes": [ { "Dark": { "Schemes": [ { "Base": { "CodeKeyword": { "Foreground": "#ff79c6", "Background": "None", "Style": "Bold" }, "CodeString": { "Foreground": "#f1fa8c", "Background": "None", "Style": "None" } } } ] } } ]} \ No newline at end of file +{ "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Themes": [ { "Dark": { "Schemes": [ { "Base": { "CodeKeyword": { "Foreground": "#ff79c6", "Background": "None", "Style": "Bold" }, "CodeString": { "Foreground": "#f1fa8c", "Background": "None", "Style": "None" } } } ] } } ]} \ No newline at end of file diff --git a/WideCharRepro/BUG_REPORT_TEMPLATE.md b/WideCharRepro/BUG_REPORT_TEMPLATE.md index 102885c..0b97100 100644 --- a/WideCharRepro/BUG_REPORT_TEMPLATE.md +++ b/WideCharRepro/BUG_REPORT_TEMPLATE.md @@ -1 +1 @@ -# Bug Report: Wide/Fullwidth Character Rendering Causes Display Tearing## SummaryThe terminal incorrectly renders wide (fullwidth) Unicode characters, advancing the cursor by only 1 column instead of the required 2. This causes all subsequent content on the line to shift left, breaking grid alignment and causing display "tearing" in TUI applications.## Reproduction```bashgit clone https://github.com/gui-cs/Terminal.Gui.gitcd Terminal.Gui/Examples/WideCharReprodotnet run```Or paste this minimal C# program (requires .NET 8+):
Minimal repro (click to expand)```csharpusing System.Text;Console.OutputEncoding = Encoding.UTF8;Console.WriteLine ("TEST: Emoji grid (each emoji = 2 columns)");Console.WriteLine ("┌──┬──┬──┬──┬──┬──┬──┬──┐");Console.WriteLine ("│😀│😁│😂│🤣│😄│😅│😆│😇│");Console.WriteLine ("│──│──│──│──│──│──│──│──│");Console.WriteLine ("│🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│");Console.WriteLine ("└──┴──┴──┴──┴──┴──┴──┴──┘");Console.WriteLine ();Console.WriteLine ("TEST: Column alignment (X should be at column 20)");Console.WriteLine ("01234567890123456789X <- 20 narrow (20×1=20)");Console.WriteLine ("😀😁😂😃😄😅😆😇😈😉X <- 10 emoji (10×2=20)");Console.WriteLine ("你好世界测试宽字符验X <- 10 CJK (10×2=20)");```
## Expected BehaviorEach wide character (emoji, CJK ideograph, fullwidth form) should advance the cursor by **2 columns**. Grid separators (`│`) should be vertically aligned:```┌──┬──┬──┬──┬──┬──┬──┬──┐│😀│😁│😂│🤣│😄│😅│😆│😇││──│──│──│──│──│──│──│──││🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│└──┴──┴──┴──┴──┴──┴──┴──┘```The `X` markers should vertically align at column 20:```01234567890123456789X😀😁😂😃😄😅😆😇😈😉X你好世界测试宽字符验X```## Actual BehaviorWide characters advance the cursor by only 1 column. Grids misalign and text overlaps:```┌──┬──┬──┬──┬──┬──┬──┬──┐│😀│😁│😂│🤣│😄│😅│😆│😇│ <- shifted left│──│──│──│──│──│──│──│──││🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│ <- shifted left└──┴──┴──┴──┴──┴──┴──┴──┘```## Terminal Compatibility Matrix| Terminal | Version | OS | Test 1 (Emoji) | Test 2 (CJK) | Test 3 (Mixed) | Test 4 (Grid) | Test 5 (Align) | Status ||---------|---------|-----|:-:|:-:|:-:|:-:|:-:|--------|| Alacritty | 0.13+ | cross | | | | | | _untested_ || Ghostty | — | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || GitHub Copilot (terminal) | — | macOS | ❌ | ❌ | ❌ | ❌ | ❌ | **FAIL** || GitHub Copilot (terminal) | — | Windows | ❌ | ❌ | ❌ | ❌ | ❌ | **FAIL** || GNOME Terminal | 3.x | Linux | | | | | | _untested_ || iTerm2 | 3.5+ | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Kitty | 0.35+ | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Terminal.app | — | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Visual Studio 2026 (terminal) | — | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || VS Code Insiders (terminal) | 1.x | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || WezTerm | — | cross | | | | | | _untested_ || Windows Terminal | 1.22+ | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** |> **To contributors**: please fill in your terminal's results and submit a PR or comment.## Affected Unicode Ranges- **Emoji** (U+1F600–U+1F64F, U+1F900–U+1F9FF, etc.)- **CJK Unified Ideographs** (U+4E00–U+9FFF)- **CJK Compatibility Ideographs** (U+F900–U+FAFF)- **Fullwidth Forms** (U+FF01–U+FF60)- Any codepoint with Unicode `East_Asian_Width` = `W` (Wide) or `F` (Fullwidth)## ImpactThis bug breaks any TUI application that renders wide characters in a grid or alongside narrow characters. Affected applications include:- [Terminal.Gui](https://github.com/gui-cs/Terminal.Gui) (cross-platform .NET TUI toolkit)- Any ncurses/curses-based app using CJK or emoji- tmux, vim, etc. when displaying wide characters## Relevant Standards- [Unicode TR#11 – East Asian Width](https://www.unicode.org/reports/tr11/)- [POSIX `wcwidth(3)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html)- [Unicode TR#51 – Emoji Presentation](https://www.unicode.org/reports/tr51/)## Environment- OS: [e.g., Windows 11 24H2]- Terminal: [e.g., VS Code Insiders 1.x integrated terminal]- Shell: [e.g., PowerShell 7.5]- Font: [e.g., Cascadia Code NF]- Locale: [e.g., en-US, UTF-8]## Screenshots \ No newline at end of file +# Bug Report: Wide/Fullwidth Character Rendering Causes Display Tearing## SummaryThe terminal incorrectly renders wide (fullwidth) Unicode characters, advancing the cursor by only 1 column instead of the required 2. This causes all subsequent content on the line to shift left, breaking grid alignment and causing display "tearing" in TUI applications.## Reproduction```bashgit clone https://github.com/tui-cs/Terminal.Gui.gitcd Terminal.Gui/Examples/WideCharReprodotnet run```Or paste this minimal C# program (requires .NET 8+):
Minimal repro (click to expand)```csharpusing System.Text;Console.OutputEncoding = Encoding.UTF8;Console.WriteLine ("TEST: Emoji grid (each emoji = 2 columns)");Console.WriteLine ("┌──┬──┬──┬──┬──┬──┬──┬──┐");Console.WriteLine ("│😀│😁│😂│🤣│😄│😅│😆│😇│");Console.WriteLine ("│──│──│──│──│──│──│──│──│");Console.WriteLine ("│🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│");Console.WriteLine ("└──┴──┴──┴──┴──┴──┴──┴──┘");Console.WriteLine ();Console.WriteLine ("TEST: Column alignment (X should be at column 20)");Console.WriteLine ("01234567890123456789X <- 20 narrow (20×1=20)");Console.WriteLine ("😀😁😂😃😄😅😆😇😈😉X <- 10 emoji (10×2=20)");Console.WriteLine ("你好世界测试宽字符验X <- 10 CJK (10×2=20)");```
## Expected BehaviorEach wide character (emoji, CJK ideograph, fullwidth form) should advance the cursor by **2 columns**. Grid separators (`│`) should be vertically aligned:```┌──┬──┬──┬──┬──┬──┬──┬──┐│😀│😁│😂│🤣│😄│😅│😆│😇││──│──│──│──│──│──│──│──││🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│└──┴──┴──┴──┴──┴──┴──┴──┘```The `X` markers should vertically align at column 20:```01234567890123456789X😀😁😂😃😄😅😆😇😈😉X你好世界测试宽字符验X```## Actual BehaviorWide characters advance the cursor by only 1 column. Grids misalign and text overlaps:```┌──┬──┬──┬──┬──┬──┬──┬──┐│😀│😁│😂│🤣│😄│😅│😆│😇│ <- shifted left│──│──│──│──│──│──│──│──││🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│ <- shifted left└──┴──┴──┴──┴──┴──┴──┴──┘```## Terminal Compatibility Matrix| Terminal | Version | OS | Test 1 (Emoji) | Test 2 (CJK) | Test 3 (Mixed) | Test 4 (Grid) | Test 5 (Align) | Status ||---------|---------|-----|:-:|:-:|:-:|:-:|:-:|--------|| Alacritty | 0.13+ | cross | | | | | | _untested_ || Ghostty | — | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || GitHub Copilot (terminal) | — | macOS | ❌ | ❌ | ❌ | ❌ | ❌ | **FAIL** || GitHub Copilot (terminal) | — | Windows | ❌ | ❌ | ❌ | ❌ | ❌ | **FAIL** || GNOME Terminal | 3.x | Linux | | | | | | _untested_ || iTerm2 | 3.5+ | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Kitty | 0.35+ | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Terminal.app | — | macOS | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || Visual Studio 2026 (terminal) | — | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || VS Code Insiders (terminal) | 1.x | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** || WezTerm | — | cross | | | | | | _untested_ || Windows Terminal | 1.22+ | Windows | ✅ | ✅ | ✅ | ✅ | ✅ | **PASS** |> **To contributors**: please fill in your terminal's results and submit a PR or comment.## Affected Unicode Ranges- **Emoji** (U+1F600–U+1F64F, U+1F900–U+1F9FF, etc.)- **CJK Unified Ideographs** (U+4E00–U+9FFF)- **CJK Compatibility Ideographs** (U+F900–U+FAFF)- **Fullwidth Forms** (U+FF01–U+FF60)- Any codepoint with Unicode `East_Asian_Width` = `W` (Wide) or `F` (Fullwidth)## ImpactThis bug breaks any TUI application that renders wide characters in a grid or alongside narrow characters. Affected applications include:- [Terminal.Gui](https://github.com/tui-cs/Terminal.Gui) (cross-platform .NET TUI toolkit)- Any ncurses/curses-based app using CJK or emoji- tmux, vim, etc. when displaying wide characters## Relevant Standards- [Unicode TR#11 – East Asian Width](https://www.unicode.org/reports/tr11/)- [POSIX `wcwidth(3)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html)- [Unicode TR#51 – Emoji Presentation](https://www.unicode.org/reports/tr51/)## Environment- OS: [e.g., Windows 11 24H2]- Terminal: [e.g., VS Code Insiders 1.x integrated terminal]- Shell: [e.g., PowerShell 7.5]- Font: [e.g., Cascadia Code NF]- Locale: [e.g., en-US, UTF-8]## Screenshots \ No newline at end of file