v09i038: colxterm -- Color xterm, Part08/14
Tom Weinstein
tomw at orac.esd.sgi.com
Fri Sep 14 13:50:23 AEST 1990
Submitted-by: Tom Weinstein <tomw at 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 at 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 at 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 at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list