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
18 changes: 18 additions & 0 deletions src/XTerm.NET.Tests/OscSequenceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,18 @@ public void OscHyperlink_StartLink_SetsHyperlink()
{
// Arrange
var terminal = CreateTerminal();
string? changedUrl = null;
var isCleared = true;
terminal.HyperlinkChanged += (sender, e) => changedUrl = e.Url;
terminal.HyperlinkChanged += (sender, e) => isCleared = e.IsCleared;

// Act
terminal.Write("\x1B]8;;http://example.com\x07");

// Assert
Assert.Equal("http://example.com", terminal.CurrentHyperlink);
Assert.Equal("http://example.com", changedUrl);
Assert.False(isCleared);
}

[Fact]
Expand All @@ -141,12 +147,24 @@ public void OscHyperlink_EndLink_ClearsHyperlink()
// Arrange
var terminal = CreateTerminal();
terminal.Write("\x1B]8;;http://example.com\x07");
var eventCount = 0;
string changedUrl = "not cleared";
var isCleared = false;
terminal.HyperlinkChanged += (sender, e) =>
{
eventCount++;
changedUrl = e.Url;
isCleared = e.IsCleared;
};

// Act
terminal.Write("\x1B]8;;\x07");

// Assert
Assert.Null(terminal.CurrentHyperlink);
Assert.Equal(1, eventCount);
Assert.Equal(string.Empty, changedUrl);
Assert.True(isCleared);
}

[Fact]
Expand Down
17 changes: 15 additions & 2 deletions src/XTerm.NET/Events/TerminalEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,29 @@ public DirectoryChangeEventArgs(string directory)
}

/// <summary>
/// Hyperlink event - fired when a hyperlink is encountered.
/// Hyperlink event - fired when a hyperlink is encountered or cleared.
/// </summary>
public class HyperlinkEventArgs : EventArgs
{
/// <summary>
/// Hyperlink URL. Empty when <see cref="IsCleared"/> is true.
/// </summary>
public string Url { get; }

/// <summary>
/// True when the active hyperlink was cleared.
/// </summary>
public bool IsCleared { get; }

public HyperlinkEventArgs(string url)
: this(url, false)
{
}

internal HyperlinkEventArgs(string url, bool isCleared)
{
Url = url;
IsCleared = isCleared;
}
}

Expand Down Expand Up @@ -267,4 +281,3 @@ public CursorStyleChangedEventArgs(CursorStyle style, bool blink)
}
}
}

3 changes: 3 additions & 0 deletions src/XTerm.NET/InputHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,7 @@ private void HandleHyperlink(string data)
// End hyperlink
_terminal.CurrentHyperlink = null;
_terminal.HyperlinkId = null;
_terminal.RaiseHyperlinkChanged(null);
}
else
{
Expand All @@ -722,6 +723,8 @@ private void HandleHyperlink(string data)
}
}
}

_terminal.RaiseHyperlinkChanged(uri);
}
}
}
Expand Down
5 changes: 4 additions & 1 deletion src/XTerm.NET/Parser/EscapeSequenceParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,12 @@ public class EscapeSequenceParser
public event EventHandler<OscEventArgs>? Osc;

/// <summary>
/// Fired when DCS sequences are parsed.
/// DCS parsing is not implemented yet. This event is retained for source compatibility.
/// </summary>
#pragma warning disable CS0067
[Obsolete("DCS parsing is not implemented yet; this event is retained for source compatibility.")]
public event EventHandler<DcsEventArgs>? Dcs;
#pragma warning restore CS0067

public EscapeSequenceParser()
{
Expand Down
3 changes: 3 additions & 0 deletions src/XTerm.NET/Terminal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,9 @@ internal void RaiseTitleChanged(string title) =>

internal void RaiseDirectoryChanged(string directory) =>
DirectoryChanged?.Invoke(this, new TerminalEvents.DirectoryChangeEventArgs(directory));

internal void RaiseHyperlinkChanged(string? url) =>
HyperlinkChanged?.Invoke(this, new TerminalEvents.HyperlinkEventArgs(url ?? string.Empty, url == null));

internal void RaiseWindowMoved(int x, int y) =>
WindowMoved?.Invoke(this, new TerminalEvents.WindowMovedEventArgs(x, y));
Expand Down
Loading