aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
Commit message (Collapse)AuthorAge
...
* Make use of `unlikely` intrinsicJoe Wilm2016-09-18
| | | | | There's some bounds checks we do that panic if the condition is ever true.
* Rewrite ansi parser using vte crateJoe Wilm2016-09-18
| | | | | | | Using the vte crate allows removal of the ansi parser state machine and enables us to just be concerned with actions described in the protocol. In addition to making alacritty simpler, this also improves correctness and performance.
* Remove extra wait_events()Joe Wilm2016-09-16
| | | | | Allegedly x11 wants you to wait for a refresh event before using the context, but that doesn't arrive on all platforms (notably macOS).
* Update deps and remove printlnsJoe Wilm2016-09-05
|
* Move rendering back to main threadJoe Wilm2016-09-01
| | | | | | | | | | | | | | This is only like the third time I've made this change. The issue of having a blank screen at startup is due to x11 event loop + glX interactions. Not sure what the problem is specifically, but glXMakecurrent was blocking until the x11 event loop advanced. The input and rendering are able to live on the same thread while still removing unnecessary renders due to the glutin::WindowProxy::wakeup_event_loop() method. The PtyReader just kicks the event loop when there's something to do; otherwise, the event loop just waits for something to happen and _doesn't_ draw in free run mode.
* Eliminate extra rendersJoe Wilm2016-08-31
| | | | | | | | | | Currently has a bug where screen is blank at startup. That aside, Alacritty uses basically 0 CPU now. The input thread is still separate from the render thread, but, given the ability to wake the event loop, it may be possible to merge them again. I'm not sure if that's actually desirable. Performance is seemingly unchanged.
* Separate input handling from renderingJoe Wilm2016-08-29
| | | | | | | | | | | | | To minimize rendering, the input must be handled in a separate thread. To see, why, consider the optimal rendering solution: renders are only necessary when the pty has data that changes the terminal state, OR there is a window event which changes the graphics state. When not drawing, the render thread is to remain parked at a condition variable, and it's not possible to handle input while parked! Thus, we need a separate thread. In addition to adding the separate thread, each subsystem thread is now spawned in a separate function to (hopefully) improve readability.
* Support bold/italic font rendering on macOSJoe Wilm2016-08-12
| | | | | | | | | | | | | | | | | | This patch adds support for rendering italic fonts and bold fonts. The `font` crate has a couple of new paradigms to support this: font keys and glyph keys. `FontKey` is a lightweight (4 byte) identifier for a font loaded out of the rasterizer. This replaces `FontDesc` for rasterizing glyphs from a loaded font. `FontDesc` had the problem that it contained two strings, and the glyph cache needs to store a copy of the font key for every loaded glyph. `GlyphKey` is now passed to the glyph rasterization method instead of a simple `char`. `GlyphKey` contains information including font, size, and the character. The rasterizer APIs do not define what happens when loading the same font from a `FontDesc` more than once. It is assumed that the application will track the resulting `FontKey` instead of asking the font to be loaded multiple times.
* Fix arrow keys on macOSJoe Wilm2016-08-03
|
* Input expects modifier keys from GlutinJoe Wilm2016-07-30
| | | | | | This is experimental on a separate branch of Glutin. It's intended to fix the problem of certain key events not being delivered on alt-tab and breaking the modifier state tracking.
* Update to latest nightlyJoe Wilm2016-07-15
| | | | | | | Previous version of serde no longer worked; cargo packages were updated as a result. `Zero` and `One` traits were deprecated. Use of those was removed. The `Step` trait gained a lot more methods, and the index::$ty implementations were updated.
* Use "invert" cursor instead of drawing blockJoe Wilm2016-07-04
| | | | | The cursor now matches perfectly cell widths and actually shows the character underneath.
* Fix resizing on macOSJoe Wilm2016-07-04
| | | | | terminal.resize was not being called. Additionally, it was being called too much on other platforms (resize events were completely coalesced).
* Correctly handle Backspace and DeleteJoe Wilm2016-07-04
| | | | | | The default characters sent for this were incorrect. Delete now sends xterm-compatible escapes (dch1, kdch1), and Backspace sends the delete code 0x7f.
* Merge renderer and input handling threadsJoe Wilm2016-07-04
| | | | | | | The extra render thread just resulted in extra complexity. There were also some startup bugs not resolved with that architecture. Finally, there was no noticeable performance boost from having the additional thread.
* Move ::grid::index to ::indexJoe Wilm2016-07-03
| | | | | | | | The grid and term modules already rely on the index types, and ansi is about to be updated with strongly typed APIs. Since Cursor, Line, and Column are fundamental to the code in several modules, namespacing them under one of them seems less correct than a module that stands by itself.
* Grid API is now generic and strongly typedJoe Wilm2016-07-03
| | | | | | | | | | | | | | | | | | The Grid no longer knows about a `Cell` and is instead generic. The `Cell` type is coupled to the `term` module already, and it's been moved there to reflect the strong relationship. Grid APIs previously accepted `usize` for many arguments. If the caller intended rows to be columns, but the function accepted them in reverse, there would be no compiler error. Now there is, and this should prevent such bugs from entering the code. The Grid internals grew significantly to accomodate the strongly typed APIs. There is now a `grid::index` module which defines Cursor, Line, and Column. The Grid APIs are all based on these types now. Indexing for Ranges proved to be somewhat awkward. A new range had to be constructed in the implementation. If the optimizer can't figure out what's going on in that case, the ranges may not be a zero-cost abstraction.
* Move WriteNotifier type into input moduleJoe Wilm2016-07-02
| | | | | | It's a generic impl of `input::Notify` for `Write` types; as such, it seems completely reasonable to include in the input module. Moving it also serves to declutter main.
* Improve pty reading and renderer synchronizationJoe Wilm2016-07-01
| | | | | | | | | | | The pty read thread now runs the parser and directly updates the terminal in the same thread. This obviates the need for a channel which sends every char read from the pty; this is a huge performance boon. Synchronization between the updater and the renderer is now achieved with a PriorityMutex. Previously, an atomic bool was (poorly) used to request the lock on terminal. The PriorityMutex is dead simple to use, and it _Just Works_.
* Vendor upcoming Utf8Chars iterator from libstdJoe Wilm2016-06-30
| | | | | | | | | | | The upcoming Utf8Chars iterator was vendored from a libstd PR. The iterator works on BufRead types which is critical for improving performance. A small modification was made where the number of unused bytes is included with Utf8CharsError::IncompleteUtf8. The pty reader thread was updated to use this new type. Next steps will be moving the parsing there and either sending parse results in batches or updating the terminal directly from that thread.
* Add config fileJoe Wilm2016-06-30
| | | | | | | | | Configuration may now be specified in either `$HOME/.alacritty.yml` or `$HOME/.config/alacritty.yml`. See `alacritty.yml` in the repository root for an example. When a configuration file cannot be located, a default configuration is used.
* Add license headers to source filesJoe Wilm2016-06-29
|
* Fix resizing on macOSJoe Wilm2016-06-29
| | | | | | | The resize callback is the only way to perform live resizing on macOS. A callback is provided, and a static variable is used to provide a Sender to that function so that resize events may be processed in the usual way.
* Implement terminal resizingJoe Wilm2016-06-29
| | | | | | | | | | | | | | The resize event is received from glutin on the update thread, but the renderer needs to be informed as well for updating the viewport and projection matrix. This is achieved with an mpsc::channel. To support resizing, the grid now offers methods for growing and shrinking, and there are several implementations available for clear_region based on different Range* types. Core resize logic is all in Term::resize. It attempts to keep as much context as possible when shinking the window. When growing, it's basically just adding rows.
* Refactor Tty and Grid creation into Term::newJoe Wilm2016-06-28
| | | | | | | This moves more logic out of main() and prepares the Term type to handle resizing. By providing all size data to Term, it is now possible to implement a resize function there which handles all resizing logic save for the rendering subsystem.
* Enable vsyncJoe Wilm2016-06-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The input/pty processing loop previously consumed input on a channel and hit the rendering when the queue became empty. This had a couple of problems 1. It was possible to be overwhelmed with input and not give the renderer an opportunity to update the screen. This gave the appearance of locking up. 2. Multiple frames could be rendered for a single vblank (redundant work) 3. Open loop rendering would inevitably have buffer swapping out of sync with vblanks and visual tearing would occur. This commit enables vsync on the glutin window. The rendering was all moved onto a separate thread from input/pty processing to support vsync. However, the rendering thread must be 100% synchronized with the updater thread. There's now a Mutex on the Term, and an atomic bool to ask the input/pty processing to yield to the renderer. One aspect of this feature that hasn't been worked out is how to limit the frame rate. Currently, it just free runs at the screen refresh rate. The initial attempt here included the input/pty processor holding a lock while waiting for input. This *almost* worked, but there was a (not uncommon) edge case where the terminal state was "dirty" but the renderer was not ready to draw. Instead of blocking on the refresh issue, it's being punted to after an MVP is released. The overhead of drawing at 60Hz was profiled to be ~5% CPU usage, and this is deemed acceptable for an MVP.
* Implement special input handlingJoe Wilm2016-06-23
| | | | | | | | | | | | | | | | There's a number of keys/combinations that should emit escape sequences to the PTY when triggered. This commit adds a framework to support that. The input::Processor is a type which tracks state of modifier keys. When special keys (like arrow, function) are detected, the processor pulls up a list of candidate escapes to send, and picks the first one based on terminal mode and active modifier keys. The input::Processor is generic over the thing receiving the escape sequences, the input::Notify type. Included is a wrapper for `&mut io::Write` which implements input::Notify and is currently used to connect the processor to the PTY stream. This added handling of the APP_CURSOR mode which changes affects input processing.
* Fix bug handling ansi mode sequencesJoe Wilm2016-06-23
| | | | | | | The sense of set_mode and unset_mode was inverted. The TextCursor/ShowCursor mode depended on the incorrect behavior, and that was fixed as well. TextCursor was renamed to ShowCursor to be perfectly clear on the intent.
* Add support for macOSJoe Wilm2016-06-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Alacritty now runs on macOS using CoreText for font rendering. The font rendering subsystems were moved into a separate crate called `font`. The font crate provides a unified (albeit limited) API which wraps CoreText on macOS and FreeType/FontConfig on other platforms. The unified API differed slightly from what the original Rasterizer for freetype implemented, and it was updated accordingly. The cell separation properties (sep_x and sep_y) are now premultiplied into the cell width and height. They were previously passed through as uniforms to the shaders; removing them prevents a lot of redundant work. `libc` has some differences between Linux and macOS. `__errno_location` is not available on macOS, and the `errno` crate was brought in to provide a cross-platform API for dealing with errno. Differences in `openpty` were handled by implementing a macOS specific version. It would be worth investigating a way to unify the implementations at some point. A type mismatch with TIOCSCTTY was resolved with a cast. Differences in libc::passwd struct fields were resolved by using std::mem::uninitialized instead of zeroing the struct ourselves. This has the benefit of being much cleaner. The thread setup had to be changed to support both macOS and Linux. macOS requires that events from the window be handled on the main thread. Failure to do so will prevent the glutin window from even showing up! For this reason, the renderer and parser were moved to their own thread, and the input is received on the main thread. This is essentially reverse the setup prior to this commit. Renderer initialization (and thus font cache initialization) had to be moved to the rendering thread as well since there's no way to make_context(null) with glx on Linux. Trying to just call make_context a second time on the rendering thread had resulted in a panic!.
* Fix all trivial compiler warningsJoe Wilm2016-06-09
| | | | | | | | | | | Of note are the `ansi` and `grid` modules becoming public. There are several bits of unused code in each of these. In the case of `grid`, the unused parts are generally useful, like some indexing implementations. In ansi, there are pieces that will be used once the parser is more complete. In any case, these modules are fairly generic and mostly usable outside of Alacritty. Unused cargo packages were also removed.
* Sort some importsJoe Wilm2016-06-09
|
* Make state updates and rendering event drivenJoe Wilm2016-06-09
| | | | | | | | | | | | | | | | 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.
* Fix shutdown deadlockJoe Wilm2016-06-08
| | | | | | 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`.
* Handle TEXT_CURSOR modeJoe Wilm2016-06-07
| | | | When the flag is unset, the cursor is not rendered.
* Only draw when terminal state has changedJoe Wilm2016-06-07
| | | | | | | | 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.
* Handle pty char recv errorsJoe Wilm2016-06-07
| | | | The main loop is now exitted if the char sender hangs up.
* Add named thread for pty readerJoe Wilm2016-06-07
|
* Unwrap some unhandled errorsJoe Wilm2016-06-07
| | | | | | They're still unhandled, but they won't silently pass by anymore. TODO
* Add support for drawing background colorsJoe Wilm2016-06-06
|
* Support dynamic character loadingJoe Wilm2016-06-06
| | | | | | | | | 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.
* Refactor Instanced Drawing to use Vertex ArraysJoe Wilm2016-06-06
| | | | | | | | | | 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.
* Optimize Rendering with batched draw callsJoe Wilm2016-06-04
| | | | | Draw calls are now batched for performance. Render times on git log at the default size are now ~200usec.
* Optimize renderingJoe Wilm2016-06-04
| | | | | | | | 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.
* Add live-reload for shadersJoe Wilm2016-06-04
| | | | | | | 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.
* Use texture atlas for glyphsJoe Wilm2016-06-02
| | | | | | 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.
* Refactor renderer functions out of main.rsJoe Wilm2016-06-02
| | | | | | | | 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.
* Initial support for Terminal Emulation (woo!)Joe Wilm2016-06-02
| | | | | | | | | | | | | | | | 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).
* Initial ANSI parser implementationJoe Wilm2016-05-28
| | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Implement tty::new()Joe Wilm2016-05-24
| | | | | | | | 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.
* Add render time meterJoe Wilm2016-05-21
| | | | Optimization is impossible without measurement!