📄 charproc.c
字号:
/* * $XConsortium: charproc.c,v 1.176.1.1 93/11/03 17:24:20 gildea Exp $ *//* * 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. *//* charproc.c */#ifdef DEBUGGING#define DBG(i) fprintf(stderr, "%s\n", i);#else#define DBG(i)#endif#include "ptyx.h"#include "VTparse.h"#include "data.h"#include "error.h"#include "menu.h"#include "main.h"#include <X11/Xos.h>#include <X11/Xatom.h>#include <X11/Xutil.h>#include <X11/cursorfont.h>#include <X11/StringDefs.h>#include <X11/Xmu/Atoms.h>#include <X11/Xmu/CharSet.h>#include <X11/Xmu/Converters.h>#include <stdio.h>#include <errno.h>#include <setjmp.h>#include <ctype.h>#ifndef DONT_PROTOTYPE_DOTEXT static void dotext(register TScreen*, unsigned, char, Char*, Char*, unsigned, unsigned );#endif#ifdef DEBUGGING static debug = 1;#endif/* * 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 VTend;extern XtAppContext app_con;extern Widget toplevel;extern void exit();extern char *malloc();extern char *realloc();static void VTallocbuf();static int finput();static void WriteText();static void bitset(), bitclr(); #define DEFAULT -1#define TEXT_BUF_SIZE 256#define TRACKTIMESEC 4L#define TRACKTIMEUSEC 0L#define BELLSUPPRESSMSEC 200#define XtNalwaysHighlight "alwaysHighlight"#define XtNappcursorDefault "appcursorDefault"#define XtNappkeypadDefault "appkeypadDefault"#define XtNbellSuppressTime "bellSuppressTime"#define XtNboldFont "boldFont"#define XtNc132 "c132"#define XtNcharClass "charClass"#define XtNcurses "curses"#define XtNcursorColor "cursorColor"#define XtNcutNewline "cutNewline"#define XtNcutToBeginningOfLine "cutToBeginningOfLine"#define XtNeightBitInput "eightBitInput"#define XtNeightBitOutput "eightBitOutput"#define XtNgeometry "geometry"#define XtNtekGeometry "tekGeometry"#define XtNinternalBorder "internalBorder"#define XtNjumpScroll "jumpScroll"#ifdef ALLOWLOGGING#define XtNlogFile "logFile"#define XtNlogging "logging"#define XtNlogInhibit "logInhibit"#endif#define XtNloginShell "loginShell"#define XtNmarginBell "marginBell"#define XtNpointerColor "pointerColor"#define XtNpointerColorBackground "pointerColorBackground"#define XtNpointerShape "pointerShape"#define XtNmultiClickTime "multiClickTime"#define XtNmultiScroll "multiScroll"#define XtNnMarginBell "nMarginBell"#define XtNresizeGravity "resizeGravity"#define XtNreverseWrap "reverseWrap"#define XtNautoWrap "autoWrap"#define XtNsaveLines "saveLines"#define XtNscrollBar "scrollBar"#define XtNscrollTtyOutput "scrollTtyOutput"#define XtNscrollKey "scrollKey"#define XtNscrollLines "scrollLines"#define XtNscrollPos "scrollPos"#define XtNsignalInhibit "signalInhibit"#define XtNtekInhibit "tekInhibit"#define XtNtekSmall "tekSmall"#define XtNtekStartup "tekStartup"#define XtNtiteInhibit "titeInhibit"#define XtNvisualBell "visualBell"#define XtNallowSendEvents "allowSendEvents"#define XtNcolor0 "color0"#define XtNcolor1 "color1"#define XtNcolor2 "color2"#define XtNcolor3 "color3"#define XtNcolor4 "color4"#define XtNcolor5 "color5"#define XtNcolor6 "color6"#define XtNcolor7 "color7"#define XtCcolor0 "Color0"#define XtCcolor1 "Color1"#define XtCcolor2 "Color2"#define XtCcolor3 "Color3"#define XtCcolor4 "Color4"#define XtCcolor5 "Color5"#define XtCcolor6 "Color6"#define XtCcolor7 "Color7"#define XtCAlwaysHighlight "AlwaysHighlight"#define XtCAppcursorDefault "AppcursorDefault"#define XtCAppkeypadDefault "AppkeypadDefault"#define XtCBellSuppressTime "BellSuppressTime"#define XtCBoldFont "BoldFont"#define XtCC132 "C132"#define XtCCharClass "CharClass"#define XtCCurses "Curses"#define XtCCutNewline "CutNewline"#define XtCCutToBeginningOfLine "CutToBeginningOfLine"#define XtCEightBitInput "EightBitInput"#define XtCEightBitOutput "EightBitOutput"#define XtCGeometry "Geometry"#define XtCJumpScroll "JumpScroll"#ifdef ALLOWLOGGING#define XtCLogfile "Logfile"#define XtCLogging "Logging"#define XtCLogInhibit "LogInhibit"#endif#define XtCLoginShell "LoginShell"#define XtCMarginBell "MarginBell"#define XtCMultiClickTime "MultiClickTime"#define XtCMultiScroll "MultiScroll"#define XtCColumn "Column"#define XtCResizeGravity "ResizeGravity"#define XtCReverseWrap "ReverseWrap"#define XtCAutoWrap "AutoWrap"#define XtCSaveLines "SaveLines"#define XtCScrollBar "ScrollBar"#define XtCScrollLines "ScrollLines"#define XtCScrollPos "ScrollPos"#define XtCScrollCond "ScrollCond"#define XtCSignalInhibit "SignalInhibit"#define XtCTekInhibit "TekInhibit"#define XtCTekSmall "TekSmall"#define XtCTekStartup "TekStartup"#define XtCTiteInhibit "TiteInhibit"#define XtCVisualBell "VisualBell"#define XtCAllowSendEvents "AllowSendEvents"#define doinput() (bcnt-- > 0 ? *bptr++ : in_put())static int nparam;static ANSI reply;static int param[NPARAM];static unsigned long ctotal;static unsigned long ntotal;static jmp_buf vtjmpbuf;extern int groundtable[];extern int csitable[];extern int dectable[];extern int eigtable[];extern int esctable[];extern int iestable[];extern int igntable[];extern int scrtable[];extern int scstable[];/* event handlers */extern void HandleKeyPressed(), HandleEightBitKeyPressed();extern void HandleStringEvent();extern void HandleEnterWindow();extern void HandleLeaveWindow();extern void HandleBellPropertyChange();extern void HandleFocusChange();static void HandleKeymapChange();extern void HandleInsertSelection();extern void HandleSelectStart(), HandleKeyboardSelectStart();extern void HandleSelectExtend(), HandleSelectSet();extern void HandleSelectEnd(), HandleKeyboardSelectEnd();extern void HandleStartExtend(), HandleKeyboardStartExtend();static void HandleBell();static void HandleVisualBell();static void HandleIgnore();extern void HandleSecure();extern void HandleScrollForward();extern void HandleScrollBack();extern void HandleCreateMenu(), HandlePopupMenu();extern void HandleSetFont();extern void SetVTFont();extern void CursorButton();extern Boolean SendMousePosition();extern void ScrnSetAttributes();/* * NOTE: VTInitialize zeros out the entire ".screen" component of the * XtermWidget, so make sure to add an assignment statement in VTInitialize() * for each new ".screen" field added to this resource list. *//* Defaults */static Boolean defaultFALSE = FALSE;static Boolean defaultTRUE = TRUE;static int defaultBorderWidth = DEFBORDERWIDTH;static int defaultIntBorder = DEFBORDER;static int defaultSaveLines = SAVELINES;static int defaultScrollLines = SCROLLLINES;static int defaultNMarginBell = N_MARGINBELL;static int defaultMultiClickTime = MULTICLICKTIME;static int defaultBellSuppressTime = BELLSUPPRESSMSEC;static char * _Font_Selected_ = "yes"; /* string is arbitrary *//* * Warning, the following must be kept under 1024 bytes or else some * compilers (particularly AT&T 6386 SVR3.2) will barf). Workaround is to * declare a static buffer and copy in at run time (the the Athena text widget * does). Yuck. */static char defaultTranslations[] ="\ Shift <KeyPress> Prior:scroll-back(1,halfpage) \n\ Shift <KeyPress> Next:scroll-forw(1,halfpage) \n\Shift <KeyPress> Select:select-cursor-start() select-cursor-end(PRIMARY, CUT_BUFFER0) \n\Shift <KeyPress> Insert:insert-selection(PRIMARY, CUT_BUFFER0) \n\ ~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\ ~Meta <Btn1Down>:select-start() \n\ ~Meta <Btn1Motion>:select-extend() \n\ !Ctrl <Btn2Down>:popup-menu(vtMenu) \n\ !Lock Ctrl <Btn2Down>:popup-menu(vtMenu) \n\ ~Ctrl ~Meta <Btn2Down>:ignore() \n\ ~Ctrl ~Meta <Btn2Up>:insert-selection(PRIMARY, CUT_BUFFER0) \n\ !Ctrl <Btn3Down>:popup-menu(fontMenu) \n\ !Lock Ctrl <Btn3Down>:popup-menu(fontMenu) \n\ ~Ctrl ~Meta <Btn3Down>:start-extend() \n\ ~Meta <Btn3Motion>:select-extend() \n\ <BtnUp>:select-end(PRIMARY, CUT_BUFFER0) \n\ <BtnDown>:bell(0) \";static XtActionsRec actionsList[] = { { "bell", HandleBell }, { "create-menu", HandleCreateMenu }, { "ignore", HandleIgnore }, { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */ { "insert-seven-bit", HandleKeyPressed }, { "insert-eight-bit", HandleEightBitKeyPressed }, { "insert-selection", HandleInsertSelection }, { "keymap", HandleKeymapChange }, { "popup-menu", HandlePopupMenu }, { "secure", HandleSecure }, { "select-start", HandleSelectStart }, { "select-extend", HandleSelectExtend }, { "select-end", HandleSelectEnd }, { "select-set", HandleSelectSet }, { "select-cursor-start", HandleKeyboardSelectStart }, { "select-cursor-end", HandleKeyboardSelectEnd }, { "set-vt-font", HandleSetFont }, { "start-extend", HandleStartExtend }, { "start-cursor-extend", HandleKeyboardStartExtend }, { "string", HandleStringEvent }, { "scroll-forw", HandleScrollForward }, { "scroll-back", HandleScrollBack }, /* 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 }, { "clear-saved-lines", HandleClearSavedLines }, { "set-terminal-type", HandleSetTerminalType }, { "set-visibility", HandleVisibility }, { "set-tek-text", HandleSetTekText }, { "tek-page", HandleTekPage }, { "tek-reset", HandleTekReset }, { "tek-copy", HandleTekCopy }, { "visual-bell", HandleVisualBell }, { "cursor-warp-button", CursorButton }};static XtResource resources[] = {{XtNfont, XtCFont, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, misc.f_n), XtRString, DEFFONT},{XtNboldFont, XtCBoldFont, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, misc.f_b), XtRString, DEFBOLDFONT},{XtNc132, XtCC132, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.c132), XtRBoolean, (caddr_t) &defaultFALSE},{XtNcharClass, XtCCharClass, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, screen.charClass), XtRString, (caddr_t) NULL},{XtNcurses, XtCCurses, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.curses), XtRBoolean, (caddr_t) &defaultFALSE},{XtNcutNewline, XtCCutNewline, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.cutNewline), XtRBoolean, (caddr_t) &defaultTRUE},{XtNcutToBeginningOfLine, XtCCutToBeginningOfLine, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.cutToBeginningOfLine), XtRBoolean, (caddr_t) &defaultTRUE},{XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, core.background_pixel), XtRString, "XtDefaultBackground"},{XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, screen.foreground), XtRString, "XtDefaultForeground"},{XtNcursorColor, XtCForeground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, screen.cursorcolor), XtRString, "XtDefaultForeground"},{XtNeightBitInput, XtCEightBitInput, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.input_eight_bits), XtRBoolean, (caddr_t) &defaultTRUE},{XtNeightBitOutput, XtCEightBitOutput, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.output_eight_bits), XtRBoolean, (caddr_t) &defaultTRUE},{XtNgeometry,XtCGeometry, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, misc.geo_metry), XtRString, (caddr_t) NULL},{XtNalwaysHighlight,XtCAlwaysHighlight,XtRBoolean, sizeof(Boolean),XtOffsetOf(XtermWidgetRec, screen.always_highlight), XtRBoolean, (caddr_t) &defaultFALSE},{XtNappcursorDefault,XtCAppcursorDefault,XtRBoolean, sizeof(Boolean),XtOffsetOf(XtermWidgetRec, misc.appcursorDefault), XtRBoolean, (XtPointer) &defaultFALSE},{XtNappkeypadDefault,XtCAppkeypadDefault,XtRBoolean, sizeof(Boolean),XtOffsetOf(XtermWidgetRec, misc.appkeypadDefault), XtRBoolean, (XtPointer) &defaultFALSE},{XtNbellSuppressTime, XtCBellSuppressTime, XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.bellSuppressTime), XtRInt, (XtPointer) &defaultBellSuppressTime},{XtNtekGeometry,XtCGeometry, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, misc.T_geometry), XtRString, (caddr_t) NULL},{XtNinternalBorder,XtCBorderWidth,XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.border), XtRInt, (caddr_t) &defaultIntBorder},{XtNjumpScroll, XtCJumpScroll, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.jumpscroll), XtRBoolean, (caddr_t) &defaultTRUE},#ifdef ALLOWLOGGING{XtNlogFile, XtCLogfile, XtRString, sizeof(char *), XtOffsetOf(XtermWidgetRec, screen.logfile), XtRString, (caddr_t) NULL},{XtNlogging, XtCLogging, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.log_on), XtRBoolean, (caddr_t) &defaultFALSE},{XtNlogInhibit, XtCLogInhibit, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.logInhibit), XtRBoolean, (caddr_t) &defaultFALSE},#endif{XtNloginShell, XtCLoginShell, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.login_shell), XtRBoolean, (caddr_t) &defaultFALSE},{XtNmarginBell, XtCMarginBell, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.marginbell), XtRBoolean, (caddr_t) &defaultFALSE},{XtNpointerColor, XtCForeground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, screen.mousecolor), XtRString, "XtDefaultForeground"},{XtNpointerColorBackground, XtCBackground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, screen.mousecolorback), XtRString, "XtDefaultBackground"},{XtNpointerShape,XtCCursor, XtRCursor, sizeof(Cursor), XtOffsetOf(XtermWidgetRec, screen.pointer_cursor), XtRString, (caddr_t) "xterm"},{XtNmultiClickTime,XtCMultiClickTime, XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.multiClickTime), XtRInt, (caddr_t) &defaultMultiClickTime},{XtNmultiScroll,XtCMultiScroll, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.multiscroll), XtRBoolean, (caddr_t) &defaultFALSE},{XtNnMarginBell,XtCColumn, XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.nmarginbell), XtRInt, (caddr_t) &defaultNMarginBell},{XtNreverseVideo,XtCReverseVideo,XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.re_verse), XtRBoolean, (caddr_t) &defaultFALSE},{XtNresizeGravity, XtCResizeGravity, XtRGravity, sizeof(XtGravity), XtOffsetOf(XtermWidgetRec, misc.resizeGravity), XtRImmediate, (XtPointer) SouthWestGravity},{XtNreverseWrap,XtCReverseWrap, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.reverseWrap), XtRBoolean, (caddr_t) &defaultFALSE},{XtNautoWrap,XtCAutoWrap, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.autoWrap), XtRBoolean, (caddr_t) &defaultTRUE},{XtNsaveLines, XtCSaveLines, XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.savelines), XtRInt, (caddr_t) &defaultSaveLines},{XtNscrollBar, XtCScrollBar, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.scrollbar), XtRBoolean, (caddr_t) &defaultFALSE},{XtNscrollTtyOutput,XtCScrollCond, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.scrollttyoutput), XtRBoolean, (caddr_t) &defaultTRUE},{XtNscrollKey, XtCScrollCond, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.scrollkey), XtRBoolean, (caddr_t) &defaultFALSE},{XtNscrollLines, XtCScrollLines, XtRInt, sizeof(int), XtOffsetOf(XtermWidgetRec, screen.scrolllines), XtRInt, (caddr_t) &defaultScrollLines},{XtNsignalInhibit,XtCSignalInhibit,XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.signalInhibit), XtRBoolean, (caddr_t) &defaultFALSE},{XtNtekInhibit, XtCTekInhibit, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.tekInhibit), XtRBoolean, (caddr_t) &defaultFALSE},{XtNtekSmall, XtCTekSmall, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.tekSmall), XtRBoolean, (caddr_t) &defaultFALSE},{XtNtekStartup, XtCTekStartup, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.TekEmu), XtRBoolean, (caddr_t) &defaultFALSE},{XtNtiteInhibit, XtCTiteInhibit, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.titeInhibit), XtRBoolean, (caddr_t) &defaultFALSE},{XtNvisualBell, XtCVisualBell, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.visualbell), XtRBoolean, (caddr_t) &defaultFALSE},{XtNallowSendEvents, XtCAllowSendEvents, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.allowSendEvents),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -