* Illustrates #2331 (Scrollview not respecting clip) does not reproduce (#2332) * Proves that the issue #2331 don't have reason to happen. * fixes #2336 * Fixes #2331. ScrollView may not be honoring clip region; CustomButton shows outside * More appropriate solution for the issue #2331. * Start refactoring LineCanvas for mixing line style support (e.g. double into single) * Add remaining resolvers * Implement corner border style mixing in LineCanvas * Refactor and simplify resolvers * Move tests to Core folder and namespace to Terminal.Gui.CoreTests * Fixes #2333. TextField is selecting badly a word on double click. * Add unit test deleting a word with accented char. * Fixes 2331. ScrollView may not be honoring clip region. * Add a custom button scenario. * Fixes #2350. Clipping broke (see Clipping scenario). * Is preferable use NeedDisplay instead of Bounds. --------- Co-authored-by: Tig Kindel <tig@users.noreply.github.com> Co-authored-by: tznind <tznind@dundee.ac.uk> * Fixes ASCIICustomButton scenario. * Adds Snake Scenario (#2353) * Add empty snake scenario * Move snake head around * Snake now has a tail * Rest of logic implementation * Ctrl K D layout fixes * Game gets faster as you collect more apples * Adjust speed increase rate down * Use white on black for snake and border and red for apple * Fix ScenarioTests not Disposing Scenario * Add disposes and fix to use LineCanvas.GenerateImage * Fix stack overflow, doh! --------- Co-authored-by: Tig <tig@users.noreply.github.com> * Fixes 2368. Nested views with height of 1 not rendering correctly. --------- Co-authored-by: Tig Kindel <tig@users.noreply.github.com> Co-authored-by: tznind <tznind@dundee.ac.uk> Co-authored-by: Thomas Nind <31306100+tznind@users.noreply.github.com>
Terminal.Gui - Cross Platform Terminal UI toolkit for .NET
A toolkit for building rich console apps for .NET, .NET Core, and Mono that works on Windows, the Mac, and Linux/Unix.
Quick Start
Paste these commands into your favorite terminal on Windows, Mac, or Linux. This will install the Terminal.Gui.Templates, create a new "Hello World" TUI app, and run it.
(Press CTRL-Q to exit the app)
dotnet new --install Terminal.Gui.templates
dotnet new tui -n myproj
cd myproj
dotnet run
Documentation
- Documentation Home
- Terminal.Gui Overview
- List of Views/Controls
- Conceptual Documentation
- API Documentation
The Documentation matches the most recent Nuget release from the main branch ()
Features
- Cross Platform - Windows, Mac, and Linux. Terminal drivers for Curses, Windows Console, and the .NET Console mean apps will work well on both color and monochrome terminals.
- Keyboard and Mouse Input - Both keyboard and mouse input are supported, including support for drag & drop.
- Flexible Layout - Supports both Absolute layout and an innovative Computed Layout system. Computed Layout makes it easy to layout controls relative to each other and enables dynamic terminal UIs.
- Configuration & Themes - Terminal.Gui supports a rich configuration system that allows end-user customization of how the UI looks (e.g. colors) and behaves (e.g. key-bindings).
- Clipboard support - Cut, Copy, and Paste of text provided through the
Clipboardclass. - Arbitrary Views - All visible UI elements are subclasses of the
Viewclass, and these in turn can contain an arbitrary number of sub-views. - Advanced App Features - The Mainloop supports processing events, idle handlers, timers, and monitoring file descriptors. Most classes are safe for threading.
- Reactive Extensions - Use reactive extensions and benefit from increased code readability, and the ability to apply the MVVM pattern and ReactiveUI data bindings. See the source code of a sample app in order to learn how to achieve this.
Showcase & Examples
- UI Catalog - The UI Catalog project provides an easy to use and extend sample illustrating the capabilities of Terminal.Gui. Run
dotnet run --project UICatalogto run the UI Catalog. - C# Example - Run
dotnet runin theExampledirectory to run the C# Example. - F# Example - An example showing how to build a Terminal.Gui app using F#.
- Reactive Example - A sample app that shows how to use
System.ReactiveandReactiveUIwithTerminal.Gui. The app uses the MVVM architecture that may seem familiar to folks coming from WPF, Xamarin Forms, UWP, Avalonia, or Windows Forms. In this app, we implement the data bindings using ReactiveUIWhenAnyValuesyntax and Pharmacist — a tool that converts all events in a NuGet package into observable wrappers. - PowerShell's
Out-ConsoleGridView-OCGVsends the output from a command to an interactive table. - PoshRedisViewer - A compact Redis viewer module for PowerShell written in F# and Gui.cs
- TerminalGuiDesigner - Cross platform view designer for building Terminal.Gui applications.
See the Terminal.Gui/ README for an overview of how the library is structured. The Conceptual Documentation provides insight into core concepts.
Sample Usage in C#
The following example shows a basic Terminal.Gui application written in C#:
// A simple Terminal.Gui example in C# - using C# 9.0 Top-level statements
using Terminal.Gui;
Application.Run<ExampleWindow> ();
System.Console.WriteLine ($"Username: {((ExampleWindow)Application.Top).usernameText.Text}");
// Before the application exits, reset Terminal.Gui for clean shutdown
Application.Shutdown ();
// Defines a top-level window with border and title
public class ExampleWindow : Window {
public TextField usernameText;
public ExampleWindow ()
{
Title = "Example App (Ctrl+Q to quit)";
// Create input components and labels
var usernameLabel = new Label () {
Text = "Username:"
};
usernameText = new TextField ("") {
// Position text field adjacent to the label
X = Pos.Right (usernameLabel) + 1,
// Fill remaining horizontal space
Width = Dim.Fill (),
};
var passwordLabel = new Label () {
Text = "Password:",
X = Pos.Left (usernameLabel),
Y = Pos.Bottom (usernameLabel) + 1
};
var passwordText = new TextField ("") {
Secret = true,
// align with the text box above
X = Pos.Left (usernameText),
Y = Pos.Top (passwordLabel),
Width = Dim.Fill (),
};
// Create login button
var btnLogin = new Button () {
Text = "Login",
Y = Pos.Bottom(passwordLabel) + 1,
// center the login button horizontally
X = Pos.Center (),
IsDefault = true,
};
// When login button is clicked display a message popup
btnLogin.Clicked += () => {
if (usernameText.Text == "admin" && passwordText.Text == "password") {
MessageBox.Query ("Logging In", "Login Successful", "Ok");
Application.RequestStop ();
} else {
MessageBox.ErrorQuery ("Logging In", "Incorrect username or password", "Ok");
}
};
// Add the views to the Window
Add (usernameLabel, usernameText, passwordLabel, passwordText, btnLogin);
}
}
When run the application looks as follows:
Sample application running
Installing
Use NuGet to install the Terminal.Gui NuGet package: https://www.nuget.org/packages/Terminal.Gui
Installation in .NET Core Projects
To install Terminal.Gui into a .NET Core project, use the dotnet CLI tool with following command.
dotnet add package Terminal.Gui
Or, you can use the Terminal.Gui.Templates.
Building the Library and Running the Examples
- Windows, Mac, and Linux - Build and run using the .NET SDK command line tools (
dotnet buildin the root directory). RunUICatalogwithdotnet run --project UICatalog. - Windows - Open
Terminal.slnwith Visual Studio 2022.
See CONTRIBUTING.md for instructions for downloading and forking the source.
Contributing
See CONTRIBUTING.md.
Debates on architecture and design can be found in Issues tagged with design.
History
See gui-cs for how this project came to be.

