aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/xterm/Tekproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/xterm/Tekproc.c')
-rw-r--r--nx-X11/programs/xterm/Tekproc.c1782
1 files changed, 0 insertions, 1782 deletions
diff --git a/nx-X11/programs/xterm/Tekproc.c b/nx-X11/programs/xterm/Tekproc.c
deleted file mode 100644
index 0a6b79bd1..000000000
--- a/nx-X11/programs/xterm/Tekproc.c
+++ /dev/null
@@ -1,1782 +0,0 @@
-/* $XTermId: Tekproc.c,v 1.131 2005/11/03 13:17:27 tom Exp $ */
-
-/*
- * $Xorg: Tekproc.c,v 1.5 2001/02/09 02:06:02 xorgcvs Exp $
- *
- * Warning, there be crufty dragons here.
- */
-/* $XFree86: xc/programs/xterm/Tekproc.c,v 3.55 2005/11/03 13:17:27 dickey Exp $ */
-
-/*
-
-Copyright 2001-2004,2005 by Thomas E. Dickey
-
- All Rights Reserved
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name(s) of the above copyright
-holders shall not be used in advertising or otherwise to promote the
-sale, use or other dealings in this Software without prior written
-authorization.
-
-Copyright 1988 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
- * 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 */
-
-#define RES_OFFSET(field) XtOffsetOf(TekWidgetRec, field)
-
-#include <xterm.h>
-
-#include <X11/Xatom.h>
-#include <X11/Xutil.h>
-#include <X11/cursorfont.h>
-#include <X11/Xmu/CharSet.h>
-
-#if OPT_TOOLBAR
-
-#if defined(HAVE_LIB_XAW)
-#include <X11/Xaw/Form.h>
-#elif defined(HAVE_LIB_XAW3D)
-#include <X11/Xaw3d/Form.h>
-#elif defined(HAVE_LIB_NEXTAW)
-#include <X11/neXtaw/Form.h>
-#elif defined(HAVE_LIB_XAWPLUS)
-#include <X11/XawPlus/Form.h>
-#endif
-
-#endif /* OPT_TOOLBAR */
-
-#include <stdio.h>
-#include <ctype.h>
-#include <signal.h>
-
-#include <Tekparse.h>
-#include <data.h>
-#include <error.h>
-#include <menu.h>
-
-#define DefaultGCID XGContextFromGC(DefaultGC(screen->display, DefaultScreen(screen->display)))
-
-/* Tek defines */
-
-#define DOTDASHEDLINE 2
-#define DOTTEDLINE 1
-#define EAST 01
-#define LINEMASK 07
-#define LONGDASHEDLINE 4
-#define MARGIN1 0
-#define MARGIN2 1
-#define MAX_PTS 150
-#define MAX_VTX 300
-#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 WEST 02
-
-#define TekMove(x,y) screen->cur_X = x; screen->cur_Y = y
-#define input() Tinput()
-#define unput(c) *Tpushback++ = c
-/* *INDENT-OFF* */
-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 */
-};
-/* *INDENT-ON* */
-
-static Cursor GINcursor;
-static XSegment *line_pt;
-static int nplot;
-static TekLink Tek0;
-static jmp_buf Tekjump;
-static TekLink *TekRecord;
-static XSegment *Tline;
-
-static Const int *curstate = Talptable;
-static Const int *Tparsestate = Talptable;
-
-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\
-!Lock Ctrl @Num_Lock <Btn1Down>: popup-menu(mainMenu) \n\
- !Ctrl @Num_Lock <Btn1Down>: popup-menu(mainMenu) \n\
- !Ctrl <Btn2Down>: popup-menu(tekMenu) \n\
- !Lock Ctrl <Btn2Down>: popup-menu(tekMenu) \n\
-!Lock Ctrl @Num_Lock <Btn2Down>: popup-menu(tekMenu) \n\
- !Ctrl @Num_Lock <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)";
-/* *INDENT-OFF* */
-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 },
-#if OPT_TOOLBAR
- { "set-toolbar", HandleToolbar },
-#endif
-};
-/* *INDENT-ON* */
-
-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 2
-
-#ifdef VMS
-#define DFT_FONT_SMALL "FIXED"
-#else
-#define DFT_FONT_SMALL "6x10"
-#endif
-
-static 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},
- Fres("fontLarge", XtCFont, tek.Tfont[TEK_FONT_LARGE], "9x15"),
- Fres("font2", XtCFont, tek.Tfont[TEK_FONT_2], "6x13"),
- Fres("font3", XtCFont, tek.Tfont[TEK_FONT_3], "8x13"),
- Fres("fontSmall", XtCFont, tek.Tfont[TEK_FONT_SMALL], DFT_FONT_SMALL),
- Sres("initialFont", "InitialFont", tek.initial_font, "large"),
- Sres("ginTerminator", "GinTerminator", tek.gin_terminator_str, GIN_TERM_NONE_STR),
-#if OPT_TOOLBAR
- Wres(XtNmenuBar, XtCMenuBar, tek.tb_info.menu_bar, 0),
- Ires(XtNmenuHeight, XtCMenuHeight, tek.tb_info.menu_height, 25),
-#endif
-};
-
-static IChar Tinput(void);
-static int getpoint(void);
-static void TCursorBack(void);
-static void TCursorDown(void);
-static void TCursorForward(void);
-static void TCursorUp(void);
-static void TekBackground(TScreen * screen);
-static void TekConfigure(Widget w);
-static void TekDraw(int x, int y);
-static void TekEnq(unsigned status, int x, int y);
-static void TekFlush(void);
-static void TekInitialize(Widget request,
- Widget wnew,
- ArgList args,
- Cardinal *num_args);
-static void TekPage(void);
-static void TekRealize(Widget gw,
- XtValueMask * valuemaskp,
- XSetWindowAttributes * values);
-
-static WidgetClassRec tekClassRec =
-{
- {
-/* core_class fields */
- (WidgetClass) & widgetClassRec, /* superclass */
- "Tek4014", /* class_name */
- sizeof(TekWidgetRec), /* widget_size */
- NULL, /* class_initialize */
- NULL, /* class_part_initialize */
- False, /* class_inited */
- TekInitialize, /* initialize */
- NULL, /* initialize_hook */
- TekRealize, /* realize */
- actionsList, /* actions */
- XtNumber(actionsList), /* num_actions */
- resources, /* resources */
- XtNumber(resources), /* num_resources */
- NULLQUARK, /* xrm_class */
- True, /* compress_motion */
- True, /* compress_exposure */
- True, /* compress_enterleave */
- False, /* visible_interest */
- NULL, /* destroy */
- TekConfigure, /* resize */
- TekExpose, /* expose */
- NULL, /* set_values */
- NULL, /* set_values_hook */
- XtInheritSetValuesAlmost, /* set_values_almost */
- NULL, /* get_values_hook */
- NULL, /* accept_focus */
- XtVersion, /* version */
- NULL, /* callback_offsets */
- defaultTranslations, /* tm_table */
- XtInheritQueryGeometry, /* query_geometry */
- XtInheritDisplayAccelerator, /* display_accelerator */
- NULL /* extension */
- }
-};
-#define tekWidgetClass ((WidgetClass)&tekClassRec)
-
-static Bool Tfailed = False;
-
-int
-TekInit(void)
-{
- Widget form_top, menu_top;
-
- if (!Tfailed
- && tekWidget == 0) {
-
- TRACE(("TekInit\n"));
- /* this causes the Initialize method to be called */
- tekshellwidget =
- XtCreatePopupShell("tektronix", topLevelShellWidgetClass,
- toplevel, ourTopLevelShellArgs,
- number_ourTopLevelShellArgs);
-
- SetupMenus(tekshellwidget, &form_top, &menu_top);
-
- /* this causes the Realize method to be called */
- tekWidget = (TekWidget)
- XtVaCreateManagedWidget("tek4014",
- tekWidgetClass, form_top,
-#if OPT_TOOLBAR
- XtNmenuBar, menu_top,
- XtNresizable, True,
- XtNfromVert, menu_top,
- XtNtop, XawChainTop,
- XtNleft, XawChainLeft,
- XtNright, XawChainRight,
- XtNbottom, XawChainBottom,
-#endif
- (XtPointer) 0);
-#if OPT_TOOLBAR
- ShowToolbar(resource.toolBar);
-#endif
- }
- return (!Tfailed);
-}
-
-/*
- * If we haven't allocated the PtyData struct, do so.
- */
-int
-TekPtyData(void)
-{
- if (Tpushb == 0) {
- if ((Tpushb = TypeMallocN(Char, 10)) == NULL
- || (Tline = TypeMallocN(XSegment, MAX_VTX)) == NULL) {
- fprintf(stderr, "%s: Not enough core for Tek mode\n", xterm_name);
- if (Tpushb)
- free(Tpushb);
- Tfailed = True;
- return 0;
- }
- }
- return 1;
-}
-
-static void
-Tekparse(void)
-{
- TScreen *screen = &term->screen;
- int x, y;
- IChar c = 0;
- IChar ch;
- int nextstate;
-
- for (;;) {
- c = input();
- /*
- * The parsing tables all have 256 entries. If we're supporting
- * wide characters, we handle them by treating them the same as
- * printing characters.
- */
-#if OPT_WIDE_CHARS
- if (c > 255) {
- nextstate = (Tparsestate == Talptable)
- ? CASE_PRINT
- : CASE_IGNORE;
- } else
-#endif
- nextstate = Tparsestate[c];
- TRACE(("Tekparse %04X -> %d\n", c, nextstate));
-
- switch (nextstate) {
- case CASE_REPORT:
- TRACE(("case: report address\n"));
- 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:
- TRACE(("case: special return to vt102 mode\n"));
- Tparsestate = curstate;
- TekRecord->ptr[-1] = NAK; /* remove from recording */
- FlushLog(screen);
- return;
-
- case CASE_SPT_STATE:
- TRACE(("case: Enter Special Point Plot mode\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate = Tspttable;
- break;
-
- case CASE_GIN:
- TRACE(("case: Do Tek GIN mode\n"));
- screen->TekGIN = &TekRecord->ptr[-1];
- /* Set cross-hair cursor raster array */
- if ((GINcursor =
- make_colored_cursor(XC_tcross,
- T_COLOR(screen, MOUSE_FG),
- T_COLOR(screen, MOUSE_BG))) != 0) {
- XDefineCursor(screen->display, TWindow(screen),
- GINcursor);
- }
- Tparsestate = Tbyptable; /* Bypass mode */
- break;
-
- case CASE_BEL:
- TRACE(("case: BEL\n"));
- if (screen->TekGIN)
- TekGINoff();
- if (!TekRefresh)
- Bell(XkbBI_TerminalBell, 0);
- Tparsestate = curstate; /* clear bypass condition */
- break;
-
- case CASE_BS:
- TRACE(("case: BS\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate; /* clear bypass condition */
- TCursorBack();
- break;
-
- case CASE_PT_STATE:
- TRACE(("case: Enter Tek Point Plot mode\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate = Tpttable;
- break;
-
- case CASE_PLT_STATE:
- TRACE(("case: Enter Tek Plot mode\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate = Tplttable;
- if ((c = input()) == BEL)
- screen->pen = PENDOWN;
- else {
- unput(c);
- screen->pen = PENUP;
- }
- break;
-
- case CASE_TAB:
- TRACE(("case: HT\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate; /* clear bypass condition */
- TCursorForward();
- break;
-
- case CASE_IPL_STATE:
- TRACE(("case: Enter Tek Incremental Plot mode\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate = Tipltable;
- break;
-
- case CASE_ALP_STATE:
- TRACE(("case: Enter Tek Alpha mode from any other mode\n"));
- if (screen->TekGIN)
- TekGINoff();
- /* if in one of graphics states, move alpha cursor */
- if (nplot > 0) /* flush line VTbuffer */
- TekFlush();
- Tparsestate = curstate = Talptable;
- break;
-
- case CASE_UP:
- TRACE(("case: cursor up\n"));
- if (screen->TekGIN)
- TekGINoff();
- Tparsestate = curstate; /* clear bypass condition */
- TCursorUp();
- break;
-
- case CASE_COPY:
- TRACE(("case: make copy\n"));
- if (screen->TekGIN)
- TekGINoff();
- TekCopy();
- TekRecord->ptr[-1] = NAK; /* remove from recording */
- Tparsestate = curstate; /* clear bypass condition */
- break;
-
- case CASE_PAGE:
- TRACE(("case: Page Function\n"));
- if (screen->TekGIN)
- TekGINoff();
- TekPage(); /* clear bypass condition */
- break;
-
- case CASE_BES_STATE:
- TRACE(("case: Byp: an escape char\n"));
- Tparsestate = Tbestable;
- break;
-
- case CASE_BYP_STATE:
- TRACE(("case: set bypass condition\n"));
- Tparsestate = Tbyptable;
- break;
-
- case CASE_IGNORE:
- TRACE(("case: Esc: totally ignore CR, ESC, LF, ~\n"));
- break;
-
- case CASE_ASCII:
- TRACE(("case: Select ASCII char set\n"));
- /* ignore for now */
- Tparsestate = curstate;
- break;
-
- case CASE_APL:
- TRACE(("case: Select APL char set\n"));
- /* ignore for now */
- Tparsestate = curstate;
- break;
-
- case CASE_CHAR_SIZE:
- TRACE(("case: character size selector\n"));
- TekSetFontSize((int) (c & 03));
- Tparsestate = curstate;
- break;
-
- case CASE_BEAM_VEC:
- TRACE(("case: beam and vector selector\n"));
- /* 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:
- TRACE(("case: Ipl: penup\n"));
- screen->pen = PENUP;
- break;
-
- case CASE_PENDOWN:
- TRACE(("case: Ipl: pendown\n"));
- screen->pen = PENDOWN;
- break;
-
- case CASE_IPL_POINT:
- TRACE(("case: Ipl: point\n"));
- 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:
- TRACE(("case: Plt: vector\n"));
- 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:
- TRACE(("case: Pt: point\n"));
- unput(c);
- if (getpoint()) {
- TekMove(screen->cur.x, screen->cur.y);
- TekDraw(screen->cur.x, screen->cur.y);
- }
- break;
-
- case CASE_SPT_POINT:
- TRACE(("case: Spt: point\n"));
- /* 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:
- TRACE(("case: CR\n"));
- if (screen->TekGIN)
- TekGINoff();
- if (nplot > 0) /* flush line VTbuffer */
- TekFlush();
- screen->cur_X = screen->margin == MARGIN1 ? 0 :
- TEKWIDTH / 2;
- Tparsestate = curstate = Talptable;
- break;
-
- case CASE_ESC_STATE:
- TRACE(("case: ESC\n"));
- Tparsestate = Tesctable;
- break;
-
- case CASE_LF:
- TRACE(("case: LF\n"));
- if (screen->TekGIN)
- TekGINoff();
- TCursorDown();
- if (!TekRefresh)
- do_xevents();
- break;
-
- case CASE_SP:
- TRACE(("case: SP\n"));
- TCursorForward();
- break;
-
- case CASE_PRINT:
- TRACE(("case: printable character\n"));
- ch = c;
- c = screen->cur.fontsize;
- x = (int) (screen->cur_X * TekScale(screen))
- + screen->border;
- y = (int) ((TEKHEIGHT + TEKTOPPAD - screen->cur_Y) * TekScale(screen))
- + screen->border;
-
-#if OPT_WIDE_CHARS
- if (screen->wide_chars
- && (ch > 255)) {
- XChar2b sbuf;
- sbuf.byte2 = CharOf(ch);
- sbuf.byte1 = CharOf(ch >> 8);
- XDrawImageString16(screen->display,
- TWindow(screen),
- screen->TnormalGC,
- x,
- y,
- &sbuf,
- 1);
- } else
-#endif
- XDrawString(screen->display,
- TWindow(screen),
- screen->TnormalGC,
- x,
- y,
- (char *) &ch,
- 1);
- TCursorForward();
- break;
- case CASE_OSC:
- /* FIXME: someone should disentangle the input queues
- * of this code so that it can be state-driven.
- */
- TRACE(("case: do osc escape\n"));
- {
- Char buf2[512];
- IChar c2;
- unsigned len = 0;
- while ((c2 = input()) != BEL) {
- if (!isprint(c2 & 0x7f)
- || len + 2 >= (int) sizeof(buf2))
- break;
- buf2[len++] = c2;
- }
- buf2[len] = 0;
- if (c2 == BEL)
- do_osc(buf2, len, BEL);
- }
- Tparsestate = curstate;
- break;
- }
- }
-}
-
-static int rcnt;
-static char *rptr;
-static PtySelect Tselect_mask;
-
-static IChar
-Tinput(void)
-{
- TScreen *screen = &term->screen;
- TekLink *tek;
-
- if (Tpushback > Tpushb)
- return (*--Tpushback);
- if (TekRefresh) {
- if (rcnt-- > 0)
- return (*rptr++);
- if ((tek = TekRefresh->next) != 0) {
- TekRefresh = tek;
- rptr = tek->data;
- rcnt = tek->count - 1;
- TekSetFontSize(tek->fontsize);
- return (*rptr++);
- }
- TekRefresh = (TekLink *) 0;
- longjmp(Tekjump, 1);
- }
- again:
- if (VTbuffer->next >= VTbuffer->last) {
- int update = VTbuffer->update;
-
- if (nplot > 0) /* flush line */
- TekFlush();
-#ifdef VMS
- Tselect_mask = pty_mask; /* force a read */
-#else /* VMS */
- XFD_COPYSET(&pty_mask, &Tselect_mask);
-#endif /* VMS */
- for (;;) {
-#ifdef CRAY
- struct timeval crocktimeout;
- crocktimeout.tv_sec = 0;
- crocktimeout.tv_usec = 0;
- (void) Select(max_plus1,
- &Tselect_mask, NULL, NULL,
- &crocktimeout);
-#endif
- if (readPtyData(screen, &Tselect_mask, VTbuffer)) {
- break;
- }
- if (Ttoggled && curstate == Talptable) {
- TCursorToggle(TOGGLE);
- Ttoggled = False;
- }
- if (XtAppPending(app_con) & XtIMXEvent) {
-#ifdef VMS
- Tselect_mask = X_mask;
-#else /* VMS */
- XFD_COPYSET(&X_mask, &Tselect_mask);
-#endif /* VMS */
- } else {
- XFlush(screen->display);
-#ifdef VMS
- Tselect_mask = Select_mask;
-
-#else /* VMS */
- XFD_COPYSET(&Select_mask, &Tselect_mask);
- if (Select(max_plus1, &Tselect_mask, NULL, NULL, NULL) < 0) {
- if (errno != EINTR)
- SysError(ERROR_TSELECT);
- continue;
- }
-#endif /* VMS */
- }
-#ifdef VMS
- if (Tselect_mask & X_mask) {
- xevents();
- if (VTbuffer->update != update)
- goto again;
- }
-#else /* VMS */
- if (FD_ISSET(ConnectionNumber(screen->display), &Tselect_mask)) {
- xevents();
- if (VTbuffer->update != update)
- goto again;
- }
-#endif /* VMS */
- }
- 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 = CastMalloc(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++;
-
- (void) morePtyData(screen, VTbuffer);
- return (*tek->ptr++ = nextPtyData(screen, VTbuffer));
-}
-
-/* this should become the Tek Widget's Resize proc */
-static void
-TekConfigure(Widget w)
-{
- TScreen *screen = &term->screen;
- int border = 2 * screen->border;
- 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(Widget w GCC_UNUSED,
- XEvent * event GCC_UNUSED,
- Region region GCC_UNUSED)
-{
- TScreen *screen = &term->screen;
-
- TRACE(("TekExpose\n"));
-
-#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;
- TRACE(("TekExpose resets data to replay %d bytes\n", rcnt));
- if (waiting_for_initial_map)
- first_map_occurred();
- if (!screen->waitrefresh)
- dorefresh();
-}
-
-void
-dorefresh(void)
-{
- TScreen *screen = &term->screen;
- static Cursor wait_cursor = None;
-
- if (wait_cursor == None)
- wait_cursor = make_colored_cursor(XC_watch,
- T_COLOR(screen, MOUSE_FG),
- T_COLOR(screen, MOUSE_BG));
- XDefineCursor(screen->display, TWindow(screen), wait_cursor);
- XFlush(screen->display);
- if (!setjmp(Tekjump))
- Tekparse();
- XDefineCursor(screen->display, TWindow(screen),
- (screen->TekGIN && GINcursor) ? GINcursor : screen->arrow);
-}
-
-static void
-TekPage(void)
-{
- TScreen *screen = &term->screen;
- 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(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 03
-
-static int
-getpoint(void)
-{
- int c, x, y, e, lo_y = 0;
- 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++;
- }
-}
-
-static void
-TCursorBack(void)
-{
- TScreen *screen = &term->screen;
- struct Tek_Char *t;
- 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;
- }
-}
-
-static void
-TCursorForward(void)
-{
- TScreen *screen = &term->screen;
- struct Tek_Char *t;
- 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;
- }
-}
-
-static void
-TCursorUp(void)
-{
- TScreen *screen = &term->screen;
- struct Tek_Char *t;
- 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;
-}
-
-static void
-TCursorDown(void)
-{
- TScreen *screen = &term->screen;
- struct Tek_Char *t;
- 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 void
-AddToDraw(int x1, int y1, int x2, int y2)
-{
- TScreen *screen = &term->screen;
- XSegment *lp;
-
- TRACE(("AddToDraw (%d,%d) (%d,%d)\n", x1, y1, x2, y2));
- if (nplot >= MAX_PTS) {
- TekFlush();
- }
- lp = line_pt++;
- lp->x1 = x1 = (int) (x1 * TekScale(screen) + screen->border);
- lp->y1 = y1 = (int) ((TEKHEIGHT + TEKTOPPAD - y1) * TekScale(screen) +
- screen->border);
- lp->x2 = x2 = (int) (x2 * TekScale(screen) + screen->border);
- lp->y2 = y2 = (int) ((TEKHEIGHT + TEKTOPPAD - y2) * TekScale(screen) +
- screen->border);
- nplot++;
- TRACE(("...AddToDraw %d points\n", nplot));
-}
-
-static void
-TekDraw(int x, int y)
-{
- 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;
-}
-
-static void
-TekFlush(void)
-{
- TScreen *screen = &term->screen;
-
- TRACE(("TekFlush\n"));
- XDrawSegments(screen->display, TWindow(screen),
- ((screen->cur.linetype == SOLIDLINE) ? screen->TnormalGC :
- screen->linepat[screen->cur.linetype - 1]),
- Tline, nplot);
- nplot = 0;
- line_pt = Tline;
-}
-
-void
-TekGINoff(void)
-{
- TScreen *screen = &term->screen;
-
- TRACE(("TekGINoff\n"));
- XDefineCursor(screen->display, TWindow(screen), screen->arrow);
- if (GINcursor)
- XFreeCursor(screen->display, GINcursor);
- if (screen->TekGIN) {
- *screen->TekGIN = CAN; /* modify recording */
- screen->TekGIN = NULL;
- }
-}
-
-void
-TekEnqMouse(int c) /* character pressed */
-{
- TScreen *screen = &term->screen;
- int mousex, mousey, rootx, rooty;
- unsigned int mask; /* XQueryPointer */
- Window root, subw;
-
- TRACE(("TekEnqMouse\n"));
- XQueryPointer(
- screen->display, TWindow(screen),
- &root, &subw,
- &rootx, &rooty,
- &mousex, &mousey,
- &mask);
- if ((mousex = (int) ((mousex - screen->border) / TekScale(screen))) < 0)
- mousex = 0;
- else if (mousex >= TEKWIDTH)
- mousex = TEKWIDTH - 1;
- if ((mousey = (int) (TEKHEIGHT + TEKTOPPAD - (mousey - screen->border) /
- TekScale(screen))) < 0)
- mousey = 0;
- else if (mousey >= TEKHEIGHT)
- mousey = TEKHEIGHT - 1;
- TekEnq((unsigned) c, mousex, mousey);
-}
-
-static void
-TekEnq(unsigned status,
- int x,
- int y)
-{
- TScreen *screen = &term->screen;
- Char cplot[7];
- int len = 5;
- int adj = (status != 0) ? 0 : 1;
-
- TRACE(("TekEnq\n"));
- 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';
-#ifdef VMS
- tt_write(cplot + adj, len - adj);
-#else /* VMS */
- v_write(screen->respond, cplot + adj, (unsigned) (len - adj));
-#endif /* VMS */
-}
-
-void
-TekRun(void)
-{
- TScreen *screen = &term->screen;
-
- TRACE(("TekRun ...\n"));
-
- 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;
- Ttoggled = True;
- if (!setjmp(Tekend))
- Tekparse();
- if (!Ttoggled) {
- TCursorToggle(TOGGLE);
- Ttoggled = True;
- }
- screen->TekEmu = False;
-}
-
-#define DOTTED_LENGTH 2
-#define DOT_DASHED_LENGTH 4
-#define SHORT_DASHED_LENGTH 2
-#define LONG_DASHED_LENGTH 2
-
-static int dash_length[TEKNUMLINES] =
-{
- DOTTED_LENGTH,
- DOT_DASHED_LENGTH,
- SHORT_DASHED_LENGTH,
- LONG_DASHED_LENGTH,
-};
-
-static unsigned char dotted[DOTTED_LENGTH] =
-{3, 1};
-static unsigned char dot_dashed[DOT_DASHED_LENGTH] =
-{3, 4, 3, 1};
-static unsigned char short_dashed[SHORT_DASHED_LENGTH] =
-{4, 4};
-static unsigned char long_dashed[LONG_DASHED_LENGTH] =
-{4, 7};
-
-static unsigned char *dashes[TEKNUMLINES] =
-{
- dotted,
- dot_dashed,
- short_dashed,
- long_dashed,
-};
-
-/*
- * The following is called to create the tekWidget
- */
-
-static void
-TekInitialize(Widget request GCC_UNUSED,
- Widget wnew GCC_UNUSED,
- ArgList args GCC_UNUSED,
- Cardinal *num_args GCC_UNUSED)
-{
- Widget tekparent = SHELL_OF(wnew);
-
- TRACE(("TekInitialize\n"));
-
- /* look for focus related events on the shell, because we need
- * to care about the shell's border being part of our focus.
- */
- XtAddEventHandler(tekparent, EnterWindowMask, False,
- HandleEnterWindow, (Opaque) 0);
- XtAddEventHandler(tekparent, LeaveWindowMask, False,
- HandleLeaveWindow, (Opaque) 0);
- XtAddEventHandler(tekparent, FocusChangeMask, False,
- HandleFocusChange, (Opaque) 0);
- XtAddEventHandler((Widget) wnew, PropertyChangeMask, False,
- HandleBellPropertyChange, (Opaque) 0);
-}
-
-static void
-TekRealize(Widget gw GCC_UNUSED, /* same as tekWidget */
- XtValueMask * valuemaskp,
- XSetWindowAttributes * values)
-{
- TScreen *screen = &term->screen;
- int i;
- TekLink *tek;
- double d;
- int border = 2 * screen->border;
- int pr;
- XGCValues gcv;
- int winX, winY, width, height;
- XSizeHints sizehints;
- char Tdefault[32];
- unsigned TEKgcFontMask;
-
- TRACE(("TekRealize\n"));
-
-#ifndef NO_ACTIVE_ICON
- term->screen.whichTwin = &term->screen.fullTwin;
-#endif /* NO_ACTIVE_ICON */
-
- BorderPixel(tekWidget) = BorderPixel(term);
-
- for (i = 0; i < TEKNUMFONTS; i++) {
- if (!tekWidget->tek.Tfont[i]) {
- tekWidget->tek.Tfont[i] = XQueryFont(screen->display, DefaultGCID);
- }
- TRACE(("Tfont[%d] %dx%d\n",
- i,
- tekWidget->tek.Tfont[i]->ascent +
- tekWidget->tek.Tfont[i]->descent,
- tekWidget->tek.Tfont[i]->max_bounds.width));
- tekWidget->tek.tobaseline[i] = tekWidget->tek.Tfont[i]->ascent;
- }
-
- if (!TekPtyData())
- return;
-
- if (term->misc.T_geometry == NULL) {
- int defwidth, defheight;
-
- if (term->misc.tekSmall) {
- defwidth = TEKMINWIDTH;
- defheight = TEKMINHEIGHT;
- } else {
- defwidth = TEKDEFWIDTH;
- defheight = TEKDEFHEIGHT;
- }
- sprintf(Tdefault, "=%dx%d", defwidth + border, defheight + border);
- term->misc.T_geometry = Tdefault;
- }
-
- winX = 1;
- winY = 1;
- width = TEKDEFWIDTH + border;
- height = TEKDEFHEIGHT + border;
-
- TRACE(("parsing T_geometry %s\n", NonNull(term->misc.T_geometry)));
- pr = XParseGeometry(term->misc.T_geometry,
- &winX,
- &winY,
- (unsigned int *) &width,
- (unsigned int *) &height);
- TRACE(("... position %d,%d size %dx%d\n", winY, winX, height, width));
- if ((pr & XValue) && (pr & XNegative))
- winX += DisplayWidth(screen->display, DefaultScreen(screen->display))
- - width - (BorderWidth(SHELL_OF(term)) * 2);
- if ((pr & YValue) && (pr & YNegative))
- winY += DisplayHeight(screen->display, DefaultScreen(screen->display))
- - height - (BorderWidth(SHELL_OF(term)) * 2);
-
- /* set up size hints */
- sizehints.min_width = TEKMINWIDTH + border;
- sizehints.min_height = TEKMINHEIGHT + border;
- sizehints.width_inc = 1;
- sizehints.height_inc = 1;
- sizehints.flags = PMinSize | PResizeInc;
- sizehints.x = winX;
- sizehints.y = winY;
- if ((XValue & pr) || (YValue & pr)) {
- sizehints.flags |= USSize | USPosition;
- sizehints.flags |= PWinGravity;
- switch (pr & (XNegative | YNegative)) {
- case 0:
- sizehints.win_gravity = NorthWestGravity;
- break;
- case XNegative:
- sizehints.win_gravity = NorthEastGravity;
- break;
- case YNegative:
- sizehints.win_gravity = SouthWestGravity;
- break;
- default:
- sizehints.win_gravity = SouthEastGravity;
- break;
- }
- } else {
- /* set a default size, but do *not* set position */
- sizehints.flags |= PSize;
- }
- sizehints.width = width;
- sizehints.height = height;
- if ((WidthValue & pr) || (HeightValue & pr))
- sizehints.flags |= USSize;
- else
- sizehints.flags |= PSize;
-
- TRACE(("make resize request %dx%d\n", height, width));
- (void) XtMakeResizeRequest((Widget) tekWidget,
- width, height,
- &tekWidget->core.width, &tekWidget->core.height);
- TRACE(("...made resize request %dx%d\n", tekWidget->core.height, tekWidget->core.width));
-
- /* XXX This is bogus. We are parsing geometries too late. This
- * is information that the shell widget ought to have before we get
- * realized, so that it can do the right thing.
- */
- if (sizehints.flags & USPosition)
- XMoveWindow(XtDisplay(tekWidget), TShellWindow, sizehints.x, sizehints.y);
-
- XSetWMNormalHints(XtDisplay(tekWidget), TShellWindow, &sizehints);
- XFlush(XtDisplay(tekWidget)); /* get it out to window manager */
-
- values->win_gravity = NorthWestGravity;
- values->background_pixel = T_COLOR(screen, TEK_BG);
-
- XtWindow(tekWidget) = TWindow(screen) =
- XCreateWindow(screen->display,
- XtWindow(SHELL_OF(tekWidget)),
- tekWidget->core.x, tekWidget->core.y,
- tekWidget->core.width, tekWidget->core.height, BorderWidth(tekWidget),
- (int) tekWidget->core.depth,
- InputOutput, CopyFromParent,
- ((*valuemaskp) | CWBackPixel | CWWinGravity),
- values);
-
- TFullWidth(screen) = width;
- TFullHeight(screen) = height;
- TWidth(screen) = width - border;
- THeight(screen) = height - border;
- TekScale(screen) = (double) TWidth(screen) / TEKWIDTH;
- if ((d = (double) THeight(screen) / (TEKHEIGHT + TEKTOPPAD +
- TEKBOTTOMPAD)) < TekScale(screen))
- TekScale(screen) = d;
-
- screen->cur.fontsize = TEK_FONT_LARGE;
- if (tekWidget->tek.initial_font) {
- char *s = tekWidget->tek.initial_font;
-
- if (XmuCompareISOLatin1(s, "large") == 0)
- screen->cur.fontsize = TEK_FONT_LARGE;
- else if (XmuCompareISOLatin1(s, "2") == 0 ||
- XmuCompareISOLatin1(s, "two") == 0)
- screen->cur.fontsize = TEK_FONT_2;
- else if (XmuCompareISOLatin1(s, "3") == 0 ||
- XmuCompareISOLatin1(s, "three") == 0)
- screen->cur.fontsize = TEK_FONT_3;
- else if (XmuCompareISOLatin1(s, "small") == 0)
- screen->cur.fontsize = TEK_FONT_SMALL;
- }
-#define TestGIN(s) XmuCompareISOLatin1(tekWidget->tek.gin_terminator_str, s)
-
- if (TestGIN(GIN_TERM_NONE_STR) == 0)
- screen->gin_terminator = GIN_TERM_NONE;
- else if (TestGIN(GIN_TERM_CR_STR) == 0)
- screen->gin_terminator = GIN_TERM_CR;
- else if (TestGIN(GIN_TERM_EOT_STR) == 0)
- screen->gin_terminator = GIN_TERM_EOT;
- else
- fprintf(stderr, "%s: illegal GIN terminator setting \"%s\"\n",
- xterm_name, tekWidget->tek.gin_terminator_str);
-
- gcv.graphics_exposures = True; /* default */
- gcv.font = tekWidget->tek.Tfont[screen->cur.fontsize]->fid;
- gcv.foreground = T_COLOR(screen, TEK_FG);
- gcv.background = T_COLOR(screen, TEK_BG);
-
- /* if font wasn't successfully opened, then gcv.font will contain
- the Default GC's ID, meaning that we must use the server default font.
- */
- TEKgcFontMask = (gcv.font == DefaultGCID) ? 0 : GCFont;
- screen->TnormalGC = XCreateGC(screen->display, TWindow(screen),
- (TEKgcFontMask | GCGraphicsExposures |
- GCForeground | GCBackground),
- &gcv);
-
- gcv.function = GXinvert;
- gcv.plane_mask = (T_COLOR(screen, TEK_BG) ^
- T_COLOR(screen, TEK_CURSOR));
- gcv.join_style = JoinMiter; /* default */
- gcv.line_width = 1;
- screen->TcursorGC = XCreateGC(screen->display, TWindow(screen),
- (GCFunction | GCPlaneMask), &gcv);
-
- gcv.foreground = T_COLOR(screen, TEK_FG);
- gcv.line_style = LineOnOffDash;
- gcv.line_width = 0;
- for (i = 0; i < TEKNUMLINES; i++) {
- screen->linepat[i] = XCreateGC(screen->display, TWindow(screen),
- (GCForeground | GCLineStyle), &gcv);
- XSetDashes(screen->display, screen->linepat[i], 0,
- (char *) dashes[i], dash_length[i]);
- }
-
- TekBackground(screen);
-
- screen->margin = MARGIN1; /* Margin 1 */
- screen->TekGIN = False; /* GIN off */
-
- XDefineCursor(screen->display, TWindow(screen), screen->pointer_cursor);
-
- { /* there's gotta be a better way... */
- static Arg args[] =
- {
- {XtNtitle, (XtArgVal) NULL},
- {XtNiconName, (XtArgVal) NULL},
- };
- char *icon_name, *title, *tek_icon_name, *tek_title;
-
- args[0].value = (XtArgVal) & icon_name;
- args[1].value = (XtArgVal) & title;
- XtGetValues(SHELL_OF(tekWidget), args, 2);
- tek_icon_name = XtMalloc(strlen(icon_name) + 7);
- strcpy(tek_icon_name, icon_name);
- strcat(tek_icon_name, "(Tek)");
- tek_title = XtMalloc(strlen(title) + 7);
- strcpy(tek_title, title);
- strcat(tek_title, "(Tek)");
- args[0].value = (XtArgVal) tek_icon_name;
- args[1].value = (XtArgVal) tek_title;
- XtSetValues(SHELL_OF(tekWidget), args, 2);
- XtFree(tek_icon_name);
- XtFree(tek_title);
- }
-
- tek = TekRecord = &Tek0;
- tek->next = (TekLink *) 0;
- tek->fontsize = screen->cur.fontsize;
- tek->count = 0;
- tek->ptr = tek->data;
- Tpushback = Tpushb;
- screen->cur_X = 0;
- screen->cur_Y = TEKHOME;
- line_pt = Tline;
- Ttoggled = True;
- screen->page = screen->cur;
- return;
-}
-
-void
-TekSetFontSize(int newitem)
-{
- TScreen *screen = &term->screen;
- int oldsize = screen->cur.fontsize;
- int newsize = MI2FS(newitem);
- Font fid;
-
- TRACE(("TekSetFontSize(%d)\n", newitem));
-
- if (!tekWidget || oldsize == newsize)
- return;
- if (!Ttoggled)
- TCursorToggle(TOGGLE);
- set_tekfont_menu_item(oldsize, False);
-
- fid = tekWidget->tek.Tfont[newsize]->fid;
- if (fid == DefaultGCID)
- /* we didn't succeed in opening a real font
- for this size. Instead, use server default. */
- XCopyGC(screen->display,
- DefaultGC(screen->display, DefaultScreen(screen->display)),
- GCFont, screen->TnormalGC);
- else
- XSetFont(screen->display, screen->TnormalGC, fid);
-
- screen->cur.fontsize = newsize;
- set_tekfont_menu_item(newsize, True);
- if (!Ttoggled)
- TCursorToggle(TOGGLE);
-}
-
-void
-ChangeTekColors(TScreen * screen, ScrnColors * pNew)
-{
- int i;
- XGCValues gcv;
-
- if (COLOR_DEFINED(pNew, TEK_FG)) {
- T_COLOR(screen, TEK_FG) = COLOR_VALUE(pNew, TEK_FG);
- TRACE(("... TEK_FG: %#lx\n", T_COLOR(screen, TEK_FG)));
- }
- if (COLOR_DEFINED(pNew, TEK_BG)) {
- T_COLOR(screen, TEK_BG) = COLOR_VALUE(pNew, TEK_BG);
- TRACE(("... TEK_BG: %#lx\n", T_COLOR(screen, TEK_BG)));
- }
- if (COLOR_DEFINED(pNew, TEK_CURSOR)) {
- T_COLOR(screen, TEK_CURSOR) = COLOR_VALUE(pNew, TEK_CURSOR);
- TRACE(("... TEK_CURSOR: %#lx\n", T_COLOR(screen, TEK_CURSOR)));
- } else {
- T_COLOR(screen, TEK_CURSOR) = T_COLOR(screen, TEK_FG);
- TRACE(("... TEK_CURSOR: %#lx\n", T_COLOR(screen, TEK_CURSOR)));
- }
-
- if (tekWidget) {
- XSetForeground(screen->display, screen->TnormalGC,
- T_COLOR(screen, TEK_FG));
- XSetBackground(screen->display, screen->TnormalGC,
- T_COLOR(screen, TEK_BG));
- if (BorderPixel(tekWidget) == T_COLOR(screen, TEK_BG)) {
- BorderPixel(tekWidget) = T_COLOR(screen, TEK_FG);
- BorderPixel(XtParent(tekWidget)) = T_COLOR(screen, TEK_FG);
- if (XtWindow(XtParent(tekWidget)))
- XSetWindowBorder(screen->display,
- XtWindow(XtParent(tekWidget)),
- BorderPixel(tekWidget));
- }
-
- for (i = 0; i < TEKNUMLINES; i++) {
- XSetForeground(screen->display, screen->linepat[i],
- T_COLOR(screen, TEK_FG));
- }
-
- gcv.plane_mask = (T_COLOR(screen, TEK_BG) ^
- T_COLOR(screen, TEK_CURSOR));
- XChangeGC(screen->display, screen->TcursorGC, GCPlaneMask, &gcv);
- TekBackground(screen);
- }
- return;
-}
-
-void
-TekReverseVideo(TScreen * screen)
-{
- int i;
- XGCValues gcv;
-
- EXCHANGE(T_COLOR(screen, TEK_FG), T_COLOR(screen, TEK_BG), i);
-
- T_COLOR(screen, TEK_CURSOR) = T_COLOR(screen, TEK_FG);
-
- if (tekWidget) {
- XSetForeground(screen->display, screen->TnormalGC, T_COLOR(screen, TEK_FG));
- XSetBackground(screen->display, screen->TnormalGC, T_COLOR(screen, TEK_BG));
-
- if (BorderPixel(tekWidget) == T_COLOR(screen, TEK_BG)) {
- BorderPixel(tekWidget) = T_COLOR(screen, TEK_FG);
- BorderPixel(XtParent(tekWidget)) = T_COLOR(screen, TEK_FG);
- if (XtWindow(XtParent(tekWidget)))
- XSetWindowBorder(screen->display,
- XtWindow(XtParent(tekWidget)),
- BorderPixel(tekWidget));
- }
-
- for (i = 0; i < TEKNUMLINES; i++) {
- XSetForeground(screen->display, screen->linepat[i],
- T_COLOR(screen, TEK_FG));
- }
-
- gcv.plane_mask = (T_COLOR(screen, TEK_BG) ^
- T_COLOR(screen, TEK_CURSOR));
- XChangeGC(screen->display, screen->TcursorGC, GCPlaneMask, &gcv);
- TekBackground(screen);
- }
-}
-
-static void
-TekBackground(TScreen * screen)
-{
- if (TWindow(screen))
- XSetWindowBackground(screen->display, TWindow(screen),
- T_COLOR(screen, TEK_BG));
-}
-
-/*
- * Toggles cursor on or off at cursor position in screen.
- */
-void
-TCursorToggle(int toggle) /* TOGGLE or CLEAR */
-{
- TScreen *screen = &term->screen;
- int c, x, y;
- unsigned int cellwidth, cellheight;
-
- if (!screen->Tshow)
- return;
-
- c = screen->cur.fontsize;
- cellwidth = (unsigned) tekWidget->tek.Tfont[c]->max_bounds.width;
- cellheight = (unsigned) (tekWidget->tek.Tfont[c]->ascent +
- tekWidget->tek.Tfont[c]->descent);
-
- x = (int) ((screen->cur_X * TekScale(screen)) + screen->border);
- y = (int) (((TEKHEIGHT + TEKTOPPAD - screen->cur_Y) * TekScale(screen))
- + screen->border - tekWidget->tek.tobaseline[c]);
-
- if (toggle == TOGGLE) {
- if (screen->select || screen->always_highlight)
- XFillRectangle(screen->display, TWindow(screen),
- screen->TcursorGC, x, y,
- cellwidth, cellheight);
- else { /* fix to use different GC! */
- XDrawRectangle(screen->display, TWindow(screen),
- screen->TcursorGC, x, y,
- cellwidth - 1, cellheight - 1);
- }
- } else {
- /* Clear the entire rectangle, even though we may only
- * have drawn an outline. This fits with our refresh
- * scheme of redrawing the entire window on any expose
- * event and is easier than trying to figure out exactly
- * which part of the cursor needs to be erased.
- */
- XClearArea(screen->display, TWindow(screen), x, y,
- cellwidth, cellheight, False);
- }
-}
-
-void
-TekSimulatePageButton(Bool reset)
-{
- TScreen *screen = &term->screen;
-
- if (!tekWidget)
- return;
- if (reset) {
- bzero((char *) &screen->cur, sizeof screen->cur);
- }
- TekRefresh = (TekLink *) 0;
- TekPage();
- screen->cur_X = 0;
- screen->cur_Y = TEKHOME;
-}
-
-/* write copy of screen to a file */
-
-void
-TekCopy(void)
-{
- TScreen *screen = &term->screen;
-
- TekLink *Tp;
- char buf[32];
- char initbuf[5];
- int tekcopyfd;
-
- timestamp_filename(buf, "COPY");
- if (access(buf, F_OK) >= 0
- && access(buf, W_OK) < 0) {
- Bell(XkbBI_MinorError, 0);
- return;
- }
-#ifndef VMS
- if (access(".", W_OK) < 0) { /* can't write in directory */
- Bell(XkbBI_MinorError, 0);
- return;
- }
-#endif
-
- if ((tekcopyfd = open_userfile(screen->uid, screen->gid, buf, False)) >= 0) {
- sprintf(initbuf, "%c%c%c%c",
- ESC, (char) (screen->page.fontsize + '8'),
- ESC, (char) (screen->page.linetype + '`'));
- write(tekcopyfd, initbuf, 4);
- Tp = &Tek0;
- do {
- write(tekcopyfd, Tp->data, Tp->count);
- Tp = Tp->next;
- } while (Tp);
- close(tekcopyfd);
- }
-}