/* $XTermId: menu.c,v 1.320 2013/06/23 22:46:18 tom Exp $ */ /* * Copyright 1999-2012,2013 by Thomas E. Dickey * * All Rights Reserved * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name(s) of the above copyright * holders shall not be used in advertising or otherwise to promote the * sale, use or other dealings in this Software without prior written * authorization. * * * Copyright 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. */ #include #include #include #include #include #include #include #define app_con Xaw_app_con /* quiet a warning from SimpleMenu.h */ #if defined(HAVE_LIB_XAW) #include #include #include #include #if OPT_TOOLBAR #include #include #endif #elif defined(HAVE_LIB_XAW3D) #include #include #include #include #if OPT_TOOLBAR #include #include #endif #elif defined(HAVE_LIB_NEXTAW) #include #include #include #include #if OPT_TOOLBAR #include #include #endif #elif defined(HAVE_LIB_XAWPLUS) #include #include #include #include #if OPT_TOOLBAR #include #include #endif #endif #undef app_con #include #include #if OPT_TRACE #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(func, mn, mi, val) #else #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(mn, mi, val) #endif #define ToggleFlag(flag) flag = (Boolean) !flag /* *INDENT-OFF* */ static void do_8bit_control PROTO_XT_CALLBACK_ARGS; static void do_allow132 PROTO_XT_CALLBACK_ARGS; static void do_allowBoldFonts 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_bellIsUrgent 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_keepSelection PROTO_XT_CALLBACK_ARGS; static void do_kill PROTO_XT_CALLBACK_ARGS; static void do_old_fkeys PROTO_XT_CALLBACK_ARGS; static void do_poponbell 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_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_ALLOW_XXX_OPS static void enable_allow_xxx_ops (Bool); static void do_allowColorOps PROTO_XT_CALLBACK_ARGS; static void do_allowFontOps PROTO_XT_CALLBACK_ARGS; static void do_allowTcapOps PROTO_XT_CALLBACK_ARGS; static void do_allowTitleOps PROTO_XT_CALLBACK_ARGS; static void do_allowWindowOps PROTO_XT_CALLBACK_ARGS; #endif #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; static void do_font_packed 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_MAXIMIZE static void do_fullscreen 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_PRINT_ON_EXIT static void do_write_now PROTO_XT_CALLBACK_ARGS; static void do_write_error 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_SIXEL_GRAPHICS static void do_privatecolorregisters PROTO_XT_CALLBACK_ARGS; static void do_sixelscrolling 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_TCAP_FKEYS static void do_tcap_fkeys 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_fonts 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 #if OPT_MAXIMIZE { "fullscreen", do_fullscreen, NULL }, #endif { "securekbd", do_securekbd, NULL }, { "allowsends", do_allowsends, NULL }, { "redraw", do_redraw, NULL }, { "line1", NULL, NULL }, #ifdef ALLOWLOGGING { "logging", do_logging, NULL }, #endif #ifdef OPT_PRINT_ON_EXIT { "print-immediate", do_write_now, NULL }, { "print-on-error", do_write_error, NULL }, #endif { "print", do_print, NULL }, { "print-redir", 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_TCAP_FKEYS { "tcapFunctionKeys",do_tcap_fkeys, NULL }, #endif #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 }, { "keepSelection", do_keepSelection, NULL }, { "selectToClipboard",do_selectClipboard, NULL }, { "visualbell", do_visualbell, NULL }, { "bellIsUrgent", do_bellIsUrgent, NULL }, { "poponbell", do_poponbell, 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 }, #if OPT_SIXEL_GRAPHICS { "sixelScrolling", do_sixelscrolling, NULL }, { "privateColorRegisters", do_privatecolorregisters, NULL }, #endif }; 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 }, { "allow-bold-fonts", do_allowBoldFonts, NULL }, #if OPT_BOX_CHARS { "font-linedrawing",do_font_boxchars,NULL }, { "font-packed", do_font_packed,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-fonts", do_font_utf8_fonts,NULL }, { "utf8-title", do_font_utf8_title,NULL }, #endif #endif /* toggles for other font extensions */ #if OPT_ALLOW_XXX_OPS { "line3", NULL, NULL }, { "allow-color-ops",do_allowColorOps,NULL }, { "allow-font-ops", do_allowFontOps,NULL }, { "allow-tcap-ops", do_allowTcapOps,NULL }, { "allow-title-ops",do_allowTitleOps,NULL }, { "allow-window-ops",do_allowWindowOps,NULL }, #endif }; #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 static String setMenuLocale(Bool before, String substitute) { String result = setlocale(LC_CTYPE, 0); if (before) { result = x_strdup(result); } (void) setlocale(LC_CTYPE, substitute); TRACE(("setMenuLocale %s:%s\n", (before ? "before" : "after"), NonNull(result))); if (!before) { free((void *) substitute); } return result; } /* * 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; } /* * Return an array of flags telling if a given menu item is never going to * be used, so we can reduce the size of menus. */ static Boolean * unusedEntries(XtermWidget xw, MenuIndex num) { static Boolean result[XtNumber(mainMenuEntries) + XtNumber(vtMenuEntries) + XtNumber(fontMenuEntries) #if OPT_TEK4014 + XtNumber(tekMenuEntries) #endif ]; TScreen *screen = TScreenOf(xw); memset(result, 0, sizeof(result)); switch (num) { case mainMenu: #if OPT_MAXIMIZE if (resource.fullscreen > 1) { result[mainMenu_fullscreen] = True; } #endif #if OPT_NUM_LOCK if (!screen->alt_is_not_meta) { result[mainMenu_alt_esc] = True; } #endif if (!xtermHasPrinter(xw)) { result[mainMenu_print] = True; result[mainMenu_print_redir] = True; } if (screen->terminal_id < 200) { result[mainMenu_8bit_ctrl] = True; } #if !defined(SIGTSTP) result[mainMenu_suspend] = True; #endif #if !defined(SIGCONT) result[mainMenu_continue] = True; #endif #ifdef ALLOWLOGGING if (screen->inhibit & I_LOG) { result[mainMenu_logging] = True; } #endif if (screen->inhibit & I_SIGNAL) { int n; for (n = (int) mainMenu_suspend; n <= (int) mainMenu_quit; ++n) { result[n] = True; } } break; case vtMenu: #ifndef NO_ACTIVE_ICON if (!screen->fnt_icon.fs || !screen->iconVwin.window) { result[vtMenu_activeicon] = True; } #endif /* NO_ACTIVE_ICON */ #if OPT_TEK4014 if (screen->inhibit & I_TEK) { int n; for (n = (int) vtMenu_tekshow; n <= (int) vtMenu_vthide; ++n) { result[n] = True; } } #endif break; case fontMenu: break; #if OPT_TEK4014 case tekMenu: break; #endif case noMenu: break; } return result; } /* * create_menu - create a popup shell and stuff the menu into it. */ static Widget create_menu(Widget w, XtermWidget xw, MenuIndex num) { static XtCallbackRec cb[2] = { {NULL, NULL}, {NULL, NULL}}; static Arg arg = {XtNcallback, (XtArgVal) cb}; TScreen *screen = TScreenOf(xw); MenuHeader *data = &menu_names[num]; MenuList *list = select_menu(w, num); struct _MenuEntry *entries = data->entry_list; Cardinal nentries = data->entry_len; #if !OPT_TOOLBAR String saveLocale; #endif 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(xw), RootWindowOfScreen(XtScreen(xw)), (char *) check_bits, check_width, check_height); } #if !OPT_TOOLBAR saveLocale = setMenuLocale(True, resource.menuLocale); list->w = XtCreatePopupShell(data->internal_name, simpleMenuWidgetClass, toplevel, NULL, 0); #endif if (list->w != 0) { Boolean *unused = unusedEntries(xw, num); Cardinal n; list->entries = 0; for (n = 0; n < nentries; ++n) { if (!unused[n]) { cb[0].callback = (XtCallbackProc) entries[n].function; cb[0].closure = (XtPointer) entries[n].name; entries[n].widget = XtCreateManagedWidget(entries[n].name, (entries[n].function ? smeBSBObjectClass : smeLineObjectClass), list->w, &arg, (Cardinal) 1); list->entries++; } } } #if !OPT_TOOLBAR (void) setMenuLocale(False, saveLocale); #endif /* do not realize at this point */ return list->w; } 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); } /* ARGSUSED */ static Bool domenu(Widget w, XEvent * event GCC_UNUSED, String * params, /* mainMenu, vtMenu, or tekMenu */ Cardinal *param_count) /* 0 or 1 */ { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); MenuIndex me; Bool created = False; Widget mw; if (*param_count != 1) { Bell(xw, XkbBI_MinorError, 0); return False; } if ((me = indexOfMenu(params[0])) == noMenu) { Bell(xw, XkbBI_MinorError, 0); return False; } if ((mw = obtain_menu(w, me)) == 0 || sizeof_menu(w, me) == 0) { mw = create_menu(w, xw, 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_fullscreen(); 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(); #ifdef PRINT_ON_EXIT screen->write_error = !IsEmpty(resource.printOnXError); SetItemSensitivity(mainMenuEntries[mainMenu_write_now].widget, False); SetItemSensitivity(mainMenuEntries[mainMenu_write_error].widget, screen->write_error); #endif } 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_keepSelection(); update_selectToClipboard(); update_visualbell(); update_poponbell(); update_bellIsUrgent(); update_cursorblink(); update_altscreen(); update_decsdm(); /* Sixel Display Mode */ update_titeInhibit(); #ifndef NO_ACTIVE_ICON update_activeicon(); #endif /* NO_ACTIVE_ICON */ update_privatecolorregisters(); } break; case fontMenu: if (created) { int n; set_menu_font(True); for (n = fontMenu_font1; n <= fontMenu_font6; ++n) { if (IsEmpty(screen->menu_font_names[n][fNorm])) SetItemSensitivity(fontMenuEntries[n].widget, False); } SetItemSensitivity( fontMenuEntries[fontMenu_fontescape].widget, (screen->menu_font_names[fontMenu_fontescape][fNorm] ? True : False)); update_menu_allowBoldFonts(); #if OPT_BOX_CHARS update_font_boxchars(); SetItemSensitivity( fontMenuEntries[fontMenu_font_boxchars].widget, True); update_font_packed(); SetItemSensitivity( fontMenuEntries[fontMenu_font_packedfont].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 (TScreenOf(xw)->cache_doublesize == 0) SetItemSensitivity( fontMenuEntries[fontMenu_font_doublesize].widget, False); #endif #if OPT_RENDERFONT update_font_renderfont(); #endif #if OPT_WIDE_CHARS update_font_utf8_mode(); update_font_utf8_fonts(); update_font_utf8_title(); #endif #if OPT_ALLOW_XXX_OPS update_menu_allowColorOps(); update_menu_allowFontOps(); update_menu_allowTcapOps(); update_menu_allowTitleOps(); update_menu_allowWindowOps(); enable_allow_xxx_ops(!(screen->allowSendEvents)); #endif } FindFontSelection(xw, NULL, True); SetItemSensitivity( fontMenuEntries[fontMenu_fontsel].widget, (screen->menu_font_names[fontMenu_fontsel][fNorm] ? True : False)); break; #if OPT_TEK4014 case tekMenu: if (created && tekWidget) { set_tekfont_menu_item(TekScreenOf(tekWidget)->cur.fontsize, True); update_vtshow(); } break; #endif case noMenu: default: break; } return True; } /* * public interfaces */ 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)) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); #if OPT_TOOLBAR w = select_menu(w, mainMenu)->w; #endif /* * The action procedure in SimpleMenu.c, PositionMenu does not expect a * key translation event when we are popping up a menu. In particular, * if the pointer is outside the menu, then the action procedure will * fail in its attempt to determine the location of the pointer within * the menu. Anticipate that by warping the pointer into the menu when * a key event is detected. */ switch (event->type) { case KeyPress: case KeyRelease: XWarpPointer(screen->display, None, XtWindow(w), 0, 0, 0, 0, 0, 0); break; default: XtCallActionProc(w, "XawPositionSimpleMenu", event, params, 1); break; } 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 = TScreenOf(term); if (hold_screen > 1) hold_screen = 0; if (screen->pid > 1) kill_process_group(screen->pid, sig); #endif } static void UpdateMenuItem( #if OPT_TRACE const char *func, #endif MenuEntry * menu, int which, Bool val) { static Arg menuArgs = {XtNleftBitmap, (XtArgVal) 0}; Widget mi = menu[which].widget; if (mi) { menuArgs.value = (XtArgVal) ((val) ? TScreenOf(term)->menu_item_bitmap : None); XtSetValues(mi, &menuArgs, (Cardinal) 1); } TRACE(("%s(%d): %s\n", func, which, BtoS(val))); } void SetItemSensitivity(Widget mi, Bool val) { static Arg menuArgs = {XtNsensitive, (XtArgVal) 0}; if (mi) { menuArgs.value = (XtArgVal) (val); XtSetValues(mi, &menuArgs, (Cardinal) 1); } } /* * action routines */ static void do_securekbd(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); Time now = CurrentTime; /* XXX - wrong */ if (screen->grabbedKbd) { XUngrabKeyboard(screen->display, now); ReverseVideo(xw); screen->grabbedKbd = False; } else { if (XGrabKeyboard(screen->display, XtWindow(CURRENT_EMU()), True, GrabModeAsync, GrabModeAsync, now) != GrabSuccess) { Bell(xw, XkbBI_MinorError, 100); } else { ReverseVideo(xw); 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 = TScreenOf(term); ToggleFlag(screen->allowSendEvents); update_allowsends(); #if OPT_ALLOW_XXX_OPS enable_allow_xxx_ops(!(screen->allowSendEvents)); #endif } static void do_visualbell(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->visualbell); update_visualbell(); } static void do_bellIsUrgent(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->bellIsUrgent); update_bellIsUrgent(); } static void do_poponbell(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->poponbell); update_poponbell(); } #ifdef ALLOWLOGGING static void do_logging(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); if (screen->logging) { CloseLog(xw); } else { StartLog(xw); } /* update_logging done by CloseLog and StartLog */ } #endif #ifdef OPT_PRINT_ON_EXIT static void do_write_now(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; xtermPrintImmediately(xw, (IsEmpty(resource.printFileNow) ? "XTerm" : resource.printFileNow), resource.printOptsNow, resource.printModeNow); } static void do_write_error(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; if (IsEmpty(resource.printFileOnXError)) { resource.printFileOnXError = "XTermError"; } TScreenOf(xw)->write_error = (Boolean) (!TScreenOf(xw)->write_error); update_write_error(); } #endif static void do_print(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { xtermPrintScreen(term, True, getPrinterFlags(term, NULL, 0)); } static void do_print_redir(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { setPrinterControlMode(term, (PrinterOf(TScreenOf(term)).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 (TScreenOf(term)->control_eight_bits != value) { TScreenOf(term)->control_eight_bits = (Boolean) value; update_8bit_control(); } } static void do_8bit_control(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { show_8bit_control(!TScreenOf(term)->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) { ToggleFlag(term->misc.real_NumLock); update_num_lock(); } static void do_alt_esc(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { ToggleFlag(TScreenOf(term)->alt_sends_esc); update_alt_esc(); } static void do_meta_esc(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { ToggleFlag(TScreenOf(term)->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)) TScreenOf(term)->delete_is_del = False; else TScreenOf(term)->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 #if OPT_TCAP_FKEYS static void do_tcap_fkeys(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { toggle_keyboard_type(term, keyboardIsTermcap); } #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(SIGHUP); } /* * 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 = TScreenOf(term); 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 = TScreenOf(term); ToggleFlag(screen->scrollkey); update_scrollkey(); } static void do_scrollttyoutput(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->scrollttyoutput); update_scrollttyoutput(); } static void do_keepSelection(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->keepSelection); update_keepSelection(); } static void do_selectClipboard(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->selectToClipboard); update_selectToClipboard(); } static void do_allow132(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->c132); update_allow132(); } static void do_cursesemul(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->curses); update_cursesemul(); } static void do_marginbell(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); if ((ToggleFlag(screen->marginbell)) == 0) screen->bellArmed = -1; update_marginbell(); } #if OPT_TEK4014 static void handle_tekshow(Widget gw GCC_UNUSED, Bool allowswitch) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); TRACE(("Show tek-window\n")); if (!TEK4014_SHOWN(xw)) { /* 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(xw, 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 = TScreenOf(term); 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) { ToggleFlag(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 = TScreenOf(term); if (screen->iconVwin.window) { Widget shell = XtParent(term); ToggleFlag(term->work.active_icon); XtVaSetValues(shell, XtNiconWindow, term->work.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) { switch_modes(TEK4014_ACTIVE(term)); /* 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) { XtermWidget xw = term; char *entryname = (char *) closure; int i; TRACE(("do_vtfont(%s)\n", entryname)); for (i = 0; i < NMENUFONTS; i++) { if (strcmp(entryname, fontMenuEntries[i].name) == 0) { SetVTFont(xw, i, True, NULL); return; } } Bell(xw, XkbBI_MinorError, 0); } #if OPT_DEC_CHRSET static void do_font_doublesize(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; if (TScreenOf(xw)->cache_doublesize != 0) ToggleFlag(TScreenOf(xw)->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) { ToggleFlag(TScreenOf(term)->force_box_chars); update_font_boxchars(); Redraw(); } static void do_font_packed(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { ToggleFlag(TScreenOf(term)->force_packed); update_font_packed(); SetVTFont(term, TScreenOf(term)->menu_font_number, True, NULL); } #endif #if OPT_DEC_SOFTFONT static void do_font_loadable(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { ToggleFlag(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) { XtermWidget xw = (XtermWidget) term; TScreen *screen = TScreenOf(xw); int fontnum = screen->menu_font_number; String name = TScreenOf(xw)->MenuFontName(fontnum); DefaultRenderFont(xw); ToggleFlag(xw->work.render_font); update_font_renderfont(); xtermLoadFont(xw, xtermFontName(name), True, fontnum); ScrnRefresh(term, 0, 0, MaxRows(screen), MaxCols(screen), True); } #endif #if OPT_WIDE_CHARS static void setup_wide_fonts(XtermWidget xw) { TScreen *screen = TScreenOf(xw); if (screen->wide_chars) { if (xtermLoadWideFonts(xw, True)) { SetVTFont(xw, screen->menu_font_number, True, NULL); } } else { ChangeToWide(xw); } } static void setup_narrow_fonts(XtermWidget xw) { TScreen *screen = TScreenOf(xw); if (xtermLoadDefaultFonts(xw)) { SetVTFont(xw, screen->menu_font_number, True, NULL); } } static void do_font_utf8_mode(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); /* * 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) { setup_wide_fonts(xw); } 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_fonts(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); ToggleFlag(screen->utf8_fonts); update_font_utf8_fonts(); if (screen->utf8_fonts) { setup_wide_fonts(xw); } else { setup_narrow_fonts(xw); } } static void do_font_utf8_title(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->utf8_title); update_font_utf8_title(); } #endif /* * tek menu */ #if OPT_TEK4014 static void do_tektextlarge(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextlarge); } static void do_tektext2(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext2); } static void do_tektext3(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext3); } static void do_tektextsmall(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextsmall); } static void do_tekpage(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSimulatePageButton(getTekWidget(gw), False); } static void do_tekreset(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekSimulatePageButton(getTekWidget(gw), True); } static void do_tekcopy(Widget gw, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TekCopy(getTekWidget(gw)); } static void handle_vtshow(Widget gw GCC_UNUSED, Bool allowswitch) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); TRACE(("Show vt-window\n")); if (!screen->Vshow) { /* not showing, turn on */ set_vt_visibility(True); } else if (TEK4014_SHOWN(xw) || allowswitch) { /* is showing, turn off */ set_vt_visibility(False); if (!TEK4014_ACTIVE(xw) && tekRefreshList) TekRefresh(tekWidget); end_vt_mode(); /* WARNING: this does a longjmp... */ } else Bell(xw, 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) { switch_modes(TEK4014_ACTIVE(term)); /* 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 */ int decodeToggle(XtermWidget xw, String * params, Cardinal nparams) { int dir = toggleErr; switch (nparams) { case 0: dir = toggleAll; break; case 1: if (XmuCompareISOLatin1(params[0], "on") == 0) dir = toggleOn; else if (XmuCompareISOLatin1(params[0], "off") == 0) dir = toggleOff; else if (XmuCompareISOLatin1(params[0], "toggle") == 0) dir = toggleAll; break; } if (dir == toggleErr) { Bell(xw, XkbBI_MinorError, 0); } return dir; } static void handle_toggle(void (*proc) PROTO_XT_CALLBACK_ARGS, int var, String * params, Cardinal nparams, Widget w, XtPointer closure, XtPointer data) { XtermWidget xw = term; switch (decodeToggle(xw, params, nparams)) { case toggleAll: (*proc) (w, closure, data); break; case toggleOff: if (var) (*proc) (w, closure, data); else Bell(xw, XkbBI_MinorError, 0); break; case toggleOn: if (!var) (*proc) (w, closure, data); else Bell(xw, 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_VT_TOGGLE(name) \ handle_vt_toggle(do_##name, TScreenOf(term)->name, params, *param_count, w) #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, TScreenOf(term)->allowSendEvents, params, *param_count, w); } void HandleSetVisualBell(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(visualbell); } void HandleSetPopOnBell(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(poponbell); } #ifdef ALLOWLOGGING void HandleLogging(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(logging); } #endif #if OPT_PRINT_ON_EXIT void HandleWriteNow(Widget w, XEvent * event GCC_UNUSED, String * params GCC_UNUSED, Cardinal *param_count GCC_UNUSED) { do_write_now(w, 0, 0); } void HandleWriteError(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(write_error); } #endif /* ARGSUSED */ void HandlePrintScreen(Widget w GCC_UNUSED, XEvent * event GCC_UNUSED, String * params GCC_UNUSED, Cardinal *param_count GCC_UNUSED) { xtermPrintScreen(term, True, getPrinterFlags(term, params, param_count)); } /* ARGSUSED */ void HandlePrintEverything(Widget w GCC_UNUSED, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { xtermPrintEverything(term, getPrinterFlags(term, params, param_count)); } /* 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 { const 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(term, 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, TScreenOf(term)->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_MAXIMIZE #if OPT_TEK4014 #define WhichEWMH (TEK4014_ACTIVE(xw) != 0) #else #define WhichEWMH 0 #endif static void do_fullscreen(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = term; if (resource.fullscreen != esNever) FullScreen(xw, !xw->work.ewmh[WhichEWMH].mode); } /* ARGSUSED */ void HandleFullscreen(Widget w, XEvent * event GCC_UNUSED, String * params GCC_UNUSED, Cardinal *param_count GCC_UNUSED) { XtermWidget xw = term; if (resource.fullscreen != esNever) { handle_vt_toggle(do_fullscreen, xw->work.ewmh[WhichEWMH].mode, params, *param_count, w); } } void update_fullscreen(void) { XtermWidget xw = term; if (resource.fullscreen <= 1) { UpdateCheckbox("update_fullscreen", mainMenuEntries, mainMenu_fullscreen, xw->work.ewmh[WhichEWMH].mode); } else { SetItemSensitivity(mainMenuEntries[mainMenu_fullscreen].widget, False); } } #endif /* OPT_MAXIMIZE */ #if OPT_SIXEL_GRAPHICS static void do_sixelscrolling(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { term->keyboard.flags ^= MODE_DECSDM; update_decsdm(); } static void do_privatecolorregisters(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { TScreen *screen = TScreenOf(term); ToggleFlag(screen->privatecolorregisters); update_privatecolorregisters(); } void update_privatecolorregisters(void) { UpdateCheckbox("update_privatecolorregisters", vtMenuEntries, vtMenu_privatecolorregisters, TScreenOf(term)->privatecolorregisters); } void update_decsdm(void) { UpdateCheckbox("update_decsdm", vtMenuEntries, vtMenu_sixelscrolling, (term->keyboard.flags & MODE_DECSDM) != 0); } void HandleSetPrivateColorRegisters(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(privatecolorregisters); } void HandleSixelScrolling(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_sixelscrolling, term->keyboard.flags & MODE_DECSDM, params, *param_count, w); } #endif #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, !TScreenOf(term)->alt_sends_esc, params, *param_count, w); } void HandleMetaEsc(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_meta_esc, TScreenOf(term)->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, TScreenOf(term)->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) { XtermWidget xw = term; if (IsIcon(TScreenOf(xw))) { Bell(xw, XkbBI_MinorError, 0); } else { handle_vt_toggle(do_scrollbar, TScreenOf(xw)->fullVwin.sb_info.width, params, *param_count, w); } } void HandleJumpscroll(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(jumpscroll); } void HandleKeepSelection(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(keepSelection); } void HandleSetSelect(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_selectClipboard, TScreenOf(term)->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(scrollkey); } void HandleScrollTtyOutput(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(scrollttyoutput); } void HandleAllow132(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_allow132, TScreenOf(term)->c132, params, *param_count, w); } void HandleCursesEmul(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_cursesemul, TScreenOf(term)->curses, params, *param_count, w); } void HandleBellIsUrgent(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(bellIsUrgent); } void HandleMarginBell(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(marginbell); } #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, TScreenOf(term)->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, TScreenOf(term)->whichBuf, 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); } void HandleAllowBoldFonts(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowBoldFonts); } #if OPT_DEC_CHRSET void HandleFontDoublesize(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(font_doublesize); } #endif #if OPT_BOX_CHARS void HandleFontBoxChars(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_font_boxchars, TScreenOf(term)->force_box_chars, params, *param_count, w); } void HandleFontPacked(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_font_packed, TScreenOf(term)->force_packed, 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 static void update_fontmenu(XtermWidget xw) { TScreen *screen = TScreenOf(xw); int n; for (n = 0; n <= fontMenu_lastBuiltin; ++n) { Boolean active = (Boolean) (xw->work.render_font || (screen->menu_font_sizes[n] >= 0)); SetItemSensitivity(fontMenuEntries[n].widget, active); } } void HandleRenderFont(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { XtermWidget xw = (XtermWidget) term; DefaultRenderFont(xw); handle_vt_toggle(do_font_renderfont, xw->work.render_font, params, *param_count, w); update_fontmenu(xw); } #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, TScreenOf(term)->utf8_mode, params, *param_count, w); } void HandleUTF8Fonts(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_font_utf8_fonts, TScreenOf(term)->utf8_fonts, params, *param_count, w); } void HandleUTF8Title(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { handle_vt_toggle(do_font_utf8_title, TScreenOf(term)->utf8_title, params, *param_count, w); } #endif #if OPT_TEK4014 void HandleSetTerminalType(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { XtermWidget xw = term; if (*param_count == 1) { switch (params[0][0]) { case 'v': case 'V': if (TEK4014_ACTIVE(xw)) do_vtmode(w, (XtPointer) 0, (XtPointer) 0); break; case 't': case 'T': if (!TEK4014_ACTIVE(xw)) do_tekmode(w, (XtPointer) 0, (XtPointer) 0); break; default: Bell(xw, XkbBI_MinorError, 0); } } else { Bell(xw, XkbBI_MinorError, 0); } } void HandleVisibility(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { XtermWidget xw = term; if (*param_count == 2) { switch (params[0][0]) { case 'v': case 'V': handle_tek_toggle(do_vtonoff, (int) TScreenOf(xw)->Vshow, params + 1, (*param_count) - 1, w); break; case 't': case 'T': handle_tek_toggle(do_tekonoff, (int) TEK4014_SHOWN(xw), params + 1, (*param_count) - 1, w); break; default: Bell(xw, XkbBI_MinorError, 0); } } else { Bell(xw, XkbBI_MinorError, 0); } } /* ARGSUSED */ void HandleSetTekText(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { XtermWidget xw = term; void (*proc) PROTO_XT_CALLBACK_ARGS = 0; switch (*param_count) { case 0: proc = do_tektextlarge; break; case 1: switch (TekGetFontSize(params[0])) { case TEK_FONT_LARGE: proc = do_tektextlarge; break; case TEK_FONT_2: proc = do_tektext2; break; case TEK_FONT_3: proc = do_tektext3; break; case TEK_FONT_SMALL: proc = do_tektextsmall; break; } break; } if (proc) (*proc) (w, (XtPointer) 0, (XtPointer) 0); else Bell(xw, 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 */ #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; String saveLocale = setMenuLocale(True, resource.menuLocale); 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); (void) setMenuLocale(False, saveLocale); return (Dimension) (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 = 0; Dimension toolbar_hSpace; Arg args[10]; #endif TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014")); *menu_high = 0; if (shell == toplevel) { XawSimpleMenuAddGlobalActions(app_con); XtRegisterGrabAction(HandlePopupMenu, True, (unsigned) (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, (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 */ (void) 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 = (Dimension) (button_height + 2 * (toolbar_hSpace)); TRACE(("...menuHeight:%d = (%d + 2 * %d)\n", *menu_high, button_height, toolbar_hSpace)); #else /* !OPT_TOOLBAR */ *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) { XtermWidget xw = term; TScreen *screen = TScreenOf(xw); if (XtIsRealized((Widget) xw)) { getXtermSizeHints(xw); xtermSizeHints(xw, ScrollbarWidth(screen)); XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->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", (void *) 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); #else (void) w; #endif return &(WhichVWin(TScreenOf(term))->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) { XtermWidget xw = term; TRACE(("ShowToolbar(%d)\n", enable)); if (IsIcon(TScreenOf(xw))) { Bell(xw, XkbBI_MinorError, 0); } else { if (enable) { if (InitWidgetMenu(toplevel)) show_toolbar((Widget) xw); #if OPT_TEK4014 if (InitWidgetMenu(tekshellwidget)) show_toolbar((Widget) tekWidget); #endif } else { hide_toolbar((Widget) xw); #if OPT_TEK4014 hide_toolbar((Widget) tekWidget); #endif } resource.toolBar = (Boolean) enable; update_toolbar(); } } void HandleToolbar(Widget w, XEvent * event GCC_UNUSED, String * params GCC_UNUSED, Cardinal *param_count GCC_UNUSED) { XtermWidget xw = term; if (IsIcon(TScreenOf(xw))) { Bell(xw, 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) { XtermWidget xw = term; /* * 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(TScreenOf(xw))) { Bell(xw, XkbBI_MinorError, 0); } else { ShowToolbar(ToggleFlag(resource.toolBar)); } } void update_toolbar(void) { UpdateCheckbox("update_toolbar", mainMenuEntries, mainMenu_toolbar, resource.toolBar); } #endif /* OPT_TOOLBAR */ void update_securekbd(void) { UpdateCheckbox("update_securekbd", mainMenuEntries, mainMenu_securekbd, TScreenOf(term)->grabbedKbd); } void update_allowsends(void) { UpdateCheckbox("update_allowsends", mainMenuEntries, mainMenu_allowsends, TScreenOf(term)->allowSendEvents); } #ifdef ALLOWLOGGING void update_logging(void) { UpdateCheckbox("update_logging", mainMenuEntries, mainMenu_logging, TScreenOf(term)->logging); } #endif #if OPT_PRINT_ON_EXIT void update_write_error(void) { UpdateCheckbox("update_write_error", mainMenuEntries, mainMenu_write_error, TScreenOf(term)->write_error); } #endif void update_print_redir(void) { UpdateCheckbox("update_print_redir", mainMenuEntries, mainMenu_print_redir, PrinterOf(TScreenOf(term)).printer_controlmode); } void update_8bit_control(void) { UpdateCheckbox("update_8bit_control", mainMenuEntries, mainMenu_8bit_ctrl, TScreenOf(term)->control_eight_bits); } void update_decbkm(void) { UpdateCheckbox("update_decbkm", mainMenuEntries, mainMenu_backarrow, (term->keyboard.flags & MODE_DECBKM) != 0); } #if OPT_NUM_LOCK void update_num_lock(void) { UpdateCheckbox("update_num_lock", mainMenuEntries, mainMenu_num_lock, term->misc.real_NumLock); } void update_alt_esc(void) { UpdateCheckbox("update_alt_esc", mainMenuEntries, mainMenu_alt_esc, TScreenOf(term)->alt_sends_esc); } void update_meta_esc(void) { UpdateCheckbox("update_meta_esc", mainMenuEntries, mainMenu_meta_esc, TScreenOf(term)->meta_sends_esc); } #endif #if OPT_SUN_FUNC_KEYS void update_sun_fkeys(void) { UpdateCheckbox("update_sun_fkeys", mainMenuEntries, mainMenu_sun_fkeys, term->keyboard.type == keyboardIsSun); } #endif #if OPT_TCAP_FKEYS void update_tcap_fkeys(void) { UpdateCheckbox("update_tcap_fkeys", mainMenuEntries, mainMenu_tcap_fkeys, term->keyboard.type == keyboardIsTermcap); } #endif void update_old_fkeys(void) { UpdateCheckbox("update_old_fkeys", mainMenuEntries, mainMenu_old_fkeys, term->keyboard.type == keyboardIsLegacy); } void update_delete_del(void) { UpdateCheckbox("update_delete_del", mainMenuEntries, mainMenu_delete_del, xtermDeleteIsDEL(term)); } #if OPT_SUNPC_KBD void update_sun_kbd(void) { UpdateCheckbox("update_sun_kbd", mainMenuEntries, mainMenu_sun_kbd, term->keyboard.type == keyboardIsVT220); } #endif #if OPT_HP_FUNC_KEYS void update_hp_fkeys(void) { UpdateCheckbox("update_hp_fkeys", mainMenuEntries, mainMenu_hp_fkeys, term->keyboard.type == keyboardIsHP); } #endif #if OPT_SCO_FUNC_KEYS void update_sco_fkeys(void) { UpdateCheckbox("update_sco_fkeys", mainMenuEntries, mainMenu_sco_fkeys, term->keyboard.type == keyboardIsSCO); } #endif void update_scrollbar(void) { UpdateCheckbox("update_scrollbar", vtMenuEntries, vtMenu_scrollbar, ScrollbarWidth(TScreenOf(term))); } void update_jumpscroll(void) { UpdateCheckbox("update_jumpscroll", vtMenuEntries, vtMenu_jumpscroll, TScreenOf(term)->jumpscroll); } void update_reversevideo(void) { UpdateCheckbox("update_reversevideo", vtMenuEntries, vtMenu_reversevideo, (term->misc.re_verse)); } void update_autowrap(void) { UpdateCheckbox("update_autowrap", vtMenuEntries, vtMenu_autowrap, (term->flags & WRAPAROUND) != 0); } void update_reversewrap(void) { UpdateCheckbox("update_reversewrap", vtMenuEntries, vtMenu_reversewrap, (term->flags & REVERSEWRAP) != 0); } void update_autolinefeed(void) { UpdateCheckbox("update_autolinefeed", vtMenuEntries, vtMenu_autolinefeed, (term->flags & LINEFEED) != 0); } void update_appcursor(void) { UpdateCheckbox("update_appcursor", vtMenuEntries, vtMenu_appcursor, (term->keyboard.flags & MODE_DECCKM) != 0); } void update_appkeypad(void) { UpdateCheckbox("update_appkeypad", vtMenuEntries, vtMenu_appkeypad, (term->keyboard.flags & MODE_DECKPAM) != 0); } void update_scrollkey(void) { UpdateCheckbox("update_scrollkey", vtMenuEntries, vtMenu_scrollkey, TScreenOf(term)->scrollkey); } void update_scrollttyoutput(void) { UpdateCheckbox("update_scrollttyoutput", vtMenuEntries, vtMenu_scrollttyoutput, TScreenOf(term)->scrollttyoutput); } void update_keepSelection(void) { UpdateCheckbox("update_keepSelection", vtMenuEntries, vtMenu_keepSelection, TScreenOf(term)->keepSelection); } void update_selectToClipboard(void) { UpdateCheckbox("update_selectToClipboard", vtMenuEntries, vtMenu_selectToClipboard, TScreenOf(term)->selectToClipboard); } void update_allow132(void) { UpdateCheckbox("update_allow132", vtMenuEntries, vtMenu_allow132, TScreenOf(term)->c132); } void update_cursesemul(void) { #if 0 /* 2006-2-12: no longer menu entry */ UpdateMenuItem("update_cursesemul", vtMenuEntries, vtMenu_cursesemul, TScreenOf(term)->curses); #endif } void update_visualbell(void) { UpdateCheckbox("update_visualbell", vtMenuEntries, vtMenu_visualbell, TScreenOf(term)->visualbell); } void update_bellIsUrgent(void) { UpdateCheckbox("update_bellIsUrgent", vtMenuEntries, vtMenu_bellIsUrgent, TScreenOf(term)->bellIsUrgent); } void update_poponbell(void) { UpdateCheckbox("update_poponbell", vtMenuEntries, vtMenu_poponbell, TScreenOf(term)->poponbell); } #ifndef update_marginbell /* 2007-3-7: no longer menu entry */ void update_marginbell(void) { UpdateCheckbox("update_marginbell", vtMenuEntries, vtMenu_marginbell, TScreenOf(term)->marginbell); } #endif #if OPT_BLINK_CURS void update_cursorblink(void) { UpdateCheckbox("update_cursorblink", vtMenuEntries, vtMenu_cursorblink, TScreenOf(term)->cursor_blink); } #endif void update_altscreen(void) { UpdateCheckbox("update_altscreen", vtMenuEntries, vtMenu_altscreen, TScreenOf(term)->whichBuf); } void update_titeInhibit(void) { UpdateCheckbox("update_titeInhibit", vtMenuEntries, vtMenu_titeInhibit, !(term->misc.titeInhibit)); } #ifndef NO_ACTIVE_ICON void update_activeicon(void) { UpdateCheckbox("update_activeicon", vtMenuEntries, vtMenu_activeicon, term->work.active_icon); } #endif /* NO_ACTIVE_ICON */ static void do_allowBoldFonts(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowBoldFonts); update_menu_allowBoldFonts(); Redraw(); } } #if OPT_DEC_CHRSET void update_font_doublesize(void) { UpdateCheckbox("update_font_doublesize", fontMenuEntries, fontMenu_font_doublesize, TScreenOf(term)->font_doublesize); } #endif #if OPT_BOX_CHARS void update_font_boxchars(void) { UpdateCheckbox("update_font_boxchars", fontMenuEntries, fontMenu_font_boxchars, TScreenOf(term)->force_box_chars); } void update_font_packed(void) { UpdateCheckbox("update_font_packed", fontMenuEntries, fontMenu_font_packedfont, TScreenOf(term)->force_packed); } #endif #if OPT_DEC_SOFTFONT void update_font_loadable(void) { UpdateCheckbox("update_font_loadable", fontMenuEntries, fontMenu_font_loadable, term->misc.font_loadable); } #endif #if OPT_RENDERFONT void update_font_renderfont(void) { UpdateCheckbox("update_font_renderfont", fontMenuEntries, fontMenu_render_font, (term->work.render_font == True)); SetItemSensitivity(fontMenuEntries[fontMenu_render_font].widget, !IsEmpty(term->misc.face_name)); update_fontmenu(term); } #endif #if OPT_WIDE_CHARS void update_font_utf8_mode(void) { Bool active = (TScreenOf(term)->utf8_mode != uAlways); Bool enable = (TScreenOf(term)->utf8_mode != uFalse); TRACE(("update_font_utf8_mode active %d, enable %d\n", active, enable)); SetItemSensitivity(fontMenuEntries[fontMenu_utf8_mode].widget, active); UpdateCheckbox("update_font_utf8_mode", fontMenuEntries, fontMenu_utf8_mode, enable); } void update_font_utf8_fonts(void) { Bool active = (TScreenOf(term)->utf8_fonts != uAlways); Bool enable = (TScreenOf(term)->utf8_fonts != uFalse); TRACE(("update_font_utf8_fonts active %d, enable %d\n", active, enable)); SetItemSensitivity(fontMenuEntries[fontMenu_utf8_fonts].widget, active); UpdateCheckbox("update_font_utf8_fonts", fontMenuEntries, fontMenu_utf8_fonts, enable); } void update_font_utf8_title(void) { Bool active = (TScreenOf(term)->utf8_mode != uFalse); Bool enable = (TScreenOf(term)->utf8_title); TRACE(("update_font_utf8_title active %d, enable %d\n", active, enable)); SetItemSensitivity(fontMenuEntries[fontMenu_utf8_title].widget, active); UpdateCheckbox("update_font_utf8_title", fontMenuEntries, fontMenu_utf8_title, enable); } #endif #if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT void update_menu_allowBoldFonts(void) { UpdateCheckbox("update_menu_allowBoldFonts", fontMenuEntries, fontMenu_allowBoldFonts, TScreenOf(term)->allowBoldFonts); } #endif #if OPT_ALLOW_XXX_OPS static void enable_allow_xxx_ops(Bool enable) { SetItemSensitivity(fontMenuEntries[fontMenu_allowFontOps].widget, enable); SetItemSensitivity(fontMenuEntries[fontMenu_allowTcapOps].widget, enable); SetItemSensitivity(fontMenuEntries[fontMenu_allowTitleOps].widget, enable); SetItemSensitivity(fontMenuEntries[fontMenu_allowWindowOps].widget, enable); } static void do_allowColorOps(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowColorOps); update_menu_allowColorOps(); } } static void do_allowFontOps(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowFontOps); update_menu_allowFontOps(); } } static void do_allowTcapOps(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowTcapOps); update_menu_allowTcapOps(); } } static void do_allowTitleOps(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowTitleOps); update_menu_allowTitleOps(); } } static void do_allowWindowOps(Widget w, XtPointer closure GCC_UNUSED, XtPointer data GCC_UNUSED) { XtermWidget xw = getXtermWidget(w); if (xw != 0) { ToggleFlag(TScreenOf(xw)->allowWindowOps); update_menu_allowWindowOps(); } } void HandleAllowColorOps(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowColorOps); } void HandleAllowFontOps(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowFontOps); } void HandleAllowTcapOps(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowTcapOps); } void HandleAllowTitleOps(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowTitleOps); } void HandleAllowWindowOps(Widget w, XEvent * event GCC_UNUSED, String * params, Cardinal *param_count) { HANDLE_VT_TOGGLE(allowWindowOps); } void update_menu_allowColorOps(void) { UpdateCheckbox("update_menu_allowColorOps", fontMenuEntries, fontMenu_allowColorOps, TScreenOf(term)->allowColorOps); } void update_menu_allowFontOps(void) { UpdateCheckbox("update_menu_allowFontOps", fontMenuEntries, fontMenu_allowFontOps, TScreenOf(term)->allowFontOps); } void update_menu_allowTcapOps(void) { UpdateCheckbox("update_menu_allowTcapOps", fontMenuEntries, fontMenu_allowTcapOps, TScreenOf(term)->allowTcapOps); } void update_menu_allowTitleOps(void) { UpdateCheckbox("update_menu_allowTitleOps", fontMenuEntries, fontMenu_allowTitleOps, TScreenOf(term)->allowTitleOps); } void update_menu_allowWindowOps(void) { UpdateCheckbox("update_menu_allowWindowOps", fontMenuEntries, fontMenu_allowWindowOps, TScreenOf(term)->allowWindowOps); } #endif #if OPT_TEK4014 void update_tekshow(void) { if (!(TScreenOf(term)->inhibit & I_TEK)) { UpdateCheckbox("update_tekshow", vtMenuEntries, vtMenu_tekshow, TEK4014_SHOWN(term)); } } void update_vttekmode(void) { XtermWidget xw = term; if (!(TScreenOf(xw)->inhibit & I_TEK)) { UpdateCheckbox("update_vtmode", vtMenuEntries, vtMenu_tekmode, TEK4014_ACTIVE(xw)); UpdateCheckbox("update_tekmode", tekMenuEntries, tekMenu_vtmode, !TEK4014_ACTIVE(xw)); update_fullscreen(); } } void update_vtshow(void) { if (!(TScreenOf(term)->inhibit & I_TEK)) { UpdateCheckbox("update_vtshow", tekMenuEntries, tekMenu_vtshow, TScreenOf(term)->Vshow); } } void set_vthide_sensitivity(void) { if (!(TScreenOf(term)->inhibit & I_TEK)) { SetItemSensitivity( vtMenuEntries[vtMenu_vthide].widget, TEK4014_SHOWN(term)); } } void set_tekhide_sensitivity(void) { if (!(TScreenOf(term)->inhibit & I_TEK)) { SetItemSensitivity( tekMenuEntries[tekMenu_tekhide].widget, TScreenOf(term)->Vshow); } } void set_tekfont_menu_item(int n, int val) { if (!(TScreenOf(term)->inhibit & I_TEK)) { UpdateCheckbox("set_tekfont_menu_item", tekMenuEntries, FS2MI(n), (val)); } } #endif /* OPT_TEK4014 */ void set_menu_font(int val) { UpdateCheckbox("set_menu_font", fontMenuEntries, TScreenOf(term)->menu_font_number, (val)); }