Open kjpgit opened 11 months ago
Tagging subscribers to this area: @dotnet/area-system-console See info in area-owners.md if you want to be subscribed.
Author: | kjpgit |
---|---|
Assignees: | - |
Labels: | `area-System.Console` |
Milestone: | - |
This is a truly ugly hack, using "sh" to send myself a SIGSTOP. Ideally the runtime has support for sending a SIGSTOP.
if (evt.signal == PosixSignal.SIGWINCH || evt.signal == PosixSignal.SIGCONT) {
console.SetAlternateScreen(true); // Sends ?1049h
Redraw();
}
if (evt.signal == PosixSignal.SIGTSTP) {
Log.Info("moving back to main terminal screen");
console.SetAlternateScreen(false); // Sends ?1049l
console.SetNormalColorAndEnableCursor();
console.Flush();
var pi = new ProcessStartInfo("sh");
pi.ArgumentList.Add("-c");
pi.ArgumentList.Add("kill -STOP $PPID; echo stopped >> /tmp/stop.log");
Process.Start(pi);
}
When a full screen / raw terminal app like vim gets a ctrl-z, it reads it as a keypress, not a signal. This can be done with the right tcsetattr() settings:
t.c_cc[Libc.VSUSP] = 0;
Will stop SIGTSTP from coming as a signal, but instead it comes in as \x1A key.But more importantly, the app then gets a chance to restore the terminal to the 'main' shell screen, before suspending itself with a SIGSTOP (I think). Basically, gracefully set the terminal back before suspending.
In .net 8, I can override the SIGTSTP (Terminal Stop) signal, and set the console back to the 'main' terminal buffer by sending a "[?1049l", but I can't send myself a SIGSTOP.
At least, not without bringing in Mono.Posix, and that seems to have additional complications with AOT compilation. (Missing DLL)
Ideally, .net knows how to gracefully suspend a console app -- taking it away from and back to the alternate terminal screen -- without additional libraries.