Correctly initialize altscreen when defaultbg is not 0.

The alternate screen is not properly initialized when st starts. To see
this, set defaultbg in config.h to anything other than 0 (for example, swap
defaultfg and defaultbg), and run:

./st -e sh -c 'tput smcup; read'

You should see that the top-left 80x24 rectangle is black (or whatever
colorname[0] is), while the rest of the screen (if any) has the desired
colorname[defaultbg] color.

The attached patch fixes this by initializing term.c.attr in tnew() before
calling tresize(). It also removes the unnecessary xcalloc() calls, which
misled me on this bug hunt since it is really tclearregion() which
initializes term.lines and term.alt in tresize().
This commit is contained in:
Mark Edgar 2013-08-26 00:10:47 +02:00 committed by Roberto E. Vargas Caballero
parent f3d438b101
commit 4245ba0d12
2 changed files with 6 additions and 17 deletions

View File

@ -129,13 +129,13 @@ static Shortcut shortcuts[] = {
* * < 0: crlf mode is disabled * * < 0: crlf mode is disabled
* *
* Be careful with the order of the definitons because st searchs in * Be careful with the order of the definitons because st searchs in
* this table sequencially, so any XK_ANY_MOD must be in the last * this table sequentially, so any XK_ANY_MOD must be in the last
* position for a key. * position for a key.
*/ */
/* /*
* If you want something else but the function keys of X11 (0xFF00 - 0xFFFF) * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
* mapped below, add them to this array. * to be mapped below, add them to this array.
*/ */
static KeySym mappedkeys[] = { -1 }; static KeySym mappedkeys[] = { -1 };

17
st.c
View File

@ -420,7 +420,6 @@ static int isfullutf8(char *, int);
static ssize_t xwrite(int, char *, size_t); static ssize_t xwrite(int, char *, size_t);
static void *xmalloc(size_t); static void *xmalloc(size_t);
static void *xrealloc(void *, size_t); static void *xrealloc(void *, size_t);
static void *xcalloc(size_t, size_t);
static void (*handler[LASTEvent])(XEvent *) = { static void (*handler[LASTEvent])(XEvent *) = {
[KeyPress] = kpress, [KeyPress] = kpress,
@ -509,16 +508,6 @@ xrealloc(void *p, size_t len) {
return p; return p;
} }
void *
xcalloc(size_t nmemb, size_t size) {
void *p = calloc(nmemb, size);
if(!p)
die("Out of memory\n");
return p;
}
int int
utf8decode(char *s, long *u) { utf8decode(char *s, long *u) {
uchar c; uchar c;
@ -1370,7 +1359,7 @@ treset(void) {
void void
tnew(int col, int row) { tnew(int col, int row) {
memset(&term, 0, sizeof(Term)); term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } };
tresize(col, row); tresize(col, row);
term.numlock = 1; term.numlock = 1;
@ -2536,8 +2525,8 @@ tresize(int col, int row) {
/* allocate any new rows */ /* allocate any new rows */
for(/* i == minrow */; i < row; i++) { for(/* i == minrow */; i < row; i++) {
term.dirty[i] = 1; term.dirty[i] = 1;
term.line[i] = xcalloc(col, sizeof(Glyph)); term.line[i] = xmalloc(col * sizeof(Glyph));
term.alt [i] = xcalloc(col, sizeof(Glyph)); term.alt[i] = xmalloc(col * sizeof(Glyph));
} }
if(col > term.col) { if(col > term.col) {
bp = term.tabs + term.col; bp = term.tabs + term.col;