⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tekproc.c

📁 源码,标准c++用力
💻 C
📖 第 1 页 / 共 3 页
字号:
			/* Pt: point */			unput(c);			if(getpoint()) {				TekMove(screen->cur.x, screen->cur.y);				TekDraw(screen->cur.x, screen->cur.y);			}			break;		 case CASE_SPT_POINT:			/* Spt: point */			/* ignore intensity character in c */			if(getpoint()) {				TekMove(screen->cur.x, screen->cur.y);				TekDraw(screen->cur.x, screen->cur.y);			}			break;		 case CASE_CR:			/* CR */			if(screen->TekGIN)				TekGINoff();			if(nplot > 0)	/* flush line Tbuffer */				TekFlush();			screen->cur_X = screen->margin == MARGIN1 ? 0 :			 TEKWIDTH / 2;			Tparsestate = curstate = Talptable;			break;		 case CASE_ESC_STATE:			/* ESC */			Tparsestate = Tesctable;			break;		 case CASE_LF:			/* LF */			if(screen->TekGIN)				TekGINoff();			TCursorDown();			if (!TekRefresh &&				(XtAppPending(app_con) ||			     GetBytesAvailable (ConnectionNumber(screen->display)) > 0))			  xevents();			break;		 case CASE_SP:			/* SP */			TCursorForward();			break;		 case CASE_PRINT:			/* printable character */			ch = c;			c = screen->cur.fontsize;			XDrawString(			    screen->display,			    TWindow(screen), 			    screen->TnormalGC,			    (int)(screen->cur_X * TekScale(screen)) + screen->border,			    (int)((TEKHEIGHT + TEKTOPPAD - screen->cur_Y) * TekScale(screen)) + screen->border,			    &ch,			    1);			TCursorForward();			break;		 case CASE_OSC:			/* do osc escape */			do_osc(Tinput);			Tparsestate = curstate;			break;		}	}}			static int rcnt;static char *rptr;static int Tselect_mask;static int Tinput(){	register TScreen *screen = &term->screen;	register int i;	register TekLink *tek;	if(Tpushback > Tpushb)		return(*--Tpushback);	if(TekRefresh) {		if(rcnt-- > 0)			return(*rptr++);		if(tek = TekRefresh->next) {			TekRefresh = tek;			rptr = tek->data;			rcnt = tek->count - 1;			TekSetFontSize(tek->fontsize);			return(*rptr++);		}		TekRefresh = (TekLink *)0;		longjmp(Tekjump, 1);	}again:	if(Tbcnt-- <= 0) {		if(nplot > 0)	/* flush line Tbuffer */			TekFlush();		Tselect_mask = pty_mask;	/* force a read */		for( ; ; ) {#ifdef CRAY			struct timeval crocktimeout;			crocktimeout.tv_sec = 0;			crocktimeout.tv_usec = 0;			(void) select (max_plus1, &Tselect_mask, (int *) NULL,				       (int *) NULL, &crocktimeout);#endif			if(Tselect_mask & pty_mask) {#ifdef ALLOWLOGGING				if(screen->logging)					FlushLog(screen);#endif				Tbcnt = read(screen->respond, (char *)(Tbptr = Tbuffer), BUF_SIZE);				if(Tbcnt < 0) {					if(errno == EIO)						Cleanup (0);					else if(!E_TEST(errno))						Panic(				 "Tinput:read returned unexpected error (%d)\n",						 errno);				} else if(Tbcnt == 0)					Panic("input: read returned zero\n", 0);				else {				    if (!screen->output_eight_bits) {					register int bc = Tbcnt;					register Char *b = Tbptr;					for (; bc > 0; bc--, b++) {					    *b &= (Char) 0x7f;					}				    }					break;				}			}			if (Ttoggled && curstate == Talptable) {				TCursorToggle(TOGGLE);				Ttoggled = FALSE;			}			if(XtAppPending(app_con) & XtIMXEvent)				Tselect_mask = X_mask;			else {				XFlush(screen->display);				Tselect_mask = Select_mask;				if((i = select(max_plus1, &Tselect_mask,					(int *)NULL, (int *)NULL,					(struct timeval *)NULL)) < 0){					if (errno != EINTR)						SysError(ERROR_TSELECT);					continue;				}			}			if(Tselect_mask & X_mask) {				xevents();				if(Tbcnt > 0)					goto again;			}		}		Tbcnt--;		if (!Ttoggled && curstate == Talptable) {			TCursorToggle(TOGGLE);			Ttoggled = TRUE;		}	}	tek = TekRecord;	if(tek->count >= TEK_LINK_BLOCK_SIZE	   || tek->fontsize != screen->cur.fontsize) {		if((TekRecord = tek->next = (TekLink *)malloc(sizeof(TekLink)))		 == (TekLink *)0)			Panic("Tinput: malloc error (%d)\n", errno);		tek = tek->next;		tek->next = (TekLink *)0;		tek->fontsize = screen->cur.fontsize;		tek->count = 0;		tek->ptr = tek->data;	}	tek->count++;	return(*tek->ptr++ = *Tbptr++);}/* this should become the Tek Widget's Resize proc */static void TekConfigure(w)    Widget w;{    register TScreen *screen = &term->screen;    register int border = 2 * screen->border;    register double d;    if (TWindow(screen)) XClearWindow(screen->display, TWindow(screen));    TWidth(screen) = w->core.width - border;    THeight(screen) = w->core.height - border;    TekScale(screen) = (double)TWidth(screen) / TEKWIDTH;    if((d = (double)THeight(screen) / (TEKHEIGHT + TEKTOPPAD + TEKBOTTOMPAD))       < TekScale(screen))      TekScale(screen) = d;    TFullWidth(screen) = w->core.width;    TFullHeight(screen) = w->core.height;}/*ARGSUSED*/void TekExpose(w, event, region)    Widget w;    XEvent *event;    Region region;{	register TScreen *screen = &term->screen;	extern Bool waiting_for_initial_map;#ifdef lint	region = region;#endif	if(!Ttoggled)	    TCursorToggle(CLEAR);	Ttoggled = TRUE;	Tpushback = Tpushb;	screen->cur_X = 0;	screen->cur_Y = TEKHOME;	TekSetFontSize(screen->page.fontsize);	screen->cur = screen->page;	screen->margin = MARGIN1;	if(screen->TekGIN) {		screen->TekGIN = NULL;		TekGINoff();	}	TekRefresh = &Tek0;	rptr = TekRefresh->data;	rcnt = TekRefresh->count;	Tparsestate = curstate = Talptable;	if (waiting_for_initial_map)	    first_map_occurred ();	if(!screen->waitrefresh)		dorefresh();}dorefresh(){	register TScreen *screen = &term->screen;	static Cursor wait_cursor = None;	if (wait_cursor == None)            wait_cursor = make_colored_cursor (XC_watch, screen->mousecolor,					       screen->mousecolorback);        XDefineCursor(screen->display, TShellWindow, wait_cursor);	XFlush(screen->display);	if(!setjmp(Tekjump))		Tekparse();	XDefineCursor(screen->display, TShellWindow,	 (screen->TekGIN && GINcursor) ? GINcursor : screen->arrow);}TekPage(){	register TScreen *screen = &term->screen;	register TekLink *tek;	XClearWindow(screen->display, TWindow(screen));	screen->cur_X = 0;	screen->cur_Y = TEKHOME;	screen->margin = MARGIN1;	screen->page = screen->cur;	if(screen->TekGIN)		TekGINoff();	tek = TekRecord = &Tek0;	tek->fontsize = screen->cur.fontsize;	tek->count = 0;	tek->ptr = tek->data;	tek = tek->next;	if(tek)		do {			TekLink *tek2 = tek->next;			free((char *)tek);			tek = tek2;		} while(tek);	TekRecord->next = (TekLink *)0;	TekRefresh = (TekLink *)0;	Ttoggled = TRUE;	Tparsestate = curstate = Talptable;	/* Tek Alpha mode */}#define	EXTRABITS	017#define	FIVEBITS	037#define	HIBITS		(FIVEBITS << SHIFTHI)#define	LOBITS		(FIVEBITS << SHIFTLO)#define	SHIFTHI		7#define	SHIFTLO		2#define	TWOBITS		03static intgetpoint(){	register int c, x, y, e, lo_y = 0;	register TScreen *screen = &term->screen;	x = screen->cur.x;	y = screen->cur.y;	for( ; ; ) {		if((c = input()) < ' ') {	/* control character */			unput(c);			return(0);		}		if(c < '@') {	/* Hi X or Hi Y */			if(lo_y) {	/* seen a Lo Y, so this must be Hi X */				x &= ~HIBITS;				x |= (c & FIVEBITS) << SHIFTHI;				continue;			}			/* else Hi Y */			y &= ~HIBITS;			y |= (c & FIVEBITS) << SHIFTHI;			continue;		}		if(c < '`') {	/* Lo X */			x &= ~LOBITS;			x |= (c & FIVEBITS) << SHIFTLO;			screen->cur.x = x;			screen->cur.y = y;			return(1);	/* OK */		}		/* else Lo Y */		if(lo_y) {	/* seen a Lo Y, so other must be extra bits */			e = (y >> SHIFTLO) & EXTRABITS;			x &= ~TWOBITS;			x |= e & TWOBITS;			y &= ~TWOBITS;			y |= (e >> SHIFTLO) & TWOBITS;		}		y &= ~LOBITS;		y |= (c & FIVEBITS) << SHIFTLO;		lo_y++;	}}TCursorBack(){	register TScreen *screen = &term->screen;	register struct Tek_Char *t;	register int x, l;	x = ( screen->cur_X -=		(t = &TekChar[screen->cur.fontsize])->hsize	    );	if(screen->margin == MARGIN1 && x < 0 || screen->margin == MARGIN2	 && x < TEKWIDTH / 2) {		if((l = (screen->cur_Y + (t->vsize - 1)) / t->vsize + 1) >=		 t->nlines) {			screen->margin = !screen->margin;			l = 0;		}		screen->cur_Y = l * t->vsize;		screen->cur_X = (t->charsperline - 1) * t->hsize;	}}TCursorForward(){	register TScreen *screen = &term->screen;	register struct Tek_Char *t;	register int l;	if( ( screen->cur_X +=		( t = &TekChar[screen->cur.fontsize])->hsize	    ) > TEKWIDTH	  ) {		if((l = screen->cur_Y / t->vsize - 1) < 0) {			screen->margin = !screen->margin;			l = t->nlines - 1;		}		screen->cur_Y = l * t->vsize;		screen->cur_X = screen->margin == MARGIN1 ? 0 : TEKWIDTH / 2;	}}TCursorUp(){	register TScreen *screen = &term->screen;	register struct Tek_Char *t;	register int l;	t = &TekChar[screen->cur.fontsize];	if((l = (screen->cur_Y + (t->vsize - 1)) / t->vsize + 1) >= t->nlines) {		l = 0;		if((screen->margin = !screen->margin) != MARGIN1) {			if(screen->cur_X < TEKWIDTH / 2)				screen->cur_X += TEKWIDTH / 2;		} else if(screen->cur_X >= TEKWIDTH / 2)			screen->cur_X -= TEKWIDTH / 2;	}	screen->cur_Y = l * t->vsize;}TCursorDown(){	register TScreen *screen = &term->screen;	register struct Tek_Char *t;	register int l;	t = &TekChar[screen->cur.fontsize];	if((l = screen->cur_Y / t->vsize - 1) < 0) {		l = t->nlines - 1;		if((screen->margin = !screen->margin) != MARGIN1) {			if(screen->cur_X < TEKWIDTH / 2)				screen->cur_X += TEKWIDTH / 2;		} else if(screen->cur_X >= TEKWIDTH / 2)			screen->cur_X -= TEKWIDTH / 2;	}	screen->cur_Y = l * t->vsize;}static voidAddToDraw(x1, y1, x2, y2)    int x1, y1, x2, y2;{	register TScreen *screen = &term->screen;	register XSegment *lp;	if(nplot >= MAX_PTS) {		TekFlush();	}	lp = line_pt++;	lp->x1 = x1 = x1 * TekScale(screen) + screen->border;	lp->y1 = y1 = (TEKHEIGHT + TEKTOPPAD - y1) * TekScale(screen) +	 screen->border;	lp->x2 = x2 = x2 * TekScale(screen) + screen->border;	lp->y2 = y2 = (TEKHEIGHT + TEKTOPPAD - y2) * TekScale(screen) +	 screen->border;	nplot++;}TekDraw (x, y)    int x, y;{	register TScreen *screen = &term->screen;	if(nplot == 0 || T_lastx != screen->cur_X || T_lasty != screen->cur_Y) {		/*		 * We flush on each unconnected line segment if the line		 * type is not solid.  This solves a bug in X when drawing		 * points while the line type is not solid.		 */		if(nplot > 0 && screen->cur.linetype != SOLIDLINE)			TekFlush();	}	AddToDraw(screen->cur_X, screen->cur_Y, x, y);	T_lastx = screen->cur_X = x;	T_lasty = screen->cur_Y = y;}TekFlush (){	register TScreen *screen = &term->screen;	XDrawSegments(screen->display, TWindow(screen), 		((screen->cur.linetype == SOLIDLINE)?  screen->TnormalGC :		 screen->linepat[screen->cur.linetype - 1]),		 Tline, nplot);	nplot = 0;	line_pt = Tline;}TekGINoff(){	register TScreen *screen = &term->screen;		XDefineCursor(screen->display, TShellWindow, screen->arrow);	if(GINcursor)		XFreeCursor(screen->display, GINcursor);	if(screen->TekGIN) {		*screen->TekGIN = CANCEL;	/* modify recording */		screen->TekGIN = NULL;	}}TekEnqMouse(c)    int c;			/* character pressed */{	register TScreen *screen = &term->screen;	int mousex, mousey, rootx, rooty;	unsigned int mask; /* XQueryPointer */	Window root, subw;	XQueryPointer(	    screen->display, TWindow(screen), 	    &root, &subw,	    &rootx, &rooty,	    &mousex, &mousey,	    &mask);	if((mousex = (mousex - screen->border) / TekScale(screen)) < 0)		mousex = 0;	else if(mousex >= TEKWIDTH)		mousex = TEKWIDTH - 1;	if((mousey = TEKHEIGHT + TEKTOPPAD - (mousey - screen->border) /	     TekScale(screen)) < 0)		mousey = 0;	else if(mousey >= TEKHEIGHT)		mousey = TEKHEIGHT - 1;	TekEnq(c, mousex, mousey);}static void TekEnq (status, x, y)    int status;    register int x, y;{    register TScreen *screen = &term->screen;    int pty = screen->respond;    char cplot [7];    int len = 5;    cplot[0] = status;    /* Translate x and y to Tektronix code */    cplot[1] = 040 | ((x >> SHIFTHI) & FIVEBITS);    cplot[2] = 040 | ((x >> SHIFTLO) & FIVEBITS);    cplot[3] = 040 | ((y >> SHIFTHI) & FIVEBITS);    cplot[4] = 040 | ((y >> SHIFTLO) & FIVEBITS);    if (screen->gin_terminator != GIN_TERM_NONE)	cplot[len++] = '\r';    if (screen->gin_terminator == GIN_TERM_EOT)	cplot[len++] = '\004';    if(cplot[0])	v_write(pty, cplot, len);    else	v_write(pty, cplot+1, len-1);}TekRun(){	register TScreen *screen = &term->screen;	register int i;		if(!TWindow(screen) && !TekInit()) {		if(VWindow(screen)) {			screen->TekEmu = FALSE;			return;		}		Exit(ERROR_TINIT);	}	if(!screen->Tshow) {	    set_tek_visibility (TRUE);	} 	update_vttekmode();	update_vtshow();	update_tekshow();	set_tekhide_sensitivity();	Tpushback = Tpushb;	Tbptr = Tbuffer;	for(i = Tbcnt = bcnt ; i > 0 ; i--)		*Tbptr++ = *bptr++;	Tbptr = Tbuffer;	Ttoggled = TRUE;	if(!setjmp(Tekend))		Tekparse();	if(!Ttoggled) {		TCursorToggle(TOGGLE);		Ttoggled = TRUE;	}	screen->TekEmu = FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -