📄 tekproc.c
字号:
/* * $XConsortium: Tekproc.c,v 1.112 93/02/25 17:17:40 gildea Exp $ * * Warning, there be crufty dragons here. *//* * Copyright 1988 Massachusetts Institute of Technology * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital Equipment * Corporation not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. *//* Tekproc.c */#include "ptyx.h"#include "Tekparse.h"#include "data.h"#include "error.h"#include "menu.h"#include <X11/Xos.h>#include <X11/Xatom.h>#include <X11/Xutil.h>#include <X11/cursorfont.h>#include <X11/StringDefs.h>#include <X11/Shell.h>#include <X11/Xmu/CharSet.h>#include <stdio.h>#include <errno.h>#include <setjmp.h>#include <signal.h>/* * Check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX * systems are broken and return EWOULDBLOCK when they should return EAGAIN. * Note that this macro may evaluate its argument more than once. */#if defined(EAGAIN) && defined(EWOULDBLOCK)#define E_TEST(err) ((err) == EAGAIN || (err) == EWOULDBLOCK)#else#ifdef EAGAIN#define E_TEST(err) ((err) == EAGAIN)#else#define E_TEST(err) ((err) == EWOULDBLOCK)#endif#endifextern jmp_buf Tekend;#ifndef X_NOT_STDC_ENV#include <stdlib.h>#elseextern char *malloc();extern void exit();extern long time(); /* included in <time.h> by Xos.h */#endif#define TekColormap DefaultColormap( screen->display, \ DefaultScreen(screen->display) )#define DefaultGCID XGContextFromGC(DefaultGC(screen->display, DefaultScreen(screen->display)))/* Tek defines */#define BEL 07#define CANCEL 030#define DOTDASHEDLINE 2#define DOTTEDLINE 1#define EAST 01#define ETX 03#define LINEMASK 07#define LONGDASHEDLINE 4#define MARGIN1 0#define MARGIN2 1#define MAX_PTS 150#define MAX_VTX 300#define NAK 025#define NORTH 04#define PENDOWN 1#define PENUP 0#define SHORTDASHEDLINE 3#define SOLIDLINE 0#define SOUTH 010#define TEKBOTTOMPAD 23#define TEKDEFHEIGHT 565#define TEKDEFWIDTH 750#define TEKHEIGHT 3072#define TEKHOME ((TekChar[screen->page.fontsize].nlines - 1)\ * TekChar[screen->page.fontsize].vsize)#define TEKMINHEIGHT 452#define TEKMINWIDTH 600#define TEKTOPPAD 34#define TEKWIDTH 4096#define TEXT_BUF_SIZE 256#define WEST 02#define TekMove(x,y) screen->cur_X = x; screen->cur_Y = y#define input() Tinput()#define unput(c) *Tpushback++ = cextern Widget toplevel;static struct Tek_Char { int hsize; /* in Tek units */ int vsize; /* in Tek units */ int charsperline; int nlines;} TekChar[TEKNUMFONTS] = { {56, 88, 74, 35}, /* large */ {51, 82, 81, 38}, /* #2 */ {34, 53, 121, 58}, /* #3 */ {31, 48, 133, 64}, /* small */};static Cursor GINcursor;static XSegment *line_pt;static int nplot;static TekLink Tek0;static jmp_buf Tekjump;static TekLink *TekRecord;static XSegment *Tline;extern int Talptable[];extern int Tbestable[];extern int Tbyptable[];extern int Tesctable[];extern int Tipltable[];extern int Tplttable[];extern int Tpttable[];extern int Tspttable[];extern XtAppContext app_con;static int *curstate = Talptable;static int *Tparsestate = Talptable;static void TekEnq();/* event handlers */extern void HandleKeyPressed(), HandleEightBitKeyPressed();extern void HandleStringEvent();extern void HandleEnterWindow();extern void HandleLeaveWindow();extern void HandleFocusChange();extern void HandleBellPropertyChange();extern void HandleSecure();extern void HandleGINInput();extern void HandleCreateMenu(), HandlePopupMenu();static char defaultTranslations[] = "\ ~Meta<KeyPress>: insert-seven-bit() \n\ Meta<KeyPress>: insert-eight-bit()\n\ !Ctrl <Btn1Down>: popup-menu(mainMenu) \n\ !Lock Ctrl <Btn1Down>: popup-menu(mainMenu) \n\ !Ctrl <Btn2Down>: popup-menu(tekMenu) \n\ !Lock Ctrl <Btn2Down>: popup-menu(tekMenu) \n\ Shift ~Meta<Btn1Down>: gin-press(L) \n\ ~Meta<Btn1Down>: gin-press(l) \n\ Shift ~Meta<Btn2Down>: gin-press(M) \n\ ~Meta<Btn2Down>: gin-press(m) \n\ Shift ~Meta<Btn3Down>: gin-press(R) \n\ ~Meta<Btn3Down>: gin-press(r)";static XtActionsRec actionsList[] = { { "string", HandleStringEvent }, { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */ { "insert-seven-bit", HandleKeyPressed }, { "insert-eight-bit", HandleEightBitKeyPressed }, { "gin-press", HandleGINInput }, { "secure", HandleSecure }, { "create-menu", HandleCreateMenu }, { "popup-menu", HandlePopupMenu }, /* menu actions */ { "allow-send-events", HandleAllowSends }, { "set-visual-bell", HandleSetVisualBell },#ifdef ALLOWLOGGING { "set-logging", HandleLogging },#endif { "redraw", HandleRedraw }, { "send-signal", HandleSendSignal }, { "quit", HandleQuit }, { "set-scrollbar", HandleScrollbar }, { "set-jumpscroll", HandleJumpscroll }, { "set-reverse-video", HandleReverseVideo }, { "set-autowrap", HandleAutoWrap }, { "set-reversewrap", HandleReverseWrap }, { "set-autolinefeed", HandleAutoLineFeed }, { "set-appcursor", HandleAppCursor }, { "set-appkeypad", HandleAppKeypad }, { "set-scroll-on-key", HandleScrollKey }, { "set-scroll-on-tty-output", HandleScrollTtyOutput }, { "set-allow132", HandleAllow132 }, { "set-cursesemul", HandleCursesEmul }, { "set-marginbell", HandleMarginBell }, { "set-altscreen", HandleAltScreen }, { "soft-reset", HandleSoftReset }, { "hard-reset", HandleHardReset }, { "set-terminal-type", HandleSetTerminalType }, { "set-visibility", HandleVisibility }, { "set-tek-text", HandleSetTekText }, { "tek-page", HandleTekPage }, { "tek-reset", HandleTekReset }, { "tek-copy", HandleTekCopy },};static Dimension defOne = 1;#define GIN_TERM_NONE_STR "none"#define GIN_TERM_CR_STR "CRonly"#define GIN_TERM_EOT_STR "CR&EOT"#define GIN_TERM_NONE 0#define GIN_TERM_CR 1#define GIN_TERM_EOT 2static XtResource resources[] = { {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), XtOffsetOf(CoreRec, core.width), XtRDimension, (caddr_t)&defOne}, {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), XtOffsetOf(CoreRec, core.height), XtRDimension, (caddr_t)&defOne}, {"fontLarge", XtCFont, XtRFontStruct, sizeof(XFontStruct *), XtOffsetOf(TekWidgetRec, tek.Tfont[TEK_FONT_LARGE]), XtRString, "9x15"}, {"font2", XtCFont, XtRFontStruct, sizeof(XFontStruct *), XtOffsetOf(TekWidgetRec, tek.Tfont[TEK_FONT_2]), XtRString, "6x13"}, {"font3", XtCFont, XtRFontStruct, sizeof(XFontStruct *), XtOffsetOf(TekWidgetRec, tek.Tfont[TEK_FONT_3]), XtRString, "8x13"}, {"fontSmall", XtCFont, XtRFontStruct, sizeof(XFontStruct *), XtOffsetOf(TekWidgetRec, tek.Tfont[TEK_FONT_SMALL]), XtRString, "6x10"}, {"initialFont", "InitialFont", XtRString, sizeof(char *), XtOffsetOf(TekWidgetRec, tek.initial_font), XtRString, "large"}, {"ginTerminator", "GinTerminator", XtRString, sizeof(char *), XtOffsetOf(TekWidgetRec, tek.gin_terminator_str), XtRString, GIN_TERM_NONE_STR},};static void TekInitialize(), TekRealize(), TekConfigure();static int getpoint();static int Tinput();void TekExpose();void TekSetFontSize();static WidgetClassRec tekClassRec = { {/* core_class fields */ /* superclass */ (WidgetClass) &widgetClassRec, /* class_name */ "Tek4014", /* widget_size */ sizeof(TekWidgetRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ TekInitialize, /* initialize_hook */ NULL, /* realize */ TekRealize, /* actions */ actionsList, /* num_actions */ XtNumber(actionsList), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ TekConfigure, /* expose */ TekExpose, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ NULL, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_offsets */ NULL, /* tm_table */ defaultTranslations, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator*/ XtInheritDisplayAccelerator, /* extension */ NULL }};#define tekWidgetClass ((WidgetClass)&tekClassRec)static Boolean Tfailed = FALSE;static Widget tekshellwidget;static TekWidget CreateTekWidget (){ extern Arg ourTopLevelShellArgs[]; extern int number_ourTopLevelShellArgs; /* this causes the Initialize method to be called */ tekshellwidget = XtCreatePopupShell ("tektronix", topLevelShellWidgetClass, toplevel, ourTopLevelShellArgs, number_ourTopLevelShellArgs); /* this causes the Realize method to be called */ tekWidget = (TekWidget) XtCreateManagedWidget ("tek4014", tekWidgetClass, tekshellwidget, NULL, 0); return (tekWidget);}int TekInit (){ if (Tfailed) return (0); if (tekWidget) return (1); if (CreateTekWidget()) { return (1); } return (0);}static void Tekparse(){ register TScreen *screen = &term->screen; register int c, x, y; char ch; for( ; ; ) { c = input(); switch(Tparsestate[c]) { case CASE_REPORT: /* report address */ if(screen->TekGIN) { TekGINoff(); TekEnqMouse(0); } else { c = 064; /* has hard copy unit */ if(screen->margin == MARGIN2) c |= 02; TekEnq(c, screen->cur_X, screen->cur_Y); } TekRecord->ptr[-1] = NAK; /* remove from recording */ Tparsestate = curstate; break; case CASE_VT_MODE: /* special return to vt102 mode */ Tparsestate = curstate; TekRecord->ptr[-1] = NAK; /* remove from recording */#ifdef ALLOWLOGGING if(screen->logging) { FlushLog(screen); screen->logstart = buffer; }#endif return; case CASE_SPT_STATE: /* Enter Special Point Plot mode */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate = Tspttable; break; case CASE_GIN: /* Do Tek GIN mode */ screen->TekGIN = &TekRecord->ptr[-1]; /* Set cross-hair cursor raster array */ if (GINcursor = make_colored_cursor (XC_tcross, screen->mousecolor, screen->mousecolorback)) XDefineCursor (screen->display, TShellWindow, GINcursor); Tparsestate = Tbyptable; /* Bypass mode */ break; case CASE_BEL: /* BEL */ if(screen->TekGIN) TekGINoff(); if(!TekRefresh) Bell(); Tparsestate = curstate; /* clear bypass condition */ break; case CASE_BS: /* BS */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate; /* clear bypass condition */ TCursorBack(); break; case CASE_PT_STATE: /* Enter Tek Point Plot mode */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate = Tpttable; break; case CASE_PLT_STATE: /* Enter Tek Plot mode */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate = Tplttable; if((c = input()) == BEL) screen->pen = PENDOWN; else { unput(c); screen->pen = PENUP; } break; case CASE_TAB: /* HT */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate; /* clear bypass condition */ TCursorForward(); break; case CASE_IPL_STATE: /* Enter Tek Incremental Plot mode */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate = Tipltable; break; case CASE_ALP_STATE: /* Enter Tek Alpha mode from any other mode */ if(screen->TekGIN) TekGINoff(); /* if in one of graphics states, move alpha cursor */ if(nplot > 0) /* flush line Tbuffer */ TekFlush(); Tparsestate = curstate = Talptable; break; case CASE_UP: /* cursor up */ if(screen->TekGIN) TekGINoff(); Tparsestate = curstate; /* clear bypass condition */ TCursorUp(); break; case CASE_COPY: /* make copy */ if(screen->TekGIN) TekGINoff(); TekCopy(); TekRecord->ptr[-1] = NAK; /* remove from recording */ Tparsestate = curstate; /* clear bypass condition */ break; case CASE_PAGE: /* Page Function */ if(screen->TekGIN) TekGINoff(); TekPage(); /* clear bypass condition */ break; case CASE_BES_STATE: /* Byp: an escape char */ Tparsestate = Tbestable; break; case CASE_BYP_STATE: /* set bypass condition */ Tparsestate = Tbyptable; break; case CASE_IGNORE: /* Esc: totally ignore CR, ESC, LF, ~ */ break; case CASE_ASCII: /* Select ASCII char set */ /* ignore for now */ Tparsestate = curstate; break; case CASE_APL: /* Select APL char set */ /* ignore for now */ Tparsestate = curstate; break; case CASE_CHAR_SIZE: /* character size selector */ TekSetFontSize (c & 03); Tparsestate = curstate; break; case CASE_BEAM_VEC: /* beam and vector selector */ /* only line types */ if((c &= LINEMASK) != screen->cur.linetype) { if(nplot > 0) TekFlush(); if (c <= TEKNUMLINES) screen->cur.linetype = c; } Tparsestate = curstate; break; case CASE_CURSTATE: Tparsestate = curstate; break; case CASE_PENUP: /* Ipl: penup */ screen->pen = PENUP; break; case CASE_PENDOWN: /* Ipl: pendown */ screen->pen = PENDOWN; break; case CASE_IPL_POINT: /* Ipl: point */ x = screen->cur_X; y = screen->cur_Y; if(c & NORTH) y++; else if(c & SOUTH) y--; if(c & EAST) x++; else if(c & WEST) x--; if(screen->pen == PENDOWN) TekDraw(x, y); else TekMove(x, y); break; case CASE_PLT_VEC: /* Plt: vector */ unput(c); if(getpoint()) { if(screen->pen == PENDOWN) TekDraw(screen->cur.x, screen->cur.y); else TekMove(screen->cur.x, screen->cur.y); screen->pen = PENDOWN; } break; case CASE_PT_POINT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -