23 Commits

Author SHA1 Message Date
David Herrmann
03aab2b54b tsm: screen: add support for multi-cell characters
The wcwidth() POSIX helper returns the number of cells that a character
occupies. This is normally 1, however, if it is 0 we simply discard this
input (this should never happen as all characters that wcwidth() returns 0
for should already be handled by the VTE layer).
But if it is >1, we write the character in the first cell, set the width
correctly and mark all following characters as width=0.

Everything else is left unchanged, that means, the running application has
to be aware of wcwidth() and correctly send two backspaces to clear a
width=2 character and so on.

This behavior almost exactly matches the xterm behavior. There are some
corner cases like erasing only one part of a multi-cell character etc.
that might differ. However, these are non-standard cases that no
application should never rely on.
Anyway, if we spot any of these differences between xterm and kmscon, we
should fix kmscon to behave like xterm does.

Thanks to Shixin for looking this up in other emulators.

Reported-by: Shixin Zeng
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-10 16:09:28 +01:00
David Herrmann
1657bb9a3a text: add render-support for multi-cell glyphs
Multi-cell glyphs are glyphs that span across multiple horizontal cells.
The font renderers already support this. This patch fixes the console
renderers to take advantage of this.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-10 16:00:08 +01:00
David Herrmann
32186066de tsm: screen: do not link alternate-screen lines to scrollback
The alternate screen is mainly used to avoid linking lines to the
scrollback buffer. This implements this feature so only main-screen lines
end up in the scrollback buffer.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 12:26:18 +02:00
David Herrmann
77002ebf8b tsm: screen: remove obsolete comment
We correctly free all new space and this is really needed due to rotations
in the active screen and scrollback buffer.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 12:22:53 +02:00
David Herrmann
3c85ac9541 tsm: screen: fix cell-initialization on line resize
We didn't correctly initialize new lines on resize. In fact, we didn't
initialize new cells at all. This was all covered by a nasty-fix in the
screen-resize handler.
This fixes the line-resize handler to initialize all new cells correctly.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 12:20:08 +02:00
David Herrmann
851113718a tsm: screen: fix freeing alternate screen buffers on shutdown
We have to free both, main and alternate buffers on shutdown. We only used
to free the currently active buffer.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 12:19:35 +02:00
David Herrmann
abd4764199 tsm: screen: add flag to select alternate screen buffer
The VTE layer can now set the TSM_SCREEN_ALTERNATE flag to switch to the
alternate screen-buffer and back.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 11:38:20 +02:00
David Herrmann
e23b9d0090 tsm: screen: allocate alternate screen buffer
This changes the line-allocation helpers of TSM-screen to allocate an
alternate buffer along with the main-buffer. We still keep the "lines"
pointer to the main-buffer all the time, but this will allow to implement
alternate-xterm-screens later.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-11 11:16:30 +02:00
David Herrmann
3ecd09ddd3 tsm: screen: implement selection extraction
This adds a new helper that returns the UTF8 encoded data of the selected
parts in the tsm-screen object.

There is still much to do and it isn't a nice solution. However, it's a
proof-of-concept and works for now so we can just keep it.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-07 15:07:47 +02:00
David Herrmann
47d6bb7417 tsm: screen: fix including final character in selection
We need to draw the final character of a selection with inversed
background, too. This is a bit tricky as the selection may be inversed
itself. Therefore, we just keep a flag that tells us whether the previous
character was selected and just draw the new character also selected.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-05 13:55:29 +02:00
David Herrmann
6ff8d809c5 tsm: screen: implement selection support
This implements UI selection for the console buffer. This selection is not
to be confused with PTY application selection provided by the
mouse-protocol via VT200 protocol.

Instead, this selection allows UIs to tell the TSM layer to select a
special part of the screen. Moreover, it allows selections to go into the
scrollback-buffer and to be bigger than a single screen. The UI can even
implement scrolling during selection to allow arbitrarily big selections.

There might still be some special cases where we need to fix selection.
However, it already works pretty well.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-05 13:28:13 +02:00
David Herrmann
1f11f8c961 tsm: screen: introduce scrollback-buffer line IDs
If we have pointers somewhere into the scrollback-buffer, there is not
easy way to see which of two lines comes first. Therefore, we introduce
scrollback buffer IDs. These are unique and every line gets one assigned
when it is linked into the sb-buffer. These IDs guarantee that front lines
have lower IDs than bottom lines.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-05 13:24:58 +02:00
David Herrmann
e2f614ab1a tsm: screen: remove unused get_from_scrollback()
This function is not used and I do not intend to use it anywhere soon.
Therefore, remove it so it doesn't generate sparse warnings.

The only reason why I kept is was that we might want to retrieve these
when increasing window size. However, this will not be implemented in the
near future as we need to keep a buffer-fill state for it.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-05 13:22:43 +02:00
David Herrmann
79692f655a tsm: screen: fix out-of-bounds access when drawing sb
When drawing scroll-back buffer, we cannot guarantee that the lines are as
long as the current screen. Therefore, check that we aren't accessing out
of bounds and draw empty glyphs instead.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-01 12:46:09 +02:00
David Herrmann
bf319380ef tsm: screen: fix moving cursor when scrolling during resize
If we scroll the screen during resize to keep the screen-content constant,
we should also move the cursor position. Otherwise, the application has an
inconsistent state.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-30 23:38:30 +02:00
David Herrmann
5347c62688 tsm: screen: fix buffer-overflow when resizing and scrolling
We call screen_scroll_up() under special conditions when resizing. We
require it to allocate the lines with the new width even though we didn't
set it yet. Therefore, we need to set the width before calling it and then
adjust the height.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-30 21:59:45 +02:00
David Herrmann
32faedbfb4 Fix printf() specified bugs all over the code
When enabling the printf() logic for the logging subsystem, several
warnings were produced about missing or wrong specifiers. This fixes all
those occurrences.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-30 18:01:35 +02:00
David Herrmann
2c328b2300 tsm: screen: fix cleaning buffers on resize
There is some nasty bug where we do not correctly clean buffers when
resizing. So we now clear the whole offscreen region on resize to go sure
everything is clean.

Note that cells can pretty much move everywhere during their
offscreen-life so this is a quite sophisticated task to keep track which
cells are clean and which not. Therefore, simply clean all of them when
taking them on-screen.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-27 12:26:30 +02:00
David Herrmann
0cf2f8efbd tsm: screen: switch to llog
We already have an llog context so use it instead of relying on kmscon-log
subsystem. TSM-screen is now fully independent. Next step is TSM-vte.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 16:04:03 +02:00
David Herrmann
3e71989955 tsm: screen: introduce TSM_SCREEN_OPT_RENDER_TIMING
Instead of accessing kmscon state from TSM, we now introduce options to
control the behavior of TSM-screens. Apart from logging, TSM is now
independent of any kmscon state/code.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 15:58:54 +02:00
David Herrmann
0ee83010ff tsm: screen: add screen-options helpers
Allow setting global options for screen objects. These are different from
flags as the latter affects the state-machine but options affect global
operation modes.

Options should be set by the application while flags are set by the VTE
handler. The latter might change often, while options should be set on
startup and then remain mainly constant.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 15:54:31 +02:00
David Herrmann
e638e6f039 tsm: add tsm_log_t llog-compatible log object
We need to avoid logging to stderr directly in TSM so introduce the
tsm_log_t object similar to eloop.h.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 15:01:45 +02:00
David Herrmann
613e7e7000 tsm: screen: move filenames to tsm_screen.[ch]
All TSM files use the "tsm_*" prefix and the object is now named "screen"
so rename the files to resemble this.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 14:53:46 +02:00