diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 11:11:55 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 11:11:55 +0000 |
commit | 145a665014b2aa230b81b582689c8ec17ef9968e (patch) | |
tree | 5ea1019527fe16cc21b9702371c72cc7f8c8090c /app/xterm/menu.c | |
parent | 95c2d1cbda23a41cdf6e63520c7f0b825e63dd5b (diff) |
Importing xterm 216
Diffstat (limited to 'app/xterm/menu.c')
-rw-r--r-- | app/xterm/menu.c | 3041 |
1 files changed, 3041 insertions, 0 deletions
diff --git a/app/xterm/menu.c b/app/xterm/menu.c new file mode 100644 index 000000000..2bb682769 --- /dev/null +++ b/app/xterm/menu.c @@ -0,0 +1,3041 @@ +/* $XTermId: menu.c,v 1.217 2006/07/23 20:13:22 tom Exp $ */ + +/* + +Copyright 1999-2005,2006 by Thomas E. Dickey + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of the above listed +copyright holder(s) not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. + +THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE +LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Copyright 1989 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ +/* $XFree86: xc/programs/xterm/menu.c,v 3.68 2006/04/10 00:34:36 dickey Exp $ */ + +#include <xterm.h> +#include <data.h> +#include <menu.h> +#include <fontutils.h> + +#include <X11/Xmu/CharSet.h> + +#define app_con Xaw_app_con /* quiet a warning from SimpleMenu.h */ + +#if defined(HAVE_LIB_XAW) + +#include <X11/Xaw/SimpleMenu.h> +#include <X11/Xaw/Box.h> +#include <X11/Xaw/SmeBSB.h> +#include <X11/Xaw/SmeLine.h> + +#if OPT_TOOLBAR +#include <X11/Xaw/MenuButton.h> +#include <X11/Xaw/Form.h> +#endif + +#elif defined(HAVE_LIB_XAW3D) + +#include <X11/Xaw3d/SimpleMenu.h> +#include <X11/Xaw3d/Box.h> +#include <X11/Xaw3d/SmeBSB.h> +#include <X11/Xaw3d/SmeLine.h> + +#if OPT_TOOLBAR +#include <X11/Xaw3d/MenuButton.h> +#include <X11/Xaw3d/Form.h> +#endif + +#elif defined(HAVE_LIB_NEXTAW) + +#include <X11/neXtaw/SimpleMenu.h> +#include <X11/neXtaw/Box.h> +#include <X11/neXtaw/SmeBSB.h> +#include <X11/neXtaw/SmeLine.h> + +#if OPT_TOOLBAR +#include <X11/neXtaw/MenuButton.h> +#include <X11/neXtaw/Form.h> +#endif + +#elif defined(HAVE_LIB_XAWPLUS) + +#include <X11/XawPlus/SimpleMenu.h> +#include <X11/XawPlus/Box.h> +#include <X11/XawPlus/SmeBSB.h> +#include <X11/XawPlus/SmeLine.h> + +#if OPT_TOOLBAR +#include <X11/XawPlus/MenuButton.h> +#include <X11/XawPlus/Form.h> +#endif + +#endif + +#undef app_con + +#include <stdio.h> +#include <signal.h> +/* *INDENT-OFF* */ +static void do_8bit_control PROTO_XT_CALLBACK_ARGS; +static void do_allow132 PROTO_XT_CALLBACK_ARGS; +static void do_allowsends PROTO_XT_CALLBACK_ARGS; +static void do_altscreen PROTO_XT_CALLBACK_ARGS; +static void do_appcursor PROTO_XT_CALLBACK_ARGS; +static void do_appkeypad PROTO_XT_CALLBACK_ARGS; +static void do_autolinefeed PROTO_XT_CALLBACK_ARGS; +static void do_autowrap PROTO_XT_CALLBACK_ARGS; +static void do_backarrow PROTO_XT_CALLBACK_ARGS; +static void do_clearsavedlines PROTO_XT_CALLBACK_ARGS; +static void do_continue PROTO_XT_CALLBACK_ARGS; +static void do_delete_del PROTO_XT_CALLBACK_ARGS; +static void do_hardreset PROTO_XT_CALLBACK_ARGS; +static void do_interrupt PROTO_XT_CALLBACK_ARGS; +static void do_jumpscroll PROTO_XT_CALLBACK_ARGS; +static void do_kill PROTO_XT_CALLBACK_ARGS; +static void do_marginbell PROTO_XT_CALLBACK_ARGS; +static void do_old_fkeys PROTO_XT_CALLBACK_ARGS; +static void do_print PROTO_XT_CALLBACK_ARGS; +static void do_print_redir PROTO_XT_CALLBACK_ARGS; +static void do_quit PROTO_XT_CALLBACK_ARGS; +static void do_redraw PROTO_XT_CALLBACK_ARGS; +static void do_reversevideo PROTO_XT_CALLBACK_ARGS; +static void do_reversewrap PROTO_XT_CALLBACK_ARGS; +static void do_scrollbar PROTO_XT_CALLBACK_ARGS; +static void do_scrollkey PROTO_XT_CALLBACK_ARGS; +static void do_scrollttyoutput PROTO_XT_CALLBACK_ARGS; +static void do_securekbd PROTO_XT_CALLBACK_ARGS; +static void do_selectClipboard PROTO_XT_CALLBACK_ARGS; +static void do_softreset PROTO_XT_CALLBACK_ARGS; +static void do_suspend PROTO_XT_CALLBACK_ARGS; +static void do_terminate PROTO_XT_CALLBACK_ARGS; +static void do_titeInhibit PROTO_XT_CALLBACK_ARGS; +static void do_visualbell PROTO_XT_CALLBACK_ARGS; +static void do_poponbell PROTO_XT_CALLBACK_ARGS; +static void do_vtfont PROTO_XT_CALLBACK_ARGS; + +#ifdef ALLOWLOGGING +static void do_logging PROTO_XT_CALLBACK_ARGS; +#endif + +#ifndef NO_ACTIVE_ICON +static void do_activeicon PROTO_XT_CALLBACK_ARGS; +#endif /* NO_ACTIVE_ICON */ + +#if OPT_BLINK_CURS +static void do_cursorblink PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_BOX_CHARS +static void do_font_boxchars PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_DEC_CHRSET +static void do_font_doublesize PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_DEC_SOFTFONT +static void do_font_loadable PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_HP_FUNC_KEYS +static void do_hp_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_NUM_LOCK +static void do_alt_esc PROTO_XT_CALLBACK_ARGS; +static void do_num_lock PROTO_XT_CALLBACK_ARGS; +static void do_meta_esc PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_RENDERFONT +static void do_font_renderfont PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SCO_FUNC_KEYS +static void do_sco_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SUN_FUNC_KEYS +static void do_sun_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SUNPC_KBD +static void do_sun_kbd PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_TEK4014 +static void do_tekcopy PROTO_XT_CALLBACK_ARGS; +static void do_tekhide PROTO_XT_CALLBACK_ARGS; +static void do_tekmode PROTO_XT_CALLBACK_ARGS; +static void do_tekonoff PROTO_XT_CALLBACK_ARGS; +static void do_tekpage PROTO_XT_CALLBACK_ARGS; +static void do_tekreset PROTO_XT_CALLBACK_ARGS; +static void do_tekshow PROTO_XT_CALLBACK_ARGS; +static void do_tektext2 PROTO_XT_CALLBACK_ARGS; +static void do_tektext3 PROTO_XT_CALLBACK_ARGS; +static void do_tektextlarge PROTO_XT_CALLBACK_ARGS; +static void do_tektextsmall PROTO_XT_CALLBACK_ARGS; +static void do_vthide PROTO_XT_CALLBACK_ARGS; +static void do_vtmode PROTO_XT_CALLBACK_ARGS; +static void do_vtonoff PROTO_XT_CALLBACK_ARGS; +static void do_vtshow PROTO_XT_CALLBACK_ARGS; +static void handle_tekshow (Widget gw, Bool allowswitch); +static void handle_vtshow (Widget gw, Bool allowswitch); +#endif + +#if OPT_TOOLBAR +static void do_toolbar PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_WIDE_CHARS +static void do_font_utf8_mode PROTO_XT_CALLBACK_ARGS; +static void do_font_utf8_title PROTO_XT_CALLBACK_ARGS; +#endif + +/* + * The order of entries MUST match the values given in menu.h + */ +MenuEntry mainMenuEntries[] = { +#if OPT_TOOLBAR + { "toolbar", do_toolbar, NULL }, +#endif + { "securekbd", do_securekbd, NULL }, + { "allowsends", do_allowsends, NULL }, + { "redraw", do_redraw, NULL }, + { "line1", NULL, NULL }, +#ifdef ALLOWLOGGING + { "logging", do_logging, NULL }, +#endif + { "print", do_print, NULL }, + { "print-redirect", do_print_redir, NULL }, + { "line2", NULL, NULL }, + { "8-bit control", do_8bit_control,NULL }, + { "backarrow key", do_backarrow, NULL }, +#if OPT_NUM_LOCK + { "num-lock", do_num_lock, NULL }, + { "alt-esc", do_alt_esc, NULL }, + { "meta-esc", do_meta_esc, NULL }, +#endif + { "delete-is-del", do_delete_del, NULL }, + { "oldFunctionKeys",do_old_fkeys, NULL }, +#if OPT_HP_FUNC_KEYS + { "hpFunctionKeys", do_hp_fkeys, NULL }, +#endif +#if OPT_SCO_FUNC_KEYS + { "scoFunctionKeys",do_sco_fkeys, NULL }, +#endif +#if OPT_SUN_FUNC_KEYS + { "sunFunctionKeys",do_sun_fkeys, NULL }, +#endif +#if OPT_SUNPC_KBD + { "sunKeyboard", do_sun_kbd, NULL }, +#endif + { "line3", NULL, NULL }, + { "suspend", do_suspend, NULL }, + { "continue", do_continue, NULL }, + { "interrupt", do_interrupt, NULL }, + { "hangup", do_hangup, NULL }, + { "terminate", do_terminate, NULL }, + { "kill", do_kill, NULL }, + { "line4", NULL, NULL }, + { "quit", do_quit, NULL }}; + +MenuEntry vtMenuEntries[] = { + { "scrollbar", do_scrollbar, NULL }, + { "jumpscroll", do_jumpscroll, NULL }, + { "reversevideo", do_reversevideo, NULL }, + { "autowrap", do_autowrap, NULL }, + { "reversewrap", do_reversewrap, NULL }, + { "autolinefeed", do_autolinefeed, NULL }, + { "appcursor", do_appcursor, NULL }, + { "appkeypad", do_appkeypad, NULL }, + { "scrollkey", do_scrollkey, NULL }, + { "scrollttyoutput",do_scrollttyoutput, NULL }, + { "allow132", do_allow132, NULL }, + { "selectToClipboard",do_selectClipboard, NULL }, + { "visualbell", do_visualbell, NULL }, + { "poponbell", do_poponbell, NULL }, + { "marginbell", do_marginbell, NULL }, +#if OPT_BLINK_CURS + { "cursorblink", do_cursorblink, NULL }, +#endif + { "titeInhibit", do_titeInhibit, NULL }, +#ifndef NO_ACTIVE_ICON + { "activeicon", do_activeicon, NULL }, +#endif /* NO_ACTIVE_ICON */ + { "line1", NULL, NULL }, + { "softreset", do_softreset, NULL }, + { "hardreset", do_hardreset, NULL }, + { "clearsavedlines",do_clearsavedlines, NULL }, + { "line2", NULL, NULL }, +#if OPT_TEK4014 + { "tekshow", do_tekshow, NULL }, + { "tekmode", do_tekmode, NULL }, + { "vthide", do_vthide, NULL }, +#endif + { "altscreen", do_altscreen, NULL }, + }; + +MenuEntry fontMenuEntries[] = { + { "fontdefault", do_vtfont, NULL }, + { "font1", do_vtfont, NULL }, + { "font2", do_vtfont, NULL }, + { "font3", do_vtfont, NULL }, + { "font4", do_vtfont, NULL }, + { "font5", do_vtfont, NULL }, + { "font6", do_vtfont, NULL }, + /* this is after the last builtin font; the other entries are special */ + { "fontescape", do_vtfont, NULL }, + { "fontsel", do_vtfont, NULL }, + /* down to here should match NMENUFONTS in ptyx.h */ + +#if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT + { "line1", NULL, NULL }, +#if OPT_BOX_CHARS + { "font-linedrawing",do_font_boxchars,NULL }, +#endif +#if OPT_DEC_CHRSET + { "font-doublesize",do_font_doublesize,NULL }, +#endif +#if OPT_DEC_SOFTFONT + { "font-loadable", do_font_loadable,NULL }, +#endif +#endif /* toggles for DEC font extensions */ + +#if OPT_RENDERFONT || OPT_WIDE_CHARS + { "line2", NULL, NULL }, +#if OPT_RENDERFONT + { "render-font", do_font_renderfont,NULL }, +#endif +#if OPT_WIDE_CHARS + { "utf8-mode", do_font_utf8_mode,NULL }, + { "utf8-title", do_font_utf8_title,NULL }, +#endif +#endif /* toggles for other font extensions */ + + }; + +#if OPT_TEK4014 +MenuEntry tekMenuEntries[] = { + { "tektextlarge", do_tektextlarge, NULL }, + { "tektext2", do_tektext2, NULL }, + { "tektext3", do_tektext3, NULL }, + { "tektextsmall", do_tektextsmall, NULL }, + { "line1", NULL, NULL }, + { "tekpage", do_tekpage, NULL }, + { "tekreset", do_tekreset, NULL }, + { "tekcopy", do_tekcopy, NULL }, + { "line2", NULL, NULL }, + { "vtshow", do_vtshow, NULL }, + { "vtmode", do_vtmode, NULL }, + { "tekhide", do_tekhide, NULL }}; +#endif + +typedef struct { + char *internal_name; + MenuEntry *entry_list; + Cardinal entry_len; +} MenuHeader; + + /* This table is ordered to correspond with MenuIndex */ +static MenuHeader menu_names[] = { + { "mainMenu", mainMenuEntries, XtNumber(mainMenuEntries) }, + { "vtMenu", vtMenuEntries, XtNumber(vtMenuEntries) }, + { "fontMenu", fontMenuEntries, XtNumber(fontMenuEntries) }, +#if OPT_TEK4014 + { "tekMenu", tekMenuEntries, XtNumber(tekMenuEntries) }, +#endif + { 0, 0, 0 }, +}; +/* *INDENT-ON* */ + +/* + * FIXME: These are global data rather than in the xterm widget because they + * are initialized before the widget is created. + */ +typedef struct { + Widget b; /* the toolbar's buttons */ + Widget w; /* the popup shell activated by the button */ + Cardinal entries; +} MenuList; + +static MenuList vt_shell[NUM_POPUP_MENUS]; + +#if OPT_TEK4014 && OPT_TOOLBAR +static MenuList tek_shell[NUM_POPUP_MENUS]; +#endif + +/* + * Returns a pointer to the MenuList entry that matches the popup menu. + */ +static MenuList * +select_menu(Widget w GCC_UNUSED, MenuIndex num) +{ +#if OPT_TEK4014 && OPT_TOOLBAR + while (w != 0) { + if (w == tekshellwidget) { + return &tek_shell[num]; + } + w = XtParent(w); + } +#endif + return &vt_shell[num]; +} + +/* + * Returns a pointer to the given popup menu shell + */ +static Widget +obtain_menu(Widget w, MenuIndex num) +{ + return select_menu(w, num)->w; +} + +/* + * Returns the number of entries in the given popup menu shell + */ +static Cardinal +sizeof_menu(Widget w, MenuIndex num) +{ + return select_menu(w, num)->entries; +} + +/* + * create_menu - create a popup shell and stuff the menu into it. + */ + +static Widget +create_menu(Widget w, XtermWidget xtw, MenuIndex num) +{ + static XtCallbackRec cb[2] = + { + {NULL, NULL}, + {NULL, NULL}}; + static Arg arg = + {XtNcallback, (XtArgVal) cb}; + + Widget m; + TScreen *screen = &xtw->screen; + MenuHeader *data = &menu_names[num]; + MenuList *list = select_menu(w, num); + struct _MenuEntry *entries = data->entry_list; + int nentries = data->entry_len; + + if (screen->menu_item_bitmap == None) { + /* + * 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 + }; + + screen->menu_item_bitmap = + XCreateBitmapFromData(XtDisplay(xtw), + RootWindowOfScreen(XtScreen(xtw)), + (char *) check_bits, check_width, check_height); + } +#if OPT_TOOLBAR + m = list->w; + if (m == 0) { + return m; + } +#else + m = XtCreatePopupShell(data->internal_name, + simpleMenuWidgetClass, + toplevel, + NULL, 0); + list->w = m; +#endif + list->entries = nentries; + + 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; +} + +static MenuIndex +indexOfMenu(String menuName) +{ + MenuIndex me; + switch (*menuName) { + case 'm': + me = mainMenu; + break; + case 'v': + me = vtMenu; + break; + case 'f': + me = fontMenu; + break; +#if OPT_TEK4014 + case 't': + me = tekMenu; + break; +#endif + default: + me = noMenu; + } + return (me); +} + +/* + * public interfaces + */ + +/* ARGSUSED */ +static Bool +domenu(Widget w GCC_UNUSED, + XEvent * event GCC_UNUSED, + String * params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + TScreen *screen = &term->screen; + MenuIndex me; + Bool created = False; + Widget mw; + + if (*param_count != 1) { + Bell(XkbBI_MinorError, 0); + return False; + } + + if ((me = indexOfMenu(params[0])) == noMenu) { + Bell(XkbBI_MinorError, 0); + return False; + } + + if ((mw = obtain_menu(w, me)) == 0 + || sizeof_menu(w, me) == 0) { + mw = create_menu(w, term, me); + created = (mw != 0); + } + if (mw == 0) + return False; + + TRACE(("domenu(%s) %s\n", params[0], created ? "create" : "update")); + switch (me) { + case mainMenu: + if (created) { + update_toolbar(); + update_securekbd(); + update_allowsends(); + update_logging(); + update_print_redir(); + update_8bit_control(); + update_decbkm(); + update_num_lock(); + update_alt_esc(); + update_meta_esc(); + update_delete_del(); + update_keyboard_type(); + if (!xtermHasPrinter()) { + SetItemSensitivity(mainMenuEntries[mainMenu_print].widget, + False); + SetItemSensitivity(mainMenuEntries[mainMenu_print_redir].widget, + False); + } + if (screen->terminal_id < 200) { + SetItemSensitivity( + mainMenuEntries[mainMenu_8bit_ctrl].widget, + False); + } +#if !defined(SIGTSTP) + SetItemSensitivity( + mainMenuEntries[mainMenu_suspend].widget, False); +#endif +#if !defined(SIGCONT) + SetItemSensitivity( + mainMenuEntries[mainMenu_continue].widget, False); +#endif +#ifdef ALLOWLOGGING + if (screen->inhibit & I_LOG) { + SetItemSensitivity( + mainMenuEntries[mainMenu_logging].widget, False); + } +#endif + if (screen->inhibit & I_SIGNAL) { + int n; + for (n = (int) mainMenu_suspend; n <= (int) mainMenu_quit; ++n) { + SetItemSensitivity(mainMenuEntries[n].widget, False); + } + } + } + break; + + case vtMenu: + if (created) { + update_scrollbar(); + update_jumpscroll(); + update_reversevideo(); + update_autowrap(); + update_reversewrap(); + update_autolinefeed(); + update_appcursor(); + update_appkeypad(); + update_scrollkey(); + update_scrollttyoutput(); + update_allow132(); + update_cursesemul(); + update_selectToClipboard(); + update_visualbell(); + update_poponbell(); + update_marginbell(); + update_cursorblink(); + update_altscreen(); + update_titeInhibit(); +#ifndef NO_ACTIVE_ICON + if (!screen->fnt_icon || !screen->iconVwin.window) { + SetItemSensitivity( + vtMenuEntries[vtMenu_activeicon].widget, + False); + } else + update_activeicon(); +#endif /* NO_ACTIVE_ICON */ +#if OPT_TEK4014 + if (screen->inhibit & I_TEK) { + int n; + for (n = (int) vtMenu_tekshow; n <= (int) vtMenu_vthide; ++n) { + SetItemSensitivity(vtMenuEntries[n].widget, False); + } + } +#endif + } + break; + + case fontMenu: + if (created) { + set_menu_font(True); + SetItemSensitivity( + fontMenuEntries[fontMenu_fontescape].widget, + (screen->menu_font_names[fontMenu_fontescape] + ? True : False)); +#if OPT_BOX_CHARS + update_font_boxchars(); + SetItemSensitivity( + fontMenuEntries[fontMenu_font_boxchars].widget, + True); +#endif +#if OPT_DEC_SOFTFONT /* FIXME: not implemented */ + update_font_loadable(); + SetItemSensitivity( + fontMenuEntries[fontMenu_font_loadable].widget, + False); +#endif +#if OPT_DEC_CHRSET + update_font_doublesize(); + if (term->screen.cache_doublesize == 0) + SetItemSensitivity( + fontMenuEntries[fontMenu_font_doublesize].widget, + False); +#endif +#if OPT_RENDERFONT + update_font_renderfont(); + if (term->misc.face_name == 0) { + SetItemSensitivity( + fontMenuEntries[fontMenu_render_font].widget, + False); + } +#endif +#if OPT_WIDE_CHARS + update_font_utf8_mode(); + update_font_utf8_title(); +#endif + } + FindFontSelection(term, NULL, True); + SetItemSensitivity( + fontMenuEntries[fontMenu_fontsel].widget, + (screen->menu_font_names[fontMenu_fontsel] + ? True : False)); + break; + +#if OPT_TEK4014 + case tekMenu: + if (created) { + set_tekfont_menu_item(screen->cur.fontsize, True); + update_vtshow(); + } + break; +#endif + default: + break; + } + + return True; +} + +void +HandleCreateMenu(Widget w, + XEvent * event, + String * params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + TRACE(("HandleCreateMenu\n")); + (void) domenu(w, event, params, param_count); +} + +void +HandlePopupMenu(Widget w, + XEvent * event, + String * params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + TRACE(("HandlePopupMenu\n")); + if (domenu(w, event, params, param_count)) { +#if OPT_TOOLBAR + w = select_menu(w, mainMenu)->w; +#endif + XtCallActionProc(w, "XawPositionSimpleMenu", event, params, 1); + XtCallActionProc(w, "MenuPopup", event, params, 1); + } +} + +/* + * private interfaces - keep out! + */ + +/* ARGSUSED */ +static void +handle_send_signal(Widget gw GCC_UNUSED, int sig) +{ +#ifndef VMS + TScreen *screen = &term->screen; + + if (hold_screen > 1) + hold_screen = 0; + if (screen->pid > 1) + kill_process_group(screen->pid, sig); +#endif +} + +/* + * action routines + */ + +static void +do_securekbd(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + Time now = CurrentTime; /* XXX - wrong */ + + if (screen->grabbedKbd) { + XUngrabKeyboard(screen->display, now); + ReverseVideo(term); + screen->grabbedKbd = False; + } else { + if (XGrabKeyboard(screen->display, XtWindow(CURRENT_EMU(screen)), + True, GrabModeAsync, GrabModeAsync, now) + != GrabSuccess) { + Bell(XkbBI_MinorError, 100); + } else { + ReverseVideo(term); + screen->grabbedKbd = True; + } + } + update_securekbd(); +} + +/* ARGSUSED */ +void +HandleSecure(Widget w GCC_UNUSED, + XEvent * event GCC_UNUSED, /* unused */ + String * params GCC_UNUSED, /* [0] = volume */ + Cardinal *param_count GCC_UNUSED) /* 0 or 1 */ +{ +#if 0 + Time ev_time = CurrentTime; + + if ((event->xany.type == KeyPress) || + (event->xany.type == KeyRelease)) + ev_time = event->xkey.time; + else if ((event->xany.type == ButtonPress) || + (event->xany.type == ButtonRelease)) + ev_time = event->xbutton.time; +#endif + do_securekbd(vt_shell[mainMenu].w, (XtPointer) 0, (XtPointer) 0); +} + +static void +do_allowsends(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->allowSendEvents = !screen->allowSendEvents; + update_allowsends(); +} + +static void +do_visualbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->visualbell = !screen->visualbell; + update_visualbell(); +} + +static void +do_poponbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->poponbell = !screen->poponbell; + update_poponbell(); +} + +#ifdef ALLOWLOGGING +static void +do_logging(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + if (screen->logging) { + CloseLog(screen); + } else { + StartLog(screen); + } + /* update_logging done by CloseLog and StartLog */ +} +#endif + +static void +do_print(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + xtermPrintScreen(True); +} + +static void +do_print_redir(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + setPrinterControlMode(term->screen.printer_controlmode ? 0 : 2); +} + +static void +do_redraw(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + Redraw(); +} + +void +show_8bit_control(Bool value) +{ + if (term->screen.control_eight_bits != value) { + term->screen.control_eight_bits = value; + update_8bit_control(); + } +} + +static void +do_8bit_control(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + show_8bit_control(!term->screen.control_eight_bits); +} + +static void +do_backarrow(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECBKM; + update_decbkm(); +} + +#if OPT_NUM_LOCK +static void +do_num_lock(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->misc.real_NumLock = !term->misc.real_NumLock; + update_num_lock(); +} + +static void +do_alt_esc(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->screen.input_eight_bits = !term->screen.input_eight_bits; + update_alt_esc(); +} + +static void +do_meta_esc(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->screen.meta_sends_esc = !term->screen.meta_sends_esc; + update_meta_esc(); +} +#endif + +static void +do_delete_del(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + if (xtermDeleteIsDEL(term)) + term->screen.delete_is_del = False; + else + term->screen.delete_is_del = True; + update_delete_del(); +} + +static void +do_old_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsLegacy); +} + +#if OPT_HP_FUNC_KEYS +static void +do_hp_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsHP); +} +#endif + +#if OPT_SCO_FUNC_KEYS +static void +do_sco_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsSCO); +} +#endif + +#if OPT_SUN_FUNC_KEYS +static void +do_sun_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsSun); +} +#endif + +#if OPT_SUNPC_KBD +/* + * This really means "Sun/PC keyboard emulating VT220". + */ +static void +do_sun_kbd(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsVT220); +} +#endif + +/* + * 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(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ +#if defined(SIGTSTP) + handle_send_signal(gw, SIGTSTP); +#endif +} + +/* ARGSUSED */ +static void +do_continue(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ +#if defined(SIGCONT) + handle_send_signal(gw, SIGCONT); +#endif +} + +/* ARGSUSED */ +static void +do_interrupt(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGINT); +} + +/* ARGSUSED */ +void +do_hangup(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGHUP); +} + +/* ARGSUSED */ +static void +do_terminate(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGTERM); +} + +/* ARGSUSED */ +static void +do_kill(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGKILL); +} + +static void +do_quit(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + Cleanup(0); +} + +/* + * vt menu callbacks + */ + +static void +do_scrollbar(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleScrollBar(term); +} + +static void +do_jumpscroll(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + term->flags ^= SMOOTHSCROLL; + if (term->flags & SMOOTHSCROLL) { + screen->jumpscroll = False; + if (screen->scroll_amt) + FlushScroll(term); + } else { + screen->jumpscroll = True; + } + update_jumpscroll(); +} + +static void +do_reversevideo(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ReverseVideo(term); +} + +static void +do_autowrap(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= WRAPAROUND; + update_autowrap(); +} + +static void +do_reversewrap(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= REVERSEWRAP; + update_reversewrap(); +} + +static void +do_autolinefeed(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= LINEFEED; + update_autolinefeed(); +} + +static void +do_appcursor(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECCKM; + update_appcursor(); +} + +static void +do_appkeypad(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECKPAM; + update_appkeypad(); +} + +static void +do_scrollkey(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->scrollkey = !screen->scrollkey; + update_scrollkey(); +} + +static void +do_scrollttyoutput(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->scrollttyoutput = !screen->scrollttyoutput; + update_scrollttyoutput(); +} + +static void +do_selectClipboard(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->selectToClipboard = !screen->selectToClipboard; + update_selectToClipboard(); +} + +static void +do_allow132(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->c132 = !screen->c132; + update_allow132(); +} + +static void +do_cursesemul(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->curses = !screen->curses; + update_cursesemul(); +} + +static void +do_marginbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + if (!(screen->marginbell = !screen->marginbell)) + screen->bellarmed = -1; + update_marginbell(); +} + +#if OPT_TEK4014 +static void +handle_tekshow(Widget gw GCC_UNUSED, Bool allowswitch) +{ + TScreen *screen = &term->screen; + + TRACE(("Show tek-window\n")); + if (!screen->Tshow) { /* not showing, turn on */ + set_tek_visibility(True); + } else if (screen->Vshow || allowswitch) { /* is showing, turn off */ + set_tek_visibility(False); + end_tek_mode(); /* WARNING: this does a longjmp */ + } else + Bell(XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +static void +do_tekshow(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_tekshow(gw, True); +} + +/* ARGSUSED */ +static void +do_tekonoff(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_tekshow(gw, False); +} +#endif /* OPT_TEK4014 */ + +#if OPT_BLINK_CURS +/* ARGSUSED */ +static void +do_cursorblink(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + ToggleCursorBlink(screen); +} +#endif + +/* ARGSUSED */ +static void +do_altscreen(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleAlternate(term); +} + +/* ARGSUSED */ +static void +do_titeInhibit(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->misc.titeInhibit = !term->misc.titeInhibit; + update_titeInhibit(); +} + +#ifndef NO_ACTIVE_ICON +/* ARGSUSED */ +static void +do_activeicon(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + if (screen->iconVwin.window) { + Widget shell = XtParent(term); + term->misc.active_icon = !term->misc.active_icon; + XtVaSetValues(shell, XtNiconWindow, + term->misc.active_icon ? screen->iconVwin.window : None, + (XtPointer) 0); + update_activeicon(); + } +} +#endif /* NO_ACTIVE_ICON */ + +static void +do_softreset(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, False, False); +} + +static void +do_hardreset(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, True, False); +} + +static void +do_clearsavedlines(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, True, True); +} + +#if OPT_TEK4014 +static void +do_tekmode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + switch_modes(screen->TekEmu); /* switch to tek mode */ +} + +/* ARGSUSED */ +static void +do_vthide(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + hide_vt_window(); +} +#endif /* OPT_TEK4014 */ + +/* + * vtfont menu + */ + +static void +do_vtfont(Widget gw GCC_UNUSED, + XtPointer closure, + XtPointer data GCC_UNUSED) +{ + char *entryname = (char *) closure; + int i; + + for (i = 0; i < NMENUFONTS; i++) { + if (strcmp(entryname, fontMenuEntries[i].name) == 0) { + SetVTFont(term, i, True, NULL); + return; + } + } + Bell(XkbBI_MinorError, 0); +} + +#if OPT_DEC_CHRSET +static void +do_font_doublesize(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + if (term->screen.cache_doublesize != 0) + term->screen.font_doublesize = !term->screen.font_doublesize; + update_font_doublesize(); + Redraw(); +} +#endif + +#if OPT_BOX_CHARS +static void +do_font_boxchars(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->screen.force_box_chars = !term->screen.force_box_chars; + update_font_boxchars(); + Redraw(); +} +#endif + +#if OPT_DEC_SOFTFONT +static void +do_font_loadable(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->misc.font_loadable = !term->misc.font_loadable; + update_font_loadable(); +} +#endif + +#if OPT_RENDERFONT +static void +do_font_renderfont(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + int fontnum = screen->menu_font_number; + String name = term->screen.MenuFontName(fontnum); + + term->misc.render_font = !term->misc.render_font; + update_font_renderfont(); + xtermLoadFont(term, xtermFontName(name), True, fontnum); + ScrnRefresh(term, 0, 0, + MaxRows(screen), + MaxCols(screen), True); +} +#endif + +#if OPT_WIDE_CHARS +static void +do_font_utf8_mode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + /* + * If xterm was started with -wc option, it might not have the wide fonts. + * If xterm was not started with -wc, it might not have wide cells. + */ + if (!screen->utf8_mode) { + if (screen->wide_chars) { + if (xtermLoadWideFonts(term, True)) { + SetVTFont(term, screen->menu_font_number, TRUE, NULL); + } + } else { + ChangeToWide(term); + } + } + switchPtyData(screen, !screen->utf8_mode); + /* + * We don't repaint the screen when switching UTF-8 on/off. When switching + * on - the Latin-1 codes should paint as-is. When switching off, that's + * hard to do properly. + */ +} + +static void +do_font_utf8_title(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + screen->utf8_title = !screen->utf8_title; + update_font_utf8_title(); +} +#endif + +/* + * tek menu + */ + +#if OPT_TEK4014 +static void +do_tektextlarge(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(tekMenu_tektextlarge); +} + +static void +do_tektext2(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(tekMenu_tektext2); +} + +static void +do_tektext3(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(tekMenu_tektext3); +} + +static void +do_tektextsmall(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + + TekSetFontSize(tekMenu_tektextsmall); +} + +static void +do_tekpage(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSimulatePageButton(False); +} + +static void +do_tekreset(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSimulatePageButton(True); +} + +static void +do_tekcopy(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekCopy(); +} + +static void +handle_vtshow(Widget gw GCC_UNUSED, Bool allowswitch) +{ + TScreen *screen = &term->screen; + + TRACE(("Show vt-window\n")); + if (!screen->Vshow) { /* not showing, turn on */ + set_vt_visibility(True); + } else if (screen->Tshow || allowswitch) { /* is showing, turn off */ + set_vt_visibility(False); + if (!screen->TekEmu && TekRefresh) + dorefresh(); + end_vt_mode(); /* WARNING: this does a longjmp... */ + } else + Bell(XkbBI_MinorError, 0); +} + +static void +do_vtshow(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_vtshow(gw, True); +} + +static void +do_vtonoff(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_vtshow(gw, False); +} + +static void +do_vtmode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = &term->screen; + + switch_modes(screen->TekEmu); /* switch to vt, or from */ +} + +/* ARGSUSED */ +static void +do_tekhide(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + hide_tek_window(); +} +#endif /* OPT_TEK4014 */ + +/* + * public handler routines + */ + +static void +handle_toggle(void (*proc) PROTO_XT_CALLBACK_ARGS, + int var, + String * params, + Cardinal nparams, + Widget w, + XtPointer closure, + XtPointer 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(XkbBI_MinorError, 0); + break; + + case -1: + (*proc) (w, closure, data); + break; + + case 0: + if (var) + (*proc) (w, closure, data); + else + Bell(XkbBI_MinorError, 0); + break; + + case 1: + if (!var) + (*proc) (w, closure, data); + else + Bell(XkbBI_MinorError, 0); + break; + } + return; +} + +#define handle_vt_toggle(proc, var, params, nparams, w) \ + handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) + +#define handle_tek_toggle(proc, var, params, nparams, w) \ + handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) + +void +HandleAllowSends(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_allowsends, term->screen.allowSendEvents, + params, *param_count, w); +} + +void +HandleSetVisualBell(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_visualbell, term->screen.visualbell, + params, *param_count, w); +} + +void +HandleSetPopOnBell(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_poponbell, term->screen.poponbell, + params, *param_count, w); +} + +#ifdef ALLOWLOGGING +void +HandleLogging(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_logging, term->screen.logging, + params, *param_count, w); +} +#endif + +/* ARGSUSED */ +void +HandlePrintScreen(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_print(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandlePrintControlMode(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_print_redir(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleRedraw(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_redraw(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleSendSignal(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + /* *INDENT-OFF* */ + 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 }, + }; + /* *INDENT-ON* */ + + 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(XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +void +HandleQuit(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_quit(w, (XtPointer) 0, (XtPointer) 0); +} + +void +Handle8BitControl(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_8bit_control, term->screen.control_eight_bits, + params, *param_count, w); +} + +void +HandleBackarrow(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_backarrow, term->keyboard.flags & MODE_DECBKM, + params, *param_count, w); +} + +#if OPT_SUN_FUNC_KEYS +void +HandleSunFunctionKeys(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sun_fkeys, term->keyboard.type == keyboardIsSun, + params, *param_count, w); +} +#endif + +#if OPT_NUM_LOCK +void +HandleNumLock(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_num_lock, term->misc.real_NumLock, + params, *param_count, w); +} + +void +HandleAltEsc(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_alt_esc, !term->screen.input_eight_bits, + params, *param_count, w); +} + +void +HandleMetaEsc(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_meta_esc, term->screen.meta_sends_esc, + params, *param_count, w); +} +#endif + +void +HandleDeleteIsDEL(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_delete_del, term->screen.delete_is_del, + params, *param_count, w); +} + +void +HandleOldFunctionKeys(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_old_fkeys, term->keyboard.type == keyboardIsLegacy, + params, *param_count, w); +} + +#if OPT_SUNPC_KBD +void +HandleSunKeyboard(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sun_kbd, term->keyboard.type == keyboardIsVT220, + params, *param_count, w); +} +#endif + +#if OPT_HP_FUNC_KEYS +void +HandleHpFunctionKeys(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_hp_fkeys, term->keyboard.type == keyboardIsHP, + params, *param_count, w); +} +#endif + +#if OPT_SCO_FUNC_KEYS +void +HandleScoFunctionKeys(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sco_fkeys, term->keyboard.type == keyboardIsSCO, + params, *param_count, w); +} +#endif + +void +HandleScrollbar(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + if (IsIcon(&(term->screen))) { + Bell(XkbBI_MinorError, 0); + } else { + handle_vt_toggle(do_scrollbar, term->screen.fullVwin.sb_info.width, + params, *param_count, w); + } +} + +void +HandleJumpscroll(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_jumpscroll, term->screen.jumpscroll, + params, *param_count, w); +} + +void +HandleSetSelect(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_selectClipboard, term->screen.selectToClipboard, + params, *param_count, w); +} + +void +HandleReverseVideo(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_reversevideo, (term->misc.re_verse0), + params, *param_count, w); +} + +void +HandleAutoWrap(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_autowrap, (term->flags & WRAPAROUND), + params, *param_count, w); +} + +void +HandleReverseWrap(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_reversewrap, (term->flags & REVERSEWRAP), + params, *param_count, w); +} + +void +HandleAutoLineFeed(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_autolinefeed, (term->flags & LINEFEED), + params, *param_count, w); +} + +void +HandleAppCursor(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_appcursor, (term->keyboard.flags & MODE_DECCKM), + params, *param_count, w); +} + +void +HandleAppKeypad(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_appkeypad, (term->keyboard.flags & MODE_DECKPAM), + params, *param_count, w); +} + +void +HandleScrollKey(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_scrollkey, term->screen.scrollkey, + params, *param_count, w); +} + +void +HandleScrollTtyOutput(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_scrollttyoutput, term->screen.scrollttyoutput, + params, *param_count, w); +} + +void +HandleAllow132(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_allow132, term->screen.c132, + params, *param_count, w); +} + +void +HandleCursesEmul(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_cursesemul, term->screen.curses, + params, *param_count, w); +} + +void +HandleMarginBell(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_marginbell, term->screen.marginbell, + params, *param_count, w); +} + +#if OPT_BLINK_CURS +void +HandleCursorBlink(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + /* eventually want to see if sensitive or not */ + handle_vt_toggle(do_cursorblink, term->screen.cursor_blink, + params, *param_count, w); +} +#endif + +void +HandleAltScreen(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + /* eventually want to see if sensitive or not */ + handle_vt_toggle(do_altscreen, term->screen.alternate, + params, *param_count, w); +} + +void +HandleTiteInhibit(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + /* eventually want to see if sensitive or not */ + handle_vt_toggle(do_titeInhibit, !(term->misc.titeInhibit), + params, *param_count, w); +} + +/* ARGSUSED */ +void +HandleSoftReset(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_softreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleHardReset(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_hardreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleClearSavedLines(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_clearsavedlines(w, (XtPointer) 0, (XtPointer) 0); +} + +#if OPT_DEC_CHRSET +void +HandleFontDoublesize(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_doublesize, term->screen.font_doublesize, + params, *param_count, w); +} +#endif + +#if OPT_BOX_CHARS +void +HandleFontBoxChars(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_boxchars, term->screen.force_box_chars, + params, *param_count, w); +} +#endif + +#if OPT_DEC_SOFTFONT +void +HandleFontLoading(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_loadable, term->misc.font_loadable, + params, *param_count, w); +} +#endif + +#if OPT_RENDERFONT +void +HandleRenderFont(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_renderfont, term->misc.render_font, + params, *param_count, w); +} +#endif + +#if OPT_WIDE_CHARS +void +HandleUTF8Mode(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_utf8_mode, term->screen.utf8_mode, + params, *param_count, w); +} + +void +HandleUTF8Title(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_utf8_title, term->screen.utf8_title, + params, *param_count, w); +} +#endif + +#if OPT_TEK4014 +void +HandleSetTerminalType(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + if (*param_count == 1) { + switch (params[0][0]) { + case 'v': + case 'V': + if (term->screen.TekEmu) + do_vtmode(w, (XtPointer) 0, (XtPointer) 0); + break; + case 't': + case 'T': + if (!term->screen.TekEmu) + do_tekmode(w, (XtPointer) 0, (XtPointer) 0); + break; + default: + Bell(XkbBI_MinorError, 0); + } + } else { + Bell(XkbBI_MinorError, 0); + } +} + +void +HandleVisibility(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + if (*param_count == 2) { + switch (params[0][0]) { + case 'v': + case 'V': + handle_tek_toggle(do_vtonoff, (int) term->screen.Vshow, + params + 1, (*param_count) - 1, w); + break; + case 't': + case 'T': + handle_tek_toggle(do_tekonoff, (int) term->screen.Tshow, + params + 1, (*param_count) - 1, w); + break; + default: + Bell(XkbBI_MinorError, 0); + } + } else { + Bell(XkbBI_MinorError, 0); + } +} + +/* ARGSUSED */ +void +HandleSetTekText(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + void (*proc) PROTO_XT_CALLBACK_ARGS = 0; + + switch (*param_count) { + case 0: + proc = do_tektextlarge; + break; + case 1: + switch (params[0][0]) { + case 'l': + case 'L': + proc = do_tektextlarge; + break; + case '2': + proc = do_tektext2; + break; + case '3': + proc = do_tektext3; + break; + case 's': + case 'S': + proc = do_tektextsmall; + break; + } + break; + } + if (proc) + (*proc) (w, (XtPointer) 0, (XtPointer) 0); + else + Bell(XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +void +HandleTekPage(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekpage(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleTekReset(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleTekCopy(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekcopy(w, (XtPointer) 0, (XtPointer) 0); +} +#endif /* OPT_TEK4014 */ + +static void +UpdateMenuItem(Widget mi, XtArgVal val) +{ + static Arg menuArgs = + {XtNleftBitmap, (XtArgVal) 0}; + + if (mi) { + menuArgs.value = (XtArgVal) ((val) + ? term->screen.menu_item_bitmap + : None); + XtSetValues(mi, &menuArgs, (Cardinal) 1); + } +} + +void +SetItemSensitivity(Widget mi, XtArgVal val) +{ + static Arg menuArgs = + {XtNsensitive, (XtArgVal) 0}; + + if (mi) { + menuArgs.value = (XtArgVal) (val); + XtSetValues(mi, &menuArgs, (Cardinal) 1); + } +} + +#if OPT_TOOLBAR +/* + * The normal style of xterm popup menu delays initialization until the menu is + * first requested. When using a toolbar, we can use the same initialization, + * though on the first popup there will be a little geometry layout jitter, + * since the menu is already managed when this callback is invoked. + */ +static void +InitPopup(Widget gw, + XtPointer closure, + XtPointer data GCC_UNUSED) +{ + String params[2]; + Cardinal count = 1; + + params[0] = (char *) closure; + params[1] = 0; + TRACE(("InitPopup(%s)\n", params[0])); + + domenu(gw, (XEvent *) 0, params, &count); + + if (gw) + XtRemoveCallback(gw, XtNpopupCallback, InitPopup, closure); +} + +static Dimension +SetupShell(Widget *menus, MenuList * shell, int n, int m) +{ + char temp[80]; + char *external_name = 0; + Dimension button_height; + Dimension button_border; + + shell[n].w = XtVaCreatePopupShell(menu_names[n].internal_name, + simpleMenuWidgetClass, + *menus, + XtNgeometry, NULL, + (XtPointer) 0); + + XtAddCallback(shell[n].w, XtNpopupCallback, InitPopup, menu_names[n].internal_name); + XtVaGetValues(shell[n].w, + XtNlabel, &external_name, + (XtPointer) 0); + + TRACE(("...SetupShell(%s) -> %s -> %#lx\n", + menu_names[n].internal_name, + external_name, + (long) shell[n].w)); + + sprintf(temp, "%sButton", menu_names[n].internal_name); + shell[n].b = XtVaCreateManagedWidget(temp, + menuButtonWidgetClass, + *menus, + XtNfromHoriz, ((m >= 0) + ? shell[m].b + : 0), + XtNmenuName, menu_names[n].internal_name, + XtNlabel, external_name, + (XtPointer) 0); + XtVaGetValues(shell[n].b, + XtNheight, &button_height, + XtNborderWidth, &button_border, + (XtPointer) 0); + + return button_height + (button_border * 2); +} +#endif /* OPT_TOOLBAR */ + +void +SetupMenus(Widget shell, Widget *forms, Widget *menus, Dimension * menu_high) +{ +#if OPT_TOOLBAR + Dimension button_height; + Dimension toolbar_hSpace; + Dimension toolbar_border; + Arg args[10]; +#endif + + TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014")); + + *menu_high = 0; + + if (shell == toplevel) { + XawSimpleMenuAddGlobalActions(app_con); + XtRegisterGrabAction(HandlePopupMenu, True, + (ButtonPressMask | ButtonReleaseMask), + GrabModeAsync, GrabModeAsync); + } +#if OPT_TOOLBAR + *forms = XtVaCreateManagedWidget("form", + formWidgetClass, shell, + (XtPointer) 0); + xtermAddInput(*forms); + + /* + * Set a nominal value for the preferred pane size, which lets the + * buttons determine the actual height of the menu bar. We don't show + * the grip, because it's too easy to make the toolbar look bad that + * way. + */ + XtSetArg(args[0], XtNorientation, XtorientHorizontal); + XtSetArg(args[1], XtNtop, XawChainTop); + XtSetArg(args[2], XtNbottom, XawChainTop); + XtSetArg(args[3], XtNleft, XawChainLeft); + XtSetArg(args[4], XtNright, XawChainLeft); + + if (resource.toolBar) { + *menus = XtCreateManagedWidget("menubar", boxWidgetClass, *forms, + args, 5); + } else { + *menus = XtCreateWidget("menubar", boxWidgetClass, *forms, args, 5); + } + + /* + * The toolbar widget's height is not necessarily known yet. If the + * toolbar is not created as a managed widget, we can still make a good + * guess about its height by collecting the widget's other resource values. + */ + XtVaGetValues(*menus, + XtNhSpace, &toolbar_hSpace, + XtNborderWidth, &toolbar_border, + (XtPointer) 0); + + if (shell == toplevel) { /* vt100 */ + int j; + for (j = mainMenu; j <= fontMenu; j++) { + button_height = SetupShell(menus, vt_shell, j, j - 1); + } + } +#if OPT_TEK4014 + else { /* tek4014 */ + button_height = SetupShell(menus, tek_shell, mainMenu, -1); + button_height = SetupShell(menus, tek_shell, tekMenu, mainMenu); + } +#endif + + /* + * Tell the main program how high the toolbar is, to help with the initial + * layout. + */ + *menu_high = (button_height + 2 * (toolbar_hSpace + toolbar_border)); + TRACE(("...menuHeight:%d = (%d + 2 * (%d + %d))\n", + *menu_high, button_height, toolbar_hSpace, toolbar_border)); + +#else + *forms = shell; + *menus = shell; +#endif + + TRACE(("...shell=%#lx\n", (long) shell)); + TRACE(("...forms=%#lx\n", (long) *forms)); + TRACE(("...menus=%#lx\n", (long) *menus)); +} + +void +repairSizeHints(void) +{ + TScreen *screen = &term->screen; + + if (XtIsRealized((Widget) term)) { + bzero(&term->hints, sizeof(term->hints)); + xtermSizeHints(term, ScrollbarWidth(screen)); + + XSetWMNormalHints(screen->display, XtWindow(SHELL_OF(term)), &term->hints); + } +} + +#if OPT_TOOLBAR +#define INIT_POPUP(s, n) InitPopup(s[n].w, menu_names[n].internal_name, 0) + +static Bool +InitWidgetMenu(Widget shell) +{ + Bool result = False; + + TRACE(("InitWidgetMenu(%p)\n", shell)); + if (term != 0) { + if (shell == toplevel) { /* vt100 */ + if (!term->init_menu) { + INIT_POPUP(vt_shell, mainMenu); + INIT_POPUP(vt_shell, vtMenu); + INIT_POPUP(vt_shell, fontMenu); + term->init_menu = True; + TRACE(("...InitWidgetMenu(vt)\n")); + } + result = term->init_menu; + } +#if OPT_TEK4014 + else if (tekWidget) { /* tek4014 */ + if (!tekWidget->init_menu) { + INIT_POPUP(tek_shell, mainMenu); + INIT_POPUP(tek_shell, tekMenu); + tekWidget->init_menu = True; + TRACE(("...InitWidgetMenu(tek)\n")); + } + result = tekWidget->init_menu; + } +#endif + } + TRACE(("...InitWidgetMenu ->%d\n", result)); + return result; +} + +static TbInfo * +toolbar_info(Widget w) +{ + TRACE(("...getting toolbar_info\n")); +#if OPT_TEK4014 + if (w != (Widget) term) + return &(tekWidget->tek.tb_info); +#endif + return &(WhichVWin(&(term->screen))->tb_info); +} + +static void +hide_toolbar(Widget w) +{ + if (w != 0) { + TbInfo *info = toolbar_info(w); + + TRACE(("hiding toolbar\n")); + XtVaSetValues(w, + XtNfromVert, (Widget) 0, + (XtPointer) 0); + + if (info->menu_bar != 0) { + repairSizeHints(); + XtUnmanageChild(info->menu_bar); + if (XtIsRealized(info->menu_bar)) { + XtUnmapWidget(info->menu_bar); + } + } + TRACE(("...hiding toolbar (done)\n")); + } +} + +static void +show_toolbar(Widget w) +{ + if (w != 0) { + TbInfo *info = toolbar_info(w); + + TRACE(("showing toolbar\n")); + if (info->menu_bar != 0) { + XtVaSetValues(w, + XtNfromVert, info->menu_bar, + (XtPointer) 0); + if (XtIsRealized(info->menu_bar)) + repairSizeHints(); + XtManageChild(info->menu_bar); + if (XtIsRealized(info->menu_bar)) { + XtMapWidget(info->menu_bar); + } + } + /* + * This is needed to make the terminal widget move down below the + * toolbar. + */ + XawFormDoLayout(XtParent(w), True); + TRACE(("...showing toolbar (done)\n")); + } +} + +/* + * Make the toolbar visible or invisible in the current window(s). + */ +void +ShowToolbar(Bool enable) +{ + TRACE(("ShowToolbar(%d)\n", enable)); + + if (IsIcon(&(term->screen))) { + Bell(XkbBI_MinorError, 0); + } else { + if (enable) { + if (InitWidgetMenu(toplevel)) + show_toolbar((Widget) term); +#if OPT_TEK4014 + if (InitWidgetMenu(tekshellwidget)) + show_toolbar((Widget) tekWidget); +#endif + } else { + hide_toolbar((Widget) term); +#if OPT_TEK4014 + hide_toolbar((Widget) tekWidget); +#endif + } + resource.toolBar = enable; + update_toolbar(); + } +} + +void +HandleToolbar(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + if (IsIcon(&(term->screen))) { + Bell(XkbBI_MinorError, 0); + } else { + handle_vt_toggle(do_toolbar, resource.toolBar, + params, *param_count, w); + } +} + +/* ARGSUSED */ +static void +do_toolbar(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + /* + * Toggle toolbars for both vt100 and tek windows, since they share the + * menu which contains the checkbox indicating whether the toolbar is + * active. + */ + if (IsIcon(&(term->screen))) { + Bell(XkbBI_MinorError, 0); + } else { + ShowToolbar(resource.toolBar = !resource.toolBar); + } +} + +void +update_toolbar(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_toolbar].widget, + resource.toolBar); +} +#endif /* OPT_TOOLBAR */ + +void +update_securekbd(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_securekbd].widget, + term->screen.grabbedKbd); +} + +void +update_allowsends(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_allowsends].widget, + term->screen.allowSendEvents); +} + +#ifdef ALLOWLOGGING +void +update_logging(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_logging].widget, + term->screen.logging); +} +#endif + +void +update_print_redir(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_print_redir].widget, + term->screen.printer_controlmode); +} + +void +update_8bit_control(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_8bit_ctrl].widget, + term->screen.control_eight_bits); +} + +void +update_decbkm(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_backarrow].widget, + (term->keyboard.flags & MODE_DECBKM) != 0); +} + +#if OPT_NUM_LOCK +void +update_num_lock(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_num_lock].widget, + term->misc.real_NumLock); +} + +void +update_alt_esc(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_alt_esc].widget, + !term->screen.input_eight_bits); +} + +void +update_meta_esc(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_meta_esc].widget, + term->screen.meta_sends_esc); +} +#endif + +#if OPT_SUN_FUNC_KEYS +void +update_sun_fkeys(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_sun_fkeys].widget, + term->keyboard.type == keyboardIsSun); +} +#endif + +void +update_old_fkeys(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_old_fkeys].widget, + term->keyboard.type == keyboardIsLegacy); +} + +void +update_delete_del(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_delete_del].widget, + xtermDeleteIsDEL(term)); +} + +#if OPT_SUNPC_KBD +void +update_sun_kbd(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_sun_kbd].widget, + term->keyboard.type == keyboardIsVT220); +} +#endif + +#if OPT_HP_FUNC_KEYS +void +update_hp_fkeys(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_hp_fkeys].widget, + term->keyboard.type == keyboardIsHP); +} +#endif + +#if OPT_SCO_FUNC_KEYS +void +update_sco_fkeys(void) +{ + UpdateMenuItem(mainMenuEntries[mainMenu_sco_fkeys].widget, + term->keyboard.type == keyboardIsSCO); +} +#endif + +void +update_scrollbar(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_scrollbar].widget, + ScrollbarWidth(&term->screen)); +} + +void +update_jumpscroll(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_jumpscroll].widget, + term->screen.jumpscroll); +} + +void +update_reversevideo(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_reversevideo].widget, + (term->misc.re_verse)); +} + +void +update_autowrap(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_autowrap].widget, + (term->flags & WRAPAROUND) != 0); +} + +void +update_reversewrap(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_reversewrap].widget, + (term->flags & REVERSEWRAP) != 0); +} + +void +update_autolinefeed(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_autolinefeed].widget, + (term->flags & LINEFEED) != 0); +} + +void +update_appcursor(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_appcursor].widget, + (term->keyboard.flags & MODE_DECCKM) != 0); +} + +void +update_appkeypad(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_appkeypad].widget, + (term->keyboard.flags & MODE_DECKPAM) != 0); +} + +void +update_scrollkey(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_scrollkey].widget, + term->screen.scrollkey); +} + +void +update_scrollttyoutput(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_scrollttyoutput].widget, + term->screen.scrollttyoutput); +} + +void +update_selectToClipboard(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_selectToClipboard].widget, + term->screen.selectToClipboard); +} + +void +update_allow132(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_allow132].widget, + term->screen.c132); +} + +void +update_cursesemul(void) +{ +#if 0 /* 2006-2-12: no longer menu entry */ + UpdateMenuItem(vtMenuEntries[vtMenu_cursesemul].widget, + term->screen.curses); +#endif +} + +void +update_visualbell(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_visualbell].widget, + term->screen.visualbell); +} + +void +update_poponbell(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_poponbell].widget, + term->screen.poponbell); +} + +void +update_marginbell(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_marginbell].widget, + term->screen.marginbell); +} + +#if OPT_BLINK_CURS +void +update_cursorblink(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_cursorblink].widget, + term->screen.cursor_blink); +} +#endif + +void +update_altscreen(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_altscreen].widget, + term->screen.alternate); +} + +void +update_titeInhibit(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_titeInhibit].widget, + !(term->misc.titeInhibit)); +} + +#ifndef NO_ACTIVE_ICON +void +update_activeicon(void) +{ + UpdateMenuItem(vtMenuEntries[vtMenu_activeicon].widget, + term->misc.active_icon); +} +#endif /* NO_ACTIVE_ICON */ + +#if OPT_DEC_CHRSET +void +update_font_doublesize(void) +{ + UpdateMenuItem(fontMenuEntries[fontMenu_font_doublesize].widget, + term->screen.font_doublesize); +} +#endif + +#if OPT_BOX_CHARS +void +update_font_boxchars(void) +{ + UpdateMenuItem(fontMenuEntries[fontMenu_font_boxchars].widget, + term->screen.force_box_chars); +} +#endif + +#if OPT_DEC_SOFTFONT +void +update_font_loadable(void) +{ + UpdateMenuItem(fontMenuEntries[fontMenu_font_loadable].widget, + term->misc.font_loadable); +} +#endif + +#if OPT_RENDERFONT +void +update_font_renderfont(void) +{ + UpdateMenuItem(fontMenuEntries[fontMenu_render_font].widget, + term->misc.render_font); +} +#endif + +#if OPT_WIDE_CHARS +void +update_font_utf8_mode(void) +{ + Widget iw = fontMenuEntries[fontMenu_wide_chars].widget; + Bool active = (term->screen.utf8_mode != uAlways); + Bool enable = (term->screen.utf8_mode != uFalse); + + TRACE(("update_font_utf8_mode active %d, enable %d\n", active, enable)); + SetItemSensitivity(iw, active); + UpdateMenuItem(iw, enable); +} + +void +update_font_utf8_title(void) +{ + Widget iw = fontMenuEntries[fontMenu_wide_title].widget; + Bool active = (term->screen.utf8_mode != uFalse); + Bool enable = (term->screen.utf8_title); + + TRACE(("update_font_utf8_title active %d, enable %d\n", active, enable)); + SetItemSensitivity(iw, active); + UpdateMenuItem(iw, enable); +} +#endif + +#if OPT_TEK4014 +void +update_tekshow(void) +{ + if (!(term->screen.inhibit & I_TEK)) { + UpdateMenuItem(vtMenuEntries[vtMenu_tekshow].widget, + term->screen.Tshow); + } +} + +void +update_vttekmode(void) +{ + if (!(term->screen.inhibit & I_TEK)) { + UpdateMenuItem(vtMenuEntries[vtMenu_tekmode].widget, + term->screen.TekEmu); + UpdateMenuItem(tekMenuEntries[tekMenu_vtmode].widget, + !term->screen.TekEmu); + } +} + +void +update_vtshow(void) +{ + if (!(term->screen.inhibit & I_TEK)) { + UpdateMenuItem(tekMenuEntries[tekMenu_vtshow].widget, + term->screen.Vshow); + } +} + +void +set_vthide_sensitivity(void) +{ + if (!(term->screen.inhibit & I_TEK)) { + SetItemSensitivity( + vtMenuEntries[vtMenu_vthide].widget, + term->screen.Tshow); + } +} + +void +set_tekhide_sensitivity(void) +{ + if (!(term->screen.inhibit & I_TEK)) { + SetItemSensitivity( + tekMenuEntries[tekMenu_tekhide].widget, + term->screen.Vshow); + } +} + +void +set_tekfont_menu_item(int n, int val) +{ + if (!(term->screen.inhibit & I_TEK)) { + UpdateMenuItem(tekMenuEntries[FS2MI(n)].widget, + (val)); + } +} +#endif /* OPT_TEK4014 */ + +void +set_menu_font(int val) +{ + UpdateMenuItem(fontMenuEntries[term->screen.menu_font_number].widget, + (val)); +} |