Choose the telnet window's colours on the window thread
The window picked a brush on the socket thread, and Avalonia crashed the program the next time it painted that line. A line that arrives is now posted to the window thread first. Spots no longer show the bell character as a box, and an unexpected error in the cluster loop is shown instead of ending it silently. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -107,8 +107,15 @@ public sealed partial class TelnetWindow : RefreshableWindow
|
|||||||
cluster.ConnectionChanged -= OnConnectionChanged;
|
cluster.ConnectionChanged -= OnConnectionChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLineArrived(object? sender, string line)
|
/// The cluster raises its events on a socket thread, and a brush belongs to
|
||||||
|
/// the thread that made it, so the colour is chosen on the window thread.
|
||||||
|
private void OnLineArrived(object? sender, string line) =>
|
||||||
|
Dispatcher.UIThread.Post(() => ShowArrived(line));
|
||||||
|
|
||||||
|
private void ShowArrived(string line)
|
||||||
{
|
{
|
||||||
|
// nodes end a spot with the bell character, which draws as a box
|
||||||
|
line = line.Replace("\a", "");
|
||||||
if (line.StartsWith("***", StringComparison.Ordinal))
|
if (line.StartsWith("***", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
Show(line, NoticeColour);
|
Show(line, NoticeColour);
|
||||||
@@ -128,7 +135,8 @@ public sealed partial class TelnetWindow : RefreshableWindow
|
|||||||
session.Settings.SpotFilter.PreferredSpotters.Any(one =>
|
session.Settings.SpotFilter.PreferredSpotters.Any(one =>
|
||||||
one.Length > 0 && spotter.StartsWith(one, StringComparison.OrdinalIgnoreCase));
|
one.Length > 0 && spotter.StartsWith(one, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
private void OnLineSent(object? sender, string line) => Show($"> {line}", SentColour);
|
private void OnLineSent(object? sender, string line) =>
|
||||||
|
Dispatcher.UIThread.Post(() => Show($"> {line}", SentColour));
|
||||||
|
|
||||||
private void OnConnectionChanged(object? sender, bool connected) =>
|
private void OnConnectionChanged(object? sender, bool connected) =>
|
||||||
Dispatcher.UIThread.Post(Refresh);
|
Dispatcher.UIThread.Post(Refresh);
|
||||||
|
|||||||
@@ -170,6 +170,12 @@ public sealed class ClusterClient : IDisposable
|
|||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// anything else would end the loop with nothing on the screen
|
||||||
|
Notice($"*** {Host}:{Port} stopped: {e}");
|
||||||
|
SetConnected(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SessionAsync(CancellationToken cancellation)
|
private async Task SessionAsync(CancellationToken cancellation)
|
||||||
|
|||||||
Reference in New Issue
Block a user