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

📄 tekproc.c

📁 源码,标准c++用力
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * $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 + -