[comp.sources.x] v09i038: colxterm -- Color xterm, Part08/14

tomw@orac.esd.sgi.com (Tom Weinstein) (09/14/90)

Submitted-by: Tom Weinstein <tomw@orac.esd.sgi.com>
Posting-number: Volume 9, Issue 38
Archive-name: colxterm/part08

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of archive 8 (of 14)."
# Contents:  xterm/menu.c xterm/misc.c xterm/termcap.bold
# Wrapped by argv@turnpike on Thu Sep 13 20:42:26 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xterm/menu.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xterm/menu.c'\"
else
echo shar: Extracting \"'xterm/menu.c'\" \(27111 characters\)
sed "s/^X//" >'xterm/menu.c' <<'END_OF_FILE'
X/* Copyright 1989 Massachusetts Institute of Technology */
X
X#include <stdio.h>
X#include <X11/Intrinsic.h>
X#include <X11/StringDefs.h>
X#include <X11/Shell.h>
X#include <X11/Xaw/SimpleMenu.h>
X#include <X11/Xaw/SmeBSB.h>
X#include <X11/Xaw/SmeLine.h>
X#include "ptyx.h"
X#include <setjmp.h>			/* for data.h */
X#include "data.h"
X#include "menu.h"
X
XArg menuArgs[2] = {{ XtNleftBitmap, (XtArgVal) 0 },
X		   { XtNsensitive, (XtArgVal) 0 }};
X
Xstatic void do_securekbd(), do_allowsends(), do_visualbell(), do_logging(),
X  do_redraw(), do_suspend(), do_continue(), do_interrupt(), do_hangup(),
X  do_terminate(), do_kill(), do_quit(), do_scrollbar(), do_jumpscroll(),
X  do_reversevideo(), do_autowrap(), do_reversewrap(), do_autolinefeed(),
X  do_appcursor(), do_appkeypad(), do_scrollkey(), do_scrollttyoutput(),
X  do_allow132(), do_cursesemul(), do_marginbell(), do_tekshow(), 
X  do_altscreen(), do_softreset(), do_hardreset(), do_tekmode(), do_vthide(), 
X  do_tektextlarge(), do_tektext2(), do_tektext3(), do_tektextsmall(), 
X  do_tekpage(), do_tekreset(), do_tekcopy(), do_vtshow(), do_vtmode(), 
X  do_tekhide(), do_vtfont(), do_bltscroll();
X
X
X/*
X * The order entries MUST match the values given in menu.h
X */
XMenuEntry mainMenuEntries[] = {
X    { "securekbd",	do_securekbd, NULL },		/*  0 */
X    { "allowsends",	do_allowsends, NULL },		/*  1 */
X    { "logging",	do_logging, NULL },		/*  2 */
X    { "redraw",		do_redraw, NULL },		/*  3 */
X    { "line1",		NULL, NULL },			/*  4 */
X    { "suspend",	do_suspend, NULL },		/*  5 */
X    { "continue",	do_continue, NULL },		/*  6 */
X    { "interrupt",	do_interrupt, NULL },		/*  7 */
X    { "hangup",		do_hangup, NULL },		/*  8 */
X    { "terminate",	do_terminate, NULL },		/*  9 */
X    { "kill",		do_kill, NULL },		/* 10 */
X    { "line2",		NULL, NULL },			/* 11 */
X    { "quit",		do_quit, NULL }};		/* 12 */
X
XMenuEntry vtMenuEntries[] = {
X    { "scrollbar",	do_scrollbar, NULL },		/*  0 */
X    { "jumpscroll",	do_jumpscroll, NULL },		/*  1 */
X    { "bltscroll",	do_bltscroll, NULL },		/*  2 */
X    { "reversevideo",	do_reversevideo, NULL },	/*  3 */
X    { "autowrap",	do_autowrap, NULL },		/*  4 */
X    { "reversewrap",	do_reversewrap, NULL },		/*  5 */
X    { "autolinefeed",	do_autolinefeed, NULL },	/*  6 */
X    { "appcursor",	do_appcursor, NULL },		/*  7 */
X    { "appkeypad",	do_appkeypad, NULL },		/*  8 */
X    { "scrollkey",	do_scrollkey, NULL },		/*  9 */
X    { "scrollttyoutput",	do_scrollttyoutput, NULL },	/* 10 */
X    { "allow132",	do_allow132, NULL },		/* 11 */
X    { "cursesemul",	do_cursesemul, NULL },		/* 12 */
X    { "visualbell",	do_visualbell, NULL },		/* 13 */
X    { "marginbell",	do_marginbell, NULL },		/* 14 */
X    { "altscreen",	do_altscreen, NULL },		/* 15 */
X    { "line1",		NULL, NULL },			/* 16 */
X    { "softreset",	do_softreset, NULL },		/* 17 */
X    { "hardreset",	do_hardreset, NULL },		/* 18 */
X    { "line2",		NULL, NULL },			/* 19 */
X    { "tekshow",	do_tekshow, NULL },		/* 20 */
X    { "tekmode",	do_tekmode, NULL },		/* 21 */
X    { "vthide",		do_vthide, NULL }};		/* 22 */
X
XMenuEntry fontMenuEntries[] = {
X    { "fontdefault",	do_vtfont, NULL },		/*  0 */
X    { "font1",		do_vtfont, NULL },		/*  1 */
X    { "font2",		do_vtfont, NULL },		/*  2 */
X    { "font3",		do_vtfont, NULL },		/*  3 */
X    { "font4",		do_vtfont, NULL },		/*  4 */
X    { "fontescape",	do_vtfont, NULL },		/*  5 */
X    { "fontsel",	do_vtfont, NULL }};		/*  6 */
X    /* this should match NMENUFONTS in ptyx.h */
X
XMenuEntry tekMenuEntries[] = {
X    { "tektextlarge",	do_tektextlarge, NULL },	/*  0 */
X    { "tektext2",	do_tektext2, NULL },		/*  1 */
X    { "tektext3",	do_tektext3, NULL },		/*  2 */
X    { "tektextsmall",	do_tektextsmall, NULL },	/*  3 */
X    { "line1",		NULL, NULL },			/*  4 */
X    { "tekpage",	do_tekpage, NULL },		/*  5 */
X    { "tekreset",	do_tekreset, NULL },		/*  6 */
X    { "tekcopy",	do_tekcopy, NULL },		/*  7 */
X    { "line2",		NULL, NULL },			/*  8 */
X    { "vtshow",		do_vtshow, NULL },		/*  9 */
X    { "vtmode",		do_vtmode, NULL },		/* 10 */
X    { "tekhide",	do_tekhide, NULL }};		/* 11 */
X
Xstatic Widget create_menu();
Xextern Widget toplevel;
X
X
X/*
X * we really want to do these dynamically
X */
X#define check_width 9
X#define check_height 8
Xstatic char check_bits[] = {
X   0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00,
X   0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00
X};
X
X
X/*
X * public interfaces
X */
X
Xstatic Bool domenu (w, event, params, param_count)
X    Widget w;
X    XEvent *event;              /* unused */
X    String *params;             /* mainMenu, vtMenu, or tekMenu */
X    Cardinal *param_count;      /* 0 or 1 */
X{
X    TScreen *screen = &term->screen;
X
X    if (*param_count != 1) {
X	XBell (XtDisplay(w), 0);
X	return False;
X    }
X
X    switch (params[0][0]) {
X      case 'm':
X	if (!screen->mainMenu) {
X	    screen->mainMenu = create_menu (term, toplevel, "mainMenu",
X					    mainMenuEntries,
X					    XtNumber(mainMenuEntries));
X	    update_securekbd();
X	    update_allowsends();
X	    update_logging();
X#ifndef SIGTSTP
X	    set_sensitivity (screen->mainMenu,
X			     mainMenuEntries[mainMenu_suspend].widget, FALSE);
X#endif
X#ifndef SIGCONT
X	    set_sensitivity (screen->mainMenu, 
X			     mainMenuEntries[mainMenu_continue].widget, FALSE);
X#endif
X	}
X	break;
X
X      case 'v':
X	if (!screen->vtMenu) {
X	    screen->vtMenu = create_menu (term, toplevel, "vtMenu",
X					  vtMenuEntries,
X					  XtNumber(vtMenuEntries));
X	    /* and turn off the alternate screen entry */
X	    set_altscreen_sensitivity (FALSE);
X	    update_scrollbar();
X	    update_jumpscroll();
X	    update_bltscroll();
X	    update_reversevideo();
X	    update_autowrap();
X	    update_reversewrap();
X	    update_autolinefeed();
X	    update_appcursor();
X	    update_appkeypad();
X	    update_scrollkey();
X	    update_scrollttyoutput();
X	    update_allow132();
X	    update_cursesemul();
X	    update_visualbell();
X	    update_marginbell();
X	}
X	break;
X
X      case 'f':
X	if (!screen->fontMenu) {
X	    screen->fontMenu = create_menu (term, toplevel, "fontMenu",
X					    fontMenuEntries,
X					    NMENUFONTS);  
X	    set_menu_font (True);
X	    set_sensitivity (screen->fontMenu,
X			     fontMenuEntries[fontMenu_fontescape].widget,
X			     (screen->menu_font_names[fontMenu_fontescape]
X			      ? TRUE : FALSE));
X	}
X	FindFontSelection (NULL, True);
X	set_sensitivity (screen->fontMenu,
X			 fontMenuEntries[fontMenu_fontsel].widget,
X			 (screen->menu_font_names[fontMenu_fontsel]
X			  ? TRUE : FALSE));
X	break;
X
X      case 't':
X	if (!screen->tekMenu) {
X	    screen->tekMenu = create_menu (term, toplevel, "tekMenu",
X					   tekMenuEntries,
X					   XtNumber(tekMenuEntries));
X	    set_tekfont_menu_item (screen->cur.fontsize, TRUE);
X	}
X	break;
X
X      default:
X	XBell (XtDisplay(w), 0);
X	return False;
X    }
X
X    return True;
X}
X
Xvoid HandleCreateMenu (w, event, params, param_count)
X    Widget w;
X    XEvent *event;              /* unused */
X    String *params;             /* mainMenu, vtMenu, or tekMenu */
X    Cardinal *param_count;      /* 0 or 1 */
X{
X    (void) domenu (w, event, params, param_count);
X}
X
Xvoid HandlePopupMenu (w, event, params, param_count)
X    Widget w;
X    XEvent *event;              /* unused */
X    String *params;             /* mainMenu, vtMenu, or tekMenu */
X    Cardinal *param_count;      /* 0 or 1 */
X{
X    if (domenu (w, event, params, param_count)) {
X	XtCallActionProc (w, "XawPositionSimpleMenu", event, params, 1);
X	XtCallActionProc (w, "MenuPopup", event, params, 1);
X    }
X}
X
X
X/*
X * private interfaces - keep out!
X */
X
X/*
X * create_menu - create a popup shell and stuff the menu into it.
X */
X
Xstatic Widget create_menu (xtw, toplevel, name, entries, nentries)
X    XtermWidget xtw;
X    Widget toplevel;
X    char *name;
X    struct _MenuEntry *entries;
X    int nentries;
X{
X    Widget m;
X    TScreen *screen = &xtw->screen;
X    static XtCallbackRec cb[2] = { { NULL, NULL }, { NULL, NULL }};
X    static Arg arg = { XtNcallback, (XtArgVal) cb };
X
X    if (screen->menu_item_bitmap == None) {
X	screen->menu_item_bitmap =
X	  XCreateBitmapFromData (XtDisplay(xtw),
X				 RootWindowOfScreen(XtScreen(xtw)),
X				 check_bits, check_width, check_height);
X    }
X
X    m = XtCreatePopupShell (name, simpleMenuWidgetClass, toplevel, NULL, 0);
X
X    for (; nentries > 0; nentries--, entries++) {
X	cb[0].callback = (XtCallbackProc) entries->function;
X	cb[0].closure = (caddr_t) entries->name;
X	entries->widget = XtCreateManagedWidget (entries->name, 
X						 (entries->function ?
X						  smeBSBObjectClass :
X						  smeLineObjectClass), m,
X						 &arg, (Cardinal) 1);
X    }
X
X    /* do not realize at this point */
X    return m;
X}
X
Xstatic void handle_send_signal (gw, sig)
X    Widget gw;
X    int sig;
X{
X    register TScreen *screen = &term->screen;
X
X    if (screen->pid > 1) killpg (screen->pid, sig);
X}
X
X
X/*
X * action routines
X */
X
Xvoid DoSecureKeyboard (time)
X    Time time;
X{
X    do_securekbd (term->screen.mainMenu, NULL, NULL);
X}
X
Xstatic void do_securekbd (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X    Time time = CurrentTime;		/* XXX - wrong */
X
X    if (screen->grabbedKbd) {
X	XUngrabKeyboard (screen->display, time);
X	ReverseVideo (term);
X	screen->grabbedKbd = FALSE;
X    } else {
X	if (XGrabKeyboard (screen->display, term->core.parent->core.window,
X			   True, GrabModeAsync, GrabModeAsync, time)
X	    != GrabSuccess) {
X	    XBell (screen->display, 100);
X	} else {
X	    ReverseVideo (term);
X	    screen->grabbedKbd = TRUE;
X	}
X    }
X    update_securekbd();
X}
X
X
Xstatic void do_allowsends (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->allowSendEvents = !screen->allowSendEvents;
X    update_allowsends ();
X}
X
X
Xstatic void do_visualbell (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->visualbell = !screen->visualbell;
X    update_visualbell();
X}
X
X
Xstatic void do_logging (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    if (screen->logging) {
X	CloseLog (screen);
X    } else {
X	StartLog (screen);
X    }
X    /* update_logging done by CloseLog and StartLog */
X}
X
X
Xstatic void do_redraw (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    Redraw ();
X}
X
X
X/*
X * The following cases use the pid instead of the process group so that we
X * don't get hosed by programs that change their process group
X */
X
X
Xstatic void do_suspend (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X#ifdef SIGTSTP
X    handle_send_signal (gw, SIGTSTP);
X#endif
X}
X
X
Xstatic void do_continue (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X#ifdef SIGCONT
X    handle_send_signal (gw, SIGCONT);
X#endif
X}
X
X
Xstatic void do_interrupt (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_send_signal (gw, SIGINT);
X}
X
X
Xstatic void do_hangup (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_send_signal (gw, SIGHUP);
X}
X
X
Xstatic void do_terminate (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_send_signal (gw, SIGTERM);
X}
X
X
Xstatic void do_kill (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_send_signal (gw, SIGKILL);
X}
X
X
Xstatic void do_quit (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    Cleanup (0);
X}
X
X
X
X/*
X * vt menu callbacks
X */
X
Xstatic void do_scrollbar (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    if (screen->scrollbar) {
X	ScrollBarOff (screen);
X    } else {
X	ScrollBarOn (term, FALSE, FALSE);
X    }
X    update_scrollbar();
X}
X
X
Xstatic void do_jumpscroll (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    term->flags ^= SMOOTHSCROLL;
X    if (term->flags & SMOOTHSCROLL) {
X	screen->jumpscroll = FALSE;
X	if (screen->scroll_amt) FlushScroll(screen);
X    } else {
X	screen->jumpscroll = TRUE;
X    }
X    update_jumpscroll();
X}
X
X
Xstatic void do_bltscroll (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->bltscroll = !screen->bltscroll;
X    update_bltscroll();
X}
X
X
Xstatic void do_reversevideo (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->flags ^= REVERSE_VIDEO;
X    ReverseVideo (term);
X    /* update_reversevideo done in ReverseVideo */
X}
X
X
Xstatic void do_autowrap (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->flags ^= WRAPAROUND;
X    update_autowrap();
X}
X
X
Xstatic void do_reversewrap (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->flags ^= REVERSEWRAP;
X    update_reversewrap();
X}
X
X
Xstatic void do_autolinefeed (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->flags ^= LINEFEED;
X    update_autolinefeed();
X}
X
X
Xstatic void do_appcursor (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->keyboard.flags ^= CURSOR_APL;
X    update_appcursor();
X}
X
X
Xstatic void do_appkeypad (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    term->keyboard.flags ^= KYPD_APL;
X    update_appkeypad();
X}
X
X
Xstatic void do_scrollkey (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->scrollkey = !screen->scrollkey;
X    update_scrollkey();
X}
X
X
Xstatic void do_scrollttyoutput (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->scrollttyoutput = !screen->scrollttyoutput;
X    update_scrollttyoutput();
X}
X
X
Xstatic void do_allow132 (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->c132 = !screen->c132;
X    update_allow132();
X}
X
X
Xstatic void do_cursesemul (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    screen->curses = !screen->curses;
X    update_cursesemul();
X}
X
X
Xstatic void do_marginbell (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    if (!(screen->marginbell = !screen->marginbell)) screen->bellarmed = -1;
X    update_marginbell();
X}
X
X
Xstatic void handle_tekshow (gw, allowswitch)
X    Widget gw;
X    Bool allowswitch;
X{
X    register TScreen *screen = &term->screen;
X
X    if (!screen->Tshow) {		/* not showing, turn on */
X	set_tek_visibility (TRUE);
X    } else if (screen->Vshow || allowswitch) {  /* is showing, turn off */
X	set_tek_visibility (FALSE);
X	end_tek_mode ();		/* WARNING: this does a longjmp */
X    } else
X      Bell();
X}
X
X
Xstatic void do_tekshow (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_tekshow (gw, True);
X}
X
X
Xstatic void do_tekonoff (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_tekshow (gw, False);
X}
X
X
Xstatic void do_altscreen (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    /* do nothing for now; eventually, will want to flip screen */
X}
X
X
Xstatic void do_softreset (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    VTReset (FALSE);
X}
X
X
Xstatic void do_hardreset (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    VTReset (TRUE);
X}
X
X
Xstatic void switch_modes (tovt)
X    Bool tovt;				/* if true, then become vt mode */
X{
X    if (tovt) {
X	if (TekRefresh) dorefresh();
X	end_tek_mode ();		/* WARNING: this does a longjmp... */
X    } else {
X	end_vt_mode ();			/* WARNING: this does a longjmp... */
X    }
X}
X
X
Xstatic void do_tekmode (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    switch_modes (screen->TekEmu);	/* switch to tek mode */
X}
X
Xstatic void do_vthide (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    set_vt_visibility (FALSE);
X    if (!screen->TekEmu) switch_modes (False);	/* switch to tek mode */
X}
X
X
X/*
X * vtfont menu
X */
X
Xstatic void do_vtfont (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    char *entryname = (char *) closure;
X    int i;
X
X    for (i = 0; i < NMENUFONTS; i++) {
X	if (strcmp (entryname, fontMenuEntries[i].name) == 0) {
X	    SetVTFont (i, True, NULL, NULL);
X	    return;
X	}
X    }
X    Bell();
X}
X
X
X/*
X * tek menu
X */
X
Xstatic void do_tektextlarge (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekSetFontSize (gw, tekMenu_tektextlarge);
X}
X
X
Xstatic void do_tektext2 (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekSetFontSize (gw, tekMenu_tektext2);
X}
X
X
Xstatic void do_tektext3 (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekSetFontSize (gw, tekMenu_tektext3);
X}
X
X
Xstatic void do_tektextsmall (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X
X    TekSetFontSize (gw, tekMenu_tektextsmall);
X}
X
X
Xstatic void do_tekpage (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekSimulatePageButton (False);
X}
X
X
Xstatic void do_tekreset (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekSimulatePageButton (True);
X}
X
X
Xstatic void do_tekcopy (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    TekCopy ();
X}
X
X
Xstatic void handle_vtshow (gw, allowswitch)
X    Widget gw;
X    Bool allowswitch;
X{
X    register TScreen *screen = &term->screen;
X
X    if (!screen->Vshow) {		/* not showing, turn on */
X	set_vt_visibility (TRUE);
X    } else if (screen->Tshow || allowswitch) {  /* is showing, turn off */
X	set_vt_visibility (FALSE);
X	if (!screen->TekEmu && TekRefresh) dorefresh ();
X	end_vt_mode ();
X    } else 
X      Bell();
X}
X
Xstatic void do_vtshow (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_vtshow (gw, True);
X}
X
Xstatic void do_vtonoff (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    handle_vtshow (gw, False);
X}
X
Xstatic void do_vtmode (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    switch_modes (screen->TekEmu);	/* switch to vt, or from */
X}
X
X
Xstatic void do_tekhide (gw, closure, data)
X    Widget gw;
X    caddr_t closure, data;
X{
X    register TScreen *screen = &term->screen;
X
X    set_tek_visibility (FALSE);
X    TekRefresh = (TekLink *)0;
X    if (screen->TekEmu) switch_modes (True);	/* does longjmp to vt mode */
X}
X
X
X
X/*
X * public handler routines
X */
X
Xstatic void handle_toggle (proc, var, params, nparams, w, closure, data)
X    void (*proc)();
X    int var;
X    String *params;
X    Cardinal nparams;
X    Widget w;
X    caddr_t closure, data;
X{
X    int dir = -2;
X
X    switch (nparams) {
X      case 0:
X	dir = -1;
X      case 1:
X	if (XmuCompareISOLatin1 (params[0], "on") == 0) dir = 1;
X	else if (XmuCompareISOLatin1 (params[0], "off") == 0) dir = 0;
X	else if (XmuCompareISOLatin1 (params[0], "toggle") == 0) dir = -1;
X    }
X
X    switch (dir) {
X      case -2:
X	Bell();
X	break;
X
X      case -1:
X	(*proc) (w, closure, data);
X	break;
X
X      case 0:
X	if (var) (*proc) (w, closure, data);
X	else Bell();
X	break;
X
X      case 1:
X	if (!var) (*proc) (w, closure, data);
X	else Bell();
X	break;
X    }
X    return;
X}
X
Xvoid HandleAllowSends(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_allowsends, (int) term->screen.allowSendEvents,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleVisualBell(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_visualbell, (int) term->screen.visualbell,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleLogging(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_logging, (int) term->screen.logging,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleRedraw(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_redraw(w, NULL, NULL);
X}
X
Xvoid HandleSendSignal(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    static struct sigtab {
X	char *name;
X	int sig;
X    } signals[] = {
X#ifdef SIGTSTP
X	{ "suspend",	SIGTSTP },
X	{ "tstp",	SIGTSTP },
X#endif
X#ifdef SIGCONT
X	{ "cont",	SIGCONT },
X#endif
X	{ "int",	SIGINT },
X	{ "hup",	SIGHUP },
X	{ "term",	SIGTERM },
X	{ "kill",	SIGKILL },
X	{ NULL, 0 },
X    };
X
X    if (*param_count == 1) {
X	struct sigtab *st;
X
X	for (st = signals; st->name; st++) {
X	    if (XmuCompareISOLatin1 (st->name, params[0]) == 0) {
X		handle_send_signal (w, st->sig);
X		return;
X	    }
X	}
X	/* one could allow numeric values, but that would be a security hole */
X    }
X
X    Bell();
X}
X
Xvoid HandleQuit(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_quit(w, NULL, NULL);
X}
X
Xvoid HandleScrollbar(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_scrollbar, (int) term->screen.scrollbar,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleJumpscroll(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_jumpscroll, (int) term->screen.jumpscroll,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleBltscroll(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_bltscroll, (int) term->screen.bltscroll,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleReverseVideo(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_reversevideo, (int) (term->flags & REVERSE_VIDEO),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAutoWrap(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_autowrap, (int) (term->flags & WRAPAROUND),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleReverseWrap(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_reversewrap, (int) (term->flags & REVERSEWRAP),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAutoLineFeed(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_autolinefeed, (int) (term->flags & LINEFEED),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAppCursor(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_appcursor, (int) (term->keyboard.flags & CURSOR_APL),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAppKeypad(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_appkeypad, (int) (term->keyboard.flags & KYPD_APL),
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleScrollKey(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_scrollkey, (int) term->screen.scrollkey,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleScrollTtyOutput(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_scrollttyoutput, (int) term->screen.scrollttyoutput,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAllow132(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_allow132, (int) term->screen.c132,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleCursesEmul(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_cursesemul, (int) term->screen.curses,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleMarginBell(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    handle_toggle (do_marginbell, (int) term->screen.marginbell,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleAltScreen(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    /* eventually want to see if sensitive or not */
X    handle_toggle (do_altscreen, (int) term->screen.alternate,
X		   params, *param_count, w, NULL, NULL);
X}
X
Xvoid HandleSoftReset(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_softreset(w, NULL, NULL);
X}
X
Xvoid HandleHardReset(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_hardreset(w, NULL, NULL);
X}
X
Xvoid HandleSetTerminalType(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    if (*param_count == 1) {
X	switch (params[0][0]) {
X	  case 'v': case 'V':
X	    if (term->screen.TekEmu) do_vtmode (w, NULL, NULL);
X	    break;
X	  case 't': case 'T':
X	    if (!term->screen.TekEmu) do_tekmode (w, NULL, NULL);
X	    break;
X	  default:
X	    Bell();
X	}
X    } else {
X	Bell();
X    }
X}
X
Xvoid HandleVisibility(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    if (*param_count == 2) {
X	switch (params[0][0]) {
X	  case 'v': case 'V':
X	    handle_toggle (do_vtonoff, (int) term->screen.Vshow,
X			   params+1, (*param_count) - 1, w, NULL, NULL);
X	    break;
X	  case 't': case 'T':
X	    handle_toggle (do_tekonoff, (int) term->screen.Tshow,
X			   params+1, (*param_count) - 1, w, NULL, NULL);
X	    break;
X	  default:
X	    Bell();
X	}
X    } else {
X	Bell();
X    }
X}
X
Xvoid HandleSetTekText(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    void (*proc)() = NULL;
X
X    switch (*param_count) {
X      case 0:
X	proc = do_tektextlarge;
X	break;
X      case 1:
X	switch (params[0][0]) {
X	  case 'l': case 'L': proc = do_tektextlarge; break;
X	  case '2': proc = do_tektext2; break;
X	  case '3': proc = do_tektext3; break;
X	  case 's': case 'S': proc = do_tektextsmall; break;
X	}
X	break;
X    }
X    if (proc) (*proc) (w, NULL, NULL);
X    else Bell();
X}
X
Xvoid HandleTekPage(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_tekpage(w, NULL, NULL);
X}
X
Xvoid HandleTekReset(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_tekreset(w, NULL, NULL);
X}
X
Xvoid HandleTekCopy(w, event, params, param_count)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *param_count;
X{
X    do_tekcopy(w, NULL, NULL);
X}
X
X
END_OF_FILE
if test 27111 -ne `wc -c <'xterm/menu.c'`; then
    echo shar: \"'xterm/menu.c'\" unpacked with wrong size!
fi
# end of 'xterm/menu.c'
fi
if test -f 'xterm/misc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xterm/misc.c'\"
else
echo shar: Extracting \"'xterm/misc.c'\" \(24024 characters\)
sed "s/^X//" >'xterm/misc.c' <<'END_OF_FILE'
X/*
X *	$XConsortium: misc.c,v 1.66 90/04/30 16:53:26 converse Exp $
X */
X
X
X#include <X11/copyright.h>
X
X/*
X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
X *
X *                         All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Digital Equipment
X * Corporation not be used in advertising or publicity pertaining to
X * distribution of the software without specific, written prior permission.
X *
X *
X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X * SOFTWARE.
X */
X
X#include "ptyx.h"		/* X headers included here. */
X
X#include <stdio.h>
X#include <X11/Xos.h>
X#include <setjmp.h>
X#include <ctype.h>
X#include <pwd.h>
X
X#include <X11/Xatom.h>
X#include <X11/cursorfont.h>
X
X#include <X11/Shell.h>
X#include <X11/Xmu/Error.h>
X#include <X11/Xmu/SysUtil.h>
X#include <X11/Xmu/WinUtil.h>
X
X#include "data.h"
X#include "error.h"
X#include "menu.h"
X
Xextern char *malloc();
Xextern char *mktemp();
Xextern void exit();
Xextern void perror();
Xextern void abort();
X
Xstatic void DoSpecialEnterNotify();
Xstatic void DoSpecialLeaveNotify();
X
X#ifndef lint
Xstatic char rcs_id[] = "$XConsortium: misc.c,v 1.66 90/04/30 16:53:26 converse Exp $";
X#endif	/* lint */
X
Xxevents()
X{
X	XEvent event;
X	register TScreen *screen = &term->screen;
X
X	if(screen->scroll_amt)
X		FlushScroll(screen);
X	XPending (screen->display);
X	do {
X		if (waitingForTrackInfo)
X			return;
X		XNextEvent (screen->display, &event);
X		/*
X		 * Hack to get around problems with the toolkit throwing away
X		 * eventing during the exclusive grab of the menu popup.  By
X		 * looking at the event ourselves we make sure that we can
X		 * do the right thing.
X		 */
X		if (event.type == EnterNotify &&
X		    (event.xcrossing.window == XtWindow(XtParent(term))) ||
X		    (tekWidget &&
X		     event.xcrossing.window == XtWindow(XtParent(tekWidget))))
X		  DoSpecialEnterNotify (&event);
X		else 
X		if (event.type == LeaveNotify &&
X		    (event.xcrossing.window == XtWindow(XtParent(term))) ||
X		    (tekWidget &&
X		     event.xcrossing.window == XtWindow(XtParent(tekWidget))))
X		  DoSpecialLeaveNotify (&event);
X
X		if (!event.xany.send_event ||
X		    screen->allowSendEvents ||
X		    ((event.xany.type != KeyPress) &&
X		     (event.xany.type != KeyRelease) &&
X		     (event.xany.type != ButtonPress) &&
X		     (event.xany.type != ButtonRelease)))
X		    XtDispatchEvent(&event);
X	} while (QLength(screen->display) > 0);
X}
X
X
XCursor make_colored_cursor (cursorindex, fg, bg)
X	int cursorindex;			/* index into font */
X	unsigned long fg, bg;			/* pixel value */
X{
X	register TScreen *screen = &term->screen;
X	Cursor c;
X	register Display *dpy = screen->display;
X	
X	c = XCreateFontCursor (dpy, cursorindex);
X	if (c == (Cursor) 0) return (c);
X
X	recolor_cursor (c, fg, bg);
X	return (c);
X}
X
X/* ARGSUSED */
Xvoid HandleKeyPressed(w, event, params, nparams)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *nparams;
X{
X    register TScreen *screen = &term->screen;
X
X#ifdef ACTIVEWINDOWINPUTONLY
X    if (w == (screen->TekEmu ? (Widget)tekWidget : (Widget)term))
X#endif
X	Input (&term->keyboard, screen, event, False);
X}
X/* ARGSUSED */
Xvoid HandleEightBitKeyPressed(w, event, params, nparams)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *nparams;
X{
X    register TScreen *screen = &term->screen;
X
X#ifdef ACTIVEWINDOWINPUTONLY
X    if (w == (screen->TekEmu ? (Widget)tekWidget : (Widget)term))
X#endif
X	Input (&term->keyboard, screen, event, True);
X}
X
X/* ARGSUSED */
Xvoid HandleStringEvent(w, event, params, nparams)
X    Widget w;
X    XEvent *event;
X    String *params;
X    Cardinal *nparams;
X{
X    register TScreen *screen = &term->screen;
X
X#ifdef ACTIVEWINDOWINPUTONLY
X    if (w != (screen->TekEmu ? (Widget)tekWidget : (Widget)term)) return;
X#endif
X
X    if (*nparams != 1) return;
X
X    if ((*params)[0] == '0' && (*params)[1] == 'x' && (*params)[2] != '\0') {
X	char c, *p, hexval[2];
X	hexval[0] = hexval[1] = 0;
X	for (p = *params+2; (c = *p); p++) {
X	    hexval[0] *= 16;
X	    if (isupper(c)) c = tolower(c);
X	    if (c >= '0' && c <= '9')
X		hexval[0] += c - '0';
X	    else if (c >= 'a' && c <= 'f')
X		hexval[0] += c - 'a' + 10;
X	    else break;
X	}
X	if (c == '\0')
X	    StringInput (screen, hexval);
X    }
X    else {
X	StringInput (screen, *params);
X    }
X}
X
Xstatic void DoSpecialEnterNotify (ev)
X    register XEnterWindowEvent *ev;
X{
X    register TScreen *screen = &term->screen;
X
X#ifdef ACTIVEWINDOWINPUTONLY
X    if (ev->window == XtWindow(XtParent(screen->TekEmu ?
X					(Widget)tekWidget : (Widget)term)))
X#endif
X      if (((ev->detail) != NotifyInferior) &&
X	  ev->focus &&
X	  !(screen->select & FOCUS))
X	selectwindow(screen, INWINDOW);
X}
X
X/*ARGSUSED*/
Xvoid HandleEnterWindow(w, eventdata, event)
XWidget w;
Xregister XEnterWindowEvent *event;
Xcaddr_t eventdata;
X{
X    /* NOP since we handled it above */
X}
X
X
Xstatic void DoSpecialLeaveNotify (ev)
X    register XEnterWindowEvent *ev;
X{
X    register TScreen *screen = &term->screen;
X
X#ifdef ACTIVEWINDOWINPUTONLY
X    if (ev->window == XtWindow(XtParent(screen->TekEmu ?
X					(Widget)tekWidget : (Widget)term)))
X#endif
X      if (((ev->detail) != NotifyInferior) &&
X	  ev->focus &&
X	  !(screen->select & FOCUS))
X	unselectwindow(screen, INWINDOW);
X}
X
X
X/*ARGSUSED*/
Xvoid HandleLeaveWindow(w, eventdata, event)
XWidget w;
Xregister XEnterWindowEvent *event;
Xcaddr_t eventdata;
X{
X    /* NOP since we handled it above */
X}
X
X
X/*ARGSUSED*/
Xvoid HandleFocusChange(w, eventdata, event)
XWidget w;
Xregister XFocusChangeEvent *event;
Xcaddr_t eventdata;
X{
X        register TScreen *screen = &term->screen;
X
X        if(event->type == FocusIn)
X                selectwindow(screen,
X			     (event->detail == NotifyPointer) ? INWINDOW :
X								FOCUS);
X        else {
X                unselectwindow(screen,
X			       (event->detail == NotifyPointer) ? INWINDOW :
X								  FOCUS);
X		if (screen->grabbedKbd && (event->mode == NotifyUngrab)) {
X		    screen->grabbedKbd = FALSE;
X		    ReverseVideo(term);
X		    XBell(screen->display, 100);
X		}
X	}
X}
X
X
X
Xselectwindow(screen, flag)
Xregister TScreen *screen;
Xregister int flag;
X{
X	if(screen->TekEmu) {
X		if(!Ttoggled)
X			TCursorToggle(TOGGLE);
X		screen->select |= flag;
X		if(!Ttoggled)
X			TCursorToggle(TOGGLE);
X		return;
X	} else {
X		if(screen->cursor_state &&
X		   (screen->cursor_col != screen->cur_col ||
X		    screen->cursor_row != screen->cur_row))
X		    HideCursor();
X		screen->select |= flag;
X		if(screen->cursor_state)
X			ShowCursor();
X		return;
X	}
X}
X
Xunselectwindow(screen, flag)
Xregister TScreen *screen;
Xregister int flag;
X{
X    if (screen->always_highlight) return;
X
X    if(screen->TekEmu) {
X	if(!Ttoggled) TCursorToggle(TOGGLE);
X	screen->select &= ~flag;
X	if(!Ttoggled) TCursorToggle(TOGGLE);
X    } else {
X	screen->select &= ~flag;
X	if(screen->cursor_state &&
X	   (screen->cursor_col != screen->cur_col ||
X	    screen->cursor_row != screen->cur_row))
X	      HideCursor();
X	if(screen->cursor_state)
X	  ShowCursor();
X    }
X}
X
X
XBell()
X{
X	extern XtermWidget term;
X	register TScreen *screen = &term->screen;
X	register Pixel xorPixel = screen->foreground ^ term->core.background_pixel;
X	XGCValues gcval;
X	GC visualGC;
X
X	if(screen->visualbell) {
X		gcval.function = GXxor;
X		gcval.foreground = xorPixel;
X		visualGC = XtGetGC((Widget)term, GCFunction+GCForeground, &gcval);
X		if(screen->TekEmu) {
X			XFillRectangle(
X			    screen->display,
X			    TWindow(screen), 
X			    visualGC,
X			    0, 0,
X			    (unsigned) TFullWidth(screen),
X			    (unsigned) TFullHeight(screen));
X			XFlush(screen->display);
X			XFillRectangle(
X			    screen->display,
X			    TWindow(screen), 
X			    visualGC,
X			    0, 0,
X			    (unsigned) TFullWidth(screen),
X			    (unsigned) TFullHeight(screen));
X		} else {
X			XFillRectangle(
X			    screen->display,
X			    VWindow(screen), 
X			    visualGC,
X			    0, 0,
X			    (unsigned) FullWidth(screen),
X			    (unsigned) FullHeight(screen));
X			XFlush(screen->display);
X			XFillRectangle(
X			    screen->display,
X			    VWindow(screen), 
X			    visualGC,
X			    0, 0,
X			    (unsigned) FullWidth(screen),
X			    (unsigned) FullHeight(screen));
X		}
X	} else
X		XBell(screen->display, 0);
X}
X
XRedraw()
X{
X	extern XtermWidget term;
X	register TScreen *screen = &term->screen;
X	XExposeEvent event;
X
X	event.type = Expose;
X	event.display = screen->display;
X	event.x = 0;
X	event.y = 0;
X	event.count = 0; 
X	
X	if(VWindow(screen)) {
X	        event.window = VWindow(screen);
X		event.width = term->core.width;
X		event.height = term->core.height;
X		(*term->core.widget_class->core_class.expose)((Widget)term, (XEvent *)&event, NULL);
X		if(screen->scrollbar) 
X			(*screen->scrollWidget->core.widget_class->core_class.expose)(screen->scrollWidget, (XEvent *)&event, NULL);
X		}
X
X	if(TWindow(screen) && screen->Tshow) {
X	        event.window = TWindow(screen);
X		event.width = tekWidget->core.width;
X		event.height = tekWidget->core.height;
X		TekExpose (tekWidget, &event, NULL);
X	}
X}
X
XStartLog(screen)
Xregister TScreen *screen;
X{
X	register char *cp;
X	register int i;
X	static char *log_default;
X	char *malloc(), *rindex();
X#ifdef ALLOWLOGFILEEXEC
X	void logpipe();
X#ifdef SYSV
X	/* SYSV has another pointer which should be part of the
X	** FILE structure but is actually a separate array.
X	*/
X	unsigned char *old_bufend;
X#endif	/* SYSV */
X#endif /* ALLOWLOGFILEEXEC */
X
X	if(screen->logging || (screen->inhibit & I_LOG))
X		return;
X	if(screen->logfile == NULL || *screen->logfile == 0) {
X		if(screen->logfile)
X			free(screen->logfile);
X		if(log_default == NULL)
X			mktemp(log_default = log_def_name);
X		if((screen->logfile = malloc((unsigned)strlen(log_default) + 1)) == NULL)
X			return;
X		strcpy(screen->logfile, log_default);
X	}
X	if(*screen->logfile == '|') {	/* exec command */
X#ifdef ALLOWLOGFILEEXEC
X		/*
X		 * Warning, enabling this "feature" allows arbitrary programs
X		 * to be run.  If ALLOWLOGFILECHANGES is enabled, this can be
X		 * done through escape sequences....  You have been warned.
X		 */
X		int p[2];
X		static char *shell;
X
X		if(pipe(p) < 0 || (i = fork()) < 0)
X			return;
X		if(i == 0) {	/* child */
X			close(p[1]);
X			dup2(p[0], 0);
X			close(p[0]);
X			dup2(fileno(stderr), 1);
X			dup2(fileno(stderr), 2);
X#ifdef SYSV
X			old_bufend = _bufend(stderr);
X#endif	/* SYSV */
X			close(fileno(stderr));
X			fileno(stderr) = 2;
X#ifdef SYSV
X			_bufend(stderr) = old_bufend;
X#endif	/* SYSV */
X			close(screen->display->fd);
X			close(screen->respond);
X			if(!shell) {
X				register struct passwd *pw;
X				char *getenv(), *malloc();
X				struct passwd *getpwuid();
X
X				if(((cp = getenv("SHELL")) == NULL || *cp == 0)
X				 && ((pw = getpwuid(screen->uid)) == NULL ||
X				 *(cp = pw->pw_shell) == 0) ||
X				 (shell = malloc((unsigned) strlen(cp) + 1)) == NULL)
X					shell = "/bin/sh";
X				else
X					strcpy(shell, cp);
X			}
X			signal(SIGHUP, SIG_DFL);
X			signal(SIGCHLD, SIG_DFL);
X			setgid(screen->gid);
X			setuid(screen->uid);
X			execl(shell, shell, "-c", &screen->logfile[1], 0);
X			fprintf(stderr, "%s: Can't exec `%s'\n", xterm_name,
X			 &screen->logfile[1]);
X			exit(ERROR_LOGEXEC);
X		}
X		close(p[0]);
X		screen->logfd = p[1];
X		signal(SIGPIPE, logpipe);
X#else
X		Bell();
X		Bell();
X		return;
X#endif
X	} else {
X		if(access(screen->logfile, F_OK) == 0) {
X			if(access(screen->logfile, W_OK) < 0)
X				return;
X		} else if(cp = rindex(screen->logfile, '/')) {
X			*cp = 0;
X			i = access(screen->logfile, W_OK);
X			*cp = '/';
X			if(i < 0)
X				return;
X		} else if(access(".", W_OK) < 0)
X			return;
X		if((screen->logfd = open(screen->logfile, O_WRONLY | O_APPEND |
X		 O_CREAT, 0644)) < 0)
X			return;
X		chown(screen->logfile, screen->uid, screen->gid);
X
X	}
X	screen->logstart = screen->TekEmu ? Tbptr : bptr;
X	screen->logging = TRUE;
X	update_logging();
X}
X
XCloseLog(screen)
Xregister TScreen *screen;
X{
X	if(!screen->logging || (screen->inhibit & I_LOG))
X		return;
X	FlushLog(screen);
X	close(screen->logfd);
X	screen->logging = FALSE;
X	update_logging();
X}
X
XFlushLog(screen)
Xregister TScreen *screen;
X{
X	register Char *cp;
X	register int i;
X
X	cp = screen->TekEmu ? Tbptr : bptr;
X	if((i = cp - screen->logstart) > 0)
X		write(screen->logfd, screen->logstart, i);
X	screen->logstart = screen->TekEmu ? Tbuffer : buffer;
X}
X
X#ifdef ALLOWLOGFILEEXEC
Xvoid logpipe()
X{
X	register TScreen *screen = &term->screen;
X
X#ifdef SYSV
X	(void) signal(SIGPIPE, SIG_IGN);
X#endif	/* SYSV */
X	if(screen->logging)
X		CloseLog(screen);
X}
X#endif /* ALLOWLOGFILEEXEC */
X
X
Xdo_osc(func)
Xint (*func)();
X{
X	register TScreen *screen = &term->screen;
X	register int mode, c;
X	register char *cp;
X	char buf[512];
X	char *bufend = &buf[(sizeof buf) - 1];	/* leave room for null */
X	extern char *malloc();
X	Bool okay = True;
X
X	/* 
X	 * lines should be of the form <ESC> ] number ; string <BEL>
X	 *
X	 * where number is one of 0, 1, 2, or 46
X	 */
X	mode = 0;
X	while(isdigit(c = (*func)()))
X		mode = 10 * mode + (c - '0');
X	if (c != ';') okay = False;
X	cp = buf;
X	while(isprint((c = (*func)()) & 0x7f) && cp < bufend)
X		*cp++ = c;
X	if (c != 7) okay = False;
X	*cp = 0;
X	if (okay) switch(mode) {
X	 case 0:	/* new icon name and title*/
X		Changename(buf);
X		Changetitle(buf);
X		break;
X
X	 case 1:	/* new icon name only */
X		Changename(buf);
X		break;
X
X	 case 2:	/* new title only */
X		Changetitle(buf);
X		break;
X	 case 10:	case 11:	case 12:
X	 case 13:	case 14:	case 15:
X	 case 16:
X		{
X		    extern Boolean ChangeColorsRequest();
X		    if (term->misc.dynamicColors)
X			ChangeColorsRequest(term,mode-10,buf);
X		}
X		break;
X
X	 case 46:	/* new log file */
X#ifdef ALLOWLOGFILECHANGES
X		/*
X		 * Warning, enabling this feature allows people to overwrite
X		 * arbitrary files accessible to the person running xterm.
X		 */
X		if((cp = malloc((unsigned)strlen(buf) + 1)) == NULL)
X			break;
X		strcpy(cp, buf);
X		if(screen->logfile)
X			free(screen->logfile);
X		screen->logfile = cp;
X#else
X		Bell();
X		Bell();
X#endif
X		break;
X
X	case 50:
X		SetVTFont (fontMenu_fontescape, True, buf, NULL);
X		break;
X
X	/*
X	 * One could write code to send back the display and host names,
X	 * but that could potentially open a fairly nasty security hole.
X	 */
X	}
X}
X
Xstatic ChangeGroup(attribute, value)
X     String attribute;
X     XtArgVal value;
X{
X	extern Widget toplevel;
X	Arg args[1];
X
X	XtSetArg( args[0], attribute, value );
X	XtSetValues( toplevel, args, 1 );
X}
X
XChangename(name)
Xregister char *name;
X{
X    ChangeGroup( XtNiconName, (XtArgVal)name );
X}
X
XChangetitle(name)
Xregister char *name;
X{
X    ChangeGroup( XtNtitle, (XtArgVal)name );
X}
X
X/***====================================================================***/
X
XScrnColors	*pOldColors= NULL;
X
XBoolean
XGetOldColors(pTerm)
XXtermWidget	pTerm;
X{
Xint	i;
X    if (pOldColors==NULL) {
X	pOldColors=	(ScrnColors *)XtMalloc(sizeof(ScrnColors));
X	if (pOldColors==NULL) {
X	    fprintf(stderr,"allocation failure in GetOldColors\n");
X	    return(FALSE);
X	}
X	pOldColors->which=	0;
X	for (i=0;i<NCOLORS;i++) {
X	    pOldColors->colors[i]=	0;
X	    pOldColors->names[i]=	NULL;
X	}
X	GetColors(pTerm,pOldColors);
X    }
X    return(TRUE);
X}
X
XBoolean
XUpdateOldColors(pTerm,pNew)
XXtermWidget	pTerm;
XScrnColors	*pNew;
X{
Xint	i;
X
X    /* if we were going to free old colors, this would be the place to
X     * do it.   I've decided not to (for now), because it seems likely
X     * that we'd have a small set of colors we use over and over, and that
X     * we could save some overhead this way.   The only case in which this
X     * (clearly) fails is if someone is trying a boatload of colors, in
X     * which case they can restart xterm
X     */
X    for (i=0;i<NCOLORS;i++) {
X	if (COLOR_DEFINED(pNew,i)) {
X	    if (pOldColors->names[i]!=NULL) {
X		XtFree(pOldColors->names[i]);
X		pOldColors->names[i]= NULL;
X	    }
X	    if (pNew->names[i]) {
X		pOldColors->names[i]= pNew->names[i];
X	    }
X	    pOldColors->colors[i]=	pNew->colors[i];
X	}
X    }
X    return(TRUE);
X}
X
Xvoid
XReverseOldColors()
X{
Xregister ScrnColors	*pOld= pOldColors;
XPixel	 tmpPix;
Xchar	*tmpName;
X
X    if (pOld) {
X	/* change text cursor, if necesary */
X	if (pOld->colors[TEXT_CURSOR]==pOld->colors[TEXT_FG]) {
X	    pOld->colors[TEXT_CURSOR]=	pOld->colors[TEXT_BG];
X	    if (pOld->names[TEXT_CURSOR]) {
X		XtFree(pOldColors->names[TEXT_CURSOR]);
X		pOld->names[TEXT_CURSOR]= NULL;
X	    }
X	    if (pOld->names[TEXT_BG]) {
X		tmpName= XtMalloc(strlen(pOld->names[TEXT_BG])+1);
X		if (tmpName) {
X		    strcpy(tmpName,pOld->names[TEXT_BG]);
X		    pOld->names[TEXT_CURSOR]= tmpName;
X		}
X	    }
X	}
X
X	/* swap text FG and BG */
X	tmpPix=		pOld->colors[TEXT_FG];
X	tmpName=	pOld->names[TEXT_FG];
X	pOld->colors[TEXT_FG]=	pOld->colors[TEXT_BG];
X	pOld->names[TEXT_FG]=	pOld->names[TEXT_BG];
X	pOld->colors[TEXT_BG]=	tmpPix;
X	pOld->names[TEXT_BG]=	tmpName;
X
X	/* swap mouse FG and BG */
X	tmpPix=		pOld->colors[MOUSE_FG];
X	tmpName=	pOld->names[MOUSE_FG];
X	pOld->colors[MOUSE_FG]=	pOld->colors[MOUSE_BG];
X	pOld->names[MOUSE_FG]=	pOld->names[MOUSE_BG];
X	pOld->colors[MOUSE_BG]=	tmpPix;
X	pOld->names[MOUSE_BG]=	tmpName;
X
X	/* swap Tek FG and BG */
X	tmpPix=		pOld->colors[TEK_FG];
X	tmpName=	pOld->names[TEK_FG];
X	pOld->colors[TEK_FG]=	pOld->colors[TEK_BG];
X	pOld->names[TEK_FG]=	pOld->names[TEK_BG];
X	pOld->colors[TEK_BG]=	tmpPix;
X	pOld->names[TEK_BG]=	tmpName;
X    }
X    return;
X}
X
XBoolean
XAllocateColor(pTerm,pNew,ndx,name)
XXtermWidget	 pTerm;
XScrnColors	*pNew;
Xint		 ndx;
Xchar		*name;
X{
XXColor			 def;
Xregister TScreen	*screen=	&pTerm->screen;
XColormap		 cmap=		pTerm->core.colormap;
Xchar			*newName;
X
X    if ((XParseColor(screen->display,cmap,name,&def))&&
X	(XAllocColor(screen->display,cmap,&def))) {
X	SET_COLOR_VALUE(pNew,ndx,def.pixel);
X	newName= XtMalloc(strlen(name)+1);
X	if (newName) {
X	    strcpy(newName,name);
X	    SET_COLOR_NAME(pNew,ndx,newName);
X	}
X	return(TRUE);
X    }
X    return(FALSE);
X}
X
XBoolean
XChangeColorsRequest(pTerm,start,names)
XXtermWidget	pTerm;
Xint		start;
Xregister char	*names;
X{
Xchar		*thisName;
XScrnColors	newColors;
Xint		i,ndx;
X
X    if ((pOldColors==NULL)&&(!GetOldColors(pTerm))) {
X	return(FALSE);
X    }
X    newColors.which=	0;
X    for (i=0;i<NCOLORS;i++) {
X	newColors.names[i]=	NULL;
X    }
X    for (i=start;i<NCOLORS;i++) {
X	if (term->misc.re_verse)	ndx=	OPPOSITE_COLOR(i);
X	else				ndx=	i;
X	if ((names==NULL)||(names[0]=='\0')) {
X	    newColors.names[ndx]=	NULL;
X	}
X	else {
X	    if (names[0]==';') 
X		 thisName=	NULL;
X	    else thisName=	names;
X	    names=	index(names,';');
X	    if (names!=NULL) {
X		*names=	'\0';
X		names++;
X	    }
X	    if ((!pOldColors->names[ndx])||
X		(thisName&&(strcmp(thisName,pOldColors->names[ndx])))) {
X		AllocateColor(pTerm,&newColors,ndx,thisName);
X	    }
X	}
X    }
X
X    if (newColors.which==0)
X	return(TRUE);
X
X    ChangeColors(pTerm,&newColors);
X    UpdateOldColors(pTerm,&newColors);
X    return(TRUE);
X}
X
X/***====================================================================***/
X
X#ifndef DEBUG
X/* ARGSUSED */
X#endif
XPanic(s, a)
Xchar	*s;
Xint a;
X{
X#ifdef DEBUG
X	if(debug) {
X		fprintf(stderr, "%s: PANIC!	", xterm_name);
X		fprintf(stderr, s, a);
X		fputs("\r\n", stderr);
X		fflush(stderr);
X	}
X#endif	/* DEBUG */
X}
X
Xchar *SysErrorMsg (n)
X    int n;
X{
X    extern char *sys_errlist[];
X    extern int sys_nerr;
X
X    return ((n >= 0 && n < sys_nerr) ? sys_errlist[n] : "unknown error");
X}
X
X
XSysError (i)
Xint i;
X{
X	int oerrno;
X
X	oerrno = errno;
X	/* perror(3) write(2)s to file descriptor 2 */
X	fprintf (stderr, "%s: Error %d, errno %d: ", xterm_name, i, oerrno);
X	fprintf (stderr, "%s\n", SysErrorMsg (oerrno));
X	Cleanup(i);
X}
X
XError (i)
Xint i;
X{
X	fprintf (stderr, "%s: Error %d\n", xterm_name, i);
X	Cleanup(i);
X}
X
X
X/*
X * cleanup by sending SIGHUP to client processes
X */
XCleanup (code)
Xint code;
X{
X	extern XtermWidget term;
X	register TScreen *screen;
X
X	screen = &term->screen;
X	if (screen->pid > 1) {
X	    (void) killpg (screen->pid, SIGHUP);
X	}
X	Exit (code);
X}
X
X/*
X * sets the value of var to be arg in the Unix 4.2 BSD environment env.
X * Var should end with '=' (bindings are of the form "var=value").
X * This procedure assumes the memory for the first level of environ
X * was allocated using calloc, with enough extra room at the end so not
X * to have to do a realloc().
X */
XSetenv (var, value)
Xregister char *var, *value;
X{
X	extern char **environ;
X	register int index = 0;
X	register int len = strlen(var);
X
X	while (environ [index] != NULL) {
X	    if (strncmp (environ [index], var, len) == 0) {
X		/* found it */
X		environ[index] = (char *)malloc ((unsigned)len + strlen (value) + 1);
X		strcpy (environ [index], var);
X		strcat (environ [index], value);
X		return;
X	    }
X	    index ++;
X	}
X
X#ifdef DEBUG
X	if (debug) fputs ("expanding env\n", stderr);
X#endif	/* DEBUG */
X
X	environ [index] = (char *) malloc ((unsigned)len + strlen (value) + 1);
X	(void) strcpy (environ [index], var);
X	strcat (environ [index], value);
X	environ [++index] = NULL;
X}
X
X/*
X * returns a pointer to the first occurrence of s2 in s1,
X * or NULL if there are none.
X */
Xchar *strindex (s1, s2)
Xregister char	*s1, *s2;
X{
X	register char	*s3;
X	char		*index();
X	int s2len = strlen (s2);
X
X	while ((s3=index(s1, *s2)) != NULL) {
X		if (strncmp(s3, s2, s2len) == 0)
X			return (s3);
X		s1 = ++s3;
X	}
X	return (NULL);
X}
X
X/*ARGSUSED*/
Xxerror(d, ev)
XDisplay *d;
Xregister XErrorEvent *ev;
X{
X    fprintf (stderr, "%s:  warning, error event receieved:\n", xterm_name);
X    (void) XmuPrintDefaultErrorMessage (d, ev, stderr);
X    Exit (ERROR_XERROR);
X}
X
X/*ARGSUSED*/
Xxioerror(dpy)
XDisplay *dpy;
X{
X    (void) fprintf (stderr, 
X		    "%s:  fatal IO error %d (%s) or KillClient on X server \"%s\"\r\n",
X		    xterm_name, errno, SysErrorMsg (errno),
X		    DisplayString (dpy));
X
X    Exit(ERROR_XIOERROR);
X}
X
XXStrCmp(s1, s2)
Xchar *s1, *s2;
X{
X  if (s1 && s2) return(strcmp(s1, s2));
X  if (s1 && *s1) return(1);
X  if (s2 && *s2) return(-1);
X  return(0);
X}
X
Xstatic void withdraw_window (dpy, w, scr)
X    Display *dpy;
X    Window w;
X    int scr;
X{
X    (void) XmuUpdateMapHints (dpy, w, NULL);
X    XWithdrawWindow (dpy, w, scr);
X    return;
X}
X
X
Xvoid set_vt_visibility (on)
X    Boolean on;
X{
X    register TScreen *screen = &term->screen;
X
X    if (on) {
X	if (!screen->Vshow && term) {
X	    VTInit ();
X	    XtMapWidget (term->core.parent);
X	    screen->Vshow = TRUE;
X	}
X    } else {
X	if (screen->Vshow && term) {
X	    withdraw_window (XtDisplay (term), 
X			     XtWindow(XtParent(term)),
X			     XScreenNumberOfScreen(XtScreen(term)));
X	    screen->Vshow = FALSE;
X	}
X    }
X    set_vthide_sensitivity();
X    set_tekhide_sensitivity();
X    update_vttekmode();
X    update_tekshow();
X    update_vtshow();
X    return;
X}
X
Xvoid set_tek_visibility (on)
X    Boolean on;
X{
X    register TScreen *screen = &term->screen;
X
X    if (on) {
X	if (!screen->Tshow && (tekWidget || TekInit())) {
X	    XtRealizeWidget (tekWidget->core.parent);
X	    XtMapWidget (tekWidget->core.parent);
X	    screen->Tshow = TRUE;
X	}
X    } else {
X	if (screen->Tshow && tekWidget) {
X	    withdraw_window (XtDisplay (tekWidget), 
X			     XtWindow(XtParent(tekWidget)),
X			     XScreenNumberOfScreen(XtScreen(tekWidget)));
X	    screen->Tshow = FALSE;
X	}
X    }
X    set_tekhide_sensitivity();
X    set_vthide_sensitivity();
X    update_vtshow();
X    update_tekshow();
X    update_vttekmode();
X    return;
X}
X
Xvoid end_tek_mode ()
X{
X    register TScreen *screen = &term->screen;
X
X    if (screen->TekEmu) {
X	if (screen->logging) {
X	    FlushLog (screen);
X	    screen->logstart = buffer;
X	}
X	longjmp(Tekend, 1);
X    } 
X    return;
X}
X
Xvoid end_vt_mode ()
X{
X    register TScreen *screen = &term->screen;
X
X    if (!screen->TekEmu) {
X	if(screen->logging) {
X	    FlushLog(screen);
X	    screen->logstart = Tbuffer;
X	}
X	screen->TekEmu = TRUE;
X	longjmp(VTend, 1);
X    } 
X    return;
X}
END_OF_FILE
if test 24024 -ne `wc -c <'xterm/misc.c'`; then
    echo shar: \"'xterm/misc.c'\" unpacked with wrong size!
fi
# end of 'xterm/misc.c'
fi
if test -f 'xterm/termcap.bold' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xterm/termcap.bold'\"
else
echo shar: Extracting \"'xterm/termcap.bold'\" \(510 characters\)
sed "s/^X//" >'xterm/termcap.bold' <<'END_OF_FILE'
Xvs|xterm|vs100:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:MT:UP=\E[%dA:al=\E[L:am:bs:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:co#80:cs=\E[%i%d;%dr:ct=\E[3k:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kn#4:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:li#50:md=\E[1m:me=\E[m:mi:mr=\E[7m:ms:nd=\E[C:pt:rs=\E[r\E<\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:se=\E[m:sf=\n:so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[1m:xn:






END_OF_FILE
if test 510 -ne `wc -c <'xterm/termcap.bold'`; then
    echo shar: \"'xterm/termcap.bold'\" unpacked with wrong size!
fi
# end of 'xterm/termcap.bold'
fi
echo shar: End of archive 8 \(of 14\).
cp /dev/null ark8isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 14 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
dan
----------------------------------------------------
O'Reilly && Associates   argv@sun.com / argv@ora.com
Opinions expressed reflect those of the author only.