1 /* $XTermId: menu.c,v 1.279 2011/02/09 10:00:58 tom Exp $ */
4 * Copyright 1999-2010,2011 by Thomas E. Dickey
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
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
33 * Copyright 1989 The Open Group
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
41 * The above copyright notice and this permission notice shall be included in
42 * all copies or substantial portions of the Software.
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.
51 * Except as contained in this notice, the name of The Open Group 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 Open Group.
59 #include <fontutils.h>
64 #include <X11/Xmu/CharSet.h>
66 #define app_con Xaw_app_con /* quiet a warning from SimpleMenu.h */
68 #if defined(HAVE_LIB_XAW)
70 #include <X11/Xaw/SimpleMenu.h>
71 #include <X11/Xaw/Box.h>
72 #include <X11/Xaw/SmeBSB.h>
73 #include <X11/Xaw/SmeLine.h>
76 #include <X11/Xatom.h>
81 #include <X11/Xaw/MenuButton.h>
82 #include <X11/Xaw/Form.h>
85 #elif defined(HAVE_LIB_XAW3D)
87 #include <X11/Xaw3d/SimpleMenu.h>
88 #include <X11/Xaw3d/Box.h>
89 #include <X11/Xaw3d/SmeBSB.h>
90 #include <X11/Xaw3d/SmeLine.h>
93 #include <X11/Xaw3d/MenuButton.h>
94 #include <X11/Xaw3d/Form.h>
97 #elif defined(HAVE_LIB_NEXTAW)
99 #include <X11/neXtaw/SimpleMenu.h>
100 #include <X11/neXtaw/Box.h>
101 #include <X11/neXtaw/SmeBSB.h>
102 #include <X11/neXtaw/SmeLine.h>
105 #include <X11/neXtaw/MenuButton.h>
106 #include <X11/neXtaw/Form.h>
109 #elif defined(HAVE_LIB_XAWPLUS)
111 #include <X11/XawPlus/SimpleMenu.h>
112 #include <X11/XawPlus/Box.h>
113 #include <X11/XawPlus/SmeBSB.h>
114 #include <X11/XawPlus/SmeLine.h>
117 #include <X11/XawPlus/MenuButton.h>
118 #include <X11/XawPlus/Form.h>
129 #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(func, mn, mi, val)
131 #define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(mn, mi, val)
134 #define ToggleFlag(flag) flag = (Boolean) !flag
136 static void do_8bit_control PROTO_XT_CALLBACK_ARGS;
137 static void do_allow132 PROTO_XT_CALLBACK_ARGS;
138 static void do_allowsends PROTO_XT_CALLBACK_ARGS;
139 static void do_altscreen PROTO_XT_CALLBACK_ARGS;
140 static void do_appcursor PROTO_XT_CALLBACK_ARGS;
141 static void do_appkeypad PROTO_XT_CALLBACK_ARGS;
142 static void do_autolinefeed PROTO_XT_CALLBACK_ARGS;
143 static void do_autowrap PROTO_XT_CALLBACK_ARGS;
144 static void do_backarrow PROTO_XT_CALLBACK_ARGS;
145 static void do_bellIsUrgent PROTO_XT_CALLBACK_ARGS;
146 static void do_clearsavedlines PROTO_XT_CALLBACK_ARGS;
147 static void do_continue PROTO_XT_CALLBACK_ARGS;
148 static void do_delete_del PROTO_XT_CALLBACK_ARGS;
149 static void do_hardreset PROTO_XT_CALLBACK_ARGS;
150 static void do_interrupt PROTO_XT_CALLBACK_ARGS;
151 static void do_jumpscroll PROTO_XT_CALLBACK_ARGS;
152 static void do_kill PROTO_XT_CALLBACK_ARGS;
153 static void do_old_fkeys PROTO_XT_CALLBACK_ARGS;
154 static void do_poponbell PROTO_XT_CALLBACK_ARGS;
155 static void do_print PROTO_XT_CALLBACK_ARGS;
156 static void do_print_redir PROTO_XT_CALLBACK_ARGS;
157 static void do_quit PROTO_XT_CALLBACK_ARGS;
158 static void do_redraw PROTO_XT_CALLBACK_ARGS;
159 static void do_reversevideo PROTO_XT_CALLBACK_ARGS;
160 static void do_reversewrap PROTO_XT_CALLBACK_ARGS;
161 static void do_scrollbar PROTO_XT_CALLBACK_ARGS;
162 static void do_scrollkey PROTO_XT_CALLBACK_ARGS;
163 static void do_scrollttyoutput PROTO_XT_CALLBACK_ARGS;
164 static void do_securekbd PROTO_XT_CALLBACK_ARGS;
165 static void do_keepSelection PROTO_XT_CALLBACK_ARGS;
166 static void do_selectClipboard PROTO_XT_CALLBACK_ARGS;
167 static void do_softreset PROTO_XT_CALLBACK_ARGS;
168 static void do_suspend PROTO_XT_CALLBACK_ARGS;
169 static void do_terminate PROTO_XT_CALLBACK_ARGS;
170 static void do_titeInhibit PROTO_XT_CALLBACK_ARGS;
171 static void do_visualbell PROTO_XT_CALLBACK_ARGS;
172 static void do_vtfont PROTO_XT_CALLBACK_ARGS;
175 static void do_logging PROTO_XT_CALLBACK_ARGS;
178 #ifndef NO_ACTIVE_ICON
179 static void do_activeicon PROTO_XT_CALLBACK_ARGS;
180 #endif /* NO_ACTIVE_ICON */
182 #if OPT_ALLOW_XXX_OPS
183 static void enable_allow_xxx_ops (Bool);
184 static void do_allowColorOps PROTO_XT_CALLBACK_ARGS;
185 static void do_allowFontOps PROTO_XT_CALLBACK_ARGS;
186 static void do_allowTcapOps PROTO_XT_CALLBACK_ARGS;
187 static void do_allowTitleOps PROTO_XT_CALLBACK_ARGS;
188 static void do_allowWindowOps PROTO_XT_CALLBACK_ARGS;
192 static void do_cursorblink PROTO_XT_CALLBACK_ARGS;
196 static void do_font_boxchars PROTO_XT_CALLBACK_ARGS;
197 static void do_font_packed PROTO_XT_CALLBACK_ARGS;
201 static void do_font_doublesize PROTO_XT_CALLBACK_ARGS;
205 static void do_font_loadable PROTO_XT_CALLBACK_ARGS;
209 static void do_hp_fkeys PROTO_XT_CALLBACK_ARGS;
213 static void do_fullscreen PROTO_XT_CALLBACK_ARGS;
217 static void do_alt_esc PROTO_XT_CALLBACK_ARGS;
218 static void do_num_lock PROTO_XT_CALLBACK_ARGS;
219 static void do_meta_esc PROTO_XT_CALLBACK_ARGS;
223 static void do_font_renderfont PROTO_XT_CALLBACK_ARGS;
226 #if OPT_SCO_FUNC_KEYS
227 static void do_sco_fkeys PROTO_XT_CALLBACK_ARGS;
230 #if OPT_SUN_FUNC_KEYS
231 static void do_sun_fkeys PROTO_XT_CALLBACK_ARGS;
235 static void do_sun_kbd PROTO_XT_CALLBACK_ARGS;
239 static void do_tcap_fkeys PROTO_XT_CALLBACK_ARGS;
243 static void do_tekcopy PROTO_XT_CALLBACK_ARGS;
244 static void do_tekhide PROTO_XT_CALLBACK_ARGS;
245 static void do_tekmode PROTO_XT_CALLBACK_ARGS;
246 static void do_tekonoff PROTO_XT_CALLBACK_ARGS;
247 static void do_tekpage PROTO_XT_CALLBACK_ARGS;
248 static void do_tekreset PROTO_XT_CALLBACK_ARGS;
249 static void do_tekshow PROTO_XT_CALLBACK_ARGS;
250 static void do_tektext2 PROTO_XT_CALLBACK_ARGS;
251 static void do_tektext3 PROTO_XT_CALLBACK_ARGS;
252 static void do_tektextlarge PROTO_XT_CALLBACK_ARGS;
253 static void do_tektextsmall PROTO_XT_CALLBACK_ARGS;
254 static void do_vthide PROTO_XT_CALLBACK_ARGS;
255 static void do_vtmode PROTO_XT_CALLBACK_ARGS;
256 static void do_vtonoff PROTO_XT_CALLBACK_ARGS;
257 static void do_vtshow PROTO_XT_CALLBACK_ARGS;
258 static void handle_tekshow (Widget gw, Bool allowswitch);
259 static void handle_vtshow (Widget gw, Bool allowswitch);
263 static void do_toolbar PROTO_XT_CALLBACK_ARGS;
267 static void do_font_utf8_mode PROTO_XT_CALLBACK_ARGS;
268 static void do_font_utf8_title PROTO_XT_CALLBACK_ARGS;
272 * The order of entries MUST match the values given in menu.h
274 MenuEntry mainMenuEntries[] = {
276 { "toolbar", do_toolbar, NULL },
279 { "fullscreen", do_fullscreen, NULL },
281 { "securekbd", do_securekbd, NULL },
282 { "allowsends", do_allowsends, NULL },
283 { "redraw", do_redraw, NULL },
284 { "line1", NULL, NULL },
286 { "logging", do_logging, NULL },
288 { "print", do_print, NULL },
289 { "print-redir", do_print_redir, NULL },
290 { "line2", NULL, NULL },
291 { "8-bit control", do_8bit_control,NULL },
292 { "backarrow key", do_backarrow, NULL },
294 { "num-lock", do_num_lock, NULL },
295 { "alt-esc", do_alt_esc, NULL },
296 { "meta-esc", do_meta_esc, NULL },
298 { "delete-is-del", do_delete_del, NULL },
299 { "oldFunctionKeys",do_old_fkeys, NULL },
301 { "tcapFunctionKeys",do_tcap_fkeys, NULL },
304 { "hpFunctionKeys", do_hp_fkeys, NULL },
306 #if OPT_SCO_FUNC_KEYS
307 { "scoFunctionKeys",do_sco_fkeys, NULL },
309 #if OPT_SUN_FUNC_KEYS
310 { "sunFunctionKeys",do_sun_fkeys, NULL },
313 { "sunKeyboard", do_sun_kbd, NULL },
315 { "line3", NULL, NULL },
316 { "suspend", do_suspend, NULL },
317 { "continue", do_continue, NULL },
318 { "interrupt", do_interrupt, NULL },
319 { "hangup", do_hangup, NULL },
320 { "terminate", do_terminate, NULL },
321 { "kill", do_kill, NULL },
322 { "line4", NULL, NULL },
323 { "quit", do_quit, NULL }};
325 MenuEntry vtMenuEntries[] = {
326 { "scrollbar", do_scrollbar, NULL },
327 { "jumpscroll", do_jumpscroll, NULL },
328 { "reversevideo", do_reversevideo, NULL },
329 { "autowrap", do_autowrap, NULL },
330 { "reversewrap", do_reversewrap, NULL },
331 { "autolinefeed", do_autolinefeed, NULL },
332 { "appcursor", do_appcursor, NULL },
333 { "appkeypad", do_appkeypad, NULL },
334 { "scrollkey", do_scrollkey, NULL },
335 { "scrollttyoutput",do_scrollttyoutput, NULL },
336 { "allow132", do_allow132, NULL },
337 { "keepSelection", do_keepSelection, NULL },
338 { "selectToClipboard",do_selectClipboard, NULL },
339 { "visualbell", do_visualbell, NULL },
340 { "bellIsUrgent", do_bellIsUrgent, NULL },
341 { "poponbell", do_poponbell, NULL },
343 { "cursorblink", do_cursorblink, NULL },
345 { "titeInhibit", do_titeInhibit, NULL },
346 #ifndef NO_ACTIVE_ICON
347 { "activeicon", do_activeicon, NULL },
348 #endif /* NO_ACTIVE_ICON */
349 { "line1", NULL, NULL },
350 { "softreset", do_softreset, NULL },
351 { "hardreset", do_hardreset, NULL },
352 { "clearsavedlines",do_clearsavedlines, NULL },
353 { "line2", NULL, NULL },
355 { "tekshow", do_tekshow, NULL },
356 { "tekmode", do_tekmode, NULL },
357 { "vthide", do_vthide, NULL },
359 { "altscreen", do_altscreen, NULL },
362 MenuEntry fontMenuEntries[] = {
363 { "fontdefault", do_vtfont, NULL },
364 { "font1", do_vtfont, NULL },
365 { "font2", do_vtfont, NULL },
366 { "font3", do_vtfont, NULL },
367 { "font4", do_vtfont, NULL },
368 { "font5", do_vtfont, NULL },
369 { "font6", do_vtfont, NULL },
370 /* this is after the last builtin font; the other entries are special */
371 { "fontescape", do_vtfont, NULL },
372 { "fontsel", do_vtfont, NULL },
373 /* down to here should match NMENUFONTS in ptyx.h */
375 #if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT
376 { "line1", NULL, NULL },
378 { "font-linedrawing",do_font_boxchars,NULL },
379 { "font-packed", do_font_packed,NULL },
382 { "font-doublesize",do_font_doublesize,NULL },
385 { "font-loadable", do_font_loadable,NULL },
387 #endif /* toggles for DEC font extensions */
389 #if OPT_RENDERFONT || OPT_WIDE_CHARS
390 { "line2", NULL, NULL },
392 { "render-font", do_font_renderfont,NULL },
395 { "utf8-mode", do_font_utf8_mode,NULL },
396 { "utf8-title", do_font_utf8_title,NULL },
398 #endif /* toggles for other font extensions */
400 #if OPT_ALLOW_XXX_OPS
401 { "line3", NULL, NULL },
402 { "allow-color-ops",do_allowColorOps,NULL },
403 { "allow-font-ops", do_allowFontOps,NULL },
404 { "allow-tcap-ops", do_allowTcapOps,NULL },
405 { "allow-title-ops",do_allowTitleOps,NULL },
406 { "allow-window-ops",do_allowWindowOps,NULL },
412 MenuEntry tekMenuEntries[] = {
413 { "tektextlarge", do_tektextlarge, NULL },
414 { "tektext2", do_tektext2, NULL },
415 { "tektext3", do_tektext3, NULL },
416 { "tektextsmall", do_tektextsmall, NULL },
417 { "line1", NULL, NULL },
418 { "tekpage", do_tekpage, NULL },
419 { "tekreset", do_tekreset, NULL },
420 { "tekcopy", do_tekcopy, NULL },
421 { "line2", NULL, NULL },
422 { "vtshow", do_vtshow, NULL },
423 { "vtmode", do_vtmode, NULL },
424 { "tekhide", do_tekhide, NULL }};
429 MenuEntry *entry_list;
433 /* This table is ordered to correspond with MenuIndex */
434 static MenuHeader menu_names[] = {
435 { "mainMenu", mainMenuEntries, XtNumber(mainMenuEntries) },
436 { "vtMenu", vtMenuEntries, XtNumber(vtMenuEntries) },
437 { "fontMenu", fontMenuEntries, XtNumber(fontMenuEntries) },
439 { "tekMenu", tekMenuEntries, XtNumber(tekMenuEntries) },
446 * FIXME: These are global data rather than in the xterm widget because they
447 * are initialized before the widget is created.
450 Widget b; /* the toolbar's buttons */
451 Widget w; /* the popup shell activated by the button */
455 static MenuList vt_shell[NUM_POPUP_MENUS];
457 #if OPT_TEK4014 && OPT_TOOLBAR
458 static MenuList tek_shell[NUM_POPUP_MENUS];
462 setMenuLocale(Bool before, String substitute)
464 String result = setlocale(LC_CTYPE, 0);
467 result = x_strdup(result);
469 (void) setlocale(LC_CTYPE, substitute);
470 TRACE(("setMenuLocale %s:%s\n",
476 free((void *) substitute);
482 * Returns a pointer to the MenuList entry that matches the popup menu.
485 select_menu(Widget w GCC_UNUSED, MenuIndex num)
487 #if OPT_TEK4014 && OPT_TOOLBAR
489 if (w == tekshellwidget) {
490 return &tek_shell[num];
495 return &vt_shell[num];
499 * Returns a pointer to the given popup menu shell
502 obtain_menu(Widget w, MenuIndex num)
504 return select_menu(w, num)->w;
508 * Returns the number of entries in the given popup menu shell
511 sizeof_menu(Widget w, MenuIndex num)
513 return select_menu(w, num)->entries;
517 * create_menu - create a popup shell and stuff the menu into it.
521 create_menu(Widget w, XtermWidget xtw, MenuIndex num)
523 static XtCallbackRec cb[2] =
528 {XtNcallback, (XtArgVal) cb};
530 TScreen *screen = TScreenOf(xtw);
531 MenuHeader *data = &menu_names[num];
532 MenuList *list = select_menu(w, num);
533 struct _MenuEntry *entries = data->entry_list;
534 Cardinal nentries = data->entry_len;
539 if (screen->menu_item_bitmap == None) {
541 * we really want to do these dynamically
543 #define check_width 9
544 #define check_height 8
545 static unsigned char check_bits[] =
547 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00,
548 0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00
551 screen->menu_item_bitmap =
552 XCreateBitmapFromData(XtDisplay(xtw),
553 RootWindowOfScreen(XtScreen(xtw)),
554 (char *) check_bits, check_width, check_height);
557 saveLocale = setMenuLocale(True, resource.menuLocale);
558 list->w = XtCreatePopupShell(data->internal_name,
559 simpleMenuWidgetClass,
564 list->entries = nentries;
566 for (; nentries > 0; nentries--, entries++) {
567 cb[0].callback = (XtCallbackProc) entries->function;
568 cb[0].closure = (caddr_t) entries->name;
569 entries->widget = XtCreateManagedWidget(entries->name,
572 : smeLineObjectClass),
578 (void) setMenuLocale(False, saveLocale);
581 /* do not realize at this point */
586 indexOfMenu(String menuName)
613 XEvent * event GCC_UNUSED,
614 String * params, /* mainMenu, vtMenu, or tekMenu */
615 Cardinal *param_count) /* 0 or 1 */
617 XtermWidget xw = term;
618 TScreen *screen = TScreenOf(xw);
620 Bool created = False;
623 if (*param_count != 1) {
624 Bell(xw, XkbBI_MinorError, 0);
628 if ((me = indexOfMenu(params[0])) == noMenu) {
629 Bell(xw, XkbBI_MinorError, 0);
633 if ((mw = obtain_menu(w, me)) == 0
634 || sizeof_menu(w, me) == 0) {
635 mw = create_menu(w, xw, me);
641 TRACE(("domenu(%s) %s\n", params[0], created ? "create" : "update"));
650 update_print_redir();
651 update_8bit_control();
657 update_keyboard_type();
659 if (!screen->alt_is_not_meta) {
660 SetItemSensitivity(mainMenuEntries[mainMenu_alt_esc].widget,
664 if (!xtermHasPrinter(xw)) {
665 SetItemSensitivity(mainMenuEntries[mainMenu_print].widget,
667 SetItemSensitivity(mainMenuEntries[mainMenu_print_redir].widget,
670 if (screen->terminal_id < 200) {
672 mainMenuEntries[mainMenu_8bit_ctrl].widget,
675 #if !defined(SIGTSTP)
677 mainMenuEntries[mainMenu_suspend].widget, False);
679 #if !defined(SIGCONT)
681 mainMenuEntries[mainMenu_continue].widget, False);
684 if (screen->inhibit & I_LOG) {
686 mainMenuEntries[mainMenu_logging].widget, False);
689 if (screen->inhibit & I_SIGNAL) {
691 for (n = (int) mainMenu_suspend; n <= (int) mainMenu_quit; ++n) {
692 SetItemSensitivity(mainMenuEntries[n].widget, False);
702 update_reversevideo();
704 update_reversewrap();
705 update_autolinefeed();
709 update_scrollttyoutput();
712 update_keepSelection();
713 update_selectToClipboard();
716 update_bellIsUrgent();
717 update_cursorblink();
719 update_titeInhibit();
720 #ifndef NO_ACTIVE_ICON
721 if (!screen->fnt_icon.fs || !screen->iconVwin.window) {
723 vtMenuEntries[vtMenu_activeicon].widget,
727 #endif /* NO_ACTIVE_ICON */
729 if (screen->inhibit & I_TEK) {
731 for (n = (int) vtMenu_tekshow; n <= (int) vtMenu_vthide; ++n) {
732 SetItemSensitivity(vtMenuEntries[n].widget, False);
743 fontMenuEntries[fontMenu_fontescape].widget,
744 (screen->menu_font_names[fontMenu_fontescape][fNorm]
747 update_font_boxchars();
749 fontMenuEntries[fontMenu_font_boxchars].widget,
751 update_font_packed();
753 fontMenuEntries[fontMenu_font_packedfont].widget,
756 #if OPT_DEC_SOFTFONT /* FIXME: not implemented */
757 update_font_loadable();
759 fontMenuEntries[fontMenu_font_loadable].widget,
763 update_font_doublesize();
764 if (TScreenOf(xw)->cache_doublesize == 0)
766 fontMenuEntries[fontMenu_font_doublesize].widget,
770 update_font_renderfont();
773 update_font_utf8_mode();
774 update_font_utf8_title();
776 #if OPT_ALLOW_XXX_OPS
777 update_menu_allowColorOps();
778 update_menu_allowFontOps();
779 update_menu_allowTcapOps();
780 update_menu_allowTitleOps();
781 update_menu_allowWindowOps();
782 enable_allow_xxx_ops(!(screen->allowSendEvents));
785 FindFontSelection(xw, NULL, True);
787 fontMenuEntries[fontMenu_fontsel].widget,
788 (screen->menu_font_names[fontMenu_fontsel]
794 if (created && tekWidget) {
795 set_tekfont_menu_item(TekScreenOf(tekWidget)->cur.fontsize, True);
813 HandleCreateMenu(Widget w,
815 String * params, /* mainMenu, vtMenu, or tekMenu */
816 Cardinal *param_count) /* 0 or 1 */
818 TRACE(("HandleCreateMenu\n"));
819 (void) domenu(w, event, params, param_count);
823 HandlePopupMenu(Widget w,
825 String * params, /* mainMenu, vtMenu, or tekMenu */
826 Cardinal *param_count) /* 0 or 1 */
828 TRACE(("HandlePopupMenu\n"));
829 if (domenu(w, event, params, param_count)) {
831 w = select_menu(w, mainMenu)->w;
833 XtCallActionProc(w, "XawPositionSimpleMenu", event, params, 1);
834 XtCallActionProc(w, "MenuPopup", event, params, 1);
839 * private interfaces - keep out!
844 handle_send_signal(Widget gw GCC_UNUSED, int sig)
847 TScreen *screen = TScreenOf(term);
852 kill_process_group(screen->pid, sig);
865 static Arg menuArgs =
866 {XtNleftBitmap, (XtArgVal) 0};
867 Widget mi = menu[which].widget;
870 menuArgs.value = (XtArgVal) ((val)
871 ? TScreenOf(term)->menu_item_bitmap
873 XtSetValues(mi, &menuArgs, (Cardinal) 1);
875 TRACE(("%s(%d): %s\n", func, which, BtoS(val)));
879 SetItemSensitivity(Widget mi, Bool val)
881 static Arg menuArgs =
882 {XtNsensitive, (XtArgVal) 0};
885 menuArgs.value = (XtArgVal) (val);
886 XtSetValues(mi, &menuArgs, (Cardinal) 1);
897 set_resize_increments(XtermWidget xw)
899 TScreen *screen = TScreenOf(xw);
900 int min_width = (2 * screen->border) + screen->fullVwin.sb_info.width;
901 int min_height = (2 * screen->border);
902 XSizeHints sizehints;
904 memset(&sizehints, 0, sizeof(XSizeHints));
905 sizehints.width_inc = FontWidth(screen);
906 sizehints.height_inc = FontHeight(screen);
907 sizehints.flags = PResizeInc;
908 XSetWMNormalHints(screen->display, VShellWindow(xw), &sizehints);
910 XtVaSetValues(SHELL_OF(xw),
911 XtNbaseWidth, min_width,
912 XtNbaseHeight, min_height,
913 XtNminWidth, min_width + FontWidth(screen),
914 XtNminHeight, min_height + FontHeight(screen),
915 XtNwidthInc, FontWidth(screen),
916 XtNheightInc, FontHeight(screen),
919 XFlush(XtDisplay(xw));
923 unset_resize_increments(XtermWidget xw)
925 TScreen *screen = TScreenOf(xw);
926 XSizeHints sizehints;
928 memset(&sizehints, 0, sizeof(XSizeHints));
929 sizehints.width_inc = 1;
930 sizehints.height_inc = 1;
931 sizehints.flags = PResizeInc;
932 XSetWMNormalHints(screen->display, VShellWindow(xw), &sizehints);
934 XtVaSetValues(SHELL_OF(xw),
939 XFlush(XtDisplay(xw));
943 netwm_fullscreen(XtermWidget xw, int operation)
945 TScreen *screen = TScreenOf(xw);
947 Display *dpy = screen->display;
948 Window window = VShellWindow(xw);
949 Atom atom_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
950 Atom atom_state = XInternAtom(dpy, "_NET_WM_STATE", False);
952 memset(&e, 0, sizeof(e));
953 e.xclient.type = ClientMessage;
954 e.xclient.message_type = atom_state;
955 e.xclient.display = dpy;
956 e.xclient.window = window;
957 e.xclient.format = 32;
958 e.xclient.data.l[0] = operation;
959 e.xclient.data.l[1] = (long) atom_fullscreen;
961 XSendEvent(dpy, DefaultRootWindow(dpy), False,
962 SubstructureRedirectMask, &e);
966 probe_netwm_fullscreen_capability(XtermWidget xw)
968 TScreen *screen = TScreenOf(xw);
969 Display *dpy = screen->display;
970 Atom atom_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
971 Atom atom_supported = XInternAtom(dpy, "_NET_SUPPORTED", False);
974 long long_offset = 0;
975 long long_length = 128; /* number of items to ask for at a time */
977 unsigned long nitems, bytes_after;
980 Boolean netwm_fullscreen_capability = False;
983 while (!netwm_fullscreen_capability) {
984 rc = XGetWindowProperty(dpy,
985 DefaultRootWindow(dpy),
989 False, /* do not delete */
990 AnyPropertyType, /* req_type */
991 &actual_type, /* actual_type_return */
992 &actual_format, /* actual_format_return */
993 &nitems, /* nitems_return */
994 &bytes_after, /* bytes_after_return */
995 &args /* prop_return */
998 || actual_type != XA_ATOM) {
1002 ldata = (CARD32 *) (void *) args;
1003 for (i = 0; i < nitems; i++) {
1004 if (ldata[i] == atom_fullscreen) {
1005 netwm_fullscreen_capability = True;
1011 if (!netwm_fullscreen_capability) {
1012 if (bytes_after != 0) {
1013 long remaining = (long) (bytes_after / sizeof(CARD32));
1014 if (long_length > remaining)
1015 long_length = remaining;
1016 long_offset += (long) nitems;
1023 return netwm_fullscreen_capability;
1027 do_fullscreen(Widget gw GCC_UNUSED,
1028 XtPointer closure GCC_UNUSED,
1029 XtPointer data GCC_UNUSED)
1031 XtermWidget xw = term;
1032 TScreen *screen = TScreenOf(xw);
1034 static Boolean initialized = False;
1035 static Boolean netwm_fullscreen_capability = False;
1039 netwm_fullscreen_capability = probe_netwm_fullscreen_capability(xw);
1042 if (netwm_fullscreen_capability) {
1043 if (screen->fullscreen) {
1044 set_resize_increments(xw);
1045 netwm_fullscreen(xw, 0);
1047 unset_resize_increments(xw);
1048 netwm_fullscreen(xw, 1);
1050 screen->fullscreen = !screen->fullscreen;
1051 update_fullscreen();
1053 Bell(xw, XkbBI_MinorError, 100);
1059 HandleFullscreen(Widget w,
1060 XEvent * event GCC_UNUSED,
1061 String * params GCC_UNUSED,
1062 Cardinal *param_count GCC_UNUSED)
1064 do_fullscreen(w, (XtPointer) 0, (XtPointer) 0);
1068 update_fullscreen(void)
1070 UpdateCheckbox("update_fullscreen",
1072 mainMenu_fullscreen,
1073 TScreenOf(term)->fullscreen);
1076 #endif /* OPT_MAXIMIZE */
1079 do_securekbd(Widget gw GCC_UNUSED,
1080 XtPointer closure GCC_UNUSED,
1081 XtPointer data GCC_UNUSED)
1083 XtermWidget xw = term;
1084 TScreen *screen = TScreenOf(xw);
1085 Time now = CurrentTime; /* XXX - wrong */
1087 if (screen->grabbedKbd) {
1088 XUngrabKeyboard(screen->display, now);
1090 screen->grabbedKbd = False;
1092 if (XGrabKeyboard(screen->display, XtWindow(CURRENT_EMU()),
1093 True, GrabModeAsync, GrabModeAsync, now)
1095 Bell(xw, XkbBI_MinorError, 100);
1098 screen->grabbedKbd = True;
1106 HandleSecure(Widget w GCC_UNUSED,
1107 XEvent * event GCC_UNUSED, /* unused */
1108 String * params GCC_UNUSED, /* [0] = volume */
1109 Cardinal *param_count GCC_UNUSED) /* 0 or 1 */
1112 Time ev_time = CurrentTime;
1114 if ((event->xany.type == KeyPress) ||
1115 (event->xany.type == KeyRelease))
1116 ev_time = event->xkey.time;
1117 else if ((event->xany.type == ButtonPress) ||
1118 (event->xany.type == ButtonRelease))
1119 ev_time = event->xbutton.time;
1121 do_securekbd(vt_shell[mainMenu].w, (XtPointer) 0, (XtPointer) 0);
1125 do_allowsends(Widget gw GCC_UNUSED,
1126 XtPointer closure GCC_UNUSED,
1127 XtPointer data GCC_UNUSED)
1129 TScreen *screen = TScreenOf(term);
1131 ToggleFlag(screen->allowSendEvents);
1132 update_allowsends();
1133 #if OPT_ALLOW_XXX_OPS
1134 enable_allow_xxx_ops(!(screen->allowSendEvents));
1139 do_visualbell(Widget gw GCC_UNUSED,
1140 XtPointer closure GCC_UNUSED,
1141 XtPointer data GCC_UNUSED)
1143 TScreen *screen = TScreenOf(term);
1145 ToggleFlag(screen->visualbell);
1146 update_visualbell();
1150 do_bellIsUrgent(Widget gw GCC_UNUSED,
1151 XtPointer closure GCC_UNUSED,
1152 XtPointer data GCC_UNUSED)
1154 TScreen *screen = TScreenOf(term);
1156 ToggleFlag(screen->bellIsUrgent);
1157 update_bellIsUrgent();
1161 do_poponbell(Widget gw GCC_UNUSED,
1162 XtPointer closure GCC_UNUSED,
1163 XtPointer data GCC_UNUSED)
1165 TScreen *screen = TScreenOf(term);
1167 ToggleFlag(screen->poponbell);
1173 do_logging(Widget gw GCC_UNUSED,
1174 XtPointer closure GCC_UNUSED,
1175 XtPointer data GCC_UNUSED)
1177 XtermWidget xw = term;
1178 TScreen *screen = TScreenOf(xw);
1180 if (screen->logging) {
1185 /* update_logging done by CloseLog and StartLog */
1190 do_print(Widget gw GCC_UNUSED,
1191 XtPointer closure GCC_UNUSED,
1192 XtPointer data GCC_UNUSED)
1194 xtermPrintScreen(term, True, getPrinterFlags(term, NULL, 0));
1198 do_print_redir(Widget gw GCC_UNUSED,
1199 XtPointer closure GCC_UNUSED,
1200 XtPointer data GCC_UNUSED)
1202 setPrinterControlMode(term, TScreenOf(term)->printer_controlmode ? 0 : 2);
1206 do_redraw(Widget gw GCC_UNUSED,
1207 XtPointer closure GCC_UNUSED,
1208 XtPointer data GCC_UNUSED)
1214 show_8bit_control(Bool value)
1216 if (TScreenOf(term)->control_eight_bits != value) {
1217 TScreenOf(term)->control_eight_bits = (Boolean) value;
1218 update_8bit_control();
1223 do_8bit_control(Widget gw GCC_UNUSED,
1224 XtPointer closure GCC_UNUSED,
1225 XtPointer data GCC_UNUSED)
1227 show_8bit_control(!TScreenOf(term)->control_eight_bits);
1231 do_backarrow(Widget gw GCC_UNUSED,
1232 XtPointer closure GCC_UNUSED,
1233 XtPointer data GCC_UNUSED)
1235 term->keyboard.flags ^= MODE_DECBKM;
1241 do_num_lock(Widget gw GCC_UNUSED,
1242 XtPointer closure GCC_UNUSED,
1243 XtPointer data GCC_UNUSED)
1245 ToggleFlag(term->misc.real_NumLock);
1250 do_alt_esc(Widget gw GCC_UNUSED,
1251 XtPointer closure GCC_UNUSED,
1252 XtPointer data GCC_UNUSED)
1254 ToggleFlag(TScreenOf(term)->alt_sends_esc);
1259 do_meta_esc(Widget gw GCC_UNUSED,
1260 XtPointer closure GCC_UNUSED,
1261 XtPointer data GCC_UNUSED)
1263 ToggleFlag(TScreenOf(term)->meta_sends_esc);
1269 do_delete_del(Widget gw GCC_UNUSED,
1270 XtPointer closure GCC_UNUSED,
1271 XtPointer data GCC_UNUSED)
1273 if (xtermDeleteIsDEL(term))
1274 TScreenOf(term)->delete_is_del = False;
1276 TScreenOf(term)->delete_is_del = True;
1277 update_delete_del();
1281 do_old_fkeys(Widget gw GCC_UNUSED,
1282 XtPointer closure GCC_UNUSED,
1283 XtPointer data GCC_UNUSED)
1285 toggle_keyboard_type(term, keyboardIsLegacy);
1288 #if OPT_HP_FUNC_KEYS
1290 do_hp_fkeys(Widget gw GCC_UNUSED,
1291 XtPointer closure GCC_UNUSED,
1292 XtPointer data GCC_UNUSED)
1294 toggle_keyboard_type(term, keyboardIsHP);
1298 #if OPT_SCO_FUNC_KEYS
1300 do_sco_fkeys(Widget gw GCC_UNUSED,
1301 XtPointer closure GCC_UNUSED,
1302 XtPointer data GCC_UNUSED)
1304 toggle_keyboard_type(term, keyboardIsSCO);
1308 #if OPT_SUN_FUNC_KEYS
1310 do_sun_fkeys(Widget gw GCC_UNUSED,
1311 XtPointer closure GCC_UNUSED,
1312 XtPointer data GCC_UNUSED)
1314 toggle_keyboard_type(term, keyboardIsSun);
1320 * This really means "Sun/PC keyboard emulating VT220".
1323 do_sun_kbd(Widget gw GCC_UNUSED,
1324 XtPointer closure GCC_UNUSED,
1325 XtPointer data GCC_UNUSED)
1327 toggle_keyboard_type(term, keyboardIsVT220);
1333 do_tcap_fkeys(Widget gw GCC_UNUSED,
1334 XtPointer closure GCC_UNUSED,
1335 XtPointer data GCC_UNUSED)
1337 toggle_keyboard_type(term, keyboardIsTermcap);
1342 * The following cases use the pid instead of the process group so that we
1343 * don't get hosed by programs that change their process group
1348 do_suspend(Widget gw,
1349 XtPointer closure GCC_UNUSED,
1350 XtPointer data GCC_UNUSED)
1352 #if defined(SIGTSTP)
1353 handle_send_signal(gw, SIGTSTP);
1359 do_continue(Widget gw,
1360 XtPointer closure GCC_UNUSED,
1361 XtPointer data GCC_UNUSED)
1363 #if defined(SIGCONT)
1364 handle_send_signal(gw, SIGCONT);
1370 do_interrupt(Widget gw,
1371 XtPointer closure GCC_UNUSED,
1372 XtPointer data GCC_UNUSED)
1374 handle_send_signal(gw, SIGINT);
1379 do_hangup(Widget gw,
1380 XtPointer closure GCC_UNUSED,
1381 XtPointer data GCC_UNUSED)
1383 handle_send_signal(gw, SIGHUP);
1388 do_terminate(Widget gw,
1389 XtPointer closure GCC_UNUSED,
1390 XtPointer data GCC_UNUSED)
1392 handle_send_signal(gw, SIGTERM);
1398 XtPointer closure GCC_UNUSED,
1399 XtPointer data GCC_UNUSED)
1401 handle_send_signal(gw, SIGKILL);
1405 do_quit(Widget gw GCC_UNUSED,
1406 XtPointer closure GCC_UNUSED,
1407 XtPointer data GCC_UNUSED)
1417 do_scrollbar(Widget gw GCC_UNUSED,
1418 XtPointer closure GCC_UNUSED,
1419 XtPointer data GCC_UNUSED)
1421 ToggleScrollBar(term);
1425 do_jumpscroll(Widget gw GCC_UNUSED,
1426 XtPointer closure GCC_UNUSED,
1427 XtPointer data GCC_UNUSED)
1429 TScreen *screen = TScreenOf(term);
1431 term->flags ^= SMOOTHSCROLL;
1432 if (term->flags & SMOOTHSCROLL) {
1433 screen->jumpscroll = False;
1434 if (screen->scroll_amt)
1437 screen->jumpscroll = True;
1439 update_jumpscroll();
1443 do_reversevideo(Widget gw GCC_UNUSED,
1444 XtPointer closure GCC_UNUSED,
1445 XtPointer data GCC_UNUSED)
1451 do_autowrap(Widget gw GCC_UNUSED,
1452 XtPointer closure GCC_UNUSED,
1453 XtPointer data GCC_UNUSED)
1455 term->flags ^= WRAPAROUND;
1460 do_reversewrap(Widget gw GCC_UNUSED,
1461 XtPointer closure GCC_UNUSED,
1462 XtPointer data GCC_UNUSED)
1464 term->flags ^= REVERSEWRAP;
1465 update_reversewrap();
1469 do_autolinefeed(Widget gw GCC_UNUSED,
1470 XtPointer closure GCC_UNUSED,
1471 XtPointer data GCC_UNUSED)
1473 term->flags ^= LINEFEED;
1474 update_autolinefeed();
1478 do_appcursor(Widget gw GCC_UNUSED,
1479 XtPointer closure GCC_UNUSED,
1480 XtPointer data GCC_UNUSED)
1482 term->keyboard.flags ^= MODE_DECCKM;
1487 do_appkeypad(Widget gw GCC_UNUSED,
1488 XtPointer closure GCC_UNUSED,
1489 XtPointer data GCC_UNUSED)
1491 term->keyboard.flags ^= MODE_DECKPAM;
1496 do_scrollkey(Widget gw GCC_UNUSED,
1497 XtPointer closure GCC_UNUSED,
1498 XtPointer data GCC_UNUSED)
1500 TScreen *screen = TScreenOf(term);
1502 ToggleFlag(screen->scrollkey);
1507 do_scrollttyoutput(Widget gw GCC_UNUSED,
1508 XtPointer closure GCC_UNUSED,
1509 XtPointer data GCC_UNUSED)
1511 TScreen *screen = TScreenOf(term);
1513 ToggleFlag(screen->scrollttyoutput);
1514 update_scrollttyoutput();
1518 do_keepSelection(Widget gw GCC_UNUSED,
1519 XtPointer closure GCC_UNUSED,
1520 XtPointer data GCC_UNUSED)
1522 TScreen *screen = TScreenOf(term);
1524 ToggleFlag(screen->keepSelection);
1525 update_keepSelection();
1529 do_selectClipboard(Widget gw GCC_UNUSED,
1530 XtPointer closure GCC_UNUSED,
1531 XtPointer data GCC_UNUSED)
1533 TScreen *screen = TScreenOf(term);
1535 ToggleFlag(screen->selectToClipboard);
1536 update_selectToClipboard();
1540 do_allow132(Widget gw GCC_UNUSED,
1541 XtPointer closure GCC_UNUSED,
1542 XtPointer data GCC_UNUSED)
1544 TScreen *screen = TScreenOf(term);
1546 ToggleFlag(screen->c132);
1551 do_cursesemul(Widget gw GCC_UNUSED,
1552 XtPointer closure GCC_UNUSED,
1553 XtPointer data GCC_UNUSED)
1555 TScreen *screen = TScreenOf(term);
1557 ToggleFlag(screen->curses);
1558 update_cursesemul();
1562 do_marginbell(Widget gw GCC_UNUSED,
1563 XtPointer closure GCC_UNUSED,
1564 XtPointer data GCC_UNUSED)
1566 TScreen *screen = TScreenOf(term);
1568 if ((ToggleFlag(screen->marginbell)) == 0)
1569 screen->bellArmed = -1;
1570 update_marginbell();
1575 handle_tekshow(Widget gw GCC_UNUSED, Bool allowswitch)
1577 XtermWidget xw = term;
1578 TScreen *screen = TScreenOf(xw);
1580 TRACE(("Show tek-window\n"));
1581 if (!TEK4014_SHOWN(xw)) { /* not showing, turn on */
1582 set_tek_visibility(True);
1583 } else if (screen->Vshow || allowswitch) { /* is showing, turn off */
1584 set_tek_visibility(False);
1585 end_tek_mode(); /* WARNING: this does a longjmp */
1587 Bell(xw, XkbBI_MinorError, 0);
1592 do_tekshow(Widget gw,
1593 XtPointer closure GCC_UNUSED,
1594 XtPointer data GCC_UNUSED)
1596 handle_tekshow(gw, True);
1601 do_tekonoff(Widget gw,
1602 XtPointer closure GCC_UNUSED,
1603 XtPointer data GCC_UNUSED)
1605 handle_tekshow(gw, False);
1607 #endif /* OPT_TEK4014 */
1612 do_cursorblink(Widget gw GCC_UNUSED,
1613 XtPointer closure GCC_UNUSED,
1614 XtPointer data GCC_UNUSED)
1616 TScreen *screen = TScreenOf(term);
1617 ToggleCursorBlink(screen);
1623 do_altscreen(Widget gw GCC_UNUSED,
1624 XtPointer closure GCC_UNUSED,
1625 XtPointer data GCC_UNUSED)
1627 ToggleAlternate(term);
1632 do_titeInhibit(Widget gw GCC_UNUSED,
1633 XtPointer closure GCC_UNUSED,
1634 XtPointer data GCC_UNUSED)
1636 ToggleFlag(term->misc.titeInhibit);
1637 update_titeInhibit();
1640 #ifndef NO_ACTIVE_ICON
1643 do_activeicon(Widget gw GCC_UNUSED,
1644 XtPointer closure GCC_UNUSED,
1645 XtPointer data GCC_UNUSED)
1647 TScreen *screen = TScreenOf(term);
1649 if (screen->iconVwin.window) {
1650 Widget shell = XtParent(term);
1651 ToggleFlag(term->misc.active_icon);
1652 XtVaSetValues(shell, XtNiconWindow,
1653 term->misc.active_icon ? screen->iconVwin.window : None,
1655 update_activeicon();
1658 #endif /* NO_ACTIVE_ICON */
1661 do_softreset(Widget gw GCC_UNUSED,
1662 XtPointer closure GCC_UNUSED,
1663 XtPointer data GCC_UNUSED)
1665 VTReset(term, False, False);
1669 do_hardreset(Widget gw GCC_UNUSED,
1670 XtPointer closure GCC_UNUSED,
1671 XtPointer data GCC_UNUSED)
1673 VTReset(term, True, False);
1677 do_clearsavedlines(Widget gw GCC_UNUSED,
1678 XtPointer closure GCC_UNUSED,
1679 XtPointer data GCC_UNUSED)
1681 VTReset(term, True, True);
1686 do_tekmode(Widget gw GCC_UNUSED,
1687 XtPointer closure GCC_UNUSED,
1688 XtPointer data GCC_UNUSED)
1690 switch_modes(TEK4014_ACTIVE(term)); /* switch to tek mode */
1695 do_vthide(Widget gw GCC_UNUSED,
1696 XtPointer closure GCC_UNUSED,
1697 XtPointer data GCC_UNUSED)
1701 #endif /* OPT_TEK4014 */
1708 do_vtfont(Widget gw GCC_UNUSED,
1710 XtPointer data GCC_UNUSED)
1712 XtermWidget xw = term;
1713 char *entryname = (char *) closure;
1716 for (i = 0; i < NMENUFONTS; i++) {
1717 if (strcmp(entryname, fontMenuEntries[i].name) == 0) {
1718 SetVTFont(xw, i, True, NULL);
1722 Bell(xw, XkbBI_MinorError, 0);
1727 do_font_doublesize(Widget gw GCC_UNUSED,
1728 XtPointer closure GCC_UNUSED,
1729 XtPointer data GCC_UNUSED)
1731 XtermWidget xw = term;
1733 if (TScreenOf(xw)->cache_doublesize != 0)
1734 ToggleFlag(TScreenOf(xw)->font_doublesize);
1735 update_font_doublesize();
1742 do_font_boxchars(Widget gw GCC_UNUSED,
1743 XtPointer closure GCC_UNUSED,
1744 XtPointer data GCC_UNUSED)
1746 ToggleFlag(TScreenOf(term)->force_box_chars);
1747 update_font_boxchars();
1752 do_font_packed(Widget gw GCC_UNUSED,
1753 XtPointer closure GCC_UNUSED,
1754 XtPointer data GCC_UNUSED)
1756 ToggleFlag(TScreenOf(term)->force_packed);
1757 update_font_packed();
1758 SetVTFont(term, TScreenOf(term)->menu_font_number, True, NULL);
1762 #if OPT_DEC_SOFTFONT
1764 do_font_loadable(Widget gw GCC_UNUSED,
1765 XtPointer closure GCC_UNUSED,
1766 XtPointer data GCC_UNUSED)
1768 ToggleFlag(term->misc.font_loadable);
1769 update_font_loadable();
1775 do_font_renderfont(Widget gw GCC_UNUSED,
1776 XtPointer closure GCC_UNUSED,
1777 XtPointer data GCC_UNUSED)
1779 XtermWidget xw = (XtermWidget) term;
1780 TScreen *screen = TScreenOf(xw);
1781 int fontnum = screen->menu_font_number;
1782 String name = TScreenOf(xw)->MenuFontName(fontnum);
1784 DefaultRenderFont(xw);
1785 ToggleFlag(xw->misc.render_font);
1786 update_font_renderfont();
1787 xtermLoadFont(xw, xtermFontName(name), True, fontnum);
1788 ScrnRefresh(term, 0, 0,
1790 MaxCols(screen), True);
1796 do_font_utf8_mode(Widget gw GCC_UNUSED,
1797 XtPointer closure GCC_UNUSED,
1798 XtPointer data GCC_UNUSED)
1800 TScreen *screen = TScreenOf(term);
1803 * If xterm was started with -wc option, it might not have the wide fonts.
1804 * If xterm was not started with -wc, it might not have wide cells.
1806 if (!screen->utf8_mode) {
1807 if (screen->wide_chars) {
1808 if (xtermLoadWideFonts(term, True)) {
1809 SetVTFont(term, screen->menu_font_number, True, NULL);
1815 switchPtyData(screen, !screen->utf8_mode);
1817 * We don't repaint the screen when switching UTF-8 on/off. When switching
1818 * on - the Latin-1 codes should paint as-is. When switching off, that's
1819 * hard to do properly.
1824 do_font_utf8_title(Widget gw GCC_UNUSED,
1825 XtPointer closure GCC_UNUSED,
1826 XtPointer data GCC_UNUSED)
1828 TScreen *screen = TScreenOf(term);
1830 ToggleFlag(screen->utf8_title);
1831 update_font_utf8_title();
1841 do_tektextlarge(Widget gw,
1842 XtPointer closure GCC_UNUSED,
1843 XtPointer data GCC_UNUSED)
1845 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextlarge);
1849 do_tektext2(Widget gw,
1850 XtPointer closure GCC_UNUSED,
1851 XtPointer data GCC_UNUSED)
1853 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext2);
1857 do_tektext3(Widget gw,
1858 XtPointer closure GCC_UNUSED,
1859 XtPointer data GCC_UNUSED)
1861 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext3);
1865 do_tektextsmall(Widget gw,
1866 XtPointer closure GCC_UNUSED,
1867 XtPointer data GCC_UNUSED)
1869 TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextsmall);
1873 do_tekpage(Widget gw,
1874 XtPointer closure GCC_UNUSED,
1875 XtPointer data GCC_UNUSED)
1877 TekSimulatePageButton(getTekWidget(gw), False);
1881 do_tekreset(Widget gw,
1882 XtPointer closure GCC_UNUSED,
1883 XtPointer data GCC_UNUSED)
1885 TekSimulatePageButton(getTekWidget(gw), True);
1889 do_tekcopy(Widget gw,
1890 XtPointer closure GCC_UNUSED,
1891 XtPointer data GCC_UNUSED)
1893 TekCopy(getTekWidget(gw));
1897 handle_vtshow(Widget gw GCC_UNUSED, Bool allowswitch)
1899 XtermWidget xw = term;
1900 TScreen *screen = TScreenOf(xw);
1902 TRACE(("Show vt-window\n"));
1903 if (!screen->Vshow) { /* not showing, turn on */
1904 set_vt_visibility(True);
1905 } else if (TEK4014_SHOWN(xw) || allowswitch) { /* is showing, turn off */
1906 set_vt_visibility(False);
1907 if (!TEK4014_ACTIVE(xw) && tekRefreshList)
1908 TekRefresh(tekWidget);
1909 end_vt_mode(); /* WARNING: this does a longjmp... */
1911 Bell(xw, XkbBI_MinorError, 0);
1915 do_vtshow(Widget gw,
1916 XtPointer closure GCC_UNUSED,
1917 XtPointer data GCC_UNUSED)
1919 handle_vtshow(gw, True);
1923 do_vtonoff(Widget gw,
1924 XtPointer closure GCC_UNUSED,
1925 XtPointer data GCC_UNUSED)
1927 handle_vtshow(gw, False);
1931 do_vtmode(Widget gw GCC_UNUSED,
1932 XtPointer closure GCC_UNUSED,
1933 XtPointer data GCC_UNUSED)
1935 switch_modes(TEK4014_ACTIVE(term)); /* switch to vt, or from */
1940 do_tekhide(Widget gw GCC_UNUSED,
1941 XtPointer closure GCC_UNUSED,
1942 XtPointer data GCC_UNUSED)
1946 #endif /* OPT_TEK4014 */
1949 * public handler routines
1953 handle_toggle(void (*proc) PROTO_XT_CALLBACK_ARGS,
1961 XtermWidget xw = term;
1969 if (XmuCompareISOLatin1(params[0], "on") == 0)
1971 else if (XmuCompareISOLatin1(params[0], "off") == 0)
1973 else if (XmuCompareISOLatin1(params[0], "toggle") == 0)
1980 Bell(xw, XkbBI_MinorError, 0);
1984 (*proc) (w, closure, data);
1989 (*proc) (w, closure, data);
1991 Bell(xw, XkbBI_MinorError, 0);
1996 (*proc) (w, closure, data);
1998 Bell(xw, XkbBI_MinorError, 0);
2004 #define handle_vt_toggle(proc, var, params, nparams, w) \
2005 handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0)
2007 #define HANDLE_VT_TOGGLE(name) \
2008 handle_vt_toggle(do_##name, TScreenOf(term)->name, params, *param_count, w)
2010 #define handle_tek_toggle(proc, var, params, nparams, w) \
2011 handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0)
2014 HandleAllowSends(Widget w,
2015 XEvent * event GCC_UNUSED,
2017 Cardinal *param_count)
2019 handle_vt_toggle(do_allowsends, TScreenOf(term)->allowSendEvents,
2020 params, *param_count, w);
2024 HandleSetVisualBell(Widget w,
2025 XEvent * event GCC_UNUSED,
2027 Cardinal *param_count)
2029 HANDLE_VT_TOGGLE(visualbell);
2033 HandleSetPopOnBell(Widget w,
2034 XEvent * event GCC_UNUSED,
2036 Cardinal *param_count)
2038 HANDLE_VT_TOGGLE(poponbell);
2043 HandleLogging(Widget w,
2044 XEvent * event GCC_UNUSED,
2046 Cardinal *param_count)
2048 HANDLE_VT_TOGGLE(logging);
2054 HandlePrintScreen(Widget w GCC_UNUSED,
2055 XEvent * event GCC_UNUSED,
2056 String * params GCC_UNUSED,
2057 Cardinal *param_count GCC_UNUSED)
2059 xtermPrintScreen(term, True, getPrinterFlags(term, params, param_count));
2064 HandlePrintEverything(Widget w GCC_UNUSED,
2065 XEvent * event GCC_UNUSED,
2067 Cardinal *param_count)
2069 xtermPrintEverything(term, getPrinterFlags(term, params, param_count));
2074 HandlePrintControlMode(Widget w,
2075 XEvent * event GCC_UNUSED,
2076 String * params GCC_UNUSED,
2077 Cardinal *param_count GCC_UNUSED)
2079 do_print_redir(w, (XtPointer) 0, (XtPointer) 0);
2084 HandleRedraw(Widget w,
2085 XEvent * event GCC_UNUSED,
2086 String * params GCC_UNUSED,
2087 Cardinal *param_count GCC_UNUSED)
2089 do_redraw(w, (XtPointer) 0, (XtPointer) 0);
2094 HandleSendSignal(Widget w,
2095 XEvent * event GCC_UNUSED,
2097 Cardinal *param_count)
2100 static struct sigtab {
2105 { "suspend", SIGTSTP },
2106 { "tstp", SIGTSTP },
2109 { "cont", SIGCONT },
2113 { "quit", SIGQUIT },
2114 { "alrm", SIGALRM },
2115 { "alarm", SIGALRM },
2116 { "term", SIGTERM },
2117 { "kill", SIGKILL },
2122 if (*param_count == 1) {
2125 for (st = signals; st->name; st++) {
2126 if (XmuCompareISOLatin1(st->name, params[0]) == 0) {
2127 handle_send_signal(w, st->sig);
2131 /* one could allow numeric values, but that would be a security hole */
2134 Bell(term, XkbBI_MinorError, 0);
2139 HandleQuit(Widget w,
2140 XEvent * event GCC_UNUSED,
2141 String * params GCC_UNUSED,
2142 Cardinal *param_count GCC_UNUSED)
2144 do_quit(w, (XtPointer) 0, (XtPointer) 0);
2148 Handle8BitControl(Widget w,
2149 XEvent * event GCC_UNUSED,
2151 Cardinal *param_count)
2153 handle_vt_toggle(do_8bit_control, TScreenOf(term)->control_eight_bits,
2154 params, *param_count, w);
2158 HandleBackarrow(Widget w,
2159 XEvent * event GCC_UNUSED,
2161 Cardinal *param_count)
2163 handle_vt_toggle(do_backarrow, term->keyboard.flags & MODE_DECBKM,
2164 params, *param_count, w);
2167 #if OPT_SUN_FUNC_KEYS
2169 HandleSunFunctionKeys(Widget w,
2170 XEvent * event GCC_UNUSED,
2172 Cardinal *param_count)
2174 handle_vt_toggle(do_sun_fkeys, term->keyboard.type == keyboardIsSun,
2175 params, *param_count, w);
2181 HandleNumLock(Widget w,
2182 XEvent * event GCC_UNUSED,
2184 Cardinal *param_count)
2186 handle_vt_toggle(do_num_lock, term->misc.real_NumLock,
2187 params, *param_count, w);
2191 HandleAltEsc(Widget w,
2192 XEvent * event GCC_UNUSED,
2194 Cardinal *param_count)
2196 handle_vt_toggle(do_alt_esc, !TScreenOf(term)->input_eight_bits,
2197 params, *param_count, w);
2201 HandleMetaEsc(Widget w,
2202 XEvent * event GCC_UNUSED,
2204 Cardinal *param_count)
2206 handle_vt_toggle(do_meta_esc, TScreenOf(term)->meta_sends_esc,
2207 params, *param_count, w);
2212 HandleDeleteIsDEL(Widget w,
2213 XEvent * event GCC_UNUSED,
2215 Cardinal *param_count)
2217 handle_vt_toggle(do_delete_del, TScreenOf(term)->delete_is_del,
2218 params, *param_count, w);
2222 HandleOldFunctionKeys(Widget w,
2223 XEvent * event GCC_UNUSED,
2225 Cardinal *param_count)
2227 handle_vt_toggle(do_old_fkeys, term->keyboard.type == keyboardIsLegacy,
2228 params, *param_count, w);
2233 HandleSunKeyboard(Widget w,
2234 XEvent * event GCC_UNUSED,
2236 Cardinal *param_count)
2238 handle_vt_toggle(do_sun_kbd, term->keyboard.type == keyboardIsVT220,
2239 params, *param_count, w);
2243 #if OPT_HP_FUNC_KEYS
2245 HandleHpFunctionKeys(Widget w,
2246 XEvent * event GCC_UNUSED,
2248 Cardinal *param_count)
2250 handle_vt_toggle(do_hp_fkeys, term->keyboard.type == keyboardIsHP,
2251 params, *param_count, w);
2255 #if OPT_SCO_FUNC_KEYS
2257 HandleScoFunctionKeys(Widget w,
2258 XEvent * event GCC_UNUSED,
2260 Cardinal *param_count)
2262 handle_vt_toggle(do_sco_fkeys, term->keyboard.type == keyboardIsSCO,
2263 params, *param_count, w);
2268 HandleScrollbar(Widget w,
2269 XEvent * event GCC_UNUSED,
2271 Cardinal *param_count)
2273 XtermWidget xw = term;
2275 if (IsIcon(TScreenOf(xw))) {
2276 Bell(xw, XkbBI_MinorError, 0);
2278 handle_vt_toggle(do_scrollbar, TScreenOf(xw)->fullVwin.sb_info.width,
2279 params, *param_count, w);
2284 HandleJumpscroll(Widget w,
2285 XEvent * event GCC_UNUSED,
2287 Cardinal *param_count)
2289 HANDLE_VT_TOGGLE(jumpscroll);
2293 HandleKeepSelection(Widget w,
2294 XEvent * event GCC_UNUSED,
2296 Cardinal *param_count)
2298 HANDLE_VT_TOGGLE(keepSelection);
2302 HandleSetSelect(Widget w,
2303 XEvent * event GCC_UNUSED,
2305 Cardinal *param_count)
2307 handle_vt_toggle(do_selectClipboard, TScreenOf(term)->selectToClipboard,
2308 params, *param_count, w);
2312 HandleReverseVideo(Widget w,
2313 XEvent * event GCC_UNUSED,
2315 Cardinal *param_count)
2317 handle_vt_toggle(do_reversevideo, (term->misc.re_verse0),
2318 params, *param_count, w);
2322 HandleAutoWrap(Widget w,
2323 XEvent * event GCC_UNUSED,
2325 Cardinal *param_count)
2327 handle_vt_toggle(do_autowrap, (term->flags & WRAPAROUND),
2328 params, *param_count, w);
2332 HandleReverseWrap(Widget w,
2333 XEvent * event GCC_UNUSED,
2335 Cardinal *param_count)
2337 handle_vt_toggle(do_reversewrap, (term->flags & REVERSEWRAP),
2338 params, *param_count, w);
2342 HandleAutoLineFeed(Widget w,
2343 XEvent * event GCC_UNUSED,
2345 Cardinal *param_count)
2347 handle_vt_toggle(do_autolinefeed, (term->flags & LINEFEED),
2348 params, *param_count, w);
2352 HandleAppCursor(Widget w,
2353 XEvent * event GCC_UNUSED,
2355 Cardinal *param_count)
2357 handle_vt_toggle(do_appcursor, (term->keyboard.flags & MODE_DECCKM),
2358 params, *param_count, w);
2362 HandleAppKeypad(Widget w,
2363 XEvent * event GCC_UNUSED,
2365 Cardinal *param_count)
2367 handle_vt_toggle(do_appkeypad, (term->keyboard.flags & MODE_DECKPAM),
2368 params, *param_count, w);
2372 HandleScrollKey(Widget w,
2373 XEvent * event GCC_UNUSED,
2375 Cardinal *param_count)
2377 HANDLE_VT_TOGGLE(scrollkey);
2381 HandleScrollTtyOutput(Widget w,
2382 XEvent * event GCC_UNUSED,
2384 Cardinal *param_count)
2386 HANDLE_VT_TOGGLE(scrollttyoutput);
2390 HandleAllow132(Widget w,
2391 XEvent * event GCC_UNUSED,
2393 Cardinal *param_count)
2395 handle_vt_toggle(do_allow132, TScreenOf(term)->c132,
2396 params, *param_count, w);
2400 HandleCursesEmul(Widget w,
2401 XEvent * event GCC_UNUSED,
2403 Cardinal *param_count)
2405 handle_vt_toggle(do_cursesemul, TScreenOf(term)->curses,
2406 params, *param_count, w);
2410 HandleBellIsUrgent(Widget w,
2411 XEvent * event GCC_UNUSED,
2413 Cardinal *param_count)
2415 HANDLE_VT_TOGGLE(bellIsUrgent);
2419 HandleMarginBell(Widget w,
2420 XEvent * event GCC_UNUSED,
2422 Cardinal *param_count)
2424 HANDLE_VT_TOGGLE(marginbell);
2429 HandleCursorBlink(Widget w,
2430 XEvent * event GCC_UNUSED,
2432 Cardinal *param_count)
2434 /* eventually want to see if sensitive or not */
2435 handle_vt_toggle(do_cursorblink, TScreenOf(term)->cursor_blink,
2436 params, *param_count, w);
2441 HandleAltScreen(Widget w,
2442 XEvent * event GCC_UNUSED,
2444 Cardinal *param_count)
2446 /* eventually want to see if sensitive or not */
2447 handle_vt_toggle(do_altscreen, TScreenOf(term)->whichBuf,
2448 params, *param_count, w);
2452 HandleTiteInhibit(Widget w,
2453 XEvent * event GCC_UNUSED,
2455 Cardinal *param_count)
2457 /* eventually want to see if sensitive or not */
2458 handle_vt_toggle(do_titeInhibit, !(term->misc.titeInhibit),
2459 params, *param_count, w);
2464 HandleSoftReset(Widget w,
2465 XEvent * event GCC_UNUSED,
2466 String * params GCC_UNUSED,
2467 Cardinal *param_count GCC_UNUSED)
2469 do_softreset(w, (XtPointer) 0, (XtPointer) 0);
2474 HandleHardReset(Widget w,
2475 XEvent * event GCC_UNUSED,
2476 String * params GCC_UNUSED,
2477 Cardinal *param_count GCC_UNUSED)
2479 do_hardreset(w, (XtPointer) 0, (XtPointer) 0);
2484 HandleClearSavedLines(Widget w,
2485 XEvent * event GCC_UNUSED,
2486 String * params GCC_UNUSED,
2487 Cardinal *param_count GCC_UNUSED)
2489 do_clearsavedlines(w, (XtPointer) 0, (XtPointer) 0);
2494 HandleFontDoublesize(Widget w,
2495 XEvent * event GCC_UNUSED,
2497 Cardinal *param_count)
2499 HANDLE_VT_TOGGLE(font_doublesize);
2505 HandleFontBoxChars(Widget w,
2506 XEvent * event GCC_UNUSED,
2508 Cardinal *param_count)
2510 handle_vt_toggle(do_font_boxchars, TScreenOf(term)->force_box_chars,
2511 params, *param_count, w);
2515 HandleFontPacked(Widget w,
2516 XEvent * event GCC_UNUSED,
2518 Cardinal *param_count)
2520 handle_vt_toggle(do_font_packed, TScreenOf(term)->force_packed,
2521 params, *param_count, w);
2525 #if OPT_DEC_SOFTFONT
2527 HandleFontLoading(Widget w,
2528 XEvent * event GCC_UNUSED,
2530 Cardinal *param_count)
2532 handle_vt_toggle(do_font_loadable, term->misc.font_loadable,
2533 params, *param_count, w);
2539 HandleRenderFont(Widget w,
2540 XEvent * event GCC_UNUSED,
2542 Cardinal *param_count)
2544 XtermWidget xw = (XtermWidget) term;
2546 DefaultRenderFont(xw);
2548 handle_vt_toggle(do_font_renderfont, xw->misc.render_font,
2549 params, *param_count, w);
2555 HandleUTF8Mode(Widget w,
2556 XEvent * event GCC_UNUSED,
2558 Cardinal *param_count)
2560 handle_vt_toggle(do_font_utf8_mode, TScreenOf(term)->utf8_mode,
2561 params, *param_count, w);
2565 HandleUTF8Title(Widget w,
2566 XEvent * event GCC_UNUSED,
2568 Cardinal *param_count)
2570 handle_vt_toggle(do_font_utf8_title, TScreenOf(term)->utf8_title,
2571 params, *param_count, w);
2577 HandleSetTerminalType(Widget w,
2578 XEvent * event GCC_UNUSED,
2580 Cardinal *param_count)
2582 XtermWidget xw = term;
2584 if (*param_count == 1) {
2585 switch (params[0][0]) {
2588 if (TEK4014_ACTIVE(xw))
2589 do_vtmode(w, (XtPointer) 0, (XtPointer) 0);
2593 if (!TEK4014_ACTIVE(xw))
2594 do_tekmode(w, (XtPointer) 0, (XtPointer) 0);
2597 Bell(xw, XkbBI_MinorError, 0);
2600 Bell(xw, XkbBI_MinorError, 0);
2605 HandleVisibility(Widget w,
2606 XEvent * event GCC_UNUSED,
2608 Cardinal *param_count)
2610 XtermWidget xw = term;
2612 if (*param_count == 2) {
2613 switch (params[0][0]) {
2616 handle_tek_toggle(do_vtonoff, (int) TScreenOf(xw)->Vshow,
2617 params + 1, (*param_count) - 1, w);
2621 handle_tek_toggle(do_tekonoff, (int) TEK4014_SHOWN(xw),
2622 params + 1, (*param_count) - 1, w);
2625 Bell(xw, XkbBI_MinorError, 0);
2628 Bell(xw, XkbBI_MinorError, 0);
2634 HandleSetTekText(Widget w,
2635 XEvent * event GCC_UNUSED,
2637 Cardinal *param_count)
2639 XtermWidget xw = term;
2640 void (*proc) PROTO_XT_CALLBACK_ARGS = 0;
2642 switch (*param_count) {
2644 proc = do_tektextlarge;
2647 switch (TekGetFontSize(params[0])) {
2648 case TEK_FONT_LARGE:
2649 proc = do_tektextlarge;
2657 case TEK_FONT_SMALL:
2658 proc = do_tektextsmall;
2664 (*proc) (w, (XtPointer) 0, (XtPointer) 0);
2666 Bell(xw, XkbBI_MinorError, 0);
2671 HandleTekPage(Widget w,
2672 XEvent * event GCC_UNUSED,
2673 String * params GCC_UNUSED,
2674 Cardinal *param_count GCC_UNUSED)
2676 do_tekpage(w, (XtPointer) 0, (XtPointer) 0);
2681 HandleTekReset(Widget w,
2682 XEvent * event GCC_UNUSED,
2683 String * params GCC_UNUSED,
2684 Cardinal *param_count GCC_UNUSED)
2686 do_tekreset(w, (XtPointer) 0, (XtPointer) 0);
2691 HandleTekCopy(Widget w,
2692 XEvent * event GCC_UNUSED,
2693 String * params GCC_UNUSED,
2694 Cardinal *param_count GCC_UNUSED)
2696 do_tekcopy(w, (XtPointer) 0, (XtPointer) 0);
2698 #endif /* OPT_TEK4014 */
2702 * The normal style of xterm popup menu delays initialization until the menu is
2703 * first requested. When using a toolbar, we can use the same initialization,
2704 * though on the first popup there will be a little geometry layout jitter,
2705 * since the menu is already managed when this callback is invoked.
2708 InitPopup(Widget gw,
2710 XtPointer data GCC_UNUSED)
2715 params[0] = (char *) closure;
2717 TRACE(("InitPopup(%s)\n", params[0]));
2719 domenu(gw, (XEvent *) 0, params, &count);
2722 XtRemoveCallback(gw, XtNpopupCallback, InitPopup, closure);
2726 SetupShell(Widget *menus, MenuList * shell, int n, int m)
2729 char *external_name = 0;
2730 Dimension button_height;
2731 Dimension button_border;
2732 String saveLocale = setMenuLocale(True, resource.menuLocale);
2734 shell[n].w = XtVaCreatePopupShell(menu_names[n].internal_name,
2735 simpleMenuWidgetClass,
2740 XtAddCallback(shell[n].w, XtNpopupCallback, InitPopup, menu_names[n].internal_name);
2741 XtVaGetValues(shell[n].w,
2742 XtNlabel, &external_name,
2745 TRACE(("...SetupShell(%s) -> %s -> %#lx\n",
2746 menu_names[n].internal_name,
2748 (long) shell[n].w));
2750 sprintf(temp, "%sButton", menu_names[n].internal_name);
2751 shell[n].b = XtVaCreateManagedWidget(temp,
2752 menuButtonWidgetClass,
2754 XtNfromHoriz, ((m >= 0)
2757 XtNmenuName, menu_names[n].internal_name,
2758 XtNlabel, external_name,
2760 XtVaGetValues(shell[n].b,
2761 XtNheight, &button_height,
2762 XtNborderWidth, &button_border,
2765 (void) setMenuLocale(False, saveLocale);
2766 return (Dimension) (button_height + (button_border * 2));
2768 #endif /* OPT_TOOLBAR */
2771 SetupMenus(Widget shell, Widget *forms, Widget *menus, Dimension * menu_high)
2774 Dimension button_height = 0;
2775 Dimension toolbar_hSpace;
2779 TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014"));
2783 if (shell == toplevel) {
2784 XawSimpleMenuAddGlobalActions(app_con);
2785 XtRegisterGrabAction(HandlePopupMenu, True,
2786 (ButtonPressMask | ButtonReleaseMask),
2787 GrabModeAsync, GrabModeAsync);
2790 *forms = XtVaCreateManagedWidget("form",
2791 formWidgetClass, shell,
2793 xtermAddInput(*forms);
2796 * Set a nominal value for the preferred pane size, which lets the
2797 * buttons determine the actual height of the menu bar. We don't show
2798 * the grip, because it's too easy to make the toolbar look bad that
2801 XtSetArg(args[0], XtNorientation, XtorientHorizontal);
2802 XtSetArg(args[1], XtNtop, XawChainTop);
2803 XtSetArg(args[2], XtNbottom, XawChainTop);
2804 XtSetArg(args[3], XtNleft, XawChainLeft);
2805 XtSetArg(args[4], XtNright, XawChainLeft);
2807 if (resource.toolBar) {
2808 *menus = XtCreateManagedWidget("menubar", boxWidgetClass, *forms,
2811 *menus = XtCreateWidget("menubar", boxWidgetClass, *forms, args, 5);
2815 * The toolbar widget's height is not necessarily known yet. If the
2816 * toolbar is not created as a managed widget, we can still make a good
2817 * guess about its height by collecting the widget's other resource values.
2819 XtVaGetValues(*menus,
2820 XtNhSpace, &toolbar_hSpace,
2823 if (shell == toplevel) { /* vt100 */
2825 for (j = mainMenu; j <= fontMenu; j++) {
2826 button_height = SetupShell(menus, vt_shell, j, j - 1);
2830 else { /* tek4014 */
2831 (void) SetupShell(menus, tek_shell, mainMenu, -1);
2832 button_height = SetupShell(menus, tek_shell, tekMenu, mainMenu);
2837 * Tell the main program how high the toolbar is, to help with the initial
2840 *menu_high = (Dimension) (button_height + 2 * (toolbar_hSpace));
2841 TRACE(("...menuHeight:%d = (%d + 2 * %d)\n",
2842 *menu_high, button_height, toolbar_hSpace));
2844 #else /* !OPT_TOOLBAR */
2849 TRACE(("...shell=%#lx\n", (long) shell));
2850 TRACE(("...forms=%#lx\n", (long) *forms));
2851 TRACE(("...menus=%#lx\n", (long) *menus));
2855 repairSizeHints(void)
2857 XtermWidget xw = term;
2858 TScreen *screen = TScreenOf(xw);
2860 if (XtIsRealized((Widget) xw)) {
2861 getXtermSizeHints(xw);
2862 xtermSizeHints(xw, ScrollbarWidth(screen));
2864 XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints);
2869 #define INIT_POPUP(s, n) InitPopup(s[n].w, menu_names[n].internal_name, 0)
2872 InitWidgetMenu(Widget shell)
2874 Bool result = False;
2876 TRACE(("InitWidgetMenu(%p)\n", (void *) shell));
2878 if (shell == toplevel) { /* vt100 */
2879 if (!term->init_menu) {
2880 INIT_POPUP(vt_shell, mainMenu);
2881 INIT_POPUP(vt_shell, vtMenu);
2882 INIT_POPUP(vt_shell, fontMenu);
2883 term->init_menu = True;
2884 TRACE(("...InitWidgetMenu(vt)\n"));
2886 result = term->init_menu;
2889 else if (tekWidget) { /* tek4014 */
2890 if (!tekWidget->init_menu) {
2891 INIT_POPUP(tek_shell, mainMenu);
2892 INIT_POPUP(tek_shell, tekMenu);
2893 tekWidget->init_menu = True;
2894 TRACE(("...InitWidgetMenu(tek)\n"));
2896 result = tekWidget->init_menu;
2900 TRACE(("...InitWidgetMenu ->%d\n", result));
2905 toolbar_info(Widget w)
2907 TRACE(("...getting toolbar_info\n"));
2909 if (w != (Widget) term)
2910 return &(tekWidget->tek.tb_info);
2914 return &(WhichVWin(TScreenOf(term))->tb_info);
2918 hide_toolbar(Widget w)
2921 TbInfo *info = toolbar_info(w);
2923 TRACE(("hiding toolbar\n"));
2925 XtNfromVert, (Widget) 0,
2928 if (info->menu_bar != 0) {
2930 XtUnmanageChild(info->menu_bar);
2931 if (XtIsRealized(info->menu_bar)) {
2932 XtUnmapWidget(info->menu_bar);
2935 TRACE(("...hiding toolbar (done)\n"));
2940 show_toolbar(Widget w)
2943 TbInfo *info = toolbar_info(w);
2945 TRACE(("showing toolbar\n"));
2946 if (info->menu_bar != 0) {
2948 XtNfromVert, info->menu_bar,
2950 if (XtIsRealized(info->menu_bar))
2952 XtManageChild(info->menu_bar);
2953 if (XtIsRealized(info->menu_bar)) {
2954 XtMapWidget(info->menu_bar);
2958 * This is needed to make the terminal widget move down below the
2961 XawFormDoLayout(XtParent(w), True);
2962 TRACE(("...showing toolbar (done)\n"));
2967 * Make the toolbar visible or invisible in the current window(s).
2970 ShowToolbar(Bool enable)
2972 XtermWidget xw = term;
2974 TRACE(("ShowToolbar(%d)\n", enable));
2976 if (IsIcon(TScreenOf(xw))) {
2977 Bell(xw, XkbBI_MinorError, 0);
2980 if (InitWidgetMenu(toplevel))
2981 show_toolbar((Widget) xw);
2983 if (InitWidgetMenu(tekshellwidget))
2984 show_toolbar((Widget) tekWidget);
2987 hide_toolbar((Widget) xw);
2989 hide_toolbar((Widget) tekWidget);
2992 resource.toolBar = (Boolean) enable;
2998 HandleToolbar(Widget w,
2999 XEvent * event GCC_UNUSED,
3000 String * params GCC_UNUSED,
3001 Cardinal *param_count GCC_UNUSED)
3003 XtermWidget xw = term;
3005 if (IsIcon(TScreenOf(xw))) {
3006 Bell(xw, XkbBI_MinorError, 0);
3008 handle_vt_toggle(do_toolbar, resource.toolBar,
3009 params, *param_count, w);
3015 do_toolbar(Widget gw GCC_UNUSED,
3016 XtPointer closure GCC_UNUSED,
3017 XtPointer data GCC_UNUSED)
3019 XtermWidget xw = term;
3022 * Toggle toolbars for both vt100 and tek windows, since they share the
3023 * menu which contains the checkbox indicating whether the toolbar is
3026 if (IsIcon(TScreenOf(xw))) {
3027 Bell(xw, XkbBI_MinorError, 0);
3029 ShowToolbar(ToggleFlag(resource.toolBar));
3034 update_toolbar(void)
3036 UpdateCheckbox("update_toolbar",
3041 #endif /* OPT_TOOLBAR */
3044 update_securekbd(void)
3046 UpdateCheckbox("update_securekbd",
3049 TScreenOf(term)->grabbedKbd);
3053 update_allowsends(void)
3055 UpdateCheckbox("update_allowsends",
3057 mainMenu_allowsends,
3058 TScreenOf(term)->allowSendEvents);
3063 update_logging(void)
3065 UpdateCheckbox("update_logging",
3068 TScreenOf(term)->logging);
3073 update_print_redir(void)
3075 UpdateCheckbox("update_print_redir",
3077 mainMenu_print_redir,
3078 TScreenOf(term)->printer_controlmode);
3082 update_8bit_control(void)
3084 UpdateCheckbox("update_8bit_control",
3087 TScreenOf(term)->control_eight_bits);
3093 UpdateCheckbox("update_decbkm",
3096 (term->keyboard.flags & MODE_DECBKM) != 0);
3101 update_num_lock(void)
3103 UpdateCheckbox("update_num_lock",
3106 term->misc.real_NumLock);
3110 update_alt_esc(void)
3112 UpdateCheckbox("update_alt_esc",
3115 TScreenOf(term)->alt_sends_esc);
3119 update_meta_esc(void)
3121 UpdateCheckbox("update_meta_esc",
3124 TScreenOf(term)->meta_sends_esc);
3128 #if OPT_SUN_FUNC_KEYS
3130 update_sun_fkeys(void)
3132 UpdateCheckbox("update_sun_fkeys",
3135 term->keyboard.type == keyboardIsSun);
3141 update_tcap_fkeys(void)
3143 UpdateCheckbox("update_tcap_fkeys",
3145 mainMenu_tcap_fkeys,
3146 term->keyboard.type == keyboardIsTermcap);
3151 update_old_fkeys(void)
3153 UpdateCheckbox("update_old_fkeys",
3156 term->keyboard.type == keyboardIsLegacy);
3160 update_delete_del(void)
3162 UpdateCheckbox("update_delete_del",
3164 mainMenu_delete_del,
3165 xtermDeleteIsDEL(term));
3170 update_sun_kbd(void)
3172 UpdateCheckbox("update_sun_kbd",
3175 term->keyboard.type == keyboardIsVT220);
3179 #if OPT_HP_FUNC_KEYS
3181 update_hp_fkeys(void)
3183 UpdateCheckbox("update_hp_fkeys",
3186 term->keyboard.type == keyboardIsHP);
3190 #if OPT_SCO_FUNC_KEYS
3192 update_sco_fkeys(void)
3194 UpdateCheckbox("update_sco_fkeys",
3197 term->keyboard.type == keyboardIsSCO);
3202 update_scrollbar(void)
3204 UpdateCheckbox("update_scrollbar",
3207 ScrollbarWidth(TScreenOf(term)));
3211 update_jumpscroll(void)
3213 UpdateCheckbox("update_jumpscroll",
3216 TScreenOf(term)->jumpscroll);
3220 update_reversevideo(void)
3222 UpdateCheckbox("update_reversevideo",
3224 vtMenu_reversevideo,
3225 (term->misc.re_verse));
3229 update_autowrap(void)
3231 UpdateCheckbox("update_autowrap",
3234 (term->flags & WRAPAROUND) != 0);
3238 update_reversewrap(void)
3240 UpdateCheckbox("update_reversewrap",
3243 (term->flags & REVERSEWRAP) != 0);
3247 update_autolinefeed(void)
3249 UpdateCheckbox("update_autolinefeed",
3251 vtMenu_autolinefeed,
3252 (term->flags & LINEFEED) != 0);
3256 update_appcursor(void)
3258 UpdateCheckbox("update_appcursor",
3261 (term->keyboard.flags & MODE_DECCKM) != 0);
3265 update_appkeypad(void)
3267 UpdateCheckbox("update_appkeypad",
3270 (term->keyboard.flags & MODE_DECKPAM) != 0);
3274 update_scrollkey(void)
3276 UpdateCheckbox("update_scrollkey",
3279 TScreenOf(term)->scrollkey);
3283 update_scrollttyoutput(void)
3285 UpdateCheckbox("update_scrollttyoutput",
3287 vtMenu_scrollttyoutput,
3288 TScreenOf(term)->scrollttyoutput);
3292 update_keepSelection(void)
3294 UpdateCheckbox("update_keepSelection",
3296 vtMenu_keepSelection,
3297 TScreenOf(term)->keepSelection);
3301 update_selectToClipboard(void)
3303 UpdateCheckbox("update_selectToClipboard",
3305 vtMenu_selectToClipboard,
3306 TScreenOf(term)->selectToClipboard);
3310 update_allow132(void)
3312 UpdateCheckbox("update_allow132",
3315 TScreenOf(term)->c132);
3319 update_cursesemul(void)
3321 #if 0 /* 2006-2-12: no longer menu entry */
3322 UpdateMenuItem("update_cursesemul", vtMenuEntries, vtMenu_cursesemul,
3323 TScreenOf(term)->curses);
3328 update_visualbell(void)
3330 UpdateCheckbox("update_visualbell",
3333 TScreenOf(term)->visualbell);
3337 update_bellIsUrgent(void)
3339 UpdateCheckbox("update_bellIsUrgent",
3341 vtMenu_bellIsUrgent,
3342 TScreenOf(term)->bellIsUrgent);
3346 update_poponbell(void)
3348 UpdateCheckbox("update_poponbell",
3351 TScreenOf(term)->poponbell);
3354 #ifndef update_marginbell /* 2007-3-7: no longer menu entry */
3356 update_marginbell(void)
3358 UpdateCheckbox("update_marginbell",
3361 TScreenOf(term)->marginbell);
3367 update_cursorblink(void)
3369 UpdateCheckbox("update_cursorblink",
3372 TScreenOf(term)->cursor_blink);
3377 update_altscreen(void)
3379 UpdateCheckbox("update_altscreen",
3382 TScreenOf(term)->whichBuf);
3386 update_titeInhibit(void)
3388 UpdateCheckbox("update_titeInhibit",
3391 !(term->misc.titeInhibit));
3394 #ifndef NO_ACTIVE_ICON
3396 update_activeicon(void)
3398 UpdateCheckbox("update_activeicon",
3401 term->misc.active_icon);
3403 #endif /* NO_ACTIVE_ICON */
3407 update_font_doublesize(void)
3409 UpdateCheckbox("update_font_doublesize",
3411 fontMenu_font_doublesize,
3412 TScreenOf(term)->font_doublesize);
3418 update_font_boxchars(void)
3420 UpdateCheckbox("update_font_boxchars",
3422 fontMenu_font_boxchars,
3423 TScreenOf(term)->force_box_chars);
3427 update_font_packed(void)
3429 UpdateCheckbox("update_font_packed",
3431 fontMenu_font_packedfont,
3432 TScreenOf(term)->force_packed);
3436 #if OPT_DEC_SOFTFONT
3438 update_font_loadable(void)
3440 UpdateCheckbox("update_font_loadable",
3442 fontMenu_font_loadable,
3443 term->misc.font_loadable);
3449 update_font_renderfont(void)
3451 UpdateCheckbox("update_font_renderfont",
3453 fontMenu_render_font,
3454 (term->misc.render_font == True));
3455 SetItemSensitivity(fontMenuEntries[fontMenu_render_font].widget,
3456 !IsEmpty(term->misc.face_name));
3462 update_font_utf8_mode(void)
3464 Bool active = (TScreenOf(term)->utf8_mode != uAlways);
3465 Bool enable = (TScreenOf(term)->utf8_mode != uFalse);
3467 TRACE(("update_font_utf8_mode active %d, enable %d\n", active, enable));
3468 SetItemSensitivity(fontMenuEntries[fontMenu_wide_chars].widget, active);
3469 UpdateCheckbox("update_font_utf8_mode",
3471 fontMenu_wide_chars,
3476 update_font_utf8_title(void)
3478 Bool active = (TScreenOf(term)->utf8_mode != uFalse);
3479 Bool enable = (TScreenOf(term)->utf8_title);
3481 TRACE(("update_font_utf8_title active %d, enable %d\n", active, enable));
3482 SetItemSensitivity(fontMenuEntries[fontMenu_wide_title].widget, active);
3483 UpdateCheckbox("update_font_utf8_title",
3485 fontMenu_wide_title,
3490 #if OPT_ALLOW_XXX_OPS
3492 enable_allow_xxx_ops(Bool enable)
3494 SetItemSensitivity(fontMenuEntries[fontMenu_allowFontOps].widget, enable);
3495 SetItemSensitivity(fontMenuEntries[fontMenu_allowTcapOps].widget, enable);
3496 SetItemSensitivity(fontMenuEntries[fontMenu_allowTitleOps].widget, enable);
3497 SetItemSensitivity(fontMenuEntries[fontMenu_allowWindowOps].widget, enable);
3501 do_allowColorOps(Widget w,
3502 XtPointer closure GCC_UNUSED,
3503 XtPointer data GCC_UNUSED)
3505 XtermWidget xw = getXtermWidget(w);
3507 ToggleFlag(TScreenOf(xw)->allowColorOps);
3508 update_menu_allowColorOps();
3513 do_allowFontOps(Widget w,
3514 XtPointer closure GCC_UNUSED,
3515 XtPointer data GCC_UNUSED)
3517 XtermWidget xw = getXtermWidget(w);
3519 ToggleFlag(TScreenOf(xw)->allowFontOps);
3520 update_menu_allowFontOps();
3525 do_allowTcapOps(Widget w,
3526 XtPointer closure GCC_UNUSED,
3527 XtPointer data GCC_UNUSED)
3529 XtermWidget xw = getXtermWidget(w);
3531 ToggleFlag(TScreenOf(xw)->allowTcapOps);
3532 update_menu_allowTcapOps();
3537 do_allowTitleOps(Widget w,
3538 XtPointer closure GCC_UNUSED,
3539 XtPointer data GCC_UNUSED)
3541 XtermWidget xw = getXtermWidget(w);
3543 ToggleFlag(TScreenOf(xw)->allowTitleOps);
3544 update_menu_allowTitleOps();
3549 do_allowWindowOps(Widget w,
3550 XtPointer closure GCC_UNUSED,
3551 XtPointer data GCC_UNUSED)
3553 XtermWidget xw = getXtermWidget(w);
3555 ToggleFlag(TScreenOf(xw)->allowWindowOps);
3556 update_menu_allowWindowOps();
3561 HandleAllowColorOps(Widget w,
3562 XEvent * event GCC_UNUSED,
3564 Cardinal *param_count)
3566 HANDLE_VT_TOGGLE(allowColorOps);
3570 HandleAllowFontOps(Widget w,
3571 XEvent * event GCC_UNUSED,
3573 Cardinal *param_count)
3575 HANDLE_VT_TOGGLE(allowFontOps);
3579 HandleAllowTcapOps(Widget w,
3580 XEvent * event GCC_UNUSED,
3582 Cardinal *param_count)
3584 HANDLE_VT_TOGGLE(allowTcapOps);
3588 HandleAllowTitleOps(Widget w,
3589 XEvent * event GCC_UNUSED,
3591 Cardinal *param_count)
3593 HANDLE_VT_TOGGLE(allowTitleOps);
3597 HandleAllowWindowOps(Widget w,
3598 XEvent * event GCC_UNUSED,
3600 Cardinal *param_count)
3602 HANDLE_VT_TOGGLE(allowWindowOps);
3606 update_menu_allowColorOps(void)
3608 UpdateCheckbox("update_menu_allowColorOps",
3610 fontMenu_allowColorOps,
3611 TScreenOf(term)->allowColorOps);
3615 update_menu_allowFontOps(void)
3617 UpdateCheckbox("update_menu_allowFontOps",
3619 fontMenu_allowFontOps,
3620 TScreenOf(term)->allowFontOps);
3624 update_menu_allowTcapOps(void)
3626 UpdateCheckbox("update_menu_allowTcapOps",
3628 fontMenu_allowTcapOps,
3629 TScreenOf(term)->allowTcapOps);
3633 update_menu_allowTitleOps(void)
3635 UpdateCheckbox("update_menu_allowTitleOps",
3637 fontMenu_allowTitleOps,
3638 TScreenOf(term)->allowTitleOps);
3642 update_menu_allowWindowOps(void)
3644 UpdateCheckbox("update_menu_allowWindowOps",
3646 fontMenu_allowWindowOps,
3647 TScreenOf(term)->allowWindowOps);
3653 update_tekshow(void)
3655 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3656 UpdateCheckbox("update_tekshow",
3659 TEK4014_SHOWN(term));
3664 update_vttekmode(void)
3666 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3667 UpdateCheckbox("update_vtmode",
3670 TEK4014_ACTIVE(term));
3671 UpdateCheckbox("update_tekmode",
3674 !TEK4014_ACTIVE(term));
3681 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3682 UpdateCheckbox("update_vtshow",
3685 TScreenOf(term)->Vshow);
3690 set_vthide_sensitivity(void)
3692 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3694 vtMenuEntries[vtMenu_vthide].widget,
3695 TEK4014_SHOWN(term));
3700 set_tekhide_sensitivity(void)
3702 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3704 tekMenuEntries[tekMenu_tekhide].widget,
3705 TScreenOf(term)->Vshow);
3710 set_tekfont_menu_item(int n, int val)
3712 if (!(TScreenOf(term)->inhibit & I_TEK)) {
3713 UpdateCheckbox("set_tekfont_menu_item", tekMenuEntries, FS2MI(n),
3717 #endif /* OPT_TEK4014 */
3720 set_menu_font(int val)
3722 UpdateCheckbox("set_menu_font",
3724 TScreenOf(term)->menu_font_number,