Files
Terminal.Gui/ReactiveExample/TerminalScheduler.cs
Tig 6851b42a49 Fixes #2921 - MainLoop refactoring (#2922)
* Adds basic MainLoop unit tests

* Remove WinChange action from Curses

* Remove WinChange action from Curses

* Remove ProcessInput action from Windows MainLoop

* Simplified MainLoop/ConsoleDriver by making MainLoop internal and moving impt fns to Application

* Modernized Terminal resize events

* Modernized Terminal resize events

* Removed un used property

* for _isWindowsTerminal devenv->wininit; not sure what changed

* Modernized mouse/keyboard events (Action->EventHandler)

* Updated OnMouseEvent API docs

* Using WT_SESSION to detect WT

* removes hacky GetParentProcess

* Updates to fix #2634 (clear last line)

* removes hacky GetParentProcess2

* Addressed mac resize issue

* Addressed mac resize issue

* Removes ConsoleDriver.PrepareToRun, has Init return MainLoop

* Removes unneeded Attribute methods

* Removed GetProcesssName

* Removed GetProcesssName

* Refactored KeyEvent and KeyEventEventArgs into a single class

* Revert "Refactored KeyEvent and KeyEventEventArgs into a single class"

This reverts commit 88a00658db.

* Fixed key repeat issue; reverted stupidity on 1049/1047 confusion

* Updated CSI API Docs

* merge
2023-10-21 08:06:04 -07:00

41 lines
1.2 KiB
C#

using System;
using System.Reactive.Concurrency;
using System.Reactive.Disposables;
using Terminal.Gui;
namespace ReactiveExample {
public class TerminalScheduler : LocalScheduler {
public static readonly TerminalScheduler Default = new TerminalScheduler();
TerminalScheduler () { }
public override IDisposable Schedule<TState> (
TState state, TimeSpan dueTime,
Func<IScheduler, TState, IDisposable> action) {
IDisposable PostOnMainLoop() {
var composite = new CompositeDisposable(2);
var cancellation = new CancellationDisposable();
Application.Invoke (() => {
if (!cancellation.Token.IsCancellationRequested)
composite.Add(action(this, state));
});
composite.Add(cancellation);
return composite;
}
IDisposable PostOnMainLoopAsTimeout () {
var composite = new CompositeDisposable (2);
var timeout = Application.AddTimeout (dueTime, () => {
composite.Add(action (this, state));
return false;
});
composite.Add (Disposable.Create (() => Application.RemoveTimeout (timeout)));
return composite;
}
return dueTime == TimeSpan.Zero
? PostOnMainLoop ()
: PostOnMainLoopAsTimeout ();
}
}
}