These helpers allow moving around in the scrollback-buffer. Scrolling
bigger portions of the screen is quite slowly as we have to traverse a
list. However, nothing compared to screen-rendering so we can ignore this.
But O(n) is always bad...
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This new function allows other layers to control the default attribute of
a console. This attribute is used when clearing the screen or when
allocating new cells.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We should check for errors to avoid doing all the rendering even though
the text-renderer already failed. Also print debug messages if specific
intermediate steps fail.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This fixes the console and terminal layer to use the new text renderer
instead of the old one.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Xterm supports CSIs which simply move the visible buffer up/down so we
need these helpers to perform such operations from the VTE layer.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If the background color is identical to the background-color of the glyph
to be drawn, then we can skip drawing the background. This increases
performance a _lot_.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Implement left and right tab movement in console backend. This is used by
the VTE layer to interpret different VT escape sequences and the tabulator
character.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Protected erase means erasing parts of the screen but preventing protected
characters from being erase. Protecting a character is done by setting
character attributes similarly to colors and backgrounds. Both are reset
on hard erase, soft-reset or screen clearance.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
ICH is used to insert characters into the current line. DCH is used to
delete characters from the current line. They act as described in vt220
manual.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
VT220 allows protecting attributes. That is, they are not erased by
special new erase-commands. The normal erase-commands still erase all
characters.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Add three helpers to set and reset tab-stops. They will be used by the VTE
layer to add and remove tab-stops when requested by the application.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Whoops, current tab ruler turned out to be vertical. That's definitely not
what we want. Therefore, turn it around to be horizontal so we can
correctly move forward/backward in the console.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
On soft-reset we reset the console to the initial state but keep current
line-state. That is, scrollback and cursor position are kept but the
non-visible state is reset.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The tab-ruler is used to set console tab-stops. We use an array with one
cell per column that is set to true if it is a tab-stop and false if it is
not.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This adds two functions to retrieve x/y positions of the cursor. This can
be used to save and restore cursor positions.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The 'M' CSI mode is used to delete lines. This implements this mode
similar to the "INSERT LINES" CSI.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The IL CSI ('L') is used to insert a given number of lines at the current
cursor position. All lines below are moved down.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This is a rewrite of the whole console layer so we can remove the
kmscon_buffer object to speed up the console.
This removes the split between the scroll region and the two margins so we
can resize margins in O(1). This also correctly merges the remaining
console modes so vte does not have to track them.
Btw. vim runs smoothly on kmscon with this console layer now (finally!).
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
For the same reason as we reset it to white on cell creation we need to
reset it to white on cell reset. Otherwise we have odd artifacts in
reverse video mode.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Reset font color to white for new cells. This allows us to draw reversed
cells that are not occupied by any value. Otherwise, these cells would be
still black if reversed.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
In inverse screen mode we switch background and foreground colors. As our
console layer supports transparent backgrounds, we have to do this in the
terminal layer.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This adds a new function that allows external subsystems to retrieve the
current flags of the console.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Instead of writing a function for each mode we now accept flags for the
console object. For now the flags are unused but other flags will be
added.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
VT510 manual says auto-wrap is disabled by default but most applications
(including bash) expect it to be on, therefore we enable it by default.
The console layer already supported it but the vte layer wasn't hooked up.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
When INSERT mode is enabled, we move all following characters to the right
and drop all characters that are moved beyond the margin.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This dummy is supposed to hard-reset the console. As the console is far
from finished, we keep it as dummy and implement this later.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This function is not needed at all. Instead, we should simply move one
character to the left on incoming backspace. There is no need to handle
auto-wrap on backspace.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This adds support for colored and bold characters. This also adds the
infrastrucure for background colors and underlined characters, however,
these are not properly implemented, yet.
The color codes are similar to xterm and optimized on black backgrounds.
So they are not too bright or shiny.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We now assume a screen of -1,-1 to 1,1 instead of 0,0 to 1,1 to avoid
matrix transformations.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Instead of using the slow old font-factory we now use the new font_screen
object which allows faster software rendering with pango/cairo.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
margin_bottom was always the last index of the scroll-region, in contrast
to cells->mbottom_y which is the bottom margin size. However, this cache
is inconvenient so this replaces all calls to margin_bottom with a correct
immediate calculation of the bottom margin.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The fixed_position option allows to explicitely keep the scrollback-buffer
position instead of scrolling on new input. This was already the current
behavior but now we can also scroll on new input if this is set to false.
Also fix up the formatting of the comments and remove old information.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The buffer object is used internally only and should never be shared.
Hence, we can safely remove the refcnt.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The buffer should not be accessed from code outside of console.c so make
it private. This includes some code-moving but no bigger changes. The diff
might look scary, though.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We currently have too much layers in the console subsystem. This reduces
performance and produces ugly hacks like our "*_clear_region" function. We
now merge both files so we can directly access the buffer-structure.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Add new helper to console subsystem which performs a backspace
operation. We must take care of auto-wrap mode so we cannot simply use
the *_move_left() function.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>