Age | Commit message (Collapse) | Author |
|
The logic during the initial spawning of the window was a bit twisted
up. This has been resolved and it should all work properly now, even
without a resize event at startup.
This fixes #1781.
|
|
The extra window padding was calculated in the renderer which lead to
problems with the paddings calculated in the `src/display.rs` and
`src/term/mod.rs`.
As a solution, every instance of `config.padding().x/y` has been removed
from the renderer (`src/renderer/mod.rs`), instead the padding is always
passed through from the `src/display.rs`.
The initial calculations during display creation and after resize then
are scaled appropriately and then the extra padding is calculated. As a
result every other location can just make use of the correctly
calculated `size_info.padding_x` and `size_info.padding_y`.
The documentation has been changed to clearly state that the padding is
scaled by DPI now.
This fixes #1773.
|
|
Currently alacritty always puts the grid at the top-left position of the
window. The only distance to the top-left window border is set by the
padding in the config.
However the grid always has a fixed size, and if a cell doesn't
completely fit the screen anymore, the padding at the bottom right
window corner can be significantly bigger than the padding at the top
left.
To fix this whenever there is more space left and there would usually be
a bigger padding at the bottom right, the space is now split up and
added to the padding.
This should always center the grid inside the window and make sure all
borders have the same padding from the text area.
This screenshot shows how it has been until now:
![Before](https://u.teknik.io/kRJwg.png)
Here is how it looks now:
![After](https://u.teknik.io/m4puV.png)
This fixes #1065.
|
|
The environment variables specified in the configuration file are now
all set before the window is created. As a result, this makes it
possible to add the `WINIT_HIDPI_FACTOR` env variable directly to the
Alacritty configuration.
This fixes https://github.com/jwilm/alacritty/issues/1768.
|
|
|
|
Some changes include:
• Use the with_hardware_acceleration function on the ContextBuilder to not require the discrete GPU
• Remove the LMenu and RMenu virtual key codes (winit 0.16.0 removed these because Windows now generates LAlt and RAlt instead
• Replace set_cursor_state with hide_cursor (winit 0.16.0 removed the set_cursor_state function)
• Replace GlWindow::hidpi_factor with GlWindow::get_hidpi_factor and change to expecting an f64
• Use the glutin/winit dpi size and position types where possible
Glutin's dpi change event has been implemented. All size events now
return logical sizes. As a result of that, the logical sizes are translated
in the `display::handle_rezize` method so DPI scaling works correctly.
When the DPI is changed, the glyph cache is updated to make use of the
correct font size again.
Moving a window to a different screen which is a different DPI caused a
racing condition where the logical size of the event was sent to the
`handle_resize` method in `src/display.rs`, however if there was a DPI
change event before `handle_resize` is able to process this message, it
would incorrectly use the new DPI to scale the resize event.
To solve this issue instead of sending the logical size to the
`handle_resize` method and then converting it to a physical size in
there, the `LogicalSize` of the resize event is transformed into a
`PhysicalSize` as soon as it's received. This fixes potential racing
conditions since all events are processed in order.
The padding has been changed so it's also scaled by DPR.
The `scale_with_dpi` config option has been removed. If it's not present
a warning will be emitted.
The `winit` dependency on Windows has been removed. All interactions
with winit in Alacritty are handled through glutin.
|
|
This resolves all existing clippy issues and removes some old `allow`
annotations which aren't neccesary anymore.
|
|
Properly update an active selection while scrolling the main scrollback buffer.
This does not affect the alternate screen buffer, since no scrollback buffer is
available.
|
|
The 2c37da48b580237ff48f5e841015134dd459b41d change introduced some
changes to the way cursor configuration is handled. However it did not
properly handle the default behavior of the hollow cursor when the
`cursor` field was not specified at all.
By implementing the `Default` trait for the `Cursor` struct in
`config.rs` manually, the default value of the `unfocused_hollow` field
has been corrected back to `true` when the `cursor` struct isn't present
at all.
|
|
It is now possible to paste in mouse mode again by making use of the
`shift` key while pressing the mouse button reserved for PasteSelection.
All mouse bindings are now also matching the modifiers in a relaxed way,
so extra modifiers are ignored.
|
|
There are a couple of cursor-related options in the Alacritty config
file now, however they aren't grouped together in any way.
To resolve this a new `cursor` field has been added where all cursor
configuration options (besides colors) have been moved.
The `custom_cursor_colors` option has also been removed, since it's not
necessary anymore. Simply making the `colors.cursor.*` fields optional,
allows overriding the cursor colors whenever one of them is present.
Like that the user doesn't have to think about a relation between two
separate configuration options.
This PR initially put the `hide_cursor_when_typing` variable under
`cursor.hide_when_typing`. However this field is completely unrelated to
the cursor, but instead relates to the mouse cursor.
Since the word `cursor` is already used for the active cell in the grid
of a terminal emulator, all occurences of the word `cursor` when talking
about the mouse have been replaced with the word `mouse`.
The configuration option has also been moved to
`mouse.hide_when_typing`, to make it clear what this option is changing.
This fixes #1080.
|
|
This fixes jwilm/alacritty#1730.
|
|
Without this cmd won't redraw it's prompt when alacritty exits
|
|
|
|
To click on links in the alternate screen buffer, it is necessary that
the `shift` button is held down, otherwise mouse events are captured by
the application. However this would also require that `Shift` is added
to the `mouse.url.modifiers` option. Thus it is not possible anymore to
click on URLs unless the shift button is always held down.
To resolve this issue, the matching of modifiers has been relaxed. If a
modifier is specified in the config, it is always required to be held
down. However if a modifier is held down which is not specified, it is
still accpeted. This one-way relaxed matching allows clicking on links
with or without shift held down without having to make use of the
`mouse.url.modifiers` setting at all.
|
|
This adds the option to automatically launch URLs with a specified
program when clicking on them.
The config option `mouse.url_launcher` has been added to specify which
program should be used to open the URL. The URL is always passed as the
last parameter to the specified command.
It is not always desired for URLs to open automatically when clicking on
them. To resolve this a new `modifiers` field has been introduced to the
config, which allows specifying which keyboard modifiers need to be held
down to launch URLs in the specified launcher.
Some tests have been added to make sure that the edge-cases of the URL
parsing are protected against future regressions. To make testing easier
the parsing method has been moved into the `SemanticSearch` trait. The
name of the trait has also been changed to just `Search` and it has been
moved to `src/term/mod.rs` to fit the additional functionality.
This fixes #113.
|
|
Whenever the viewport is scrolled, the selection is rotated to make sure
that it moves with the viewport. However this did not correctly handle
the underflow that happens when the selection goes below 0.
This resolves that problem for the selection by moving the internal line
representation to an isize, thus correctly keeping track of the
selection start/end points even when they have a negative index. Once
the selection is converted to a span, the lines are clamped to the
visible region.
This fixes #1640 and fixes #1643.
|
|
This fixes not seeing console output on windows release builds.
|
|
This change should allow the usage of scancodes in the configuration
file.
When a VirtualKeyCode for glutin is not present, this should now allow
the user to use the scancodes instead. If the user specifiecs a key with
its scancode even though the key has a VirtualKeyCode, it should still
work.
The behavior of directly specifying a VirtualKeyCode should be unchanged
by this.
This fixes #1265.
|
|
Initial support for Windows is implemented using the winpty translation
layer. Clipboard support for Windows is provided through the `clipboard`
crate, and font rasterization is provided by RustType.
The tty.rs file has been split into OS-specific files to separate
standard pty handling from the winpty implementation.
Several binary components are fetched via build script on windows
including libclang and winpty. These could be integrated more directly
in the future either by building those dependencies as part of the
Alacritty build process or by leveraging git lfs to store the artifacts.
Fixes #28.
|
|
|
|
The terminal lock is now dropped before rendering by storing
all grid cells before clearing the screen.
This frees the terminal to do other things since the lock is now
free, which lead to a performance benefit with high throughput
applications.
|
|
Using the `bench` feature, `cargo test` was failing since one of the
benchmarks was running into a debug assertion for attempting to access a
line with an index beyond the grid length.
Since this issue was caused by the `len` property not being serialized
and deserialized, the `#[serde(skip)]` attribute has been changed to
`#[serde(default)]`. The ref-test has been edited to include the correct
grid length for proper deserialization.
This fixes #1604.
|
|
When rendering selections with both start and end outside of the visible
area, Alacritty would assume that both start and end are either above or
below the viewport and not render the selection at all.
To fix this the `buffer_line_to_visible` method now returns a
`ViewportPosition` instead of an `Option<Line>`, this allows giving more
feedback about where outside of the visible region the line is using the
`ViewportPosition::Above` and `ViewportPosition::Below` variants.
Using these newly introduced variants, a selection spanning the whole
screen is now rendered if the selection should go from above the visible
area to below it.
This fixes #1557.
|
|
The deprecated `window.decoration` values `true` and `false` were using
the `visit_bool` visitor for serde. However, only the `str` visitor was ever
called.
To print the correct deprecation notice, the bool visitor has been
removed and the warning has been added for the `"true"` and `"false"`
str visitor.
|
|
Since the mouse start position has been the first movement event after
the mouse button was held down, there have been some issues with the
start point lagging behind the cursor because movement events were not
reported from the initial position but there was a gap until movement
starts reporting.
To fix this whenever the mouse button is pressed, the position and cell
side is stored on the `Mouse` struct. Because of this it does not matter
anymore if the movement events are all reported and we can just start a
selection using the stored position/side whenever there currently is no
selection present.
This fixes #1366
|
|
When selecting multiple lines in Alacritty, there was an issue with
empty lines not being copied. This behavior has been chanaged so empty
lines should be correctly copied now.
When copying content which ends with an empty line, Alacritty would copy
an additional empty line.
This has been resolved by only adding empty lines when the empty line
was not in the last selected line.
|
|
|
|
This replaces the current definitions, which depend on the system's
'xterm-256color' terminfo definition with the `alacritty` and
`alacritty-direct` definitions.
The new definitions are completely standalone.
The default `TERM` value has been changed to be dynamically
set based on the definitions installed on the system. Alacritty will
try to use the `alacritty` definition first and fall back to
`xterm-256color` if the `alacritty` definition is not present.
|
|
Previously Alacritty has initialized all lines in the buffer as soon as
it is started. This had the effect that terminals which aren't making
use of the scrollback buffer yet, would still consume large amounts of
memory, potentially even freezing the system at startup.
To resolve this problem, the grid is now dynamically resized in chunks
of `1000` rows. The initial size is just the visible area itself, then
every time lines are written to the terminal emulator, the grid storage
is grown when required.
With the worst-case scenario of having 100_000 lines scrollback
configured, this change improves startup performance at the cost of
scrolling performance.
On my machine the startup changes from ~0.3 to ~0.2 seconds.
The scrolling performance with large throughput is not affected, however
it is slowed down when the number of lines scrolled are close to the
100_000 configured as scrollback. The most taxing benchmark I've found
for this was running `yes | dd count=500 > 500.txt` (note the relatively
small file size). This will cause a slowdown on the first run from 0.05s
to 0.15s. While this is significant, it lines up with the time saved at
startup.
This fixes #1236.
|
|
A new configuration option `save_to_clipboard` has been added
to the `selection` section of the configuration. This allows writing
every selection to the primary system clipboard when it is set
to `true`.
On linux the selection is still written to the selection clipboard,
independent of the value of the `save_to_clipboard` setting.
|
|
This adds a config option which allows setting terminal colors above the
0..16 range.
Live config reload already works for this, so it is possible to change
these colors the same way it works with the normal colors.
If a color below 16 is specified, the configuration will throw an error,
so the normal colors can't be overridden. This is just to prevent
possible complications with the settings that already exist.
|
|
The mesa workaround has lead to some issues with
rendering on Wayland.
To resolve this problem, the mesa workaround has been
restructured in a way which still allows clearing the screen
before rendering without killing performance with the mesa
driver. The performance is identical to the master brach
and there have been no recorded regressions.
|
|
The latest change to window decorations
(3b46859eceea39afb8bbc760235cc15de78d3ff3) introduced a regression when
running Alacritty without the `decorations` field specified in the
configuration file. Since serde wasn't setup to fallback to the default,
the complete config deserialization would fail.
This resolves this issue by deserializing it to the default decorations
value "Full". To make this setting a little more forgiving, this also
introduces another change which ignores the case for the configuration
options. So both `full` and `FuLl` are now accepted.
|
|
The decorations config was changed from a bool to an enum.
`full` has taken the place of `true`, and `none`, has replaced `false`.
On macOS, there are now options for `transparent` and `buttonless`.
These options are explained in both the CHANGELOG and in the
configuration files.
|
|
* Fix Bracketed Paste Mode when input contains end sequence.
* Remove \x1b instead of just the paste end sequence.
|
|
Alacritty has some checks in place to make sure that unsafe
code would not fail because of invalid struct sizes. This managed
to successfully catch an incorrect unsafe block on 32-bit machines.
To make sure this block works on both 32-bit and 64-bit systems,
it has been altered to make use of the platform-dependent `usize`
type. This will always make use of correct sizes without having to
rely on conditional compilation.
|
|
Alacritty made the assumption that every window started as focused and
because of that the hollow cursor wouldn't show up for windows which are
launched without focus.
Since even the initial focus should be reported as a focus event by
winit, this could be easily fixed just setting the default window state
to unfocused instead of focused.
This fixes #1563.
|
|
This adds support for the `hidden` escape sequence `\e[8m`, which will
render the text as invisible.
This has also raised a few questions about the rendering of foreground
and background colors and their interaction with the different escape
sequences. Previously, Alacritty has oriented itself after URxvt, which
has some strange and unexpected behavior.
The new implementation of color inversion is modeled after XTerm, which
has a consistent pattern of always inverting the foreground and
background colors. This should hopefully lead to less confusion for the
user and a more consistent behavior.
A full matrix showcasing the new way Alacritty inverses text can be
found here:
https://i.imgur.com/d1XavG7.png
This fixes #1454 and fixes #1455.
|
|
Since the scrollback history allocates all lines in memory, it is
possible to specify a scrollback history which is big enough to freeze
the computer due to OOM.
To resolve this issue, an upper limit of `100_000` has been set for the
scrollback history. Even though this might still cause some systems to
freeze, this should provide a good balance for most users.
|
|
|
|
Set `COLORTERM` to `truecolor` in order for applications to be able to
detect that alacritty supports 24-bit colors.
See https://gist.github.com/XVilka/8346728 for more details.
Closes #1526.
|
|
Fixes a regression on non-macOS platforms caused by the fix for
issue #1291. The fix is to follow platform norms for mouse click
behavior on unfocused terminals. On macOS, the first click (that
gives the window focus) is swallowed, and has no effect on the
terminal. On all other platforms, the first click is passed through
to the terminal.
|
|
* Change deb installation from crates.io to git
There have been a number of issues an PRs opened since
the cargo-deb installation does not work with the latest
version from crates.io.
To help out users until the crates.io version is updated,
the installation instructions have been temporarily
changed to install `cargo-deb` through github.
* Revert cargo-deb install back to use crates.io
Since `cargo-deb` has been updated on crates.io it is now
possible to just install it from crates.io and build Alacritty's
deb without having to rely on github.
* Update dependencies
This fixes an `illegal hardware instruction (core dumped)`
error when building in release mode.
* Remove redundant copy when selecting font_key
* Bump version number to 0.2.0
Since the Scrollback branch introduces some major changes, this bumps
the version number from 0.1.0 to 0.2.0.
The versions of Alacritty have not been updated regularly to this point,
so the scrollback branch is a good point in time to start updating
Alacritty's version on a regular basis.
Further changes to the readme, like dropping the 'alpha' status and
updating it to 'beta' could also be introduced with this branch. This
way there will be a clean cut which updates everything as soon as
scrollback is merged.
Building versions is another thing which would be a good thing to start
reasonably quickly. However starting this on the main branch after
scrollback has been merged seems like a more reliable way to move
forward.
This fixes #1240.
* Add a CHANGELOG file
A CHANGELOG file has been added to offer a bit more transparency over
which features have been changed, added and potentially removed in
Alacritty.
There are various formats available for the CHANGELOG file but the most
common and sensible one seems to be the one defined by
https://keepachangelog.com/en/1.0.0. Following the template proposed by
this it should be possible to create a clear CHANGELOG which makes it
simple for new contributors to figure out exactly which formatting
should be used for it.
Since there have been quite a few changes to Alacritty already, not all
changes have been added to the changelog. However a few entries have
been ported just to give a bit of an example what the format should look
like. This also helps with the 0.2.0 version since it will not be
completely empty in the changelog.
This fixes #1534.
* Update CHANGELOG
This updates the CHANGELOG to include the changes introduced by
43882ade33d4c14ee7248e489a2d33395faaa0b1.
|
|
The IL escape sequence (CSI Ps L) allows inserting blank, uninitialized
lines. `Ps` is a placeholder for the number of lines that should be
inserted. Before this change Alacritty would crash when a large number
of lines was passed as `Ps` parameter.
The issue was caused whenever the current line of the cursor plus the
lines that should be inserted would leave the bottom of the terminal,
since this makes indexing impossible.
This patch makes sure that the biggest amount of lines inserted does
never exceed the end of the visible region minus the current line of the
curser, which fixes the underflow issue.
This fixes #1515.
|
|
The clearing the screen for the `ansi::ClearMode::Saved` enum value
has been implemented. This is used to clear all lines which are
currently outside of the visible region but still inside the scrollback
buffer.
The specifications of XTerm indicate that the clearing of saved lines
should only clear the saved lines and not the saved lines plus the
currently visible part of the grid. Applications like `clear` send both
the escape for clearing history plus the escape for clearing history
when requested, so all sources seem to agree here.
To allow both clearing the screen and the saved lines when a key is
pressed the `process_key_bindings` method has been altered so multiple
bindings can be specified. So it is now possible to execute both `^L`
and `ClearHistory` with just a single binding. The
`process_mouse_bindings` method has also been changed for consistency.
To make sure everything works properly a test has been added which
clears the history and then attempts to scroll. Since scrolling is the
only way for a user to check if scrollback is available, this seems like
a nice abstraction to check if there is a scrollback.
|
|
Since Alacritty never had any scrollback history, the behavior when the
window height was increased was to just keep the prompt on the same line
it has been before the resize. However the usual behavior of terminal
emulators is to keep the distance from the prompt to the bottom of the
screen consistent whenever possible.
This fixes this behavior by loading lines from the scrollback buffer
when the window height is increased. This is only done when scrollback
is available, so there are only N lines available, the maximum amount of
lines which will be loaded when growing the height is N. Since the
number of lines available in the alternate screen buffer is 0, it still
behaves the same way it did before this patch.
Different terminal emulators have different behaviors when this is done
in the alt screen buffer, XTerm for example loads history from the
normal screen buffer when growing the height of the window from the
alternate screen buffer. Since this seems wrong (the alt screen is not
supposed to have any scrollback), the behavior of Termite (VTE) has been
chosen instead.
In Termite the alt screen buffer never loads any scrollback history
itself, however when the terminal height is grown while the alternate
screen is active, the normal screen's scrollback history lines are
loaded.
This fixes #1502.
|
|
When running bash and executing `echo -ne '\033c'`, the terminal should
be cleared. However there was an issue with the visible area not being
cleared, so all the text previously printed would still remain visible.
To fix this, whenever a `reset` call is received now, the complete
visible area is reset to `Cell::default()` (the default Cell) and the
length of the available scrollback history is reset to `0`, which
results in the scrollback history being cleared from the perspective of
the user.
This fixes #1483.
|
|
|
|
* Allow disabling DPI scaling
This makes it possible to disable DPI scaling completely, instead the
the display pixel ration will always be fixed to 1.0.
By default nothing has changed and DPI is still enabled, this just seems
like a better way than running `WINIT_HIDPI_FACTOR=1.0 alacritty` every
time the user wants to start alacritty.
It would be possible to allow specifying any DPR, however I've decided
against this since I'd assume it's a very rare usecase. It's also still
possible to make use of `WINIT_HIDPI_FACTOR` to do this on X11.
Currently this is not updated at runtime using the live config update,
there is not really much of a technical limitation why this woudn't be
possible, however a solution for that issue should be first added in
jwilm/alacritty#1346, once a system is established for changing DPI at
runtime, porting that functionality to this PR should be simple.
* Add working --class and --title CLI parameters
* Reduce Increase-/DecreaseFontSize step to 0.5
Until now the Increase-/DecreaseFontSize keybinds hand a step size of 1.0. Since the font size however is multiplied by two to allow more granular font size control, this lead to the bindings skipping one font size (incrementing/decrementing by +-2).
To fix this the step size of the Increase-/DecreaseFontSize bindings has been reduced to the minimum step size that exists with the current font configuration (0.5). This should allow users to increment and decrement the font size by a single point instead of two.
This also adds a few tests to make sure the methods for increasing/decreasing/resetting font size work properly.
* Add Copy/Cut/Paste keys
This just adds support for the Copy/Cut/Paste keys and sets up
Copy/Paste as alternative defaults for Ctrl+Shift+C/V.
* Move to cargo clippy
Using clippy as a library has been deprecated, instead the `cargo
clippy` command should be used instead. To comply with this change
clippy has been removed from the `Cargo.toml` and is now installed with
cargo when building in CI.
This has also lead to a few new clippy issues to show up, this includes
everything in the `font` subdirectory. This has been fixed and `font`
should now be covered by clippy CI too.
This also upgrades all dependencies, as a result this fixes #1341 and
this fixes #1344.
* Override dynamic_title when --title is specified
* Change green implementation to use the macro
* Ignore mouse input if window is unfocused
* Make compilation of binary a phony target
* Add opensuse zypper install method to readme
* Fix clippy issues
* Update manpage to document all CLI options
The introduction of `--class` has added a flag to the CLI without adding
it to the manpage. This has been fixed by updating the manpage.
This also adds the default values of `--class` and `--title` to the CLI
options.
* Remove unnecessary clippy lint annotations
We moved to "cargo clippy" in 5ba34d4f9766a55a06ed5e3e44cc384af1b09f65 and
removing the clippy lint annotations in `src/lib.rs` does not cause any additional warnings.
This also changes `cargo clippy` to use the flags required for checking integration tests.
* Enable clippy in font/copypasta crates
Enabled clippy in the sub-crates font and copypasta. All issues
that were discovered by this change have also been fixed.
* Remove outdated comment about NixOS
* Replace debug asserts with static_assertions
To check that transmutes will work correctly without having to rely on
error-prone runtime checking, the `static_assertions` crate has been
introduced. This allows comparing the size of types at compile time,
preventing potentially silent breakage.
This fixes #1417.
* Add `cargo deb` build instructions
Updated the `Cargo.toml` file and added a `package.metadata.deb`
subsection to define how to build a debian "deb" install file using
`cargo deb`. This will allow debian/ubuntu users to install `alacritty`
using their system's package manager. It also will make it easier to
provide pre-built binaries for those systems.
Also fixed a stray debug line in the bash autocomplete script that was
writting to a tempfile.
* Add config for unfocused window cursor change
* Add support for cursor shape escape sequence
* Add bright foreground color option
It was requested in jwilm/alacritty#825 that it should be possible to
add an optional bright foreground color.
This is now added to the primary colors structure and allows the user to
set a foreground color for bold normal text. This has no effect unless
the draw_bold_text_with_bright_colors option is also enabled.
If the color is not specified, the bright foreground color will fall
back to the normal foreground color.
This fixes #825.
* Fix clone URL in deb install instructions
* Fix 'cargo-deb' desktop file name
* Remove redundant dependency from deb build
* Switch from deprecated `std::env::home_dir` to `dirs::home_dir`
* Allow specifying modifiers for mouse bindings
* Send newline with NumpadEnter
* Add support for LCD-V pixel mode
* Add binding action for hiding the window
* Switch to rustup clippy component
* Add optional dim foreground color
Add optional color for the dim foreground (`\e[2m;`)
Defaults to 2/3 of the foreground color. (same as other colors).
If a bright color is dimmed, it's displayed as the normal color. The
exception for this is when the bright foreground is dimmed when no
bright foreground color is set. In that case it's treated as a normal
foreground color and dimmed to DimForeground.
To minimize the surprise for the user, the bright and dim colors have
been completely removed from the default configuration file.
Some documentation has also been added to make it clear to users what
these options can be used for.
This fixes #1448.
* Fix clippy lints and run font tests on travis
This fixes some existing clippy issues and runs the `font` tests through travis.
Testing of copypasta crate was omitted due to problens when running on headless travis-ci environment (x11 clipboard would fail).
* Ignore errors when logger can't write to output
The (e)print macro will panic when there is no output available to
write to, however in our scenario where we only log user errors to
stderr, the better choice would be to ignore when writing to stdout or
stderr is not possible.
This changes the (e)print macro to make use of `write` and ignore
any potential errors.
Since (e)println rely on (e)print, this also solves potential failuers
when calling (e)println.
With this change implemented, all of logging, (e)println and (e)print
should never fail even if the stdout/stderr is not available.
|