📄 tekproc.c
字号:
/* 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 + -