v12i098: kterm - kanji xterm, Part17/18

mleisher at NMSU.Edu mleisher at NMSU.Edu
Sat May 11 10:52:19 AEST 1991


Submitted-by: mleisher at NMSU.Edu
Posting-number: Volume 12, Issue 98
Archive-name: kterm/part17

#!/bin/sh
# this is kt412.17 (part 17 of kterm-4.1.2)
# do not concatenate these parts, unpack them in order with /bin/sh
# file kterm-4.1.2/screen.c continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 17; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
	echo 'x - still skipping kterm-4.1.2/screen.c'
else
echo 'x - continuing file kterm-4.1.2/screen.c'
sed 's/^X//' << 'SHAR_EOF' >> 'kterm-4.1.2/screen.c' &&
#endif /* STATUSLINE */
X			(hilite != 0) ^ ((flags & INVERSE) != 0),
X			flags & UNDERLINE,
X			False);
X	   n = 0;
#else /* !KTERM */
#ifdef STATUSLINE
X	   if (((!hilite && (flags & INVERSE) != 0) ||
X	        (hilite && (flags & INVERSE) == 0))
X		^ (dostatus < 0 && screen->reversestatus))
#else /* !STATUSLINE */
X	   if ( (!hilite && (flags & INVERSE) != 0) ||
X	        (hilite && (flags & INVERSE) == 0) )
#endif /* !STATUSLINE */
X	       if (flags & BOLD) gc = screen->reverseboldGC;
X	       else gc = screen->reverseGC;
X	   else 
X	       if (flags & BOLD) gc = screen->normalboldGC;
X	       else gc = screen->normalGC;
X	   XDrawImageString(screen->display, TextWindow(screen), gc, 
X	         x, y, (char *) &chars[lastind], n = col - lastind);
X	   if((flags & BOLD) && screen->enbolden)
X		XDrawString(screen->display, TextWindow(screen), gc,
X		x + 1, y, (char *) &chars[lastind], n);
X	   if(flags & UNDERLINE) 
X		XDrawLine(screen->display, TextWindow(screen), gc, 
X		 x, y+1, x + n * FontWidth(screen), y+1);
#endif /* !KTERM */
X	}
#ifdef STATUSLINE
X	if (dostatus <= 0)
X		break;
X	dostatus = -1;
X	topline = 0;
X	scrollamt = 0;
X	toprow = maxrow = max = screen->max_row + 1;
X	left = CursorX(screen, leftcol);
X	width = ncols * FontWidth(screen);
X	if (leftcol == 0) {
X		left--;
X		width++;
X	}
X	if (leftcol + ncols - 1 >= screen->max_col)
X		width++;
X	XFillRectangle(screen->display, TextWindow(screen),
X		screen->reversestatus ? screen->normalGC : screen->reverseGC,
#ifdef KTERM
X		left, y,
#else /* !KTERM */
X		left, y - screen->fnt_norm->max_bounds.ascent,
#endif /* !KTERM */
X		width, screen->statusheight);
X	if (!screen->reversestatus)
X		StatusBox(screen);
X	y++;
X    } /* end of for(;;) */
#endif /* STATUSLINE */
#ifdef KTERM
X	if (dbuf != drawbuf) XtFree(dbuf);
#endif /* KTERM */
}
X
ClearBufRows (screen, first, last)
/*
X   Sets the rows first though last of the buffer of screen to spaces.
X   Requires first <= last; first, last are rows of screen->buf.
X */
register TScreen *screen;
register int first, last;
{
#ifdef KTERM
X	while (first <= last)
X		bzero (screen->buf [first++], (screen->max_col + 1) * sizeof(Bchr));
#else /* !KTERM */
X	first *= 2;
X	last = 2 * last + 1;
X	while (first <= last)
X		bzero (screen->buf [first++], (screen->max_col + 1));
#endif /* !KTERM */
}
X
ScreenResize (screen, width, height, flags)
/*
X   Resizes screen:
X   1. If new window would have fractional characters, sets window size so as to
X      discard fractional characters and returns -1.
X      Minimum screen size is 1 X 1.
X      Note that this causes another ExposeWindow event.
X   2. Enlarges screen->buf if necessary.  New space is appended to the bottom
X      and to the right
X   3. Reduces  screen->buf if necessary.  Old space is removed from the bottom
X      and from the right
X   4. Cursor is positioned as closely to its former position as possible
X   5. Sets screen->max_row and screen->max_col to reflect new size
X   6. Maintains the inner border (and clears the border on the screen).
X   7. Clears origin mode and sets scrolling region to be entire screen.
X   8. Returns 0
X */
register TScreen *screen;
int width, height;
unsigned *flags;
{
X	int rows, cols;
X	int border = 2 * screen->border;
#ifdef sun
#ifdef TIOCSSIZE
X	struct ttysize ts;
#endif	/* TIOCSSIZE */
#else	/* sun */
#ifdef TIOCSWINSZ
X	struct winsize ws;
#endif	/* TIOCSWINSZ */
#endif	/* sun */
X	Window tw = TextWindow (screen);
#ifdef STATUSLINE
X	int oldmaxrow = screen->max_row;
#endif /* STATUSLINE */
X
X	/* clear the right and bottom internal border because of NorthWest
X	   gravity might have left junk on the right and bottom edges */
X	XClearArea (screen->display, tw,
X		    width - screen->border, 0,                /* right edge */
X		    screen->border, height,           /* from top to bottom */
X		    False);
X	XClearArea (screen->display, tw, 
X		    0, height - screen->border,	                  /* bottom */
X		    width, screen->border,         /* all across the bottom */
X		    False);
X
X	/* round so that it is unlikely the screen will change size on  */
X	/* small mouse movements.					*/
#ifdef STATUSLINE
X	rows = (height + FontHeight(screen) / 2 - border - screen->statusheight) /
#else /* !STATUSLINE */
X	rows = (height + FontHeight(screen) / 2 - border) /
#endif /* !STATUSLINE */
X	 FontHeight(screen);
X	cols = (width + FontWidth(screen) / 2 - border - screen->scrollbar) /
X	 FontWidth(screen);
X	if (rows < 1) rows = 1;
X	if (cols < 1) cols = 1;
X
X	/* change buffers if the screen has changed size */
X	if (screen->max_row != rows - 1 || screen->max_col != cols - 1) {
X		register int savelines = screen->scrollWidget ?
X		 screen->savelines : 0;
X		
X		if(screen->cursor_state)
X			HideCursor();
X		if (screen->altbuf) 
X			Reallocate(&screen->altbuf, (Char **)&screen->abuf_address,
X			 rows, cols, screen->max_row + 1, screen->max_col + 1);
X		Reallocate(&screen->allbuf, (Char **)&screen->sbuf_address,
X		 rows + savelines, cols,
X		 screen->max_row + 1 + savelines, screen->max_col + 1);
#ifdef KTERM
X		screen->buf = &screen->allbuf[savelines];
#else /* !KTERM */
X		screen->buf = &screen->allbuf[2 * savelines];
#endif /* !KTERM */
X		 
X		screen->max_row = rows - 1;
X		screen->max_col = cols - 1;
X	
X		/* adjust scrolling region */
X		screen->top_marg = 0;
X		screen->bot_marg = screen->max_row;
X		*flags &= ~ORIGIN;
X	
#ifdef STATUSLINE
X		if (screen->statusline) {
X		    if (oldmaxrow > rows - 1)
X			ScrnRefresh(screen, rows, 0, 1, cols, True);
X		    else if (oldmaxrow < rows - 1)
X			XClearArea (screen->display, tw, 
X			    0, (oldmaxrow+1) * FontHeight(screen) + screen->border,
X			    width, screen->statusheight,
X			    False);
X		}
X		if (screen->instatus)
X			screen->cur_row = screen->max_row + 1;
X		else
#endif /* STATUSLINE */
X		if (screen->cur_row > screen->max_row)
X			screen->cur_row = screen->max_row;
X		if (screen->cur_col > screen->max_col)
X			screen->cur_col = screen->max_col;
X	
X		screen->fullVwin.height = height - border;
#ifdef STATUSLINE
X		screen->fullVwin.height -= screen->statusheight;
#endif /* STATUSLINE */
X		screen->fullVwin.width = width - border - screen->scrollbar;
X
X	} else if(FullHeight(screen) == height && FullWidth(screen) == width)
X	 	return(0);	/* nothing has changed at all */
X
X	if(screen->scrollWidget)
X		ResizeScrollBar(screen->scrollWidget, -1, -1, height);
X	
X	screen->fullVwin.fullheight = height;
X	screen->fullVwin.fullwidth = width;
X	ResizeSelection (screen, rows, cols);
#ifdef sun
#ifdef TIOCSSIZE
X	/* Set tty's idea of window size */
X	ts.ts_lines = rows;
X	ts.ts_cols = cols;
X	ioctl (screen->respond, TIOCSSIZE, &ts);
#ifdef SIGWINCH
X	if(screen->pid > 1) {
X		int	pgrp;
X		
X		if (ioctl (screen->respond, TIOCGPGRP, &pgrp) != -1)
X			killpg(pgrp, SIGWINCH);
X	}
#endif	/* SIGWINCH */
#endif	/* TIOCSSIZE */
#else	/* sun */
#ifdef TIOCSWINSZ
X	/* Set tty's idea of window size */
X	ws.ws_row = rows;
X	ws.ws_col = cols;
X	ws.ws_xpixel = width;
X	ws.ws_ypixel = height;
X	ioctl (screen->respond, TIOCSWINSZ, (char *)&ws);
#ifdef notdef	/* change to SIGWINCH if this doesn't work for you */
X	if(screen->pid > 1) {
X		int	pgrp;
X		
X		if (ioctl (screen->respond, TIOCGPGRP, &pgrp) != -1)
X			killpg(pgrp, SIGWINCH);
X	}
#endif	/* SIGWINCH */
#endif	/* TIOCSWINSZ */
#endif	/* sun */
X	return (0);
}
X
#ifdef KTERM
static void
AdjustMbcsText(screen, fnum, text, length)
TScreen *screen;
int fnum;
XXChar2b *text;
int length;
{
X    int i;
X    int fntype = FontType(screen, fnum, 0);
X
X    if (fntype != LOW && fntype != HIGH)
X      return;
X    for (i = 0; i < length; i++) {
X        if (fntype == LOW) {
X            text[i].byte1 &= ~NEEDMAP;
X            text[i].byte2 &= ~NEEDMAP;
X        } else if (fntype == HIGH) {
X            text[i].byte1 |= NEEDMAP;
X            text[i].byte2 |= NEEDMAP;
X        }
X    }
}
#endif /* KTERM */
X
#ifdef KTERM
#ifdef	COLOR_TEXT	/* mukawa */
ScreenDraw(screen, x, y, dbuf, n, gset, color, bold, rev, under, cursor)
#else	/* COLOR_TEXT */
ScreenDraw(screen, x, y, dbuf, n, gset, bold, rev, under, cursor)
#endif	/* COLOR_TEXT */
register TScreen	*screen;
int	x, y; /* upper-left bound */
XXChar2b	*dbuf;
int	n;
Char	gset;
#ifdef	COLOR_TEXT	/* mukawa */
int	color;
#endif	/* COLOR_TEXT */
int	bold, rev, under, cursor; /* Boolean */
{
X	GC	gc, backgc;
X	int	fnum, cols;
X	Boolean	cursorstate;
X
X        fnum = FNUM(gset);
X	cols = gset & MBCS ? n * 2 : n;
X
X        /*
X         * This check is to make sure that mbcs text has the high bit
X         * cleared or set depending on which type of font is being used.
X         * This is to catch situations like switching between a JIS and
X         * EUC Kanji font, or vice versa.
X         */
X        if (gset & MBCS)
X          AdjustMbcsText(screen, fnum, dbuf, n);
X
X	cursorstate = cursor && (screen->select || screen->always_highlight);
X	if (rev) {
X		if (cursorstate && screen->reversecursorGC)
X			gc = screen->reversecursorGC;
X		else if (bold)
X			gc = screen->reverseboldGC;
X		else
X			gc = screen->reverseGC;
X		backgc = screen->normalGC;
X	} else {
X		if (cursorstate && screen->cursorGC)
X			gc = screen->cursorGC;
X		else if (bold)
X			gc = screen->normalboldGC;
X		else
X			gc = screen->normalGC;
X		backgc = screen->reverseGC;
X	}
X
#ifdef  COLOR_TEXT /* mukawa */
X	if(!cursorstate) {
X		if (color & COLOR_TEXT_MASK) {
X			extern XtermWidget term;
X			XGCValues       xgcv;
X			int             cn;
X
X			cn = ((color>>COLOR_TEXT_SHIFT)&COLOR_TEXT_MASK2) -
X                          COLOR_TEXT_ADJUST;
X                        cn = (cn < 0) ? 0 : cn;
X			if (rev) {
X				xgcv.background = screen->textcolor[cn];
X				XChangeGC(screen->display, gc, GCBackground,
X						&xgcv);
X			}
X			else {
X				xgcv.foreground = screen->textcolor[cn];
X				XChangeGC(screen->display, gc, GCForeground,
X						&xgcv);
X			}
X		}
X		else {
X			extern XtermWidget term;
X			XGCValues       xgcv;
X
X			if (rev) {
X				xgcv.background = screen->foreground;
X				XChangeGC(screen->display, gc, GCBackground,
X						&xgcv);
X			}
X			else {
X				xgcv.foreground = screen->foreground;
X				XChangeGC(screen->display, gc, GCForeground,
X						&xgcv);
X			}
X		}
X	}
#endif  /* COLOR_TEXT */
X
X	if (gset == GSET_GRAPH) {
X		XSegment	segbuf[256 * 2], *segp;
X		int		col, X, nsegs;
X		segp = (n > 256)
X			? (XSegment *)XtMalloc(2 * n * sizeof(XSegment))
X			: segbuf;
X		for (col = nsegs = 0, X = x; col < n;
X		     col ++, X += FontWidth(screen)) {
X			switch (dbuf[col].byte2) {
X			case 'j':
X			case 'k':
X			case 'u':
X				segp[nsegs].x1 = X;
X				segp[nsegs].y1 = y + FontHeight(screen) / 2;
X				segp[nsegs].x2 = X + FontWidth(screen) / 2;
X				segp[nsegs].y2 = y + FontHeight(screen) / 2;
X				nsegs ++;
X				break;
X			case 'l':
X			case 'm':
X			case 't':
X				segp[nsegs].x1 = X + FontWidth(screen) / 2;
X				segp[nsegs].y1 = y + FontHeight(screen) / 2;
X				segp[nsegs].x2 = X + FontWidth(screen);
X				segp[nsegs].y2 = y + FontHeight(screen) / 2;
X				nsegs ++;
X				break;
X			case 'n':
X			case 'q':
X			case 'v':
X			case 'w':
X				segp[nsegs].x1 = X;
X				segp[nsegs].y1 = y + FontHeight(screen) / 2;
X				segp[nsegs].x2 = X + FontWidth(screen);
X				segp[nsegs].y2 = y + FontHeight(screen) / 2;
X				nsegs ++;
X				break;
X			}
X			switch (dbuf[col].byte2) {
X			case 'j':
X			case 'm':
X			case 'v':
X				segp[nsegs].x1 = X + FontWidth(screen) / 2;
X				segp[nsegs].y1 = y;
X				segp[nsegs].x2 = X + FontWidth(screen) / 2;
X				segp[nsegs].y2 = y + FontHeight(screen) / 2;
X				nsegs ++;
X				break;
X			case 'k':
X			case 'l':
X			case 'w':
X				segp[nsegs].x1 = X + FontWidth(screen) / 2;
X				segp[nsegs].y1 = y + FontHeight(screen) / 2;
X				segp[nsegs].x2 = X + FontWidth(screen) / 2;
X				segp[nsegs].y2 = y + FontHeight(screen);
X				nsegs ++;
X				break;
X			case 'n':
X			case 't':
X			case 'u':
X			case 'x':
X				segp[nsegs].x1 = X + FontWidth(screen) / 2;
X				segp[nsegs].y1 = y;
X				segp[nsegs].x2 = X + FontWidth(screen) / 2;
X				segp[nsegs].y2 = y + FontHeight(screen);
X				nsegs ++;
X				break;
X			}
X		}
X		XFillRectangle(screen->display, TextWindow(screen),
X			backgc, x, y, n*FontWidth(screen), FontHeight(screen));
X		XDrawSegments(screen->display, TextWindow(screen),
X			gc, segp, nsegs);
X		if (segp != segbuf) XtFree(segp);
X	} else {
X		int	Y = y + screen->linespace / 2 + screen->max_ascent;
X
X		XDrawImageString16(screen->display, TextWindow(screen), 
X			gc, x, Y, dbuf, n);
X		if (bold && screen->enbolden)
X			XDrawString16(screen->display, TextWindow(screen), 
X				gc, x + 1, Y, dbuf, n);
X		if (under) 
X			XDrawLine(screen->display, TextWindow(screen), 
X				gc, x, Y+1, x+cols*FontWidth(screen), Y+1);
X	}
X	if (cursor && !cursorstate) {
X		screen->box->x = x;
X		screen->box->y = y + screen->linespace / 2;
X		XDrawLines (screen->display, TextWindow(screen),
X			    screen->cursoroutlineGC ? screen->cursoroutlineGC
X						    : gc,
X			    screen->box, NBOX, CoordModePrevious);
X	}
}
#endif /* KTERM */
SHAR_EOF
echo 'File kterm-4.1.2/screen.c is complete' &&
chmod 0664 kterm-4.1.2/screen.c ||
echo 'restore of kterm-4.1.2/screen.c failed'
Wc_c="`wc -c < 'kterm-4.1.2/screen.c'`"
test 30881 -eq "$Wc_c" ||
	echo 'kterm-4.1.2/screen.c: original size 30881, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/scrollbar.c ==============
if test -f 'kterm-4.1.2/scrollbar.c' -a X"$1" != X"-c"; then
	echo 'x - skipping kterm-4.1.2/scrollbar.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/scrollbar.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/scrollbar.c' &&
/*
X *	$XConsortium: scrollbar.c,v 1.32 89/12/15 11:45:51 kit Exp $
X *	$Header: /usr/src.yoshi/X/KTerm/4.1.0/RCS/scrollbar.c,v 1.1 90/06/27 09:39:53 kagotani Rel $
X */
X
#include <X11/copyright.h>
X
/*
X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
X *
X *                         All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Digital Equipment
X * Corporation not be used in advertising or publicity pertaining to
X * distribution of the software without specific, written prior permission.
X *
X *
X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X * SOFTWARE.
X */
X
#include <stdio.h>
#include <ctype.h>
#include <setjmp.h>
#include <X11/Xatom.h>
X
#include "ptyx.h"		/* X headers included here. */
X
#include <X11/StringDefs.h>
#include <X11/Shell.h>
X
#include <X11/Xaw/Scrollbar.h>
X
#include "data.h"
#include "error.h"
#include "menu.h"
X
extern void bcopy();
X
#ifndef lint
static char rcs_id[] = "$XConsortium: scrollbar.c,v 1.32 89/12/15 11:45:51 kit Exp $";
#endif	/* lint */
X
/* Event handlers */
X
static void ScrollTextTo();
static void ScrollTextUpDownBy();
X
static Bool IsEventType( display, event, type )
X	Display *display;
X	XEvent *event;
X	int type;
{
X	return (event->type == type);
}
X
X
/* resize the text window for a terminal screen, modifying the
X * appropriate WM_SIZE_HINTS and taking advantage of bit gravity.
X */
X
#ifdef STATUSLINE
void ResizeScreen(xw, min_width, min_height )
#else /* !STATUSLINE */
static void ResizeScreen(xw, min_width, min_height )
#endif /* !STATUSLINE */
X	register XtermWidget xw;
X	int min_width, min_height;
{
X	register TScreen *screen = &xw->screen;
X	XSizeHints sizehints;
X	XSetWindowAttributes newAttributes;
X	XWindowAttributes oldAttributes;
X	XEvent event;
X	XtGeometryResult geomreqresult;
X	Dimension oldWidth, oldHeight;
X	Dimension reqWidth, reqHeight, repWidth, repHeight;
X	static Arg argList[] = {
X	    {XtNminWidth,	0},
X	    {XtNminHeight,	0},
X	    /* %%% the next two should move to VTInitialize, VTSetValues */
X	    {XtNwidthInc,	0},
X	    {XtNheightInc,	0}
X	};
X
#ifndef nothack
X	long supp;
X
X	/* %%% gross hack caused by our late processing of geometry
X	   (in VTRealize) and setting of size hints there, leaving
X	   Shell with insufficient information to do the job properly here.
X	   Instead of doing it properly, we save and restore the
X	   size hints around Shell.SetValues and Shell.GeometryManager
X	 */
X	if (!XGetWMNormalHints (screen->display, XtWindow(XtParent(xw)),
X				&sizehints, &supp))
X	    sizehints.flags = 0;
X	sizehints.base_width = min_width;
X	sizehints.base_height = min_height;
X	sizehints.width_inc = FontWidth(screen);
X	sizehints.height_inc = FontHeight(screen);
X	sizehints.min_width = sizehints.base_width + sizehints.width_inc;
X	sizehints.min_height = sizehints.base_height + sizehints.height_inc;
X	sizehints.width =  (screen->max_col + 1) * FontWidth(screen)
X				+ min_width;
X	sizehints.height = FontHeight(screen) * (screen->max_row + 1)
X				+ min_height;
#ifdef STATUSLINE
X	sizehints.base_height += screen->statusheight;
X	sizehints.min_height += screen->statusheight;
X	sizehints.height += screen->statusheight;
#endif /* STATUSLINE */
X	sizehints.flags |= (PBaseSize|PMinSize|PResizeInc);
#endif
X
X	argList[0].value = (XtArgVal)min_width;
X	argList[1].value = (XtArgVal)min_height;
X	argList[2].value = (XtArgVal)FontWidth(screen);
X	argList[3].value = (XtArgVal)FontHeight(screen);
X	XtSetValues( XtParent(xw), argList, XtNumber(argList) );
X
X	XGetWindowAttributes( screen->display, TextWindow(screen),
X			      &oldAttributes );
X
X	newAttributes.event_mask =
X	    oldAttributes.your_event_mask | StructureNotifyMask;
#ifdef STATUSLINE
X	newAttributes.bit_gravity = ForgetGravity;
#else /* !STATUSLINE */
X	newAttributes.bit_gravity = EastGravity;
#endif /* !STATUSLINE */
X
X        /* The following statement assumes scrollbar is on Left! 
X           If we ever have scrollbars on the right, then the
X           bit-gravity should be left alone, NOT changed to EastGravity. */
X	XChangeWindowAttributes( screen->display, TextWindow(screen),
X	     CWEventMask|CWBitGravity, &newAttributes );
X
X	oldWidth = xw->core.width;
X	oldHeight = xw->core.height;
X	reqWidth = (screen->max_col + 1) * FontWidth(screen) + min_width;
#ifdef STATUSLINE
X	reqHeight = FontHeight(screen) * (screen->max_row + 1)
X			+ screen->statusheight + min_height;
#else /* !STATUSLINE */
X	reqHeight = FontHeight(screen) * (screen->max_row + 1) + min_height;
#endif /* !STATUSLINE */
X	geomreqresult = XtMakeResizeRequest ((Widget)xw, reqWidth, reqHeight,
X					     &repWidth, &repHeight);
X
#ifndef nothack
X	XSetWMNormalHints(screen->display, XtWindow(XtParent(xw)), &sizehints);
#endif
X
X	if (oldWidth != reqWidth || oldHeight != reqHeight) {
X	    /* wait for a window manager to actually do it */
X	    XIfEvent (screen->display, &event, IsEventType, (char *)ConfigureNotify);
X	}
X
X	newAttributes.event_mask = oldAttributes.your_event_mask;
X	newAttributes.bit_gravity = NorthWestGravity;
X	XChangeWindowAttributes( screen->display, TextWindow(screen),
X				 CWEventMask|CWBitGravity,
X				 &newAttributes );
}
X
void DoResizeScreen (xw)
X    register XtermWidget xw;
{
X    int border = 2 * xw->screen.border;
X    int sb = (xw->screen.scrollbar ? xw->screen.scrollWidget->core.width : 0);
X
X    ResizeScreen (xw, border + sb, border);
}
X
X
static Widget CreateScrollBar(xw, x, y, height)
X	XtermWidget xw;
X	int x, y, height;
{
X	Widget scrollWidget;
X
X	static Arg argList[] = {
X	   {XtNx,		(XtArgVal) 0},
X	   {XtNy,		(XtArgVal) 0},
X	   {XtNheight,		(XtArgVal) 0},
X	   {XtNreverseVideo,	(XtArgVal) 0},
X	   {XtNorientation,	(XtArgVal) XtorientVertical},
X	   {XtNborderWidth,	(XtArgVal) 1},
X	};   
X
X	argList[0].value = (XtArgVal) x;
X	argList[1].value = (XtArgVal) y;
X	argList[2].value = (XtArgVal) height;
X	argList[3].value = (XtArgVal) xw->misc.re_verse;
X
X	scrollWidget = XtCreateWidget("scrollbar", scrollbarWidgetClass, 
X	  xw, argList, XtNumber(argList));
X        XtAddCallback (scrollWidget, XtNscrollProc, ScrollTextUpDownBy, 0);
X        XtAddCallback (scrollWidget, XtNjumpProc, ScrollTextTo, 0);
X	return (scrollWidget);
}
X
static void RealizeScrollBar (sbw, screen)
X    Widget sbw;
X    TScreen *screen;
{
X    XtRealizeWidget (sbw);
}
X
X
ScrollBarReverseVideo(scrollWidget)
X	register Widget scrollWidget;
{
X	Arg args[4];
X	int nargs = XtNumber(args);
X	unsigned long bg, fg, bdr;
X	Pixmap bdpix;
X
X	XtSetArg(args[0], XtNbackground, &bg);
X	XtSetArg(args[1], XtNforeground, &fg);
X	XtSetArg(args[2], XtNborderColor, &bdr);
X	XtSetArg(args[3], XtNborderPixmap, &bdpix);
X	XtGetValues (scrollWidget, args, nargs);
X	args[0].value = (XtArgVal) fg;
X	args[1].value = (XtArgVal) bg;
X	nargs--;				/* don't set border_pixmap */
X	if (bdpix == XtUnspecifiedPixmap) {	/* if not pixmap then pixel */
X	    args[2].value = args[1].value;	/* set border to new fg */
X	} else {				/* ignore since pixmap */
X	    nargs--;				/* don't set border pixel */
X	}
X	XtSetValues (scrollWidget, args, nargs);
}
X
X
X
ScrollBarDrawThumb(scrollWidget)
X	register Widget scrollWidget;
{
X	register TScreen *screen = &term->screen;
X	register int thumbTop, thumbHeight, totalHeight;
X	
X	thumbTop    = screen->topline + screen->savedlines;
X	thumbHeight = screen->max_row + 1;
X	totalHeight = thumbHeight + screen->savedlines;
X
X	XawScrollbarSetThumb(scrollWidget,
X	 ((float)thumbTop) / totalHeight,
X	 ((float)thumbHeight) / totalHeight);
X	
}
X
ResizeScrollBar(scrollWidget, x, y, height)
X	register Widget scrollWidget;
X	int x, y;
X	unsigned height;
{
X	XtConfigureWidget(scrollWidget, x, y, scrollWidget->core.width,
X	    height, scrollWidget->core.border_width);
X	ScrollBarDrawThumb(scrollWidget);
}
X
WindowScroll(screen, top)
X	register TScreen *screen;
X	int top;
{
X	register int i, lines;
X	register int scrolltop, scrollheight, refreshtop;
X	register int x = 0;
#ifdef KTERM
X	int fnum = F_ISO8859_1; /* refered by normalGC */
#endif /* KTERM */
X
X	if (top < -screen->savedlines)
X		top = -screen->savedlines;
X	else if (top > 0)
X		top = 0;
X	if((i = screen->topline - top) == 0) {
X		ScrollBarDrawThumb(screen->scrollWidget);
X		return;
X	}
X
X	ScrollSelection(screen, i);
X
X	if(screen->cursor_state)
X		HideCursor();
X	lines = i > 0 ? i : -i;
X	if(lines > screen->max_row + 1)
X		lines = screen->max_row + 1;
X	scrollheight = screen->max_row - lines + 1;
X	if(i > 0)
X		refreshtop = scrolltop = 0;
X	else {
X		scrolltop = lines;
X		refreshtop = scrollheight;
X	}
X	x = screen->scrollbar +	screen->border;
X	if(scrollheight > 0) {
X		if (screen->multiscroll && scrollheight == 1 &&
X		 screen->topline == 0 && screen->top_marg == 0 &&
X		 screen->bot_marg == screen->max_row) {
X			if (screen->incopy < 0 && screen->scrolls == 0)
X				CopyWait (screen);
X			screen->scrolls++;
X		} else {
X			if (screen->incopy)
X				CopyWait (screen);
X			screen->incopy = -1;
X		}
X		XCopyArea(
X		    screen->display, 
X		    TextWindow(screen), TextWindow(screen),
X		    screen->normalGC,
X		    (int) x,
X		    (int) scrolltop * FontHeight(screen) + screen->border, 
X		    (unsigned) Width(screen),
X		    (unsigned) scrollheight * FontHeight(screen),
X		    (int) x,
X		    (int) (scrolltop + i) * FontHeight(screen)
X			+ screen->border);
X	}
X	screen->topline = top;
X	XClearArea(
X	    screen->display,
X	    TextWindow(screen), 
X	    (int) x,
X	    (int) refreshtop * FontHeight(screen) + screen->border, 
X	    (unsigned) Width(screen),
X	    (unsigned) lines * FontHeight(screen),
X	    FALSE);
X	ScrnRefresh(screen, refreshtop, 0, lines, screen->max_col + 1, False);
X
X	ScrollBarDrawThumb(screen->scrollWidget);
}
X
X
ScrollBarOn (xw, init, doalloc)
X    XtermWidget xw;
X    int init, doalloc;
{
X	register TScreen *screen = &xw->screen;
X	register int border = 2 * screen->border;
X	register int i;
X	Char *realloc(), *calloc();
X
X	if(screen->scrollbar)
X		return;
X
X	if (init) {			/* then create it only */
X	    if (screen->scrollWidget) return;
X
X	    /* make it a dummy size and resize later */
X	    if ((screen->scrollWidget = CreateScrollBar (xw, -1, - 1, 5))
X		== NULL) {
X		Bell();
X		return;
X	    }
X
X	    return;
X
X	}
X
X	if (!screen->scrollWidget) {
X	    Bell ();
X	    Bell ();
X	    return;
X	}
X
X	if (doalloc && screen->allbuf) {
#ifdef KTERM
X	    if((screen->allbuf =
X		(ScrnBuf) realloc((char *) screen->buf,
X				  (unsigned) (screen->max_row + 2 +
X						screen->savelines) *
X				  sizeof(Bchr *)))
X	       == NULL)
X	      Error (ERROR_SBRALLOC);
X	    screen->buf = &screen->allbuf[screen->savelines];
X	    bcopy ((char *)screen->allbuf, (char *)screen->buf,
X		   (screen->max_row + 2) * sizeof (Bchr *));
X	    for(i = screen->savelines - 1 ; i >= 0 ; i--) {
X	      if((screen->allbuf[i] =
X		  (Bchr *)calloc((unsigned) screen->max_col + 1, sizeof(Bchr))) == NULL)
X		Error (ERROR_SBRALLOC2);
X	    }
#else /* !KTERM */
X	    if((screen->allbuf =
X		(ScrnBuf) realloc((char *) screen->buf,
X				  (unsigned) 2*(screen->max_row + 2 +
X						screen->savelines) *
X				  sizeof(char *)))
X	       == NULL)
X	      Error (ERROR_SBRALLOC);
X	    screen->buf = &screen->allbuf[2 * screen->savelines];
X	    bcopy ((char *)screen->allbuf, (char *)screen->buf,
X		   2 * (screen->max_row + 2) * sizeof (char *));
X	    for(i = 2 * screen->savelines - 1 ; i >= 0 ; i--)
X	      if((screen->allbuf[i] =
X		  calloc((unsigned) screen->max_col + 1, sizeof(char))) ==
X		 NULL)
X		Error (ERROR_SBRALLOC2);
#endif /* !KTERM */
X	}
X
X	ResizeScrollBar (screen->scrollWidget, -1, -1, 
#ifdef STATUSLINE
X			 Height (screen) + border + screen->statusheight);
#else /* !STATUSLINE */
X			 Height (screen) + border);
#endif /* !STATUSLINE */
X	RealizeScrollBar (screen->scrollWidget, screen);
X	screen->scrollbar = screen->scrollWidget->core.width;
#ifdef STATUSLINE
X	status_box[0].x += screen->scrollbar;
#endif /* STATUSLINE */
X
X	ScrollBarDrawThumb(screen->scrollWidget);
X	DoResizeScreen (xw);
X	/* map afterwards so BitGravity can be used profitably */
X	XMapWindow(screen->display, XtWindow(screen->scrollWidget));
X	update_scrollbar ();
}
X
ScrollBarOff(screen)
X	register TScreen *screen;
{
X	if(!screen->scrollbar)
X		return;
#ifdef STATUSLINE
X	status_box[0].x -= screen->scrollbar;
#endif /* STATUSLINE */
X	screen->scrollbar = 0;
X	XUnmapWindow(screen->display, XtWindow(screen->scrollWidget));
X	DoResizeScreen (term);
X	update_scrollbar ();
}
X
/*ARGSUSED*/
static void ScrollTextTo(scrollbarWidget, closure, topPercent)
X	Widget scrollbarWidget;
X	caddr_t closure;
X	float *topPercent;
{
X	register TScreen *screen = &term->screen;
X	int thumbTop;	/* relative to first saved line */
X	int newTopLine;
X
/*
X   screen->savedlines : Number of offscreen text lines,
X   screen->maxrow + 1 : Number of onscreen  text lines,
X   screen->topline    : -Number of lines above the last screen->max_row+1 lines
*/
X
X	thumbTop = *topPercent * (screen->savedlines + screen->max_row+1);
X	newTopLine = thumbTop - screen->savedlines;
X	WindowScroll(screen, newTopLine);
}
X
/*ARGSUSED*/
static void ScrollTextUpDownBy(scrollbarWidget, closure, pixels)
X	Widget scrollbarWidget;
X	Opaque closure;
X	int pixels;
{
X	register TScreen *screen = &term->screen;
X	register int rowOnScreen, newTopLine;
X
X	rowOnScreen = pixels / FontHeight(screen);
X	if (rowOnScreen == 0) {
X		if (pixels < 0)
X			rowOnScreen = -1;
X		else if (pixels > 0)
X			rowOnScreen = 1;
X	}
X	newTopLine = screen->topline + rowOnScreen;
X	WindowScroll(screen, newTopLine);
}
X
X
/*
X * assume that b is lower case and allow plural
X */
static int specialcmplowerwiths (a, b)
X    char *a, *b;
{
X    register char ca, cb;
X
X    if (!a || !b) return 0;
X
X    while (1) {
X	ca = *a;
X	cb = *b;
X	if (isascii(ca) && isupper(ca)) {		/* lowercasify */
#ifdef _tolower
X	    ca = _tolower (ca);
#else
X	    ca = tolower (ca);
#endif
X	}
X	if (ca != cb || ca == '\0') break;  /* if not eq else both nul */
X	a++, b++;
X    }
X    if (cb == '\0' && (ca == '\0' || (ca == 's' && a[1] == '\0')))
X      return 1;
X
X    return 0;
}
X
static int params_to_pixels (screen, params, n)
X    TScreen *screen;
X    String *params;
X    int n;
{
X    register mult = 1;
X    register char *s;
X
X    switch (n > 2 ? 2 : n) {
X      case 2:
X	s = params[1];
X	if (specialcmplowerwiths (s, "page")) {
X	    mult = (screen->max_row + 1) * FontHeight(screen);
X	} else if (specialcmplowerwiths (s, "halfpage")) {
X	    mult = ((screen->max_row + 1) * FontHeight(screen)) >> 1;
X	} else if (specialcmplowerwiths (s, "pixel")) {
X	    mult = 1;
X	} /* else assume that it is Line */
X	mult *= atoi (params[0]);
X	break;
X      case 1:
X	mult = atoi (params[0]) * FontHeight(screen);	/* lines */
X	break;
X      default:
X	mult = screen->scrolllines * FontHeight(screen);
X	break;
X    }
X
X    return mult;
}
X
X
/*ARGSUSED*/
void HandleScrollForward (gw, event, params, nparams)
X    Widget gw;
X    XEvent *event;
X    String *params;
X    Cardinal *nparams;
{
X    XtermWidget w = (XtermWidget) gw;
X    register TScreen *screen = &w->screen;
X
X    ScrollTextUpDownBy (gw, (Opaque) NULL,
X			params_to_pixels (screen, params, (int) *nparams));
X    return;
}
X
X
/*ARGSUSED*/
void HandleScrollBack (gw, event, params, nparams)
X    Widget gw;
X    XEvent *event;
X    String *params;
X    Cardinal *nparams;
{
X    XtermWidget w = (XtermWidget) gw;
X    register TScreen *screen = &w->screen;
X
X    ScrollTextUpDownBy (gw, (Opaque) NULL,
X			-params_to_pixels (screen, params, (int) *nparams));
X    return;
}
X
X
SHAR_EOF
chmod 0664 kterm-4.1.2/scrollbar.c ||
echo 'restore of kterm-4.1.2/scrollbar.c failed'
Wc_c="`wc -c < 'kterm-4.1.2/scrollbar.c'`"
test 15832 -eq "$Wc_c" ||
	echo 'kterm-4.1.2/scrollbar.c: original size 15832, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/tabs.c ==============
if test -f 'kterm-4.1.2/tabs.c' -a X"$1" != X"-c"; then
	echo 'x - skipping kterm-4.1.2/tabs.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/tabs.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/tabs.c' &&
/*
X *	$XConsortium: tabs.c,v 1.2 88/09/06 17:08:36 jim Exp $
X */
X
#ifndef lint
static char *rcsid_tabs_c = "$XConsortium: tabs.c,v 1.2 88/09/06 17:08:36 jim Exp $";
#endif	/* lint */
X
#include <X11/copyright.h>
X
/*
X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
X *
X *                         All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Digital Equipment
X * Corporation not be used in advertising or publicity pertaining to
X * distribution of the software without specific, written prior permission.
X *
X *
X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X * SOFTWARE.
X */
X
/* tabs.c */
X
#ifndef lint
static char rcs_id[] = "$XConsortium: tabs.c,v 1.2 88/09/06 17:08:36 jim Exp $";
#endif	/* lint */
X
#include <X11/Xlib.h>
#include "ptyx.h"
/*
X * This file presumes 32bits/word.  This is somewhat of a crock, and should
X * be fixed sometime.
X */
X
/*
X * places tabstops at only every 8 columns
X */
TabReset(tabs)
Tabs	tabs;
{
X	register int i;
X
X	for (i=0; i<TAB_ARRAY_SIZE; ++i)
X		tabs[i] = 0;
X
X	for (i=0; i<MAX_TABS; i+=8)
X		TabSet(tabs, i);
}	
X
X
/*
X * places a tabstop at col
X */
TabSet(tabs, col)
Tabs	tabs;
{
X	tabs[col >> 5] |= (1 << (col & 31));
}
X
/*
X * clears a tabstop at col
X */
TabClear(tabs, col)
Tabs	tabs;
{
X	tabs[col >> 5] &= ~(1 << (col & 31));
}
X
/*
X * returns the column of the next tabstop
X * (or MAX_TABS - 1 if there are no more).
X * A tabstop at col is ignored.
X */
TabNext (tabs, col)
Tabs	tabs;
{
X	extern XtermWidget term;
X	register TScreen *screen = &term->screen;
X
X	if(screen->curses && screen->do_wrap && (term->flags & WRAPAROUND)) {
X		Index(screen, 1);
X		col = screen->cur_col = screen->do_wrap = 0;
X	}
X	for (++col; col<MAX_TABS; ++col)
X		if (tabs[col >> 5] & (1 << (col & 31)))
X			return (col);
X
X	return (MAX_TABS - 1);
}
X
/*
X * clears all tabs
X */
TabZonk (tabs)
Tabs	tabs;
{
X	register int i;
X
X	for (i=0; i<TAB_ARRAY_SIZE; ++i)
X		tabs[i] = 0;
}
SHAR_EOF
chmod 0664 kterm-4.1.2/tabs.c ||
echo 'restore of kterm-4.1.2/tabs.c failed'
Wc_c="`wc -c < 'kterm-4.1.2/tabs.c'`"
test 2605 -eq "$Wc_c" ||
	echo 'kterm-4.1.2/tabs.c: original size 2605, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/termcap.kt ==============
if test -f 'kterm-4.1.2/termcap.kt' -a X"$1" != X"-c"; then
	echo 'x - skipping kterm-4.1.2/termcap.kt (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/termcap.kt (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/termcap.kt' &&
vk|kterm|kterm hangul hanzi kanji terminal emulator (X window system):\
X	:hs:es:ts=\E[?%i%dT:fs=\E[?F:ds=\E[?H:\
X	:KJ:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:TY=ascii:tc=xterm:
SHAR_EOF
chmod 0664 kterm-4.1.2/termcap.kt ||
echo 'restore of kterm-4.1.2/termcap.kt failed'
Wc_c="`wc -c < 'kterm-4.1.2/termcap.kt'`"
test 166 -eq "$Wc_c" ||
	echo 'kterm-4.1.2/termcap.kt: original size 166, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/terminfo.kt ==============
if test -f 'kterm-4.1.2/terminfo.kt' -a X"$1" != X"-c"; then
	echo 'x - skipping kterm-4.1.2/terminfo.kt (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/terminfo.kt (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/terminfo.kt' &&
kterm|kterm hangul hanzi kanji terminal emulator (X window system),
X	hs, eslok, tsl=\E[?%i%dT, fs=\E[?F, ds=\E[?H,
X	sc=\E7, rc=\E8, csr=\E[%i%p1%d;%p2%dr,
X	use=xterm,
SHAR_EOF
chmod 0664 kterm-4.1.2/terminfo.kt ||
echo 'restore of kterm-4.1.2/terminfo.kt failed'
Wc_c="`wc -c < 'kterm-4.1.2/terminfo.kt'`"
test 167 -eq "$Wc_c" ||
	echo 'kterm-4.1.2/terminfo.kt: original size 167, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/util.c ==============
if test -f 'kterm-4.1.2/util.c' -a X"$1" != X"-c"; then
	echo 'x - skipping kterm-4.1.2/util.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/util.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/util.c' &&
/*
X *	$XConsortium: util.c,v 1.19 89/12/10 20:44:15 jim Exp $
X *	$Kagotani: /usr/src.yoshi/X/KTerm/4.1.0/RCS/util.c,v 1.1 90/06/27 09:39:57 kagotani Rel $
X *
X * $Id: util.c,v 1.2 1991/03/17 23:57:47 mleisher Exp $
X */
X
#include <X11/copyright.h>
X
/*
X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
X *
X *                         All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Digital Equipment
X * Corporation not be used in advertising or publicity pertaining to
X * distribution of the software without specific, written prior permission.
X *
X *
X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X * SOFTWARE.
X */
X
/* util.c */
X
#ifndef lint
static char rcs_id[] = "$XConsortium: util.c,v 1.19 89/12/10 20:44:15 jim Exp $";
#endif	/* lint */
X
#include <stdio.h>
#include <X11/Intrinsic.h>
#include <setjmp.h>
typedef int *jmp_ptr;
X
#include "ptyx.h"
#include "data.h"
#include "error.h"
#include "menu.h"
X
#ifdef KTERM
static int fnum = F_ISO8859_1; /* refered by GC's in many functions */
#endif /* KTERM */
X
/*
X * These routines are used for the jump scroll feature
X */
FlushScroll(screen)
register TScreen *screen;
{
X	register int i;
X	register int shift = -screen->topline;
X	register int bot = screen->max_row - shift;
X	register int refreshtop;
X	register int refreshheight;
X	register int scrolltop;
X	register int scrollheight;
X
X	if(screen->cursor_state)
X		HideCursor();
X	if(screen->scroll_amt > 0) {
X		refreshheight = screen->refresh_amt;
X		scrollheight = screen->bot_marg - screen->top_marg -
X		 refreshheight + 1;
X		if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
X		 (i = screen->max_row - screen->scroll_amt + 1))
X			refreshtop = i;
X		if(screen->scrollWidget && !screen->alternate
X		 && screen->top_marg == 0) {
X			scrolltop = 0;
X			if((scrollheight += shift) > i)
X				scrollheight = i;
X			if((i = screen->bot_marg - bot) > 0 &&
X			 (refreshheight -= i) < screen->scroll_amt)
X				refreshheight = screen->scroll_amt;
X			if((i = screen->savedlines) < screen->savelines) {
X				if((i += screen->scroll_amt) >
X				  screen->savelines)
X					i = screen->savelines;
X				screen->savedlines = i;
X				ScrollBarDrawThumb(screen->scrollWidget);
X			}
X		} else {
X			scrolltop = screen->top_marg + shift;
X			if((i = bot - (screen->bot_marg - screen->refresh_amt +
X			 screen->scroll_amt)) > 0) {
X				if(bot < screen->bot_marg)
X					refreshheight = screen->scroll_amt + i;
X			} else {
X				scrollheight += i;
X				refreshheight = screen->scroll_amt;
X				if((i = screen->top_marg + screen->scroll_amt -
X				 1 - bot) > 0) {
X					refreshtop += i;
X					refreshheight -= i;
X				}
X			}
X		}
X	} else {
X		refreshheight = -screen->refresh_amt;
X		scrollheight = screen->bot_marg - screen->top_marg -
X		 refreshheight + 1;
X		refreshtop = screen->top_marg + shift;
X		scrolltop = refreshtop + refreshheight;
X		if((i = screen->bot_marg - bot) > 0)
X			scrollheight -= i;
X		if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
X			refreshheight -= i;
X	}
X	if(scrollheight > 0) {
X		if (screen->multiscroll && scrollheight == 1 &&
X		 screen->topline == 0 && screen->top_marg == 0 &&
X		 screen->bot_marg == screen->max_row) {
X			if (screen->incopy < 0 && screen->scrolls == 0)
X				CopyWait (screen);
X			screen->scrolls++;
X		} else {
X			if (screen->incopy)
X				CopyWait (screen);
X			screen->incopy = -1;
X		}
X
X		XCopyArea (
X		    screen->display, 
X		    TextWindow(screen),
X		    TextWindow(screen),
X		    screen->normalGC,
X		    (int) screen->border + screen->scrollbar,
X		    (int) (scrolltop + screen->scroll_amt) * FontHeight(screen)
X			+ screen->border, 
X		    (unsigned) Width(screen),
X		    (unsigned) scrollheight * FontHeight(screen),
X		    (int) screen->border + screen->scrollbar, 
X		    (int) scrolltop*FontHeight(screen) + screen->border);
X	}
X	ScrollSelection(screen, -(screen->scroll_amt));
X	screen->scroll_amt = 0;
X	screen->refresh_amt = 0;
X	if(refreshheight > 0) {
X		XClearArea (
X		    screen->display,
X		    TextWindow(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) refreshtop * FontHeight(screen) + screen->border,
X		    (unsigned) Width(screen),
X		    (unsigned) refreshheight * FontHeight(screen),
X		    FALSE);
X		ScrnRefresh(screen, refreshtop, 0, refreshheight,
X		 screen->max_col + 1, False);
X	}
}
X
AddToRefresh(screen)
register TScreen *screen;
{
X	register int amount = screen->refresh_amt;
X	register int row = screen->cur_row;
X
#ifdef STATUSLINE
X	if(screen->instatus)
X		return(0);
#endif /* STATUSLINE */
X	if(amount == 0)
X		return(0);
X	if(amount > 0) {
X		register int bottom;
X
X		if(row == (bottom = screen->bot_marg) - amount) {
X			screen->refresh_amt++;
X			return(1);
X		}
X		return(row >= bottom - amount + 1 && row <= bottom);
X	} else {
X		register int top;
X
X		amount = -amount;
X		if(row == (top = screen->top_marg) + amount) {
X			screen->refresh_amt--;
X			return(1);
X		}
X		return(row <= top + amount - 1 && row >= top);
X	}
}
X
/* 
X * scrolls the screen by amount lines, erases bottom, doesn't alter 
X * cursor position (i.e. cursor moves down amount relative to text).
X * All done within the scrolling region, of course. 
X * requires: amount > 0
X */
Scroll(screen, amount)
register TScreen *screen;
register int amount;
{
X	register int i = screen->bot_marg - screen->top_marg + 1;
X	register int shift;
X	register int bot;
X	register int refreshtop = 0;
X	register int refreshheight;
X	register int scrolltop;
X	register int scrollheight;
X
X	if(screen->cursor_state)
X		HideCursor();
X	if (amount > i)
X		amount = i;
X    if(screen->jumpscroll) {
X	if(screen->scroll_amt > 0) {
X		if(screen->refresh_amt + amount > i)
X			FlushScroll(screen);
X		screen->scroll_amt += amount;
X		screen->refresh_amt += amount;
X	} else {
X		if(screen->scroll_amt < 0)
X			FlushScroll(screen);
X		screen->scroll_amt = amount;
X		screen->refresh_amt = amount;
X	}
X	refreshheight = 0;
X    } else {
X	ScrollSelection(screen, -(amount));
X	if (amount == i) {
X		ClearScreen(screen);
X		return;
X	}
X	shift = -screen->topline;
X	bot = screen->max_row - shift;
X	scrollheight = i - amount;
X	refreshheight = amount;
X	if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
X	 (i = screen->max_row - refreshheight + 1))
X		refreshtop = i;
X	if(screen->scrollWidget && !screen->alternate
X	 && screen->top_marg == 0) {
X		scrolltop = 0;
X		if((scrollheight += shift) > i)
X			scrollheight = i;
X		if((i = screen->savedlines) < screen->savelines) {
X			if((i += amount) > screen->savelines)
X				i = screen->savelines;
X			screen->savedlines = i;
X			ScrollBarDrawThumb(screen->scrollWidget);
X		}
X	} else {
X		scrolltop = screen->top_marg + shift;
X		if((i = screen->bot_marg - bot) > 0) {
X			scrollheight -= i;
X			if((i = screen->top_marg + amount - 1 - bot) >= 0) {
X				refreshtop += i;
X				refreshheight -= i;
X			}
X		}
X	}
X	if(scrollheight > 0) {
X		if (screen->multiscroll
X		&& amount==1 && screen->topline == 0
X		&& screen->top_marg==0
X		&& screen->bot_marg==screen->max_row) {
X			if (screen->incopy<0 && screen->scrolls==0)
X				CopyWait(screen);
X			screen->scrolls++;
X		} else {
X			if (screen->incopy)
X				CopyWait(screen);
X			screen->incopy = -1;
X		}
X
X		XCopyArea(
X		    screen->display, 
X		    TextWindow(screen),
X		    TextWindow(screen),
X		    screen->normalGC,
X		    (int) screen->border + screen->scrollbar,
X		    (int) (scrolltop+amount) * FontHeight(screen) + screen->border, 
X		    (unsigned) Width(screen),
X		    (unsigned) scrollheight * FontHeight(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) scrolltop * FontHeight(screen) + screen->border);
X	}
X	if(refreshheight > 0) {
X		XClearArea (
X		   screen->display,
X		   TextWindow(screen),
X		   (int) screen->border + screen->scrollbar,
X		   (int) refreshtop * FontHeight(screen) + screen->border,
X		   (unsigned) Width(screen),
X		   (unsigned) refreshheight * FontHeight(screen),
X		   FALSE);
X		if(refreshheight > shift)
X			refreshheight = shift;
X	}
X    }
X	if(screen->scrollWidget && !screen->alternate && screen->top_marg == 0)
X		ScrnDeleteLine(screen->allbuf, screen->bot_marg +
X		 screen->savelines, 0, amount, screen->max_col + 1);
X	else
X		ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
X		 amount, screen->max_col + 1);
X	if(refreshheight > 0)
X		ScrnRefresh(screen, refreshtop, 0, refreshheight,
X		 screen->max_col + 1, False);
}
X
X
/*
X * Reverse scrolls the screen by amount lines, erases top, doesn't alter
X * cursor position (i.e. cursor moves up amount relative to text).
X * All done within the scrolling region, of course.
X * Requires: amount > 0
X */
RevScroll(screen, amount)
register TScreen *screen;
register int amount;
{
X	register int i = screen->bot_marg - screen->top_marg + 1;
X	register int shift;
X	register int bot;
X	register int refreshtop;
X	register int refreshheight;
X	register int scrolltop;
X	register int scrollheight;
X
X	if(screen->cursor_state)
X		HideCursor();
X	if (amount > i)
X		amount = i;
X    if(screen->jumpscroll) {
X	if(screen->scroll_amt < 0) {
X		if(-screen->refresh_amt + amount > i)
X			FlushScroll(screen);
X		screen->scroll_amt -= amount;
X		screen->refresh_amt -= amount;
X	} else {
X		if(screen->scroll_amt > 0)
X			FlushScroll(screen);
X		screen->scroll_amt = -amount;
X		screen->refresh_amt = -amount;
X	}
X    } else {
X	shift = -screen->topline;
X	bot = screen->max_row - shift;
X	refreshheight = amount;
X	scrollheight = screen->bot_marg - screen->top_marg -
X	 refreshheight + 1;
X	refreshtop = screen->top_marg + shift;
X	scrolltop = refreshtop + refreshheight;
X	if((i = screen->bot_marg - bot) > 0)
X		scrollheight -= i;
X	if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
X		refreshheight -= i;
X	if(scrollheight > 0) {
X		if (screen->multiscroll
X		&& amount==1 && screen->topline == 0
X		&& screen->top_marg==0
X		&& screen->bot_marg==screen->max_row) {
X			if (screen->incopy<0 && screen->scrolls==0)
X				CopyWait(screen);
X			screen->scrolls++;
X		} else {
X			if (screen->incopy)
X				CopyWait(screen);
X			screen->incopy = -1;
X		}
X
X		XCopyArea (
X		    screen->display,
X		    TextWindow(screen),
X		    TextWindow(screen),
X		    screen->normalGC,
X		    (int) screen->border + screen->scrollbar, 
X		    (int) (scrolltop-amount) * FontHeight(screen) + screen->border, 
X		    (unsigned) Width(screen),
X		    (unsigned) scrollheight * FontHeight(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) scrolltop * FontHeight(screen) + screen->border);
X	}
X	if(refreshheight > 0)
X		XClearArea (
X		    screen->display,
X		    TextWindow(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) refreshtop * FontHeight(screen) + screen->border,
X		    (unsigned) Width(screen),
X		    (unsigned) refreshheight * FontHeight(screen),
X		    FALSE);
X    }
X	ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
X			amount, screen->max_col + 1);
}
X
/*
X * If cursor not in scrolling region, returns.  Else,
X * inserts n blank lines at the cursor's position.  Lines above the
X * bottom margin are lost.
X */
InsertLine (screen, n)
register TScreen *screen;
register int n;
{
X	register int i;
X	register int shift;
X	register int bot;
X	register int refreshtop;
X	register int refreshheight;
X	register int scrolltop;
X	register int scrollheight;
X
X	if (screen->cur_row < screen->top_marg ||
X	 screen->cur_row > screen->bot_marg)
X		return;
X	if(screen->cursor_state)
X		HideCursor();
X	screen->do_wrap = 0;
X	if (n > (i = screen->bot_marg - screen->cur_row + 1))
X		n = i;
X    if(screen->jumpscroll) {
X	if(screen->scroll_amt <= 0 &&
X	 screen->cur_row <= -screen->refresh_amt) {
X		if(-screen->refresh_amt + n > screen->max_row + 1)
X			FlushScroll(screen);
X		screen->scroll_amt -= n;
X		screen->refresh_amt -= n;
X	} else if(screen->scroll_amt)
X		FlushScroll(screen);
X    }
X    if(!screen->scroll_amt) {
X	shift = -screen->topline;
X	bot = screen->max_row - shift;
X	refreshheight = n;
X	scrollheight = screen->bot_marg - screen->cur_row - refreshheight + 1;
X	refreshtop = screen->cur_row + shift;
X	scrolltop = refreshtop + refreshheight;
X	if((i = screen->bot_marg - bot) > 0)
X		scrollheight -= i;
X	if((i = screen->cur_row + refreshheight - 1 - bot) > 0)
X		refreshheight -= i;
X	if(scrollheight > 0) {
X		if (screen->incopy)
X			CopyWait (screen);
X		screen->incopy = -1;
X		XCopyArea (
X		    screen->display, 
X		    TextWindow(screen),
X		    TextWindow(screen),
X		    screen->normalGC,
X		    (int) screen->border + screen->scrollbar,
X		    (int) (scrolltop - n) * FontHeight(screen) + screen->border, 
X		    (unsigned) Width(screen),
X		    (unsigned) scrollheight * FontHeight(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) scrolltop * FontHeight(screen) + screen->border);
X	}
X	if(refreshheight > 0)
X		XClearArea (
X		    screen->display,
X		    TextWindow(screen),
X		    (int) screen->border + screen->scrollbar,
X		    (int) refreshtop * FontHeight(screen) + screen->border,
X		    (unsigned) Width(screen),
X		    (unsigned) refreshheight * FontHeight(screen),
X		    FALSE);
X    }
X	/* adjust screen->buf */
X	ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n,
X			screen->max_col + 1);
}
X
/*
X * If cursor not in scrolling region, returns.  Else, deletes n lines
X * at the cursor's position, lines added at bottom margin are blank.
X */
DeleteLine(screen, n)
register TScreen *screen;
register int n;
{
X	register int i;
X	register int shift;
X	register int bot;
X	register int refreshtop;
X	register int refreshheight;
X	register int scrolltop;
X	register int scrollheight;
X
X	if (screen->cur_row < screen->top_marg ||
X	 screen->cur_row > screen->bot_marg)
X		return;
SHAR_EOF
true || echo 'restore of kterm-4.1.2/util.c failed'
fi
echo 'End of kterm-4.1.2 part 17'
echo 'File kterm-4.1.2/util.c is continued in part 18'
echo 18 > _shar_seq_.tmp
exit 0


-----------------------------------------------------------------------------
mleisher at nmsu.edu                      "I laughed.
Mark Leisher                                I cried.
Computing Research Lab                          I fell down.
New Mexico State University                        It changed my life."
Las Cruces, NM                     - Rich [Cowboy Feng's Space Bar and Grille]

--
Dan Heller
O'Reilly && Associates       Z-Code Software    Comp-sources-x:
Senior Writer                President          comp-sources.x at uunet.uu.net
argv at ora.com                 argv at zipcode.com



More information about the Comp.sources.x mailing list