home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume9
/
xterm
/
part07
/
util.c
< prev
Wrap
C/C++ Source or Header
|
1987-04-21
|
25KB
|
893 lines
/*
* $Source: /u1/X/xterm/RCS/util.c,v $
* $Header: util.c,v 10.100 86/12/01 14:45:43 jg Rel $
*/
#include <X/mit-copyright.h>
/* Copyright Massachusetts Institute of Technology 1984, 1985 */
/* util.c */
#ifndef lint
static char sccs_id[] = "@(#)util.c\tX10/6.6B\t12/26/86";
#endif lint
#include <stdio.h>
#include <X/Xlib.h>
#include <signal.h>
#include <setjmp.h>
typedef int *jmp_ptr;
#include "scrollbar.h"
#include "ptyx.h"
#include "data.h"
#include "error.h"
/*
* These routines are used for the jump scroll feature
*/
FlushScroll(screen)
register Screen *screen;
{
register int i;
register int shift = -screen->topline;
register int bot = screen->max_row - shift;
register int refreshtop;
register int refreshheight;
register int scrolltop;
register int scrollheight;
if(screen->cursor_state)
HideCursor();
if(screen->scroll_amt > 0) {
refreshheight = screen->refresh_amt;
scrollheight = screen->bot_marg - screen->top_marg -
refreshheight + 1;
if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
(i = screen->max_row - screen->scroll_amt + 1))
refreshtop = i;
if(screen->sb && GetSaveState(screen->sb) &&
screen->top_marg == 0) {
scrolltop = 0;
if((scrollheight += shift) > i)
scrollheight = i;
if((i = screen->bot_marg - bot) > 0 &&
(refreshheight -= i) < screen->scroll_amt)
refreshheight = screen->scroll_amt;
if((i = -GetScrollBarTop(screen->sb)) <
screen->savelines) {
if((i += screen->scroll_amt) >
screen->savelines)
i = screen->savelines;
SetScrollBarTop(screen->sb, -i);
DrawScrollRegion(screen->sb);
}
} else {
scrolltop = screen->top_marg + shift;
if((i = bot - (screen->bot_marg - screen->refresh_amt +
screen->scroll_amt)) > 0) {
if(bot < screen->bot_marg)
refreshheight = screen->scroll_amt + i;
} else {
scrollheight += i;
refreshheight = screen->scroll_amt;
if((i = screen->top_marg + screen->scroll_amt -
1 - bot) > 0) {
refreshtop += i;
refreshheight -= i;
}
}
}
} else {
refreshheight = -screen->refresh_amt;
scrollheight = screen->bot_marg - screen->top_marg -
refreshheight + 1;
refreshtop = screen->top_marg + shift;
scrolltop = refreshtop + refreshheight;
if((i = screen->bot_marg - bot) > 0)
scrollheight -= i;
if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
refreshheight -= i;
}
if(scrollheight > 0) {
if (screen->multiscroll && scrollheight == 1 &&
screen->topline == 0 && screen->top_marg == 0 &&
screen->bot_marg == screen->max_row) {
if (screen->incopy < 0 && screen->scrolls == 0)
CopyWait (screen);
screen->scrolls++;
} else {
if (screen->incopy)
CopyWait (screen);
screen->incopy = -1;
}
XMoveArea (VWindow(screen), screen->border, (scrolltop +
screen->scroll_amt) * FontHeight(screen) + screen->border +
Titlebar(screen), screen->border, scrolltop * FontHeight(screen)
+ screen->border + Titlebar(screen), Width(screen),
scrollheight * FontHeight(screen));
}
screen->scroll_amt = 0;
screen->refresh_amt = 0;
if(refreshheight > 0) {
XTileSet (VWindow(screen), screen->border, refreshtop *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), refreshheight * FontHeight(screen),
screen->bgndtile);
ScrnRefresh(screen, refreshtop, 0, refreshheight,
screen->max_col + 1);
}
}
AddToRefresh(screen)
register Screen *screen;
{
register int amount = screen->refresh_amt;
register int row = screen->cur_row;
if(amount == 0 || screen->instatus)
return(0);
if(amount > 0) {
register int bottom;
if(row == (bottom = screen->bot_marg) - amount) {
screen->refresh_amt++;
return(1);
}
return(row >= bottom - amount + 1 && row <= bottom);
} else {
register int top;
amount = -amount;
if(row == (top = screen->top_marg) + amount) {
screen->refresh_amt--;
return(1);
}
return(row <= top + amount - 1 && row >= top);
}
}
/*
* scrolls the screen by amount lines, erases bottom, doesn't alter
* cursor position (i.e. cursor moves down amount relative to text).
* All done within the scrolling region, of course.
* requires: amount > 0
*/
Scroll (screen, amount)
register Screen *screen;
register int amount;
{
register int i = screen->bot_marg - screen->top_marg + 1;
register int shift;
register int bot;
register int refreshtop;
register int refreshheight;
register int scrolltop;
register int scrollheight;
if(screen->cursor_state)
HideCursor();
if (amount > i)
amount = i;
if(screen->jumpscroll) {
if(screen->scroll_amt > 0) {
if(screen->refresh_amt + amount > i)
FlushScroll(screen);
screen->scroll_amt += amount;
screen->refresh_amt += amount;
} else {
if(screen->scroll_amt < 0)
FlushScroll(screen);
screen->scroll_amt = amount;
screen->refresh_amt = amount;
}
refreshheight = 0;
} else {
if (amount == i) {
ClearScreen(screen);
return;
}
shift = -screen->topline;
bot = screen->max_row - shift;
scrollheight = i - amount;
refreshheight = amount;
if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
(i = screen->max_row - refreshheight + 1))
refreshtop = i;
if(screen->sb && GetSaveState(screen->sb) && screen->top_marg == 0) {
scrolltop = 0;
if((scrollheight += shift) > i)
scrollheight = i;
if((i = -GetScrollBarTop(screen->sb)) < screen->savelines) {
if((i += amount) > screen->savelines)
i = screen->savelines;
SetScrollBarTop(screen->sb, -i);
DrawScrollRegion(screen->sb);
}
} else {
scrolltop = screen->top_marg + shift;
if((i = screen->bot_marg - bot) > 0) {
scrollheight -= i;
if((i = screen->top_marg + amount - 1 - bot) >= 0) {
refreshtop += i;
refreshheight -= i;
}
}
}
if(scrollheight > 0) {
if (screen->multiscroll
&& amount==1 && screen->topline == 0
&& screen->top_marg==0
&& screen->bot_marg==screen->max_row) {
if (screen->incopy<0 && screen->scrolls==0)
CopyWait(screen);
screen->scrolls++;
} else {
if (screen->incopy)
CopyWait(screen);
screen->incopy = -1;
}
XMoveArea(VWindow(screen), screen->border, (scrolltop+amount) *
FontHeight(screen) + screen->border + Titlebar(screen),
screen->border, scrolltop * FontHeight(screen) + screen->border
+ Titlebar(screen), Width(screen), scrollheight *
FontHeight(screen));
}
if(refreshheight > 0) {
XTileSet (VWindow(screen), screen->border, refreshtop *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), refreshheight * FontHeight(screen),
screen->bgndtile);
if(refreshheight > shift)
refreshheight = shift;
}
}
if(screen->sb && GetSaveState(screen->sb) && screen->top_marg == 0)
ScrnDeleteLine(screen->allbuf, screen->bot_marg +
screen->savelines, 0, amount, screen->max_col + 1);
else
ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
amount, screen->max_col + 1);
if(refreshheight > 0)
ScrnRefresh(screen, refreshtop, 0, refreshheight,
screen->max_col + 1);
}
/*
* Reverse scrolls the screen by amount lines, erases top, doesn't alter
* cursor position (i.e. cursor moves up amount relative to text).
* All done within the scrolling region, of course.
* Requires: amount > 0
*/
RevScroll(screen, amount)
register Screen *screen;
register int amount;
{
register int i = screen->bot_marg - screen->top_marg + 1;
register int shift;
register int bot;
register int refreshtop;
register int refreshheight;
register int scrolltop;
register int scrollheight;
if(screen->cursor_state)
HideCursor();
if (amount > i)
amount = i;
if(screen->jumpscroll) {
if(screen->scroll_amt < 0) {
if(-screen->refresh_amt + amount > i)
FlushScroll(screen);
screen->scroll_amt -= amount;
screen->refresh_amt -= amount;
} else {
if(screen->scroll_amt > 0)
FlushScroll(screen);
screen->scroll_amt = -amount;
screen->refresh_amt = -amount;
}
} else {
shift = -screen->topline;
bot = screen->max_row - shift;
refreshheight = amount;
scrollheight = screen->bot_marg - screen->top_marg -
refreshheight + 1;
refreshtop = screen->top_marg + shift;
scrolltop = refreshtop + refreshheight;
if((i = screen->bot_marg - bot) > 0)
scrollheight -= i;
if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
refreshheight -= i;
if(scrollheight > 0) {
if (screen->multiscroll
&& amount==1 && screen->topline == 0
&& screen->top_marg==0
&& screen->bot_marg==screen->max_row) {
if (screen->incopy<0 && screen->scrolls==0)
CopyWait(screen);
screen->scrolls++;
} else {
if (screen->incopy)
CopyWait(screen);
screen->incopy = -1;
}
XMoveArea (VWindow(screen), screen->border, (scrolltop-amount) *
FontHeight(screen) + screen->border + Titlebar(screen),
screen->border, scrolltop * FontHeight(screen) + screen->border
+ Titlebar(screen), Width(screen), scrollheight *
FontHeight(screen));
}
if(refreshheight > 0)
XTileSet (VWindow(screen), screen->border, refreshtop *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), refreshheight * FontHeight(screen),
screen->bgndtile);
}
ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
amount, screen->max_col + 1);
}
/*
* If cursor not in scrolling region, returns. Else,
* inserts n blank lines at the cursor's position. Lines above the
* bottom margin are lost.
*/
InsertLine (screen, n)
register Screen *screen;
register int n;
{
register int i;
register int shift;
register int bot;
register int refreshtop;
register int refreshheight;
register int scrolltop;
register int scrollheight;
if (screen->cur_row < screen->top_marg ||
screen->cur_row > screen->bot_marg)
return;
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if (n > (i = screen->bot_marg - screen->cur_row + 1))
n = i;
if(screen->jumpscroll) {
if(screen->scroll_amt <= 0 &&
screen->cur_row <= -screen->refresh_amt) {
if(-screen->refresh_amt + n > screen->max_row + 1)
FlushScroll(screen);
screen->scroll_amt -= n;
screen->refresh_amt -= n;
} else if(screen->scroll_amt)
FlushScroll(screen);
}
if(!screen->scroll_amt) {
shift = -screen->topline;
bot = screen->max_row - shift;
refreshheight = n;
scrollheight = screen->bot_marg - screen->cur_row - refreshheight + 1;
refreshtop = screen->cur_row + shift;
scrolltop = refreshtop + refreshheight;
if((i = screen->bot_marg - bot) > 0)
scrollheight -= i;
if((i = screen->cur_row + refreshheight - 1 - bot) > 0)
refreshheight -= i;
if(scrollheight > 0) {
if (screen->incopy)
CopyWait (screen);
screen->incopy = -1;
XMoveArea (VWindow(screen), screen->border, (scrolltop - n) *
FontHeight(screen) + screen->border + Titlebar(screen),
screen->border, scrolltop * FontHeight(screen) + screen->border
+ Titlebar(screen), Width(screen), scrollheight *
FontHeight(screen));
}
if(refreshheight > 0)
XTileSet (VWindow(screen),
screen->border, refreshtop * FontHeight(screen) + screen->border
+ Titlebar(screen), Width(screen), refreshheight *
FontHeight(screen), screen->bgndtile);
}
/* adjust screen->buf */
ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n,
screen->max_col + 1);
}
/*
* If cursor not in scrolling region, returns. Else, deletes n lines
* at the cursor's position, lines added at bottom margin are blank.
*/
DeleteLine(screen, n)
register Screen *screen;
register int n;
{
register int i;
register int shift;
register int bot;
register int refreshtop;
register int refreshheight;
register int scrolltop;
register int scrollheight;
if (screen->cur_row < screen->top_marg ||
screen->cur_row > screen->bot_marg)
return;
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if (n > (i = screen->bot_marg - screen->cur_row + 1))
n = i;
if(screen->jumpscroll) {
if(screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) {
if(screen->refresh_amt + n > screen->max_row + 1)
FlushScroll(screen);
screen->scroll_amt += n;
screen->refresh_amt += n;
} else if(screen->scroll_amt)
FlushScroll(screen);
}
if(!screen->scroll_amt) {
shift = -screen->topline;
bot = screen->max_row - shift;
scrollheight = i - n;
refreshheight = n;
if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
(i = screen->max_row - refreshheight + 1))
refreshtop = i;
if(screen->sb && GetSaveState(screen->sb) && screen->cur_row == 0) {
scrolltop = 0;
if((scrollheight += shift) > i)
scrollheight = i;
if((i = -GetScrollBarTop(screen->sb)) < screen->savelines) {
if((i += n) > screen->savelines)
i = screen->savelines;
SetScrollBarTop(screen->sb, -i);
DrawScrollRegion(screen->sb);
}
} else {
scrolltop = screen->cur_row + shift;
if((i = screen->bot_marg - bot) > 0) {
scrollheight -= i;
if((i = screen->cur_row + n - 1 - bot) >= 0) {
refreshheight -= i;
}
}
}
if(scrollheight > 0) {
if (screen->incopy)
CopyWait(screen);
screen->incopy = -1;
XMoveArea (VWindow(screen), screen->border, (scrolltop + n) *
FontHeight(screen) + screen->border + Titlebar(screen),
screen->border, scrolltop * FontHeight(screen) + screen->border
+ Titlebar(screen), Width(screen), scrollheight *
FontHeight(screen));
}
if(refreshheight > 0)
XTileSet (VWindow(screen), screen->border, refreshtop *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), refreshheight * FontHeight(screen),
screen->bgndtile);
}
/* adjust screen->buf */
if(screen->sb && GetSaveState(screen->sb) && screen->cur_row == 0)
ScrnDeleteLine(screen->allbuf, screen->bot_marg +
screen->savelines, 0, n, screen->max_col + 1);
else
ScrnDeleteLine(screen->buf, screen->bot_marg, screen->cur_row,
n, screen->max_col + 1);
}
/*
* Insert n blanks at the cursor's position, no wraparound
*/
InsertChar (screen, n)
register Screen *screen;
register int n;
{
register int width = n * FontWidth(screen), cx, cy;
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if(screen->cur_row - screen->topline <= screen->max_row ||
screen->instatus) {
if(!AddToRefresh(screen)) {
if(screen->scroll_amt)
FlushScroll(screen);
if (screen->incopy)
CopyWait (screen);
screen->incopy = -1;
cx = CursorX (screen, screen->cur_col);
cy = CursorY (screen, screen->cur_row);
XMoveArea(VWindow(screen), cx, cy, cx + width, cy,
Width(screen) - (screen->cur_col + n) * FontWidth(screen),
FontHeight(screen));
XPixSet(VWindow(screen), cx, cy,
width, FontHeight(screen), screen->instatus ?
screen->foreground : screen->background);
}
}
/* adjust screen->buf */
ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n,
screen->max_col + 1);
}
/*
* Deletes n chars at the cursor's position, no wraparound.
*/
DeleteChar (screen, n)
register Screen *screen;
register int n;
{
register int width, cx, cy;
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if (n > (width = screen->max_col + 1 - screen->cur_col))
n = width;
if(screen->cur_row - screen->topline <= screen->max_row ||
screen->instatus) {
if(!AddToRefresh(screen)) {
if(screen->scroll_amt)
FlushScroll(screen);
width = n * FontWidth(screen);
if (screen->incopy)
CopyWait (screen);
screen->incopy = -1;
cx = CursorX (screen, screen->cur_col);
cy = CursorY (screen, screen->cur_row);
XMoveArea(VWindow(screen), cx + width, cy, cx, cy,
Width(screen) - (screen->cur_col + n) * FontWidth(screen),
FontHeight(screen));
XPixSet (VWindow(screen),
screen->border + Width(screen) - width, cy,
width, FontHeight(screen), screen->instatus ?
screen->foreground : screen->background);
}
}
/* adjust screen->buf */
ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n,
screen->max_col + 1);
}
/*
* Clear from cursor position to beginning of display, inclusive.
*/
ClearAbove (screen)
register Screen *screen;
{
register top, height;
if(screen->cursor_state)
HideCursor();
if((top = -screen->topline) <= screen->max_row) {
if(screen->scroll_amt)
FlushScroll(screen);
if((height = screen->cur_row + top) > screen->max_row)
height = screen->max_row;
if((height -= top) > 0)
XTileSet(VWindow(screen), screen->border, top *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), height * FontHeight(screen),
screen->bgndtile);
if(screen->cur_row - screen->topline <= screen->max_row)
ClearLeft(screen);
}
ClearBufRows(screen, 0, screen->cur_row - 1);
}
/*
* Clear from cursor position to end of display, inclusive.
*/
ClearBelow (screen)
register Screen *screen;
{
register top;
ClearRight(screen);
if((top = screen->cur_row - screen->topline) <= screen->max_row) {
if(screen->scroll_amt)
FlushScroll(screen);
if(++top <= screen->max_row)
XTileSet(VWindow(screen), screen->border, top *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), (screen->max_row - top + 1) *
FontHeight(screen), screen->bgndtile);
}
ClearBufRows(screen, screen->cur_row + 1, screen->max_row);
}
/*
* Clear last part of cursor's line, inclusive.
*/
ClearRight (screen)
register Screen *screen;
{
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if(screen->cur_row - screen->topline <= screen->max_row ||
screen->instatus) {
if(!AddToRefresh(screen)) {
if(screen->scroll_amt)
FlushScroll(screen);
XPixSet(VWindow(screen),
CursorX(screen, screen->cur_col),
CursorY(screen, screen->cur_row),
Width(screen) - screen->cur_col * FontWidth(screen),
FontHeight(screen), screen->instatus ? screen->foreground :
screen->background);
}
}
bzero(screen->buf [2 * screen->cur_row] + screen->cur_col,
(screen->max_col - screen->cur_col + 1));
bzero(screen->buf [2 * screen->cur_row + 1] + screen->cur_col,
(screen->max_col - screen->cur_col + 1));
}
/*
* Clear first part of cursor's line, inclusive.
*/
ClearLeft (screen)
register Screen *screen;
{
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if(screen->cur_row - screen->topline <= screen->max_row ||
screen->instatus) {
if(!AddToRefresh(screen)) {
if(screen->scroll_amt)
FlushScroll(screen);
XPixSet (VWindow(screen),
screen->border, CursorY (screen, screen->cur_row),
(screen->cur_col + 1) * FontWidth(screen),
FontHeight(screen), screen->instatus ? screen->foreground :
screen->background);
}
}
bzero (screen->buf [2 * screen->cur_row], (screen->cur_col + 1));
bzero (screen->buf [2 * screen->cur_row + 1], (screen->cur_col + 1));
}
/*
* Erase the cursor's line.
*/
ClearLine(screen)
register Screen *screen;
{
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if(screen->cur_row - screen->topline <= screen->max_row ||
screen->instatus) {
if(!AddToRefresh(screen)) {
if(screen->scroll_amt)
FlushScroll(screen);
XPixSet (VWindow(screen),
screen->border, CursorY (screen, screen->cur_row),
Width(screen), FontHeight(screen), screen->instatus ?
screen->foreground : screen->background);
}
}
bzero (screen->buf [2 * screen->cur_row], (screen->max_col + 1));
bzero (screen->buf [2 * screen->cur_row + 1], (screen->max_col + 1));
}
ClearScreen(screen)
register Screen *screen;
{
register int top;
if(screen->cursor_state)
HideCursor();
screen->do_wrap = 0;
if((top = -screen->topline) <= screen->max_row) {
if(screen->scroll_amt)
FlushScroll(screen);
if(top == 0 && !screen->statusline)
XClear(VWindow(screen));
else
XTileSet(VWindow(screen), screen->border, top *
FontHeight(screen) + screen->border + Titlebar(screen),
Width(screen), (screen->max_row - top + 1) *
FontHeight(screen), screen->bgndtile);
}
ClearBufRows (screen, 0, screen->max_row);
screen->pagecnt = 0;
}
CopyWait(screen)
register Screen *screen;
{
XEvent reply;
XEvent *rep = &reply;
while (1) {
XWindowEvent (VWindow(screen), ExposeRegion|ExposeCopy, &reply);
switch (reply.type) {
case ExposeRegion:
if (((XExposeEvent *)rep)->detail == ExposeCopy &&
screen->incopy <= 0) {
screen->incopy = 1;
if (screen->scrolls > 0)
screen->scrolls--;
}
HandleExposure (screen, &reply);
break;
case ExposeCopy:
if (screen->incopy <= 0 && screen->scrolls > 0)
screen->scrolls--;
if (screen->scrolls == 0) {
screen->incopy = 0;
return;
}
screen->incopy = -1;
break;
}
}
}
/*
* This routine handles exposure events
*/
HandleExposure (screen, reply)
register Screen *screen;
register XExposeEvent *reply;
{
register int toprow, leftcol, nrows, ncols;
extern Terminal term; /* kludge */
XExposeRegionEvent event;
if((toprow = (reply->y - screen->border - Titlebar(screen)) /
FontHeight(screen)) < 0)
toprow = 0;
if((leftcol = (reply->x - screen->border) / FontWidth(screen)) < 0)
leftcol = 0;
nrows = (reply->y + reply->height - 1 - screen->border
- Titlebar(screen)) / FontHeight(screen) - toprow + 1;
ncols = (reply->x + reply->width - 1 - screen->border) /
FontWidth(screen) - leftcol + 1;
toprow -= screen->scrolls;
if (toprow < 0) {
nrows += toprow;
toprow = 0;
}
if (toprow + nrows - 1 > screen->max_row)
nrows = screen->max_row - toprow + 1 + screen->statusline;
if (leftcol + ncols - 1 > screen->max_col)
ncols = screen->max_col - leftcol + 1;
if (nrows > 0 && ncols > 0) {
ScrnRefresh (screen, toprow, leftcol, nrows, ncols);
if (screen->cur_row >= toprow &&
screen->cur_row < toprow + nrows &&
screen->cur_col >= leftcol &&
screen->cur_col < leftcol + ncols)
return (1);
}
return (0);
}
ReverseVideo (term)
Terminal *term;
{
register Screen *screen = &term->screen;
register Pixmap pix;
register int tmp;
register Window tek = TWindow(screen);
extern Pixmap B_Pixmap;
extern Pixmap W_Pixmap;
if(screen->color & C_BACKGROUND)
XFreePixmap(screen->bgndtile);
tmp = screen->background;
if(screen->cursorcolor == screen->foreground)
screen->cursorcolor = tmp;
if(screen->mousecolor == screen->foreground)
screen->mousecolor = tmp;
screen->background = screen->foreground;
screen->foreground = tmp;
screen->color = (screen->color & ~C_FBMASK) | switchfb[screen->color
& C_FBMASK];
if(screen->color & C_BACKGROUND) {
if(!(screen->bgndtile = XMakeTile(screen->background)))
Error(ERROR_UBACK);
} else
screen->bgndtile = (screen->background == W_Pixel) ? W_Pixmap
: B_Pixmap;
XFreeCursor(screen->curs);
screen->curs = make_xterm(screen->mousecolor, screen->background,
GXcopy);
XFreeCursor(screen->arrow);
screen->arrow = make_arrow(screen->mousecolor, screen->background,
GXcopy);
XDefineCursor(VWindow(screen), screen->curs);
if(screen->sb)
XDefineCursor(screen->sb->bar, screen->sb->cursor =
screen->arrow);
if(screen->title.tbar)
XDefineCursor(screen->title.tbar, screen->arrow);
if(tek)
XDefineCursor(tek, screen->arrow);
#ifdef MODEMENU
MenuNewCursor(screen->arrow);
#endif MODEMENU
if (screen->background < 2 && screen->foreground < 2) {
if (screen->bgndtile == B_Pixmap)
screen->bordertile = W_Pixmap;
else if (screen->bgndtile == W_Pixmap)
screen->bordertile = B_Pixmap;
pix = screen->bordertile;
if(screen->sb)
XChangeBorder (screen->sb->bar, pix);
if(screen->title.tbar)
XChangeBorder (screen->title.tbar, pix);
if(tek && screen->Ttitle.tbar)
XChangeBorder (screen->Ttitle.tbar, pix);
if(screen->borderwidth > 0) {
XChangeBorder (VWindow(screen), pix);
XChangeBorder (screen->iconVwin.window, pix);
if(tek) {
XChangeBorder (tek, pix);
XChangeBorder (screen->iconTwin.window, pix);
}
}
}
XChangeBackground (VWindow(screen), screen->bgndtile);
XChangeBackground (screen->iconVwin.window, screen->bgndtile);
if(screen->title.tbar)
XChangeBackground (screen->title.tbar, screen->bgndtile);
if(tek) {
XChangeBackground (screen->iconTwin.window, screen->bgndtile);
if(screen->Ttitle.tbar)
XChangeBackground (screen->Ttitle.tbar, screen->bgndtile);
TekReverseVideo(screen);
}
XClear (VWindow(screen));
XClear (screen->iconVwin.window);
ScrnRefresh (screen, 0, 0, screen->max_row + 1 + screen->statusline,
screen->max_col + 1);
if(screen->Tshow) {
XClear (tek);
XClear (screen->iconTwin.window);
TekExpose((XExposeWindowEvent *)0);
}
if(Titlebar(screen)) {
XClear(screen->title.tbar);
VTTitleExpose(NULL);
if(screen->Tshow) {
XClear(screen->Ttitle.tbar);
TekTitleExpose(NULL);
}
}
}