Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions src/DevSpaces/DevSpaceRegistry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,6 @@ public static ViewModels.DevSpaces GetOrCreate(ViewModels.Repository repository)
return GetOrCreateEntry(repository)?.Model;
}

public static void PrepareForRepositorySwitch(ViewModels.Repository repository)
{
if (repository == null || string.IsNullOrEmpty(repository.FullPath))
return;

if (_spaces.TryGetValue(repository.FullPath, out var entry))
entry.Model.ActivateDashboard();
}

public static ViewModels.DevSpaces Attach(ViewModels.Repository repository, Border host)
{
if (repository == null || host == null)
Expand Down
51 changes: 51 additions & 0 deletions src/DevSpaces/TerminalViewportState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using System;

namespace DevBoard.DevSpaces
{
internal sealed class TerminalViewportState
{
public void Update(int columns, int rows)
{
if (columns <= 0 || rows <= 0)
return;

lock (_gate)
{
_columns = columns;
_rows = rows;
_apply?.Invoke(columns, rows);
}
}

public void Attach(Action<int, int> apply)
{
ArgumentNullException.ThrowIfNull(apply);

lock (_gate)
{
_apply = apply;
apply(_columns, _rows);
}
}

public void Detach()
{
lock (_gate)
_apply = null;
}

public (int Columns, int Rows) Current
{
get
{
lock (_gate)
return (_columns, _rows);
}
}

private readonly object _gate = new();
private Action<int, int> _apply;
private int _columns = 80;
private int _rows = 25;
}
}
14 changes: 10 additions & 4 deletions src/DevSpaces/WindowsTerminalDevSpaceSurface.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,20 @@ public async Task StartAsync(DevSpaceLaunchSpec spec)

await _host.WaitForNativeCreatedAsync(_cts.Token).ConfigureAwait(false);

var viewport = _viewport.Current;
var options = new PtyOptions
{
Name = spec.Process,
App = spec.Process,
CommandLine = spec.Arguments,
Cwd = spec.WorkingDirectory,
Cols = 80,
Rows = 25,
Cols = viewport.Columns,
Rows = viewport.Rows,
};

_pty = await PtyProvider.SpawnAsync(options, _cts.Token).ConfigureAwait(false);
_pty.ProcessExited += OnProcessExited;
_viewport.Attach(ResizePty);
_acceptInput = true;

_readerTask = ReadOutputAsync(_cts.Token);
Expand Down Expand Up @@ -97,6 +99,7 @@ public void Stop()
_host.TerminalResized -= OnTerminalResized;
_host.ScrollChanged -= OnScrollChanged;
_scrollBar.PropertyChanged -= OnScrollBarPropertyChanged;
_viewport.Detach();

var pty = _pty;
_pty = null;
Expand Down Expand Up @@ -208,9 +211,11 @@ private void OnInputGenerated(string text)

private void OnTerminalResized(int cols, int rows)
{
if (cols <= 0 || rows <= 0)
return;
_viewport.Update(cols, rows);
}

private void ResizePty(int cols, int rows)
{
try
{
_pty?.Resize(cols, rows);
Expand Down Expand Up @@ -276,6 +281,7 @@ private void RaiseExited(int exitCode)
private readonly Views.WindowsTerminalNativeHost _host = new();
private readonly ScrollBar _scrollBar = new();
private readonly TerminalTranscriptSink _transcriptSink;
private readonly TerminalViewportState _viewport = new();
private readonly CancellationTokenSource _cts = new();
private readonly Channel<string> _input = Channel.CreateUnbounded<string>(new UnboundedChannelOptions
{
Expand Down
20 changes: 20 additions & 0 deletions tests/DevBoard.Tests/TerminalViewportStateDetachTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using DevBoard.DevSpaces;
using Xunit;

namespace DevBoard.Tests;

public class TerminalViewportStateDetachTests
{
[Fact]
public void Detach_StopsApplyingFutureResizeEvents()
{
var state = new TerminalViewportState();
var calls = 0;
state.Attach((_, _) => calls++);
state.Detach();

state.Update(140, 48);

Assert.Equal(1, calls);
}
}
44 changes: 44 additions & 0 deletions tests/DevBoard.Tests/TerminalViewportStateTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using DevBoard.DevSpaces;
using Xunit;

namespace DevBoard.Tests;

public class TerminalViewportStateTests
{
[Fact]
public void Attach_ReplaysSizeObservedBeforePtyExists()
{
var state = new TerminalViewportState();
state.Update(132, 44);

(int Columns, int Rows)? applied = null;
state.Attach((columns, rows) => applied = (columns, rows));

Assert.Equal((132, 44), applied);
}

[Fact]
public void Update_AppliesNewSizeAfterPtyIsAttached()
{
var state = new TerminalViewportState();
(int Columns, int Rows)? applied = null;
state.Attach((columns, rows) => applied = (columns, rows));

state.Update(101, 37);

Assert.Equal((101, 37), applied);
}

[Fact]
public void InvalidSize_DoesNotReplaceLastValidViewport()
{
var state = new TerminalViewportState();
state.Update(120, 40);
state.Update(0, 0);

(int Columns, int Rows)? applied = null;
state.Attach((columns, rows) => applied = (columns, rows));

Assert.Equal((120, 40), applied);
}
}
Loading