Workspace ManagerInternals

Choose documentation 3

latest

Current version

latest
English

Prerelease This site documents an alpha of libtmux. Its structure, URLs and APIs are subject to change.

Edit this page on GitHub

C# workspace builder examples

LibTmux.Workspace 0.0.0-alpha.20 · Source

Build a two-window workspace, print its size, and remove its private tmux server. Use a POSIX host with tmux on PATH and the .NET 10 SDK.

Create the project

In a new directory, fetch the source revision used by this documentation:

Terminal window
$ mkdir dotnet-workspace-example
$ cd dotnet-workspace-example
$ git init -q libtmux-source
$ git -C libtmux-source remote add origin https://github.com/libtmux/libtmux-dotnet.git
$ git -C libtmux-source fetch --depth=1 origin 320dc64f4b8b7815842471327a5e6b84a1499bf8
$ git -C libtmux-source checkout --detach FETCH_HEAD

Save the following project file. The project reference builds the workspace package and its core dependency from that checkout.

WorkspaceExample.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<ProjectReference Include="libtmux-source/src/LibTmux/LibTmux.csproj" />
<ProjectReference Include="libtmux-source/src/LibTmux.Workspace/LibTmux.Workspace.csproj" />
</ItemGroup>
</Project>

Build and inspect

Save this complete program as Program.cs beside the project file:

Program.cs
using System;
using System.Threading;
using System.Threading.Tasks;
using LibTmux;
using LibTmux.Workspace;
internal static class Program
{
private static async Task Main()
{
if (OperatingSystem.IsWindows())
throw new PlatformNotSupportedException("This example requires POSIX tmux.");
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(30));
WorkspaceFile workspace = WorkspaceFile.Parse("""
session_name: built
options:
default-shell: /bin/sh
windows:
- window_name: editor
panes:
- shell_command: echo editing
- shell_command: echo watching
- window_name: server
panes:
- shell_command: echo serving
""");
await using var owned = await Server.CreateOwnedAsync(
new ServerConnectionOptions
{
SocketName = $"workspace-{Guid.NewGuid():N}",
ConfigurationFile = "/dev/null",
},
deadline.Token);
WorkspaceResult result = await new WorkspaceBuilder(owned.Value)
.BuildAsync(workspace, deadline.Token);
Console.WriteLine($"{result.Session.Name}: {result.Windows.Count} windows");
foreach (string unsupported in result.Unsupported)
Console.WriteLine(unsupported);
}
}

Build and run it from the example directory:

Terminal window
$ dotnet run --project WorkspaceExample.csproj --configuration Release

The program prints built: 2 windows. The owned scope removes the server on success or failure. Its unique socket and empty tmux configuration keep the example separate from an existing server. The deadline bounds construction; owned-scope cleanup uses its own lifetime.

BuildAsync returns after creating the workspace and sending its commands. That does not establish completion of programs running in the panes. A build failure can leave partial results; the owned server scope removes them here.

Workspace API source

Esc

Type to search.