Add the `automerge` attribute to the Pixel bit field. It controls
whether two pixels must be automerged. Defining this allows two
mergeable characters not to be merged.
This was requested by:
https://github.com/ArthurSonzogni/FTXUI/issues/285
1. the default window size should be 80x24 rather than 80x25 in VT100.
2. the ioctl return value result should be checked. Some operating systems don't support TIOCGWINSZ this command.
Use std::string by default for the implementation of FTXUI's input
component.
Along the way:
- Give a correct implementation for fullwidth characters.
- Add tests
- Modify the way the cursor is drawn.
This implement the flexbox elements, following the HTML one.
Built from them, there is also the following elements:
- `paragraph`
- `paragraphAlignLeft`
- `paragraphAlignRight`
- `paragraphAlignCenter`
- `paragraphAlignJustify`
This is a breaking change.
In case of embedded systems, the terminal size may not
always be detectable (e.g. in case of serial output).
Allow application to set up the default size in case
autodetection fails. On platform such as Emscripten,
there is only "fallback" size.
Signed-off-by: Jarosław Pelczar <jarek@jpelczar.com>
This can happen for example in embedded linux, in case
the application is started via serial terminal.
Signed-off-by: Jarosław Pelczar <jarek@jpelczar.com>
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
Screen::ApplyShader accounted for 60% of the computation. This patch
optimize it.
Performance on a 80x80 frame improved from 1400 draw/s to 7000 draw/s.
In the past, FTXUI switched from std::string to std::wstring to support
fullwidth characters. The reasons was that fullwidth characters can be
stored inside a single wchar_t.
Then FTXUI added support for combining characters. A single glygh
doesn't even fit a wchar_t. Instead, a glyph can be arbitrary large.
The usage of wstring doesn't really fit the new model and have several
drawbacks:
1. It doesn't simplify the implementation of FTXUI, because of combining
characters.
2. It reduces drawing performance by 2x.
3. It increase Screen's memory allocation by 2x.
This patch converts FTXUI to use std::string internally. It now exposes
std::string based API. The std::wstring API remains, but is now
deprecated.
Tests and examples haven't been update to show the breakage is limited.
They will be updated in a second set of patches.
Bug: https://github.com/ArthurSonzogni/FTXUI/issues/153
Co-authored-by: Tushar Maheshwari <tushar27192@gmail.com>
- Convert Dimension to namespace to allow defining Fit method from dom.
- Use Dimensions extracted from Terminal as replacement struct.
- Convert Terminal to namespace as it only defines static members.
- Remove dom references from screen library (circular dependency).
* Reorganize ContainerBase
- Reduce Container overloads using default arguments
- Extract member function pointers to virtual functions
- Separate classes for Vertical, Horizontal and Tab containers
* Collect unpack from NodeDecorator subclasses
* Reduce redundant expansion for aliases
I finally got access to a computer using the Microsoft's Windows OS.
That's the opportunity to find and mitigate all the problems
encountered. This patch:
1. Introduce an option and a C++ definition to enable fallback for
Microsoft's terminal emulators. This allows me to see/test the
Microsoft output from Linux. This also allows Windows users to remove
the fallback and target non Microsoft terminals on Windows if needed.
2. Microsoft's terminal suffer from a race condition bug when reporting
the cursor position:
https://github.com/microsoft/terminal/pull/7583.
The mitigation is not to ask for the cursor position in fullscreen
mode where it isn't really needed and request it less often.
This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/136
3. Microsoft's terminal do not handle properly hidding the cursor. Instead
the character under the cursor is hidden, which is a big problem. As
a result, we don't enable setting the cursor to the best position for
[input method editors](https://en.wikipedia.org/wiki/Input_method),
It will be displayed at the bottom right corner.
See:
- https://github.com/microsoft/terminal/issues/1203
- https://github.com/microsoft/terminal/issues/3093
4. Microsoft's terminals do not provide a way to query if they support
colors. As a fallback, assume true colors is supported.
See issue:
- https://github.com/microsoft/terminal/issues/1040
This mitigates:
- https://github.com/ArthurSonzogni/FTXUI/issues/135
5. The "cmd" on Windows do not properly report its dimension. Powershell
works correctly. As a fallback, use a 80x80 size instead of 0x0.
6. There are several dom elements and component displayed incorrectly,
because the font used is missing several unicode glyph. Use
alternatives or less detailled one as a fallback.
Modify the ftxui::Pixel. Instead of storing a wchar, store a
std::wstring. Now a single pixel can store multiple codepoints.
If a codepoint is of size <=0, it will be appended to the previous
pixel.
Only ftxui::text() is supported. ftxui::vtext support still needs to be
added.
This causes the following CPU and memory regression:
- Memory: Pixel size increases by 200% (16 byte => 48byte).
- CPU: Draw/Second decrease by 62.5% (16k draw/s => 6k draw/s on 80x80)
Both regressions are acceptable. There are still two orders of magnitude
(100x) before the levels where performance/memory concerns begins.
This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/109
For some reason, ResetPosition() was also clearing the content. On very
slow terminal emulator like the one on Windows, flickering was visible.
This fixes:
https://github.com/ArthurSonzogni/FTXUI/issues/86
There was some undefined behavior to be fixed in the terminal input
parser.
The behavior of flush seems to have change. The fix was to invert '\0'
and std::flush.