Commit Graph

1562 Commits

Author SHA1 Message Date
Joe Wilm a60dbd564b
Sort some imports 2016-06-09 08:16:44 -07:00
Joe Wilm aff56a65a4
Make state updates and rendering event driven
The main thing preventing this system being event driven in the past was
input from the keyboard had to be polled separately from pty activity.
This commit adds a thread for the window event iterator and sends them
on the same channel as pty characters.

With that in place, the render loop looks like

    - Block on 1 available input
    - Get all remaining available input that won't cause blocking
    - Render

Which means that rendering is only performed on state changes. This
obsoleted the need for a `dirty` flag in the Term struct.
2016-06-09 08:06:47 -07:00
Joe Wilm 8b1e82f31a
Fix shutdown deadlock
Calling ::std::process::exit() from the SIGCHLD handler would sometimes
deadlock some OpenGL internal shutdown procedure. To resolve this, a
flag was added that can be checked with `process_should_exit`.
2016-06-08 21:24:31 -07:00
Joe Wilm 8126841ed3
Add support for scrolling regions
It's now possible to move around within Vim without the screen becoming
corrupt!

The ANSI parser now calls a (new) `set_scrolling_region` on the handler
when the DECSTBM CSI is received. In order to provide a sensible default
in case that the sequence doesn't include arguments, a TermInfo trait
was added which currently has methods for inspecting number of rows and
columns. This was added as an additional trait instead of being included
on Handler since they have semantically different purposes. The tests
had to be updated to account for the additional trait bounds.

The utilities module now has a `Rotate` trait which is implemented for
the built-in slice type. This means that slices and anything derefing to
a slice can be rotated. Since VecDeque doesn't support slicing (it's
a circular buffer), the grid rows are now held in a Vec to support
rotation.

For ergomomic access to the grid for scrolling and clearing regions,
additional Index/IndexMut implementations were added to the grid::Row
type.

Finally, a `reset` method was added to `Cell` which properly resets the
state to default (instead of just clearing the char). This supports
region clearing and also fixed a bug where cell backgrounds would remain
after being cleared.
2016-06-08 10:39:49 -07:00
Joe Wilm 0e7bb8d76e
Handle TEXT_CURSOR mode
When the flag is unset, the cursor is not rendered.
2016-06-07 21:17:48 -07:00
Joe Wilm 6c82fa9d7b
Only draw when terminal state has changed
This is achieved by setting a `dirty` flag when the terminal receives
an event that causes visible state to change. The implementation is
pretty much crap because most methods know about the flag.

Figure out something better later.
2016-06-07 21:15:53 -07:00
Joe Wilm 781c67f0a0
Parse a few more ansi terminal mode commands 2016-06-07 21:13:08 -07:00
Joe Wilm 6f3e890197
Handle pty char recv errors
The main loop is now exitted if the char sender hangs up.
2016-06-07 21:12:21 -07:00
Joe Wilm 06451fbab1
Add named thread for pty reader 2016-06-07 21:11:23 -07:00
Joe Wilm 5e920b893a
Unwrap some unhandled errors
They're still unhandled, but they won't silently pass by anymore.

TODO
2016-06-07 21:10:45 -07:00
Joe Wilm 3d62c2b8f5
Add explicit bounds check when advancing cursor 2016-06-06 17:46:26 -07:00
Joe Wilm 581eb6b69f
Tweak some Grid methods
Adds some #[inline] tags, and delegates to internals for num_rows and
num_cols. In case these become different than the expected values, this
should help to fail sooner.
2016-06-06 17:45:09 -07:00
Joe Wilm 7834bd177f
Fix bug where there were extra grid rows
Apparently VecDeque::with_capacity is more of a suggestion.
2016-06-06 17:44:06 -07:00
Joe Wilm 1a7eda7b05
Terminal sets more attributes on grid Cells 2016-06-06 17:43:14 -07:00
Joe Wilm 263a4e8a2e
Fix escape bytes as input bug in ANSI parser
There were several unrecognized escape codes that have arguments which
were being interpretted as input. Naturally, this caused state to be
corrupt. The escape codes are now handled by throwing away the bytes.
Consider this a TODO for later.
2016-06-06 17:41:03 -07:00
Joe Wilm cdea958e71
Add support for drawing background colors 2016-06-06 16:54:15 -07:00
Joe Wilm 6636cf6b9f
Minor updates to terminal handling
Properly handles goto_col and goto_row. Additionally, input wrapping is
handled.

Truecolor specs are now set appropriately.
2016-06-06 15:13:45 -07:00
Joe Wilm e5aeae69aa
Update task list 2016-06-06 14:59:45 -07:00
Joe Wilm a25c9bf1a7
Handle SIGCHLD
Closes alacritty after joining with child process.
2016-06-06 14:57:48 -07:00
Joe Wilm 78f5de4935
Support dynamic character loading
The glyph cache was previously initialized with a list of glyphs from
INIT_LIST, and never updated again. This meant that code points not
included in that list were not displayed. Now, the glyph cache has
gained the ability to load new glyphs at render time.

This seems to have lightly decreased performance for some reason.
2016-06-06 14:31:12 -07:00
Joe Wilm b977a15187
Batching flushes on texture change
This fixes a bug when multiple atlases are required.
2016-06-06 13:29:05 -07:00
Joe Wilm ed7aa96907
Refactor Instanced Drawing to use Vertex Arrays
Per-instanced data was previously stored in uniforms. This required
several OpenGL calls to upload all of the data, and it was more complex
to prepare (several vecs vs one).

Additionally, drawing APIs are now accessible through a `RenderApi`
(obtained through `QuadRenderer::with_api`) which enables some RAII
patterns. Specifically, checks for batch flushing are handled in Drop.
2016-06-06 13:20:35 -07:00
Joe Wilm 1f3f9add49
Optimize Rendering with batched draw calls
Draw calls are now batched for performance. Render times on git log at
the default size are now ~200usec.
2016-06-04 21:31:41 -07:00
Joe Wilm 4fdd5280f1
Add iterator methods to Grid and Row types
The iterator methods simplify logic in the main grid render function. To
disambiguate iterator methods from those returning counts (and to free
up names), the `rows()` and `cols()` methods on `Grid` have been renamed
to `num_rows()` and `num_cols()`, respectively.
2016-06-04 19:40:30 -07:00
Joe Wilm 2f058bd053
Optimize rendering
This moves some logic that was previously being done per-character into
the vertex shader. At this time, we've traded CPU computation for
additional gl::Uniform2f calls. This is only a marginal improvement.
However, this patch positions the renderer well for instanced drawing,
and that will be a huge performance win.
2016-06-04 15:30:17 -07:00
Joe Wilm f944b517fa
Add live-reload for shaders
Recompiling the entire program whenever a shader changes is slow, and it
can interrupt flow. Shader reloads are essentially instantaneous now. If
the new shader fails to compile, no state is changed; the previous
program continues to be used.
2016-06-04 10:54:33 -07:00
Joe Wilm c475c82c69
render: cleanup active_tex handling
- Removes a spammy printn!
- Sets active_tex to zero wherever gl::BindTexture is called with zero
2016-06-03 21:31:33 -07:00
Joe Wilm 97867d86f2
Move debug timer
It was near the left side; it will be less in-the-way on the right.
2016-06-03 09:26:22 -07:00
Joe Wilm 2e51d92a92
Use texture atlas for glyphs
This dramatically reduces the number of BindTexture calls needed when
rendering the grid. Draw times for a moderately full terminal of the
default size are ~1ms with this patch.
2016-06-02 22:14:55 -07:00
Joe Wilm 2f98871b02
Refactor renderer functions out of main.rs
This moves the rendering logic to draw the grid, to draw strings, and to
draw the cursor into the renderere module. In addition to being an
organizational improvement, this also allowed for some optimizations
managing OpenGL state. Render times for a moderate screen of text
dropped from ~10ms to ~4ms.
2016-06-02 20:27:07 -07:00
Joe Wilm a8024f64c7
Update Cargo dependencies
Most importantly, freetype-rs was updated to use freetype-sys 0.4 which
includes the LCD_FILTER apis.
2016-06-02 19:54:16 -07:00
Joe Wilm 30ec145109
Initial support for Terminal Emulation (woo!)
This patch introduces basic support for terminal emulation. Basic means
commands that don't use paging and are not full screen applications like
vim or tmux. Some paging applications are working properly, such as as
`git log`. Other pagers work reasonably well as long as the help menu is
not accessed.

There is now a central Rgb color type which is shared by the renderer,
terminal emulation, and the pty parser.

The parser no longer owns a Handler. Instead, a mutable reference to a
Handler is provided whenever advancing the parser. This resolved some
potential ownership issues (eg parser owning the `Term` type would've
been unworkable).
2016-06-02 19:42:28 -07:00
Joe Wilm 70b0423a31
Initial ANSI parser implementation
This is the initial terminal stream parsing implementation for
Alacritty. There are currently several TODOs, FIXMEs, and unimplemented!
things scattered about still, but what's here is good enough to
correctly parse my zsh startup.

The `Parser` implementation is largely based on the suck-less _simple
terminal_ parser. Because this is Rust and Rust has a fantastic type
system, some improvements are possible. First, `Parser` is a struct, and
its data is stored internally instead of statically. Second, there's no
terminal updates hard-coded into the parser. Instead, `Parser` is
generic over a `Handler` type which has methods for all of the actions
supported by the parser. Because Parser is generic, it should be
possible (with proper inlining) to have equivalent performance to the
hard-coded version.

In addition to using _simple terminal_ as a reference, there's a doc in
Alacritty's repository `docs/ansicode.txt`, a summary of the ANSI
terminal protocol, which has been referenced extensively.

There's probably a large number escapes we don't handle, and that's ok.
There's a lot that aren't necessary for everyday terminal usage. If you
feel like something that's not supported should be, feel free to add it.
Please try not to become overzealous and adding support for sequences
only used by folks trapped in 1988.
2016-05-28 22:09:25 -07:00
Joe Wilm 493a7fae7c
Remove old debug "test"
It wasn't actually a test, it was a crappy ascii renderer to show
freetype rendered glyphs.
2016-05-28 22:08:30 -07:00
Joe Wilm 208b79cc65
Add Summary of ANSI standards for ASCII terminals
This doc was found in the tmux repository, and I'm adding it here so it
doesn't get lost. Having it in-tree will also allow it to be referenced
from the code.
2016-05-28 08:39:36 -07:00
Joe Wilm 78414b5ae1
Implement tty::new()
Opens a pty, forks a child process, and execs the shell defined in
user's /etc/passwd file. Bytes from the pty are currently just written
to Alacritty's stdout as a sanity check that things are hooked up.

Thanks to `st` for some guidance on setting this up.
2016-05-24 21:06:19 -07:00
Joe Wilm 855ae75697
Add render time meter
Optimization is impossible without measurement!
2016-05-21 11:08:50 -07:00
Joe Wilm c70acbac0b
Correct sub-pixel font rendering with OpenGL
Uses the GL_ARB_blend_func_extended to get single-pass, per-channel
alpha blending. gl_generator is now used instead of gl to enable the
extension.

The background color is removed since that presumably needs to run in a
separate pass.
2016-05-20 21:36:28 -07:00
Joe Wilm e794bc11b9
Use subpixel font rendering
OpenGL only supports shared alpha blending. Subpixel font rendering
requires using the font RGB values as alpha masks for the corresponding
RGB channels. To support this, blending is implemented in the fragment
shader.
2016-04-11 08:05:19 -07:00
Joe Wilm b84eb9e921
Add a Grid
The grid holds the state of the terminal with row-major ordering.
Eventually, the grid::Cell type will hold other attributes such as
color, background color, decorations, and weight.

An initialization list is added for common ASCII symbols.
2016-04-10 16:25:05 -07:00
Joe Wilm 99474ef78a Start tracking some tasks
TASKS.md is a set of prioritized work for the project
2016-02-27 22:37:00 -08:00
Joe Wilm c8b69412b2 Rasterizer uses DPI from Glutin 2016-02-27 20:26:31 -08:00
Joe Wilm 1bf7bb8e12 Font no longer hardcoded in get_glyph 2016-02-27 14:45:38 -08:00
Joe Wilm 7a1ed7b46f Fix compiler warnings 2016-02-27 14:45:26 -08:00
Joe Wilm 7e9888b1f5 Add support for multiple font faces in rasterizer 2016-02-27 14:38:38 -08:00
Joe Wilm 97c1a17bf1 Cleanup PackedVertex initialization 2016-02-27 13:16:40 -08:00
Joe Wilm 77cfb7b5cd Implement per vertex struct 2016-02-27 13:08:39 -08:00
Joe Wilm eac2d01af4 Organize buffer data into struct 2016-02-26 22:30:42 -08:00
Joe Wilm ce96b5df6b Fix some compiler warnings 2016-02-25 21:02:18 -08:00
Joe Wilm 07640b392c Move rendering stuff into renderer mod 2016-02-25 21:02:01 -08:00