1 /* $XTermId: menu.c,v 1.378 2024/12/01 19:58:52 tom Exp $ */ 2 3 /* 4 * Copyright 1999-2023,2024 by Thomas E. Dickey 5 * 6 * All Rights Reserved 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the 10 * "Software"), to deal in the Software without restriction, including 11 * without limitation the rights to use, copy, modify, merge, publish, 12 * distribute, sublicense, and/or sell copies of the Software, and to 13 * permit persons to whom the Software is furnished to do so, subject to 14 * the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22 * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 23 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 * Except as contained in this notice, the name(s) of the above copyright 28 * holders shall not be used in advertising or otherwise to promote the 29 * sale, use or other dealings in this Software without prior written 30 * authorization. 31 * 32 * 33 * Copyright 1989 X Consortium 34 * 35 * Permission to use, copy, modify, distribute, and sell this software and its 36 * documentation for any purpose is hereby granted without fee, provided that 37 * the above copyright notice appear in all copies and that both that 38 * copyright notice and this permission notice appear in supporting 39 * documentation. 40 * 41 * The above copyright notice and this permission notice shall be included in 42 * all copies or substantial portions of the Software. 43 * 44 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 45 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 46 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 47 * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 48 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 49 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 50 * 51 * Except as contained in this notice, the name of the X Consortium shall not be 52 * used in advertising or otherwise to promote the sale, use or other dealings 53 * in this Software without prior written authorization from the X Consortium. 54 */ 55 56 #include <xterm.h> 57 #include <data.h> 58 #include <error.h> 59 #include <menu.h> 60 #include <fontutils.h> 61 #include <xstrings.h> 62 63 #include <X11/Xmu/CharSet.h> 64 65 #define app_con Xaw_app_con /* quiet a warning from SimpleMenu.h */ 66 67 #if defined(HAVE_LIB_XAW) 68 69 #include <X11/Xaw/SimpleMenu.h> 70 #include <X11/Xaw/Box.h> 71 #include <X11/Xaw/SmeBSB.h> 72 #include <X11/Xaw/SmeLine.h> 73 74 #if OPT_TOOLBAR 75 #include <X11/Xaw/MenuButton.h> 76 #include <X11/Xaw/Form.h> 77 #endif 78 79 #elif defined(HAVE_LIB_XAW3D) 80 81 #include <X11/Xaw3d/SimpleMenu.h> 82 #include <X11/Xaw3d/Box.h> 83 #include <X11/Xaw3d/SmeBSB.h> 84 #include <X11/Xaw3d/SmeLine.h> 85 86 #if OPT_TOOLBAR 87 #include <X11/Xaw3d/MenuButton.h> 88 #include <X11/Xaw3d/Form.h> 89 #endif 90 91 #elif defined(HAVE_LIB_XAW3DXFT) 92 93 #include <X11/Xaw3dxft/SimpleMenu.h> 94 #include <X11/Xaw3dxft/Box.h> 95 #include <X11/Xaw3dxft/SmeBSB.h> 96 #include <X11/Xaw3dxft/SmeLine.h> 97 98 #if OPT_TOOLBAR 99 #include <X11/Xaw3dxft/MenuButton.h> 100 #include <X11/Xaw3dxft/Form.h> 101 #endif 102 103 #elif defined(HAVE_LIB_NEXTAW) 104 105 #include <X11/neXtaw/SimpleMenu.h> 106 #include <X11/neXtaw/Box.h> 107 #include <X11/neXtaw/SmeBSB.h> 108 #include <X11/neXtaw/SmeLine.h> 109 110 #if OPT_TOOLBAR 111 #include <X11/neXtaw/MenuButton.h> 112 #include <X11/neXtaw/Form.h> 113 #endif 114 115 #elif defined(HAVE_LIB_XAWPLUS) 116 117 #include <X11/XawPlus/SimpleMenu.h> 118 #include <X11/XawPlus/Box.h> 119 #include <X11/XawPlus/SmeBSB.h> 120 #include <X11/XawPlus/SmeLine.h> 121 122 #if OPT_TOOLBAR 123 #include <X11/XawPlus/MenuButton.h> 124 #include <X11/XawPlus/Form.h> 125 #endif 126 127 #endif 128 129 #undef app_con 130 131 #include <stdio.h> 132 #include <signal.h> 133 134 #if OPT_TRACE 135 #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(func, mn, mi, val) 136 #else 137 #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(mn, mi, val) 138 #endif 139 140 #define ToggleFlag(flag) flag = (Boolean) !flag 141 /* *INDENT-OFF* */ 142 static void do_8bit_control PROTO_XT_CALLBACK_ARGS; 143 static void do_allow132 PROTO_XT_CALLBACK_ARGS; 144 static void do_allowBoldFonts PROTO_XT_CALLBACK_ARGS; 145 static void do_allowsends PROTO_XT_CALLBACK_ARGS; 146 static void do_altscreen PROTO_XT_CALLBACK_ARGS; 147 static void do_appcursor PROTO_XT_CALLBACK_ARGS; 148 static void do_appkeypad PROTO_XT_CALLBACK_ARGS; 149 static void do_autolinefeed PROTO_XT_CALLBACK_ARGS; 150 static void do_autowrap PROTO_XT_CALLBACK_ARGS; 151 static void do_backarrow PROTO_XT_CALLBACK_ARGS; 152 static void do_bellIsUrgent PROTO_XT_CALLBACK_ARGS; 153 static void do_continue PROTO_XT_CALLBACK_ARGS; 154 static void do_delete_del PROTO_XT_CALLBACK_ARGS; 155 #if OPT_SCREEN_DUMPS 156 static void do_dump_html PROTO_XT_CALLBACK_ARGS; 157 static void do_dump_svg PROTO_XT_CALLBACK_ARGS; 158 #endif 159 static void do_interrupt PROTO_XT_CALLBACK_ARGS; 160 static void do_jumpscroll PROTO_XT_CALLBACK_ARGS; 161 static void do_keepClipboard PROTO_XT_CALLBACK_ARGS; 162 static void do_keepSelection PROTO_XT_CALLBACK_ARGS; 163 static void do_kill PROTO_XT_CALLBACK_ARGS; 164 static void do_old_fkeys PROTO_XT_CALLBACK_ARGS; 165 static void do_poponbell PROTO_XT_CALLBACK_ARGS; 166 static void do_print PROTO_XT_CALLBACK_ARGS; 167 static void do_print_redir PROTO_XT_CALLBACK_ARGS; 168 static void do_redraw PROTO_XT_CALLBACK_ARGS; 169 static void do_reversevideo PROTO_XT_CALLBACK_ARGS; 170 static void do_reversewrap PROTO_XT_CALLBACK_ARGS; 171 static void do_scrollbar PROTO_XT_CALLBACK_ARGS; 172 static void do_scrollkey PROTO_XT_CALLBACK_ARGS; 173 static void do_scrollttyoutput PROTO_XT_CALLBACK_ARGS; 174 static void do_securekbd PROTO_XT_CALLBACK_ARGS; 175 static void do_selectClipboard PROTO_XT_CALLBACK_ARGS; 176 static void do_suspend PROTO_XT_CALLBACK_ARGS; 177 static void do_terminate PROTO_XT_CALLBACK_ARGS; 178 static void do_titeInhibit PROTO_XT_CALLBACK_ARGS; 179 static void do_visualbell PROTO_XT_CALLBACK_ARGS; 180 static void do_vtfont PROTO_XT_CALLBACK_ARGS; 181 182 static GCC_NORETURN void do_clearsavedlines PROTO_XT_CALLBACK_ARGS; 183 static GCC_NORETURN void do_hardreset PROTO_XT_CALLBACK_ARGS; 184 static GCC_NORETURN void do_quit PROTO_XT_CALLBACK_ARGS; 185 static GCC_NORETURN void do_softreset PROTO_XT_CALLBACK_ARGS; 186 187 #ifdef ALLOWLOGGING 188 static void do_logging PROTO_XT_CALLBACK_ARGS; 189 #endif 190 191 #ifndef NO_ACTIVE_ICON 192 static void do_activeicon PROTO_XT_CALLBACK_ARGS; 193 #endif /* NO_ACTIVE_ICON */ 194 195 #if OPT_ALLOW_XXX_OPS 196 static void enable_allow_xxx_ops (Bool); 197 static void do_allowColorOps PROTO_XT_CALLBACK_ARGS; 198 static void do_allowFontOps PROTO_XT_CALLBACK_ARGS; 199 static void do_allowMouseOps PROTO_XT_CALLBACK_ARGS; 200 static void do_allowTcapOps PROTO_XT_CALLBACK_ARGS; 201 static void do_allowTitleOps PROTO_XT_CALLBACK_ARGS; 202 static void do_allowWindowOps PROTO_XT_CALLBACK_ARGS; 203 #endif 204 205 #if OPT_BLINK_CURS 206 static void do_cursorblink PROTO_XT_CALLBACK_ARGS; 207 #endif 208 209 #if OPT_BOX_CHARS 210 static void do_font_boxchars PROTO_XT_CALLBACK_ARGS; 211 static void do_font_packed PROTO_XT_CALLBACK_ARGS; 212 #endif 213 214 #if OPT_DEC_CHRSET 215 static void do_font_doublesize PROTO_XT_CALLBACK_ARGS; 216 #endif 217 218 #if OPT_DEC_SOFTFONT 219 static void do_font_loadable PROTO_XT_CALLBACK_ARGS; 220 #endif 221 222 #if OPT_HP_FUNC_KEYS 223 static void do_hp_fkeys PROTO_XT_CALLBACK_ARGS; 224 #endif 225 226 #if OPT_MAXIMIZE 227 static void do_fullscreen PROTO_XT_CALLBACK_ARGS; 228 #endif 229 230 #if OPT_NUM_LOCK 231 static void do_alt_esc PROTO_XT_CALLBACK_ARGS; 232 static void do_num_lock PROTO_XT_CALLBACK_ARGS; 233 static void do_meta_esc PROTO_XT_CALLBACK_ARGS; 234 #endif 235 236 #if OPT_PRINT_ON_EXIT 237 static void do_write_now PROTO_XT_CALLBACK_ARGS; 238 static void do_write_error PROTO_XT_CALLBACK_ARGS; 239 #endif 240 241 #if OPT_RENDERFONT 242 static void do_font_renderfont PROTO_XT_CALLBACK_ARGS; 243 #endif 244 245 #if OPT_SCO_FUNC_KEYS 246 static void do_sco_fkeys PROTO_XT_CALLBACK_ARGS; 247 #endif 248 249 #if OPT_SIXEL_GRAPHICS 250 static void do_sixelscrolling PROTO_XT_CALLBACK_ARGS; 251 #endif 252 253 #if OPT_GRAPHICS 254 static void do_privatecolorregisters PROTO_XT_CALLBACK_ARGS; 255 #endif 256 257 #if OPT_SUN_FUNC_KEYS 258 static void do_sun_fkeys PROTO_XT_CALLBACK_ARGS; 259 #endif 260 261 #if OPT_SUNPC_KBD 262 static void do_sun_kbd PROTO_XT_CALLBACK_ARGS; 263 #endif 264 265 #if OPT_TCAP_FKEYS 266 static void do_tcap_fkeys PROTO_XT_CALLBACK_ARGS; 267 #endif 268 269 #if OPT_TEK4014 270 static void do_tekcopy PROTO_XT_CALLBACK_ARGS; 271 static void do_tekhide PROTO_XT_CALLBACK_ARGS; 272 static void do_tekmode PROTO_XT_CALLBACK_ARGS; 273 static void do_tekonoff PROTO_XT_CALLBACK_ARGS; 274 static void do_tekpage PROTO_XT_CALLBACK_ARGS; 275 static void do_tekreset PROTO_XT_CALLBACK_ARGS; 276 static void do_tekshow PROTO_XT_CALLBACK_ARGS; 277 static void do_tektext2 PROTO_XT_CALLBACK_ARGS; 278 static void do_tektext3 PROTO_XT_CALLBACK_ARGS; 279 static void do_tektextlarge PROTO_XT_CALLBACK_ARGS; 280 static void do_tektextsmall PROTO_XT_CALLBACK_ARGS; 281 static void do_vthide PROTO_XT_CALLBACK_ARGS; 282 static void do_vtmode PROTO_XT_CALLBACK_ARGS; 283 static void do_vtonoff PROTO_XT_CALLBACK_ARGS; 284 static void do_vtshow PROTO_XT_CALLBACK_ARGS; 285 static void handle_tekshow (Widget gw, Bool allowswitch); 286 static void handle_vtshow (Widget gw, Bool allowswitch); 287 #endif 288 289 #if OPT_TOOLBAR 290 static void do_toolbar PROTO_XT_CALLBACK_ARGS; 291 #endif 292 293 #if OPT_WIDE_CHARS 294 static void do_font_utf8_mode PROTO_XT_CALLBACK_ARGS; 295 static void do_font_utf8_fonts PROTO_XT_CALLBACK_ARGS; 296 static void do_font_utf8_title PROTO_XT_CALLBACK_ARGS; 297 #endif 298 299 /* 300 * The order of entries MUST match the values given in menu.h 301 */ 302 MenuEntry mainMenuEntries[] = { 303 #if OPT_TOOLBAR 304 { "toolbar", do_toolbar, NULL }, 305 #endif 306 #if OPT_MAXIMIZE 307 { "fullscreen", do_fullscreen, NULL }, 308 #endif 309 { "securekbd", do_securekbd, NULL }, 310 { "allowsends", do_allowsends, NULL }, 311 { "redraw", do_redraw, NULL }, 312 { "line1", NULL, NULL }, 313 #ifdef ALLOWLOGGING 314 { "logging", do_logging, NULL }, 315 #endif 316 #if OPT_PRINT_ON_EXIT 317 { "print-immediate", do_write_now, NULL }, 318 { "print-on-error", do_write_error, NULL }, 319 #endif 320 { "print", do_print, NULL }, 321 { "print-redir", do_print_redir, NULL }, 322 #if OPT_SCREEN_DUMPS 323 { "dump-html", do_dump_html, NULL }, 324 { "dump-svg", do_dump_svg, NULL }, 325 #endif 326 { "line2", NULL, NULL }, 327 { "8-bit control", do_8bit_control,NULL }, 328 { "backarrow key", do_backarrow, NULL }, 329 #if OPT_NUM_LOCK 330 { "num-lock", do_num_lock, NULL }, 331 { "alt-esc", do_alt_esc, NULL }, 332 { "meta-esc", do_meta_esc, NULL }, 333 #endif 334 { "delete-is-del", do_delete_del, NULL }, 335 { "oldFunctionKeys",do_old_fkeys, NULL }, 336 #if OPT_TCAP_FKEYS 337 { "tcapFunctionKeys",do_tcap_fkeys, NULL }, 338 #endif 339 #if OPT_HP_FUNC_KEYS 340 { "hpFunctionKeys", do_hp_fkeys, NULL }, 341 #endif 342 #if OPT_SCO_FUNC_KEYS 343 { "scoFunctionKeys",do_sco_fkeys, NULL }, 344 #endif 345 #if OPT_SUN_FUNC_KEYS 346 { "sunFunctionKeys",do_sun_fkeys, NULL }, 347 #endif 348 #if OPT_SUNPC_KBD 349 { "sunKeyboard", do_sun_kbd, NULL }, 350 #endif 351 { "line3", NULL, NULL }, 352 { "suspend", do_suspend, NULL }, 353 { "continue", do_continue, NULL }, 354 { "interrupt", do_interrupt, NULL }, 355 { "hangup", do_hangup, NULL }, 356 { "terminate", do_terminate, NULL }, 357 { "kill", do_kill, NULL }, 358 { "line4", NULL, NULL }, 359 { "quit", do_quit, NULL }}; 360 361 MenuEntry vtMenuEntries[] = { 362 { "scrollbar", do_scrollbar, NULL }, 363 { "jumpscroll", do_jumpscroll, NULL }, 364 { "reversevideo", do_reversevideo, NULL }, 365 { "autowrap", do_autowrap, NULL }, 366 { "reversewrap", do_reversewrap, NULL }, 367 { "autolinefeed", do_autolinefeed, NULL }, 368 { "appcursor", do_appcursor, NULL }, 369 { "appkeypad", do_appkeypad, NULL }, 370 { "scrollkey", do_scrollkey, NULL }, 371 { "scrollttyoutput",do_scrollttyoutput, NULL }, 372 { "allow132", do_allow132, NULL }, 373 { "keepSelection", do_keepSelection, NULL }, 374 #if OPT_MENU_KEEPCLIPBOARD 375 { "keepClipboard", do_keepClipboard, NULL }, 376 #endif 377 { "selectToClipboard",do_selectClipboard, NULL }, 378 { "visualbell", do_visualbell, NULL }, 379 { "bellIsUrgent", do_bellIsUrgent, NULL }, 380 { "poponbell", do_poponbell, NULL }, 381 #if OPT_BLINK_CURS 382 { "cursorblink", do_cursorblink, NULL }, 383 #endif 384 { "titeInhibit", do_titeInhibit, NULL }, 385 #ifndef NO_ACTIVE_ICON 386 { "activeicon", do_activeicon, NULL }, 387 #endif /* NO_ACTIVE_ICON */ 388 { "line1", NULL, NULL }, 389 { "softreset", do_softreset, NULL }, 390 { "hardreset", do_hardreset, NULL }, 391 { "clearsavedlines",do_clearsavedlines, NULL }, 392 { "line2", NULL, NULL }, 393 #if OPT_TEK4014 394 { "tekshow", do_tekshow, NULL }, 395 { "tekmode", do_tekmode, NULL }, 396 { "vthide", do_vthide, NULL }, 397 #endif 398 { "altscreen", do_altscreen, NULL }, 399 #if OPT_SIXEL_GRAPHICS 400 { "sixelScrolling", do_sixelscrolling, NULL }, 401 #endif 402 #if OPT_GRAPHICS 403 { "privateColorRegisters", do_privatecolorregisters, NULL }, 404 #endif 405 }; 406 407 MenuEntry fontMenuEntries[] = { 408 { "fontdefault", do_vtfont, NULL }, 409 { "font1", do_vtfont, NULL }, 410 { "font2", do_vtfont, NULL }, 411 { "font3", do_vtfont, NULL }, 412 { "font4", do_vtfont, NULL }, 413 { "font5", do_vtfont, NULL }, 414 { "font6", do_vtfont, NULL }, 415 { "font7", do_vtfont, NULL }, 416 /* this is after the last builtin font; the other entries are special */ 417 { "fontescape", do_vtfont, NULL }, 418 { "fontsel", do_vtfont, NULL }, 419 /* down to here should match NMENUFONTS in ptyx.h */ 420 421 #if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT 422 { "line1", NULL, NULL }, 423 { "allow-bold-fonts", do_allowBoldFonts, NULL }, 424 #if OPT_BOX_CHARS 425 { "font-linedrawing",do_font_boxchars,NULL }, 426 { "font-packed", do_font_packed,NULL }, 427 #endif 428 #if OPT_DEC_CHRSET 429 { "font-doublesize",do_font_doublesize,NULL }, 430 #endif 431 #if OPT_DEC_SOFTFONT 432 { "font-loadable", do_font_loadable,NULL }, 433 #endif 434 #endif /* toggles for DEC font extensions */ 435 436 #if OPT_RENDERFONT || OPT_WIDE_CHARS 437 { "line2", NULL, NULL }, 438 #if OPT_RENDERFONT 439 { "render-font", do_font_renderfont,NULL }, 440 #endif 441 #if OPT_WIDE_CHARS 442 { "utf8-mode", do_font_utf8_mode,NULL }, 443 { "utf8-fonts", do_font_utf8_fonts,NULL }, 444 { "utf8-title", do_font_utf8_title,NULL }, 445 #endif 446 #endif /* toggles for other font extensions */ 447 448 #if OPT_ALLOW_XXX_OPS 449 { "line3", NULL, NULL }, 450 { "allow-color-ops",do_allowColorOps,NULL }, 451 { "allow-font-ops", do_allowFontOps,NULL }, 452 { "allow-mouse-ops",do_allowMouseOps,NULL }, 453 { "allow-tcap-ops", do_allowTcapOps,NULL }, 454 { "allow-title-ops",do_allowTitleOps,NULL }, 455 { "allow-window-ops",do_allowWindowOps,NULL }, 456 #endif 457 458 }; 459 460 #if OPT_TEK4014 461 MenuEntry tekMenuEntries[] = { 462 { "tektextlarge", do_tektextlarge, NULL }, 463 { "tektext2", do_tektext2, NULL }, 464 { "tektext3", do_tektext3, NULL }, 465 { "tektextsmall", do_tektextsmall, NULL }, 466 { "line1", NULL, NULL }, 467 { "tekpage", do_tekpage, NULL }, 468 { "tekreset", do_tekreset, NULL }, 469 { "tekcopy", do_tekcopy, NULL }, 470 { "line2", NULL, NULL }, 471 { "vtshow", do_vtshow, NULL }, 472 { "vtmode", do_vtmode, NULL }, 473 { "tekhide", do_tekhide, NULL }}; 474 #endif 475 476 typedef struct { 477 char *internal_name; 478 MenuEntry *entry_list; 479 Cardinal entry_len; 480 } MenuHeader; 481 482 /* This table is ordered to correspond with MenuIndex */ 483 #define DATA(name) { (char *)#name, name ## Entries, XtNumber(name ## Entries ) } 484 static const MenuHeader menu_names[] = { 485 DATA( mainMenu), 486 DATA( vtMenu), 487 DATA( fontMenu), 488 #if OPT_TEK4014 489 DATA( tekMenu), 490 #endif 491 { NULL, NULL, 0 }, 492 }; 493 #undef DATA 494 /* *INDENT-ON* */ 495 496 /* 497 * FIXME: These are global data rather than in the xterm widget because they 498 * are initialized before the widget is created. 499 */ 500 typedef struct { 501 Widget b; /* the toolbar's buttons */ 502 Widget w; /* the popup shell activated by the button */ 503 Cardinal entries; 504 } MenuList; 505 506 static MenuList vt_shell[NUM_POPUP_MENUS]; 507 508 #if OPT_TEK4014 && OPT_TOOLBAR 509 static MenuList tek_shell[NUM_POPUP_MENUS]; 510 #endif 511 512 /* 513 * Returns a pointer to the MenuList entry that matches the popup menu. 514 */ 515 static MenuList * 516 select_menu(Widget w, MenuIndex num) 517 { 518 #if OPT_TEK4014 && OPT_TOOLBAR 519 while (w != NULL) { 520 if (w == tekshellwidget) { 521 return &tek_shell[num]; 522 } 523 w = XtParent(w); 524 } 525 #else 526 (void) w; 527 #endif 528 return &vt_shell[num]; 529 } 530 531 /* 532 * Returns a pointer to the given popup menu shell 533 */ 534 static Widget 535 obtain_menu(Widget w, MenuIndex num) 536 { 537 return select_menu(w, num)->w; 538 } 539 540 /* 541 * Returns the number of entries in the given popup menu shell 542 */ 543 static Cardinal 544 sizeof_menu(Widget w, MenuIndex num) 545 { 546 return select_menu(w, num)->entries; 547 } 548 549 /* 550 * Return an array of flags telling if a given menu item is never going to 551 * be used, so we can reduce the size of menus. 552 */ 553 static Boolean * 554 unusedEntries(XtermWidget xw, MenuIndex num) 555 { 556 static Boolean result[XtNumber(mainMenuEntries) 557 + XtNumber(vtMenuEntries) 558 + XtNumber(fontMenuEntries) 559 #if OPT_TEK4014 560 + XtNumber(tekMenuEntries) 561 #endif 562 ]; 563 TScreen *screen = TScreenOf(xw); 564 565 memset(result, 0, sizeof(result)); 566 switch (num) { 567 case mainMenu: 568 #if OPT_MAXIMIZE 569 if (resource.fullscreen > 1) { 570 result[mainMenu_fullscreen] = True; 571 } 572 #endif 573 #if OPT_NUM_LOCK 574 if (!screen->alt_is_not_meta) { 575 result[mainMenu_alt_esc] = True; 576 } 577 #endif 578 if (!xtermHasPrinter(xw)) { 579 result[mainMenu_print] = True; 580 result[mainMenu_print_redir] = True; 581 } 582 if (screen->terminal_id < 200) { 583 result[mainMenu_8bit_ctrl] = True; 584 } 585 #if !defined(SIGTSTP) 586 result[mainMenu_suspend] = True; 587 #endif 588 #if !defined(SIGCONT) 589 result[mainMenu_continue] = True; 590 #endif 591 #ifdef ALLOWLOGGING 592 if (screen->inhibit & I_LOG) { 593 result[mainMenu_logging] = True; 594 } 595 #endif 596 if (screen->inhibit & I_SIGNAL) { 597 int n; 598 for (n = (int) mainMenu_suspend; n <= (int) mainMenu_quit; ++n) { 599 result[n] = True; 600 } 601 } 602 break; 603 case vtMenu: 604 #if !defined(NO_ACTIVE_ICON) && !OPT_TOOLBAR 605 if (!getIconicFont(screen)->fs || !screen->iconVwin.window) { 606 result[vtMenu_activeicon] = True; 607 } 608 #endif /* NO_ACTIVE_ICON */ 609 #if OPT_TEK4014 610 if (screen->inhibit & I_TEK) { 611 int n; 612 for (n = (int) vtMenu_tekshow; n <= (int) vtMenu_vthide; ++n) { 613 result[n] = True; 614 } 615 } 616 #endif 617 break; 618 case fontMenu: 619 break; 620 #if OPT_TEK4014 621 case tekMenu: 622 break; 623 #endif 624 case noMenu: 625 break; 626 } 627 return result; 628 } 629 630 /* 631 * When using the toolbar configuration, some systems (seen with Solaris 11) 632 * give a warning that (Xt) cannot find a usable font-set. This does not stop 633 * the toolbars from working - ignore for now. 634 */ 635 #if OPT_TOOLBAR 636 static void 637 ignoreWarning( 638 String p_name, 639 String p_type, 640 String p_class, 641 String p_default, 642 String *p_params, 643 Cardinal *p_num_params) 644 { 645 (void) p_name; 646 (void) p_type; 647 (void) p_class; 648 (void) p_default; 649 (void) p_params; 650 (void) p_num_params; 651 } 652 #endif 653 654 /* 655 * create_menu - create a popup shell and stuff the menu into it. 656 */ 657 static Widget 658 create_menu(Widget w, XtermWidget xw, MenuIndex num) 659 { 660 static XtCallbackRec cb[2] = 661 { 662 {NULL, NULL}, 663 {NULL, NULL}}; 664 static Arg arg = 665 {XtNcallback, (XtArgVal) cb}; 666 667 TScreen *screen = TScreenOf(xw); 668 const MenuHeader *data = &menu_names[num]; 669 MenuList *list = select_menu(w, num); 670 struct _MenuEntry *entries = data->entry_list; 671 Cardinal nentries = data->entry_len; 672 #if !OPT_TOOLBAR 673 char *saveLocale; 674 #endif 675 676 if (screen->menu_item_bitmap == None) { 677 /* 678 * we really want to do these dynamically 679 */ 680 #define check_width 9 681 #define check_height 8 682 static unsigned char check_bits[] = 683 { 684 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00, 685 0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00 686 }; 687 688 screen->menu_item_bitmap = 689 XCreateBitmapFromData(XtDisplay(xw), 690 RootWindowOfScreen(XtScreen(xw)), 691 (char *) check_bits, check_width, check_height); 692 } 693 #if !OPT_TOOLBAR 694 saveLocale = xtermSetLocale(LC_CTYPE, resource.menuLocale); 695 list->w = XtCreatePopupShell(data->internal_name, 696 simpleMenuWidgetClass, 697 toplevel, 698 NULL, 0); 699 TRACE(("created popupShell(%s) widget %p, window %#lx\n", 700 data->internal_name, (void *) list->w, XtWindow(list->w))); 701 #endif 702 if (list->w != NULL) { 703 Boolean *unused = unusedEntries(xw, num); 704 Cardinal n; 705 #if OPT_TOOLBAR 706 Boolean useLocale = !strcmp(resource.menuLocale, ""); 707 XtErrorMsgHandler warningHandler = NULL; 708 if (!useLocale) 709 warningHandler = XtAppSetWarningMsgHandler(app_con, ignoreWarning); 710 #endif 711 712 list->entries = 0; 713 714 for (n = 0; n < nentries; ++n) { 715 if (!unused[n]) { 716 cb[0].callback = (XtCallbackProc) entries[n].function; 717 cb[0].closure = (XtPointer) entries[n].name; 718 entries[n].widget = XtCreateManagedWidget(entries[n].name, 719 (entries[n].function 720 ? smeBSBObjectClass 721 : smeLineObjectClass), 722 list->w, 723 &arg, (Cardinal) 1); 724 TRACE(("created menuEntry[%d] widget %p, window %#lx\n", 725 n, (void *) entries[n].widget, XtWindow(entries[n].widget))); 726 list->entries++; 727 } 728 } 729 #if OPT_TOOLBAR 730 if (!useLocale) 731 XtAppSetWarningMsgHandler(app_con, warningHandler); 732 #endif 733 } 734 #if !OPT_TOOLBAR 735 xtermResetLocale(LC_CTYPE, saveLocale); 736 #endif 737 738 /* do not realize at this point */ 739 return list->w; 740 } 741 742 static MenuIndex 743 indexOfMenu(String menuName) 744 { 745 MenuIndex me; 746 switch (*menuName) { 747 case 'm': 748 me = mainMenu; 749 break; 750 case 'v': 751 me = vtMenu; 752 break; 753 case 'f': 754 me = fontMenu; 755 break; 756 #if OPT_TEK4014 757 case 't': 758 me = tekMenu; 759 break; 760 #endif 761 default: 762 me = noMenu; 763 } 764 return (me); 765 } 766 767 /* ARGSUSED */ 768 static Bool 769 domenu(Widget w, 770 XEvent *event GCC_UNUSED, 771 String *params, /* mainMenu, vtMenu, or tekMenu */ 772 const Cardinal *param_count) /* 0 or 1 */ 773 { 774 XtermWidget xw = term; 775 TScreen *screen = TScreenOf(xw); 776 MenuIndex me; 777 Bool created = False; 778 Widget mw; 779 780 if (*param_count != 1) { 781 Bell(xw, XkbBI_MinorError, 0); 782 return False; 783 } 784 785 if ((me = indexOfMenu(params[0])) == noMenu) { 786 Bell(xw, XkbBI_MinorError, 0); 787 return False; 788 } 789 790 if ((mw = obtain_menu(w, me)) == NULL 791 || sizeof_menu(w, me) == 0) { 792 mw = create_menu(w, xw, me); 793 created = (mw != NULL); 794 } 795 if (mw == NULL) 796 return False; 797 798 TRACE(("domenu(%s) %s\n", params[0], created ? "create" : "update")); 799 switch (me) { 800 case mainMenu: 801 if (created) { 802 update_toolbar(); 803 update_fullscreen(); 804 update_securekbd(); 805 update_allowsends(); 806 update_logging(); 807 update_print_redir(); 808 update_8bit_control(); 809 update_decbkm(); 810 update_num_lock(); 811 update_alt_esc(); 812 update_meta_esc(); 813 update_delete_del(); 814 update_keyboard_type(); 815 #if OPT_PRINT_ON_EXIT 816 screen->write_error = !IsEmpty(resource.printFileOnXError); 817 SetItemSensitivity(mainMenuEntries[mainMenu_write_now].widget, True); 818 SetItemSensitivity(mainMenuEntries[mainMenu_write_error].widget, screen->write_error); 819 #endif 820 } 821 break; 822 823 case vtMenu: 824 if (created) { 825 update_scrollbar(); 826 update_jumpscroll(); 827 update_reversevideo(); 828 update_autowrap(); 829 update_reversewrap(); 830 update_autolinefeed(); 831 update_appcursor(); 832 update_appkeypad(); 833 update_scrollkey(); 834 update_scrollttyoutput(); 835 update_allow132(); 836 update_cursesemul(); 837 update_keepSelection(); 838 update_selectToClipboard(); 839 update_visualbell(); 840 update_poponbell(); 841 update_bellIsUrgent(); 842 update_cursorblink(); 843 update_altscreen(); 844 update_decsdm(); /* Sixel Display Mode */ 845 update_titeInhibit(); 846 #ifndef NO_ACTIVE_ICON 847 update_activeicon(); 848 #endif /* NO_ACTIVE_ICON */ 849 update_privatecolorregisters(); 850 } 851 break; 852 853 case fontMenu: 854 if (created) { 855 int n; 856 857 set_menu_font(True); 858 for (n = fontMenu_font1; n <= fontMenu_font7; ++n) { 859 if (IsEmpty(screen->menu_font_names[n][fNorm])) 860 SetItemSensitivity(fontMenuEntries[n].widget, False); 861 } 862 update_font_escape(); 863 update_menu_allowBoldFonts(); 864 #if OPT_BOX_CHARS 865 update_font_boxchars(); 866 update_font_packed(); 867 SetItemSensitivity( 868 fontMenuEntries[fontMenu_font_packedfont].widget, 869 True); 870 #endif 871 #if OPT_DEC_SOFTFONT /* FIXME: not implemented */ 872 update_font_loadable(); 873 SetItemSensitivity( 874 fontMenuEntries[fontMenu_font_loadable].widget, 875 False); 876 #endif 877 #if OPT_DEC_CHRSET 878 update_font_doublesize(); 879 if (TScreenOf(xw)->cache_doublesize == 0) 880 SetItemSensitivity( 881 fontMenuEntries[fontMenu_font_doublesize].widget, 882 False); 883 #endif 884 #if OPT_RENDERFONT 885 update_font_renderfont(); 886 #endif 887 #if OPT_WIDE_CHARS 888 update_font_utf8_mode(); 889 update_font_utf8_fonts(); 890 update_font_utf8_title(); 891 #endif 892 #if OPT_ALLOW_XXX_OPS 893 update_menu_allowColorOps(); 894 update_menu_allowFontOps(); 895 update_menu_allowMouseOps(); 896 update_menu_allowTcapOps(); 897 update_menu_allowTitleOps(); 898 update_menu_allowWindowOps(); 899 enable_allow_xxx_ops(!(screen->allowSendEvents)); 900 #endif 901 } 902 #if OPT_TOOLBAR 903 /* menus for toolbar are initialized once only */ 904 SetItemSensitivity(fontMenuEntries[fontMenu_fontsel].widget, True); 905 #else 906 FindFontSelection(xw, NULL, True); 907 SetItemSensitivity(fontMenuEntries[fontMenu_fontsel].widget, 908 (screen->SelectFontName() 909 ? True 910 : False)); 911 #endif 912 break; 913 914 #if OPT_TEK4014 915 case tekMenu: 916 if (created && tekWidget) { 917 set_tekfont_menu_item(TekScreenOf(tekWidget)->cur.fontsize, True); 918 update_vtshow(); 919 } 920 break; 921 #endif 922 case noMenu: 923 default: 924 break; 925 } 926 927 return True; 928 } 929 930 /* 931 * public interfaces 932 */ 933 934 void 935 HandleCreateMenu(Widget w, 936 XEvent *event, 937 String *params, /* mainMenu, vtMenu, or tekMenu */ 938 Cardinal *param_count) /* 0 or 1 */ 939 { 940 TRACE(("HandleCreateMenu\n")); 941 (void) domenu(w, event, params, param_count); 942 } 943 944 void 945 HandlePopupMenu(Widget w, 946 XEvent *event, 947 String *params, /* mainMenu, vtMenu, or tekMenu */ 948 Cardinal *param_count) /* 0 or 1 */ 949 { 950 TRACE(("HandlePopupMenu\n")); 951 if (domenu(w, event, params, param_count)) { 952 XtermWidget xw = term; 953 TScreen *screen = TScreenOf(xw); 954 955 #if OPT_TOOLBAR 956 w = select_menu(w, mainMenu)->w; 957 #endif 958 /* 959 * The action procedure in SimpleMenu.c, PositionMenu does not expect a 960 * key translation event when we are popping up a menu. In particular, 961 * if the pointer is outside the menu, then the action procedure will 962 * fail in its attempt to determine the location of the pointer within 963 * the menu. Anticipate that by warping the pointer into the menu when 964 * a key event is detected. 965 */ 966 switch (event->type) { 967 case KeyPress: 968 case KeyRelease: 969 XWarpPointer(screen->display, None, XtWindow(w), 0, 0, 0, 0, 0, 0); 970 break; 971 default: 972 XtCallActionProc(w, "XawPositionSimpleMenu", event, params, 1); 973 break; 974 } 975 XtCallActionProc(w, "MenuPopup", event, params, 1); 976 } 977 } 978 979 /* 980 * private interfaces - keep out! 981 */ 982 983 /* ARGSUSED */ 984 static void 985 handle_send_signal(Widget gw GCC_UNUSED, int sig) 986 { 987 TScreen *screen = TScreenOf(term); 988 989 if (hold_screen > 1) 990 hold_screen = 0; 991 if (screen->pid > 1) 992 kill_process_group(screen->pid, sig); 993 } 994 995 #if OPT_VT52_MODE 996 static void 997 DisableIfVT52(MenuEntry * menu, int which) 998 { 999 Widget mi = menu[which].widget; 1000 SetItemSensitivity(mi, TScreenOf(term)->vtXX_level != 0); 1001 } 1002 1003 #else 1004 #define DisableIfVT52(which,val) /* nothing */ 1005 #endif 1006 1007 static void 1008 UpdateMenuItem( 1009 #if OPT_TRACE 1010 const char *func, 1011 #endif 1012 MenuEntry * menu, 1013 int which, 1014 Bool val) 1015 { 1016 static Arg menuArgs = 1017 {XtNleftBitmap, (XtArgVal) 0}; 1018 Widget mi = menu[which].widget; 1019 1020 if (mi) { 1021 menuArgs.value = (XtArgVal) ((val) 1022 ? TScreenOf(term)->menu_item_bitmap 1023 : None); 1024 XtSetValues(mi, &menuArgs, (Cardinal) 1); 1025 } 1026 TRACE(("%s(%d): %s\n", func, which, MtoS(val))); 1027 } 1028 1029 void 1030 SetItemSensitivity(Widget mi, Bool val) 1031 { 1032 static Arg menuArgs = 1033 {XtNsensitive, (XtArgVal) 0}; 1034 1035 if (mi) { 1036 menuArgs.value = (XtArgVal) (val); 1037 XtSetValues(mi, &menuArgs, (Cardinal) 1); 1038 } 1039 } 1040 1041 /* 1042 * action routines 1043 */ 1044 1045 static void 1046 do_securekbd(Widget gw GCC_UNUSED, 1047 XtPointer closure GCC_UNUSED, 1048 XtPointer data GCC_UNUSED) 1049 { 1050 XtermWidget xw = term; 1051 TScreen *screen = TScreenOf(xw); 1052 Time now = CurrentTime; /* XXX - wrong */ 1053 1054 if (screen->grabbedKbd) { 1055 XUngrabKeyboard(screen->display, now); 1056 ReverseVideo(xw); 1057 screen->grabbedKbd = False; 1058 } else { 1059 if (XGrabKeyboard(screen->display, XtWindow(CURRENT_EMU()), 1060 True, GrabModeAsync, GrabModeAsync, now) 1061 != GrabSuccess) { 1062 Bell(xw, XkbBI_MinorError, 100); 1063 } else { 1064 ReverseVideo(xw); 1065 screen->grabbedKbd = True; 1066 } 1067 } 1068 update_securekbd(); 1069 } 1070 1071 /* ARGSUSED */ 1072 void 1073 HandleSecure(Widget w GCC_UNUSED, 1074 XEvent *event GCC_UNUSED, /* unused */ 1075 String *params GCC_UNUSED, /* [0] = volume */ 1076 Cardinal *param_count GCC_UNUSED) /* 0 or 1 */ 1077 { 1078 do_securekbd(vt_shell[mainMenu].w, (XtPointer) 0, (XtPointer) 0); 1079 } 1080 1081 static void 1082 do_allowsends(Widget gw GCC_UNUSED, 1083 XtPointer closure GCC_UNUSED, 1084 XtPointer data GCC_UNUSED) 1085 { 1086 TScreen *screen = TScreenOf(term); 1087 1088 ToggleFlag(screen->allowSendEvents); 1089 update_allowsends(); 1090 #if OPT_ALLOW_XXX_OPS 1091 enable_allow_xxx_ops(!(screen->allowSendEvents)); 1092 #endif 1093 } 1094 1095 static void 1096 do_visualbell(Widget gw GCC_UNUSED, 1097 XtPointer closure GCC_UNUSED, 1098 XtPointer data GCC_UNUSED) 1099 { 1100 TScreen *screen = TScreenOf(term); 1101 1102 ToggleFlag(screen->visualbell); 1103 update_visualbell(); 1104 } 1105 1106 static void 1107 do_bellIsUrgent(Widget gw GCC_UNUSED, 1108 XtPointer closure GCC_UNUSED, 1109 XtPointer data GCC_UNUSED) 1110 { 1111 TScreen *screen = TScreenOf(term); 1112 1113 ToggleFlag(screen->bellIsUrgent); 1114 update_bellIsUrgent(); 1115 } 1116 1117 static void 1118 do_poponbell(Widget gw GCC_UNUSED, 1119 XtPointer closure GCC_UNUSED, 1120 XtPointer data GCC_UNUSED) 1121 { 1122 TScreen *screen = TScreenOf(term); 1123 1124 ToggleFlag(screen->poponbell); 1125 update_poponbell(); 1126 } 1127 1128 #ifdef ALLOWLOGGING 1129 static void 1130 do_logging(Widget gw GCC_UNUSED, 1131 XtPointer closure GCC_UNUSED, 1132 XtPointer data GCC_UNUSED) 1133 { 1134 XtermWidget xw = term; 1135 TScreen *screen = TScreenOf(xw); 1136 1137 if (screen->logging) { 1138 CloseLog(xw); 1139 } else { 1140 StartLog(xw); 1141 } 1142 /* update_logging done by CloseLog and StartLog */ 1143 } 1144 #endif 1145 1146 #if OPT_PRINT_ON_EXIT 1147 static void 1148 do_write_now(Widget gw GCC_UNUSED, 1149 XtPointer closure GCC_UNUSED, 1150 XtPointer data GCC_UNUSED) 1151 { 1152 XtermWidget xw = term; 1153 1154 xtermPrintImmediately(xw, 1155 (IsEmpty(resource.printFileNow) 1156 ? (String) "XTerm" 1157 : resource.printFileNow), 1158 resource.printOptsNow, 1159 resource.printModeNow); 1160 } 1161 1162 void 1163 HandlePrintImmediate(Widget w GCC_UNUSED, 1164 XEvent *event GCC_UNUSED, 1165 String *params GCC_UNUSED, 1166 Cardinal *param_count GCC_UNUSED) 1167 { 1168 do_write_now((Widget) 0, (XtPointer) 0, (XtPointer) 0); 1169 } 1170 1171 static void 1172 do_write_error(Widget gw GCC_UNUSED, 1173 XtPointer closure GCC_UNUSED, 1174 XtPointer data GCC_UNUSED) 1175 { 1176 XtermWidget xw = term; 1177 1178 if (IsEmpty(resource.printFileOnXError)) { 1179 resource.printFileOnXError = "XTermError"; 1180 } 1181 TScreenOf(xw)->write_error = (Boolean) (!TScreenOf(xw)->write_error); 1182 update_write_error(); 1183 } 1184 1185 void 1186 HandlePrintOnError(Widget w GCC_UNUSED, 1187 XEvent *event GCC_UNUSED, 1188 String *params GCC_UNUSED, 1189 Cardinal *param_count GCC_UNUSED) 1190 { 1191 do_write_error((Widget) 0, (XtPointer) 0, (XtPointer) 0); 1192 } 1193 #endif 1194 1195 static void 1196 do_print(Widget gw GCC_UNUSED, 1197 XtPointer closure GCC_UNUSED, 1198 XtPointer data GCC_UNUSED) 1199 { 1200 xtermPrintScreen(term, True, getPrinterFlags(term, NULL, NULL)); 1201 } 1202 1203 static void 1204 do_print_redir(Widget gw GCC_UNUSED, 1205 XtPointer closure GCC_UNUSED, 1206 XtPointer data GCC_UNUSED) 1207 { 1208 setPrinterControlMode(term, 1209 (PrinterOf(TScreenOf(term)).printer_controlmode 1210 ? 0 1211 : 2)); 1212 } 1213 1214 #if OPT_SCREEN_DUMPS 1215 static void 1216 do_dump_html(Widget gw GCC_UNUSED, 1217 XtPointer closure GCC_UNUSED, 1218 XtPointer data GCC_UNUSED) 1219 { 1220 xtermDumpHtml(term); 1221 } 1222 1223 static void 1224 do_dump_svg(Widget gw GCC_UNUSED, 1225 XtPointer closure GCC_UNUSED, 1226 XtPointer data GCC_UNUSED) 1227 { 1228 xtermDumpSvg(term); 1229 } 1230 #endif 1231 1232 static void 1233 do_redraw(Widget gw GCC_UNUSED, 1234 XtPointer closure GCC_UNUSED, 1235 XtPointer data GCC_UNUSED) 1236 { 1237 Redraw(); 1238 } 1239 1240 void 1241 show_8bit_control(Bool value) 1242 { 1243 if (TScreenOf(term)->control_eight_bits != value) { 1244 TScreenOf(term)->control_eight_bits = (Boolean) value; 1245 update_8bit_control(); 1246 } 1247 } 1248 1249 static void 1250 do_8bit_control(Widget gw GCC_UNUSED, 1251 XtPointer closure GCC_UNUSED, 1252 XtPointer data GCC_UNUSED) 1253 { 1254 show_8bit_control(!TScreenOf(term)->control_eight_bits); 1255 } 1256 1257 static void 1258 do_backarrow(Widget gw GCC_UNUSED, 1259 XtPointer closure GCC_UNUSED, 1260 XtPointer data GCC_UNUSED) 1261 { 1262 term->keyboard.flags ^= MODE_DECBKM; 1263 update_decbkm(); 1264 } 1265 1266 #if OPT_NUM_LOCK 1267 static void 1268 do_num_lock(Widget gw GCC_UNUSED, 1269 XtPointer closure GCC_UNUSED, 1270 XtPointer data GCC_UNUSED) 1271 { 1272 ToggleFlag(term->misc.real_NumLock); 1273 update_num_lock(); 1274 } 1275 1276 static void 1277 do_alt_esc(Widget gw GCC_UNUSED, 1278 XtPointer closure GCC_UNUSED, 1279 XtPointer data GCC_UNUSED) 1280 { 1281 ToggleFlag(TScreenOf(term)->alt_sends_esc); 1282 update_alt_esc(); 1283 } 1284 1285 static void 1286 do_meta_esc(Widget gw GCC_UNUSED, 1287 XtPointer closure GCC_UNUSED, 1288 XtPointer data GCC_UNUSED) 1289 { 1290 ToggleFlag(TScreenOf(term)->meta_sends_esc); 1291 update_meta_esc(); 1292 } 1293 #endif 1294 1295 static void 1296 do_delete_del(Widget gw GCC_UNUSED, 1297 XtPointer closure GCC_UNUSED, 1298 XtPointer data GCC_UNUSED) 1299 { 1300 if (xtermDeleteIsDEL(term)) 1301 TScreenOf(term)->delete_is_del = False; 1302 else 1303 TScreenOf(term)->delete_is_del = True; 1304 update_delete_del(); 1305 } 1306 1307 static void 1308 do_old_fkeys(Widget gw GCC_UNUSED, 1309 XtPointer closure GCC_UNUSED, 1310 XtPointer data GCC_UNUSED) 1311 { 1312 toggle_keyboard_type(term, keyboardIsLegacy); 1313 } 1314 1315 #if OPT_HP_FUNC_KEYS 1316 static void 1317 do_hp_fkeys(Widget gw GCC_UNUSED, 1318 XtPointer closure GCC_UNUSED, 1319 XtPointer data GCC_UNUSED) 1320 { 1321 toggle_keyboard_type(term, keyboardIsHP); 1322 } 1323 #endif 1324 1325 #if OPT_SCO_FUNC_KEYS 1326 static void 1327 do_sco_fkeys(Widget gw GCC_UNUSED, 1328 XtPointer closure GCC_UNUSED, 1329 XtPointer data GCC_UNUSED) 1330 { 1331 toggle_keyboard_type(term, keyboardIsSCO); 1332 } 1333 #endif 1334 1335 #if OPT_SUN_FUNC_KEYS 1336 static void 1337 do_sun_fkeys(Widget gw GCC_UNUSED, 1338 XtPointer closure GCC_UNUSED, 1339 XtPointer data GCC_UNUSED) 1340 { 1341 toggle_keyboard_type(term, keyboardIsSun); 1342 } 1343 #endif 1344 1345 #if OPT_SUNPC_KBD 1346 /* 1347 * This really means "Sun/PC keyboard emulating VT220". 1348 */ 1349 static void 1350 do_sun_kbd(Widget gw GCC_UNUSED, 1351 XtPointer closure GCC_UNUSED, 1352 XtPointer data GCC_UNUSED) 1353 { 1354 toggle_keyboard_type(term, keyboardIsVT220); 1355 } 1356 #endif 1357 1358 #if OPT_TCAP_FKEYS 1359 static void 1360 do_tcap_fkeys(Widget gw GCC_UNUSED, 1361 XtPointer closure GCC_UNUSED, 1362 XtPointer data GCC_UNUSED) 1363 { 1364 toggle_keyboard_type(term, keyboardIsTermcap); 1365 } 1366 #endif 1367 1368 /* 1369 * The following cases use the pid instead of the process group so that we 1370 * don't get hosed by programs that change their process group 1371 */ 1372 1373 /* ARGSUSED */ 1374 static void 1375 do_suspend(Widget gw, 1376 XtPointer closure GCC_UNUSED, 1377 XtPointer data GCC_UNUSED) 1378 { 1379 #if defined(SIGTSTP) 1380 handle_send_signal(gw, SIGTSTP); 1381 #endif 1382 } 1383 1384 /* ARGSUSED */ 1385 static void 1386 do_continue(Widget gw, 1387 XtPointer closure GCC_UNUSED, 1388 XtPointer data GCC_UNUSED) 1389 { 1390 #if defined(SIGCONT) 1391 handle_send_signal(gw, SIGCONT); 1392 #endif 1393 } 1394 1395 /* ARGSUSED */ 1396 static void 1397 do_interrupt(Widget gw, 1398 XtPointer closure GCC_UNUSED, 1399 XtPointer data GCC_UNUSED) 1400 { 1401 handle_send_signal(gw, SIGINT); 1402 } 1403 1404 /* ARGSUSED */ 1405 void 1406 do_hangup(Widget gw, 1407 XtPointer closure GCC_UNUSED, 1408 XtPointer data GCC_UNUSED) 1409 { 1410 handle_send_signal(gw, SIGHUP); 1411 } 1412 1413 /* ARGSUSED */ 1414 static void 1415 do_terminate(Widget gw, 1416 XtPointer closure GCC_UNUSED, 1417 XtPointer data GCC_UNUSED) 1418 { 1419 handle_send_signal(gw, SIGTERM); 1420 } 1421 1422 /* ARGSUSED */ 1423 static void 1424 do_kill(Widget gw, 1425 XtPointer closure GCC_UNUSED, 1426 XtPointer data GCC_UNUSED) 1427 { 1428 handle_send_signal(gw, SIGKILL); 1429 } 1430 1431 static void 1432 do_quit(Widget gw GCC_UNUSED, 1433 XtPointer closure GCC_UNUSED, 1434 XtPointer data GCC_UNUSED) 1435 { 1436 Cleanup(ERROR_MISC); 1437 } 1438 1439 /* 1440 * vt menu callbacks 1441 */ 1442 1443 static void 1444 do_scrollbar(Widget gw GCC_UNUSED, 1445 XtPointer closure GCC_UNUSED, 1446 XtPointer data GCC_UNUSED) 1447 { 1448 ToggleScrollBar(term); 1449 } 1450 1451 static void 1452 do_jumpscroll(Widget gw GCC_UNUSED, 1453 XtPointer closure GCC_UNUSED, 1454 XtPointer data GCC_UNUSED) 1455 { 1456 TScreen *screen = TScreenOf(term); 1457 1458 term->flags ^= SMOOTHSCROLL; 1459 if (term->flags & SMOOTHSCROLL) { 1460 screen->jumpscroll = False; 1461 if (screen->scroll_amt) 1462 FlushScroll(term); 1463 } else { 1464 screen->jumpscroll = True; 1465 } 1466 update_jumpscroll(); 1467 } 1468 1469 static void 1470 do_reversevideo(Widget gw GCC_UNUSED, 1471 XtPointer closure GCC_UNUSED, 1472 XtPointer data GCC_UNUSED) 1473 { 1474 ReverseVideo(term); 1475 } 1476 1477 static void 1478 do_autowrap(Widget gw GCC_UNUSED, 1479 XtPointer closure GCC_UNUSED, 1480 XtPointer data GCC_UNUSED) 1481 { 1482 term->flags ^= WRAPAROUND; 1483 update_autowrap(); 1484 } 1485 1486 static void 1487 do_reversewrap(Widget gw GCC_UNUSED, 1488 XtPointer closure GCC_UNUSED, 1489 XtPointer data GCC_UNUSED) 1490 { 1491 term->flags ^= REVERSEWRAP; 1492 update_reversewrap(); 1493 } 1494 1495 static void 1496 do_autolinefeed(Widget gw GCC_UNUSED, 1497 XtPointer closure GCC_UNUSED, 1498 XtPointer data GCC_UNUSED) 1499 { 1500 term->flags ^= LINEFEED; 1501 update_autolinefeed(); 1502 } 1503 1504 static void 1505 do_appcursor(Widget gw GCC_UNUSED, 1506 XtPointer closure GCC_UNUSED, 1507 XtPointer data GCC_UNUSED) 1508 { 1509 term->keyboard.flags ^= MODE_DECCKM; 1510 update_appcursor(); 1511 } 1512 1513 static void 1514 do_appkeypad(Widget gw GCC_UNUSED, 1515 XtPointer closure GCC_UNUSED, 1516 XtPointer data GCC_UNUSED) 1517 { 1518 term->keyboard.flags ^= MODE_DECKPAM; 1519 update_appkeypad(); 1520 } 1521 1522 static void 1523 do_scrollkey(Widget gw GCC_UNUSED, 1524 XtPointer closure GCC_UNUSED, 1525 XtPointer data GCC_UNUSED) 1526 { 1527 TScreen *screen = TScreenOf(term); 1528 1529 ToggleFlag(screen->scrollkey); 1530 update_scrollkey(); 1531 } 1532 1533 static void 1534 do_scrollttyoutput(Widget gw GCC_UNUSED, 1535 XtPointer closure GCC_UNUSED, 1536 XtPointer data GCC_UNUSED) 1537 { 1538 TScreen *screen = TScreenOf(term); 1539 1540 ToggleFlag(screen->scrollttyoutput); 1541 update_scrollttyoutput(); 1542 } 1543 1544 #if OPT_MENU_KEEPCLIPBOARD 1545 void 1546 update_keepClipboard(void) 1547 { 1548 UpdateCheckbox("update_keepClipboard", 1549 vtMenuEntries, 1550 vtMenu_keepClipboard, 1551 TScreenOf(term)->keepClipboard); 1552 } 1553 #endif 1554 1555 static void 1556 do_keepClipboard(Widget gw GCC_UNUSED, 1557 XtPointer closure GCC_UNUSED, 1558 XtPointer data GCC_UNUSED) 1559 { 1560 TScreen *screen = TScreenOf(term); 1561 1562 ToggleFlag(screen->keepClipboard); 1563 update_keepClipboard(); 1564 } 1565 1566 static void 1567 do_keepSelection(Widget gw GCC_UNUSED, 1568 XtPointer closure GCC_UNUSED, 1569 XtPointer data GCC_UNUSED) 1570 { 1571 TScreen *screen = TScreenOf(term); 1572 1573 ToggleFlag(screen->keepSelection); 1574 update_keepSelection(); 1575 } 1576 1577 static void 1578 do_selectClipboard(Widget gw GCC_UNUSED, 1579 XtPointer closure GCC_UNUSED, 1580 XtPointer data GCC_UNUSED) 1581 { 1582 TScreen *screen = TScreenOf(term); 1583 1584 ToggleFlag(screen->selectToClipboard); 1585 update_selectToClipboard(); 1586 } 1587 1588 static void 1589 do_allow132(Widget gw GCC_UNUSED, 1590 XtPointer closure GCC_UNUSED, 1591 XtPointer data GCC_UNUSED) 1592 { 1593 TScreen *screen = TScreenOf(term); 1594 1595 ToggleFlag(screen->c132); 1596 update_allow132(); 1597 } 1598 1599 static void 1600 do_cursesemul(Widget gw GCC_UNUSED, 1601 XtPointer closure GCC_UNUSED, 1602 XtPointer data GCC_UNUSED) 1603 { 1604 TScreen *screen = TScreenOf(term); 1605 1606 ToggleFlag(screen->curses); 1607 update_cursesemul(); 1608 } 1609 1610 static void 1611 do_marginbell(Widget gw GCC_UNUSED, 1612 XtPointer closure GCC_UNUSED, 1613 XtPointer data GCC_UNUSED) 1614 { 1615 TScreen *screen = TScreenOf(term); 1616 1617 if ((ToggleFlag(screen->marginbell)) == 0) 1618 screen->bellArmed = -1; 1619 update_marginbell(); 1620 } 1621 1622 #if OPT_TEK4014 1623 static void 1624 handle_tekshow(Widget gw GCC_UNUSED, Bool allowswitch) 1625 { 1626 XtermWidget xw = term; 1627 TScreen *screen = TScreenOf(xw); 1628 1629 TRACE(("Show tek-window\n")); 1630 if (!TEK4014_SHOWN(xw)) { /* not showing, turn on */ 1631 set_tek_visibility(True); 1632 } else if (screen->Vshow || allowswitch) { /* is showing, turn off */ 1633 set_tek_visibility(False); 1634 end_tek_mode(); /* WARNING: this does a longjmp */ 1635 } else 1636 Bell(xw, XkbBI_MinorError, 0); 1637 } 1638 1639 /* ARGSUSED */ 1640 static void 1641 do_tekshow(Widget gw, 1642 XtPointer closure GCC_UNUSED, 1643 XtPointer data GCC_UNUSED) 1644 { 1645 handle_tekshow(gw, True); 1646 } 1647 1648 /* ARGSUSED */ 1649 static void 1650 do_tekonoff(Widget gw, 1651 XtPointer closure GCC_UNUSED, 1652 XtPointer data GCC_UNUSED) 1653 { 1654 handle_tekshow(gw, False); 1655 } 1656 #endif /* OPT_TEK4014 */ 1657 1658 #if OPT_BLINK_CURS 1659 /* ARGSUSED */ 1660 static void 1661 do_cursorblink(Widget gw GCC_UNUSED, 1662 XtPointer closure GCC_UNUSED, 1663 XtPointer data GCC_UNUSED) 1664 { 1665 ToggleCursorBlink(term); 1666 } 1667 #endif 1668 1669 /* ARGSUSED */ 1670 static void 1671 do_altscreen(Widget gw GCC_UNUSED, 1672 XtPointer closure GCC_UNUSED, 1673 XtPointer data GCC_UNUSED) 1674 { 1675 ToggleAlternate(term); 1676 } 1677 1678 /* ARGSUSED */ 1679 static void 1680 do_titeInhibit(Widget gw GCC_UNUSED, 1681 XtPointer closure GCC_UNUSED, 1682 XtPointer data GCC_UNUSED) 1683 { 1684 ToggleFlag(term->misc.titeInhibit); 1685 update_titeInhibit(); 1686 } 1687 1688 #ifndef NO_ACTIVE_ICON 1689 /* ARGSUSED */ 1690 static void 1691 do_activeicon(Widget gw GCC_UNUSED, 1692 XtPointer closure GCC_UNUSED, 1693 XtPointer data GCC_UNUSED) 1694 { 1695 TScreen *screen = TScreenOf(term); 1696 1697 if (screen->iconVwin.window) { 1698 Widget shell = XtParent(term); 1699 ToggleFlag(term->work.active_icon); 1700 XtVaSetValues(shell, XtNiconWindow, 1701 term->work.active_icon ? screen->iconVwin.window : None, 1702 (XtPointer) 0); 1703 update_activeicon(); 1704 } 1705 } 1706 #endif /* NO_ACTIVE_ICON */ 1707 1708 static void 1709 do_softreset(Widget gw GCC_UNUSED, 1710 XtPointer closure GCC_UNUSED, 1711 XtPointer data GCC_UNUSED) 1712 { 1713 VTReset(term, False, False); 1714 } 1715 1716 static void 1717 do_hardreset(Widget gw GCC_UNUSED, 1718 XtPointer closure GCC_UNUSED, 1719 XtPointer data GCC_UNUSED) 1720 { 1721 VTReset(term, True, False); 1722 } 1723 1724 static void 1725 do_clearsavedlines(Widget gw GCC_UNUSED, 1726 XtPointer closure GCC_UNUSED, 1727 XtPointer data GCC_UNUSED) 1728 { 1729 VTReset(term, True, True); 1730 } 1731 1732 #if OPT_TEK4014 1733 static void 1734 do_tekmode(Widget gw GCC_UNUSED, 1735 XtPointer closure GCC_UNUSED, 1736 XtPointer data GCC_UNUSED) 1737 { 1738 switch_modes(TEK4014_ACTIVE(term)); /* switch to tek mode */ 1739 } 1740 1741 /* ARGSUSED */ 1742 static void 1743 do_vthide(Widget gw GCC_UNUSED, 1744 XtPointer closure GCC_UNUSED, 1745 XtPointer data GCC_UNUSED) 1746 { 1747 hide_vt_window(); 1748 } 1749 #endif /* OPT_TEK4014 */ 1750 1751 /* 1752 * vtfont menu 1753 */ 1754 1755 static void 1756 do_vtfont(Widget gw GCC_UNUSED, 1757 XtPointer closure, 1758 XtPointer data GCC_UNUSED) 1759 { 1760 XtermWidget xw = term; 1761 char *entryname = (char *) closure; 1762 int i; 1763 1764 TRACE(("do_vtfont(%s)\n", entryname)); 1765 for (i = 0; i < NMENUFONTS; i++) { 1766 if (strcmp(entryname, fontMenuEntries[i].name) == 0) { 1767 SetVTFont(xw, i, True, NULL); 1768 return; 1769 } 1770 } 1771 Bell(xw, XkbBI_MinorError, 0); 1772 } 1773 1774 #if OPT_DEC_CHRSET 1775 static void 1776 do_font_doublesize(Widget gw GCC_UNUSED, 1777 XtPointer closure GCC_UNUSED, 1778 XtPointer data GCC_UNUSED) 1779 { 1780 XtermWidget xw = term; 1781 1782 if (TScreenOf(xw)->cache_doublesize != 0) 1783 ToggleFlag(TScreenOf(xw)->font_doublesize); 1784 update_font_doublesize(); 1785 Redraw(); 1786 } 1787 #endif 1788 1789 #if OPT_BOX_CHARS 1790 static void 1791 do_font_boxchars(Widget gw GCC_UNUSED, 1792 XtPointer closure GCC_UNUSED, 1793 XtPointer data GCC_UNUSED) 1794 { 1795 ToggleFlag(TScreenOf(term)->force_box_chars); 1796 update_font_boxchars(); 1797 Redraw(); 1798 } 1799 1800 static void 1801 do_font_packed(Widget gw GCC_UNUSED, 1802 XtPointer closure GCC_UNUSED, 1803 XtPointer data GCC_UNUSED) 1804 { 1805 ToggleFlag(TScreenOf(term)->force_packed); 1806 update_font_packed(); 1807 SetVTFont(term, TScreenOf(term)->menu_font_number, True, NULL); 1808 } 1809 #endif 1810 1811 #if OPT_DEC_SOFTFONT 1812 static void 1813 do_font_loadable(Widget gw GCC_UNUSED, 1814 XtPointer closure GCC_UNUSED, 1815 XtPointer data GCC_UNUSED) 1816 { 1817 ToggleFlag(term->misc.font_loadable); 1818 update_font_loadable(); 1819 } 1820 #endif 1821 1822 #if OPT_RENDERFONT 1823 static void 1824 do_font_renderfont(Widget gw GCC_UNUSED, 1825 XtPointer closure GCC_UNUSED, 1826 XtPointer data GCC_UNUSED) 1827 { 1828 XtermWidget xw = (XtermWidget) term; 1829 TScreen *screen = TScreenOf(xw); 1830 int fontnum = screen->menu_font_number; 1831 String name = TScreenOf(xw)->MenuFontName(fontnum); 1832 1833 DefaultRenderFont(xw); 1834 ToggleFlag(xw->work.render_font); 1835 update_font_renderfont(); 1836 xtermLoadFont(xw, xtermFontName(name), True, fontnum); 1837 ScrnRefresh(term, 0, 0, 1838 MaxRows(screen), 1839 MaxCols(screen), True); 1840 } 1841 #endif 1842 1843 #if OPT_WIDE_CHARS 1844 static void 1845 setup_wide_fonts(XtermWidget xw) 1846 { 1847 TScreen *screen = TScreenOf(xw); 1848 1849 if (screen->wide_chars) { 1850 if (xtermLoadWideFonts(xw, True)) { 1851 SetVTFont(xw, screen->menu_font_number, True, NULL); 1852 } 1853 } else { 1854 ChangeToWide(xw); 1855 } 1856 } 1857 1858 static void 1859 setup_narrow_fonts(XtermWidget xw) 1860 { 1861 TScreen *screen = TScreenOf(xw); 1862 1863 if (xtermLoadDefaultFonts(xw)) { 1864 SetVTFont(xw, screen->menu_font_number, True, NULL); 1865 } 1866 } 1867 1868 static void 1869 do_font_utf8_mode(Widget gw GCC_UNUSED, 1870 XtPointer closure GCC_UNUSED, 1871 XtPointer data GCC_UNUSED) 1872 { 1873 XtermWidget xw = term; 1874 TScreen *screen = TScreenOf(xw); 1875 1876 /* 1877 * If xterm was started with -wc option, it might not have the wide fonts. 1878 * If xterm was not started with -wc, it might not have wide cells. 1879 */ 1880 if (!screen->utf8_mode) { 1881 setup_wide_fonts(xw); 1882 } 1883 switchPtyData(screen, !screen->utf8_mode); 1884 /* 1885 * We don't repaint the screen when switching UTF-8 on/off. When switching 1886 * on - the Latin-1 codes should paint as-is. When switching off, that's 1887 * hard to do properly. 1888 */ 1889 } 1890 1891 static void 1892 do_font_utf8_fonts(Widget gw GCC_UNUSED, 1893 XtPointer closure GCC_UNUSED, 1894 XtPointer data GCC_UNUSED) 1895 { 1896 XtermWidget xw = term; 1897 TScreen *screen = TScreenOf(xw); 1898 1899 ToggleFlag(screen->utf8_fonts); 1900 update_font_utf8_fonts(); 1901 1902 if (screen->utf8_fonts) { 1903 setup_wide_fonts(xw); 1904 } else { 1905 setup_narrow_fonts(xw); 1906 } 1907 } 1908 1909 static void 1910 do_font_utf8_title(Widget gw GCC_UNUSED, 1911 XtPointer closure GCC_UNUSED, 1912 XtPointer data GCC_UNUSED) 1913 { 1914 TScreen *screen = TScreenOf(term); 1915 1916 ToggleFlag(screen->utf8_title); 1917 update_font_utf8_title(); 1918 } 1919 #endif 1920 1921 /* 1922 * tek menu 1923 */ 1924 1925 #if OPT_TEK4014 1926 static void 1927 do_tektextlarge(Widget gw, 1928 XtPointer closure GCC_UNUSED, 1929 XtPointer data GCC_UNUSED) 1930 { 1931 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextlarge); 1932 } 1933 1934 static void 1935 do_tektext2(Widget gw, 1936 XtPointer closure GCC_UNUSED, 1937 XtPointer data GCC_UNUSED) 1938 { 1939 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext2); 1940 } 1941 1942 static void 1943 do_tektext3(Widget gw, 1944 XtPointer closure GCC_UNUSED, 1945 XtPointer data GCC_UNUSED) 1946 { 1947 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext3); 1948 } 1949 1950 static void 1951 do_tektextsmall(Widget gw, 1952 XtPointer closure GCC_UNUSED, 1953 XtPointer data GCC_UNUSED) 1954 { 1955 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextsmall); 1956 } 1957 1958 static void 1959 do_tekpage(Widget gw, 1960 XtPointer closure GCC_UNUSED, 1961 XtPointer data GCC_UNUSED) 1962 { 1963 TekSimulatePageButton(getTekWidget(gw), False); 1964 } 1965 1966 static void 1967 do_tekreset(Widget gw, 1968 XtPointer closure GCC_UNUSED, 1969 XtPointer data GCC_UNUSED) 1970 { 1971 TekSimulatePageButton(getTekWidget(gw), True); 1972 } 1973 1974 static void 1975 do_tekcopy(Widget gw, 1976 XtPointer closure GCC_UNUSED, 1977 XtPointer data GCC_UNUSED) 1978 { 1979 TekCopy(getTekWidget(gw)); 1980 } 1981 1982 static void 1983 handle_vtshow(Widget gw GCC_UNUSED, Bool allowswitch) 1984 { 1985 XtermWidget xw = term; 1986 TScreen *screen = TScreenOf(xw); 1987 1988 TRACE(("Show vt-window\n")); 1989 if (!screen->Vshow) { /* not showing, turn on */ 1990 set_vt_visibility(True); 1991 } else if (TEK4014_SHOWN(xw) || allowswitch) { /* is showing, turn off */ 1992 set_vt_visibility(False); 1993 if (!TEK4014_ACTIVE(xw) && tekRefreshList) 1994 TekRefresh(tekWidget); 1995 end_vt_mode(); /* WARNING: this does a longjmp... */ 1996 } else 1997 Bell(xw, XkbBI_MinorError, 0); 1998 } 1999 2000 static void 2001 do_vtshow(Widget gw, 2002 XtPointer closure GCC_UNUSED, 2003 XtPointer data GCC_UNUSED) 2004 { 2005 handle_vtshow(gw, True); 2006 } 2007 2008 static void 2009 do_vtonoff(Widget gw, 2010 XtPointer closure GCC_UNUSED, 2011 XtPointer data GCC_UNUSED) 2012 { 2013 handle_vtshow(gw, False); 2014 } 2015 2016 static void 2017 do_vtmode(Widget gw GCC_UNUSED, 2018 XtPointer closure GCC_UNUSED, 2019 XtPointer data GCC_UNUSED) 2020 { 2021 switch_modes(TEK4014_ACTIVE(term)); /* switch to vt, or from */ 2022 } 2023 2024 /* ARGSUSED */ 2025 static void 2026 do_tekhide(Widget gw GCC_UNUSED, 2027 XtPointer closure GCC_UNUSED, 2028 XtPointer data GCC_UNUSED) 2029 { 2030 hide_tek_window(); 2031 } 2032 #endif /* OPT_TEK4014 */ 2033 2034 /* 2035 * public handler routines 2036 */ 2037 int 2038 decodeToggle(XtermWidget xw, String *params, Cardinal nparams) 2039 { 2040 int dir = toggleErr; 2041 2042 switch (nparams) { 2043 case 0: 2044 dir = toggleAll; 2045 break; 2046 case 1: 2047 if (XmuCompareISOLatin1(params[0], "on") == 0) 2048 dir = toggleOn; 2049 else if (XmuCompareISOLatin1(params[0], "off") == 0) 2050 dir = toggleOff; 2051 else if (XmuCompareISOLatin1(params[0], "toggle") == 0) 2052 dir = toggleAll; 2053 break; 2054 } 2055 2056 if (dir == toggleErr) { 2057 Bell(xw, XkbBI_MinorError, 0); 2058 } 2059 2060 return dir; 2061 } 2062 2063 static void 2064 handle_toggle(void (*proc) PROTO_XT_CALLBACK_ARGS, 2065 int var, 2066 String *params, 2067 Cardinal nparams, 2068 Widget w, 2069 XtPointer closure, 2070 XtPointer data) 2071 { 2072 XtermWidget xw = term; 2073 2074 switch (decodeToggle(xw, params, nparams)) { 2075 2076 case toggleAll: 2077 (*proc) (w, closure, data); 2078 break; 2079 2080 case toggleOff: 2081 if (var) 2082 (*proc) (w, closure, data); 2083 else 2084 Bell(xw, XkbBI_MinorError, 0); 2085 break; 2086 2087 case toggleOn: 2088 if (!var) 2089 (*proc) (w, closure, data); 2090 else 2091 Bell(xw, XkbBI_MinorError, 0); 2092 break; 2093 } 2094 return; 2095 } 2096 2097 #define handle_vt_toggle(proc, var, params, nparams, w) \ 2098 handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) 2099 2100 #define HANDLE_VT_TOGGLE(name) \ 2101 handle_vt_toggle(do_##name, TScreenOf(term)->name, params, *param_count, w) 2102 2103 #define handle_tek_toggle(proc, var, params, nparams, w) \ 2104 handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) 2105 2106 void 2107 HandleAllowSends(Widget w, 2108 XEvent *event GCC_UNUSED, 2109 String *params, 2110 Cardinal *param_count) 2111 { 2112 handle_vt_toggle(do_allowsends, TScreenOf(term)->allowSendEvents, 2113 params, *param_count, w); 2114 } 2115 2116 void 2117 HandleSetVisualBell(Widget w, 2118 XEvent *event GCC_UNUSED, 2119 String *params, 2120 Cardinal *param_count) 2121 { 2122 HANDLE_VT_TOGGLE(visualbell); 2123 } 2124 2125 void 2126 HandleSetPopOnBell(Widget w, 2127 XEvent *event GCC_UNUSED, 2128 String *params, 2129 Cardinal *param_count) 2130 { 2131 HANDLE_VT_TOGGLE(poponbell); 2132 } 2133 2134 #ifdef ALLOWLOGGING 2135 void 2136 HandleLogging(Widget w, 2137 XEvent *event GCC_UNUSED, 2138 String *params, 2139 Cardinal *param_count) 2140 { 2141 HANDLE_VT_TOGGLE(logging); 2142 } 2143 #endif 2144 2145 #if OPT_PRINT_ON_EXIT 2146 void 2147 HandleWriteNow(Widget w, 2148 XEvent *event GCC_UNUSED, 2149 String *params GCC_UNUSED, 2150 Cardinal *param_count GCC_UNUSED) 2151 { 2152 do_write_now(w, NULL, NULL); 2153 } 2154 2155 void 2156 HandleWriteError(Widget w, 2157 XEvent *event GCC_UNUSED, 2158 String *params, 2159 Cardinal *param_count) 2160 { 2161 HANDLE_VT_TOGGLE(write_error); 2162 } 2163 #endif 2164 2165 /* ARGSUSED */ 2166 void 2167 HandlePrintScreen(Widget w GCC_UNUSED, 2168 XEvent *event GCC_UNUSED, 2169 String *params, 2170 Cardinal *param_count) 2171 { 2172 xtermPrintScreen(term, True, getPrinterFlags(term, params, param_count)); 2173 } 2174 2175 /* ARGSUSED */ 2176 void 2177 HandlePrintEverything(Widget w GCC_UNUSED, 2178 XEvent *event GCC_UNUSED, 2179 String *params, 2180 Cardinal *param_count) 2181 { 2182 xtermPrintEverything(term, getPrinterFlags(term, params, param_count)); 2183 } 2184 2185 /* ARGSUSED */ 2186 void 2187 HandlePrintControlMode(Widget w, 2188 XEvent *event GCC_UNUSED, 2189 String *params GCC_UNUSED, 2190 Cardinal *param_count GCC_UNUSED) 2191 { 2192 do_print_redir(w, (XtPointer) 0, (XtPointer) 0); 2193 } 2194 2195 /* ARGSUSED */ 2196 void 2197 HandleRedraw(Widget w, 2198 XEvent *event GCC_UNUSED, 2199 String *params GCC_UNUSED, 2200 Cardinal *param_count GCC_UNUSED) 2201 { 2202 do_redraw(w, (XtPointer) 0, (XtPointer) 0); 2203 } 2204 2205 /* ARGSUSED */ 2206 void 2207 HandleSendSignal(Widget w, 2208 XEvent *event GCC_UNUSED, 2209 String *params, 2210 Cardinal *param_count) 2211 { 2212 /* *INDENT-OFF* */ 2213 static const struct sigtab { 2214 const char *name; 2215 int sig; 2216 } signals[] = { 2217 #ifdef SIGTSTP 2218 { "suspend", SIGTSTP }, 2219 { "tstp", SIGTSTP }, 2220 #endif 2221 #ifdef SIGCONT 2222 { "cont", SIGCONT }, 2223 #endif 2224 { "int", SIGINT }, 2225 { "hup", SIGHUP }, 2226 { "quit", SIGQUIT }, 2227 { "alrm", SIGALRM }, 2228 { "alarm", SIGALRM }, 2229 { "term", SIGTERM }, 2230 { "kill", SIGKILL }, 2231 { NULL, 0 }, 2232 }; 2233 /* *INDENT-ON* */ 2234 2235 if (*param_count == 1) { 2236 const struct sigtab *st; 2237 2238 for (st = signals; st->name; st++) { 2239 if (XmuCompareISOLatin1(st->name, params[0]) == 0) { 2240 handle_send_signal(w, st->sig); 2241 return; 2242 } 2243 } 2244 /* one could allow numeric values, but that would be a security hole */ 2245 } 2246 2247 Bell(term, XkbBI_MinorError, 0); 2248 } 2249 2250 /* ARGSUSED */ 2251 void 2252 HandleQuit(Widget w, 2253 XEvent *event GCC_UNUSED, 2254 String *params GCC_UNUSED, 2255 Cardinal *param_count GCC_UNUSED) 2256 { 2257 do_quit(w, (XtPointer) 0, (XtPointer) 0); 2258 } 2259 2260 void 2261 Handle8BitControl(Widget w, 2262 XEvent *event GCC_UNUSED, 2263 String *params, 2264 Cardinal *param_count) 2265 { 2266 handle_vt_toggle(do_8bit_control, TScreenOf(term)->control_eight_bits, 2267 params, *param_count, w); 2268 } 2269 2270 void 2271 HandleBackarrow(Widget w, 2272 XEvent *event GCC_UNUSED, 2273 String *params, 2274 Cardinal *param_count) 2275 { 2276 handle_vt_toggle(do_backarrow, term->keyboard.flags & MODE_DECBKM, 2277 params, *param_count, w); 2278 } 2279 2280 #if OPT_MAXIMIZE 2281 #if OPT_TEK4014 2282 #define WhichEWMH (TEK4014_ACTIVE(xw) != 0) 2283 #else 2284 #define WhichEWMH 0 2285 #endif 2286 static void 2287 do_fullscreen(Widget gw GCC_UNUSED, 2288 XtPointer closure GCC_UNUSED, 2289 XtPointer data GCC_UNUSED) 2290 { 2291 XtermWidget xw = term; 2292 2293 if (resource.fullscreen != esNever) 2294 FullScreen(xw, !xw->work.ewmh[WhichEWMH].mode); 2295 } 2296 2297 /* ARGSUSED */ 2298 void 2299 HandleFullscreen(Widget w, 2300 XEvent *event GCC_UNUSED, 2301 String *params, 2302 Cardinal *param_count) 2303 { 2304 XtermWidget xw = term; 2305 2306 if (resource.fullscreen != esNever) { 2307 handle_vt_toggle(do_fullscreen, xw->work.ewmh[WhichEWMH].mode, 2308 params, *param_count, w); 2309 } 2310 } 2311 2312 void 2313 update_fullscreen(void) 2314 { 2315 XtermWidget xw = term; 2316 2317 if (resource.fullscreen <= 1) { 2318 UpdateCheckbox("update_fullscreen", 2319 mainMenuEntries, 2320 mainMenu_fullscreen, 2321 xw->work.ewmh[WhichEWMH].mode); 2322 } else { 2323 SetItemSensitivity(mainMenuEntries[mainMenu_fullscreen].widget, 2324 False); 2325 } 2326 } 2327 2328 #endif /* OPT_MAXIMIZE */ 2329 2330 #if OPT_SIXEL_GRAPHICS 2331 static void 2332 do_sixelscrolling(Widget gw GCC_UNUSED, 2333 XtPointer closure GCC_UNUSED, 2334 XtPointer data GCC_UNUSED) 2335 { 2336 term->keyboard.flags ^= MODE_DECSDM; 2337 update_decsdm(); 2338 } 2339 2340 void 2341 update_decsdm(void) 2342 { 2343 UpdateCheckbox("update_decsdm", 2344 vtMenuEntries, 2345 vtMenu_sixelscrolling, 2346 (term->keyboard.flags & MODE_DECSDM) == 0); 2347 } 2348 2349 void 2350 HandleSixelScrolling(Widget w, 2351 XEvent *event GCC_UNUSED, 2352 String *params, 2353 Cardinal *param_count) 2354 { 2355 handle_vt_toggle(do_sixelscrolling, term->keyboard.flags & MODE_DECSDM, 2356 params, *param_count, w); 2357 } 2358 #endif 2359 2360 #if OPT_GRAPHICS 2361 static void 2362 do_privatecolorregisters(Widget gw GCC_UNUSED, 2363 XtPointer closure GCC_UNUSED, 2364 XtPointer data GCC_UNUSED) 2365 { 2366 TScreen *screen = TScreenOf(term); 2367 2368 ToggleFlag(screen->privatecolorregisters); 2369 update_privatecolorregisters(); 2370 } 2371 2372 void 2373 update_privatecolorregisters(void) 2374 { 2375 UpdateCheckbox("update_privatecolorregisters", 2376 vtMenuEntries, 2377 vtMenu_privatecolorregisters, 2378 TScreenOf(term)->privatecolorregisters); 2379 } 2380 2381 void 2382 HandleSetPrivateColorRegisters(Widget w, 2383 XEvent *event GCC_UNUSED, 2384 String *params, 2385 Cardinal *param_count) 2386 { 2387 HANDLE_VT_TOGGLE(privatecolorregisters); 2388 } 2389 #endif 2390 2391 #if OPT_SUN_FUNC_KEYS 2392 void 2393 HandleSunFunctionKeys(Widget w, 2394 XEvent *event GCC_UNUSED, 2395 String *params, 2396 Cardinal *param_count) 2397 { 2398 handle_vt_toggle(do_sun_fkeys, term->keyboard.type == keyboardIsSun, 2399 params, *param_count, w); 2400 } 2401 #endif 2402 2403 #if OPT_NUM_LOCK 2404 void 2405 HandleNumLock(Widget w, 2406 XEvent *event GCC_UNUSED, 2407 String *params, 2408 Cardinal *param_count) 2409 { 2410 handle_vt_toggle(do_num_lock, term->misc.real_NumLock, 2411 params, *param_count, w); 2412 } 2413 2414 void 2415 HandleAltEsc(Widget w, 2416 XEvent *event GCC_UNUSED, 2417 String *params, 2418 Cardinal *param_count) 2419 { 2420 handle_vt_toggle(do_alt_esc, !TScreenOf(term)->alt_sends_esc, 2421 params, *param_count, w); 2422 } 2423 2424 void 2425 HandleMetaEsc(Widget w, 2426 XEvent *event GCC_UNUSED, 2427 String *params, 2428 Cardinal *param_count) 2429 { 2430 handle_vt_toggle(do_meta_esc, TScreenOf(term)->meta_sends_esc, 2431 params, *param_count, w); 2432 } 2433 #endif 2434 2435 void 2436 HandleDeleteIsDEL(Widget w, 2437 XEvent *event GCC_UNUSED, 2438 String *params, 2439 Cardinal *param_count) 2440 { 2441 handle_vt_toggle(do_delete_del, TScreenOf(term)->delete_is_del, 2442 params, *param_count, w); 2443 } 2444 2445 void 2446 HandleOldFunctionKeys(Widget w, 2447 XEvent *event GCC_UNUSED, 2448 String *params, 2449 Cardinal *param_count) 2450 { 2451 handle_vt_toggle(do_old_fkeys, term->keyboard.type == keyboardIsLegacy, 2452 params, *param_count, w); 2453 } 2454 2455 #if OPT_SUNPC_KBD 2456 void 2457 HandleSunKeyboard(Widget w, 2458 XEvent *event GCC_UNUSED, 2459 String *params, 2460 Cardinal *param_count) 2461 { 2462 handle_vt_toggle(do_sun_kbd, term->keyboard.type == keyboardIsVT220, 2463 params, *param_count, w); 2464 } 2465 #endif 2466 2467 #if OPT_HP_FUNC_KEYS 2468 void 2469 HandleHpFunctionKeys(Widget w, 2470 XEvent *event GCC_UNUSED, 2471 String *params, 2472 Cardinal *param_count) 2473 { 2474 handle_vt_toggle(do_hp_fkeys, term->keyboard.type == keyboardIsHP, 2475 params, *param_count, w); 2476 } 2477 #endif 2478 2479 #if OPT_SCO_FUNC_KEYS 2480 void 2481 HandleScoFunctionKeys(Widget w, 2482 XEvent *event GCC_UNUSED, 2483 String *params, 2484 Cardinal *param_count) 2485 { 2486 handle_vt_toggle(do_sco_fkeys, term->keyboard.type == keyboardIsSCO, 2487 params, *param_count, w); 2488 } 2489 #endif 2490 2491 void 2492 HandleScrollbar(Widget w, 2493 XEvent *event GCC_UNUSED, 2494 String *params, 2495 Cardinal *param_count) 2496 { 2497 XtermWidget xw = term; 2498 2499 if (IsIcon(TScreenOf(xw))) { 2500 Bell(xw, XkbBI_MinorError, 0); 2501 } else { 2502 handle_vt_toggle(do_scrollbar, TScreenOf(xw)->fullVwin.sb_info.width, 2503 params, *param_count, w); 2504 } 2505 } 2506 2507 void 2508 HandleJumpscroll(Widget w, 2509 XEvent *event GCC_UNUSED, 2510 String *params, 2511 Cardinal *param_count) 2512 { 2513 HANDLE_VT_TOGGLE(jumpscroll); 2514 } 2515 2516 void 2517 HandleKeepClipboard(Widget w, 2518 XEvent *event GCC_UNUSED, 2519 String *params, 2520 Cardinal *param_count) 2521 { 2522 HANDLE_VT_TOGGLE(keepClipboard); 2523 } 2524 2525 void 2526 HandleKeepSelection(Widget w, 2527 XEvent *event GCC_UNUSED, 2528 String *params, 2529 Cardinal *param_count) 2530 { 2531 HANDLE_VT_TOGGLE(keepSelection); 2532 } 2533 2534 void 2535 HandleSetSelect(Widget w, 2536 XEvent *event GCC_UNUSED, 2537 String *params, 2538 Cardinal *param_count) 2539 { 2540 handle_vt_toggle(do_selectClipboard, TScreenOf(term)->selectToClipboard, 2541 params, *param_count, w); 2542 } 2543 2544 void 2545 HandleReverseVideo(Widget w, 2546 XEvent *event GCC_UNUSED, 2547 String *params, 2548 Cardinal *param_count) 2549 { 2550 handle_vt_toggle(do_reversevideo, (term->misc.re_verse0), 2551 params, *param_count, w); 2552 } 2553 2554 void 2555 HandleAutoWrap(Widget w, 2556 XEvent *event GCC_UNUSED, 2557 String *params, 2558 Cardinal *param_count) 2559 { 2560 handle_vt_toggle(do_autowrap, (term->flags & WRAPAROUND), 2561 params, *param_count, w); 2562 } 2563 2564 void 2565 HandleReverseWrap(Widget w, 2566 XEvent *event GCC_UNUSED, 2567 String *params, 2568 Cardinal *param_count) 2569 { 2570 handle_vt_toggle(do_reversewrap, (term->flags & REVERSEWRAP), 2571 params, *param_count, w); 2572 } 2573 2574 void 2575 HandleAutoLineFeed(Widget w, 2576 XEvent *event GCC_UNUSED, 2577 String *params, 2578 Cardinal *param_count) 2579 { 2580 handle_vt_toggle(do_autolinefeed, (term->flags & LINEFEED), 2581 params, *param_count, w); 2582 } 2583 2584 void 2585 HandleAppCursor(Widget w, 2586 XEvent *event GCC_UNUSED, 2587 String *params, 2588 Cardinal *param_count) 2589 { 2590 handle_vt_toggle(do_appcursor, (term->keyboard.flags & MODE_DECCKM), 2591 params, *param_count, w); 2592 } 2593 2594 void 2595 HandleAppKeypad(Widget w, 2596 XEvent *event GCC_UNUSED, 2597 String *params, 2598 Cardinal *param_count) 2599 { 2600 handle_vt_toggle(do_appkeypad, (term->keyboard.flags & MODE_DECKPAM), 2601 params, *param_count, w); 2602 } 2603 2604 void 2605 HandleScrollKey(Widget w, 2606 XEvent *event GCC_UNUSED, 2607 String *params, 2608 Cardinal *param_count) 2609 { 2610 HANDLE_VT_TOGGLE(scrollkey); 2611 } 2612 2613 void 2614 HandleScrollTtyOutput(Widget w, 2615 XEvent *event GCC_UNUSED, 2616 String *params, 2617 Cardinal *param_count) 2618 { 2619 HANDLE_VT_TOGGLE(scrollttyoutput); 2620 } 2621 2622 void 2623 HandleAllow132(Widget w, 2624 XEvent *event GCC_UNUSED, 2625 String *params, 2626 Cardinal *param_count) 2627 { 2628 handle_vt_toggle(do_allow132, TScreenOf(term)->c132, 2629 params, *param_count, w); 2630 } 2631 2632 void 2633 HandleCursesEmul(Widget w, 2634 XEvent *event GCC_UNUSED, 2635 String *params, 2636 Cardinal *param_count) 2637 { 2638 handle_vt_toggle(do_cursesemul, TScreenOf(term)->curses, 2639 params, *param_count, w); 2640 } 2641 2642 void 2643 HandleBellIsUrgent(Widget w, 2644 XEvent *event GCC_UNUSED, 2645 String *params, 2646 Cardinal *param_count) 2647 { 2648 HANDLE_VT_TOGGLE(bellIsUrgent); 2649 } 2650 2651 void 2652 HandleMarginBell(Widget w, 2653 XEvent *event GCC_UNUSED, 2654 String *params, 2655 Cardinal *param_count) 2656 { 2657 HANDLE_VT_TOGGLE(marginbell); 2658 } 2659 2660 #if OPT_BLINK_CURS 2661 void 2662 HandleCursorBlink(Widget w, 2663 XEvent *event GCC_UNUSED, 2664 String *params, 2665 Cardinal *param_count) 2666 { 2667 handle_vt_toggle(do_cursorblink, TScreenOf(term)->cursor_blink, 2668 params, *param_count, w); 2669 } 2670 #endif 2671 2672 void 2673 HandleAltScreen(Widget w, 2674 XEvent *event GCC_UNUSED, 2675 String *params, 2676 Cardinal *param_count) 2677 { 2678 /* eventually want to see if sensitive or not */ 2679 handle_vt_toggle(do_altscreen, TScreenOf(term)->whichBuf, 2680 params, *param_count, w); 2681 } 2682 2683 void 2684 HandleTiteInhibit(Widget w, 2685 XEvent *event GCC_UNUSED, 2686 String *params, 2687 Cardinal *param_count) 2688 { 2689 /* eventually want to see if sensitive or not */ 2690 handle_vt_toggle(do_titeInhibit, !(term->misc.titeInhibit), 2691 params, *param_count, w); 2692 } 2693 2694 /* ARGSUSED */ 2695 void 2696 HandleSoftReset(Widget w, 2697 XEvent *event GCC_UNUSED, 2698 String *params GCC_UNUSED, 2699 Cardinal *param_count GCC_UNUSED) 2700 { 2701 do_softreset(w, (XtPointer) 0, (XtPointer) 0); 2702 } 2703 2704 /* ARGSUSED */ 2705 void 2706 HandleHardReset(Widget w, 2707 XEvent *event GCC_UNUSED, 2708 String *params GCC_UNUSED, 2709 Cardinal *param_count GCC_UNUSED) 2710 { 2711 do_hardreset(w, (XtPointer) 0, (XtPointer) 0); 2712 } 2713 2714 /* ARGSUSED */ 2715 void 2716 HandleClearSavedLines(Widget w, 2717 XEvent *event GCC_UNUSED, 2718 String *params GCC_UNUSED, 2719 Cardinal *param_count GCC_UNUSED) 2720 { 2721 do_clearsavedlines(w, (XtPointer) 0, (XtPointer) 0); 2722 } 2723 2724 void 2725 HandleAllowBoldFonts(Widget w, 2726 XEvent *event GCC_UNUSED, 2727 String *params, 2728 Cardinal *param_count) 2729 { 2730 HANDLE_VT_TOGGLE(allowBoldFonts); 2731 } 2732 2733 #if OPT_LOAD_VTFONTS 2734 void 2735 update_font_escape(void) 2736 { 2737 TScreen *screen = TScreenOf(term); 2738 2739 SetItemSensitivity(fontMenuEntries[fontMenu_fontescape].widget, 2740 ((screen->allowFontOps && 2741 screen->EscapeFontName()) 2742 ? True : False)); 2743 } 2744 #endif 2745 2746 #if OPT_DEC_CHRSET 2747 void 2748 HandleFontDoublesize(Widget w, 2749 XEvent *event GCC_UNUSED, 2750 String *params, 2751 Cardinal *param_count) 2752 { 2753 HANDLE_VT_TOGGLE(font_doublesize); 2754 } 2755 #endif 2756 2757 #if OPT_BOX_CHARS 2758 void 2759 HandleFontBoxChars(Widget w, 2760 XEvent *event GCC_UNUSED, 2761 String *params, 2762 Cardinal *param_count) 2763 { 2764 handle_vt_toggle(do_font_boxchars, TScreenOf(term)->force_box_chars, 2765 params, *param_count, w); 2766 } 2767 2768 void 2769 HandleFontPacked(Widget w, 2770 XEvent *event GCC_UNUSED, 2771 String *params, 2772 Cardinal *param_count) 2773 { 2774 handle_vt_toggle(do_font_packed, TScreenOf(term)->force_packed, 2775 params, *param_count, w); 2776 } 2777 #endif 2778 2779 #if OPT_DEC_SOFTFONT 2780 void 2781 HandleFontLoading(Widget w, 2782 XEvent *event GCC_UNUSED, 2783 String *params, 2784 Cardinal *param_count) 2785 { 2786 handle_vt_toggle(do_font_loadable, term->misc.font_loadable, 2787 params, *param_count, w); 2788 } 2789 #endif 2790 2791 #if OPT_RENDERFONT 2792 static void 2793 update_fontmenu(XtermWidget xw) 2794 { 2795 TScreen *screen = TScreenOf(xw); 2796 int n; 2797 2798 for (n = 0; n <= fontMenu_lastBuiltin; ++n) { 2799 Boolean active = (Boolean) (xw->work.render_font || 2800 (screen->menu_font_sizes[n] >= 0)); 2801 SetItemSensitivity(fontMenuEntries[n].widget, active); 2802 } 2803 } 2804 2805 void 2806 HandleRenderFont(Widget w, 2807 XEvent *event GCC_UNUSED, 2808 String *params, 2809 Cardinal *param_count) 2810 { 2811 XtermWidget xw = (XtermWidget) term; 2812 2813 DefaultRenderFont(xw); 2814 2815 handle_vt_toggle(do_font_renderfont, xw->work.render_font, 2816 params, *param_count, w); 2817 2818 update_fontmenu(xw); 2819 } 2820 #endif 2821 2822 #if OPT_WIDE_CHARS 2823 void 2824 HandleUTF8Mode(Widget w, 2825 XEvent *event GCC_UNUSED, 2826 String *params, 2827 Cardinal *param_count) 2828 { 2829 handle_vt_toggle(do_font_utf8_mode, TScreenOf(term)->utf8_mode, 2830 params, *param_count, w); 2831 } 2832 2833 void 2834 HandleUTF8Fonts(Widget w, 2835 XEvent *event GCC_UNUSED, 2836 String *params, 2837 Cardinal *param_count) 2838 { 2839 handle_vt_toggle(do_font_utf8_fonts, TScreenOf(term)->utf8_fonts, 2840 params, *param_count, w); 2841 } 2842 2843 void 2844 HandleUTF8Title(Widget w, 2845 XEvent *event GCC_UNUSED, 2846 String *params, 2847 Cardinal *param_count) 2848 { 2849 handle_vt_toggle(do_font_utf8_title, TScreenOf(term)->utf8_title, 2850 params, *param_count, w); 2851 } 2852 #endif 2853 2854 #if OPT_SCREEN_DUMPS 2855 void 2856 HandleDumpHtml(Widget w GCC_UNUSED, 2857 XEvent *event GCC_UNUSED, 2858 String *params GCC_UNUSED, 2859 Cardinal *param_count GCC_UNUSED) 2860 { 2861 xtermDumpHtml(term); 2862 } 2863 2864 void 2865 HandleDumpSvg(Widget w GCC_UNUSED, 2866 XEvent *event GCC_UNUSED, 2867 String *params GCC_UNUSED, 2868 Cardinal *param_count GCC_UNUSED) 2869 { 2870 xtermDumpSvg(term); 2871 } 2872 #endif 2873 2874 #if OPT_TEK4014 2875 void 2876 HandleSetTerminalType(Widget w, 2877 XEvent *event GCC_UNUSED, 2878 String *params, 2879 Cardinal *param_count) 2880 { 2881 XtermWidget xw = term; 2882 2883 if (*param_count == 1) { 2884 switch (params[0][0]) { 2885 case 'v': 2886 case 'V': 2887 if (TEK4014_ACTIVE(xw)) 2888 do_vtmode(w, (XtPointer) 0, (XtPointer) 0); 2889 break; 2890 case 't': 2891 case 'T': 2892 if (!TEK4014_ACTIVE(xw)) 2893 do_tekmode(w, (XtPointer) 0, (XtPointer) 0); 2894 break; 2895 default: 2896 Bell(xw, XkbBI_MinorError, 0); 2897 } 2898 } else { 2899 Bell(xw, XkbBI_MinorError, 0); 2900 } 2901 } 2902 2903 void 2904 HandleVisibility(Widget w, 2905 XEvent *event GCC_UNUSED, 2906 String *params, 2907 Cardinal *param_count) 2908 { 2909 XtermWidget xw = term; 2910 2911 if (*param_count == 2) { 2912 switch (params[0][0]) { 2913 case 'v': 2914 case 'V': 2915 handle_tek_toggle(do_vtonoff, (int) TScreenOf(xw)->Vshow, 2916 params + 1, (*param_count) - 1, w); 2917 break; 2918 case 't': 2919 case 'T': 2920 handle_tek_toggle(do_tekonoff, (int) TEK4014_SHOWN(xw), 2921 params + 1, (*param_count) - 1, w); 2922 break; 2923 default: 2924 Bell(xw, XkbBI_MinorError, 0); 2925 } 2926 } else { 2927 Bell(xw, XkbBI_MinorError, 0); 2928 } 2929 } 2930 2931 /* ARGSUSED */ 2932 void 2933 HandleSetTekText(Widget w, 2934 XEvent *event GCC_UNUSED, 2935 String *params, 2936 Cardinal *param_count) 2937 { 2938 XtermWidget xw = term; 2939 void (*proc) PROTO_XT_CALLBACK_ARGS = NULL; 2940 2941 switch (*param_count) { 2942 case 0: 2943 proc = do_tektextlarge; 2944 break; 2945 case 1: 2946 switch (TekGetFontSize(params[0])) { 2947 case TEK_FONT_LARGE: 2948 proc = do_tektextlarge; 2949 break; 2950 case TEK_FONT_2: 2951 proc = do_tektext2; 2952 break; 2953 case TEK_FONT_3: 2954 proc = do_tektext3; 2955 break; 2956 case TEK_FONT_SMALL: 2957 proc = do_tektextsmall; 2958 break; 2959 } 2960 break; 2961 } 2962 if (proc) 2963 (*proc) (w, (XtPointer) 0, (XtPointer) 0); 2964 else 2965 Bell(xw, XkbBI_MinorError, 0); 2966 } 2967 2968 /* ARGSUSED */ 2969 void 2970 HandleTekPage(Widget w, 2971 XEvent *event GCC_UNUSED, 2972 String *params GCC_UNUSED, 2973 Cardinal *param_count GCC_UNUSED) 2974 { 2975 do_tekpage(w, (XtPointer) 0, (XtPointer) 0); 2976 } 2977 2978 /* ARGSUSED */ 2979 void 2980 HandleTekReset(Widget w, 2981 XEvent *event GCC_UNUSED, 2982 String *params GCC_UNUSED, 2983 Cardinal *param_count GCC_UNUSED) 2984 { 2985 do_tekreset(w, (XtPointer) 0, (XtPointer) 0); 2986 } 2987 2988 /* ARGSUSED */ 2989 void 2990 HandleTekCopy(Widget w, 2991 XEvent *event GCC_UNUSED, 2992 String *params GCC_UNUSED, 2993 Cardinal *param_count GCC_UNUSED) 2994 { 2995 do_tekcopy(w, (XtPointer) 0, (XtPointer) 0); 2996 } 2997 #endif /* OPT_TEK4014 */ 2998 2999 #if OPT_TOOLBAR 3000 /* 3001 * The normal style of xterm popup menu delays initialization until the menu is 3002 * first requested. When using a toolbar, we can use the same initialization, 3003 * though on the first popup there will be a little geometry layout jitter, 3004 * since the menu is already managed when this callback is invoked. 3005 */ 3006 static void 3007 InitPopup(Widget gw, 3008 XtPointer closure, 3009 XtPointer data GCC_UNUSED) 3010 { 3011 String params[2]; 3012 Cardinal count = 1; 3013 3014 params[0] = (char *) closure; 3015 params[1] = NULL; 3016 TRACE(("InitPopup(%s)\n", params[0])); 3017 3018 domenu(gw, (XEvent *) 0, params, &count); 3019 3020 XtRemoveCallback(gw, XtNpopupCallback, InitPopup, closure); 3021 } 3022 3023 static Dimension 3024 SetupShell(Widget *menus, MenuList * shell, int n, int m) 3025 { 3026 char temp[80]; 3027 char *external_name = NULL; 3028 Dimension button_height; 3029 Dimension button_border; 3030 char *saveLocale = xtermSetLocale(LC_CTYPE, resource.menuLocale); 3031 3032 shell[n].w = XtVaCreatePopupShell(menu_names[n].internal_name, 3033 simpleMenuWidgetClass, 3034 *menus, 3035 XtNgeometry, NULL, 3036 (XtPointer) 0); 3037 TRACE(("created popupShel widget %p, window %#lx\n", 3038 (void *) shell[n].w, XtWindow(shell[n].w))); 3039 3040 XtAddCallback(shell[n].w, XtNpopupCallback, InitPopup, menu_names[n].internal_name); 3041 XtVaGetValues(shell[n].w, 3042 XtNlabel, &external_name, 3043 (XtPointer) 0); 3044 3045 TRACE(("...SetupShell(%s) -> %s -> %#lx\n", 3046 menu_names[n].internal_name, 3047 external_name, 3048 (long) shell[n].w)); 3049 3050 sprintf(temp, "%sButton", menu_names[n].internal_name); 3051 shell[n].b = XtVaCreateManagedWidget(temp, 3052 menuButtonWidgetClass, 3053 *menus, 3054 XtNfromHoriz, ((m >= 0) 3055 ? shell[m].b 3056 : NULL), 3057 XtNmenuName, menu_names[n].internal_name, 3058 XtNlabel, external_name, 3059 (XtPointer) 0); 3060 TRACE(("created menuButton[%d] widget %p, window %#lx\n", 3061 n, (void *) shell[n].b, XtWindow(shell[n].b))); 3062 XtVaGetValues(shell[n].b, 3063 XtNheight, &button_height, 3064 XtNborderWidth, &button_border, 3065 (XtPointer) 0); 3066 3067 xtermResetLocale(LC_CTYPE, saveLocale); 3068 return (Dimension) (button_height + (button_border * 2)); 3069 } 3070 #endif /* OPT_TOOLBAR */ 3071 3072 void 3073 SetupMenus(Widget shell, Widget *forms, Widget *menus, Dimension *menu_high) 3074 { 3075 #if OPT_TOOLBAR 3076 Dimension button_height = 0; 3077 Dimension toolbar_hSpace; 3078 Arg args[10]; 3079 #endif 3080 3081 TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014")); 3082 3083 *menu_high = 0; 3084 3085 if (shell == toplevel) { 3086 XawSimpleMenuAddGlobalActions(app_con); 3087 XtRegisterGrabAction(HandlePopupMenu, True, 3088 (unsigned) (ButtonPressMask | ButtonReleaseMask), 3089 GrabModeAsync, GrabModeAsync); 3090 } 3091 #if OPT_TOOLBAR 3092 *forms = XtVaCreateManagedWidget("form", 3093 formWidgetClass, shell, 3094 (XtPointer) 0); 3095 TRACE(("created form widget %p, window %#lx\n", 3096 (void *) *forms, XtWindow(*forms))); 3097 xtermAddInput(*forms); 3098 3099 /* 3100 * Set a nominal value for the preferred pane size, which lets the 3101 * buttons determine the actual height of the menu bar. We don't show 3102 * the grip, because it's too easy to make the toolbar look bad that 3103 * way. 3104 */ 3105 XtSetArg(args[0], XtNorientation, XtorientHorizontal); 3106 XtSetArg(args[1], XtNtop, XawChainTop); 3107 XtSetArg(args[2], XtNbottom, XawChainTop); 3108 XtSetArg(args[3], XtNleft, XawChainLeft); 3109 XtSetArg(args[4], XtNright, XawChainLeft); 3110 3111 if (resource.toolBar) { 3112 *menus = XtCreateManagedWidget("menubar", boxWidgetClass, *forms, 3113 args, 5); 3114 } else { 3115 *menus = XtCreateWidget("menubar", boxWidgetClass, *forms, args, 5); 3116 } 3117 TRACE(("created menubar widget %p, window %#lx\n", 3118 (void *) *menus, XtWindow(*menus))); 3119 3120 /* 3121 * The toolbar widget's height is not necessarily known yet. If the 3122 * toolbar is not created as a managed widget, we can still make a good 3123 * guess about its height by collecting the widget's other resource values. 3124 */ 3125 XtVaGetValues(*menus, 3126 XtNhSpace, &toolbar_hSpace, 3127 (XtPointer) 0); 3128 3129 if (shell == toplevel) { /* vt100 */ 3130 int j; 3131 for (j = mainMenu; j <= fontMenu; j++) { 3132 button_height = SetupShell(menus, vt_shell, j, j - 1); 3133 } 3134 } 3135 #if OPT_TEK4014 3136 else { /* tek4014 */ 3137 (void) SetupShell(menus, tek_shell, mainMenu, -1); 3138 button_height = SetupShell(menus, tek_shell, tekMenu, mainMenu); 3139 } 3140 #endif 3141 3142 /* 3143 * Tell the main program how high the toolbar is, to help with the initial 3144 * layout. 3145 */ 3146 *menu_high = (Dimension) (button_height + 2 * (toolbar_hSpace)); 3147 TRACE(("...menuHeight:%d = (%d + 2 * %d)\n", 3148 *menu_high, button_height, toolbar_hSpace)); 3149 3150 #else /* !OPT_TOOLBAR */ 3151 *forms = shell; 3152 *menus = shell; 3153 #endif 3154 3155 TRACE(("...shell=%#lx\n", (long) shell)); 3156 TRACE(("...forms=%#lx\n", (long) *forms)); 3157 TRACE(("...menus=%#lx\n", (long) *menus)); 3158 } 3159 3160 void 3161 repairSizeHints(void) 3162 { 3163 XtermWidget xw = term; 3164 TScreen *screen = TScreenOf(xw); 3165 3166 if (XtIsRealized((Widget) xw)) { 3167 getXtermSizeHints(xw); 3168 xtermSizeHints(xw, ScrollbarWidth(screen)); 3169 3170 XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints); 3171 } 3172 } 3173 3174 #if OPT_TOOLBAR 3175 #define INIT_POPUP(s, n) InitPopup(s[n].w, menu_names[n].internal_name, NULL) 3176 3177 static Bool 3178 InitWidgetMenu(Widget shell) 3179 { 3180 Bool result = False; 3181 3182 TRACE(("InitWidgetMenu(%p)\n", (void *) shell)); 3183 if (term != NULL) { 3184 if (shell == toplevel) { /* vt100 */ 3185 if (!term->init_menu) { 3186 INIT_POPUP(vt_shell, mainMenu); 3187 INIT_POPUP(vt_shell, vtMenu); 3188 INIT_POPUP(vt_shell, fontMenu); 3189 term->init_menu = True; 3190 TRACE(("...InitWidgetMenu(vt)\n")); 3191 } 3192 result = term->init_menu; 3193 } 3194 #if OPT_TEK4014 3195 else if (tekWidget) { /* tek4014 */ 3196 if (!tekWidget->init_menu) { 3197 INIT_POPUP(tek_shell, mainMenu); 3198 INIT_POPUP(tek_shell, tekMenu); 3199 tekWidget->init_menu = True; 3200 TRACE(("...InitWidgetMenu(tek)\n")); 3201 } 3202 result = tekWidget->init_menu; 3203 } 3204 #endif 3205 } 3206 TRACE(("...InitWidgetMenu ->%d\n", result)); 3207 return result; 3208 } 3209 3210 static TbInfo * 3211 toolbar_info(Widget w) 3212 { 3213 TRACE(("...getting toolbar_info\n")); 3214 #if OPT_TEK4014 3215 if (w != (Widget) term) 3216 return &(tekWidget->tek.tb_info); 3217 #else 3218 (void) w; 3219 #endif 3220 return &(WhichVWin(TScreenOf(term))->tb_info); 3221 } 3222 3223 static void 3224 hide_toolbar(Widget w) 3225 { 3226 if (w != NULL) { 3227 TbInfo *info = toolbar_info(w); 3228 3229 TRACE(("hiding toolbar\n")); 3230 XtVaSetValues(w, 3231 XtNfromVert, (Widget) 0, 3232 (XtPointer) 0); 3233 3234 if (info->menu_bar != NULL) { 3235 repairSizeHints(); 3236 XtUnmanageChild(info->menu_bar); 3237 if (XtIsRealized(info->menu_bar)) { 3238 XtUnmapWidget(info->menu_bar); 3239 } 3240 } 3241 TRACE(("...hiding toolbar (done)\n")); 3242 } 3243 } 3244 3245 static void 3246 show_toolbar(Widget w) 3247 { 3248 if (w != NULL) { 3249 TbInfo *info = toolbar_info(w); 3250 3251 TRACE(("showing toolbar\n")); 3252 if (info->menu_bar != NULL) { 3253 XtVaSetValues(w, 3254 XtNfromVert, info->menu_bar, 3255 (XtPointer) 0); 3256 if (XtIsRealized(info->menu_bar)) 3257 repairSizeHints(); 3258 XtManageChild(info->menu_bar); 3259 if (XtIsRealized(info->menu_bar)) { 3260 XtMapWidget(info->menu_bar); 3261 } 3262 } 3263 /* 3264 * This is needed to make the terminal widget move down below the 3265 * toolbar. 3266 */ 3267 XawFormDoLayout(XtParent(w), True); 3268 TRACE(("...showing toolbar (done)\n")); 3269 } 3270 } 3271 3272 /* 3273 * Make the toolbar visible or invisible in the current window(s). 3274 */ 3275 void 3276 ShowToolbar(Bool enable) 3277 { 3278 XtermWidget xw = term; 3279 3280 TRACE(("ShowToolbar(%d)\n", enable)); 3281 3282 if (IsIcon(TScreenOf(xw))) { 3283 Bell(xw, XkbBI_MinorError, 0); 3284 } else { 3285 if (enable) { 3286 if (InitWidgetMenu(toplevel)) 3287 show_toolbar((Widget) xw); 3288 #if OPT_TEK4014 3289 if (InitWidgetMenu(tekshellwidget)) 3290 show_toolbar((Widget) tekWidget); 3291 #endif 3292 } else { 3293 hide_toolbar((Widget) xw); 3294 #if OPT_TEK4014 3295 hide_toolbar((Widget) tekWidget); 3296 #endif 3297 } 3298 resource.toolBar = (Boolean) enable; 3299 update_toolbar(); 3300 } 3301 #if OPT_TOOLBAR 3302 /* 3303 * Layout for the toolbar confuses the Shell widget. Remind it that we 3304 * would like to be iconified if the corresponding resource was set. 3305 */ 3306 { 3307 static Bool first = True; 3308 if (first && XtIsRealized(toplevel)) { 3309 Boolean iconic = 0; 3310 3311 XtVaGetValues(toplevel, 3312 XtNiconic, &iconic, 3313 (XtPointer) 0); 3314 3315 if (iconic) { 3316 TRACE(("...please iconify window %#lx\n", XtWindow(toplevel))); 3317 xtermIconify(xw); 3318 } 3319 first = False; 3320 } 3321 } 3322 #endif 3323 } 3324 3325 void 3326 HandleToolbar(Widget w, 3327 XEvent *event GCC_UNUSED, 3328 String *params, 3329 Cardinal *param_count) 3330 { 3331 XtermWidget xw = term; 3332 3333 if (IsIcon(TScreenOf(xw))) { 3334 Bell(xw, XkbBI_MinorError, 0); 3335 } else { 3336 handle_vt_toggle(do_toolbar, resource.toolBar, 3337 params, *param_count, w); 3338 } 3339 } 3340 3341 /* ARGSUSED */ 3342 static void 3343 do_toolbar(Widget gw GCC_UNUSED, 3344 XtPointer closure GCC_UNUSED, 3345 XtPointer data GCC_UNUSED) 3346 { 3347 XtermWidget xw = term; 3348 3349 /* 3350 * Toggle toolbars for both vt100 and tek windows, since they share the 3351 * menu which contains the checkbox indicating whether the toolbar is 3352 * active. 3353 */ 3354 if (IsIcon(TScreenOf(xw))) { 3355 Bell(xw, XkbBI_MinorError, 0); 3356 } else { 3357 ShowToolbar(ToggleFlag(resource.toolBar)); 3358 } 3359 } 3360 3361 void 3362 update_toolbar(void) 3363 { 3364 UpdateCheckbox("update_toolbar", 3365 mainMenuEntries, 3366 mainMenu_toolbar, 3367 resource.toolBar); 3368 } 3369 #endif /* OPT_TOOLBAR */ 3370 3371 void 3372 update_securekbd(void) 3373 { 3374 UpdateCheckbox("update_securekbd", 3375 mainMenuEntries, 3376 mainMenu_securekbd, 3377 TScreenOf(term)->grabbedKbd); 3378 } 3379 3380 void 3381 update_allowsends(void) 3382 { 3383 UpdateCheckbox("update_allowsends", 3384 mainMenuEntries, 3385 mainMenu_allowsends, 3386 TScreenOf(term)->allowSendEvents); 3387 } 3388 3389 #ifdef ALLOWLOGGING 3390 void 3391 update_logging(void) 3392 { 3393 UpdateCheckbox("update_logging", 3394 mainMenuEntries, 3395 mainMenu_logging, 3396 TScreenOf(term)->logging); 3397 } 3398 #endif 3399 3400 #if OPT_PRINT_ON_EXIT 3401 void 3402 update_write_error(void) 3403 { 3404 UpdateCheckbox("update_write_error", 3405 mainMenuEntries, 3406 mainMenu_write_error, 3407 TScreenOf(term)->write_error); 3408 } 3409 #endif 3410 3411 void 3412 update_print_redir(void) 3413 { 3414 UpdateCheckbox("update_print_redir", 3415 mainMenuEntries, 3416 mainMenu_print_redir, 3417 PrinterOf(TScreenOf(term)).printer_controlmode); 3418 } 3419 3420 void 3421 update_8bit_control(void) 3422 { 3423 UpdateCheckbox("update_8bit_control", 3424 mainMenuEntries, 3425 mainMenu_8bit_ctrl, 3426 TScreenOf(term)->control_eight_bits); 3427 } 3428 3429 void 3430 update_decbkm(void) 3431 { 3432 UpdateCheckbox("update_decbkm", 3433 mainMenuEntries, 3434 mainMenu_backarrow, 3435 (term->keyboard.flags & MODE_DECBKM) != 0); 3436 } 3437 3438 #if OPT_NUM_LOCK 3439 void 3440 update_num_lock(void) 3441 { 3442 UpdateCheckbox("update_num_lock", 3443 mainMenuEntries, 3444 mainMenu_num_lock, 3445 term->misc.real_NumLock); 3446 } 3447 3448 void 3449 update_alt_esc(void) 3450 { 3451 UpdateCheckbox("update_alt_esc", 3452 mainMenuEntries, 3453 mainMenu_alt_esc, 3454 TScreenOf(term)->alt_sends_esc); 3455 } 3456 3457 void 3458 update_meta_esc(void) 3459 { 3460 UpdateCheckbox("update_meta_esc", 3461 mainMenuEntries, 3462 mainMenu_meta_esc, 3463 TScreenOf(term)->meta_sends_esc); 3464 } 3465 #endif 3466 3467 #if OPT_SUN_FUNC_KEYS 3468 void 3469 update_sun_fkeys(void) 3470 { 3471 UpdateCheckbox("update_sun_fkeys", 3472 mainMenuEntries, 3473 mainMenu_sun_fkeys, 3474 term->keyboard.type == keyboardIsSun); 3475 } 3476 #endif 3477 3478 #if OPT_TCAP_FKEYS 3479 void 3480 update_tcap_fkeys(void) 3481 { 3482 UpdateCheckbox("update_tcap_fkeys", 3483 mainMenuEntries, 3484 mainMenu_tcap_fkeys, 3485 term->keyboard.type == keyboardIsTermcap); 3486 } 3487 #endif 3488 3489 void 3490 update_old_fkeys(void) 3491 { 3492 UpdateCheckbox("update_old_fkeys", 3493 mainMenuEntries, 3494 mainMenu_old_fkeys, 3495 term->keyboard.type == keyboardIsLegacy); 3496 } 3497 3498 void 3499 update_delete_del(void) 3500 { 3501 UpdateCheckbox("update_delete_del", 3502 mainMenuEntries, 3503 mainMenu_delete_del, 3504 xtermDeleteIsDEL(term)); 3505 } 3506 3507 #if OPT_SUNPC_KBD 3508 void 3509 update_sun_kbd(void) 3510 { 3511 UpdateCheckbox("update_sun_kbd", 3512 mainMenuEntries, 3513 mainMenu_sun_kbd, 3514 term->keyboard.type == keyboardIsVT220); 3515 } 3516 #endif 3517 3518 #if OPT_HP_FUNC_KEYS 3519 void 3520 update_hp_fkeys(void) 3521 { 3522 UpdateCheckbox("update_hp_fkeys", 3523 mainMenuEntries, 3524 mainMenu_hp_fkeys, 3525 term->keyboard.type == keyboardIsHP); 3526 } 3527 #endif 3528 3529 #if OPT_SCO_FUNC_KEYS 3530 void 3531 update_sco_fkeys(void) 3532 { 3533 UpdateCheckbox("update_sco_fkeys", 3534 mainMenuEntries, 3535 mainMenu_sco_fkeys, 3536 term->keyboard.type == keyboardIsSCO); 3537 } 3538 #endif 3539 3540 void 3541 update_scrollbar(void) 3542 { 3543 UpdateCheckbox("update_scrollbar", 3544 vtMenuEntries, 3545 vtMenu_scrollbar, 3546 ScrollbarWidth(TScreenOf(term))); 3547 } 3548 3549 void 3550 update_jumpscroll(void) 3551 { 3552 UpdateCheckbox("update_jumpscroll", 3553 vtMenuEntries, 3554 vtMenu_jumpscroll, 3555 TScreenOf(term)->jumpscroll); 3556 } 3557 3558 void 3559 update_reversevideo(void) 3560 { 3561 UpdateCheckbox("update_reversevideo", 3562 vtMenuEntries, 3563 vtMenu_reversevideo, 3564 (term->misc.re_verse)); 3565 } 3566 3567 void 3568 update_autowrap(void) 3569 { 3570 DisableIfVT52(vtMenuEntries, 3571 vtMenu_autowrap); 3572 UpdateCheckbox("update_autowrap", 3573 vtMenuEntries, 3574 vtMenu_autowrap, 3575 (term->flags & WRAPAROUND) != 0); 3576 } 3577 3578 void 3579 update_reversewrap(void) 3580 { 3581 DisableIfVT52(vtMenuEntries, 3582 vtMenu_reversewrap); 3583 UpdateCheckbox("update_reversewrap", 3584 vtMenuEntries, 3585 vtMenu_reversewrap, 3586 (term->flags & REVERSEWRAP) != 0); 3587 } 3588 3589 void 3590 update_autolinefeed(void) 3591 { 3592 DisableIfVT52(vtMenuEntries, 3593 vtMenu_autolinefeed); 3594 UpdateCheckbox("update_autolinefeed", 3595 vtMenuEntries, 3596 vtMenu_autolinefeed, 3597 (term->flags & LINEFEED) != 0); 3598 } 3599 3600 void 3601 update_appcursor(void) 3602 { 3603 DisableIfVT52(vtMenuEntries, 3604 vtMenu_appcursor); 3605 UpdateCheckbox("update_appcursor", 3606 vtMenuEntries, 3607 vtMenu_appcursor, 3608 (term->keyboard.flags & MODE_DECCKM) != 0); 3609 } 3610 3611 void 3612 update_appkeypad(void) 3613 { 3614 UpdateCheckbox("update_appkeypad", 3615 vtMenuEntries, 3616 vtMenu_appkeypad, 3617 (term->keyboard.flags & MODE_DECKPAM) != 0); 3618 } 3619 3620 void 3621 update_scrollkey(void) 3622 { 3623 UpdateCheckbox("update_scrollkey", 3624 vtMenuEntries, 3625 vtMenu_scrollkey, 3626 TScreenOf(term)->scrollkey); 3627 } 3628 3629 void 3630 update_scrollttyoutput(void) 3631 { 3632 UpdateCheckbox("update_scrollttyoutput", 3633 vtMenuEntries, 3634 vtMenu_scrollttyoutput, 3635 TScreenOf(term)->scrollttyoutput); 3636 } 3637 3638 void 3639 update_keepSelection(void) 3640 { 3641 UpdateCheckbox("update_keepSelection", 3642 vtMenuEntries, 3643 vtMenu_keepSelection, 3644 TScreenOf(term)->keepSelection); 3645 } 3646 3647 void 3648 update_selectToClipboard(void) 3649 { 3650 UpdateCheckbox("update_selectToClipboard", 3651 vtMenuEntries, 3652 vtMenu_selectToClipboard, 3653 TScreenOf(term)->selectToClipboard); 3654 } 3655 3656 void 3657 update_allow132(void) 3658 { 3659 DisableIfVT52(vtMenuEntries, 3660 vtMenu_allow132); 3661 UpdateCheckbox("update_allow132", 3662 vtMenuEntries, 3663 vtMenu_allow132, 3664 TScreenOf(term)->c132); 3665 } 3666 3667 void 3668 update_cursesemul(void) 3669 { 3670 #if 0 /* 2006-2-12: no longer menu entry */ 3671 UpdateMenuItem("update_cursesemul", vtMenuEntries, vtMenu_cursesemul, 3672 TScreenOf(term)->curses); 3673 #endif 3674 } 3675 3676 void 3677 update_visualbell(void) 3678 { 3679 UpdateCheckbox("update_visualbell", 3680 vtMenuEntries, 3681 vtMenu_visualbell, 3682 TScreenOf(term)->visualbell); 3683 } 3684 3685 void 3686 update_bellIsUrgent(void) 3687 { 3688 UpdateCheckbox("update_bellIsUrgent", 3689 vtMenuEntries, 3690 vtMenu_bellIsUrgent, 3691 TScreenOf(term)->bellIsUrgent); 3692 } 3693 3694 void 3695 update_poponbell(void) 3696 { 3697 UpdateCheckbox("update_poponbell", 3698 vtMenuEntries, 3699 vtMenu_poponbell, 3700 TScreenOf(term)->poponbell); 3701 } 3702 3703 #ifndef update_marginbell /* 2007-3-7: no longer menu entry */ 3704 void 3705 update_marginbell(void) 3706 { 3707 UpdateCheckbox("update_marginbell", 3708 vtMenuEntries, 3709 vtMenu_marginbell, 3710 TScreenOf(term)->marginbell); 3711 } 3712 #endif 3713 3714 #if OPT_BLINK_CURS 3715 void 3716 update_cursorblink(void) 3717 { 3718 BlinkOps check = TScreenOf(term)->cursor_blink; 3719 3720 if (check == cbAlways || 3721 check == cbNever) { 3722 SetItemSensitivity(vtMenuEntries[vtMenu_cursorblink].widget, False); 3723 } 3724 UpdateCheckbox("update_cursorblink", 3725 vtMenuEntries, 3726 vtMenu_cursorblink, 3727 (check == cbTrue || 3728 check == cbAlways)); 3729 } 3730 #endif 3731 3732 void 3733 update_altscreen(void) 3734 { 3735 UpdateCheckbox("update_altscreen", 3736 vtMenuEntries, 3737 vtMenu_altscreen, 3738 TScreenOf(term)->whichBuf); 3739 } 3740 3741 void 3742 update_titeInhibit(void) 3743 { 3744 UpdateCheckbox("update_titeInhibit", 3745 vtMenuEntries, 3746 vtMenu_titeInhibit, 3747 !(term->misc.titeInhibit)); 3748 } 3749 3750 #ifndef NO_ACTIVE_ICON 3751 void 3752 update_activeicon(void) 3753 { 3754 SetItemSensitivity(vtMenuEntries[vtMenu_activeicon].widget, False); 3755 UpdateCheckbox("update_activeicon", 3756 vtMenuEntries, 3757 vtMenu_activeicon, 3758 term->work.active_icon); 3759 } 3760 #endif /* NO_ACTIVE_ICON */ 3761 3762 static void 3763 do_allowBoldFonts(Widget w, 3764 XtPointer closure GCC_UNUSED, 3765 XtPointer data GCC_UNUSED) 3766 { 3767 XtermWidget xw = getXtermWidget(w); 3768 if (xw != NULL) { 3769 ToggleFlag(TScreenOf(xw)->allowBoldFonts); 3770 update_menu_allowBoldFonts(); 3771 Redraw(); 3772 } 3773 } 3774 3775 #if OPT_DEC_CHRSET 3776 void 3777 update_font_doublesize(void) 3778 { 3779 UpdateCheckbox("update_font_doublesize", 3780 fontMenuEntries, 3781 fontMenu_font_doublesize, 3782 TScreenOf(term)->font_doublesize); 3783 } 3784 #endif 3785 3786 #if OPT_BOX_CHARS 3787 void 3788 update_font_boxchars(void) 3789 { 3790 SetItemSensitivity(fontMenuEntries[fontMenu_font_boxchars].widget, 3791 !TScreenOf(term)->broken_box_chars); 3792 UpdateCheckbox("update_font_boxchars", 3793 fontMenuEntries, 3794 fontMenu_font_boxchars, 3795 TScreenOf(term)->force_box_chars || 3796 TScreenOf(term)->broken_box_chars); 3797 } 3798 3799 void 3800 update_font_packed(void) 3801 { 3802 UpdateCheckbox("update_font_packed", 3803 fontMenuEntries, 3804 fontMenu_font_packedfont, 3805 TScreenOf(term)->force_packed); 3806 } 3807 #endif 3808 3809 #if OPT_DEC_SOFTFONT 3810 void 3811 update_font_loadable(void) 3812 { 3813 UpdateCheckbox("update_font_loadable", 3814 fontMenuEntries, 3815 fontMenu_font_loadable, 3816 term->misc.font_loadable); 3817 } 3818 #endif 3819 3820 #if OPT_RENDERFONT 3821 void 3822 update_font_renderfont(void) 3823 { 3824 UpdateCheckbox("update_font_renderfont", 3825 fontMenuEntries, 3826 fontMenu_render_font, 3827 (term->work.render_font == True)); 3828 SetItemSensitivity(fontMenuEntries[fontMenu_render_font].widget, 3829 !IsEmpty(CurrentXftFont(term))); 3830 3831 #if OPT_BOX_CHARS 3832 if (term->work.render_font) { 3833 TScreenOf(term)->broken_box_chars = term->work.broken_box_chars; 3834 } else { 3835 TScreenOf(term)->broken_box_chars = False; 3836 } 3837 #endif 3838 update_font_boxchars(); 3839 3840 update_fontmenu(term); 3841 } 3842 #endif 3843 3844 #if OPT_WIDE_CHARS 3845 void 3846 update_font_utf8_mode(void) 3847 { 3848 Bool active = (TScreenOf(term)->utf8_mode != uAlways); 3849 Bool enable = (TScreenOf(term)->utf8_mode != uFalse); 3850 3851 TRACE(("update_font_utf8_mode active %d, enable %d\n", active, enable)); 3852 SetItemSensitivity(fontMenuEntries[fontMenu_utf8_mode].widget, active); 3853 UpdateCheckbox("update_font_utf8_mode", 3854 fontMenuEntries, 3855 fontMenu_utf8_mode, 3856 enable); 3857 } 3858 3859 void 3860 update_font_utf8_fonts(void) 3861 { 3862 Bool active = (TScreenOf(term)->utf8_fonts != uAlways); 3863 Bool enable = (TScreenOf(term)->utf8_fonts != uFalse); 3864 3865 TRACE(("update_font_utf8_fonts active %d, enable %d\n", active, enable)); 3866 SetItemSensitivity(fontMenuEntries[fontMenu_utf8_fonts].widget, active); 3867 UpdateCheckbox("update_font_utf8_fonts", 3868 fontMenuEntries, 3869 fontMenu_utf8_fonts, 3870 enable); 3871 } 3872 3873 void 3874 update_font_utf8_title(void) 3875 { 3876 Bool active = (TScreenOf(term)->utf8_mode != uAlways); 3877 Bool enable = (TScreenOf(term)->utf8_mode != uFalse); 3878 3879 TRACE(("update_font_utf8_title active %d, enable %d\n", active, enable)); 3880 SetItemSensitivity(fontMenuEntries[fontMenu_utf8_title].widget, active); 3881 UpdateCheckbox("update_font_utf8_title", 3882 fontMenuEntries, 3883 fontMenu_utf8_title, 3884 enable); 3885 } 3886 #endif 3887 3888 #if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT 3889 void 3890 update_menu_allowBoldFonts(void) 3891 { 3892 UpdateCheckbox("update_menu_allowBoldFonts", 3893 fontMenuEntries, 3894 fontMenu_allowBoldFonts, 3895 TScreenOf(term)->allowBoldFonts); 3896 } 3897 #endif 3898 3899 #if OPT_ALLOW_XXX_OPS 3900 static void 3901 enable_allow_xxx_ops(Bool enable) 3902 { 3903 SetItemSensitivity(fontMenuEntries[fontMenu_allowFontOps].widget, enable); 3904 SetItemSensitivity(fontMenuEntries[fontMenu_allowMouseOps].widget, enable); 3905 SetItemSensitivity(fontMenuEntries[fontMenu_allowTcapOps].widget, enable); 3906 SetItemSensitivity(fontMenuEntries[fontMenu_allowTitleOps].widget, enable); 3907 SetItemSensitivity(fontMenuEntries[fontMenu_allowWindowOps].widget, enable); 3908 } 3909 3910 static void 3911 do_allowColorOps(Widget w, 3912 XtPointer closure GCC_UNUSED, 3913 XtPointer data GCC_UNUSED) 3914 { 3915 XtermWidget xw = getXtermWidget(w); 3916 if (xw != NULL) { 3917 ToggleFlag(TScreenOf(xw)->allowColorOps); 3918 update_menu_allowColorOps(); 3919 } 3920 } 3921 3922 static void 3923 do_allowFontOps(Widget w, 3924 XtPointer closure GCC_UNUSED, 3925 XtPointer data GCC_UNUSED) 3926 { 3927 XtermWidget xw = getXtermWidget(w); 3928 if (xw != NULL) { 3929 ToggleFlag(TScreenOf(xw)->allowFontOps); 3930 update_menu_allowFontOps(); 3931 } 3932 } 3933 3934 static void 3935 do_allowMouseOps(Widget w, 3936 XtPointer closure GCC_UNUSED, 3937 XtPointer data GCC_UNUSED) 3938 { 3939 XtermWidget xw = getXtermWidget(w); 3940 if (xw != NULL) { 3941 ToggleFlag(TScreenOf(xw)->allowMouseOps); 3942 update_menu_allowMouseOps(); 3943 } 3944 } 3945 3946 static void 3947 do_allowTcapOps(Widget w, 3948 XtPointer closure GCC_UNUSED, 3949 XtPointer data GCC_UNUSED) 3950 { 3951 XtermWidget xw = getXtermWidget(w); 3952 if (xw != NULL) { 3953 ToggleFlag(TScreenOf(xw)->allowTcapOps); 3954 update_menu_allowTcapOps(); 3955 } 3956 } 3957 3958 static void 3959 do_allowTitleOps(Widget w, 3960 XtPointer closure GCC_UNUSED, 3961 XtPointer data GCC_UNUSED) 3962 { 3963 XtermWidget xw = getXtermWidget(w); 3964 if (xw != NULL) { 3965 ToggleFlag(TScreenOf(xw)->allowTitleOps); 3966 update_menu_allowTitleOps(); 3967 } 3968 } 3969 3970 static void 3971 do_allowWindowOps(Widget w, 3972 XtPointer closure GCC_UNUSED, 3973 XtPointer data GCC_UNUSED) 3974 { 3975 XtermWidget xw = getXtermWidget(w); 3976 if (xw != NULL) { 3977 ToggleFlag(TScreenOf(xw)->allowWindowOps); 3978 update_menu_allowWindowOps(); 3979 } 3980 } 3981 3982 void 3983 HandleAllowColorOps(Widget w, 3984 XEvent *event GCC_UNUSED, 3985 String *params, 3986 Cardinal *param_count) 3987 { 3988 HANDLE_VT_TOGGLE(allowColorOps); 3989 } 3990 3991 void 3992 HandleAllowFontOps(Widget w, 3993 XEvent *event GCC_UNUSED, 3994 String *params, 3995 Cardinal *param_count) 3996 { 3997 HANDLE_VT_TOGGLE(allowFontOps); 3998 } 3999 4000 void 4001 HandleAllowMouseOps(Widget w, 4002 XEvent *event GCC_UNUSED, 4003 String *params, 4004 Cardinal *param_count) 4005 { 4006 HANDLE_VT_TOGGLE(allowMouseOps); 4007 } 4008 4009 void 4010 HandleAllowTcapOps(Widget w, 4011 XEvent *event GCC_UNUSED, 4012 String *params, 4013 Cardinal *param_count) 4014 { 4015 HANDLE_VT_TOGGLE(allowTcapOps); 4016 } 4017 4018 void 4019 HandleAllowTitleOps(Widget w, 4020 XEvent *event GCC_UNUSED, 4021 String *params, 4022 Cardinal *param_count) 4023 { 4024 HANDLE_VT_TOGGLE(allowTitleOps); 4025 } 4026 4027 void 4028 HandleAllowWindowOps(Widget w, 4029 XEvent *event GCC_UNUSED, 4030 String *params, 4031 Cardinal *param_count) 4032 { 4033 HANDLE_VT_TOGGLE(allowWindowOps); 4034 } 4035 4036 void 4037 update_menu_allowColorOps(void) 4038 { 4039 UpdateCheckbox("update_menu_allowColorOps", 4040 fontMenuEntries, 4041 fontMenu_allowColorOps, 4042 TScreenOf(term)->allowColorOps); 4043 } 4044 4045 void 4046 update_menu_allowFontOps(void) 4047 { 4048 UpdateCheckbox("update_menu_allowFontOps", 4049 fontMenuEntries, 4050 fontMenu_allowFontOps, 4051 TScreenOf(term)->allowFontOps); 4052 } 4053 4054 void 4055 update_menu_allowMouseOps(void) 4056 { 4057 UpdateCheckbox("update_menu_allowMouseOps", 4058 fontMenuEntries, 4059 fontMenu_allowMouseOps, 4060 TScreenOf(term)->allowMouseOps); 4061 } 4062 4063 void 4064 update_menu_allowTcapOps(void) 4065 { 4066 UpdateCheckbox("update_menu_allowTcapOps", 4067 fontMenuEntries, 4068 fontMenu_allowTcapOps, 4069 TScreenOf(term)->allowTcapOps); 4070 } 4071 4072 void 4073 update_menu_allowTitleOps(void) 4074 { 4075 UpdateCheckbox("update_menu_allowTitleOps", 4076 fontMenuEntries, 4077 fontMenu_allowTitleOps, 4078 TScreenOf(term)->allowTitleOps); 4079 } 4080 4081 void 4082 update_menu_allowWindowOps(void) 4083 { 4084 UpdateCheckbox("update_menu_allowWindowOps", 4085 fontMenuEntries, 4086 fontMenu_allowWindowOps, 4087 TScreenOf(term)->allowWindowOps); 4088 } 4089 #endif 4090 4091 #if OPT_TEK4014 4092 void 4093 update_tekshow(void) 4094 { 4095 if (!(TScreenOf(term)->inhibit & I_TEK)) { 4096 UpdateCheckbox("update_tekshow", 4097 vtMenuEntries, 4098 vtMenu_tekshow, 4099 TEK4014_SHOWN(term)); 4100 } 4101 } 4102 4103 void 4104 update_vttekmode(void) 4105 { 4106 XtermWidget xw = term; 4107 4108 if (!(TScreenOf(xw)->inhibit & I_TEK)) { 4109 UpdateCheckbox("update_vtmode", 4110 vtMenuEntries, 4111 vtMenu_tekmode, 4112 TEK4014_ACTIVE(xw)); 4113 UpdateCheckbox("update_tekmode", 4114 tekMenuEntries, 4115 tekMenu_vtmode, 4116 !TEK4014_ACTIVE(xw)); 4117 update_fullscreen(); 4118 } 4119 } 4120 4121 void 4122 update_vtshow(void) 4123 { 4124 if (!(TScreenOf(term)->inhibit & I_TEK)) { 4125 UpdateCheckbox("update_vtshow", 4126 tekMenuEntries, 4127 tekMenu_vtshow, 4128 TScreenOf(term)->Vshow); 4129 } 4130 } 4131 4132 void 4133 set_vthide_sensitivity(void) 4134 { 4135 if (!(TScreenOf(term)->inhibit & I_TEK)) { 4136 SetItemSensitivity( 4137 vtMenuEntries[vtMenu_vthide].widget, 4138 TEK4014_SHOWN(term)); 4139 } 4140 } 4141 4142 void 4143 set_tekhide_sensitivity(void) 4144 { 4145 if (!(TScreenOf(term)->inhibit & I_TEK)) { 4146 SetItemSensitivity( 4147 tekMenuEntries[tekMenu_tekhide].widget, 4148 TScreenOf(term)->Vshow); 4149 } 4150 } 4151 4152 void 4153 set_tekfont_menu_item(int n, int val) 4154 { 4155 if (!(TScreenOf(term)->inhibit & I_TEK)) { 4156 UpdateCheckbox("set_tekfont_menu_item", tekMenuEntries, FS2MI(n), 4157 (val)); 4158 } 4159 } 4160 #endif /* OPT_TEK4014 */ 4161 4162 void 4163 set_menu_font(int val) 4164 { 4165 UpdateCheckbox("set_menu_font", 4166 fontMenuEntries, 4167 TScreenOf(term)->menu_font_number, 4168 (val)); 4169 } 4170