ATTR_GFX was used long time ago to detect when terminal was in
graphic mode. Today graphic mode is implemented using a charset
pointer, so ATTR_GFX is not needed anymore because graphic
condition can be detected directly checking if current charset
is GRAPHICS C0.
The patch 53105cf modified how control codes were detected, because
it tried to handle also C1 control codes (0x80-0x9f), that have
upper bit to 1, so they are multi byte character in utf8.
Code was checking the value of width in order to known that after
decoding the unicode point had a width of 1 byte, but it as incorrect
because this width is the columnb width.
Once a sequence is completed term.esc must return to 0, so
instead of repeating this expression in all the cases is
better put it at the end of the block.
*The VT510 ignores all following characters until it receives a
SUB, ST, or any other C1 control character.
So OSC, PM and APC sequence ends with a SUB (it cancels the sequence
and show a question mark as error), ST or any another C1 (8 bits)
code, or their C0 (7 bits) equivalent sequences (at this moment we
do not handle C1 codes, but we should). But it is also said that:
Cancel CAN
1/8 Immediately cancels an escape sequence, control sequence,
or device control string in progress. In this case, the
VT510 does not display any error character.
Escape ESC
1/11 Introduces an escape sequence. ESC also cancels any escape
sequence, control sequence, or device control string in
progress.
Do not eat ESC character if control string is not properly terminated.
Currently tputc handles the case of too long control string waiting for
the end of control string.
Another case is when there is ESC character is encountered but is not
followed by '\\'. In this case st stops processing control string,
but ESC character is ignored.
After this patch st processes ESC characters in control strings properly.
Test case:
printf '\e]0;abc\e[1mBOLD\e[0m'
Also ^[\ is actually processed in the code that handles ST.
According to ECMA-048 ST stands for STRING TERMINATOR and is used to
close control strings.
Christoph Lohmann [Fri, 25 Apr 2014 20:34:24 +0000 (22:34 +0200)]
Conformity in the -g geometry handling.
Thanks to Yuri Karaban for suggesting this!
These changes make -g correspond to <cols>x<rows> and honor it so non-tiling
window managers can work with the size hints afterwards. It also adds a -i
flag to force the window size. This is needed so -g keeps being useful in dwm.
The large and repeated expression used in memmove to indirect
the line can be simplified using a pointer, that makes more
clear where begins and where ends the movement.
Simplify tdeletechar and tinsertblank and fix memory corruption.
Current CSI parsing code uses strtol to parse arguments and allows them
to be negative. Negative argument is not properly handled in tdeletechar
and tinsertblank and results in memory corruption in memmove.
Reproduce with printf '\e[-500@'
Patch also removes special handling for corner case and simplifies
the code.
Removed
term.dirty[term.c.y] = 1
because tclearregion sets dirty flag.
tclearregion also marks cleared lines as dirty.
In tscrolldown it sets lines from term.bot-n+1 to term.bot dirty, and in
tscrollup it sets lines from orig to orig+n-1 dirty.
In both functions all lines from orig to term.bot are effectively set
dirty, but in tscrolldown lines from orig+n to term.bot are set dirty
twice, and in tscrollup lines from orig to term.bot-n are set dirty
twice.
These patches make it clear which lines are set dirty and sets them
dirty once in each funciton.
Fix techo handling of control and multibyte characters.
techo compares signed char to '\x20'. Any character with code less then
'\x20' is treated as control character. This way characters with MSB
set to 1 are considered control characters too.
Also this patch makes techo display DEL character as ^?.
To reprocuce the bug, enable echo mode using printf '\e[12l',
then type DEL character or any non-ASCII character.
Markus Teich [Sun, 20 Apr 2014 11:15:40 +0000 (13:15 +0200)]
remove confusing SERRNO macro
I found the SERRNO Macro slightly confusing, since you have to look
it up, if you don't know it already. A web search showed it does
not seem to be any kind of standard. Also there was no reason in
the commit log when it was introduced in 2009. As you can see it
also leads to new patches, which don't use this macro (probably the
author did not know about it).
Backspace key must generate the backspace character (\010) and
Delete key must generate the delete character (\0177). In
some systems the kernel configuration for erasing previous character
is \0177, so some programs (for example cat, ed, mail, ...), can not
understand the correct meaning of backspace. In this cases it is only
needed this command:
Damian Okrasa [Tue, 25 Mar 2014 19:20:26 +0000 (20:20 +0100)]
new utf decoder
This patch replaces current utf decoder with a new one, which is ~50
lines shorter and should be easier to understand. Parsing 5 and 6
sequences, if necessary, requires trivial modification of UTF_SIZ
constant and utfbyte, utfmask, utfmin, utfmax arrays.
Roberto E. Vargas Caballero [Fri, 31 Jan 2014 20:53:53 +0000 (21:53 +0100)]
Add MC for a single line
This sequence print the current line. It is different to the
'printer on' sequence, where all the characters that arrive to the
terminal are printer. Here only the ascii characters are printed.
Christoph Lohmann [Mon, 3 Feb 2014 19:54:25 +0000 (20:54 +0100)]
Removing the w3img support.
The patch to add w3img support destroys our way to handle fps and so stop
wasting resources on fast scrolling. Due to w3img being a hack to display
images in an ugly way, is there no need to support this. Use some real way to
display images.
Amadeusz Sławiński [Sat, 11 Jan 2014 11:54:36 +0000 (12:54 +0100)]
Make w3mimgdisplay work with st
Before this patch draw() calls drawregion which calls xdraws and then
updates whole window in one call thus overdrawing anything drawn by
w3mimgdisplay. After moving XCopyArea to xdraws it only updates the
regions which are being updated by XftDraw* functions. It may do a few
more calls to XCopyArea with this patch.
Eon S. Jeon [Tue, 17 Dec 2013 20:14:19 +0000 (15:14 -0500)]
query pixel size from matched font
Sorry for another duplicated mail. I found the patch is malformed
significantly. I've been away from my laptop for a while, so I'm quite
unfamiliar with the settings on this system...
Roberto E. Vargas Caballero [Wed, 18 Dec 2013 07:29:28 +0000 (08:29 +0100)]
Update arg.h from sbase
sbase did some interesting modifications to arg.h (basically it
was fixed an incorrect use of the _ namespace), and this commit
take this last version for st.
Eon S. Jeon [Tue, 17 Dec 2013 17:45:38 +0000 (12:45 -0500)]
Prevent resizing stdin
This fixes a bug that the parent tty gets resized whenever you launch
st through command line.
The problem was that ioctl was resizing cmdfd before it gets
initialized in ttynew. Since cmdfd is a global variable, its initial
value is 0, and consequently stdin was being resized.
Eric Pruitt [Fri, 6 Dec 2013 15:22:37 +0000 (09:22 -0600)]
Fix rmul definition
rmul means "exit underline mode", so a full reset of all
the attributes is not the correct way of exiting from
underline mode, because it is going to modify also another
attributes not related.
René Rietz [Mon, 25 Nov 2013 15:06:22 +0000 (16:06 +0100)]
Add stdint include
Since st is using now int32_t and uint32_t the inclusion of
stdint or inttype is mandatory, because in other case the
definition of these new types will not be known by the
compiler.
Roberto E. Vargas Caballero [Tue, 1 Oct 2013 19:23:11 +0000 (21:23 +0200)]
Add support for multiple charset definitions
vt100 has support for two defined charset, G0 and G1. Each charset
can be defined, but in each moment is selected only one of both
charset. This is usually used selecting a national charset in G0
and graphic charset in G1, so you can switch between graphic
charset and text charset without losing the national charset
already defined.
st hasn't support for national charsets, because it is an utf8
based terminal emulator, but it has support for graphic
charset because it is heavily used, but it only supports G0,
without understanding G1 selection sequences, which causes some
programs in some moments can print some garbage in the screen.
This patch adds a fake support for multiple charset definitions,
where we only support graphic charset and us-ascii charset, but
we allow more of one charset definition.
This patch allow define G0 until G3 charsets, but only accepts
select G0 or G1, and it accepts some national charset definitions
but all of them are mapped to us-ascii.