aboutsummaryrefslogtreecommitdiff
path: root/alacritty_terminal/src/grid
Commit message (Collapse)AuthorAge
* Merge remote-tracking branch 'vendor/master' into graphicsAyose2025-07-23
|\
| * Migrate to 2024 editionChristian Duerr2025-07-13
| |
| * Add size_hint to GridIteratortidely2025-07-13
| | | | | | Co-authored-by: Christian Duerr <contact@christianduerr.com>
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2024-12-26
|\|
| * Fix racing condition in hint triggeringChristian Duerr2024-11-02
| | | | | | | | | | | | | | | | | | | | | | This fixes an issue with hints where it was possible that the terminal content of highlighted hints changed between the highlighted hint update and the activation of the hint. This patch always validates the hint's text content against the hint itself to ensure that the content is still valid for the original hint which triggered the highlight. Closes #8277.
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2024-10-13
|\|
| * Remove unused `Clone` requirementsChristian Duerr2024-10-07
| |
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2024-05-15
|\|
| * Fix hint `Select` action for hyperlink escapeChristian Duerr2024-03-12
| | | | | | | | | | | | | | | | | | | | | | | | This fixes an issue where the `Select` action for hyperlink escape text would select the entire line, instead of selecting only the hyperlink itself. It also changes the way hyperlinks with the same ID are highlighted, removing the restriction of being on consecutive lines and instead highlighting all visible cells that correspond to the matching hyperlink. Closes #7766.
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2024-03-04
|\|
| * Fix regional scrolling leaking into historyChristian Duerr2024-02-14
| | | | | | | | | | This fixes an issue where a scrolling region that does not start at the top of the screen would still rotate lines into history when scrolling the content "upwards".
| * Fix row indexing with inclusive rangesAlexandru Placinta2024-02-11
| |
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2024-02-11
|\|
| * Remove `alacritty_config` from alacritty_terminalKirill Chibisov2023-11-10
| | | | | | | | | | There's no need to force alacritty's user configuration on other users of the crate, thus provide the options actually used by alacritty_terminal itself.
| * Fix typosPavel Roskin2023-10-25
| |
| * Fix the crash when shrinking scrolled terminalKirill Chibisov2023-06-17
| | | | | | | | | | | | | | display_offset was adjusted unconditionally, thus it could go beyound the history limits, so clamp it to history like we do in grow_colums. Fixes #6862.
* | Merge remote-tracking branch 'vendor/master' into graphicsAyose2022-08-04
|\|
| * Fix clippy warningsChris Copeland2022-07-25
| |
| * Replace `map().unwrap_or()` with `map_or()`Chris Copeland2022-07-20
| | | | | | Use a `map_or` instead of a `map().unwrap_or()` chain.
* | Allow replacing part of a graphic with text.Ayose2022-07-12
| | | | | | | | | | | | | | | | | | When text is added to a cell with a reference to a graphic, an operation is sent to the OpenGL thread to replace a subregion of the cell with a transparent area. If the OpenGL driver supports the GL_ARB_clear_texture extension, the region is updated with glClearTexSubImage. If the extension is not available, the texture is updated with glTexSubImage2D.
* | Fill all cells under a graphic with the template.Ayose2022-07-12
| | | | | | | | | | | | | | | | With the template we can create hyperlinks attached to the graphic. To avoid reflow issues when a row is shrank, wrapped rows that only contain graphic cells are discarded. With this approach we loss some info, like the hyperlink, but the image is always properly positioned in the grid.
* | Merge with alacritty/masterAyose2022-07-12
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The merge requires multiple changes in order to be compatible with the last version of Alacritty: - Textures are now always deleted on Drop. This is required because Alacritty now supports multiple windows in the same process, so we can't assume that all resources are freed when a single window is closed. This is the same approach used for the atlas textures. - The graphics feature is only compatible with OpenGL 3.3. Alacritty now supports GLES 2.2, but in order to provide a proper support for it we need a different approach, specific for that version. - Cell dimensions in pixels are re-added to the alacritty_terminal crate.
| * Add support for hyperlink escape sequenceKirill Chibisov2022-07-10
| | | | | | | | | | | | | | This commit adds support for hyperlink escape sequence `OSC 8 ; params ; URI ST`. The configuration option responsible for those is `hints.enabled.hyperlinks`. Fixes #922.
| * Use `MaybeUninit<usize>` instead of `usize` in `Storage::swap`nils2022-06-15
| | | | | | | | `Row` contains pointer bytes, which are not valid for `usize`, therefore `MaybeUninit<usize>` should be used instead to do an untyped copy.
| * Enable damage tracking only on WaylandKirill Chibisov2022-05-20
| | | | | | | | | | | | | | | | | | | | Other platforms don't have such concepts in general or have them via different interfaces not related to EGL. This commit also resolves some minor clippy issues. Fixes #6051. Co-authored-by: Christian Duerr <contact@christianduerr.com>
| * Keep history position when viewport is cleareda5ob7r2021-12-18
| | | | | | | | | | | | | | | | This patch resolves a behavior that display area doesn't keep track of content in a scrollback buffer due to display offset reset when viewport clear is invoked. This is similar to #5341, but this problem is caused by viewport clear instead of new outputs to the viewport.
| * Fix crash when vi cursor in history during cleara5ob7r2021-12-03
| | | | | | Fixes #5544.
| * Update rustfmt configurationChristian Duerr2021-10-11
|/ | | | | | | | | | | | | | | | | In this change I went through all current rustfmt configuration options and expanded our existing configuration with overrides whenever deemed appropriate. The `normalize_doc_attributes` option is still unstable, but seems to work without any issues. Even when passing macros like `include_str!` that is recognized properly and not normalized. So while this wasn't an issue anywhere in the code, it should make sure it never will be. When it comes to imports there are two new major additions. The `imports_granularity` and `group_imports` options. Both mostly just incorporate unwritten rules that have existed in Alacritty for a long time. Unfortunately since `alacritty_terminal` imports in `alacritty` are supposed to be separate blocks, the `group_imports` option cannot be used.
* Improve rendering performanceChristian Duerr2021-05-22
| | | | | | | | | | | | | | | | | | | | | | | | | | This PR combines a couple of optimizations to drastically reduce the time it takes to gather everything necessary for rendering Alacritty's terminal grid. To help with the iteration over the grid, the `DisplayIter` which made heavy use of dynamic dispatch has been replaced with a simple addition to the `GridIterator` which also had the benefit of making the code a little easier to understand. The hints/search check for each cell was always performing an array lookup before figuring out that the cell is not part of a hint or search. Since the general case is that the cell is neither part of hints or search, they've been wrapped in an `Option` to make verifying their activity a simple `is_some()` check. For some reason the compiler was also struggling with the `cursor` method of the `RenderableContent`. Since the iterator is explicitly drained, the performance took a hit of multiple milliseconds for a single branch. Our implementation does never reach the case where draining the iterator would be necessary, so this sanity check has just been replaced with a `debug_assert`. Overall this has managed to reduce the time it takes to collect all renderable content from ~7-8ms in my large grid test to just ~3-4ms.
* Fix release mode testsChristian Duerr2021-05-01
| | | Fixes #5041.
* Fix automatic scrolling on resizeRichard Steinmetz2021-04-08
|
* Keep viewport in place during resizeRichard Steinmetz2021-03-31
| | | | | Fixes #4879. Co-authored-by: Christian Duerr <contact@christianduerr.com>
* Unify the grid line indexing typesChristian Duerr2021-03-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously Alacritty was using two different ways to reference lines in the terminal. Either a `usize`, or a `Line(usize)`. These indexing systems both served different purposes, but made it difficult to reason about logic involving these systems because of its inconsistency. To resolve this issue, a single new `Line(i32)` type has been introduced. All existing references to lines and points now rely on this definition of a line. The indexing starts at the top of the terminal region with the line 0, which matches the line 1 used by escape sequences. Each line in the history becomes increasingly negative and the bottommost line is equal to the number of visible lines minus one. Having a system which goes into the negatives allows following the escape sequence's indexing system closely, while at the same time making it trivial to implement `Ord` for points. The Alacritty UI crate is the only place which has a different indexing system, since rendering and input puts the zero line at the top of the viewport, rather than the top of the terminal region. All instances which refer to a number of lines/columns instead of just a single Line/Column have also been changed to use a `usize` instead. This way a Line/Column will always refer to a specific place in the grid and no confusion is created by having a count of lines as a possible index into the grid storage.
* Move renderable cell transformation to alacrittyChristian Duerr2021-01-24
| | | | | | | | | | | | This refactors a large chunk of the alacritty_terminal API to expose all data necessary for rendering uniformly through the `renderable_content` call. This also no longer transforms the cells for rendering by a GUI but instead just reports the content from a terminal emulation perspective. The transformation into renderable cells is now done inside the alacritty crate. Since the terminal itself only ever needs to know about modified color RGB values, the configuration for colors was moved to the alacritty UI code.
* Fix assertion crash on 32-bit systemsr-c-f2021-01-11
| | | Fixes #4687.
* Remove Windows WinPTY backendChristian Duerr2021-01-01
|
* Use ConfigDeserialize for all config enumsChristian Duerr2020-12-31
| | | | | | | This fixes up all of the remaining enums which are used in the configuration file to make sure they all support fully case insensitive deserialization. Fixes #4611.
* Fix scrolling region performance with fixed linesChristian Duerr2020-12-10
| | | | | | | | | | | | | | | | | | | | This resolves an issue with Alacritty's scrolling region performance when there's a number of fixed lines at the top of the screen. This affects commonly used applications like tmux or vim. Instead of using separate logic for when the scrolling region starts at the top of the screen without any fixed lines, the code should now try to figure out the target position of these fixed lines ahead of time, swap them into place and still perform the optimized implementation to move the grid. This comes with the small trade-off that since lines are swapped before rotating the screen without clearing or removing any lines during the rotation process, that the places the fixed lines have been swapped with will appear out of order when using scrolling regions in the primary screen buffer. Since the use of scrolling regions primarily affects the alternate screen and most terminals don't keep any history at all, this should however not cause any problems.
* Add ability to select text during searchChristian Duerr2020-11-13
| | | | | | | | | | | | | This removes the restriction of not being able to select text while the search is active, making it a bit less jarring of a UX when the user tries to interact with the terminal during search. Since the selection was used during vi-less search to highlight the focused match, there is now an option for a focused match color, which uses the inverted normal match color by default. This focused match is used for both search modes. Other mouse interactions are now also possible during search, like opening URLs or clicking inside of mouse mode applications.
* Use dynamic storage for zerowidth charactersChristian Duerr2020-11-05
| | | | | | | | | | | | | | | | | | | The zerowidth characters were conventionally stored in a [char; 5]. This creates problems both by limiting the maximum number of zerowidth characters and by increasing the cell size beyond what is necessary even when no zerowidth characters are used. Instead of storing zerowidth characters as a slice, a new CellExtra struct is introduced which can store arbitrary optional cell data that is rarely required. Since this is stored behind an optional pointer (Option<Box<CellExtra>>), the initialization and dropping in the case of no extra data are extremely cheap and the size penalty to cells without this extra data is limited to 8 instead of 20 bytes. The most noticible difference with this PR should be a reduction in memory size of up to at least 30% (1.06G -> 733M, 100k scrollback, 72 lines, 280 columns). Since the zerowidth characters are now stored dynamically, the limit of 5 per cell is also no longer present.
* Add support for searching without vi modeChristian Duerr2020-07-15
| | | | | | | | This implements search without vi mode by using the selection to track the active search match and advancing it on user input. The keys to go to the next or previous match are not configurable and are bound to enter and shift enter based on Firefox's behavior. Fixes #3937.
* Fix cursor reflowChristian Duerr2020-07-15
| | | | | | | | | | | | | | | | | | | | | This resolves three different issues with cursor reflow. The first issue was that the cursor could reach the top of the screen during reflow, since content was pushed into history despite viewport space being available. Since the cursor cannot leave the viewport, this would insert new space between the cursor and content (see #3968). Another issue was that the wrapline flag was not set correctly with content being available behind the cursor. Since the cursor is not necessarily at the end of the line, it is possible that the cursor should reflow to the next line instead of staying on the current one and setting the wrapline flag. The last bug fixed in this is about reflow with content available behind the cursor. Since that might have en effect on new lines being inserted and deleted below the cursor, the cursor needs to be reflown based on it. Fixes #3968.
* Fix crash on cursor resizeChristian Duerr2020-07-14
| | | Fixes #3960.
* Add regex scrollback buffer searchChristian Duerr2020-07-09
| | | | | | | | | | This adds a new regex search which allows searching the entire scrollback and jumping between matches using the vi mode. All visible matches should be highlighted unless their lines are excessively long. This should help with performance since highlighting is done during render time. Fixes #1017.
* Fix cursor reflowChristian Duerr2020-07-09
| | | | | | | | | | | | | | | | | | | | | | To make sure that output is consistent even while resizing the window, the cursor will now reflow with the content whenever the window size is changed. Since the saved cursor is more likely to represent a position in the grid rather than a reference to the content below it and handling of resize before jumping back to it is more likely than with the primary cursor, no reflow is performed for the saved cursor The primary cursor is unfortunately always reflowed automatically by shells like zsh, which has always caused problems like duplicating parts of the prompt and stretching it out "infinitely". Since the cursor is now reflowed appropriately the duplication of the shell prompt should be reduced, however it is possible that the shell moves the cursor up one line after it has already been reflowed, which will cause a line of history to be deleted if there is no duplicated prompt line above the reflowed prompt. Since this behavior is identical in VTE and Kitty, no attempt is made to work around it in this patch. Fixes #3584.
* Preserve linewrap flag across alt screen switchesChristian Duerr2020-07-06
| | | | | | While neither VTE, URxvt nor Kitty handle this, preserving the linewrap flag across alternate screen switches seems like the correct thing to do. XTerm also does handle this correctly, which indicates that it is a bug and not a feature.
* Fix reflow of empty wrapped cursor lineChristian Duerr2020-07-01
| | | | | | | | | | | This bug was caused by trying to grow the terminal while the cursor line was wrapped but entirely empty. Resizing the terminal now accounts for the position of the deleted line and moves the cursor up only when the line deleted was above it. The deletion of the line was caused by the shell redrawing itself whenever the cursor is moved. Fixes #3583.
* Clear selection on clear line/screen escapesKirill Chibisov2020-06-26
| | | | | Selection is now cleared if clear line or clear screen escape sequences are clearing content behind it.
* Fix scroll down escape pulling lines from historyChristian Duerr2020-06-25
| | | | | | | | | | | | | | | | | This works around a bug where the optimized version of the `Grid::scroll_down` function would just rotate the entire grid down if the scrolling region starts at the top of the screen, even if there is history available. Since rotations of scrolling regions should not affect the scrollback history, this optimized version is now only called when the max scrollback size is 0, making it impossible for the grid to have any history while it is used. Since the main usecase of this is the alternate screen buffer, which never has any history, the performance should not be affected negatively by this change. Fixes #3582.
* Add automatic scrolling during selectionChristian Duerr2020-06-18
| | | | | | | | | | | | | This adds a new `Scheduler` which allows for staging events to be processed at a later time. If there is a selection active and the mouse is above or below the window, the viewport will now scroll torwards the direction of the mouse. The amount of lines scrolled depends on the distance of the mouse to the boundaries used for selection scrolling. To make it possible to scroll while in fullscreen, the selection scrolling area includes the padding of the window and is at least 5 pixels high in case there is not enough padding present.