Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #666. Refactor ConsoleDrivers to simplify and remove duplicated code #2612

Merged
merged 120 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
b22c82a
Added ClipRegion; cleaned up driver code
tig May 7, 2023
31ba96c
clip region unit tests
tig May 7, 2023
90f368b
api docs
tig May 7, 2023
82b0bff
Moved color stuff from ConsoleDriver to Color.cs
tig May 8, 2023
953f4e6
Removes unused ConsoleDriver APIs
tig May 8, 2023
73a1b86
Code cleanup and Removes unused ConsoleDriver APIs
tig May 8, 2023
b688d8d
Code cleanup and Removes unused ConsoleDriver APIs
tig May 8, 2023
693c4ad
Work around https://github.com/gui-cs/Terminal.Gui/issues/2610
tig May 8, 2023
4658198
adjusted unit tests
tig May 8, 2023
5c79ba6
initial commit
tig May 8, 2023
066a9b9
Made Rows, Cols, Top, Left virtual
tig May 8, 2023
638e914
Made Clipboard non-virtual
tig May 8, 2023
b853af0
Made EnableConsoleScrolling non-virtual
tig May 8, 2023
6f365ef
Made Contents non-virtual
tig May 8, 2023
e173b79
Pulled Row/Col up
tig May 8, 2023
bc61b86
Made MoveTo virtual; fixed stupid FakeDriver cursor issue
tig May 8, 2023
93d81a1
Made CurrentAttribute non-virtual
tig May 8, 2023
af8a668
Made SetAttribute non-virtual
tig May 8, 2023
bf25b79
Moved clipboard code out
tig May 8, 2023
43e70ca
Code cleanup
tig May 8, 2023
0c0d434
Removes dependecy on NStack from ConsoleDrivers - WIP
tig May 9, 2023
1225e4b
Fixed unit tests
tig May 9, 2023
47f9cb8
Fixed unit tests
tig May 9, 2023
466a0c9
Added list of unit tests needed
tig May 9, 2023
679bfff
Did some perf testing; tweaked code and charmap to address
tig May 9, 2023
b4fa712
Brough in code from PR #2264 (but commented)
tig May 10, 2023
117451d
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig May 10, 2023
77e3184
Tons of code cleanup
tig May 10, 2023
58c2a61
Merge branch 'v2_fixes_666_console_driver_dupes' of tig:tig/Terminal.…
tig May 10, 2023
79d10b9
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig May 10, 2023
18369aa
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig May 10, 2023
aaf1a80
Fighting with ScrollView
tig May 11, 2023
2572675
Merged
tig May 13, 2023
a7b7e35
Fixing bugs
tig May 13, 2023
c9780eb
Fixed TabView tests
tig May 13, 2023
9f7b5ac
Fixed View.Visible test that was not really working
tig May 13, 2023
8f39eff
Fixed unit tests
tig May 13, 2023
4f52feb
Merged latest v2_develop ++
tig May 21, 2023
4717a59
Cleaned up clipboard APIs in attempt to track down unit test failure
tig May 21, 2023
6338613
Add Cut_Preserves_Selection test
tig May 21, 2023
84dbddc
Merged
tig May 22, 2023
cbec608
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig May 22, 2023
be8977e
Removed invalid code
tig May 22, 2023
68d3721
Removed invalid test code; unit tests now pass
tig May 22, 2023
b197356
EscSeq* - Adjusted naming, added more sequences, made code more consi…
tig May 22, 2023
4d56839
Added CSI_SetGraphicsRendition
tig May 22, 2023
f6d7e62
NetDriver code cleanup
tig May 22, 2023
ac770c0
merged v2_develop
tig May 22, 2023
d5ef419
code cleanup
tig May 23, 2023
bca2f97
Cleaned up color handling in NetDriver
tig May 23, 2023
faaa315
merged v2_develop
tig May 23, 2023
098810c
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig May 24, 2023
0a7f9ea
refixed tabview unit test
tig May 24, 2023
5aeeef7
WindowsDriver color code cleanup
tig May 24, 2023
cdfc7f5
WindowsDriver color code cleanup
tig May 24, 2023
8000705
CursesDriver color code cleanup
tig May 24, 2023
3c5c7b1
CursesDriver - Adding _BOLD has no effect. Further up the stack we ca…
tig May 24, 2023
59c730e
CursesDriver color code - make code more accurate
tig May 24, 2023
95f4517
CursesDriver color code - make code more accurate
tig May 24, 2023
afb5bd7
Simplified ConsoleDriver.GetColors API
tig May 24, 2023
32e674c
Simplified ConsoleDriver.GetColors API further
tig May 24, 2023
3e42a44
Improved encapslation of Attribute; prep for TrueColor & other attrib…
tig May 24, 2023
577db42
Fixes #2249. CharacterMap isn't refreshing well non-BMP code points o…
BDisp May 25, 2023
f797731
Use GetRange to take some of the runes before convert to string.
BDisp May 25, 2023
4148eed
Attempting to fix unit tests not being cleaned up
tig May 26, 2023
47a75b3
Fixes #2658 - ConsoleDriver.IsRuneSupported
tig May 26, 2023
279deaa
Fixes #2658 - ConsoleDriver.IsRuneSupported (for WindowsDriver)
tig May 26, 2023
9b559d1
Resolving merge conflicts.
BDisp May 26, 2023
6cd53f2
Check all the range values and not only the max value.
BDisp May 26, 2023
203e46e
Reducing code.
BDisp May 26, 2023
547642d
Fixes #2674 - Unit test process doesn't exit
tig May 27, 2023
8c489cd
Changed Cell to support IsDirty and list of Runes
tig May 28, 2023
353e288
Merge branch 'v2_fixes_666_console_driver_dupes' into v2_netdriver-no…
BDisp Jun 4, 2023
cc18db1
add support for rendering TrueColor output on Windows merging veeman …
adstep Jun 26, 2023
40d1042
add colorconverter changes
adstep Jun 28, 2023
ef79c10
merged v2_develop
tig Jul 5, 2023
2f72918
fixed merged v2_develop
tig Jul 5, 2023
ae10677
Merge pull request #13 from BDisp/v2_netdriver-non.bmp-fix
tig Jul 5, 2023
c79a2cb
Merge remote-tracking branch 'origin/v2_fixes_666_console_driver_dupe…
tig Jul 6, 2023
704a17c
Merged v2_develop
tig Jul 6, 2023
c547014
Fixing merge bugs
tig Jul 6, 2023
b071793
Fixed merge bugs
tig Jul 6, 2023
6260e3d
Merge branch 'v2_fixes_666_console_driver_dupes' into true-color-union
tig Jul 6, 2023
90dc2e7
Merge pull request #15 from adstep/true-color-union
tig Jul 6, 2023
200bdc4
Fixed merge bugs - all unit tests pass
tig Jul 10, 2023
e120054
Debugging netdriver
tig Jul 11, 2023
d52dafc
More netdriver diag
tig Jul 12, 2023
f0ecb5f
API docs for escutils
tig Jul 14, 2023
ef582f3
Update unicode scenario to stress more stuff
tig Jul 14, 2023
d813b70
Contents: Now a 2D array of Cells; WIP
tig Jul 14, 2023
362027b
AddRune and ClearContents no longer virtual/abstract
tig Jul 15, 2023
21fa6c3
WindowsDriver renders correctly again
tig Jul 16, 2023
ad725ce
Progress on Curses
tig Jul 16, 2023
78b3434
Progress on Curses
tig Jul 17, 2023
12df069
broke windowsdriver
tig Jul 17, 2023
4cc0c29
Cleaned up FakeMainLoop
tig Jul 19, 2023
c3dc548
Cleaned up some build warnings
tig Jul 19, 2023
bfbd2a8
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig Jul 19, 2023
c0c6dda
Removed _init from AutoInitShutdown as it's not needed anymore
tig Jul 19, 2023
f0cf55a
Removed unused var
tig Jul 19, 2023
33e1583
Removed unused var
tig Jul 19, 2023
7569ea7
Fixed nullabiltiy warning in LineCanvas
tig Jul 19, 2023
3f823b4
Fixed charmap crash
tig Jul 19, 2023
43c69a4
Fixes #2758 in v2
tig Jul 19, 2023
b807722
Port testonfail fix to v2
tig Jul 26, 2023
53a51ed
Remove EnableConsoleScrolling
tig Jul 26, 2023
b2f9b92
Backport #2764 from develop (clear last line)
tig Jul 26, 2023
45da757
Remove uneeded usings
tig Jul 26, 2023
06a9ba9
Progress on unicode
tig Aug 6, 2023
5864cf1
Merged in changes from PR #2786, Fixes #2784
tig Aug 8, 2023
80003be
Merge branch 'v2_develop' into v2_fixes_666_console_driver_dupes
tig Aug 8, 2023
f7bced9
revamp charmap rendering
tig Aug 9, 2023
235058e
Charmap option to show glyph widths
tig Aug 9, 2023
8fe56cb
Fixed issue with wide glpyhs being overwritten
tig Aug 9, 2023
7790f56
Fixed charmap startcodepoint change issue
tig Aug 9, 2023
e526fb2
Added abiltiy to see ncurses verison/lib
tig Aug 9, 2023
d4f0f69
Fought with CursesDriver; giving up for now. See notes.
tig Aug 9, 2023
1b8b301
Leverage Wcwidth nuget library instaed of our own tables
tig Aug 9, 2023
6dc457f
enhanced charmap Details dialog
tig Aug 9, 2023
24450e9
Final attempt at fixing curses
tig Aug 9, 2023
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
4 changes: 3 additions & 1 deletion .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @migueldeicaza @tig
* @tig

/docs/ @tig @bdisp @tznind

# Order is important; the last matching pattern takes the most
# precedence. When someone opens a pull request that only
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/dotnet-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ jobs:

- name: Test
run: |
sed -i 's/"stopOnFail": false/"stopOnFail": true/g' UnitTests/xunit.runner.json
dotnet test --no-restore --verbosity normal --collect:"XPlat Code Coverage" --settings UnitTests/coverlet.runsettings
mv -v UnitTests/TestResults/*/*.* UnitTests/TestResults/

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:

#- name: Test to generate Code Coverage Report
# run: |
# sed -i 's/"stopOnFail": false/"stopOnFail": true/g' UnitTests/xunit.runner.json
# dotnet test --verbosity normal --collect:"XPlat Code Coverage" --settings UnitTests/coverlet.runsettings
# mv -v UnitTests/TestResults/*/*.* UnitTests/TestResults/

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ docfx/api
docs/

UnitTests/TestResults
TestResults

#git merge files
*.orig
Expand Down
96 changes: 29 additions & 67 deletions Terminal.Gui/Application.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using System.Reflection;
using System.IO;
using System.Text.Json.Serialization;
using static Terminal.Gui.ConfigurationManager;

namespace Terminal.Gui {
/// <summary>
Expand Down Expand Up @@ -55,42 +54,7 @@ public static partial class Application {

// For Unit testing - ignores UseSystemConsole
internal static bool _forceFakeConsole;

private static bool? _enableConsoleScrolling;
/// <summary>
/// The current <see cref="ConsoleDriver.EnableConsoleScrolling"/> used in the terminal.
/// </summary>
/// <remarks>
/// <para>
/// If <see langword="false"/> (the default) the height of the Terminal.Gui application (<see cref="ConsoleDriver.Rows"/>)
/// tracks to the height of the visible console view when the console is resized. In this case
/// scrolling in the console will be disabled and all <see cref="ConsoleDriver.Rows"/> will remain visible.
/// </para>
/// <para>
/// If <see langword="true"/> then height of the Terminal.Gui application <see cref="ConsoleDriver.Rows"/> only tracks
/// the height of the visible console view when the console is made larger (the application will only grow in height, never shrink).
/// In this case console scrolling is enabled and the contents (<see cref="ConsoleDriver.Rows"/> high) will scroll
/// as the console scrolls.
/// </para>
/// This API was previously named 'HeightAsBuffer` but was renamed to make its purpose more clear.
/// </remarks>
[SerializableConfigurationProperty (Scope = typeof (SettingsScope))]
public static bool EnableConsoleScrolling {
get {
if (Driver == null) {
return _enableConsoleScrolling.HasValue && _enableConsoleScrolling.Value;
}
return Driver.EnableConsoleScrolling;
}
set {
_enableConsoleScrolling = value;
if (Driver == null) {
return;
}
Driver.EnableConsoleScrolling = value;
}
}


private static List<CultureInfo> _cachedSupportedCultures;

/// <summary>
Expand Down Expand Up @@ -164,7 +128,9 @@ private static List<CultureInfo> GetSupportedCultures ()
// calledViaRunT: If false (default) all state will be reset. If true the state will not be reset.
internal static void InternalInit (Func<Toplevel> topLevelFactory, ConsoleDriver driver = null, IMainLoopDriver mainLoopDriver = null, bool calledViaRunT = false)
{
if (_initialized && driver == null) return;
if (_initialized && driver == null) {
return;
}

if (_initialized) {
throw new InvalidOperationException ("Init has already been called and must be bracketed by Shutdown.");
Expand Down Expand Up @@ -224,7 +190,6 @@ internal static void InternalInit (Func<Toplevel> topLevelFactory, ConsoleDriver
MainLoop = new MainLoop (mainLoopDriver);

try {
Driver.EnableConsoleScrolling = EnableConsoleScrolling;
Driver.Init (OnTerminalResized);
} catch (InvalidOperationException ex) {
// This is a case where the driver is unable to initialize the console.
Expand Down Expand Up @@ -277,6 +242,7 @@ static void ResetState ()

// BUGBUG: OverlappedTop is not cleared here, but it should be?

MainLoop?.Stop();
MainLoop = null;
Driver?.End ();
Driver = null;
Expand All @@ -289,7 +255,6 @@ static void ResetState ()
NotifyStopRunState = null;
_initialized = false;
_mouseGrabView = null;
_enableConsoleScrolling = false;
_lastMouseOwnerView = null;

// Reset synchronization context to allow the user to run async/await,
Expand Down Expand Up @@ -552,7 +517,8 @@ public static void Run (Toplevel view, Func<Exception, bool> errorHandler = null
/// </summary>
public static void Refresh ()
{
Driver.UpdateOffScreen ();
// TODO: Figure out how to remove this call to ClearContents. Refresh should just repaint damaged areas, not clear
Driver.ClearContents();
View last = null;
foreach (var v in _toplevels.Reverse ()) {
if (v.Visible) {
Expand Down Expand Up @@ -674,13 +640,14 @@ public static void RunMainLoopIteration (ref RunState state, bool wait, ref bool
Iteration?.Invoke ();

EnsureModalOrVisibleAlwaysOnTop (state.Toplevel);
if ((state.Toplevel != Current && Current?.Modal == true)
|| (state.Toplevel != Current && Current?.Modal == false)) {
if (state.Toplevel != Current) {
OverlappedTop?.OnDeactivate (state.Toplevel);
state.Toplevel = Current;
OverlappedTop?.OnActivate (state.Toplevel);
Top.SetSubViewNeedsDisplay ();
Refresh ();
} else if (Current.SuperView == null && Current?.Modal == true) {
Refresh ();
}
if (Driver.EnsureCursorVisibility ()) {
state.Toplevel.SetNeedsDisplay ();
Expand All @@ -690,42 +657,41 @@ public static void RunMainLoopIteration (ref RunState state, bool wait, ref bool
}
firstIteration = false;

if (state.Toplevel != Top
&& (!Top._needsDisplay.IsEmpty || Top._subViewNeedsDisplay || Top.LayoutNeeded)) {
state.Toplevel.SetNeedsDisplay (state.Toplevel.Bounds);
if (state.Toplevel != Top &&
(Top.NeedsDisplay|| Top.SubViewNeedsDisplay || Top.LayoutNeeded)) {
state.Toplevel.SetNeedsDisplay (state.Toplevel.Frame);
Top.Clear ();
Top.Draw ();
foreach (var top in _toplevels.Reverse ()) {
if (top != Top && top != state.Toplevel) {
top.SetNeedsDisplay ();
top.SetSubViewNeedsDisplay ();
top.Clear ();
top.Draw ();
}
}
}
if (_toplevels.Count == 1 && state.Toplevel == Top
&& (Driver.Cols != state.Toplevel.Frame.Width || Driver.Rows != state.Toplevel.Frame.Height)
&& (!state.Toplevel._needsDisplay.IsEmpty || state.Toplevel._subViewNeedsDisplay || state.Toplevel.LayoutNeeded)) {

Driver.SetAttribute (Colors.TopLevel.Normal);
state.Toplevel.Clear (new Rect (0, 0, Driver.Cols, Driver.Rows));
&& (state.Toplevel.NeedsDisplay || state.Toplevel.SubViewNeedsDisplay || state.Toplevel.LayoutNeeded)) {

state.Toplevel.Clear ();
}

if (!state.Toplevel._needsDisplay.IsEmpty || state.Toplevel._subViewNeedsDisplay || state.Toplevel.LayoutNeeded
|| OverlappedChildNeedsDisplay ()) {
if (state.Toplevel.NeedsDisplay ||
state.Toplevel.SubViewNeedsDisplay ||
state.Toplevel.LayoutNeeded ||
OverlappedChildNeedsDisplay ()) {
state.Toplevel.Clear ();
state.Toplevel.Draw ();
//if (state.Toplevel.SuperView != null) {
// state.Toplevel.SuperView?.OnRenderLineCanvas ();
//} else {
// state.Toplevel.OnRenderLineCanvas ();
//}
state.Toplevel.PositionCursor ();
Driver.Refresh ();
} else {
Driver.UpdateCursor ();
}
if (state.Toplevel != Top && !state.Toplevel.Modal
&& (!Top._needsDisplay.IsEmpty || Top._subViewNeedsDisplay || Top.LayoutNeeded)) {
if (state.Toplevel != Top &&
!state.Toplevel.Modal &&
(Top.NeedsDisplay|| Top.SubViewNeedsDisplay || Top.LayoutNeeded)) {
Top.Draw ();
}
}
Expand All @@ -735,7 +701,7 @@ public static void RunMainLoopIteration (ref RunState state, bool wait, ref bool
/// </summary>
public static void DoEvents ()
{
MainLoop.Driver.Wakeup ();
MainLoop.MainLoopDriver.Wakeup ();
}

/// <summary>
Expand Down Expand Up @@ -1011,7 +977,6 @@ static void OnTerminalResized ()
{
var full = new Rect (0, 0, Driver.Cols, Driver.Rows);
TerminalResized?.Invoke (new ResizedEventArgs () { Cols = full.Width, Rows = full.Height });
Driver.Clip = full;
foreach (var t in _toplevels) {
t.SetRelativeLayout (full);
t.LayoutSubviews ();
Expand Down Expand Up @@ -1073,7 +1038,7 @@ public static void GrabMouse (View view)
if (!OnGrabbingMouse (view)) {
OnGrabbedMouse (view);
_mouseGrabView = view;
Driver.UncookMouse ();
//Driver.UncookMouse ();
}
}

Expand All @@ -1087,7 +1052,7 @@ public static void UngrabMouse ()
if (!OnUnGrabbingMouse (_mouseGrabView)) {
OnUnGrabbedMouse (_mouseGrabView);
_mouseGrabView = null;
Driver.CookMouse ();
//Driver.CookMouse ();
}
}

Expand Down Expand Up @@ -1132,10 +1097,7 @@ static void OnUnGrabbedMouse (View view)

static void ProcessMouseEvent (MouseEvent me)
{
bool OutsideBounds (Point p, Rect r)
{
return p.X < 0 || p.X > r.Right || p.Y < 0 || p.Y > r.Bottom;
}
static bool OutsideBounds (Point p, Rect r) => p.X < 0 || p.X > r.Right || p.Y < 0 || p.Y > r.Bottom;

if (IsMouseDisabled) {
return;
Expand Down
Loading
Loading