mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Revert use of alternate screen (#3648)
This commit is contained in:
parent
c2ca3615d7
commit
9e507cd9fd
22
Cargo.lock
generated
22
Cargo.lock
generated
@ -501,16 +501,6 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ctrlc"
|
|
||||||
version = "3.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b"
|
|
||||||
dependencies = [
|
|
||||||
"nix",
|
|
||||||
"windows-sys 0.52.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "data-url"
|
name = "data-url"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
@ -1406,17 +1396,6 @@ dependencies = [
|
|||||||
"tempfile",
|
"tempfile",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nix"
|
|
||||||
version = "0.27.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags 2.4.2",
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "notify"
|
name = "notify"
|
||||||
version = "6.1.1"
|
version = "6.1.1"
|
||||||
@ -2605,7 +2584,6 @@ dependencies = [
|
|||||||
"clap_mangen",
|
"clap_mangen",
|
||||||
"codespan-reporting",
|
"codespan-reporting",
|
||||||
"comemo",
|
"comemo",
|
||||||
"ctrlc",
|
|
||||||
"dirs",
|
"dirs",
|
||||||
"ecow",
|
"ecow",
|
||||||
"env_proxy",
|
"env_proxy",
|
||||||
|
@ -31,7 +31,6 @@ chrono = { workspace = true }
|
|||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
codespan-reporting = { workspace = true }
|
codespan-reporting = { workspace = true }
|
||||||
comemo = { workspace = true }
|
comemo = { workspace = true }
|
||||||
ctrlc = { workspace = true }
|
|
||||||
dirs = { workspace = true }
|
dirs = { workspace = true }
|
||||||
ecow = { workspace = true }
|
ecow = { workspace = true }
|
||||||
env_proxy = { workspace = true }
|
env_proxy = { workspace = true }
|
||||||
|
@ -19,7 +19,6 @@ use std::process::ExitCode;
|
|||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use codespan_reporting::term;
|
use codespan_reporting::term;
|
||||||
use codespan_reporting::term::termcolor::WriteColor;
|
use codespan_reporting::term::termcolor::WriteColor;
|
||||||
use ecow::eco_format;
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use crate::args::{CliArguments, Command};
|
use crate::args::{CliArguments, Command};
|
||||||
@ -46,13 +45,7 @@ fn main() -> ExitCode {
|
|||||||
Command::Update(command) => crate::update::update(command),
|
Command::Update(command) => crate::update::update(command),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Leave the alternate screen if it was opened. This operation is done here
|
if let Err(msg) = res {
|
||||||
// so that it is executed prior to printing the final error.
|
|
||||||
let res_leave = terminal::out()
|
|
||||||
.leave_alternate_screen()
|
|
||||||
.map_err(|err| eco_format!("failed to leave alternate screen ({err})"));
|
|
||||||
|
|
||||||
if let Some(msg) = res.err().or(res_leave.err()) {
|
|
||||||
set_failed();
|
set_failed();
|
||||||
print_error(&msg).expect("failed to print error");
|
print_error(&msg).expect("failed to print error");
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
use std::io::{self, IsTerminal, Write};
|
use std::io::{self, IsTerminal, Write};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
|
||||||
|
|
||||||
use codespan_reporting::term::termcolor;
|
use codespan_reporting::term::termcolor;
|
||||||
use ecow::eco_format;
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use termcolor::{ColorChoice, WriteColor};
|
use termcolor::{ColorChoice, WriteColor};
|
||||||
use typst::diag::StrResult;
|
|
||||||
|
|
||||||
use crate::ARGS;
|
use crate::ARGS;
|
||||||
|
|
||||||
@ -18,7 +15,6 @@ pub fn out() -> TermOut {
|
|||||||
/// The stuff that has to be shared between instances of [`TermOut`].
|
/// The stuff that has to be shared between instances of [`TermOut`].
|
||||||
struct TermOutInner {
|
struct TermOutInner {
|
||||||
stream: termcolor::StandardStream,
|
stream: termcolor::StandardStream,
|
||||||
in_alternate_screen: AtomicBool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TermOutInner {
|
impl TermOutInner {
|
||||||
@ -32,10 +28,7 @@ impl TermOutInner {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let stream = termcolor::StandardStream::stderr(color_choice);
|
let stream = termcolor::StandardStream::stderr(color_choice);
|
||||||
TermOutInner {
|
TermOutInner { stream }
|
||||||
stream,
|
|
||||||
in_alternate_screen: AtomicBool::new(false),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,24 +41,6 @@ pub struct TermOut {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TermOut {
|
impl TermOut {
|
||||||
/// Initialize a handler that listens for Ctrl-C signals.
|
|
||||||
/// This is used to exit the alternate screen that might have been opened.
|
|
||||||
pub fn init_exit_handler(&mut self) -> StrResult<()> {
|
|
||||||
// We can safely ignore the error as the only thing this handler would do
|
|
||||||
// is leave an alternate screen if none was opened; not very important.
|
|
||||||
let mut term_out = self.clone();
|
|
||||||
ctrlc::set_handler(move || {
|
|
||||||
let _ = term_out.leave_alternate_screen();
|
|
||||||
|
|
||||||
// Exit with the exit code standard for Ctrl-C exits[^1].
|
|
||||||
// There doesn't seem to be another standard exit code for Windows,
|
|
||||||
// so we just use the same one there.
|
|
||||||
// [^1]: https://tldp.org/LDP/abs/html/exitcodes.html
|
|
||||||
std::process::exit(128 + 2);
|
|
||||||
})
|
|
||||||
.map_err(|err| eco_format!("failed to initialize exit handler ({err})"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clears the entire screen.
|
/// Clears the entire screen.
|
||||||
pub fn clear_screen(&mut self) -> io::Result<()> {
|
pub fn clear_screen(&mut self) -> io::Result<()> {
|
||||||
// We don't want to clear anything that is not a TTY.
|
// We don't want to clear anything that is not a TTY.
|
||||||
@ -90,32 +65,6 @@ impl TermOut {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enters the alternate screen if none was opened already.
|
|
||||||
pub fn enter_alternate_screen(&mut self) -> io::Result<()> {
|
|
||||||
if self.inner.stream.supports_color()
|
|
||||||
&& !self.inner.in_alternate_screen.load(Ordering::Acquire)
|
|
||||||
{
|
|
||||||
let mut stream = self.inner.stream.lock();
|
|
||||||
write!(stream, "\x1B[?1049h")?;
|
|
||||||
stream.flush()?;
|
|
||||||
self.inner.in_alternate_screen.store(true, Ordering::Release);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Leaves the alternate screen if it is already open.
|
|
||||||
pub fn leave_alternate_screen(&mut self) -> io::Result<()> {
|
|
||||||
if self.inner.stream.supports_color()
|
|
||||||
&& self.inner.in_alternate_screen.load(Ordering::Acquire)
|
|
||||||
{
|
|
||||||
let mut stream = self.inner.stream.lock();
|
|
||||||
write!(stream, "\x1B[?1049l")?;
|
|
||||||
stream.flush()?;
|
|
||||||
self.inner.in_alternate_screen.store(false, Ordering::Release);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Write for TermOut {
|
impl Write for TermOut {
|
||||||
|
@ -20,12 +20,6 @@ use crate::{print_error, terminal};
|
|||||||
|
|
||||||
/// Execute a watching compilation command.
|
/// Execute a watching compilation command.
|
||||||
pub fn watch(mut timer: Timer, mut command: CompileCommand) -> StrResult<()> {
|
pub fn watch(mut timer: Timer, mut command: CompileCommand) -> StrResult<()> {
|
||||||
// Enter the alternate screen and handle Ctrl-C ourselves.
|
|
||||||
terminal::out().init_exit_handler()?;
|
|
||||||
terminal::out()
|
|
||||||
.enter_alternate_screen()
|
|
||||||
.map_err(|err| eco_format!("failed to enter alternate screen ({err})"))?;
|
|
||||||
|
|
||||||
// Create a file system watcher.
|
// Create a file system watcher.
|
||||||
let mut watcher = Watcher::new(command.output())?;
|
let mut watcher = Watcher::new(command.output())?;
|
||||||
|
|
||||||
|
@ -243,8 +243,6 @@ description: |
|
|||||||
- Command line interface
|
- Command line interface
|
||||||
- Added support for passing [inputs]($category/foundations/sys) via a CLI flag
|
- Added support for passing [inputs]($category/foundations/sys) via a CLI flag
|
||||||
- When passing the filename `-`, Typst will now read input from stdin
|
- When passing the filename `-`, Typst will now read input from stdin
|
||||||
- The watch mode now uses the alternate screen so that the original state of
|
|
||||||
the terminal is restored when exiting
|
|
||||||
- Now uses the system-native TLS implementation for network fetching which
|
- Now uses the system-native TLS implementation for network fetching which
|
||||||
should be generally more robust
|
should be generally more robust
|
||||||
- Watch mode will now properly detect when a previously missing file is
|
- Watch mode will now properly detect when a previously missing file is
|
||||||
|
Loading…
x
Reference in New Issue
Block a user