aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/xgterm/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/xgterm/menu.c')
-rw-r--r--vendor/x11iraf/xgterm/menu.c1313
1 files changed, 1313 insertions, 0 deletions
diff --git a/vendor/x11iraf/xgterm/menu.c b/vendor/x11iraf/xgterm/menu.c
new file mode 100644
index 00000000..63c7e619
--- /dev/null
+++ b/vendor/x11iraf/xgterm/menu.c
@@ -0,0 +1,1313 @@
+/* $XConsortium: menu.c,v 1.63 94/04/17 20:23:30 gildea Exp $ */
+/*
+
+Copyright (c) 1989 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+
+*/
+
+#include "ptyx.h"
+#include "data.h"
+#include "menu.h"
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xmu/CharSet.h>
+#include <X11/Xaw/SimpleMenu.h>
+#include <X11/Xaw/SmeBSB.h>
+#include <X11/Xaw/SmeLine.h>
+#include <stdio.h>
+#include <signal.h>
+
+extern void FindFontSelection();
+
+Arg menuArgs[2] = {{ XtNleftBitmap, (XtArgVal) 0 },
+ { XtNsensitive, (XtArgVal) 0 }};
+
+void do_hangup();
+
+static void do_securekbd(), do_allowsends(), do_visualbell(),
+#ifdef ALLOWLOGGING
+ do_logging(),
+#endif
+ do_redraw(), do_suspend(), do_continue(), do_interrupt(),
+ do_terminate(), do_kill(), do_quit(), do_scrollbar(), do_jumpscroll(),
+ do_reversevideo(), do_autowrap(), do_reversewrap(), do_autolinefeed(),
+ do_appcursor(), do_appkeypad(), do_scrollkey(), do_scrollttyoutput(),
+ do_allow132(), do_cursesemul(), do_marginbell(), do_altscreen(),
+ do_softreset(), do_hardreset(), do_clearsavedlines(),
+ do_vthide(), do_vtshow(), do_vtmode(), do_vtfont(),
+ do_gioenable(), do_tekshow(), do_tekmode(), do_tekpage(),
+ do_tekreset(), do_tekcopy(), do_tekhide(), do_colortext();
+
+
+/*
+ * The order entries MUST match the values given in menu.h
+ */
+MenuEntry mainMenuEntries[] = {
+ { "securekbd", do_securekbd, NULL }, /* 0 */
+ { "allowsends", do_allowsends, NULL }, /* 1 */
+#ifdef ALLOWLOGGING
+ { "logging", do_logging, NULL }, /* 2 */
+#endif
+ { "redraw", do_redraw, NULL }, /* 3 */
+ { "line1", NULL, NULL }, /* 4 */
+ { "suspend", do_suspend, NULL }, /* 5 */
+ { "continue", do_continue, NULL }, /* 6 */
+ { "interrupt", do_interrupt, NULL }, /* 7 */
+ { "hangup", do_hangup, NULL }, /* 8 */
+ { "terminate", do_terminate, NULL }, /* 9 */
+ { "kill", do_kill, NULL }, /* 10 */
+ { "line2", NULL, NULL }, /* 11 */
+ { "quit", do_quit, NULL }}; /* 12 */
+
+MenuEntry vtMenuEntries[] = {
+ { "scrollbar", do_scrollbar, NULL }, /* 0 */
+ { "jumpscroll", do_jumpscroll, NULL }, /* 1 */
+ { "reversevideo", do_reversevideo, NULL }, /* 2 */
+ { "colortext", do_colortext, NULL }, /* 3 */
+ { "line1", NULL, NULL }, /* 4 */
+ { "gioenable", do_gioenable, NULL }, /* 5 */
+ { "tekshow", do_tekshow, NULL }, /* 6 */
+ { "tekmode", do_tekmode, NULL }, /* 7 */
+ { "tekreset", do_tekreset, NULL }, /* 8 */
+ { "vthide", do_vthide, NULL }, /* 9 */
+ { "line2", NULL, NULL }, /* 10 */
+ { "autowrap", do_autowrap, NULL }, /* 11 */
+ { "reversewrap", do_reversewrap, NULL }, /* 12 */
+ { "autolinefeed", do_autolinefeed, NULL }, /* 13 */
+ { "appcursor", do_appcursor, NULL }, /* 14 */
+ { "appkeypad", do_appkeypad, NULL }, /* 15 */
+ { "scrollkey", do_scrollkey, NULL }, /* 16 */
+ { "scrollttyoutput",do_scrollttyoutput, NULL }, /* 17 */
+ { "allow132", do_allow132, NULL }, /* 18 */
+ { "cursesemul", do_cursesemul, NULL }, /* 19 */
+ { "visualbell", do_visualbell, NULL }, /* 20 */
+ { "marginbell", do_marginbell, NULL }, /* 21 */
+ { "altscreen", do_altscreen, NULL }, /* 22 */
+ { "line3", NULL, NULL }, /* 23 */
+ { "softreset", do_softreset, NULL }, /* 24 */
+ { "hardreset", do_hardreset, NULL }, /* 25 */
+ { "clearsavedlines",do_clearsavedlines, NULL }}; /* 26 */
+
+MenuEntry fontMenuEntries[] = {
+ { "fontdefault", do_vtfont, NULL }, /* 0 */
+ { "font1", do_vtfont, NULL }, /* 1 */
+ { "font2", do_vtfont, NULL }, /* 2 */
+ { "font3", do_vtfont, NULL }, /* 3 */
+ { "font4", do_vtfont, NULL }, /* 4 */
+ { "font5", do_vtfont, NULL }, /* 5 */
+ { "font6", do_vtfont, NULL }, /* 6 */
+ { "fontescape", do_vtfont, NULL }, /* 7 */
+ { "fontsel", do_vtfont, NULL }}; /* 8 */
+ /* this should match NMENUFONTS in ptyx.h */
+
+MenuEntry tekMenuEntries[] = {
+ { "tekpage", do_tekpage, NULL }, /* 0 */
+ { "tekhide", do_tekhide, NULL }, /* 1 */
+ { "vtshow", do_vtshow, NULL }, /* 2 */
+ { "tekreset", do_tekreset, NULL }}; /* 3 */
+
+static Widget create_menu();
+extern Widget toplevel;
+
+/*
+ * we really want to do these dynamically
+ */
+#define check_width 9
+#define check_height 8
+static unsigned char check_bits[] = {
+ 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00,
+ 0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00
+};
+
+
+/*
+ * public interfaces
+ */
+
+/* ARGSUSED */
+static Bool domenu (w, event, params, param_count)
+ Widget w;
+ XEvent *event; /* unused */
+ String *params; /* mainMenu, vtMenu, or tekMenu */
+ Cardinal *param_count; /* 0 or 1 */
+{
+ TScreen *screen = &term->screen;
+ Widget ww;
+
+ if (*param_count != 1) {
+ XBell (XtDisplay(w), 0);
+ return False;
+ }
+
+ switch (params[0][0]) {
+ case 'm':
+ if (!screen->mainMenu) {
+ screen->mainMenu = create_menu (term, toplevel, "mainMenu",
+ mainMenuEntries,
+ XtNumber(mainMenuEntries));
+ update_securekbd();
+ update_allowsends();
+#ifdef ALLOWLOGGING
+ update_logging();
+#endif
+#ifndef SIGTSTP
+ set_sensitivity (screen->mainMenu,
+ mainMenuEntries[mainMenu_suspend].widget, FALSE);
+#endif
+#ifndef SIGCONT
+ set_sensitivity (screen->mainMenu,
+ mainMenuEntries[mainMenu_continue].widget, FALSE);
+#endif
+ }
+ break;
+
+ case 'v':
+ if (!screen->vtMenu) {
+ screen->vtMenu = create_menu (term, toplevel, "vtMenu",
+ vtMenuEntries,
+ XtNumber(vtMenuEntries));
+ /* and turn off the alternate screen entry */
+ set_altscreen_sensitivity (FALSE);
+ update_scrollbar();
+ update_jumpscroll();
+ update_reversevideo();
+ update_colortext();
+ update_autowrap();
+ update_reversewrap();
+ update_autolinefeed();
+ update_appcursor();
+ update_appkeypad();
+ update_scrollkey();
+ update_scrollttyoutput();
+ update_allow132();
+ update_cursesemul();
+ update_visualbell();
+ update_marginbell();
+ update_gioenable();
+ update_vttekmode();
+ update_tekshow();
+ update_tekreset();
+ update_vtshow();
+ set_vthide_sensitivity();
+ set_tekhide_sensitivity();
+ set_tekreset_sensitivity();
+ }
+
+ /* Update tekshow entry to reflect current graphics application. */
+ if (ww = vtMenuEntries[vtMenu_tekshow].widget) {
+ char *ip, *op, *start;
+ char label[128];
+
+ XtVaGetValues (ww, XtNlabel, &ip, NULL);
+ for (op=label, start=NULL; *op = *ip; op++, ip++)
+ if (*op == '(')
+ start = isspace(*(op-1)) ? op - 1 : op;
+ if (!start)
+ start = label + strlen(label);
+
+ op = start;
+ if (gt_status()) {
+ *op++ = ' ';
+ *op++ = '(';
+ for (ip=gtermio_appname; *ip; )
+ *op++ = *ip++;
+ *op++ = ')';
+ }
+ *op = '\0';
+
+ XtVaSetValues (ww, XtNlabel, label, NULL);
+ }
+ break;
+
+ case 'f':
+ if (!screen->fontMenu) {
+ screen->fontMenu = create_menu (term, toplevel, "fontMenu",
+ fontMenuEntries,
+ NMENUFONTS);
+ set_menu_font (True);
+ set_sensitivity (screen->fontMenu,
+ fontMenuEntries[fontMenu_fontescape].widget,
+ (screen->menu_font_names[fontMenu_fontescape]
+ ? TRUE : FALSE));
+ }
+ FindFontSelection (NULL, True);
+ set_sensitivity (screen->fontMenu,
+ fontMenuEntries[fontMenu_fontsel].widget,
+ (screen->menu_font_names[fontMenu_fontsel]
+ ? TRUE : FALSE));
+ break;
+
+ case 't':
+ if (!screen->tekMenu) {
+ screen->tekMenu = create_menu (w, gtermio_toplevel, "tekMenu",
+ tekMenuEntries,
+ XtNumber(tekMenuEntries));
+ set_vthide_sensitivity();
+ set_tekhide_sensitivity();
+ set_tekreset_sensitivity();
+ update_vttekmode();
+ update_tekshow();
+ update_tekreset();
+ update_vtshow();
+ }
+ break;
+
+ default:
+ XBell (XtDisplay(w), 0);
+ return False;
+ }
+
+ return True;
+}
+
+void HandleCreateMenu (w, event, params, param_count)
+ Widget w;
+ XEvent *event; /* unused */
+ String *params; /* mainMenu, vtMenu, or tekMenu */
+ Cardinal *param_count; /* 0 or 1 */
+{
+ (void) domenu (w, event, params, param_count);
+}
+
+void HandlePopupMenu (w, event, params, param_count)
+ Widget w;
+ XEvent *event; /* unused */
+ String *params; /* mainMenu, vtMenu, or tekMenu */
+ Cardinal *param_count; /* 0 or 1 */
+{
+ if (domenu (w, event, params, param_count)) {
+ XtCallActionProc (w, "XawPositionSimpleMenu", event, params, 1);
+ XtCallActionProc (w, "MenuPopup", event, params, 1);
+ }
+}
+
+
+/*
+ * private interfaces - keep out!
+ */
+
+/*
+ * create_menu - create a popup shell and stuff the menu into it.
+ */
+
+static Widget create_menu (w, toplevelw, name, entries, nentries)
+ Widget w;
+ Widget toplevelw;
+ char *name;
+ struct _MenuEntry *entries;
+ int nentries;
+{
+ TScreen *screen = &term->screen;
+ static XtCallbackRec cb[2] = { { NULL, NULL }, { NULL, NULL }};
+ static Arg arg = { XtNcallback, (XtArgVal) cb };
+ Arg args[10];
+ int nargs;
+ Widget m;
+
+ if (XtDisplay(w) == gtermio_display) {
+ if (screen->tek_menu_item_bitmap == None) {
+ screen->tek_menu_item_bitmap =
+ XCreateBitmapFromData (XtDisplay(w),
+ RootWindowOfScreen(XtScreen(w)),
+ (char *)check_bits, check_width, check_height);
+ }
+ } else {
+ if (screen->menu_item_bitmap == None) {
+ screen->menu_item_bitmap =
+ XCreateBitmapFromData (XtDisplay(w),
+ RootWindowOfScreen(XtScreen(w)),
+ (char *)check_bits, check_width, check_height);
+ }
+ }
+
+ m = XtCreatePopupShell (name, simpleMenuWidgetClass, toplevelw, NULL, 0);
+
+ /* The following produces a double line to separate the menu title from
+ * it's items. It's not in the R6 xterm code but I left it here because
+ * it's a nice effect.
+ */
+ nargs = 0;
+ XtSetArg (args[nargs], XtNheight, 2);
+ nargs++;
+ XtCreateManagedWidget ("tline1", smeLineObjectClass, m, args, nargs);
+ XtCreateManagedWidget ("tline2", smeLineObjectClass, m, args, nargs);
+
+ for (; nentries > 0; nentries--, entries++) {
+ cb[0].callback = (XtCallbackProc) entries->function;
+ cb[0].closure = (caddr_t) entries->name;
+ entries->widget = XtCreateManagedWidget (entries->name,
+ (entries->function ?
+ smeBSBObjectClass :
+ smeLineObjectClass), m,
+ &arg, (Cardinal) 1);
+ }
+
+ /* do not realize at this point */
+ return m;
+}
+
+init_menu (menu)
+ char *menu;
+{
+ register TScreen *screen = &term->screen;
+ register int i;
+
+ switch (menu[0]) {
+ case 'f':
+ screen->fontMenu = NULL;
+ for (i=0; i < XtNumber(fontMenuEntries); i++)
+ fontMenuEntries[i].widget = NULL;
+ break;
+ case 'm':
+ screen->mainMenu = NULL;
+ for (i=0; i < XtNumber(mainMenuEntries); i++)
+ mainMenuEntries[i].widget = NULL;
+ break;
+ case 'v':
+ screen->vtMenu = NULL;
+ for (i=0; i < XtNumber(vtMenuEntries); i++)
+ vtMenuEntries[i].widget = NULL;
+ break;
+ case 't':
+ screen->tekMenu = NULL;
+ for (i=0; i < XtNumber(tekMenuEntries); i++)
+ tekMenuEntries[i].widget = NULL;
+ break;
+ }
+}
+
+/* ARGSUSED */
+static void handle_send_signal (gw, sig)
+ Widget gw;
+ int sig;
+{
+ register TScreen *screen = &term->screen;
+
+ if (screen->pid > 1) kill_process_group (screen->pid, sig);
+}
+
+
+/*
+ * action routines
+ */
+
+/* ARGSUSED */
+void DoSecureKeyboard (time)
+ Time time;
+{
+ do_securekbd (term->screen.mainMenu, NULL, NULL);
+}
+
+static void do_securekbd (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+ Time time = CurrentTime; /* XXX - wrong */
+
+ if (screen->grabbedKbd) {
+ XUngrabKeyboard (screen->display, time);
+ ReverseVideo (term);
+ screen->grabbedKbd = FALSE;
+ } else {
+ if (XGrabKeyboard (screen->display, term->core.window,
+ True, GrabModeAsync, GrabModeAsync, time)
+ != GrabSuccess) {
+ XBell (screen->display, 100);
+ } else {
+ ReverseVideo (term);
+ screen->grabbedKbd = TRUE;
+ }
+ }
+ update_securekbd();
+}
+
+
+static void do_allowsends (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ /*
+ screen->allowSendEvents = !screen->allowSendEvents;
+ update_allowsends ();
+ */
+}
+
+static void do_visualbell (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->visualbell = !screen->visualbell;
+ update_visualbell();
+}
+
+#ifdef ALLOWLOGGING
+static void do_logging (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ if (screen->logging) {
+ CloseLog (screen);
+ } else {
+ StartLog (screen);
+ }
+ /* update_logging done by CloseLog and StartLog */
+}
+#endif
+
+static void do_redraw (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ Redraw ();
+}
+
+
+/*
+ * The following cases use the pid instead of the process group so that we
+ * don't get hosed by programs that change their process group
+ */
+
+
+/* ARGSUSED */
+static void do_suspend (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+#ifdef SIGTSTP
+ handle_send_signal (gw, SIGTSTP);
+#endif
+}
+
+/* ARGSUSED */
+static void do_continue (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+#ifdef SIGCONT
+ handle_send_signal (gw, SIGCONT);
+#endif
+}
+
+/* ARGSUSED */
+static void do_interrupt (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_send_signal (gw, SIGINT);
+}
+
+/* ARGSUSED */
+void do_hangup (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_send_signal (gw, SIGHUP);
+}
+
+/* ARGSUSED */
+static void do_terminate (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_send_signal (gw, SIGTERM);
+}
+
+/* ARGSUSED */
+static void do_kill (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_send_signal (gw, SIGKILL);
+}
+
+static void do_quit (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ Cleanup (0);
+}
+
+
+
+/*
+ * vt menu callbacks
+ */
+
+static void do_scrollbar (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ if (screen->scrollbar) {
+ ScrollBarOff (screen);
+ } else {
+ ScrollBarOn (term, FALSE, FALSE);
+ }
+ update_scrollbar();
+}
+
+
+static void do_jumpscroll (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ term->flags ^= SMOOTHSCROLL;
+ if (term->flags & SMOOTHSCROLL) {
+ screen->jumpscroll = FALSE;
+ if (screen->scroll_amt) FlushScroll(screen);
+ } else {
+ screen->jumpscroll = TRUE;
+ }
+ update_jumpscroll();
+}
+
+
+static void do_reversevideo (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->flags ^= REVERSE_VIDEO;
+ ReverseVideo (term);
+ /* update_reversevideo done in ReverseVideo */
+}
+
+
+static void do_colortext (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->misc.dynamicColors = !term->misc.dynamicColors;
+ update_colortext ();
+ Redraw ();
+}
+
+
+static void do_autowrap (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->flags ^= WRAPAROUND;
+ update_autowrap();
+}
+
+
+static void do_reversewrap (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->flags ^= REVERSEWRAP;
+ update_reversewrap();
+}
+
+
+static void do_autolinefeed (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->flags ^= LINEFEED;
+ update_autolinefeed();
+}
+
+
+static void do_appcursor (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->keyboard.flags ^= CURSOR_APL;
+ update_appcursor();
+}
+
+
+static void do_appkeypad (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ term->keyboard.flags ^= KYPD_APL;
+ update_appkeypad();
+}
+
+
+static void do_scrollkey (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->scrollkey = !screen->scrollkey;
+ update_scrollkey();
+}
+
+
+static void do_scrollttyoutput (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->scrollttyoutput = !screen->scrollttyoutput;
+ update_scrollttyoutput();
+}
+
+
+static void do_allow132 (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->c132 = !screen->c132;
+ update_allow132();
+}
+
+
+static void do_cursesemul (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->curses = !screen->curses;
+ update_cursesemul();
+}
+
+
+static void do_marginbell (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ if (!(screen->marginbell = !screen->marginbell)) screen->bellarmed = -1;
+ update_marginbell();
+}
+
+
+static void do_altscreen (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ /* do nothing for now; eventually, will want to flip screen */
+}
+
+
+static void do_softreset (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ VTReset (FALSE);
+}
+
+
+static void do_hardreset (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ gt_reset();
+ VTReset (TRUE); /* does a longjmp */
+}
+
+
+static void do_clearsavedlines (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ screen->savedlines = 0;
+ ScrollBarDrawThumb(screen->scrollWidget);
+ VTReset (TRUE); /* does a longjmp */
+}
+
+/* ARGSUSED */
+static void do_gioenable (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ gt_enable (!gt_enable(2));
+ update_gioenable();
+}
+
+/* ARGSUSED */
+static void do_tekmode (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ switch_modes (gt_tekmode(2)); /* switch to tek mode */
+}
+
+static void handle_tekshow (gw, allowswitch)
+ Widget gw;
+ Bool allowswitch;
+{
+ register TScreen *screen = &term->screen;
+
+ if (!gt_activated()) { /* not showing, turn on */
+ set_tek_visibility (TRUE);
+ } else if (screen->Vshow || allowswitch) { /* is showing, turn off */
+ set_tek_visibility (FALSE);
+ } else
+ Bell();
+}
+
+/* ARGSUSED */
+static void do_tekshow (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_tekshow (gw, True);
+}
+
+/* ARGSUSED */
+static void do_tekonoff (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_tekshow (gw, False);
+}
+
+
+/* ARGSUSED */
+static void do_vthide (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ hide_vt_window();
+}
+
+
+/*
+ * vtfont menu
+ */
+
+static void do_vtfont (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ char *entryname = (char *) closure;
+ int i;
+
+ for (i = 0; i < NMENUFONTS; i++) {
+ if (strcmp (entryname, fontMenuEntries[i].name) == 0) {
+ SetVTFont (i, True, NULL, NULL);
+ return;
+ }
+ }
+ Bell();
+}
+
+
+/*
+ * tek menu
+ */
+
+
+static void do_tekpage (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ gt_clear();
+}
+
+
+static void do_tekreset (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ gt_reset();
+ set_vthide_sensitivity();
+ set_tekhide_sensitivity();
+ set_tekreset_sensitivity();
+ update_vttekmode();
+ update_tekshow();
+ update_tekreset();
+ update_vtshow();
+}
+
+
+static void do_tekcopy (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ /* TekCopy (); */
+}
+
+
+static void handle_vtshow (gw, allowswitch)
+ Widget gw;
+ Bool allowswitch;
+{
+ register TScreen *screen = &term->screen;
+
+ if (!screen->Vshow) { /* not showing, turn on */
+ set_vt_visibility (TRUE);
+ } else if (gt_activated() || allowswitch) { /* is showing, turn off */
+ set_vt_visibility (FALSE);
+ end_vt_mode ();
+ } else
+ Bell();
+}
+
+static void do_vtshow (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_vtshow (gw, True);
+}
+
+static void do_vtonoff (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ handle_vtshow (gw, False);
+}
+
+static void do_vtmode (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ register TScreen *screen = &term->screen;
+
+ switch_modes (gt_activated()); /* switch to vt, or from */
+}
+
+
+/* ARGSUSED */
+static void do_tekhide (gw, closure, data)
+ Widget gw;
+ caddr_t closure, data;
+{
+ gt_deactivate();
+ set_vthide_sensitivity();
+ set_tekhide_sensitivity();
+ set_tekreset_sensitivity();
+ update_vttekmode();
+ update_tekshow();
+ update_tekreset();
+ update_vtshow();
+}
+
+
+
+/*
+ * public handler routines
+ */
+
+static void handle_toggle (proc, var, params, nparams, w, closure, data)
+ void (*proc)();
+ int var;
+ String *params;
+ Cardinal nparams;
+ Widget w;
+ caddr_t closure, data;
+{
+ int dir = -2;
+
+ switch (nparams) {
+ case 0:
+ dir = -1;
+ break;
+ case 1:
+ if (XmuCompareISOLatin1 (params[0], "on") == 0) dir = 1;
+ else if (XmuCompareISOLatin1 (params[0], "off") == 0) dir = 0;
+ else if (XmuCompareISOLatin1 (params[0], "toggle") == 0) dir = -1;
+ break;
+ }
+
+ switch (dir) {
+ case -2:
+ Bell();
+ break;
+
+ case -1:
+ (*proc) (w, closure, data);
+ break;
+
+ case 0:
+ if (var) (*proc) (w, closure, data);
+ else Bell();
+ break;
+
+ case 1:
+ if (!var) (*proc) (w, closure, data);
+ else Bell();
+ break;
+ }
+ return;
+}
+
+void HandleAllowSends(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ /* Currently since we use Xt event processing we cannot easily disable
+ * sendevents as is done in xevent().
+ *
+ handle_toggle (do_allowsends, (int) term->screen.allowSendEvents,
+ params, *param_count, w, NULL, NULL);
+ */
+}
+
+void HandleSetVisualBell(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_visualbell, (int) term->screen.visualbell,
+ params, *param_count, w, NULL, NULL);
+}
+
+#ifdef ALLOWLOGGING
+void HandleLogging(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_logging, (int) term->screen.logging,
+ params, *param_count, w, NULL, NULL);
+}
+#endif
+
+/* ARGSUSED */
+void HandleRedraw(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_redraw(w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleSendSignal(w, event, params, param_count)
+ Widget w;
+ XEvent *event; /* unused */
+ String *params;
+ Cardinal *param_count;
+{
+ static struct sigtab {
+ char *name;
+ int sig;
+ } signals[] = {
+#ifdef SIGTSTP
+ { "suspend", SIGTSTP },
+ { "tstp", SIGTSTP },
+#endif
+#ifdef SIGCONT
+ { "cont", SIGCONT },
+#endif
+ { "int", SIGINT },
+ { "hup", SIGHUP },
+ { "quit", SIGQUIT },
+ { "alrm", SIGALRM },
+ { "alarm", SIGALRM },
+ { "term", SIGTERM },
+ { "kill", SIGKILL },
+ { NULL, 0 },
+ };
+
+ if (*param_count == 1) {
+ struct sigtab *st;
+
+ for (st = signals; st->name; st++) {
+ if (XmuCompareISOLatin1 (st->name, params[0]) == 0) {
+ handle_send_signal (w, st->sig);
+ return;
+ }
+ }
+ /* one could allow numeric values, but that would be a security hole */
+ }
+
+ Bell();
+}
+
+/* ARGSUSED */
+void HandleQuit(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_quit(w, NULL, NULL);
+}
+
+void HandleScrollbar(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_scrollbar, (int) term->screen.scrollbar,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleJumpscroll(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_jumpscroll, (int) term->screen.jumpscroll,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleReverseVideo(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_reversevideo, (int) (term->flags & REVERSE_VIDEO),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAutoWrap(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_autowrap, (int) (term->flags & WRAPAROUND),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleReverseWrap(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_reversewrap, (int) (term->flags & REVERSEWRAP),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAutoLineFeed(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_autolinefeed, (int) (term->flags & LINEFEED),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAppCursor(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_appcursor, (int) (term->keyboard.flags & CURSOR_APL),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAppKeypad(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_appkeypad, (int) (term->keyboard.flags & KYPD_APL),
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleScrollKey(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_scrollkey, (int) term->screen.scrollkey,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleScrollTtyOutput(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_scrollttyoutput, (int) term->screen.scrollttyoutput,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAllow132(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_allow132, (int) term->screen.c132,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleCursesEmul(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_cursesemul, (int) term->screen.curses,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleMarginBell(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ handle_toggle (do_marginbell, (int) term->screen.marginbell,
+ params, *param_count, w, NULL, NULL);
+}
+
+void HandleAltScreen(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ /* eventually want to see if sensitive or not */
+ handle_toggle (do_altscreen, (int) term->screen.alternate,
+ params, *param_count, w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleSoftReset(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_softreset(w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleHardReset(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_hardreset(w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleClearSavedLines(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_clearsavedlines(w, NULL, NULL);
+}
+
+void HandleSetTerminalType(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ if (*param_count == 1) {
+ switch (params[0][0]) {
+ case 'v': case 'V':
+ if (gt_activated()) do_vtmode (w, NULL, NULL);
+ break;
+ case 't': case 'T':
+ if (!gt_activated()) do_tekmode (w, NULL, NULL);
+ break;
+ default:
+ Bell();
+ }
+ } else {
+ Bell();
+ }
+}
+
+void HandleVisibility(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ if (*param_count == 2) {
+ switch (params[0][0]) {
+ case 'v': case 'V':
+ handle_toggle (do_vtonoff, (int) term->screen.Vshow,
+ params+1, (*param_count) - 1, w, NULL, NULL);
+ break;
+ case 't': case 'T':
+ handle_toggle (do_tekonoff, (int) gt_activated(),
+ params+1, (*param_count) - 1, w, NULL, NULL);
+ break;
+ default:
+ Bell();
+ }
+ } else {
+ Bell();
+ }
+}
+
+/* ARGSUSED */
+void HandleTekPage(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_tekpage(w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleTekReset(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_tekreset(w, NULL, NULL);
+}
+
+/* ARGSUSED */
+void HandleTekCopy(w, event, params, param_count)
+ Widget w;
+ XEvent *event;
+ String *params;
+ Cardinal *param_count;
+{
+ do_tekcopy(w, NULL, NULL);
+}