charproc.c revision 2eaa94a1
12eaa94a1Schristos/* $XTermId: charproc.c,v 1.865 2008/12/30 14:45:41 tom Exp $ */ 2d522f475Smrg 3d522f475Smrg/* 4d522f475Smrg 5d522f475SmrgCopyright 1999-2007,2008 by Thomas E. Dickey 6d522f475Smrg 7d522f475Smrg All Rights Reserved 8d522f475Smrg 9d522f475SmrgPermission is hereby granted, free of charge, to any person obtaining a 10d522f475Smrgcopy of this software and associated documentation files (the 11d522f475Smrg"Software"), to deal in the Software without restriction, including 12d522f475Smrgwithout limitation the rights to use, copy, modify, merge, publish, 13d522f475Smrgdistribute, sublicense, and/or sell copies of the Software, and to 14d522f475Smrgpermit persons to whom the Software is furnished to do so, subject to 15d522f475Smrgthe following conditions: 16d522f475Smrg 17d522f475SmrgThe above copyright notice and this permission notice shall be included 18d522f475Smrgin all copies or substantial portions of the Software. 19d522f475Smrg 20d522f475SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21d522f475SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22d522f475SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23d522f475SmrgIN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 24d522f475SmrgCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25d522f475SmrgTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26d522f475SmrgSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27d522f475Smrg 28d522f475SmrgExcept as contained in this notice, the name(s) of the above copyright 29d522f475Smrgholders shall not be used in advertising or otherwise to promote the 30d522f475Smrgsale, use or other dealings in this Software without prior written 31d522f475Smrgauthorization. 32d522f475Smrg 33d522f475SmrgCopyright 1988 The Open Group 34d522f475Smrg 35d522f475SmrgPermission to use, copy, modify, distribute, and sell this software and its 36d522f475Smrgdocumentation for any purpose is hereby granted without fee, provided that 37d522f475Smrgthe above copyright notice appear in all copies and that both that 38d522f475Smrgcopyright notice and this permission notice appear in supporting 39d522f475Smrgdocumentation. 40d522f475Smrg 41d522f475SmrgThe above copyright notice and this permission notice shall be included in 42d522f475Smrgall copies or substantial portions of the Software. 43d522f475Smrg 44d522f475SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 45d522f475SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 46d522f475SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 47d522f475SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 48d522f475SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 49d522f475SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 50d522f475Smrg 51d522f475SmrgExcept as contained in this notice, the name of The Open Group shall not be 52d522f475Smrgused in advertising or otherwise to promote the sale, use or other dealings 53d522f475Smrgin this Software without prior written authorization from The Open Group. 54d522f475Smrg 55d522f475Smrg*/ 56d522f475Smrg/* 57d522f475Smrg * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. 58d522f475Smrg * 59d522f475Smrg * All Rights Reserved 60d522f475Smrg * 61d522f475Smrg * Permission to use, copy, modify, and distribute this software and its 62d522f475Smrg * documentation for any purpose and without fee is hereby granted, 63d522f475Smrg * provided that the above copyright notice appear in all copies and that 64d522f475Smrg * both that copyright notice and this permission notice appear in 65d522f475Smrg * supporting documentation, and that the name of Digital Equipment 66d522f475Smrg * Corporation not be used in advertising or publicity pertaining to 67d522f475Smrg * distribution of the software without specific, written prior permission. 68d522f475Smrg * 69d522f475Smrg * 70d522f475Smrg * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 71d522f475Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 72d522f475Smrg * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 73d522f475Smrg * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 74d522f475Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 75d522f475Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 76d522f475Smrg * SOFTWARE. 77d522f475Smrg */ 78d522f475Smrg 79d522f475Smrg/* charproc.c */ 80d522f475Smrg 81d522f475Smrg#include <version.h> 82d522f475Smrg#include <xterm.h> 83d522f475Smrg 84d522f475Smrg#include <X11/Xatom.h> 85d522f475Smrg#include <X11/Xutil.h> 86d522f475Smrg#include <X11/cursorfont.h> 87d522f475Smrg#include <X11/Xmu/Atoms.h> 88d522f475Smrg#include <X11/Xmu/CharSet.h> 89d522f475Smrg#include <X11/Xmu/Converters.h> 90d522f475Smrg 91d522f475Smrg#if OPT_INPUT_METHOD 92d522f475Smrg 93d522f475Smrg#if defined(HAVE_LIB_XAW) 94d522f475Smrg#include <X11/Xaw/XawImP.h> 95d522f475Smrg#elif defined(HAVE_LIB_XAW3D) 96d522f475Smrg#include <X11/Xaw3d/XawImP.h> 97d522f475Smrg#elif defined(HAVE_LIB_NEXTAW) 98d522f475Smrg#include <X11/neXtaw/XawImP.h> 99d522f475Smrg#elif defined(HAVE_LIB_XAWPLUS) 100d522f475Smrg#include <X11/XawPlus/XawImP.h> 101d522f475Smrg#endif 102d522f475Smrg 103d522f475Smrg#endif 104d522f475Smrg 105d522f475Smrg#if OPT_WIDE_CHARS 106d522f475Smrg#include <wcwidth.h> 107d522f475Smrg#include <precompose.h> 108d522f475Smrg#ifdef HAVE_LANGINFO_CODESET 109d522f475Smrg#include <langinfo.h> 110d522f475Smrg#endif 111d522f475Smrg#endif 112d522f475Smrg 113d522f475Smrg#if OPT_INPUT_METHOD 114d522f475Smrg#include <X11/Xlocale.h> 115d522f475Smrg#endif 116d522f475Smrg 117d522f475Smrg#include <stdio.h> 118d522f475Smrg#include <ctype.h> 119d522f475Smrg 120d522f475Smrg#if defined(HAVE_SCHED_YIELD) 121d522f475Smrg#include <sched.h> 122d522f475Smrg#endif 123d522f475Smrg 124d522f475Smrg#include <VTparse.h> 125d522f475Smrg#include <data.h> 126d522f475Smrg#include <error.h> 127d522f475Smrg#include <menu.h> 128d522f475Smrg#include <main.h> 129d522f475Smrg#include <fontutils.h> 130d522f475Smrg#include <xcharmouse.h> 131d522f475Smrg#include <charclass.h> 132d522f475Smrg#include <xstrings.h> 133d522f475Smrg 134d522f475Smrgstatic IChar doinput(void); 135d522f475Smrgstatic int set_character_class(char *s); 136d522f475Smrgstatic void FromAlternate(XtermWidget /* xw */ ); 137d522f475Smrgstatic void RequestResize(XtermWidget termw, int rows, int cols, Bool text); 138d522f475Smrgstatic void SwitchBufs(XtermWidget xw); 139d522f475Smrgstatic void ToAlternate(XtermWidget /* xw */ ); 140d522f475Smrgstatic void VTallocbuf(void); 141d522f475Smrgstatic void ansi_modes(XtermWidget termw, 142d522f475Smrg void (*func) (unsigned *p, unsigned mask)); 143d522f475Smrgstatic void bitclr(unsigned *p, unsigned mask); 144d522f475Smrgstatic void bitcpy(unsigned *p, unsigned q, unsigned mask); 145d522f475Smrgstatic void bitset(unsigned *p, unsigned mask); 146d522f475Smrgstatic void dpmodes(XtermWidget termw, void (*func) (unsigned *p, unsigned mask)); 147d522f475Smrgstatic void restoremodes(XtermWidget termw); 148d522f475Smrgstatic void savemodes(XtermWidget termw); 149d522f475Smrgstatic void window_ops(XtermWidget termw); 150d522f475Smrg 151d522f475Smrg#define DoStartBlinking(s) ((s)->cursor_blink ^ (s)->cursor_blink_esc) 152d522f475Smrg 153d522f475Smrg#if OPT_BLINK_CURS || OPT_BLINK_TEXT 154d522f475Smrgstatic void HandleBlinking(XtPointer closure, XtIntervalId * id); 155d522f475Smrgstatic void StartBlinking(TScreen * screen); 156d522f475Smrgstatic void StopBlinking(TScreen * screen); 157d522f475Smrg#else 158d522f475Smrg#define StartBlinking(screen) /* nothing */ 159d522f475Smrg#define StopBlinking(screen) /* nothing */ 160d522f475Smrg#endif 161d522f475Smrg 162d522f475Smrg#if OPT_INPUT_METHOD 163d522f475Smrgstatic void PreeditPosition(TScreen * screen); 164d522f475Smrg#endif 165d522f475Smrg 166d522f475Smrg#define DEFAULT -1 167d522f475Smrg#define BELLSUPPRESSMSEC 200 168d522f475Smrg 169d522f475Smrgstatic int nparam; 170d522f475Smrgstatic ANSI reply; 171d522f475Smrgstatic int param[NPARAM]; 172d522f475Smrg 173d522f475Smrgstatic jmp_buf vtjmpbuf; 174d522f475Smrg 175d522f475Smrg/* event handlers */ 176d522f475Smrgstatic void HandleBell PROTO_XT_ACTIONS_ARGS; 177d522f475Smrgstatic void HandleIgnore PROTO_XT_ACTIONS_ARGS; 178d522f475Smrgstatic void HandleKeymapChange PROTO_XT_ACTIONS_ARGS; 179d522f475Smrgstatic void HandleVisualBell PROTO_XT_ACTIONS_ARGS; 180d522f475Smrg#if HANDLE_STRUCT_NOTIFY 181d522f475Smrgstatic void HandleStructNotify PROTO_XT_EV_HANDLER_ARGS; 182d522f475Smrg#endif 183d522f475Smrg 184d522f475Smrg/* 185d522f475Smrg * NOTE: VTInitialize zeros out the entire ".screen" component of the 186d522f475Smrg * XtermWidget, so make sure to add an assignment statement in VTInitialize() 187d522f475Smrg * for each new ".screen" field added to this resource list. 188d522f475Smrg */ 189d522f475Smrg 190d522f475Smrg/* Defaults */ 191d522f475Smrg#if OPT_ISO_COLORS 192d522f475Smrg 193d522f475Smrg/* 194d522f475Smrg * If we default to colorMode enabled, compile-in defaults for the ANSI colors. 195d522f475Smrg */ 196d522f475Smrg#if DFT_COLORMODE 197d522f475Smrg#define DFT_COLOR(name) name 198d522f475Smrg#else 199d522f475Smrg#define DFT_COLOR(name) XtDefaultForeground 200d522f475Smrg#endif 201d522f475Smrg#endif 202d522f475Smrg 203d522f475Smrgstatic char *_Font_Selected_ = "yes"; /* string is arbitrary */ 204d522f475Smrg 205d522f475Smrgstatic char defaultTranslations[] = 206d522f475Smrg"\ 207d522f475Smrg Shift <KeyPress> Prior:scroll-back(1,halfpage) \n\ 208d522f475Smrg Shift <KeyPress> Next:scroll-forw(1,halfpage) \n\ 209d522f475Smrg Shift <KeyPress> Select:select-cursor-start() select-cursor-end(SELECT, CUT_BUFFER0) \n\ 210d522f475Smrg Shift <KeyPress> Insert:insert-selection(SELECT, CUT_BUFFER0) \n\ 211d522f475Smrg" 212d522f475Smrg#if OPT_SHIFT_FONTS 213d522f475Smrg"\ 214d522f475Smrg Shift~Ctrl <KeyPress> KP_Add:larger-vt-font() \n\ 215d522f475Smrg Shift Ctrl <KeyPress> KP_Add:smaller-vt-font() \n\ 216d522f475Smrg Shift <KeyPress> KP_Subtract:smaller-vt-font() \n\ 217d522f475Smrg" 218d522f475Smrg#endif 219d522f475Smrg"\ 220d522f475Smrg ~Meta <KeyPress>:insert-seven-bit() \n\ 221d522f475Smrg Meta <KeyPress>:insert-eight-bit() \n\ 222d522f475Smrg !Ctrl <Btn1Down>:popup-menu(mainMenu) \n\ 223d522f475Smrg !Lock Ctrl <Btn1Down>:popup-menu(mainMenu) \n\ 224d522f475Smrg !Lock Ctrl @Num_Lock <Btn1Down>:popup-menu(mainMenu) \n\ 225d522f475Smrg ! @Num_Lock Ctrl <Btn1Down>:popup-menu(mainMenu) \n\ 226d522f475Smrg ~Meta <Btn1Down>:select-start() \n\ 227d522f475Smrg ~Meta <Btn1Motion>:select-extend() \n\ 228d522f475Smrg !Ctrl <Btn2Down>:popup-menu(vtMenu) \n\ 229d522f475Smrg !Lock Ctrl <Btn2Down>:popup-menu(vtMenu) \n\ 230d522f475Smrg !Lock Ctrl @Num_Lock <Btn2Down>:popup-menu(vtMenu) \n\ 231d522f475Smrg ! @Num_Lock Ctrl <Btn2Down>:popup-menu(vtMenu) \n\ 232d522f475Smrg ~Ctrl ~Meta <Btn2Down>:ignore() \n\ 233d522f475Smrg Meta <Btn2Down>:clear-saved-lines() \n\ 234d522f475Smrg ~Ctrl ~Meta <Btn2Up>:insert-selection(SELECT, CUT_BUFFER0) \n\ 235d522f475Smrg !Ctrl <Btn3Down>:popup-menu(fontMenu) \n\ 236d522f475Smrg !Lock Ctrl <Btn3Down>:popup-menu(fontMenu) \n\ 237d522f475Smrg !Lock Ctrl @Num_Lock <Btn3Down>:popup-menu(fontMenu) \n\ 238d522f475Smrg ! @Num_Lock Ctrl <Btn3Down>:popup-menu(fontMenu) \n\ 239d522f475Smrg ~Ctrl ~Meta <Btn3Down>:start-extend() \n\ 240d522f475Smrg ~Meta <Btn3Motion>:select-extend() \n\ 241d522f475Smrg Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\ 242d522f475Smrg Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\ 243d522f475Smrg Lock @Num_Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\ 244d522f475Smrg @Num_Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\ 245d522f475Smrg <Btn4Down>:scroll-back(5,line,m) \n\ 246d522f475Smrg Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\ 247d522f475Smrg Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\ 248d522f475Smrg Lock @Num_Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\ 249d522f475Smrg @Num_Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\ 250d522f475Smrg <Btn5Down>:scroll-forw(5,line,m) \n\ 251d522f475Smrg <BtnUp>:select-end(SELECT, CUT_BUFFER0) \n\ 252d522f475Smrg <BtnDown>:ignore() \ 253d522f475Smrg"; /* PROCURA added "Meta <Btn2Down>:clear-saved-lines()" */ 254d522f475Smrg/* *INDENT-OFF* */ 255d522f475Smrgstatic XtActionsRec actionsList[] = { 256d522f475Smrg { "allow-send-events", HandleAllowSends }, 257d522f475Smrg { "bell", HandleBell }, 258d522f475Smrg { "clear-saved-lines", HandleClearSavedLines }, 259d522f475Smrg { "create-menu", HandleCreateMenu }, 260d522f475Smrg { "delete-is-del", HandleDeleteIsDEL }, 261d522f475Smrg { "dired-button", DiredButton }, 262d522f475Smrg { "hard-reset", HandleHardReset }, 263d522f475Smrg { "ignore", HandleIgnore }, 264d522f475Smrg { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */ 265d522f475Smrg { "insert-eight-bit", HandleEightBitKeyPressed }, 266d522f475Smrg { "insert-selection", HandleInsertSelection }, 267d522f475Smrg { "insert-seven-bit", HandleKeyPressed }, 268d522f475Smrg { "interpret", HandleInterpret }, 269d522f475Smrg { "keymap", HandleKeymapChange }, 270d522f475Smrg { "popup-menu", HandlePopupMenu }, 271d522f475Smrg { "print", HandlePrintScreen }, 272d522f475Smrg { "print-redir", HandlePrintControlMode }, 273d522f475Smrg { "quit", HandleQuit }, 274d522f475Smrg { "redraw", HandleRedraw }, 275d522f475Smrg { "scroll-back", HandleScrollBack }, 276d522f475Smrg { "scroll-forw", HandleScrollForward }, 277d522f475Smrg { "secure", HandleSecure }, 278d522f475Smrg { "select-cursor-end", HandleKeyboardSelectEnd }, 279d522f475Smrg { "select-cursor-extend", HandleKeyboardSelectExtend }, 280d522f475Smrg { "select-cursor-start", HandleKeyboardSelectStart }, 281d522f475Smrg { "select-end", HandleSelectEnd }, 282d522f475Smrg { "select-extend", HandleSelectExtend }, 283d522f475Smrg { "select-set", HandleSelectSet }, 284d522f475Smrg { "select-start", HandleSelectStart }, 285d522f475Smrg { "send-signal", HandleSendSignal }, 286d522f475Smrg { "set-8-bit-control", Handle8BitControl }, 287d522f475Smrg { "set-allow132", HandleAllow132 }, 288d522f475Smrg { "set-altscreen", HandleAltScreen }, 289d522f475Smrg { "set-appcursor", HandleAppCursor }, 290d522f475Smrg { "set-appkeypad", HandleAppKeypad }, 291d522f475Smrg { "set-autolinefeed", HandleAutoLineFeed }, 292d522f475Smrg { "set-autowrap", HandleAutoWrap }, 293d522f475Smrg { "set-backarrow", HandleBackarrow }, 294d522f475Smrg { "set-bellIsUrgent", HandleBellIsUrgent }, 295d522f475Smrg { "set-cursesemul", HandleCursesEmul }, 296d522f475Smrg { "set-jumpscroll", HandleJumpscroll }, 297d522f475Smrg { "set-keep-selection", HandleKeepSelection }, 298d522f475Smrg { "set-marginbell", HandleMarginBell }, 299d522f475Smrg { "set-old-function-keys", HandleOldFunctionKeys }, 300d522f475Smrg { "set-pop-on-bell", HandleSetPopOnBell }, 301d522f475Smrg { "set-reverse-video", HandleReverseVideo }, 302d522f475Smrg { "set-reversewrap", HandleReverseWrap }, 303d522f475Smrg { "set-scroll-on-key", HandleScrollKey }, 304d522f475Smrg { "set-scroll-on-tty-output", HandleScrollTtyOutput }, 305d522f475Smrg { "set-scrollbar", HandleScrollbar }, 306d522f475Smrg { "set-select", HandleSetSelect }, 307d522f475Smrg { "set-sun-keyboard", HandleSunKeyboard }, 308d522f475Smrg { "set-titeInhibit", HandleTiteInhibit }, 309d522f475Smrg { "set-visual-bell", HandleSetVisualBell }, 310d522f475Smrg { "set-vt-font", HandleSetFont }, 311d522f475Smrg { "soft-reset", HandleSoftReset }, 312d522f475Smrg { "start-cursor-extend", HandleKeyboardStartExtend }, 313d522f475Smrg { "start-extend", HandleStartExtend }, 314d522f475Smrg { "string", HandleStringEvent }, 315d522f475Smrg { "vi-button", ViButton }, 316d522f475Smrg { "visual-bell", HandleVisualBell }, 317d522f475Smrg#ifdef ALLOWLOGGING 318d522f475Smrg { "set-logging", HandleLogging }, 319d522f475Smrg#endif 320d522f475Smrg#if OPT_BLINK_CURS 321d522f475Smrg { "set-cursorblink", HandleCursorBlink }, 322d522f475Smrg#endif 323d522f475Smrg#if OPT_BOX_CHARS 324d522f475Smrg { "set-font-linedrawing", HandleFontBoxChars }, 325d522f475Smrg#endif 326d522f475Smrg#if OPT_DABBREV 327d522f475Smrg { "dabbrev-expand", HandleDabbrevExpand }, 328d522f475Smrg#endif 329d522f475Smrg#if OPT_DEC_CHRSET 330d522f475Smrg { "set-font-doublesize", HandleFontDoublesize }, 331d522f475Smrg#endif 332d522f475Smrg#if OPT_DEC_SOFTFONT 333d522f475Smrg { "set-font-loading", HandleFontLoading }, 334d522f475Smrg#endif 335d522f475Smrg#if OPT_EXEC_XTERM 336d522f475Smrg { "spawn-new-terminal", HandleSpawnTerminal }, 337d522f475Smrg#endif 338d522f475Smrg#if OPT_HP_FUNC_KEYS 339d522f475Smrg { "set-hp-function-keys", HandleHpFunctionKeys }, 340d522f475Smrg#endif 341d522f475Smrg#if OPT_LOAD_VTFONTS 342d522f475Smrg { "load-vt-fonts", HandleLoadVTFonts }, 343d522f475Smrg#endif 344d522f475Smrg#if OPT_MAXIMIZE 345d522f475Smrg { "deiconify", HandleDeIconify }, 346d522f475Smrg { "iconify", HandleIconify }, 347d522f475Smrg { "maximize", HandleMaximize }, 348d522f475Smrg { "restore", HandleRestoreSize }, 349d522f475Smrg#endif 350d522f475Smrg#if OPT_NUM_LOCK 351d522f475Smrg { "alt-sends-escape", HandleAltEsc }, 352d522f475Smrg { "meta-sends-escape", HandleMetaEsc }, 353d522f475Smrg { "set-num-lock", HandleNumLock }, 354d522f475Smrg#endif 355d522f475Smrg#if OPT_READLINE 356d522f475Smrg { "readline-button", ReadLineButton }, 357d522f475Smrg#endif 358d522f475Smrg#if OPT_RENDERFONT 359d522f475Smrg { "set-render-font", HandleRenderFont }, 360d522f475Smrg#endif 361d522f475Smrg#if OPT_SCO_FUNC_KEYS 362d522f475Smrg { "set-sco-function-keys", HandleScoFunctionKeys }, 363d522f475Smrg#endif 364d522f475Smrg#if OPT_SHIFT_FONTS 365d522f475Smrg { "larger-vt-font", HandleLargerFont }, 366d522f475Smrg { "smaller-vt-font", HandleSmallerFont }, 367d522f475Smrg#endif 368d522f475Smrg#if OPT_SUN_FUNC_KEYS 369d522f475Smrg { "set-sun-function-keys", HandleSunFunctionKeys }, 370d522f475Smrg#endif 371d522f475Smrg#if OPT_TEK4014 372d522f475Smrg { "set-terminal-type", HandleSetTerminalType }, 373d522f475Smrg { "set-visibility", HandleVisibility }, 374d522f475Smrg { "set-tek-text", HandleSetTekText }, 375d522f475Smrg { "tek-page", HandleTekPage }, 376d522f475Smrg { "tek-reset", HandleTekReset }, 377d522f475Smrg { "tek-copy", HandleTekCopy }, 378d522f475Smrg#endif 379d522f475Smrg#if OPT_TOOLBAR 380d522f475Smrg { "set-toolbar", HandleToolbar }, 381d522f475Smrg#endif 382d522f475Smrg#if OPT_WIDE_CHARS 383d522f475Smrg { "set-utf8-mode", HandleUTF8Mode }, 384d522f475Smrg { "set-utf8-title", HandleUTF8Title }, 385d522f475Smrg#endif 386d522f475Smrg}; 387d522f475Smrg/* *INDENT-ON* */ 388d522f475Smrg 389d522f475Smrgstatic XtResource resources[] = 390d522f475Smrg{ 391d522f475Smrg Bres(XtNallowSendEvents, XtCAllowSendEvents, screen.allowSendEvent0, False), 3922eaa94a1Schristos Bres(XtNallowFontOps, XtCAllowFontOps, screen.allowFontOp0, True), 3932eaa94a1Schristos Bres(XtNallowTcapOps, XtCAllowTcapOps, screen.allowTcapOp0, True), 394d522f475Smrg Bres(XtNallowTitleOps, XtCAllowTitleOps, screen.allowTitleOp0, True), 395d522f475Smrg Bres(XtNallowWindowOps, XtCAllowWindowOps, screen.allowWindowOp0, True), 396d522f475Smrg Bres(XtNaltIsNotMeta, XtCAltIsNotMeta, screen.alt_is_not_meta, False), 397d522f475Smrg Bres(XtNaltSendsEscape, XtCAltSendsEscape, screen.alt_sends_esc, False), 398d522f475Smrg Bres(XtNalwaysBoldMode, XtCAlwaysBoldMode, screen.always_bold_mode, False), 399d522f475Smrg Bres(XtNalwaysHighlight, XtCAlwaysHighlight, screen.always_highlight, False), 400d522f475Smrg Bres(XtNappcursorDefault, XtCAppcursorDefault, misc.appcursorDefault, False), 401d522f475Smrg Bres(XtNappkeypadDefault, XtCAppkeypadDefault, misc.appkeypadDefault, False), 402d522f475Smrg Bres(XtNautoWrap, XtCAutoWrap, misc.autoWrap, True), 403d522f475Smrg Bres(XtNawaitInput, XtCAwaitInput, screen.awaitInput, False), 404d522f475Smrg Bres(XtNfreeBoldBox, XtCFreeBoldBox, screen.free_bold_box, False), 405d522f475Smrg Bres(XtNbackarrowKey, XtCBackarrowKey, screen.backarrow_key, True), 406d522f475Smrg Bres(XtNbellIsUrgent, XtCBellIsUrgent, screen.bellIsUrgent, False), 407d522f475Smrg Bres(XtNbellOnReset, XtCBellOnReset, screen.bellOnReset, True), 408d522f475Smrg Bres(XtNboldMode, XtCBoldMode, screen.bold_mode, True), 409d522f475Smrg Bres(XtNbrokenSelections, XtCBrokenSelections, screen.brokenSelections, False), 410d522f475Smrg Bres(XtNc132, XtCC132, screen.c132, False), 411d522f475Smrg Bres(XtNcurses, XtCCurses, screen.curses, False), 412d522f475Smrg Bres(XtNcutNewline, XtCCutNewline, screen.cutNewline, True), 413d522f475Smrg Bres(XtNcutToBeginningOfLine, XtCCutToBeginningOfLine, 414d522f475Smrg screen.cutToBeginningOfLine, True), 415d522f475Smrg Bres(XtNdeleteIsDEL, XtCDeleteIsDEL, screen.delete_is_del, DEFDELETE_DEL), 416d522f475Smrg Bres(XtNdynamicColors, XtCDynamicColors, misc.dynamicColors, True), 417d522f475Smrg Bres(XtNeightBitControl, XtCEightBitControl, screen.control_eight_bits, False), 418d522f475Smrg Bres(XtNeightBitInput, XtCEightBitInput, screen.input_eight_bits, True), 419d522f475Smrg Bres(XtNeightBitOutput, XtCEightBitOutput, screen.output_eight_bits, True), 420d522f475Smrg Bres(XtNhighlightSelection, XtCHighlightSelection, 421d522f475Smrg screen.highlight_selection, False), 422d522f475Smrg Bres(XtNhpLowerleftBugCompat, XtCHpLowerleftBugCompat, screen.hp_ll_bc, False), 423d522f475Smrg Bres(XtNi18nSelections, XtCI18nSelections, screen.i18nSelections, True), 424d522f475Smrg Bres(XtNjumpScroll, XtCJumpScroll, screen.jumpscroll, True), 425d522f475Smrg Bres(XtNkeepSelection, XtCKeepSelection, screen.keepSelection, False), 426d522f475Smrg Bres(XtNloginShell, XtCLoginShell, misc.login_shell, False), 427d522f475Smrg Bres(XtNmarginBell, XtCMarginBell, screen.marginbell, False), 428d522f475Smrg Bres(XtNmetaSendsEscape, XtCMetaSendsEscape, screen.meta_sends_esc, False), 429d522f475Smrg Bres(XtNmultiScroll, XtCMultiScroll, screen.multiscroll, False), 430d522f475Smrg Bres(XtNoldXtermFKeys, XtCOldXtermFKeys, screen.old_fkeys, False), 431d522f475Smrg Bres(XtNpopOnBell, XtCPopOnBell, screen.poponbell, False), 432d522f475Smrg Bres(XtNprinterAutoClose, XtCPrinterAutoClose, screen.printer_autoclose, False), 433d522f475Smrg Bres(XtNprinterExtent, XtCPrinterExtent, screen.printer_extent, False), 434d522f475Smrg Bres(XtNprinterFormFeed, XtCPrinterFormFeed, screen.printer_formfeed, False), 435d522f475Smrg Bres(XtNquietGrab, XtCQuietGrab, screen.quiet_grab, False), 436d522f475Smrg Bres(XtNreverseVideo, XtCReverseVideo, misc.re_verse, False), 437d522f475Smrg Bres(XtNreverseWrap, XtCReverseWrap, misc.reverseWrap, False), 438d522f475Smrg Bres(XtNscrollBar, XtCScrollBar, misc.scrollbar, False), 439d522f475Smrg Bres(XtNscrollKey, XtCScrollCond, screen.scrollkey, False), 440d522f475Smrg Bres(XtNscrollTtyOutput, XtCScrollCond, screen.scrollttyoutput, True), 441d522f475Smrg Bres(XtNselectToClipboard, XtCSelectToClipboard, 442d522f475Smrg screen.selectToClipboard, False), 443d522f475Smrg Bres(XtNsignalInhibit, XtCSignalInhibit, misc.signalInhibit, False), 444d522f475Smrg Bres(XtNtiteInhibit, XtCTiteInhibit, misc.titeInhibit, False), 445d522f475Smrg Bres(XtNtiXtraScroll, XtCTiXtraScroll, misc.tiXtraScroll, False), 446d522f475Smrg Bres(XtNtrimSelection, XtCTrimSelection, screen.trim_selection, False), 447d522f475Smrg Bres(XtNunderLine, XtCUnderLine, screen.underline, True), 448d522f475Smrg Bres(XtNvisualBell, XtCVisualBell, screen.visualbell, False), 449d522f475Smrg 450d522f475Smrg Ires(XtNbellSuppressTime, XtCBellSuppressTime, screen.bellSuppressTime, BELLSUPPRESSMSEC), 451d522f475Smrg Ires(XtNinternalBorder, XtCBorderWidth, screen.border, DEFBORDER), 452d522f475Smrg Ires(XtNlimitResize, XtCLimitResize, misc.limit_resize, 1), 453d522f475Smrg Ires(XtNmultiClickTime, XtCMultiClickTime, screen.multiClickTime, MULTICLICKTIME), 454d522f475Smrg Ires(XtNnMarginBell, XtCColumn, screen.nmarginbell, N_MARGINBELL), 455d522f475Smrg Ires(XtNpointerMode, XtCPointerMode, screen.pointer_mode, DEF_POINTER_MODE), 456d522f475Smrg Ires(XtNprinterControlMode, XtCPrinterControlMode, 457d522f475Smrg screen.printer_controlmode, 0), 458d522f475Smrg Ires(XtNvisualBellDelay, XtCVisualBellDelay, screen.visualBellDelay, 100), 459d522f475Smrg Ires(XtNsaveLines, XtCSaveLines, screen.savelines, SAVELINES), 460d522f475Smrg Ires(XtNscrollBarBorder, XtCScrollBarBorder, screen.scrollBarBorder, 1), 461d522f475Smrg Ires(XtNscrollLines, XtCScrollLines, screen.scrolllines, SCROLLLINES), 462d522f475Smrg 463d522f475Smrg Sres(XtNinitialFont, XtCInitialFont, screen.initial_font, NULL), 464d522f475Smrg Sres(XtNfont1, XtCFont1, screen.MenuFontName(fontMenu_font1), NULL), 465d522f475Smrg Sres(XtNfont2, XtCFont2, screen.MenuFontName(fontMenu_font2), NULL), 466d522f475Smrg Sres(XtNfont3, XtCFont3, screen.MenuFontName(fontMenu_font3), NULL), 467d522f475Smrg Sres(XtNfont4, XtCFont4, screen.MenuFontName(fontMenu_font4), NULL), 468d522f475Smrg Sres(XtNfont5, XtCFont5, screen.MenuFontName(fontMenu_font5), NULL), 469d522f475Smrg Sres(XtNfont6, XtCFont6, screen.MenuFontName(fontMenu_font6), NULL), 470d522f475Smrg Sres(XtNanswerbackString, XtCAnswerbackString, screen.answer_back, ""), 471d522f475Smrg Sres(XtNboldFont, XtCBoldFont, misc.default_font.f_b, DEFBOLDFONT), 472d522f475Smrg Sres(XtNcharClass, XtCCharClass, screen.charClass, NULL), 473d522f475Smrg Sres(XtNdecTerminalID, XtCDecTerminalID, screen.term_id, DFT_DECID), 474d522f475Smrg Sres(XtNfont, XtCFont, misc.default_font.f_n, DEFFONT), 475d522f475Smrg Sres(XtNgeometry, XtCGeometry, misc.geo_metry, NULL), 476d522f475Smrg Sres(XtNkeyboardDialect, XtCKeyboardDialect, screen.keyboard_dialect, DFT_KBD_DIALECT), 477d522f475Smrg Sres(XtNprinterCommand, XtCPrinterCommand, screen.printer_command, ""), 478d522f475Smrg Sres(XtNtekGeometry, XtCGeometry, misc.T_geometry, NULL), 479d522f475Smrg 480d522f475Smrg Tres(XtNcursorColor, XtCCursorColor, TEXT_CURSOR, XtDefaultForeground), 481d522f475Smrg Tres(XtNforeground, XtCForeground, TEXT_FG, XtDefaultForeground), 482d522f475Smrg Tres(XtNpointerColor, XtCPointerColor, MOUSE_FG, XtDefaultForeground), 483d522f475Smrg Tres(XtNbackground, XtCBackground, TEXT_BG, XtDefaultBackground), 484d522f475Smrg Tres(XtNpointerColorBackground, XtCBackground, MOUSE_BG, XtDefaultBackground), 485d522f475Smrg 486d522f475Smrg {XtNresizeGravity, XtCResizeGravity, XtRGravity, sizeof(XtGravity), 487d522f475Smrg XtOffsetOf(XtermWidgetRec, misc.resizeGravity), 488d522f475Smrg XtRImmediate, (XtPointer) SouthWestGravity}, 489d522f475Smrg 490d522f475Smrg {XtNpointerShape, XtCCursor, XtRCursor, sizeof(Cursor), 491d522f475Smrg XtOffsetOf(XtermWidgetRec, screen.pointer_cursor), 492d522f475Smrg XtRString, (XtPointer) "xterm"}, 493d522f475Smrg 494d522f475Smrg#ifdef ALLOWLOGGING 495d522f475Smrg Bres(XtNlogInhibit, XtCLogInhibit, misc.logInhibit, False), 496d522f475Smrg Bres(XtNlogging, XtCLogging, misc.log_on, False), 497d522f475Smrg Sres(XtNlogFile, XtCLogfile, screen.logfile, NULL), 498d522f475Smrg#endif 499d522f475Smrg 500d522f475Smrg#ifndef NO_ACTIVE_ICON 501d522f475Smrg Bres("activeIcon", "ActiveIcon", misc.active_icon, False), 502d522f475Smrg Ires("iconBorderWidth", XtCBorderWidth, misc.icon_border_width, 2), 503d522f475Smrg Fres("iconFont", "IconFont", screen.fnt_icon.fs, XtDefaultFont), 504d522f475Smrg Cres("iconBorderColor", XtCBorderColor, misc.icon_border_pixel, XtDefaultBackground), 505d522f475Smrg#endif /* NO_ACTIVE_ICON */ 506d522f475Smrg 507d522f475Smrg#if OPT_BLINK_CURS 508d522f475Smrg Bres(XtNcursorBlink, XtCCursorBlink, screen.cursor_blink, False), 509d522f475Smrg#endif 5102eaa94a1Schristos Bres(XtNcursorUnderline, XtCCursorUnderline, screen.cursor_underline, False), 511d522f475Smrg 512d522f475Smrg#if OPT_BLINK_TEXT 513d522f475Smrg Bres(XtNshowBlinkAsBold, XtCCursorBlink, screen.blink_as_bold, DEFBLINKASBOLD), 514d522f475Smrg#endif 515d522f475Smrg 516d522f475Smrg#if OPT_BLINK_CURS || OPT_BLINK_TEXT 517d522f475Smrg Ires(XtNcursorOnTime, XtCCursorOnTime, screen.blink_on, 600), 518d522f475Smrg Ires(XtNcursorOffTime, XtCCursorOffTime, screen.blink_off, 300), 519d522f475Smrg#endif 520d522f475Smrg 521d522f475Smrg#if OPT_BOX_CHARS 522d522f475Smrg Bres(XtNforceBoxChars, XtCForceBoxChars, screen.force_box_chars, False), 523d522f475Smrg Bres(XtNshowMissingGlyphs, XtCShowMissingGlyphs, screen.force_all_chars, False), 524d522f475Smrg#endif 525d522f475Smrg 526d522f475Smrg#if OPT_BROKEN_OSC 527d522f475Smrg Bres(XtNbrokenLinuxOSC, XtCBrokenLinuxOSC, screen.brokenLinuxOSC, True), 528d522f475Smrg#endif 529d522f475Smrg 530d522f475Smrg#if OPT_BROKEN_ST 531d522f475Smrg Bres(XtNbrokenStringTerm, XtCBrokenStringTerm, screen.brokenStringTerm, True), 532d522f475Smrg#endif 533d522f475Smrg 534d522f475Smrg#if OPT_C1_PRINT 535d522f475Smrg Bres(XtNallowC1Printable, XtCAllowC1Printable, screen.c1_printable, False), 536d522f475Smrg#endif 537d522f475Smrg 538d522f475Smrg#if OPT_CLIP_BOLD 539d522f475Smrg Bres(XtNuseClipping, XtCUseClipping, screen.use_clipping, True), 540d522f475Smrg#endif 541d522f475Smrg 542d522f475Smrg#if OPT_DEC_CHRSET 543d522f475Smrg Bres(XtNfontDoublesize, XtCFontDoublesize, screen.font_doublesize, True), 544d522f475Smrg Ires(XtNcacheDoublesize, XtCCacheDoublesize, screen.cache_doublesize, NUM_CHRSET), 545d522f475Smrg#endif 546d522f475Smrg 547d522f475Smrg#if OPT_HIGHLIGHT_COLOR 548d522f475Smrg Tres(XtNhighlightColor, XtCHighlightColor, HIGHLIGHT_BG, XtDefaultForeground), 549d522f475Smrg Tres(XtNhighlightTextColor, XtCHighlightTextColor, HIGHLIGHT_FG, XtDefaultBackground), 550d522f475Smrg Bres(XtNhighlightReverse, XtCHighlightReverse, screen.hilite_reverse, True), 551d522f475Smrg Bres(XtNhighlightColorMode, XtCHighlightColorMode, screen.hilite_color, Maybe), 552d522f475Smrg#endif /* OPT_HIGHLIGHT_COLOR */ 553d522f475Smrg 554d522f475Smrg#if OPT_INPUT_METHOD 555d522f475Smrg Bres(XtNopenIm, XtCOpenIm, misc.open_im, True), 556d522f475Smrg Sres(XtNinputMethod, XtCInputMethod, misc.input_method, NULL), 557d522f475Smrg Sres(XtNpreeditType, XtCPreeditType, misc.preedit_type, 558d522f475Smrg "OverTheSpot,Root"), 559d522f475Smrg#endif 560d522f475Smrg 561d522f475Smrg#if OPT_ISO_COLORS 562d522f475Smrg Bres(XtNboldColors, XtCColorMode, screen.boldColors, True), 563d522f475Smrg Ires(XtNveryBoldColors, XtCVeryBoldColors, screen.veryBoldColors, 0), 564d522f475Smrg Bres(XtNcolorMode, XtCColorMode, screen.colorMode, DFT_COLORMODE), 565d522f475Smrg 566d522f475Smrg Bres(XtNcolorAttrMode, XtCColorAttrMode, screen.colorAttrMode, False), 567d522f475Smrg Bres(XtNcolorBDMode, XtCColorAttrMode, screen.colorBDMode, False), 568d522f475Smrg Bres(XtNcolorBLMode, XtCColorAttrMode, screen.colorBLMode, False), 569d522f475Smrg Bres(XtNcolorRVMode, XtCColorAttrMode, screen.colorRVMode, False), 570d522f475Smrg Bres(XtNcolorULMode, XtCColorAttrMode, screen.colorULMode, False), 571d522f475Smrg Bres(XtNitalicULMode, XtCColorAttrMode, screen.italicULMode, False), 572d522f475Smrg 573d522f475Smrg COLOR_RES("0", screen.Acolors[COLOR_0], DFT_COLOR("black")), 574d522f475Smrg COLOR_RES("1", screen.Acolors[COLOR_1], DFT_COLOR("red3")), 575d522f475Smrg COLOR_RES("2", screen.Acolors[COLOR_2], DFT_COLOR("green3")), 576d522f475Smrg COLOR_RES("3", screen.Acolors[COLOR_3], DFT_COLOR("yellow3")), 577d522f475Smrg COLOR_RES("4", screen.Acolors[COLOR_4], DFT_COLOR(DEF_COLOR4)), 578d522f475Smrg COLOR_RES("5", screen.Acolors[COLOR_5], DFT_COLOR("magenta3")), 579d522f475Smrg COLOR_RES("6", screen.Acolors[COLOR_6], DFT_COLOR("cyan3")), 580d522f475Smrg COLOR_RES("7", screen.Acolors[COLOR_7], DFT_COLOR("gray90")), 581d522f475Smrg COLOR_RES("8", screen.Acolors[COLOR_8], DFT_COLOR("gray50")), 582d522f475Smrg COLOR_RES("9", screen.Acolors[COLOR_9], DFT_COLOR("red")), 583d522f475Smrg COLOR_RES("10", screen.Acolors[COLOR_10], DFT_COLOR("green")), 584d522f475Smrg COLOR_RES("11", screen.Acolors[COLOR_11], DFT_COLOR("yellow")), 585d522f475Smrg COLOR_RES("12", screen.Acolors[COLOR_12], DFT_COLOR(DEF_COLOR12)), 586d522f475Smrg COLOR_RES("13", screen.Acolors[COLOR_13], DFT_COLOR("magenta")), 587d522f475Smrg COLOR_RES("14", screen.Acolors[COLOR_14], DFT_COLOR("cyan")), 588d522f475Smrg COLOR_RES("15", screen.Acolors[COLOR_15], DFT_COLOR("white")), 589d522f475Smrg COLOR_RES("BD", screen.Acolors[COLOR_BD], DFT_COLOR(XtDefaultForeground)), 590d522f475Smrg COLOR_RES("BL", screen.Acolors[COLOR_BL], DFT_COLOR(XtDefaultForeground)), 591d522f475Smrg COLOR_RES("UL", screen.Acolors[COLOR_UL], DFT_COLOR(XtDefaultForeground)), 592d522f475Smrg COLOR_RES("RV", screen.Acolors[COLOR_RV], DFT_COLOR(XtDefaultForeground)), 593d522f475Smrg 594d522f475Smrg CLICK_RES("2", screen.onClick[1], "word"), 595d522f475Smrg CLICK_RES("3", screen.onClick[2], "line"), 596d522f475Smrg CLICK_RES("4", screen.onClick[3], 0), 597d522f475Smrg CLICK_RES("5", screen.onClick[4], 0), 598d522f475Smrg 599d522f475Smrg#if !OPT_COLOR_RES2 600d522f475Smrg#if OPT_256_COLORS 601d522f475Smrg# include <256colres.h> 602d522f475Smrg#elif OPT_88_COLORS 603d522f475Smrg# include <88colres.h> 604d522f475Smrg#endif 605d522f475Smrg#endif /* !OPT_COLOR_RES2 */ 606d522f475Smrg 607d522f475Smrg#endif /* OPT_ISO_COLORS */ 608d522f475Smrg 609d522f475Smrg#if OPT_MOD_FKEYS 610d522f475Smrg Ires(XtNmodifyCursorKeys, XtCModifyCursorKeys, 611d522f475Smrg keyboard.modify_1st.cursor_keys, 2), 612d522f475Smrg Ires(XtNmodifyFunctionKeys, XtCModifyFunctionKeys, 613d522f475Smrg keyboard.modify_1st.function_keys, 2), 614d522f475Smrg Ires(XtNmodifyKeypadKeys, XtCModifyKeypadKeys, 615d522f475Smrg keyboard.modify_1st.keypad_keys, 0), 616d522f475Smrg Ires(XtNmodifyOtherKeys, XtCModifyOtherKeys, 617d522f475Smrg keyboard.modify_1st.other_keys, 0), 618d522f475Smrg Ires(XtNmodifyStringKeys, XtCModifyStringKeys, 619d522f475Smrg keyboard.modify_1st.string_keys, 0), 620d522f475Smrg Ires(XtNformatOtherKeys, XtCFormatOtherKeys, 621d522f475Smrg keyboard.format_keys, 0), 622d522f475Smrg#endif 623d522f475Smrg 624d522f475Smrg#if OPT_NUM_LOCK 625d522f475Smrg Bres(XtNalwaysUseMods, XtCAlwaysUseMods, misc.alwaysUseMods, False), 626d522f475Smrg Bres(XtNnumLock, XtCNumLock, misc.real_NumLock, True), 627d522f475Smrg#endif 628d522f475Smrg 629d522f475Smrg#if OPT_PRINT_COLORS 630d522f475Smrg Ires(XtNprintAttributes, XtCPrintAttributes, screen.print_attributes, 1), 631d522f475Smrg#endif 632d522f475Smrg 633d522f475Smrg#if OPT_SHIFT_FONTS 634d522f475Smrg Bres(XtNshiftFonts, XtCShiftFonts, misc.shift_fonts, True), 635d522f475Smrg#endif 636d522f475Smrg 637d522f475Smrg#if OPT_SUNPC_KBD 638d522f475Smrg Ires(XtNctrlFKeys, XtCCtrlFKeys, misc.ctrl_fkeys, 10), 639d522f475Smrg#endif 640d522f475Smrg 641d522f475Smrg#if OPT_TEK4014 642d522f475Smrg Bres(XtNtekInhibit, XtCTekInhibit, misc.tekInhibit, False), 643d522f475Smrg Bres(XtNtekSmall, XtCTekSmall, misc.tekSmall, False), 644d522f475Smrg Bres(XtNtekStartup, XtCTekStartup, misc.TekEmu, False), 645d522f475Smrg#endif 646d522f475Smrg 647d522f475Smrg#if OPT_TOOLBAR 648d522f475Smrg Wres(XtNmenuBar, XtCMenuBar, VT100_TB_INFO(menu_bar), 0), 649d522f475Smrg Ires(XtNmenuHeight, XtCMenuHeight, VT100_TB_INFO(menu_height), 25), 650d522f475Smrg#endif 651d522f475Smrg 652d522f475Smrg#if OPT_WIDE_CHARS 653d522f475Smrg Bres(XtNcjkWidth, XtCCjkWidth, misc.cjk_width, False), 654d522f475Smrg Bres(XtNmkWidth, XtCMkWidth, misc.mk_width, False), 655d522f475Smrg Bres(XtNutf8Latin1, XtCUtf8Latin1, screen.utf8_latin1, False), 656d522f475Smrg Bres(XtNutf8Title, XtCUtf8Title, screen.utf8_title, False), 657d522f475Smrg Bres(XtNvt100Graphics, XtCVT100Graphics, screen.vt100_graphics, True), 658d522f475Smrg Bres(XtNwideChars, XtCWideChars, screen.wide_chars, False), 659d522f475Smrg Ires(XtNcombiningChars, XtCCombiningChars, screen.max_combining, 2), 660d522f475Smrg Ires(XtNmkSamplePass, XtCMkSamplePass, misc.mk_samplepass, 256), 661d522f475Smrg Ires(XtNmkSampleSize, XtCMkSampleSize, misc.mk_samplesize, 1024), 662d522f475Smrg Ires(XtNutf8, XtCUtf8, screen.utf8_mode, uDefault), 663d522f475Smrg Sres(XtNwideBoldFont, XtCWideBoldFont, misc.default_font.f_wb, DEFWIDEBOLDFONT), 664d522f475Smrg Sres(XtNwideFont, XtCWideFont, misc.default_font.f_w, DEFWIDEFONT), 665d522f475Smrg#endif 666d522f475Smrg 667d522f475Smrg#if OPT_LUIT_PROG 668d522f475Smrg Sres(XtNlocale, XtCLocale, misc.locale_str, "medium"), 669d522f475Smrg Sres(XtNlocaleFilter, XtCLocaleFilter, misc.localefilter, DEFLOCALEFILTER), 670d522f475Smrg#endif 671d522f475Smrg 672d522f475Smrg#if OPT_INPUT_METHOD 673d522f475Smrg Sres(XtNximFont, XtCXimFont, misc.f_x, DEFXIMFONT), 674d522f475Smrg#endif 675d522f475Smrg 676d522f475Smrg#if OPT_XMC_GLITCH 677d522f475Smrg Bres(XtNxmcInline, XtCXmcInline, screen.xmc_inline, False), 678d522f475Smrg Bres(XtNxmcMoveSGR, XtCXmcMoveSGR, screen.move_sgr_ok, True), 679d522f475Smrg Ires(XtNxmcAttributes, XtCXmcAttributes, screen.xmc_attributes, 1), 680d522f475Smrg Ires(XtNxmcGlitch, XtCXmcGlitch, screen.xmc_glitch, 0), 681d522f475Smrg#endif 682d522f475Smrg 683d522f475Smrg#ifdef SCROLLBAR_RIGHT 684d522f475Smrg Bres(XtNrightScrollBar, XtCRightScrollBar, misc.useRight, False), 685d522f475Smrg#endif 686d522f475Smrg 687d522f475Smrg#if OPT_RENDERFONT 688d522f475Smrg#define RES_FACESIZE(n) Dres(XtNfaceSize #n, XtCFaceSize #n, misc.face_size[n], "0.0") 689d522f475Smrg RES_FACESIZE(1), 690d522f475Smrg RES_FACESIZE(2), 691d522f475Smrg RES_FACESIZE(3), 692d522f475Smrg RES_FACESIZE(4), 693d522f475Smrg RES_FACESIZE(5), 694d522f475Smrg RES_FACESIZE(6), 695d522f475Smrg Dres(XtNfaceSize, XtCFaceSize, misc.face_size[0], DEFFACESIZE), 696d522f475Smrg Sres(XtNfaceName, XtCFaceName, misc.face_name, DEFFACENAME), 697d522f475Smrg Sres(XtNfaceNameDoublesize, XtCFaceNameDoublesize, misc.face_wide_name, DEFFACENAME), 698d522f475Smrg Bres(XtNrenderFont, XtCRenderFont, misc.render_font, True), 699d522f475Smrg#endif 700d522f475Smrg}; 701d522f475Smrg 702d522f475Smrgstatic Boolean VTSetValues(Widget cur, Widget request, Widget new_arg, 703d522f475Smrg ArgList args, Cardinal *num_args); 704d522f475Smrgstatic void VTClassInit(void); 705d522f475Smrgstatic void VTDestroy(Widget w); 706d522f475Smrgstatic void VTExpose(Widget w, XEvent * event, Region region); 707d522f475Smrgstatic void VTInitialize(Widget wrequest, Widget new_arg, ArgList args, 708d522f475Smrg Cardinal *num_args); 709d522f475Smrgstatic void VTRealize(Widget w, XtValueMask * valuemask, 710d522f475Smrg XSetWindowAttributes * values); 711d522f475Smrgstatic void VTResize(Widget w); 712d522f475Smrg 713d522f475Smrg#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD 714d522f475Smrgstatic void VTInitI18N(void); 715d522f475Smrg#endif 716d522f475Smrg 717d522f475Smrg#ifdef VMS 718d522f475Smrgglobaldef { 719d522f475Smrg "xtermclassrec" 720d522f475Smrg} noshare 721d522f475Smrg 722d522f475Smrg#else 723d522f475Smrgstatic 724d522f475Smrg#endif /* VMS */ 725d522f475SmrgWidgetClassRec xtermClassRec = 726d522f475Smrg{ 727d522f475Smrg { 728d522f475Smrg/* core_class fields */ 729d522f475Smrg (WidgetClass) & widgetClassRec, /* superclass */ 730d522f475Smrg "VT100", /* class_name */ 731d522f475Smrg sizeof(XtermWidgetRec), /* widget_size */ 732d522f475Smrg VTClassInit, /* class_initialize */ 733d522f475Smrg NULL, /* class_part_initialize */ 734d522f475Smrg False, /* class_inited */ 735d522f475Smrg VTInitialize, /* initialize */ 736d522f475Smrg NULL, /* initialize_hook */ 737d522f475Smrg VTRealize, /* realize */ 738d522f475Smrg actionsList, /* actions */ 739d522f475Smrg XtNumber(actionsList), /* num_actions */ 740d522f475Smrg resources, /* resources */ 741d522f475Smrg XtNumber(resources), /* num_resources */ 742d522f475Smrg NULLQUARK, /* xrm_class */ 743d522f475Smrg True, /* compress_motion */ 744d522f475Smrg False, /* compress_exposure */ 745d522f475Smrg True, /* compress_enterleave */ 746d522f475Smrg False, /* visible_interest */ 747d522f475Smrg VTDestroy, /* destroy */ 748d522f475Smrg VTResize, /* resize */ 749d522f475Smrg VTExpose, /* expose */ 750d522f475Smrg VTSetValues, /* set_values */ 751d522f475Smrg NULL, /* set_values_hook */ 752d522f475Smrg XtInheritSetValuesAlmost, /* set_values_almost */ 753d522f475Smrg NULL, /* get_values_hook */ 754d522f475Smrg NULL, /* accept_focus */ 755d522f475Smrg XtVersion, /* version */ 756d522f475Smrg NULL, /* callback_offsets */ 757d522f475Smrg defaultTranslations, /* tm_table */ 758d522f475Smrg XtInheritQueryGeometry, /* query_geometry */ 759d522f475Smrg XtInheritDisplayAccelerator, /* display_accelerator */ 760d522f475Smrg NULL /* extension */ 761d522f475Smrg } 762d522f475Smrg}; 763d522f475Smrg 764d522f475Smrg#ifdef VMS 765d522f475Smrgglobaldef { 766d522f475Smrg "xtermwidgetclass" 767d522f475Smrg} 768d522f475Smrgnoshare 769d522f475Smrg#endif /* VMS */ 770d522f475SmrgWidgetClass xtermWidgetClass = (WidgetClass) & xtermClassRec; 771d522f475Smrg 772d522f475Smrg/* 773d522f475Smrg * Add input-actions for widgets that are overlooked (scrollbar and toolbar): 774d522f475Smrg * 775d522f475Smrg * a) Sometimes the scrollbar passes through translations, sometimes it 776d522f475Smrg * doesn't. We add the KeyPress translations here, just to be sure. 777d522f475Smrg * b) In the normal (non-toolbar) configuration, the xterm widget covers 778d522f475Smrg * almost all of the window. With a toolbar, there's a relatively 779d522f475Smrg * large area that the user would expect to enter keystrokes since the 780d522f475Smrg * program can get the focus. 781d522f475Smrg */ 782d522f475Smrgvoid 783d522f475SmrgxtermAddInput(Widget w) 784d522f475Smrg{ 785d522f475Smrg#if OPT_TOOLBAR 786d522f475Smrg /* *INDENT-OFF* */ 787d522f475Smrg XtActionsRec input_actions[] = { 788d522f475Smrg { "insert", HandleKeyPressed }, /* alias */ 789d522f475Smrg { "insert-eight-bit", HandleEightBitKeyPressed }, 790d522f475Smrg { "insert-seven-bit", HandleKeyPressed }, 791d522f475Smrg { "secure", HandleSecure }, 792d522f475Smrg { "string", HandleStringEvent }, 793d522f475Smrg { "scroll-back", HandleScrollBack }, 794d522f475Smrg { "scroll-forw", HandleScrollForward }, 795d522f475Smrg { "select-cursor-end", HandleKeyboardSelectEnd }, 796d522f475Smrg { "select-cursor-extend", HandleKeyboardSelectExtend }, 797d522f475Smrg { "select-cursor-start", HandleKeyboardSelectStart }, 798d522f475Smrg { "insert-selection", HandleInsertSelection }, 799d522f475Smrg { "select-start", HandleSelectStart }, 800d522f475Smrg { "select-extend", HandleSelectExtend }, 801d522f475Smrg { "start-extend", HandleStartExtend }, 802d522f475Smrg { "select-end", HandleSelectEnd }, 803d522f475Smrg { "clear-saved-lines", HandleClearSavedLines }, 804d522f475Smrg { "popup-menu", HandlePopupMenu }, 805d522f475Smrg { "bell", HandleBell }, 806d522f475Smrg { "ignore", HandleIgnore }, 807d522f475Smrg#if OPT_DABBREV 808d522f475Smrg { "dabbrev-expand", HandleDabbrevExpand }, 809d522f475Smrg#endif 810d522f475Smrg#if OPT_SHIFT_FONTS 811d522f475Smrg { "larger-vt-font", HandleLargerFont }, 812d522f475Smrg { "smaller-vt-font", HandleSmallerFont }, 813d522f475Smrg#endif 814d522f475Smrg }; 815d522f475Smrg /* *INDENT-ON* */ 816d522f475Smrg 817d522f475Smrg XtAppAddActions(app_con, input_actions, XtNumber(input_actions)); 818d522f475Smrg#endif 819d522f475Smrg XtAugmentTranslations(w, XtParseTranslationTable(defaultTranslations)); 820d522f475Smrg 821d522f475Smrg#if OPT_EXTRA_PASTE 822d522f475Smrg if (term && term->keyboard.extra_translations) 823d522f475Smrg XtOverrideTranslations((Widget) term, XtParseTranslationTable(term->keyboard.extra_translations)); 824d522f475Smrg#endif 825d522f475Smrg} 826d522f475Smrg 827d522f475Smrg#if OPT_ISO_COLORS 828d522f475Smrg/* 829d522f475Smrg * The terminal's foreground and background colors are set via two mechanisms: 830d522f475Smrg * text (cur_foreground, cur_background values that are passed down to 831d522f475Smrg * XDrawImageString and XDrawString) 832d522f475Smrg * area (X11 graphics context used in XClearArea and XFillRectangle) 833d522f475Smrg */ 834d522f475Smrgvoid 835d522f475SmrgSGR_Foreground(XtermWidget xw, int color) 836d522f475Smrg{ 837d522f475Smrg TScreen *screen = &xw->screen; 838d522f475Smrg Pixel fg; 839d522f475Smrg 840d522f475Smrg if (color >= 0) { 841d522f475Smrg xw->flags |= FG_COLOR; 842d522f475Smrg } else { 843d522f475Smrg xw->flags &= ~FG_COLOR; 844d522f475Smrg } 845d522f475Smrg fg = getXtermForeground(xw, xw->flags, color); 846d522f475Smrg xw->cur_foreground = color; 847d522f475Smrg 848d522f475Smrg setCgsFore(xw, WhichVWin(screen), gcNorm, fg); 849d522f475Smrg setCgsBack(xw, WhichVWin(screen), gcNormReverse, fg); 850d522f475Smrg 851d522f475Smrg setCgsFore(xw, WhichVWin(screen), gcBold, fg); 852d522f475Smrg setCgsBack(xw, WhichVWin(screen), gcBoldReverse, fg); 853d522f475Smrg} 854d522f475Smrg 855d522f475Smrgvoid 856d522f475SmrgSGR_Background(XtermWidget xw, int color) 857d522f475Smrg{ 858d522f475Smrg TScreen *screen = &xw->screen; 859d522f475Smrg Pixel bg; 860d522f475Smrg 861d522f475Smrg /* 862d522f475Smrg * An indexing operation may have set screen->scroll_amt, which would 863d522f475Smrg * normally result in calling FlushScroll() in WriteText(). However, 864d522f475Smrg * if we're changing the background color now, then the new value 865d522f475Smrg * should not apply to the pending blank lines. 866d522f475Smrg */ 867d522f475Smrg if (screen->scroll_amt && (color != xw->cur_background)) 868d522f475Smrg FlushScroll(xw); 869d522f475Smrg 870d522f475Smrg if (color >= 0) { 871d522f475Smrg xw->flags |= BG_COLOR; 872d522f475Smrg } else { 873d522f475Smrg xw->flags &= ~BG_COLOR; 874d522f475Smrg } 875d522f475Smrg bg = getXtermBackground(xw, xw->flags, color); 876d522f475Smrg xw->cur_background = color; 877d522f475Smrg 878d522f475Smrg setCgsBack(xw, WhichVWin(screen), gcNorm, bg); 879d522f475Smrg setCgsFore(xw, WhichVWin(screen), gcNormReverse, bg); 880d522f475Smrg 881d522f475Smrg setCgsBack(xw, WhichVWin(screen), gcBold, bg); 882d522f475Smrg setCgsFore(xw, WhichVWin(screen), gcBoldReverse, bg); 883d522f475Smrg} 884d522f475Smrg 885d522f475Smrg/* Invoked after updating bold/underline flags, computes the extended color 886d522f475Smrg * index to use for foreground. (See also 'extract_fg()'). 887d522f475Smrg */ 888d522f475Smrgstatic void 889d522f475SmrgsetExtendedFG(XtermWidget xw) 890d522f475Smrg{ 891d522f475Smrg int fg = xw->sgr_foreground; 892d522f475Smrg 893d522f475Smrg if (xw->screen.colorAttrMode 894d522f475Smrg || (fg < 0)) { 895d522f475Smrg if (xw->screen.colorULMode && (xw->flags & UNDERLINE)) 896d522f475Smrg fg = COLOR_UL; 897d522f475Smrg if (xw->screen.colorBDMode && (xw->flags & BOLD)) 898d522f475Smrg fg = COLOR_BD; 899d522f475Smrg if (xw->screen.colorBLMode && (xw->flags & BLINK)) 900d522f475Smrg fg = COLOR_BL; 901d522f475Smrg } 902d522f475Smrg 903d522f475Smrg /* This implements the IBM PC-style convention of 8-colors, with one 904d522f475Smrg * bit for bold, thus mapping the 0-7 codes to 8-15. It won't make 905d522f475Smrg * much sense for 16-color applications, but we keep it to retain 906d522f475Smrg * compatiblity with ANSI-color applications. 907d522f475Smrg */ 908d522f475Smrg#if OPT_PC_COLORS /* XXXJTL should be settable at runtime (resource or OSC?) */ 909d522f475Smrg if (xw->screen.boldColors 910d522f475Smrg && (!xw->sgr_extended) 911d522f475Smrg && (fg >= 0) 912d522f475Smrg && (fg < 8) 913d522f475Smrg && (xw->flags & BOLD)) 914d522f475Smrg fg |= 8; 915d522f475Smrg#endif 916d522f475Smrg 917d522f475Smrg SGR_Foreground(xw, fg); 918d522f475Smrg} 919d522f475Smrg 920d522f475Smrg/* Invoked after updating inverse flag, computes the extended color 921d522f475Smrg * index to use for background. (See also 'extract_bg()'). 922d522f475Smrg */ 923d522f475Smrgstatic void 924d522f475SmrgsetExtendedBG(XtermWidget xw) 925d522f475Smrg{ 926d522f475Smrg int bg = xw->sgr_background; 927d522f475Smrg 928d522f475Smrg if (xw->screen.colorAttrMode 929d522f475Smrg || (bg < 0)) { 930d522f475Smrg if (xw->screen.colorRVMode && (xw->flags & INVERSE)) 931d522f475Smrg bg = COLOR_RV; 932d522f475Smrg } 933d522f475Smrg 934d522f475Smrg SGR_Background(xw, bg); 935d522f475Smrg} 936d522f475Smrg 937d522f475Smrgstatic void 938d522f475Smrgreset_SGR_Foreground(XtermWidget xw) 939d522f475Smrg{ 940d522f475Smrg xw->sgr_foreground = -1; 941d522f475Smrg xw->sgr_extended = False; 942d522f475Smrg setExtendedFG(xw); 943d522f475Smrg} 944d522f475Smrg 945d522f475Smrgstatic void 946d522f475Smrgreset_SGR_Background(XtermWidget xw) 947d522f475Smrg{ 948d522f475Smrg xw->sgr_background = -1; 949d522f475Smrg setExtendedBG(xw); 950d522f475Smrg} 951d522f475Smrg 952d522f475Smrgstatic void 953d522f475Smrgreset_SGR_Colors(XtermWidget xw) 954d522f475Smrg{ 955d522f475Smrg reset_SGR_Foreground(xw); 956d522f475Smrg reset_SGR_Background(xw); 957d522f475Smrg} 958d522f475Smrg#endif /* OPT_ISO_COLORS */ 959d522f475Smrg 960d522f475Smrgvoid 961d522f475SmrgresetCharsets(TScreen * screen) 962d522f475Smrg{ 963d522f475Smrg TRACE(("resetCharsets\n")); 964d522f475Smrg 965d522f475Smrg screen->gsets[0] = 'B'; /* ASCII_G */ 966d522f475Smrg screen->gsets[1] = 'B'; /* ASCII_G */ 967d522f475Smrg screen->gsets[2] = 'B'; /* ASCII_G */ 968d522f475Smrg screen->gsets[3] = 'B'; /* ASCII_G */ 969d522f475Smrg 970d522f475Smrg screen->curgl = 0; /* G0 => GL. */ 971d522f475Smrg screen->curgr = 2; /* G2 => GR. */ 972d522f475Smrg screen->curss = 0; /* No single shift. */ 973d522f475Smrg 974d522f475Smrg#if OPT_VT52_MODE 975d522f475Smrg if (screen->vtXX_level == 0) 976d522f475Smrg screen->gsets[1] = '0'; /* Graphics */ 977d522f475Smrg#endif 978d522f475Smrg} 979d522f475Smrg 980d522f475Smrg/* 981d522f475Smrg * VT300 and up support three ANSI conformance levels, defined according to 982d522f475Smrg * the dpANSI X3.134.1 standard. DEC's manuals equate levels 1 and 2, and 983d522f475Smrg * are unclear. This code is written based on the manuals. 984d522f475Smrg */ 985d522f475Smrgstatic void 986d522f475Smrgset_ansi_conformance(TScreen * screen, int level) 987d522f475Smrg{ 988d522f475Smrg TRACE(("set_ansi_conformance(%d) terminal_id %d, ansi_level %d\n", 989d522f475Smrg level, 990d522f475Smrg screen->terminal_id, 991d522f475Smrg screen->ansi_level)); 992d522f475Smrg if (screen->vtXX_level >= 3) { 993d522f475Smrg switch (screen->ansi_level = level) { 994d522f475Smrg case 1: 995d522f475Smrg /* FALLTHRU */ 996d522f475Smrg case 2: 997d522f475Smrg screen->gsets[0] = 'B'; /* G0 is ASCII */ 998d522f475Smrg screen->gsets[1] = 'B'; /* G1 is ISO Latin-1 (FIXME) */ 999d522f475Smrg screen->curgl = 0; 1000d522f475Smrg screen->curgr = 1; 1001d522f475Smrg break; 1002d522f475Smrg case 3: 1003d522f475Smrg screen->gsets[0] = 'B'; /* G0 is ASCII */ 1004d522f475Smrg screen->curgl = 0; 1005d522f475Smrg break; 1006d522f475Smrg } 1007d522f475Smrg } 1008d522f475Smrg} 1009d522f475Smrg 1010d522f475Smrg/* 1011d522f475Smrg * Set scrolling margins. VTxxx terminals require that the top/bottom are 1012d522f475Smrg * different, so we have at least two lines in the scrolling region. 1013d522f475Smrg */ 1014d522f475Smrgvoid 1015d522f475Smrgset_tb_margins(TScreen * screen, int top, int bottom) 1016d522f475Smrg{ 1017d522f475Smrg TRACE(("set_tb_margins %d..%d, prior %d..%d\n", 1018d522f475Smrg top, bottom, 1019d522f475Smrg screen->top_marg, 1020d522f475Smrg screen->bot_marg)); 1021d522f475Smrg if (bottom > top) { 1022d522f475Smrg screen->top_marg = top; 1023d522f475Smrg screen->bot_marg = bottom; 1024d522f475Smrg } 1025d522f475Smrg if (screen->top_marg > screen->max_row) 1026d522f475Smrg screen->top_marg = screen->max_row; 1027d522f475Smrg if (screen->bot_marg > screen->max_row) 1028d522f475Smrg screen->bot_marg = screen->max_row; 1029d522f475Smrg} 1030d522f475Smrg 1031d522f475Smrgvoid 1032d522f475Smrgset_max_col(TScreen * screen, int cols) 1033d522f475Smrg{ 1034d522f475Smrg TRACE(("set_max_col %d, prior %d\n", cols, screen->max_col)); 1035d522f475Smrg if (cols < 0) 1036d522f475Smrg cols = 0; 1037d522f475Smrg screen->max_col = cols; 1038d522f475Smrg} 1039d522f475Smrg 1040d522f475Smrgvoid 1041d522f475Smrgset_max_row(TScreen * screen, int rows) 1042d522f475Smrg{ 1043d522f475Smrg TRACE(("set_max_row %d, prior %d\n", rows, screen->max_row)); 1044d522f475Smrg if (rows < 0) 1045d522f475Smrg rows = 0; 1046d522f475Smrg screen->max_row = rows; 1047d522f475Smrg} 1048d522f475Smrg 1049d522f475Smrg#if OPT_MOD_FKEYS 1050d522f475Smrgstatic void 1051d522f475Smrgset_mod_fkeys(XtermWidget xw, int which, int what, Bool enabled) 1052d522f475Smrg{ 1053d522f475Smrg#define SET_MOD_FKEYS(field) \ 1054d522f475Smrg xw->keyboard.modify_now.field = ((what == DEFAULT) && enabled) \ 1055d522f475Smrg ? xw->keyboard.modify_1st.field \ 1056d522f475Smrg : what; \ 1057d522f475Smrg TRACE(("set modify_now.%s to %d\n", #field, \ 1058d522f475Smrg xw->keyboard.modify_now.field)); 1059d522f475Smrg 1060d522f475Smrg switch (which) { 1061d522f475Smrg case 1: 1062d522f475Smrg SET_MOD_FKEYS(cursor_keys); 1063d522f475Smrg break; 1064d522f475Smrg case 2: 1065d522f475Smrg SET_MOD_FKEYS(function_keys); 1066d522f475Smrg break; 1067d522f475Smrg case 3: 1068d522f475Smrg SET_MOD_FKEYS(keypad_keys); 1069d522f475Smrg break; 1070d522f475Smrg case 4: 1071d522f475Smrg SET_MOD_FKEYS(other_keys); 1072d522f475Smrg break; 1073d522f475Smrg case 5: 1074d522f475Smrg SET_MOD_FKEYS(string_keys); 1075d522f475Smrg break; 1076d522f475Smrg } 1077d522f475Smrg} 1078d522f475Smrg#endif /* OPT_MOD_FKEYS */ 1079d522f475Smrg 1080d522f475Smrg#if OPT_TRACE 1081d522f475Smrg#define WHICH_TABLE(name) if (table == name) result = #name 1082d522f475Smrgstatic char * 1083d522f475Smrgwhich_table(Const PARSE_T * table) 1084d522f475Smrg{ 1085d522f475Smrg char *result = "?"; 1086d522f475Smrg /* *INDENT-OFF* */ 1087d522f475Smrg WHICH_TABLE (ansi_table); 10882eaa94a1Schristos else WHICH_TABLE (cigtable); 1089d522f475Smrg else WHICH_TABLE (csi2_table); 1090d522f475Smrg else WHICH_TABLE (csi_ex_table); 1091d522f475Smrg else WHICH_TABLE (csi_quo_table); 10922eaa94a1Schristos else WHICH_TABLE (csi_table); 1093d522f475Smrg else WHICH_TABLE (dec2_table); 1094d522f475Smrg else WHICH_TABLE (dec3_table); 10952eaa94a1Schristos else WHICH_TABLE (dec_table); 1096d522f475Smrg else WHICH_TABLE (eigtable); 1097d522f475Smrg else WHICH_TABLE (esc_sp_table); 10982eaa94a1Schristos else WHICH_TABLE (esc_table); 1099d522f475Smrg else WHICH_TABLE (scrtable); 11002eaa94a1Schristos else WHICH_TABLE (scs96table); 1101d522f475Smrg else WHICH_TABLE (scstable); 1102d522f475Smrg else WHICH_TABLE (sos_table); 11032eaa94a1Schristos#if OPT_DEC_LOCATOR 11042eaa94a1Schristos else WHICH_TABLE (csi_tick_table); 11052eaa94a1Schristos#endif 11062eaa94a1Schristos#if OPT_DEC_RECTOPS 11072eaa94a1Schristos else WHICH_TABLE (csi_dollar_table); 11082eaa94a1Schristos else WHICH_TABLE (csi_star_table); 11092eaa94a1Schristos#endif 1110d522f475Smrg#if OPT_WIDE_CHARS 1111d522f475Smrg else WHICH_TABLE (esc_pct_table); 1112d522f475Smrg#endif 1113d522f475Smrg#if OPT_VT52_MODE 1114d522f475Smrg else WHICH_TABLE (vt52_table); 1115d522f475Smrg else WHICH_TABLE (vt52_esc_table); 1116d522f475Smrg else WHICH_TABLE (vt52_ignore_table); 1117d522f475Smrg#endif 1118d522f475Smrg /* *INDENT-ON* */ 1119d522f475Smrg 1120d522f475Smrg return result; 1121d522f475Smrg} 1122d522f475Smrg#endif 1123d522f475Smrg 1124d522f475Smrg /* allocate larger buffer if needed/possible */ 1125d522f475Smrg#define SafeAlloc(type, area, used, size) \ 1126d522f475Smrg type *new_string = area; \ 1127d522f475Smrg unsigned new_length = size; \ 1128d522f475Smrg if (new_length == 0) { \ 1129d522f475Smrg new_length = 256; \ 1130d522f475Smrg new_string = TypeMallocN(type, new_length); \ 1131d522f475Smrg } else if (used+1 >= new_length) { \ 1132d522f475Smrg new_length = size * 2; \ 1133d522f475Smrg new_string = TypeMallocN(type, new_length); \ 1134d522f475Smrg if (new_string != 0 \ 1135d522f475Smrg && area != 0 \ 1136d522f475Smrg && used != 0) \ 1137d522f475Smrg memcpy(new_string, area, used * sizeof(type)); \ 1138d522f475Smrg } 1139d522f475Smrg 1140d522f475Smrg#define WriteNow() { \ 1141d522f475Smrg unsigned single = 0; \ 1142d522f475Smrg \ 1143d522f475Smrg if (screen->curss) { \ 1144d522f475Smrg dotext(xw, \ 1145d522f475Smrg screen->gsets[(int) (screen->curss)], \ 1146d522f475Smrg print_area, 1); \ 1147d522f475Smrg screen->curss = 0; \ 1148d522f475Smrg single++; \ 1149d522f475Smrg } \ 1150d522f475Smrg if (print_used > single) { \ 1151d522f475Smrg dotext(xw, \ 1152d522f475Smrg screen->gsets[(int) (screen->curgl)], \ 1153d522f475Smrg print_area + single, \ 1154d522f475Smrg print_used - single); \ 1155d522f475Smrg } \ 1156d522f475Smrg print_used = 0; \ 1157d522f475Smrg } \ 1158d522f475Smrg 1159d522f475Smrgstruct ParseState { 1160d522f475Smrg#if OPT_VT52_MODE 1161d522f475Smrg Bool vt52_cup; 1162d522f475Smrg#endif 1163d522f475Smrg Const PARSE_T *groundtable; 1164d522f475Smrg Const PARSE_T *parsestate; 1165d522f475Smrg int scstype; 11662eaa94a1Schristos int scssize; 1167d522f475Smrg Bool private_function; /* distinguish private-mode from standard */ 1168d522f475Smrg int string_mode; /* nonzero iff we're processing a string */ 1169d522f475Smrg int lastchar; /* positive iff we had a graphic character */ 1170d522f475Smrg int nextstate; 1171d522f475Smrg#if OPT_WIDE_CHARS 1172d522f475Smrg int last_was_wide; 1173d522f475Smrg#endif 1174d522f475Smrg}; 1175d522f475Smrg 1176d522f475Smrgstatic struct ParseState myState; 1177d522f475Smrg 11782eaa94a1Schristosstatic void 11792eaa94a1Schristosinit_groundtable(TScreen * screen, struct ParseState *sp) 11802eaa94a1Schristos{ 11812eaa94a1Schristos#if OPT_VT52_MODE 11822eaa94a1Schristos if (!(screen->vtXX_level)) { 11832eaa94a1Schristos sp->groundtable = vt52_table; 11842eaa94a1Schristos } else if (screen->terminal_id >= 100) 11852eaa94a1Schristos#endif 11862eaa94a1Schristos { 11872eaa94a1Schristos sp->groundtable = ansi_table; 11882eaa94a1Schristos } 11892eaa94a1Schristos} 11902eaa94a1Schristos 11912eaa94a1Schristosstatic void 11922eaa94a1Schristosselect_charset(struct ParseState *sp, int type, int size) 11932eaa94a1Schristos{ 11942eaa94a1Schristos TRACE(("select_charset %#x %d\n", type, size)); 11952eaa94a1Schristos sp->scstype = type; 11962eaa94a1Schristos sp->scssize = size; 11972eaa94a1Schristos if (size == 94) { 11982eaa94a1Schristos sp->parsestate = scstable; 11992eaa94a1Schristos } else { 12002eaa94a1Schristos sp->parsestate = scs96table; 12012eaa94a1Schristos } 12022eaa94a1Schristos} 12032eaa94a1Schristos 1204d522f475Smrgstatic Boolean 1205d522f475Smrgdoparsing(XtermWidget xw, unsigned c, struct ParseState *sp) 1206d522f475Smrg{ 1207d522f475Smrg /* Buffer for processing printable text */ 1208d522f475Smrg static IChar *print_area; 1209d522f475Smrg static size_t print_size, print_used; 1210d522f475Smrg 1211d522f475Smrg /* Buffer for processing strings (e.g., OSC ... ST) */ 1212d522f475Smrg static Char *string_area; 1213d522f475Smrg static size_t string_size, string_used; 1214d522f475Smrg 1215d522f475Smrg TScreen *screen = &xw->screen; 1216d522f475Smrg int row; 1217d522f475Smrg int col; 1218d522f475Smrg int top; 1219d522f475Smrg int bot; 1220d522f475Smrg int count; 1221d522f475Smrg int laststate; 1222d522f475Smrg int thischar = -1; 1223d522f475Smrg XTermRect myRect; 1224d522f475Smrg 1225d522f475Smrg do { 1226d522f475Smrg#if OPT_WIDE_CHARS 1227d522f475Smrg 1228d522f475Smrg /* 1229d522f475Smrg * Handle zero-width combining characters. Make it faster by noting 1230d522f475Smrg * that according to the Unicode charts, the majority of Western 1231d522f475Smrg * character sets do not use this feature. There are some unassigned 1232d522f475Smrg * codes at 0x242, but no zero-width characters until past 0x300. 1233d522f475Smrg */ 1234d522f475Smrg if (c >= 0x300 && screen->wide_chars 1235d522f475Smrg && my_wcwidth((int) c) == 0 1236d522f475Smrg && !isWideControl(c)) { 1237d522f475Smrg int prev, precomposed; 1238d522f475Smrg 1239d522f475Smrg WriteNow(); 1240d522f475Smrg 12412eaa94a1Schristos prev = (int) XTERM_CELL(screen->last_written_row, 12422eaa94a1Schristos screen->last_written_col); 1243d522f475Smrg precomposed = do_precomposition(prev, (int) c); 1244d522f475Smrg TRACE(("do_precomposition (U+%04X [%d], U+%04X [%d]) -> U+%04X [%d]\n", 1245d522f475Smrg prev, my_wcwidth(prev), 1246d522f475Smrg (int) c, my_wcwidth((int) c), 1247d522f475Smrg precomposed, my_wcwidth(precomposed))); 1248d522f475Smrg 1249d522f475Smrg /* substitute combined character with precomposed character 1250d522f475Smrg * only if it does not change the width of the base character 1251d522f475Smrg */ 1252d522f475Smrg if (precomposed != -1 && my_wcwidth(precomposed) == my_wcwidth(prev)) { 1253d522f475Smrg putXtermCell(screen, 1254d522f475Smrg screen->last_written_row, 1255d522f475Smrg screen->last_written_col, precomposed); 1256d522f475Smrg } else { 1257d522f475Smrg addXtermCombining(screen, 1258d522f475Smrg screen->last_written_row, 1259d522f475Smrg screen->last_written_col, c); 1260d522f475Smrg } 1261d522f475Smrg 1262d522f475Smrg if (!screen->scroll_amt) 1263d522f475Smrg ScrnUpdate(xw, 1264d522f475Smrg screen->last_written_row, 1265d522f475Smrg screen->last_written_col, 1, 1, 1); 1266d522f475Smrg continue; 1267d522f475Smrg } 1268d522f475Smrg#endif 1269d522f475Smrg 1270d522f475Smrg /* Intercept characters for printer controller mode */ 1271d522f475Smrg if (screen->printer_controlmode == 2) { 12722eaa94a1Schristos if ((c = (unsigned) xtermPrinterControl((int) c)) == 0) 1273d522f475Smrg continue; 1274d522f475Smrg } 1275d522f475Smrg 1276d522f475Smrg /* 1277d522f475Smrg * VT52 is a little ugly in the one place it has a parameterized 1278d522f475Smrg * control sequence, since the parameter falls after the character 1279d522f475Smrg * that denotes the type of sequence. 1280d522f475Smrg */ 1281d522f475Smrg#if OPT_VT52_MODE 1282d522f475Smrg if (sp->vt52_cup) { 1283d522f475Smrg if (nparam < NPARAM) 12842eaa94a1Schristos param[nparam++] = (int) (c & 0x7f) - 32; 1285d522f475Smrg if (nparam < 2) 1286d522f475Smrg continue; 1287d522f475Smrg sp->vt52_cup = False; 1288d522f475Smrg if ((row = param[0]) < 0) 1289d522f475Smrg row = 0; 1290d522f475Smrg if ((col = param[1]) < 0) 1291d522f475Smrg col = 0; 1292d522f475Smrg CursorSet(screen, row, col, xw->flags); 1293d522f475Smrg sp->parsestate = vt52_table; 1294d522f475Smrg param[0] = 0; 1295d522f475Smrg param[1] = 0; 1296d522f475Smrg continue; 1297d522f475Smrg } 1298d522f475Smrg#endif 1299d522f475Smrg 1300d522f475Smrg laststate = sp->nextstate; 13012eaa94a1Schristos if (c == ANSI_DEL 13022eaa94a1Schristos && sp->parsestate == sp->groundtable 13032eaa94a1Schristos && sp->scssize == 96 13042eaa94a1Schristos && sp->scstype != 0) { 13052eaa94a1Schristos /* 13062eaa94a1Schristos * Handle special case of shifts for 96-character sets by checking 13072eaa94a1Schristos * if we have a DEL. The other special case for SPACE will always 13082eaa94a1Schristos * be printable. 13092eaa94a1Schristos */ 13102eaa94a1Schristos sp->nextstate = CASE_PRINT; 13112eaa94a1Schristos } else 1312d522f475Smrg#if OPT_WIDE_CHARS 1313d522f475Smrg if (c > 255) { 13142eaa94a1Schristos /* 13152eaa94a1Schristos * The parsing tables all have 256 entries. If we're supporting 13162eaa94a1Schristos * wide characters, we handle them by treating them the same as 13172eaa94a1Schristos * printing characters. 13182eaa94a1Schristos */ 1319d522f475Smrg if (sp->parsestate == sp->groundtable) { 1320d522f475Smrg sp->nextstate = CASE_PRINT; 1321d522f475Smrg } else if (sp->parsestate == sos_table) { 1322d522f475Smrg c &= 0xffff; 1323d522f475Smrg if (c > 255) { 1324d522f475Smrg TRACE(("Found code > 255 while in SOS state: %04X\n", c)); 1325d522f475Smrg c = '?'; 1326d522f475Smrg } 1327d522f475Smrg } else { 1328d522f475Smrg sp->nextstate = CASE_GROUND_STATE; 1329d522f475Smrg } 1330d522f475Smrg } else 1331d522f475Smrg#endif 1332d522f475Smrg sp->nextstate = sp->parsestate[E2A(c)]; 1333d522f475Smrg 1334d522f475Smrg#if OPT_BROKEN_OSC 1335d522f475Smrg /* 1336d522f475Smrg * Linux console palette escape sequences start with an OSC, but do 1337d522f475Smrg * not terminate correctly. Some scripts do not check before writing 1338d522f475Smrg * them, making xterm appear to hang (it's awaiting a valid string 1339d522f475Smrg * terminator). Just ignore these if we see them - there's no point 1340d522f475Smrg * in emulating bad code. 1341d522f475Smrg */ 1342d522f475Smrg if (screen->brokenLinuxOSC 1343d522f475Smrg && sp->parsestate == sos_table) { 1344d522f475Smrg if (string_used) { 1345d522f475Smrg switch (string_area[0]) { 1346d522f475Smrg case 'P': 1347d522f475Smrg if (string_used <= 7) 1348d522f475Smrg break; 1349d522f475Smrg /* FALLTHRU */ 1350d522f475Smrg case 'R': 1351d522f475Smrg sp->parsestate = sp->groundtable; 1352d522f475Smrg sp->nextstate = sp->parsestate[E2A(c)]; 1353d522f475Smrg TRACE(("Reset to ground state (brokenLinuxOSC)\n")); 1354d522f475Smrg break; 1355d522f475Smrg } 1356d522f475Smrg } 1357d522f475Smrg } 1358d522f475Smrg#endif 1359d522f475Smrg 1360d522f475Smrg#if OPT_BROKEN_ST 1361d522f475Smrg /* 1362d522f475Smrg * Before patch #171, carriage control embedded within an OSC string 1363d522f475Smrg * would terminate it. Some (buggy, of course) applications rely on 1364d522f475Smrg * this behavior. Accommodate them by allowing one to compile xterm 1365d522f475Smrg * and emulate the old behavior. 1366d522f475Smrg */ 1367d522f475Smrg if (screen->brokenStringTerm 1368d522f475Smrg && sp->parsestate == sos_table 1369d522f475Smrg && c < 32) { 1370d522f475Smrg switch (c) { 1371d522f475Smrg case 5: /* FALLTHRU */ 1372d522f475Smrg case 8: /* FALLTHRU */ 1373d522f475Smrg case 9: /* FALLTHRU */ 1374d522f475Smrg case 10: /* FALLTHRU */ 1375d522f475Smrg case 11: /* FALLTHRU */ 1376d522f475Smrg case 12: /* FALLTHRU */ 1377d522f475Smrg case 13: /* FALLTHRU */ 1378d522f475Smrg case 14: /* FALLTHRU */ 1379d522f475Smrg case 15: /* FALLTHRU */ 1380d522f475Smrg case 24: 1381d522f475Smrg sp->parsestate = sp->groundtable; 1382d522f475Smrg sp->nextstate = sp->parsestate[E2A(c)]; 1383d522f475Smrg TRACE(("Reset to ground state (brokenStringTerm)\n")); 1384d522f475Smrg break; 1385d522f475Smrg } 1386d522f475Smrg } 1387d522f475Smrg#endif 1388d522f475Smrg 1389d522f475Smrg#if OPT_C1_PRINT 1390d522f475Smrg /* 1391d522f475Smrg * This is not completely foolproof, but will allow an application 1392d522f475Smrg * with values in the C1 range to use them as printable characters, 1393d522f475Smrg * provided that they are not intermixed with an escape sequence. 1394d522f475Smrg */ 1395d522f475Smrg if (screen->c1_printable 1396d522f475Smrg && (c >= 128 && c < 160)) { 1397d522f475Smrg sp->nextstate = (sp->parsestate == esc_table 1398d522f475Smrg ? CASE_ESC_IGNORE 1399d522f475Smrg : sp->parsestate[E2A(160)]); 1400d522f475Smrg } 1401d522f475Smrg#endif 1402d522f475Smrg 1403d522f475Smrg#if OPT_WIDE_CHARS 1404d522f475Smrg /* 1405d522f475Smrg * If we have a C1 code and the c1_printable flag is not set, simply 1406d522f475Smrg * ignore it when it was translated from UTF-8. That is because the 1407d522f475Smrg * value could not have been present as-is in the UTF-8. 1408d522f475Smrg * 1409d522f475Smrg * To see that CASE_IGNORE is a consistent value, note that it is 1410d522f475Smrg * always used for NUL and other uninteresting C0 controls. 1411d522f475Smrg */ 1412d522f475Smrg#if OPT_C1_PRINT 1413d522f475Smrg if (!screen->c1_printable) 1414d522f475Smrg#endif 1415d522f475Smrg if (screen->wide_chars 1416d522f475Smrg && (c >= 128 && c < 160)) { 1417d522f475Smrg sp->nextstate = CASE_IGNORE; 1418d522f475Smrg } 1419d522f475Smrg 1420d522f475Smrg /* 1421d522f475Smrg * If this character is a different width than the last one, put the 1422d522f475Smrg * previous text into the buffer and draw it now. 1423d522f475Smrg */ 1424d522f475Smrg if (iswide((int) c) != sp->last_was_wide) { 1425d522f475Smrg WriteNow(); 1426d522f475Smrg } 1427d522f475Smrg#endif 1428d522f475Smrg 1429d522f475Smrg /* 1430d522f475Smrg * Accumulate string for printable text. This may be 8/16-bit 1431d522f475Smrg * characters. 1432d522f475Smrg */ 1433d522f475Smrg if (sp->nextstate == CASE_PRINT) { 1434d522f475Smrg SafeAlloc(IChar, print_area, print_used, print_size); 1435d522f475Smrg if (new_string == 0) { 1436d522f475Smrg fprintf(stderr, 1437d522f475Smrg "Cannot allocate %u bytes for printable text\n", 1438d522f475Smrg new_length); 1439d522f475Smrg continue; 1440d522f475Smrg } 1441d522f475Smrg#if OPT_VT52_MODE 1442d522f475Smrg /* 1443d522f475Smrg * Strip output text to 7-bits for VT52. We should do this for 1444d522f475Smrg * VT100 also (which is a 7-bit device), but xterm has been 1445d522f475Smrg * doing this for so long we shouldn't change this behavior. 1446d522f475Smrg */ 1447d522f475Smrg if (screen->vtXX_level < 1) 1448d522f475Smrg c &= 0x7f; 1449d522f475Smrg#endif 1450d522f475Smrg print_area = new_string; 1451d522f475Smrg print_size = new_length; 14522eaa94a1Schristos print_area[print_used++] = c; 14532eaa94a1Schristos sp->lastchar = thischar = (int) c; 1454d522f475Smrg#if OPT_WIDE_CHARS 1455d522f475Smrg sp->last_was_wide = iswide((int) c); 1456d522f475Smrg#endif 1457d522f475Smrg if (morePtyData(screen, VTbuffer)) { 1458d522f475Smrg continue; 1459d522f475Smrg } 1460d522f475Smrg } 1461d522f475Smrg 1462d522f475Smrg if (sp->nextstate == CASE_PRINT 1463d522f475Smrg || (laststate == CASE_PRINT && print_used)) { 1464d522f475Smrg WriteNow(); 1465d522f475Smrg } 1466d522f475Smrg 1467d522f475Smrg /* 1468d522f475Smrg * Accumulate string for APC, DCS, PM, OSC, SOS controls 1469d522f475Smrg * This should always be 8-bit characters. 1470d522f475Smrg */ 1471d522f475Smrg if (sp->parsestate == sos_table) { 1472d522f475Smrg SafeAlloc(Char, string_area, string_used, string_size); 1473d522f475Smrg if (new_string == 0) { 1474d522f475Smrg fprintf(stderr, 1475d522f475Smrg "Cannot allocate %u bytes for string mode %d\n", 1476d522f475Smrg new_length, sp->string_mode); 1477d522f475Smrg continue; 1478d522f475Smrg } 1479d522f475Smrg#if OPT_WIDE_CHARS 1480d522f475Smrg /* 1481d522f475Smrg * We cannot display codes above 255, but let's try to 1482d522f475Smrg * accommodate the application a little by not aborting the 1483d522f475Smrg * string. 1484d522f475Smrg */ 1485d522f475Smrg if ((c & 0xffff) > 255) { 1486d522f475Smrg sp->nextstate = CASE_PRINT; 1487d522f475Smrg c = '?'; 1488d522f475Smrg } 1489d522f475Smrg#endif 1490d522f475Smrg string_area = new_string; 1491d522f475Smrg string_size = new_length; 14922eaa94a1Schristos string_area[string_used++] = CharOf(c); 1493d522f475Smrg } else if (sp->parsestate != esc_table) { 1494d522f475Smrg /* if we were accumulating, we're not any more */ 1495d522f475Smrg sp->string_mode = 0; 1496d522f475Smrg string_used = 0; 1497d522f475Smrg } 1498d522f475Smrg 1499d522f475Smrg TRACE(("parse %04X -> %d %s\n", c, sp->nextstate, which_table(sp->parsestate))); 1500d522f475Smrg 1501d522f475Smrg switch (sp->nextstate) { 1502d522f475Smrg case CASE_PRINT: 1503d522f475Smrg TRACE(("CASE_PRINT - printable characters\n")); 1504d522f475Smrg break; 1505d522f475Smrg 1506d522f475Smrg case CASE_GROUND_STATE: 1507d522f475Smrg TRACE(("CASE_GROUND_STATE - exit ignore mode\n")); 1508d522f475Smrg sp->parsestate = sp->groundtable; 1509d522f475Smrg break; 1510d522f475Smrg 1511d522f475Smrg case CASE_IGNORE: 1512d522f475Smrg TRACE(("CASE_IGNORE - Ignore character %02X\n", c)); 1513d522f475Smrg break; 1514d522f475Smrg 1515d522f475Smrg case CASE_ENQ: 1516d522f475Smrg TRACE(("CASE_ENQ - answerback\n")); 1517d522f475Smrg for (count = 0; screen->answer_back[count] != 0; count++) 1518d522f475Smrg unparseputc(xw, screen->answer_back[count]); 1519d522f475Smrg unparse_end(xw); 1520d522f475Smrg break; 1521d522f475Smrg 1522d522f475Smrg case CASE_BELL: 1523d522f475Smrg TRACE(("CASE_BELL - bell\n")); 1524d522f475Smrg if (sp->string_mode == ANSI_OSC) { 1525d522f475Smrg if (string_used) 1526d522f475Smrg string_area[--string_used] = '\0'; 1527d522f475Smrg do_osc(xw, string_area, string_used, (int) c); 1528d522f475Smrg sp->parsestate = sp->groundtable; 1529d522f475Smrg } else { 1530d522f475Smrg /* bell */ 1531d522f475Smrg Bell(XkbBI_TerminalBell, 0); 1532d522f475Smrg } 1533d522f475Smrg break; 1534d522f475Smrg 1535d522f475Smrg case CASE_BS: 1536d522f475Smrg TRACE(("CASE_BS - backspace\n")); 1537d522f475Smrg CursorBack(xw, 1); 1538d522f475Smrg break; 1539d522f475Smrg 1540d522f475Smrg case CASE_CR: 1541d522f475Smrg /* CR */ 1542d522f475Smrg CarriageReturn(screen); 1543d522f475Smrg break; 1544d522f475Smrg 1545d522f475Smrg case CASE_ESC: 1546d522f475Smrg if_OPT_VT52_MODE(screen, { 1547d522f475Smrg sp->parsestate = vt52_esc_table; 1548d522f475Smrg break; 1549d522f475Smrg }); 1550d522f475Smrg sp->parsestate = esc_table; 1551d522f475Smrg break; 1552d522f475Smrg 1553d522f475Smrg#if OPT_VT52_MODE 1554d522f475Smrg case CASE_VT52_CUP: 1555d522f475Smrg TRACE(("CASE_VT52_CUP - VT52 cursor addressing\n")); 1556d522f475Smrg sp->vt52_cup = True; 1557d522f475Smrg nparam = 0; 1558d522f475Smrg break; 1559d522f475Smrg 1560d522f475Smrg case CASE_VT52_IGNORE: 1561d522f475Smrg TRACE(("CASE_VT52_IGNORE - VT52 ignore-character\n")); 1562d522f475Smrg sp->parsestate = vt52_ignore_table; 1563d522f475Smrg break; 1564d522f475Smrg#endif 1565d522f475Smrg 1566d522f475Smrg case CASE_VMOT: 1567d522f475Smrg /* 1568d522f475Smrg * form feed, line feed, vertical tab 1569d522f475Smrg */ 1570d522f475Smrg xtermAutoPrint(c); 1571d522f475Smrg xtermIndex(xw, 1); 1572d522f475Smrg if (xw->flags & LINEFEED) 1573d522f475Smrg CarriageReturn(screen); 1574d522f475Smrg else 1575d522f475Smrg do_xevents(); 1576d522f475Smrg break; 1577d522f475Smrg 1578d522f475Smrg case CASE_CBT: 1579d522f475Smrg /* cursor backward tabulation */ 1580d522f475Smrg if ((count = param[0]) == DEFAULT) 1581d522f475Smrg count = 1; 1582d522f475Smrg while ((count-- > 0) 1583d522f475Smrg && (TabToPrevStop(xw))) ; 1584d522f475Smrg sp->parsestate = sp->groundtable; 1585d522f475Smrg break; 1586d522f475Smrg 1587d522f475Smrg case CASE_CHT: 1588d522f475Smrg /* cursor forward tabulation */ 1589d522f475Smrg if ((count = param[0]) == DEFAULT) 1590d522f475Smrg count = 1; 1591d522f475Smrg while ((count-- > 0) 1592d522f475Smrg && (TabToNextStop(xw))) ; 1593d522f475Smrg sp->parsestate = sp->groundtable; 1594d522f475Smrg break; 1595d522f475Smrg 1596d522f475Smrg case CASE_TAB: 1597d522f475Smrg /* tab */ 1598d522f475Smrg TabToNextStop(xw); 1599d522f475Smrg break; 1600d522f475Smrg 1601d522f475Smrg case CASE_SI: 1602d522f475Smrg screen->curgl = 0; 1603d522f475Smrg if_OPT_VT52_MODE(screen, { 1604d522f475Smrg sp->parsestate = sp->groundtable; 1605d522f475Smrg }); 1606d522f475Smrg break; 1607d522f475Smrg 1608d522f475Smrg case CASE_SO: 1609d522f475Smrg screen->curgl = 1; 1610d522f475Smrg if_OPT_VT52_MODE(screen, { 1611d522f475Smrg sp->parsestate = sp->groundtable; 1612d522f475Smrg }); 1613d522f475Smrg break; 1614d522f475Smrg 1615d522f475Smrg case CASE_DECDHL: 1616d522f475Smrg xterm_DECDHL(xw, c == '3'); 1617d522f475Smrg sp->parsestate = sp->groundtable; 1618d522f475Smrg break; 1619d522f475Smrg 1620d522f475Smrg case CASE_DECSWL: 1621d522f475Smrg xterm_DECSWL(xw); 1622d522f475Smrg sp->parsestate = sp->groundtable; 1623d522f475Smrg break; 1624d522f475Smrg 1625d522f475Smrg case CASE_DECDWL: 1626d522f475Smrg xterm_DECDWL(xw); 1627d522f475Smrg sp->parsestate = sp->groundtable; 1628d522f475Smrg break; 1629d522f475Smrg 1630d522f475Smrg case CASE_SCR_STATE: 1631d522f475Smrg /* enter scr state */ 1632d522f475Smrg sp->parsestate = scrtable; 1633d522f475Smrg break; 1634d522f475Smrg 1635d522f475Smrg case CASE_SCS0_STATE: 1636d522f475Smrg /* enter scs state 0 */ 16372eaa94a1Schristos select_charset(sp, 0, 94); 1638d522f475Smrg break; 1639d522f475Smrg 1640d522f475Smrg case CASE_SCS1_STATE: 1641d522f475Smrg /* enter scs state 1 */ 16422eaa94a1Schristos select_charset(sp, 1, 94); 1643d522f475Smrg break; 1644d522f475Smrg 1645d522f475Smrg case CASE_SCS2_STATE: 1646d522f475Smrg /* enter scs state 2 */ 16472eaa94a1Schristos select_charset(sp, 2, 94); 1648d522f475Smrg break; 1649d522f475Smrg 1650d522f475Smrg case CASE_SCS3_STATE: 1651d522f475Smrg /* enter scs state 3 */ 16522eaa94a1Schristos select_charset(sp, 3, 94); 16532eaa94a1Schristos break; 16542eaa94a1Schristos 16552eaa94a1Schristos case CASE_SCS1A_STATE: 16562eaa94a1Schristos /* enter scs state 1 */ 16572eaa94a1Schristos select_charset(sp, 1, 96); 16582eaa94a1Schristos break; 16592eaa94a1Schristos 16602eaa94a1Schristos case CASE_SCS2A_STATE: 16612eaa94a1Schristos /* enter scs state 2 */ 16622eaa94a1Schristos select_charset(sp, 2, 96); 16632eaa94a1Schristos break; 16642eaa94a1Schristos 16652eaa94a1Schristos case CASE_SCS3A_STATE: 16662eaa94a1Schristos /* enter scs state 3 */ 16672eaa94a1Schristos select_charset(sp, 3, 96); 1668d522f475Smrg break; 1669d522f475Smrg 1670d522f475Smrg case CASE_ESC_IGNORE: 1671d522f475Smrg /* unknown escape sequence */ 1672d522f475Smrg sp->parsestate = eigtable; 1673d522f475Smrg break; 1674d522f475Smrg 1675d522f475Smrg case CASE_ESC_DIGIT: 1676d522f475Smrg /* digit in csi or dec mode */ 1677d522f475Smrg if ((row = param[nparam - 1]) == DEFAULT) 1678d522f475Smrg row = 0; 16792eaa94a1Schristos param[nparam - 1] = (10 * row) + ((int) c - '0'); 1680d522f475Smrg if (param[nparam - 1] > 65535) 1681d522f475Smrg param[nparam - 1] = 65535; 1682d522f475Smrg if (sp->parsestate == csi_table) 1683d522f475Smrg sp->parsestate = csi2_table; 1684d522f475Smrg break; 1685d522f475Smrg 1686d522f475Smrg case CASE_ESC_SEMI: 1687d522f475Smrg /* semicolon in csi or dec mode */ 1688d522f475Smrg if (nparam < NPARAM) 1689d522f475Smrg param[nparam++] = DEFAULT; 1690d522f475Smrg if (sp->parsestate == csi_table) 1691d522f475Smrg sp->parsestate = csi2_table; 1692d522f475Smrg break; 1693d522f475Smrg 1694d522f475Smrg case CASE_DEC_STATE: 1695d522f475Smrg /* enter dec mode */ 1696d522f475Smrg sp->parsestate = dec_table; 1697d522f475Smrg break; 1698d522f475Smrg 1699d522f475Smrg case CASE_DEC2_STATE: 1700d522f475Smrg /* enter dec2 mode */ 1701d522f475Smrg sp->parsestate = dec2_table; 1702d522f475Smrg break; 1703d522f475Smrg 1704d522f475Smrg case CASE_DEC3_STATE: 1705d522f475Smrg /* enter dec3 mode */ 1706d522f475Smrg sp->parsestate = dec3_table; 1707d522f475Smrg break; 1708d522f475Smrg 1709d522f475Smrg case CASE_ICH: 1710d522f475Smrg TRACE(("CASE_ICH - insert char\n")); 1711d522f475Smrg if ((row = param[0]) < 1) 1712d522f475Smrg row = 1; 1713d522f475Smrg InsertChar(xw, (unsigned) row); 1714d522f475Smrg sp->parsestate = sp->groundtable; 1715d522f475Smrg break; 1716d522f475Smrg 1717d522f475Smrg case CASE_CUU: 1718d522f475Smrg TRACE(("CASE_CUU - cursor up\n")); 1719d522f475Smrg if ((row = param[0]) < 1) 1720d522f475Smrg row = 1; 1721d522f475Smrg CursorUp(screen, row); 1722d522f475Smrg sp->parsestate = sp->groundtable; 1723d522f475Smrg break; 1724d522f475Smrg 1725d522f475Smrg case CASE_CUD: 1726d522f475Smrg TRACE(("CASE_CUD - cursor down\n")); 1727d522f475Smrg if ((row = param[0]) < 1) 1728d522f475Smrg row = 1; 1729d522f475Smrg CursorDown(screen, row); 1730d522f475Smrg sp->parsestate = sp->groundtable; 1731d522f475Smrg break; 1732d522f475Smrg 1733d522f475Smrg case CASE_CUF: 1734d522f475Smrg TRACE(("CASE_CUF - cursor forward\n")); 1735d522f475Smrg if ((col = param[0]) < 1) 1736d522f475Smrg col = 1; 1737d522f475Smrg CursorForward(screen, col); 1738d522f475Smrg sp->parsestate = sp->groundtable; 1739d522f475Smrg break; 1740d522f475Smrg 1741d522f475Smrg case CASE_CUB: 1742d522f475Smrg TRACE(("CASE_CUB - cursor backward\n")); 1743d522f475Smrg if ((col = param[0]) < 1) 1744d522f475Smrg col = 1; 1745d522f475Smrg CursorBack(xw, col); 1746d522f475Smrg sp->parsestate = sp->groundtable; 1747d522f475Smrg break; 1748d522f475Smrg 1749d522f475Smrg case CASE_CUP: 1750d522f475Smrg TRACE(("CASE_CUP - cursor position\n")); 1751d522f475Smrg if_OPT_XMC_GLITCH(screen, { 1752d522f475Smrg Jump_XMC(xw); 1753d522f475Smrg }); 1754d522f475Smrg if ((row = param[0]) < 1) 1755d522f475Smrg row = 1; 1756d522f475Smrg if (nparam < 2 || (col = param[1]) < 1) 1757d522f475Smrg col = 1; 1758d522f475Smrg CursorSet(screen, row - 1, col - 1, xw->flags); 1759d522f475Smrg sp->parsestate = sp->groundtable; 1760d522f475Smrg break; 1761d522f475Smrg 1762d522f475Smrg case CASE_VPA: 1763d522f475Smrg TRACE(("CASE_VPA - vertical position\n")); 1764d522f475Smrg if ((row = param[0]) < 1) 1765d522f475Smrg row = 1; 1766d522f475Smrg CursorSet(screen, row - 1, screen->cur_col, xw->flags); 1767d522f475Smrg sp->parsestate = sp->groundtable; 1768d522f475Smrg break; 1769d522f475Smrg 1770d522f475Smrg case CASE_HPA: 1771d522f475Smrg TRACE(("CASE_HPA - horizontal position\n")); 1772d522f475Smrg if ((col = param[0]) < 1) 1773d522f475Smrg col = 1; 1774d522f475Smrg CursorSet(screen, screen->cur_row, col - 1, xw->flags); 1775d522f475Smrg sp->parsestate = sp->groundtable; 1776d522f475Smrg break; 1777d522f475Smrg 1778d522f475Smrg case CASE_HP_BUGGY_LL: 1779d522f475Smrg TRACE(("CASE_HP_BUGGY_LL\n")); 1780d522f475Smrg /* Some HP-UX applications have the bug that they 1781d522f475Smrg assume ESC F goes to the lower left corner of 1782d522f475Smrg the screen, regardless of what terminfo says. */ 1783d522f475Smrg if (screen->hp_ll_bc) 1784d522f475Smrg CursorSet(screen, screen->max_row, 0, xw->flags); 1785d522f475Smrg sp->parsestate = sp->groundtable; 1786d522f475Smrg break; 1787d522f475Smrg 1788d522f475Smrg case CASE_ED: 1789d522f475Smrg TRACE(("CASE_ED - erase display\n")); 1790d522f475Smrg do_erase_display(xw, param[0], OFF_PROTECT); 1791d522f475Smrg sp->parsestate = sp->groundtable; 1792d522f475Smrg break; 1793d522f475Smrg 1794d522f475Smrg case CASE_EL: 1795d522f475Smrg TRACE(("CASE_EL - erase line\n")); 1796d522f475Smrg do_erase_line(xw, param[0], OFF_PROTECT); 1797d522f475Smrg sp->parsestate = sp->groundtable; 1798d522f475Smrg break; 1799d522f475Smrg 1800d522f475Smrg case CASE_ECH: 1801d522f475Smrg TRACE(("CASE_ECH - erase char\n")); 1802d522f475Smrg /* ECH */ 1803d522f475Smrg ClearRight(xw, param[0] < 1 ? 1 : param[0]); 1804d522f475Smrg sp->parsestate = sp->groundtable; 1805d522f475Smrg break; 1806d522f475Smrg 1807d522f475Smrg case CASE_IL: 1808d522f475Smrg TRACE(("CASE_IL - insert line\n")); 1809d522f475Smrg if ((row = param[0]) < 1) 1810d522f475Smrg row = 1; 1811d522f475Smrg InsertLine(xw, row); 1812d522f475Smrg sp->parsestate = sp->groundtable; 1813d522f475Smrg break; 1814d522f475Smrg 1815d522f475Smrg case CASE_DL: 1816d522f475Smrg TRACE(("CASE_DL - delete line\n")); 1817d522f475Smrg if ((row = param[0]) < 1) 1818d522f475Smrg row = 1; 1819d522f475Smrg DeleteLine(xw, row); 1820d522f475Smrg sp->parsestate = sp->groundtable; 1821d522f475Smrg break; 1822d522f475Smrg 1823d522f475Smrg case CASE_DCH: 1824d522f475Smrg TRACE(("CASE_DCH - delete char\n")); 1825d522f475Smrg if ((row = param[0]) < 1) 1826d522f475Smrg row = 1; 1827d522f475Smrg DeleteChar(xw, (unsigned) row); 1828d522f475Smrg sp->parsestate = sp->groundtable; 1829d522f475Smrg break; 1830d522f475Smrg 1831d522f475Smrg case CASE_TRACK_MOUSE: 1832d522f475Smrg /* 1833d522f475Smrg * A single parameter other than zero is always scroll-down. 1834d522f475Smrg * A zero-parameter is used to reset the mouse mode, and is 1835d522f475Smrg * not useful for scrolling anyway. 1836d522f475Smrg */ 1837d522f475Smrg if (nparam > 1 || param[0] == 0) { 1838d522f475Smrg CELL start; 1839d522f475Smrg 1840d522f475Smrg TRACE(("CASE_TRACK_MOUSE\n")); 1841d522f475Smrg /* Track mouse as long as in window and between 1842d522f475Smrg * specified rows 1843d522f475Smrg */ 1844d522f475Smrg start.row = param[2] - 1; 1845d522f475Smrg start.col = param[1] - 1; 1846d522f475Smrg TrackMouse(xw, 1847d522f475Smrg param[0], 1848d522f475Smrg &start, 1849d522f475Smrg param[3] - 1, param[4] - 2); 1850d522f475Smrg } else { 1851d522f475Smrg TRACE(("CASE_SD - scroll down\n")); 1852d522f475Smrg /* SD */ 1853d522f475Smrg if ((count = param[0]) < 1) 1854d522f475Smrg count = 1; 1855d522f475Smrg RevScroll(xw, count); 1856d522f475Smrg do_xevents(); 1857d522f475Smrg } 1858d522f475Smrg sp->parsestate = sp->groundtable; 1859d522f475Smrg break; 1860d522f475Smrg 1861d522f475Smrg case CASE_DECID: 1862d522f475Smrg TRACE(("CASE_DECID\n")); 1863d522f475Smrg if_OPT_VT52_MODE(screen, { 1864d522f475Smrg unparseputc(xw, ANSI_ESC); 1865d522f475Smrg unparseputc(xw, '/'); 1866d522f475Smrg unparseputc(xw, 'Z'); 1867d522f475Smrg unparse_end(xw); 1868d522f475Smrg sp->parsestate = sp->groundtable; 1869d522f475Smrg break; 1870d522f475Smrg }); 1871d522f475Smrg param[0] = DEFAULT; /* Default ID parameter */ 1872d522f475Smrg /* FALLTHRU */ 1873d522f475Smrg case CASE_DA1: 1874d522f475Smrg TRACE(("CASE_DA1\n")); 1875d522f475Smrg if (param[0] <= 0) { /* less than means DEFAULT */ 1876d522f475Smrg count = 0; 1877d522f475Smrg reply.a_type = ANSI_CSI; 1878d522f475Smrg reply.a_pintro = '?'; 1879d522f475Smrg 1880d522f475Smrg /* The first param corresponds to the highest 1881d522f475Smrg * operating level (i.e., service level) of the 1882d522f475Smrg * emulation. A DEC terminal can be setup to 1883d522f475Smrg * respond with a different DA response, but 1884d522f475Smrg * there's no control sequence that modifies this. 1885d522f475Smrg * We set it via a resource. 1886d522f475Smrg */ 1887d522f475Smrg if (screen->terminal_id < 200) { 1888d522f475Smrg switch (screen->terminal_id) { 1889d522f475Smrg case 102: 1890d522f475Smrg reply.a_param[count++] = 6; /* VT102 */ 1891d522f475Smrg break; 1892d522f475Smrg case 101: 1893d522f475Smrg reply.a_param[count++] = 1; /* VT101 */ 1894d522f475Smrg reply.a_param[count++] = 0; /* no options */ 1895d522f475Smrg break; 1896d522f475Smrg default: /* VT100 */ 1897d522f475Smrg reply.a_param[count++] = 1; /* VT100 */ 1898d522f475Smrg reply.a_param[count++] = 2; /* AVO */ 1899d522f475Smrg break; 1900d522f475Smrg } 1901d522f475Smrg } else { 19022eaa94a1Schristos reply.a_param[count++] = (ParmType) (60 19032eaa94a1Schristos + screen->terminal_id 19042eaa94a1Schristos / 100); 1905d522f475Smrg reply.a_param[count++] = 1; /* 132-columns */ 1906d522f475Smrg reply.a_param[count++] = 2; /* printer */ 1907d522f475Smrg reply.a_param[count++] = 6; /* selective-erase */ 1908d522f475Smrg#if OPT_SUNPC_KBD 1909d522f475Smrg if (xw->keyboard.type == keyboardIsVT220) 1910d522f475Smrg#endif 1911d522f475Smrg reply.a_param[count++] = 8; /* user-defined-keys */ 1912d522f475Smrg reply.a_param[count++] = 9; /* national replacement charsets */ 1913d522f475Smrg reply.a_param[count++] = 15; /* technical characters */ 1914d522f475Smrg if_OPT_ISO_COLORS(screen, { 1915d522f475Smrg reply.a_param[count++] = 22; /* ANSI color, VT525 */ 1916d522f475Smrg }); 1917d522f475Smrg#if OPT_DEC_LOCATOR 1918d522f475Smrg reply.a_param[count++] = 29; /* ANSI text locator */ 1919d522f475Smrg#endif 1920d522f475Smrg } 19212eaa94a1Schristos reply.a_nparam = (ParmType) count; 1922d522f475Smrg reply.a_inters = 0; 1923d522f475Smrg reply.a_final = 'c'; 1924d522f475Smrg unparseseq(xw, &reply); 1925d522f475Smrg } 1926d522f475Smrg sp->parsestate = sp->groundtable; 1927d522f475Smrg break; 1928d522f475Smrg 1929d522f475Smrg case CASE_DA2: 1930d522f475Smrg TRACE(("CASE_DA2\n")); 1931d522f475Smrg if (param[0] <= 0) { /* less than means DEFAULT */ 1932d522f475Smrg count = 0; 1933d522f475Smrg reply.a_type = ANSI_CSI; 1934d522f475Smrg reply.a_pintro = '>'; 1935d522f475Smrg 1936d522f475Smrg if (screen->terminal_id >= 200) 1937d522f475Smrg reply.a_param[count++] = 1; /* VT220 */ 1938d522f475Smrg else 1939d522f475Smrg reply.a_param[count++] = 0; /* VT100 (nonstandard) */ 1940d522f475Smrg reply.a_param[count++] = XTERM_PATCH; /* Version */ 1941d522f475Smrg reply.a_param[count++] = 0; /* options (none) */ 19422eaa94a1Schristos reply.a_nparam = (ParmType) count; 1943d522f475Smrg reply.a_inters = 0; 1944d522f475Smrg reply.a_final = 'c'; 1945d522f475Smrg unparseseq(xw, &reply); 1946d522f475Smrg } 1947d522f475Smrg sp->parsestate = sp->groundtable; 1948d522f475Smrg break; 1949d522f475Smrg 1950d522f475Smrg case CASE_DECRPTUI: 1951d522f475Smrg TRACE(("CASE_DECRPTUI\n")); 1952d522f475Smrg if ((screen->terminal_id >= 400) 1953d522f475Smrg && (param[0] <= 0)) { /* less than means DEFAULT */ 1954d522f475Smrg unparseputc1(xw, ANSI_DCS); 1955d522f475Smrg unparseputc(xw, '!'); 1956d522f475Smrg unparseputc(xw, '|'); 1957d522f475Smrg unparseputc(xw, '0'); 1958d522f475Smrg unparseputc1(xw, ANSI_ST); 1959d522f475Smrg unparse_end(xw); 1960d522f475Smrg } 1961d522f475Smrg sp->parsestate = sp->groundtable; 1962d522f475Smrg break; 1963d522f475Smrg 1964d522f475Smrg case CASE_TBC: 1965d522f475Smrg TRACE(("CASE_TBC - tab clear\n")); 1966d522f475Smrg if ((row = param[0]) <= 0) /* less than means default */ 1967d522f475Smrg TabClear(xw->tabs, screen->cur_col); 1968d522f475Smrg else if (row == 3) 1969d522f475Smrg TabZonk(xw->tabs); 1970d522f475Smrg sp->parsestate = sp->groundtable; 1971d522f475Smrg break; 1972d522f475Smrg 1973d522f475Smrg case CASE_SET: 1974d522f475Smrg TRACE(("CASE_SET - set mode\n")); 1975d522f475Smrg ansi_modes(xw, bitset); 1976d522f475Smrg sp->parsestate = sp->groundtable; 1977d522f475Smrg break; 1978d522f475Smrg 1979d522f475Smrg case CASE_RST: 1980d522f475Smrg TRACE(("CASE_RST - reset mode\n")); 1981d522f475Smrg ansi_modes(xw, bitclr); 1982d522f475Smrg sp->parsestate = sp->groundtable; 1983d522f475Smrg break; 1984d522f475Smrg 1985d522f475Smrg case CASE_SGR: 1986d522f475Smrg for (row = 0; row < nparam; ++row) { 1987d522f475Smrg if_OPT_XMC_GLITCH(screen, { 1988d522f475Smrg Mark_XMC(xw, param[row]); 1989d522f475Smrg }); 1990d522f475Smrg TRACE(("CASE_SGR %d\n", param[row])); 1991d522f475Smrg switch (param[row]) { 1992d522f475Smrg case DEFAULT: 1993d522f475Smrg case 0: 1994d522f475Smrg xw->flags &= 1995d522f475Smrg ~(INVERSE | BOLD | BLINK | UNDERLINE | INVISIBLE); 1996d522f475Smrg if_OPT_ISO_COLORS(screen, { 1997d522f475Smrg reset_SGR_Colors(xw); 1998d522f475Smrg }); 1999d522f475Smrg break; 2000d522f475Smrg case 1: /* Bold */ 2001d522f475Smrg xw->flags |= BOLD; 2002d522f475Smrg if_OPT_ISO_COLORS(screen, { 2003d522f475Smrg setExtendedFG(xw); 2004d522f475Smrg }); 2005d522f475Smrg break; 2006d522f475Smrg case 5: /* Blink */ 2007d522f475Smrg xw->flags |= BLINK; 2008d522f475Smrg StartBlinking(screen); 2009d522f475Smrg if_OPT_ISO_COLORS(screen, { 2010d522f475Smrg setExtendedFG(xw); 2011d522f475Smrg }); 2012d522f475Smrg break; 2013d522f475Smrg case 4: /* Underscore */ 2014d522f475Smrg xw->flags |= UNDERLINE; 2015d522f475Smrg if_OPT_ISO_COLORS(screen, { 2016d522f475Smrg setExtendedFG(xw); 2017d522f475Smrg }); 2018d522f475Smrg break; 2019d522f475Smrg case 7: 2020d522f475Smrg xw->flags |= INVERSE; 2021d522f475Smrg if_OPT_ISO_COLORS(screen, { 2022d522f475Smrg setExtendedBG(xw); 2023d522f475Smrg }); 2024d522f475Smrg break; 2025d522f475Smrg case 8: 2026d522f475Smrg xw->flags |= INVISIBLE; 2027d522f475Smrg break; 2028d522f475Smrg case 22: /* reset 'bold' */ 2029d522f475Smrg xw->flags &= ~BOLD; 2030d522f475Smrg if_OPT_ISO_COLORS(screen, { 2031d522f475Smrg setExtendedFG(xw); 2032d522f475Smrg }); 2033d522f475Smrg break; 2034d522f475Smrg case 24: 2035d522f475Smrg xw->flags &= ~UNDERLINE; 2036d522f475Smrg if_OPT_ISO_COLORS(screen, { 2037d522f475Smrg setExtendedFG(xw); 2038d522f475Smrg }); 2039d522f475Smrg break; 2040d522f475Smrg case 25: /* reset 'blink' */ 2041d522f475Smrg xw->flags &= ~BLINK; 2042d522f475Smrg if_OPT_ISO_COLORS(screen, { 2043d522f475Smrg setExtendedFG(xw); 2044d522f475Smrg }); 2045d522f475Smrg break; 2046d522f475Smrg case 27: 2047d522f475Smrg xw->flags &= ~INVERSE; 2048d522f475Smrg if_OPT_ISO_COLORS(screen, { 2049d522f475Smrg setExtendedBG(xw); 2050d522f475Smrg }); 2051d522f475Smrg break; 2052d522f475Smrg case 28: 2053d522f475Smrg xw->flags &= ~INVISIBLE; 2054d522f475Smrg break; 2055d522f475Smrg case 30: 2056d522f475Smrg case 31: 2057d522f475Smrg case 32: 2058d522f475Smrg case 33: 2059d522f475Smrg case 34: 2060d522f475Smrg case 35: 2061d522f475Smrg case 36: 2062d522f475Smrg case 37: 2063d522f475Smrg if_OPT_ISO_COLORS(screen, { 2064d522f475Smrg xw->sgr_foreground = (param[row] - 30); 2065d522f475Smrg xw->sgr_extended = False; 2066d522f475Smrg setExtendedFG(xw); 2067d522f475Smrg }); 2068d522f475Smrg break; 2069d522f475Smrg case 38: 2070d522f475Smrg /* This is more complicated than I'd 2071d522f475Smrg like, but it should properly eat all 2072d522f475Smrg the parameters for unsupported modes 2073d522f475Smrg */ 2074d522f475Smrg if_OPT_ISO_COLORS(screen, { 2075d522f475Smrg row++; 2076d522f475Smrg if (row < nparam) { 2077d522f475Smrg switch (param[row]) { 2078d522f475Smrg case 5: 2079d522f475Smrg row++; 2080d522f475Smrg if (row < nparam && 2081d522f475Smrg param[row] < NUM_ANSI_COLORS) { 2082d522f475Smrg xw->sgr_foreground = param[row]; 2083d522f475Smrg xw->sgr_extended = True; 2084d522f475Smrg setExtendedFG(xw); 2085d522f475Smrg } 2086d522f475Smrg break; 2087d522f475Smrg default: 2088d522f475Smrg row += 7; 2089d522f475Smrg break; 2090d522f475Smrg } 2091d522f475Smrg } 2092d522f475Smrg }); 2093d522f475Smrg break; 2094d522f475Smrg case 39: 2095d522f475Smrg if_OPT_ISO_COLORS(screen, { 2096d522f475Smrg reset_SGR_Foreground(xw); 2097d522f475Smrg }); 2098d522f475Smrg break; 2099d522f475Smrg case 40: 2100d522f475Smrg case 41: 2101d522f475Smrg case 42: 2102d522f475Smrg case 43: 2103d522f475Smrg case 44: 2104d522f475Smrg case 45: 2105d522f475Smrg case 46: 2106d522f475Smrg case 47: 2107d522f475Smrg if_OPT_ISO_COLORS(screen, { 2108d522f475Smrg xw->sgr_background = (param[row] - 40); 2109d522f475Smrg setExtendedBG(xw); 2110d522f475Smrg }); 2111d522f475Smrg break; 2112d522f475Smrg case 48: 2113d522f475Smrg if_OPT_ISO_COLORS(screen, { 2114d522f475Smrg row++; 2115d522f475Smrg if (row < nparam) { 2116d522f475Smrg switch (param[row]) { 2117d522f475Smrg case 5: 2118d522f475Smrg row++; 2119d522f475Smrg if (row < nparam && 2120d522f475Smrg param[row] < NUM_ANSI_COLORS) { 2121d522f475Smrg xw->sgr_background = param[row]; 2122d522f475Smrg setExtendedBG(xw); 2123d522f475Smrg } 2124d522f475Smrg break; 2125d522f475Smrg default: 2126d522f475Smrg row += 7; 2127d522f475Smrg break; 2128d522f475Smrg } 2129d522f475Smrg } 2130d522f475Smrg }); 2131d522f475Smrg break; 2132d522f475Smrg case 49: 2133d522f475Smrg if_OPT_ISO_COLORS(screen, { 2134d522f475Smrg reset_SGR_Background(xw); 2135d522f475Smrg }); 2136d522f475Smrg break; 2137d522f475Smrg case 90: 2138d522f475Smrg case 91: 2139d522f475Smrg case 92: 2140d522f475Smrg case 93: 2141d522f475Smrg case 94: 2142d522f475Smrg case 95: 2143d522f475Smrg case 96: 2144d522f475Smrg case 97: 2145d522f475Smrg if_OPT_AIX_COLORS(screen, { 2146d522f475Smrg xw->sgr_foreground = (param[row] - 90 + 8); 2147d522f475Smrg xw->sgr_extended = False; 2148d522f475Smrg setExtendedFG(xw); 2149d522f475Smrg }); 2150d522f475Smrg break; 2151d522f475Smrg case 100: 2152d522f475Smrg#if !OPT_AIX_COLORS 2153d522f475Smrg if_OPT_ISO_COLORS(screen, { 2154d522f475Smrg reset_SGR_Foreground(xw); 2155d522f475Smrg reset_SGR_Background(xw); 2156d522f475Smrg }); 2157d522f475Smrg break; 2158d522f475Smrg#endif 2159d522f475Smrg case 101: 2160d522f475Smrg case 102: 2161d522f475Smrg case 103: 2162d522f475Smrg case 104: 2163d522f475Smrg case 105: 2164d522f475Smrg case 106: 2165d522f475Smrg case 107: 2166d522f475Smrg if_OPT_AIX_COLORS(screen, { 2167d522f475Smrg xw->sgr_background = (param[row] - 100 + 8); 2168d522f475Smrg setExtendedBG(xw); 2169d522f475Smrg }); 2170d522f475Smrg break; 2171d522f475Smrg } 2172d522f475Smrg } 2173d522f475Smrg sp->parsestate = sp->groundtable; 2174d522f475Smrg break; 2175d522f475Smrg 2176d522f475Smrg /* DSR (except for the '?') is a superset of CPR */ 2177d522f475Smrg case CASE_DSR: 2178d522f475Smrg sp->private_function = True; 2179d522f475Smrg 2180d522f475Smrg /* FALLTHRU */ 2181d522f475Smrg case CASE_CPR: 2182d522f475Smrg TRACE(("CASE_CPR - cursor position\n")); 2183d522f475Smrg count = 0; 2184d522f475Smrg reply.a_type = ANSI_CSI; 21852eaa94a1Schristos reply.a_pintro = CharOf(sp->private_function ? '?' : 0); 2186d522f475Smrg reply.a_inters = 0; 2187d522f475Smrg reply.a_final = 'n'; 2188d522f475Smrg 2189d522f475Smrg switch (param[0]) { 2190d522f475Smrg case 5: 2191d522f475Smrg /* operating status */ 2192d522f475Smrg reply.a_param[count++] = 0; /* (no malfunction ;-) */ 2193d522f475Smrg break; 2194d522f475Smrg case 6: 2195d522f475Smrg /* CPR */ 2196d522f475Smrg /* DECXCPR (with page=0) */ 21972eaa94a1Schristos reply.a_param[count++] = (ParmType) (screen->cur_row + 1); 21982eaa94a1Schristos reply.a_param[count++] = (ParmType) (screen->cur_col + 1); 2199d522f475Smrg reply.a_final = 'R'; 2200d522f475Smrg break; 2201d522f475Smrg case 15: 2202d522f475Smrg /* printer status */ 22032eaa94a1Schristos if (screen->terminal_id >= 200) { /* VT220 */ 22042eaa94a1Schristos reply.a_param[count++] = 13; /* implement printer */ 22052eaa94a1Schristos } 2206d522f475Smrg break; 2207d522f475Smrg case 25: 2208d522f475Smrg /* UDK status */ 22092eaa94a1Schristos if (screen->terminal_id >= 200) { /* VT220 */ 22102eaa94a1Schristos reply.a_param[count++] = 20; /* UDK always unlocked */ 22112eaa94a1Schristos } 2212d522f475Smrg break; 2213d522f475Smrg case 26: 2214d522f475Smrg /* keyboard status */ 22152eaa94a1Schristos if (screen->terminal_id >= 200) { /* VT220 */ 22162eaa94a1Schristos reply.a_param[count++] = 27; 22172eaa94a1Schristos reply.a_param[count++] = 1; /* North American */ 22182eaa94a1Schristos if (screen->terminal_id >= 400) { 22192eaa94a1Schristos reply.a_param[count++] = 0; /* ready */ 22202eaa94a1Schristos reply.a_param[count++] = 0; /* LK201 */ 22212eaa94a1Schristos } 2222d522f475Smrg } 2223d522f475Smrg break; 2224d522f475Smrg case 53: 2225d522f475Smrg /* Locator status */ 22262eaa94a1Schristos if (screen->terminal_id >= 200) { /* VT220 */ 2227d522f475Smrg#if OPT_DEC_LOCATOR 22282eaa94a1Schristos reply.a_param[count++] = 50; /* locator ready */ 2229d522f475Smrg#else 22302eaa94a1Schristos reply.a_param[count++] = 53; /* no locator */ 2231d522f475Smrg#endif 22322eaa94a1Schristos } 22332eaa94a1Schristos break; 22342eaa94a1Schristos default: 2235d522f475Smrg break; 2236d522f475Smrg } 2237d522f475Smrg 22382eaa94a1Schristos if ((reply.a_nparam = (ParmType) count) != 0) 2239d522f475Smrg unparseseq(xw, &reply); 2240d522f475Smrg 2241d522f475Smrg sp->parsestate = sp->groundtable; 2242d522f475Smrg sp->private_function = False; 2243d522f475Smrg break; 2244d522f475Smrg 2245d522f475Smrg case CASE_MC: 2246d522f475Smrg TRACE(("CASE_MC - media control\n")); 2247d522f475Smrg xtermMediaControl(param[0], False); 2248d522f475Smrg sp->parsestate = sp->groundtable; 2249d522f475Smrg break; 2250d522f475Smrg 2251d522f475Smrg case CASE_DEC_MC: 2252d522f475Smrg TRACE(("CASE_DEC_MC - DEC media control\n")); 2253d522f475Smrg xtermMediaControl(param[0], True); 2254d522f475Smrg sp->parsestate = sp->groundtable; 2255d522f475Smrg break; 2256d522f475Smrg 2257d522f475Smrg case CASE_HP_MEM_LOCK: 2258d522f475Smrg case CASE_HP_MEM_UNLOCK: 2259d522f475Smrg TRACE(("%s\n", ((sp->parsestate[c] == CASE_HP_MEM_LOCK) 2260d522f475Smrg ? "CASE_HP_MEM_LOCK" 2261d522f475Smrg : "CASE_HP_MEM_UNLOCK"))); 2262d522f475Smrg if (screen->scroll_amt) 2263d522f475Smrg FlushScroll(xw); 2264d522f475Smrg if (sp->parsestate[c] == CASE_HP_MEM_LOCK) 2265d522f475Smrg set_tb_margins(screen, screen->cur_row, screen->bot_marg); 2266d522f475Smrg else 2267d522f475Smrg set_tb_margins(screen, 0, screen->bot_marg); 2268d522f475Smrg sp->parsestate = sp->groundtable; 2269d522f475Smrg break; 2270d522f475Smrg 2271d522f475Smrg case CASE_DECSTBM: 2272d522f475Smrg TRACE(("CASE_DECSTBM - set scrolling region\n")); 2273d522f475Smrg if ((top = param[0]) < 1) 2274d522f475Smrg top = 1; 2275d522f475Smrg if (nparam < 2 || (bot = param[1]) == DEFAULT 2276d522f475Smrg || bot > MaxRows(screen) 2277d522f475Smrg || bot == 0) 2278d522f475Smrg bot = MaxRows(screen); 2279d522f475Smrg if (bot > top) { 2280d522f475Smrg if (screen->scroll_amt) 2281d522f475Smrg FlushScroll(xw); 2282d522f475Smrg set_tb_margins(screen, top - 1, bot - 1); 2283d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 2284d522f475Smrg } 2285d522f475Smrg sp->parsestate = sp->groundtable; 2286d522f475Smrg break; 2287d522f475Smrg 2288d522f475Smrg case CASE_DECREQTPARM: 2289d522f475Smrg TRACE(("CASE_DECREQTPARM\n")); 2290d522f475Smrg if (screen->terminal_id < 200) { /* VT102 */ 2291d522f475Smrg if ((row = param[0]) == DEFAULT) 2292d522f475Smrg row = 0; 2293d522f475Smrg if (row == 0 || row == 1) { 2294d522f475Smrg reply.a_type = ANSI_CSI; 2295d522f475Smrg reply.a_pintro = 0; 2296d522f475Smrg reply.a_nparam = 7; 22972eaa94a1Schristos reply.a_param[0] = (ParmType) (row + 2); 2298d522f475Smrg reply.a_param[1] = 1; /* no parity */ 2299d522f475Smrg reply.a_param[2] = 1; /* eight bits */ 2300d522f475Smrg reply.a_param[3] = 128; /* transmit 38.4k baud */ 2301d522f475Smrg reply.a_param[4] = 128; /* receive 38.4k baud */ 2302d522f475Smrg reply.a_param[5] = 1; /* clock multiplier ? */ 2303d522f475Smrg reply.a_param[6] = 0; /* STP flags ? */ 2304d522f475Smrg reply.a_inters = 0; 2305d522f475Smrg reply.a_final = 'x'; 2306d522f475Smrg unparseseq(xw, &reply); 2307d522f475Smrg } 2308d522f475Smrg } 2309d522f475Smrg sp->parsestate = sp->groundtable; 2310d522f475Smrg break; 2311d522f475Smrg 2312d522f475Smrg case CASE_DECSET: 2313d522f475Smrg /* DECSET */ 2314d522f475Smrg#if OPT_VT52_MODE 2315d522f475Smrg if (screen->vtXX_level != 0) 2316d522f475Smrg#endif 2317d522f475Smrg dpmodes(xw, bitset); 2318d522f475Smrg sp->parsestate = sp->groundtable; 2319d522f475Smrg#if OPT_TEK4014 2320d522f475Smrg if (TEK4014_ACTIVE(xw)) 2321d522f475Smrg return False; 2322d522f475Smrg#endif 2323d522f475Smrg break; 2324d522f475Smrg 2325d522f475Smrg case CASE_DECRST: 2326d522f475Smrg /* DECRST */ 2327d522f475Smrg dpmodes(xw, bitclr); 23282eaa94a1Schristos init_groundtable(screen, sp); 2329d522f475Smrg sp->parsestate = sp->groundtable; 2330d522f475Smrg break; 2331d522f475Smrg 2332d522f475Smrg case CASE_DECALN: 2333d522f475Smrg TRACE(("CASE_DECALN - alignment test\n")); 2334d522f475Smrg if (screen->cursor_state) 2335d522f475Smrg HideCursor(); 2336d522f475Smrg set_tb_margins(screen, 0, screen->max_row); 2337d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 2338d522f475Smrg xtermParseRect(xw, 0, 0, &myRect); 2339d522f475Smrg ScrnFillRectangle(xw, &myRect, 'E', 0, False); 2340d522f475Smrg sp->parsestate = sp->groundtable; 2341d522f475Smrg break; 2342d522f475Smrg 2343d522f475Smrg case CASE_GSETS: 2344d522f475Smrg TRACE(("CASE_GSETS(%d) = '%c'\n", sp->scstype, c)); 2345d522f475Smrg if (screen->vtXX_level != 0) 23462eaa94a1Schristos screen->gsets[sp->scstype] = CharOf(c); 2347d522f475Smrg sp->parsestate = sp->groundtable; 2348d522f475Smrg break; 2349d522f475Smrg 2350d522f475Smrg case CASE_DECSC: 2351d522f475Smrg TRACE(("CASE_DECSC - save cursor\n")); 2352d522f475Smrg CursorSave(xw); 2353d522f475Smrg sp->parsestate = sp->groundtable; 2354d522f475Smrg break; 2355d522f475Smrg 2356d522f475Smrg case CASE_DECRC: 2357d522f475Smrg TRACE(("CASE_DECRC - restore cursor\n")); 2358d522f475Smrg CursorRestore(xw); 2359d522f475Smrg if_OPT_ISO_COLORS(screen, { 2360d522f475Smrg setExtendedFG(xw); 2361d522f475Smrg }); 2362d522f475Smrg sp->parsestate = sp->groundtable; 2363d522f475Smrg break; 2364d522f475Smrg 2365d522f475Smrg case CASE_DECKPAM: 2366d522f475Smrg TRACE(("CASE_DECKPAM\n")); 2367d522f475Smrg xw->keyboard.flags |= MODE_DECKPAM; 2368d522f475Smrg update_appkeypad(); 2369d522f475Smrg sp->parsestate = sp->groundtable; 2370d522f475Smrg break; 2371d522f475Smrg 2372d522f475Smrg case CASE_DECKPNM: 2373d522f475Smrg TRACE(("CASE_DECKPNM\n")); 2374d522f475Smrg xw->keyboard.flags &= ~MODE_DECKPAM; 2375d522f475Smrg update_appkeypad(); 2376d522f475Smrg sp->parsestate = sp->groundtable; 2377d522f475Smrg break; 2378d522f475Smrg 2379d522f475Smrg case CASE_CSI_QUOTE_STATE: 2380d522f475Smrg sp->parsestate = csi_quo_table; 2381d522f475Smrg break; 2382d522f475Smrg 2383d522f475Smrg#if OPT_VT52_MODE 2384d522f475Smrg case CASE_VT52_FINISH: 2385d522f475Smrg TRACE(("CASE_VT52_FINISH terminal_id %d, vtXX_level %d\n", 2386d522f475Smrg screen->terminal_id, 2387d522f475Smrg screen->vtXX_level)); 2388d522f475Smrg if (screen->terminal_id >= 100 2389d522f475Smrg && screen->vtXX_level == 0) { 2390d522f475Smrg sp->groundtable = 2391d522f475Smrg sp->parsestate = ansi_table; 2392d522f475Smrg screen->vtXX_level = screen->vt52_save_level; 2393d522f475Smrg screen->curgl = screen->vt52_save_curgl; 2394d522f475Smrg screen->curgr = screen->vt52_save_curgr; 2395d522f475Smrg screen->curss = screen->vt52_save_curss; 2396d522f475Smrg memmove(screen->gsets, screen->vt52_save_gsets, sizeof(screen->gsets)); 2397d522f475Smrg } 2398d522f475Smrg break; 2399d522f475Smrg#endif 2400d522f475Smrg 2401d522f475Smrg case CASE_ANSI_LEVEL_1: 2402d522f475Smrg TRACE(("CASE_ANSI_LEVEL_1\n")); 2403d522f475Smrg set_ansi_conformance(screen, 1); 2404d522f475Smrg sp->parsestate = sp->groundtable; 2405d522f475Smrg break; 2406d522f475Smrg 2407d522f475Smrg case CASE_ANSI_LEVEL_2: 2408d522f475Smrg TRACE(("CASE_ANSI_LEVEL_2\n")); 2409d522f475Smrg set_ansi_conformance(screen, 2); 2410d522f475Smrg sp->parsestate = sp->groundtable; 2411d522f475Smrg break; 2412d522f475Smrg 2413d522f475Smrg case CASE_ANSI_LEVEL_3: 2414d522f475Smrg TRACE(("CASE_ANSI_LEVEL_3\n")); 2415d522f475Smrg set_ansi_conformance(screen, 3); 2416d522f475Smrg sp->parsestate = sp->groundtable; 2417d522f475Smrg break; 2418d522f475Smrg 2419d522f475Smrg case CASE_DECSCL: 2420d522f475Smrg TRACE(("CASE_DECSCL(%d,%d)\n", param[0], param[1])); 2421d522f475Smrg if (param[0] >= 61 && param[0] <= 65) { 2422d522f475Smrg /* 2423d522f475Smrg * VT300, VT420, VT520 manuals claim that DECSCL does a hard 2424d522f475Smrg * reset (RIS). VT220 manual states that it is a soft reset. 2425d522f475Smrg * Perhaps both are right (unlikely). Kermit says it's soft. 2426d522f475Smrg */ 2427d522f475Smrg VTReset(xw, False, False); 2428d522f475Smrg screen->vtXX_level = param[0] - 60; 2429d522f475Smrg if (param[0] > 61) { 2430d522f475Smrg if (param[1] == 1) 2431d522f475Smrg show_8bit_control(False); 2432d522f475Smrg else if (param[1] == 0 || param[1] == 2) 2433d522f475Smrg show_8bit_control(True); 2434d522f475Smrg } 2435d522f475Smrg } 2436d522f475Smrg sp->parsestate = sp->groundtable; 2437d522f475Smrg break; 2438d522f475Smrg 2439d522f475Smrg case CASE_DECSCA: 2440d522f475Smrg TRACE(("CASE_DECSCA\n")); 2441d522f475Smrg screen->protected_mode = DEC_PROTECT; 2442d522f475Smrg if (param[0] <= 0 || param[0] == 2) 2443d522f475Smrg xw->flags &= ~PROTECTED; 2444d522f475Smrg else if (param[0] == 1) 2445d522f475Smrg xw->flags |= PROTECTED; 2446d522f475Smrg sp->parsestate = sp->groundtable; 2447d522f475Smrg break; 2448d522f475Smrg 2449d522f475Smrg case CASE_DECSED: 2450d522f475Smrg TRACE(("CASE_DECSED\n")); 2451d522f475Smrg do_erase_display(xw, param[0], DEC_PROTECT); 2452d522f475Smrg sp->parsestate = sp->groundtable; 2453d522f475Smrg break; 2454d522f475Smrg 2455d522f475Smrg case CASE_DECSEL: 2456d522f475Smrg TRACE(("CASE_DECSEL\n")); 2457d522f475Smrg do_erase_line(xw, param[0], DEC_PROTECT); 2458d522f475Smrg sp->parsestate = sp->groundtable; 2459d522f475Smrg break; 2460d522f475Smrg 2461d522f475Smrg case CASE_ST: 2462d522f475Smrg TRACE(("CASE_ST: End of String (%d bytes)\n", string_used)); 2463d522f475Smrg sp->parsestate = sp->groundtable; 2464d522f475Smrg if (!string_used) 2465d522f475Smrg break; 2466d522f475Smrg string_area[--string_used] = '\0'; 2467d522f475Smrg switch (sp->string_mode) { 2468d522f475Smrg case ANSI_APC: 2469d522f475Smrg /* ignored */ 2470d522f475Smrg break; 2471d522f475Smrg case ANSI_DCS: 2472d522f475Smrg do_dcs(xw, string_area, string_used); 2473d522f475Smrg break; 2474d522f475Smrg case ANSI_OSC: 2475d522f475Smrg do_osc(xw, string_area, string_used, ANSI_ST); 2476d522f475Smrg break; 2477d522f475Smrg case ANSI_PM: 2478d522f475Smrg /* ignored */ 2479d522f475Smrg break; 2480d522f475Smrg case ANSI_SOS: 2481d522f475Smrg /* ignored */ 2482d522f475Smrg break; 2483d522f475Smrg } 2484d522f475Smrg break; 2485d522f475Smrg 2486d522f475Smrg case CASE_SOS: 2487d522f475Smrg TRACE(("CASE_SOS: Start of String\n")); 2488d522f475Smrg sp->string_mode = ANSI_SOS; 2489d522f475Smrg sp->parsestate = sos_table; 2490d522f475Smrg break; 2491d522f475Smrg 2492d522f475Smrg case CASE_PM: 2493d522f475Smrg TRACE(("CASE_PM: Privacy Message\n")); 2494d522f475Smrg sp->string_mode = ANSI_PM; 2495d522f475Smrg sp->parsestate = sos_table; 2496d522f475Smrg break; 2497d522f475Smrg 2498d522f475Smrg case CASE_DCS: 2499d522f475Smrg TRACE(("CASE_DCS: Device Control String\n")); 2500d522f475Smrg sp->string_mode = ANSI_DCS; 2501d522f475Smrg sp->parsestate = sos_table; 2502d522f475Smrg break; 2503d522f475Smrg 2504d522f475Smrg case CASE_APC: 2505d522f475Smrg TRACE(("CASE_APC: Application Program Command\n")); 2506d522f475Smrg sp->string_mode = ANSI_APC; 2507d522f475Smrg sp->parsestate = sos_table; 2508d522f475Smrg break; 2509d522f475Smrg 2510d522f475Smrg case CASE_SPA: 2511d522f475Smrg TRACE(("CASE_SPA - start protected area\n")); 2512d522f475Smrg screen->protected_mode = ISO_PROTECT; 2513d522f475Smrg xw->flags |= PROTECTED; 2514d522f475Smrg sp->parsestate = sp->groundtable; 2515d522f475Smrg break; 2516d522f475Smrg 2517d522f475Smrg case CASE_EPA: 2518d522f475Smrg TRACE(("CASE_EPA - end protected area\n")); 2519d522f475Smrg xw->flags &= ~PROTECTED; 2520d522f475Smrg sp->parsestate = sp->groundtable; 2521d522f475Smrg break; 2522d522f475Smrg 2523d522f475Smrg case CASE_SU: 2524d522f475Smrg TRACE(("CASE_SU - scroll up\n")); 2525d522f475Smrg if ((count = param[0]) < 1) 2526d522f475Smrg count = 1; 2527d522f475Smrg xtermScroll(xw, count); 2528d522f475Smrg sp->parsestate = sp->groundtable; 2529d522f475Smrg break; 2530d522f475Smrg 2531d522f475Smrg case CASE_IND: 2532d522f475Smrg TRACE(("CASE_IND - index\n")); 2533d522f475Smrg xtermIndex(xw, 1); 2534d522f475Smrg do_xevents(); 2535d522f475Smrg sp->parsestate = sp->groundtable; 2536d522f475Smrg break; 2537d522f475Smrg 2538d522f475Smrg case CASE_CPL: 2539d522f475Smrg TRACE(("CASE_CPL - cursor prev line\n")); 2540d522f475Smrg CursorPrevLine(screen, param[0]); 2541d522f475Smrg sp->parsestate = sp->groundtable; 2542d522f475Smrg break; 2543d522f475Smrg 2544d522f475Smrg case CASE_CNL: 2545d522f475Smrg TRACE(("CASE_CNL - cursor next line\n")); 2546d522f475Smrg CursorNextLine(screen, param[0]); 2547d522f475Smrg sp->parsestate = sp->groundtable; 2548d522f475Smrg break; 2549d522f475Smrg 2550d522f475Smrg case CASE_NEL: 2551d522f475Smrg TRACE(("CASE_NEL\n")); 2552d522f475Smrg xtermIndex(xw, 1); 2553d522f475Smrg CarriageReturn(screen); 2554d522f475Smrg sp->parsestate = sp->groundtable; 2555d522f475Smrg break; 2556d522f475Smrg 2557d522f475Smrg case CASE_HTS: 2558d522f475Smrg TRACE(("CASE_HTS - horizontal tab set\n")); 2559d522f475Smrg TabSet(xw->tabs, screen->cur_col); 2560d522f475Smrg sp->parsestate = sp->groundtable; 2561d522f475Smrg break; 2562d522f475Smrg 2563d522f475Smrg case CASE_RI: 2564d522f475Smrg TRACE(("CASE_RI - reverse index\n")); 2565d522f475Smrg RevIndex(xw, 1); 2566d522f475Smrg sp->parsestate = sp->groundtable; 2567d522f475Smrg break; 2568d522f475Smrg 2569d522f475Smrg case CASE_SS2: 2570d522f475Smrg TRACE(("CASE_SS2\n")); 2571d522f475Smrg screen->curss = 2; 2572d522f475Smrg sp->parsestate = sp->groundtable; 2573d522f475Smrg break; 2574d522f475Smrg 2575d522f475Smrg case CASE_SS3: 2576d522f475Smrg TRACE(("CASE_SS3\n")); 2577d522f475Smrg screen->curss = 3; 2578d522f475Smrg sp->parsestate = sp->groundtable; 2579d522f475Smrg break; 2580d522f475Smrg 2581d522f475Smrg case CASE_CSI_STATE: 2582d522f475Smrg /* enter csi state */ 2583d522f475Smrg nparam = 1; 2584d522f475Smrg param[0] = DEFAULT; 2585d522f475Smrg sp->parsestate = csi_table; 2586d522f475Smrg break; 2587d522f475Smrg 2588d522f475Smrg case CASE_ESC_SP_STATE: 2589d522f475Smrg /* esc space */ 2590d522f475Smrg sp->parsestate = esc_sp_table; 2591d522f475Smrg break; 2592d522f475Smrg 2593d522f475Smrg case CASE_CSI_EX_STATE: 2594d522f475Smrg /* csi exclamation */ 2595d522f475Smrg sp->parsestate = csi_ex_table; 2596d522f475Smrg break; 2597d522f475Smrg 2598d522f475Smrg#if OPT_DEC_LOCATOR 2599d522f475Smrg case CASE_CSI_TICK_STATE: 2600d522f475Smrg /* csi tick (') */ 2601d522f475Smrg sp->parsestate = csi_tick_table; 2602d522f475Smrg break; 2603d522f475Smrg 2604d522f475Smrg case CASE_DECEFR: 2605d522f475Smrg TRACE(("CASE_DECEFR - Enable Filter Rectangle\n")); 2606d522f475Smrg if (screen->send_mouse_pos == DEC_LOCATOR) { 2607d522f475Smrg MotionOff(screen, xw); 2608d522f475Smrg if ((screen->loc_filter_top = param[0]) < 1) 2609d522f475Smrg screen->loc_filter_top = LOC_FILTER_POS; 2610d522f475Smrg if (nparam < 2 || (screen->loc_filter_left = param[1]) < 1) 2611d522f475Smrg screen->loc_filter_left = LOC_FILTER_POS; 2612d522f475Smrg if (nparam < 3 || (screen->loc_filter_bottom = param[2]) < 1) 2613d522f475Smrg screen->loc_filter_bottom = LOC_FILTER_POS; 2614d522f475Smrg if (nparam < 4 || (screen->loc_filter_right = param[3]) < 1) 2615d522f475Smrg screen->loc_filter_right = LOC_FILTER_POS; 2616d522f475Smrg InitLocatorFilter(xw); 2617d522f475Smrg } 2618d522f475Smrg sp->parsestate = sp->groundtable; 2619d522f475Smrg break; 2620d522f475Smrg 2621d522f475Smrg case CASE_DECELR: 2622d522f475Smrg MotionOff(screen, xw); 2623d522f475Smrg if (param[0] <= 0 || param[0] > 2) { 2624d522f475Smrg screen->send_mouse_pos = MOUSE_OFF; 2625d522f475Smrg TRACE(("DECELR - Disable Locator Reports\n")); 2626d522f475Smrg } else { 2627d522f475Smrg TRACE(("DECELR - Enable Locator Reports\n")); 2628d522f475Smrg screen->send_mouse_pos = DEC_LOCATOR; 2629d522f475Smrg xtermShowPointer(xw, True); 2630d522f475Smrg if (param[0] == 2) { 2631d522f475Smrg screen->locator_reset = True; 2632d522f475Smrg } else { 2633d522f475Smrg screen->locator_reset = False; 2634d522f475Smrg } 2635d522f475Smrg if (nparam < 2 || param[1] != 1) { 2636d522f475Smrg screen->locator_pixels = False; 2637d522f475Smrg } else { 2638d522f475Smrg screen->locator_pixels = True; 2639d522f475Smrg } 2640d522f475Smrg screen->loc_filter = False; 2641d522f475Smrg } 2642d522f475Smrg sp->parsestate = sp->groundtable; 2643d522f475Smrg break; 2644d522f475Smrg 2645d522f475Smrg case CASE_DECSLE: 2646d522f475Smrg TRACE(("DECSLE - Select Locator Events\n")); 2647d522f475Smrg for (count = 0; count < nparam; ++count) { 2648d522f475Smrg switch (param[count]) { 2649d522f475Smrg case DEFAULT: 2650d522f475Smrg case 0: 2651d522f475Smrg MotionOff(screen, xw); 2652d522f475Smrg screen->loc_filter = False; 2653d522f475Smrg screen->locator_events = 0; 2654d522f475Smrg break; 2655d522f475Smrg case 1: 2656d522f475Smrg screen->locator_events |= LOC_BTNS_DN; 2657d522f475Smrg break; 2658d522f475Smrg case 2: 2659d522f475Smrg screen->locator_events &= ~LOC_BTNS_DN; 2660d522f475Smrg break; 2661d522f475Smrg case 3: 2662d522f475Smrg screen->locator_events |= LOC_BTNS_UP; 2663d522f475Smrg break; 2664d522f475Smrg case 4: 2665d522f475Smrg screen->locator_events &= ~LOC_BTNS_UP; 2666d522f475Smrg break; 2667d522f475Smrg } 2668d522f475Smrg } 2669d522f475Smrg sp->parsestate = sp->groundtable; 2670d522f475Smrg break; 2671d522f475Smrg 2672d522f475Smrg case CASE_DECRQLP: 2673d522f475Smrg TRACE(("DECRQLP - Request Locator Position\n")); 2674d522f475Smrg if (param[0] < 2) { 2675d522f475Smrg /* Issue DECLRP Locator Position Report */ 2676d522f475Smrg GetLocatorPosition(xw); 2677d522f475Smrg } 2678d522f475Smrg sp->parsestate = sp->groundtable; 2679d522f475Smrg break; 2680d522f475Smrg#endif /* OPT_DEC_LOCATOR */ 2681d522f475Smrg 2682d522f475Smrg#if OPT_DEC_RECTOPS 2683d522f475Smrg case CASE_CSI_DOLLAR_STATE: 2684d522f475Smrg /* csi dollar ($) */ 2685d522f475Smrg if (screen->vtXX_level >= 4) 2686d522f475Smrg sp->parsestate = csi_dollar_table; 2687d522f475Smrg else 2688d522f475Smrg sp->parsestate = eigtable; 2689d522f475Smrg break; 2690d522f475Smrg 2691d522f475Smrg case CASE_CSI_STAR_STATE: 2692d522f475Smrg /* csi dollar (*) */ 2693d522f475Smrg if (screen->vtXX_level >= 4) 2694d522f475Smrg sp->parsestate = csi_star_table; 2695d522f475Smrg else 2696d522f475Smrg sp->parsestate = eigtable; 2697d522f475Smrg break; 2698d522f475Smrg 2699d522f475Smrg case CASE_DECCRA: 2700d522f475Smrg TRACE(("CASE_DECCRA - Copy rectangular area\n")); 2701d522f475Smrg xtermParseRect(xw, nparam, param, &myRect); 2702d522f475Smrg ScrnCopyRectangle(xw, &myRect, nparam - 5, param + 5); 2703d522f475Smrg sp->parsestate = sp->groundtable; 2704d522f475Smrg break; 2705d522f475Smrg 2706d522f475Smrg case CASE_DECERA: 2707d522f475Smrg TRACE(("CASE_DECERA - Erase rectangular area\n")); 2708d522f475Smrg xtermParseRect(xw, nparam, param, &myRect); 2709d522f475Smrg ScrnFillRectangle(xw, &myRect, ' ', 0, True); 2710d522f475Smrg sp->parsestate = sp->groundtable; 2711d522f475Smrg break; 2712d522f475Smrg 2713d522f475Smrg case CASE_DECFRA: 2714d522f475Smrg TRACE(("CASE_DECFRA - Fill rectangular area\n")); 2715d522f475Smrg if (nparam > 0 2716d522f475Smrg && ((param[0] >= 32 && param[0] <= 126) 2717d522f475Smrg || (param[0] >= 160 && param[0] <= 255))) { 2718d522f475Smrg xtermParseRect(xw, nparam - 1, param + 1, &myRect); 2719d522f475Smrg ScrnFillRectangle(xw, &myRect, param[0], xw->flags, True); 2720d522f475Smrg } 2721d522f475Smrg sp->parsestate = sp->groundtable; 2722d522f475Smrg break; 2723d522f475Smrg 2724d522f475Smrg case CASE_DECSERA: 2725d522f475Smrg TRACE(("CASE_DECSERA - Selective erase rectangular area\n")); 2726d522f475Smrg xtermParseRect(xw, nparam > 4 ? 4 : nparam, param, &myRect); 2727d522f475Smrg ScrnWipeRectangle(xw, &myRect); 2728d522f475Smrg sp->parsestate = sp->groundtable; 2729d522f475Smrg break; 2730d522f475Smrg 2731d522f475Smrg case CASE_DECSACE: 2732d522f475Smrg TRACE(("CASE_DECSACE - Select attribute change extent\n")); 2733d522f475Smrg screen->cur_decsace = param[0]; 2734d522f475Smrg sp->parsestate = sp->groundtable; 2735d522f475Smrg break; 2736d522f475Smrg 2737d522f475Smrg case CASE_DECCARA: 2738d522f475Smrg TRACE(("CASE_DECCARA - Change attributes in rectangular area\n")); 2739d522f475Smrg xtermParseRect(xw, nparam > 4 ? 4 : nparam, param, &myRect); 2740d522f475Smrg ScrnMarkRectangle(xw, &myRect, False, nparam - 4, param + 4); 2741d522f475Smrg sp->parsestate = sp->groundtable; 2742d522f475Smrg break; 2743d522f475Smrg 2744d522f475Smrg case CASE_DECRARA: 2745d522f475Smrg TRACE(("CASE_DECRARA - Reverse attributes in rectangular area\n")); 2746d522f475Smrg xtermParseRect(xw, nparam > 4 ? 4 : nparam, param, &myRect); 2747d522f475Smrg ScrnMarkRectangle(xw, &myRect, True, nparam - 4, param + 4); 2748d522f475Smrg sp->parsestate = sp->groundtable; 2749d522f475Smrg break; 2750d522f475Smrg#else 2751d522f475Smrg case CASE_CSI_DOLLAR_STATE: 2752d522f475Smrg /* csi dollar ($) */ 2753d522f475Smrg sp->parsestate = eigtable; 2754d522f475Smrg break; 2755d522f475Smrg 2756d522f475Smrg case CASE_CSI_STAR_STATE: 2757d522f475Smrg /* csi dollar (*) */ 2758d522f475Smrg sp->parsestate = eigtable; 2759d522f475Smrg break; 2760d522f475Smrg#endif /* OPT_DEC_RECTOPS */ 2761d522f475Smrg 2762d522f475Smrg case CASE_S7C1T: 2763d522f475Smrg TRACE(("CASE_S7C1T\n")); 2764d522f475Smrg show_8bit_control(False); 2765d522f475Smrg sp->parsestate = sp->groundtable; 2766d522f475Smrg break; 2767d522f475Smrg 2768d522f475Smrg case CASE_S8C1T: 2769d522f475Smrg TRACE(("CASE_S8C1T\n")); 2770d522f475Smrg#if OPT_VT52_MODE 2771d522f475Smrg if (screen->vtXX_level <= 1) 2772d522f475Smrg break; 2773d522f475Smrg#endif 2774d522f475Smrg show_8bit_control(True); 2775d522f475Smrg sp->parsestate = sp->groundtable; 2776d522f475Smrg break; 2777d522f475Smrg 2778d522f475Smrg case CASE_OSC: 2779d522f475Smrg TRACE(("CASE_OSC: Operating System Command\n")); 2780d522f475Smrg sp->parsestate = sos_table; 2781d522f475Smrg sp->string_mode = ANSI_OSC; 2782d522f475Smrg break; 2783d522f475Smrg 2784d522f475Smrg case CASE_RIS: 2785d522f475Smrg TRACE(("CASE_RIS\n")); 2786d522f475Smrg VTReset(xw, True, True); 2787d522f475Smrg sp->parsestate = sp->groundtable; 2788d522f475Smrg break; 2789d522f475Smrg 2790d522f475Smrg case CASE_DECSTR: 2791d522f475Smrg TRACE(("CASE_DECSTR\n")); 2792d522f475Smrg VTReset(xw, False, False); 2793d522f475Smrg sp->parsestate = sp->groundtable; 2794d522f475Smrg break; 2795d522f475Smrg 2796d522f475Smrg case CASE_REP: 2797d522f475Smrg TRACE(("CASE_REP\n")); 2798d522f475Smrg if (sp->lastchar >= 0 && 2799d522f475Smrg sp->lastchar < 256 && 2800d522f475Smrg sp->groundtable[E2A(sp->lastchar)] == CASE_PRINT) { 2801d522f475Smrg IChar repeated[2]; 2802d522f475Smrg count = (param[0] < 1) ? 1 : param[0]; 28032eaa94a1Schristos repeated[0] = (IChar) sp->lastchar; 2804d522f475Smrg while (count-- > 0) { 2805d522f475Smrg dotext(xw, 2806d522f475Smrg screen->gsets[(int) (screen->curgl)], 2807d522f475Smrg repeated, 1); 2808d522f475Smrg } 2809d522f475Smrg } 2810d522f475Smrg sp->parsestate = sp->groundtable; 2811d522f475Smrg break; 2812d522f475Smrg 2813d522f475Smrg case CASE_LS2: 2814d522f475Smrg TRACE(("CASE_LS2\n")); 2815d522f475Smrg screen->curgl = 2; 2816d522f475Smrg sp->parsestate = sp->groundtable; 2817d522f475Smrg break; 2818d522f475Smrg 2819d522f475Smrg case CASE_LS3: 2820d522f475Smrg TRACE(("CASE_LS3\n")); 2821d522f475Smrg screen->curgl = 3; 2822d522f475Smrg sp->parsestate = sp->groundtable; 2823d522f475Smrg break; 2824d522f475Smrg 2825d522f475Smrg case CASE_LS3R: 2826d522f475Smrg TRACE(("CASE_LS3R\n")); 2827d522f475Smrg screen->curgr = 3; 2828d522f475Smrg sp->parsestate = sp->groundtable; 2829d522f475Smrg break; 2830d522f475Smrg 2831d522f475Smrg case CASE_LS2R: 2832d522f475Smrg TRACE(("CASE_LS2R\n")); 2833d522f475Smrg screen->curgr = 2; 2834d522f475Smrg sp->parsestate = sp->groundtable; 2835d522f475Smrg break; 2836d522f475Smrg 2837d522f475Smrg case CASE_LS1R: 2838d522f475Smrg TRACE(("CASE_LS1R\n")); 2839d522f475Smrg screen->curgr = 1; 2840d522f475Smrg sp->parsestate = sp->groundtable; 2841d522f475Smrg break; 2842d522f475Smrg 2843d522f475Smrg case CASE_XTERM_SAVE: 2844d522f475Smrg savemodes(xw); 2845d522f475Smrg sp->parsestate = sp->groundtable; 2846d522f475Smrg break; 2847d522f475Smrg 2848d522f475Smrg case CASE_XTERM_RESTORE: 2849d522f475Smrg restoremodes(xw); 2850d522f475Smrg sp->parsestate = sp->groundtable; 2851d522f475Smrg break; 2852d522f475Smrg 2853d522f475Smrg case CASE_XTERM_WINOPS: 2854d522f475Smrg TRACE(("CASE_XTERM_WINOPS\n")); 2855d522f475Smrg if (screen->allowWindowOps) 2856d522f475Smrg window_ops(xw); 2857d522f475Smrg sp->parsestate = sp->groundtable; 2858d522f475Smrg break; 2859d522f475Smrg#if OPT_WIDE_CHARS 2860d522f475Smrg case CASE_ESC_PERCENT: 2861d522f475Smrg sp->parsestate = esc_pct_table; 2862d522f475Smrg break; 2863d522f475Smrg 2864d522f475Smrg case CASE_UTF8: 2865d522f475Smrg /* If we did not set UTF-8 mode from resource or the 2866d522f475Smrg * command-line, allow it to be enabled/disabled by 2867d522f475Smrg * control sequence. 2868d522f475Smrg */ 2869d522f475Smrg if (!screen->wide_chars) { 2870d522f475Smrg WriteNow(); 2871d522f475Smrg ChangeToWide(xw); 2872d522f475Smrg } 2873d522f475Smrg if (screen->wide_chars 2874d522f475Smrg && screen->utf8_mode != uAlways) { 2875d522f475Smrg switchPtyData(screen, c == 'G'); 2876d522f475Smrg TRACE(("UTF8 mode %s\n", 2877d522f475Smrg BtoS(screen->utf8_mode))); 2878d522f475Smrg } else { 2879d522f475Smrg TRACE(("UTF8 mode NOT turned %s (%s)\n", 2880d522f475Smrg BtoS(c == 'G'), 2881d522f475Smrg (screen->utf8_mode == uAlways) 2882d522f475Smrg ? "UTF-8 mode set from command-line" 2883d522f475Smrg : "wideChars resource was not set")); 2884d522f475Smrg } 2885d522f475Smrg sp->parsestate = sp->groundtable; 2886d522f475Smrg break; 2887d522f475Smrg#endif 2888d522f475Smrg#if OPT_MOD_FKEYS 2889d522f475Smrg case CASE_SET_MOD_FKEYS: 2890d522f475Smrg TRACE(("CASE_SET_MOD_FKEYS\n")); 2891d522f475Smrg if (nparam >= 1) { 2892d522f475Smrg set_mod_fkeys(xw, param[0], nparam > 1 ? param[1] : DEFAULT, True); 2893d522f475Smrg } else { 2894d522f475Smrg for (row = 1; row <= 5; ++row) 2895d522f475Smrg set_mod_fkeys(xw, row, DEFAULT, True); 2896d522f475Smrg } 2897d522f475Smrg break; 2898d522f475Smrg case CASE_SET_MOD_FKEYS0: 2899d522f475Smrg TRACE(("CASE_SET_MOD_FKEYS0\n")); 2900d522f475Smrg if (nparam >= 1 && param[0] != DEFAULT) { 2901d522f475Smrg set_mod_fkeys(xw, param[0], -1, False); 2902d522f475Smrg } else { 2903d522f475Smrg xw->keyboard.modify_now.function_keys = -1; 2904d522f475Smrg } 2905d522f475Smrg break; 2906d522f475Smrg#endif 2907d522f475Smrg case CASE_HIDE_POINTER: 2908d522f475Smrg TRACE(("CASE_HIDE_POINTER\n")); 2909d522f475Smrg if (nparam >= 1 && param[0] != DEFAULT) { 2910d522f475Smrg screen->pointer_mode = param[0]; 2911d522f475Smrg } else { 2912d522f475Smrg screen->pointer_mode = DEF_POINTER_MODE; 2913d522f475Smrg } 2914d522f475Smrg break; 2915d522f475Smrg 2916d522f475Smrg case CASE_CSI_IGNORE: 2917d522f475Smrg sp->parsestate = cigtable; 2918d522f475Smrg break; 2919d522f475Smrg } 2920d522f475Smrg if (sp->parsestate == sp->groundtable) 2921d522f475Smrg sp->lastchar = thischar; 2922d522f475Smrg } while (0); 2923d522f475Smrg 2924d522f475Smrg#if OPT_WIDE_CHARS 29252eaa94a1Schristos screen->utf8_inparse = (Boolean) ((screen->utf8_mode != uFalse) 29262eaa94a1Schristos && (sp->parsestate != sos_table)); 2927d522f475Smrg#endif 2928d522f475Smrg 2929d522f475Smrg return True; 2930d522f475Smrg} 2931d522f475Smrg 2932d522f475Smrgstatic void 2933d522f475SmrgVTparse(XtermWidget xw) 2934d522f475Smrg{ 2935d522f475Smrg TScreen *screen; 2936d522f475Smrg 2937d522f475Smrg /* We longjmp back to this point in VTReset() */ 2938d522f475Smrg (void) setjmp(vtjmpbuf); 2939d522f475Smrg screen = &xw->screen; 2940d522f475Smrg memset(&myState, 0, sizeof(myState)); 29412eaa94a1Schristos myState.scssize = 94; /* number of printable/nonspace ASCII */ 2942d522f475Smrg myState.lastchar = -1; /* not a legal IChar */ 2943d522f475Smrg myState.nextstate = -1; /* not a legal state */ 2944d522f475Smrg 29452eaa94a1Schristos init_groundtable(screen, &myState); 29462eaa94a1Schristos myState.parsestate = myState.groundtable; 29472eaa94a1Schristos 2948d522f475Smrg do { 2949d522f475Smrg } while (doparsing(xw, doinput(), &myState)); 2950d522f475Smrg} 2951d522f475Smrg 2952d522f475Smrgstatic Char *v_buffer; /* pointer to physical buffer */ 2953d522f475Smrgstatic Char *v_bufstr = NULL; /* beginning of area to write */ 2954d522f475Smrgstatic Char *v_bufptr; /* end of area to write */ 2955d522f475Smrgstatic Char *v_bufend; /* end of physical buffer */ 2956d522f475Smrg 2957d522f475Smrg/* Write data to the pty as typed by the user, pasted with the mouse, 2958d522f475Smrg or generated by us in response to a query ESC sequence. */ 2959d522f475Smrg 2960d522f475Smrgint 2961d522f475Smrgv_write(int f, Char * data, unsigned len) 2962d522f475Smrg{ 2963d522f475Smrg int riten; 2964d522f475Smrg unsigned c = len; 2965d522f475Smrg 2966d522f475Smrg if (v_bufstr == NULL && len > 0) { 2967d522f475Smrg v_buffer = (Char *) XtMalloc(len); 2968d522f475Smrg v_bufstr = v_buffer; 2969d522f475Smrg v_bufptr = v_buffer; 2970d522f475Smrg v_bufend = v_buffer + len; 2971d522f475Smrg } 2972d522f475Smrg#ifdef DEBUG 2973d522f475Smrg if (debug) { 2974d522f475Smrg fprintf(stderr, "v_write called with %d bytes (%d left over)", 2975d522f475Smrg len, v_bufptr - v_bufstr); 2976d522f475Smrg if (len > 1 && len < 10) 2977d522f475Smrg fprintf(stderr, " \"%.*s\"", len, (char *) data); 2978d522f475Smrg fprintf(stderr, "\n"); 2979d522f475Smrg } 2980d522f475Smrg#endif 2981d522f475Smrg 2982d522f475Smrg#ifdef VMS 2983d522f475Smrg if ((1 << f) != pty_mask) 2984d522f475Smrg return (tt_write((char *) data, len)); 2985d522f475Smrg#else /* VMS */ 2986d522f475Smrg if (!FD_ISSET(f, &pty_mask)) 2987d522f475Smrg return (write(f, (char *) data, len)); 2988d522f475Smrg#endif /* VMS */ 2989d522f475Smrg 2990d522f475Smrg /* 2991d522f475Smrg * Append to the block we already have. 2992d522f475Smrg * Always doing this simplifies the code, and 2993d522f475Smrg * isn't too bad, either. If this is a short 2994d522f475Smrg * block, it isn't too expensive, and if this is 2995d522f475Smrg * a long block, we won't be able to write it all 2996d522f475Smrg * anyway. 2997d522f475Smrg */ 2998d522f475Smrg 2999d522f475Smrg if (len > 0) { 3000d522f475Smrg#if OPT_DABBREV 3001d522f475Smrg term->screen.dabbrev_working = 0; /* break dabbrev sequence */ 3002d522f475Smrg#endif 3003d522f475Smrg if (v_bufend < v_bufptr + len) { /* we've run out of room */ 3004d522f475Smrg if (v_bufstr != v_buffer) { 3005d522f475Smrg /* there is unused space, move everything down */ 3006d522f475Smrg /* possibly overlapping memmove here */ 3007d522f475Smrg#ifdef DEBUG 3008d522f475Smrg if (debug) 3009d522f475Smrg fprintf(stderr, "moving data down %d\n", 3010d522f475Smrg v_bufstr - v_buffer); 3011d522f475Smrg#endif 3012d522f475Smrg memmove(v_buffer, v_bufstr, (unsigned) (v_bufptr - v_bufstr)); 3013d522f475Smrg v_bufptr -= v_bufstr - v_buffer; 3014d522f475Smrg v_bufstr = v_buffer; 3015d522f475Smrg } 3016d522f475Smrg if (v_bufend < v_bufptr + len) { 3017d522f475Smrg /* still won't fit: get more space */ 3018d522f475Smrg /* Don't use XtRealloc because an error is not fatal. */ 30192eaa94a1Schristos unsigned size = (unsigned) (v_bufptr - v_buffer); 3020d522f475Smrg v_buffer = TypeRealloc(Char, size + len, v_buffer); 3021d522f475Smrg if (v_buffer) { 3022d522f475Smrg#ifdef DEBUG 3023d522f475Smrg if (debug) 3024d522f475Smrg fprintf(stderr, "expanded buffer to %d\n", 3025d522f475Smrg size + len); 3026d522f475Smrg#endif 3027d522f475Smrg v_bufstr = v_buffer; 3028d522f475Smrg v_bufptr = v_buffer + size; 3029d522f475Smrg v_bufend = v_bufptr + len; 3030d522f475Smrg } else { 3031d522f475Smrg /* no memory: ignore entire write request */ 3032d522f475Smrg fprintf(stderr, "%s: cannot allocate buffer space\n", 3033d522f475Smrg xterm_name); 3034d522f475Smrg v_buffer = v_bufstr; /* restore clobbered pointer */ 3035d522f475Smrg c = 0; 3036d522f475Smrg } 3037d522f475Smrg } 3038d522f475Smrg } 3039d522f475Smrg if (v_bufend >= v_bufptr + len) { 3040d522f475Smrg /* new stuff will fit */ 3041d522f475Smrg memmove(v_bufptr, data, len); 3042d522f475Smrg v_bufptr += len; 3043d522f475Smrg } 3044d522f475Smrg } 3045d522f475Smrg 3046d522f475Smrg /* 3047d522f475Smrg * Write out as much of the buffer as we can. 3048d522f475Smrg * Be careful not to overflow the pty's input silo. 3049d522f475Smrg * We are conservative here and only write 3050d522f475Smrg * a small amount at a time. 3051d522f475Smrg * 3052d522f475Smrg * If we can't push all the data into the pty yet, we expect write 3053d522f475Smrg * to return a non-negative number less than the length requested 3054d522f475Smrg * (if some data written) or -1 and set errno to EAGAIN, 3055d522f475Smrg * EWOULDBLOCK, or EINTR (if no data written). 3056d522f475Smrg * 3057d522f475Smrg * (Not all systems do this, sigh, so the code is actually 3058d522f475Smrg * a little more forgiving.) 3059d522f475Smrg */ 3060d522f475Smrg 3061d522f475Smrg#define MAX_PTY_WRITE 128 /* 1/2 POSIX minimum MAX_INPUT */ 3062d522f475Smrg 3063d522f475Smrg if (v_bufptr > v_bufstr) { 3064d522f475Smrg#ifdef VMS 3065d522f475Smrg riten = tt_write(v_bufstr, 3066d522f475Smrg ((v_bufptr - v_bufstr <= VMS_TERM_BUFFER_SIZE) 3067d522f475Smrg ? v_bufptr - v_bufstr 3068d522f475Smrg : VMS_TERM_BUFFER_SIZE)); 3069d522f475Smrg if (riten == 0) 3070d522f475Smrg return (riten); 3071d522f475Smrg#else /* VMS */ 3072d522f475Smrg riten = write(f, v_bufstr, 3073d522f475Smrg (size_t) ((v_bufptr - v_bufstr <= MAX_PTY_WRITE) 3074d522f475Smrg ? v_bufptr - v_bufstr 3075d522f475Smrg : MAX_PTY_WRITE)); 3076d522f475Smrg if (riten < 0) 3077d522f475Smrg#endif /* VMS */ 3078d522f475Smrg { 3079d522f475Smrg#ifdef DEBUG 3080d522f475Smrg if (debug) 3081d522f475Smrg perror("write"); 3082d522f475Smrg#endif 3083d522f475Smrg riten = 0; 3084d522f475Smrg } 3085d522f475Smrg#ifdef DEBUG 3086d522f475Smrg if (debug) 3087d522f475Smrg fprintf(stderr, "write called with %d, wrote %d\n", 3088d522f475Smrg v_bufptr - v_bufstr <= MAX_PTY_WRITE ? 3089d522f475Smrg v_bufptr - v_bufstr : MAX_PTY_WRITE, 3090d522f475Smrg riten); 3091d522f475Smrg#endif 3092d522f475Smrg v_bufstr += riten; 3093d522f475Smrg if (v_bufstr >= v_bufptr) /* we wrote it all */ 3094d522f475Smrg v_bufstr = v_bufptr = v_buffer; 3095d522f475Smrg } 3096d522f475Smrg 3097d522f475Smrg /* 3098d522f475Smrg * If we have lots of unused memory allocated, return it 3099d522f475Smrg */ 3100d522f475Smrg if (v_bufend - v_bufptr > 1024) { /* arbitrary hysteresis */ 3101d522f475Smrg /* save pointers across realloc */ 3102d522f475Smrg int start = v_bufstr - v_buffer; 3103d522f475Smrg int size = v_bufptr - v_buffer; 3104d522f475Smrg unsigned allocsize = (unsigned) (size ? size : 1); 3105d522f475Smrg 3106d522f475Smrg v_buffer = TypeRealloc(Char, allocsize, v_buffer); 3107d522f475Smrg if (v_buffer) { 3108d522f475Smrg v_bufstr = v_buffer + start; 3109d522f475Smrg v_bufptr = v_buffer + size; 3110d522f475Smrg v_bufend = v_buffer + allocsize; 3111d522f475Smrg#ifdef DEBUG 3112d522f475Smrg if (debug) 3113d522f475Smrg fprintf(stderr, "shrunk buffer to %d\n", allocsize); 3114d522f475Smrg#endif 3115d522f475Smrg } else { 3116d522f475Smrg /* should we print a warning if couldn't return memory? */ 3117d522f475Smrg v_buffer = v_bufstr - start; /* restore clobbered pointer */ 3118d522f475Smrg } 3119d522f475Smrg } 31202eaa94a1Schristos return ((int) c); 3121d522f475Smrg} 3122d522f475Smrg 3123d522f475Smrg#ifdef VMS 3124d522f475Smrg#define ptymask() (v_bufptr > v_bufstr ? pty_mask : 0) 3125d522f475Smrg 3126d522f475Smrgstatic void 3127d522f475Smrgin_put(XtermWidget xw) 3128d522f475Smrg{ 3129d522f475Smrg static PtySelect select_mask; 3130d522f475Smrg static PtySelect write_mask; 3131d522f475Smrg int update = VTbuffer->update; 3132d522f475Smrg int size; 3133d522f475Smrg 3134d522f475Smrg int status; 3135d522f475Smrg Dimension replyWidth, replyHeight; 3136d522f475Smrg XtGeometryResult stat; 3137d522f475Smrg 3138d522f475Smrg TScreen *screen = &xw->screen; 3139d522f475Smrg char *cp; 3140d522f475Smrg int i; 3141d522f475Smrg 3142d522f475Smrg select_mask = pty_mask; /* force initial read */ 3143d522f475Smrg for (;;) { 3144d522f475Smrg 3145d522f475Smrg /* if the terminal changed size, resize the widget */ 3146d522f475Smrg if (tt_changed) { 3147d522f475Smrg tt_changed = False; 3148d522f475Smrg 31492eaa94a1Schristos stat = REQ_RESIZE((Widget) xw, 31502eaa94a1Schristos ((Dimension) FontWidth(screen) 31512eaa94a1Schristos * (tt_width) 31522eaa94a1Schristos + 2 * screen->border 31532eaa94a1Schristos + screen->fullVwin.sb_info.width), 31542eaa94a1Schristos ((Dimension) FontHeight(screen) 31552eaa94a1Schristos * (tt_length) 31562eaa94a1Schristos + 2 * screen->border), 31572eaa94a1Schristos &replyWidth, &replyHeight); 3158d522f475Smrg 3159d522f475Smrg if (stat == XtGeometryYes || stat == XtGeometryDone) { 3160d522f475Smrg xw->core.width = replyWidth; 3161d522f475Smrg xw->core.height = replyHeight; 3162d522f475Smrg 3163d522f475Smrg ScreenResize(xw, replyWidth, replyHeight, &xw->flags); 3164d522f475Smrg } 3165d522f475Smrg repairSizeHints(); 3166d522f475Smrg } 3167d522f475Smrg 3168d522f475Smrg if (screen->eventMode == NORMAL 3169d522f475Smrg && readPtyData(screen, &select_mask, VTbuffer)) { 3170d522f475Smrg if (screen->scrollWidget 3171d522f475Smrg && screen->scrollttyoutput 3172d522f475Smrg && screen->topline < 0) 3173d522f475Smrg /* Scroll to bottom */ 3174d522f475Smrg WindowScroll(xw, 0); 3175d522f475Smrg break; 3176d522f475Smrg } 3177d522f475Smrg if (screen->scroll_amt) 3178d522f475Smrg FlushScroll(xw); 3179d522f475Smrg if (screen->cursor_set && CursorMoved(screen)) { 3180d522f475Smrg if (screen->cursor_state) 3181d522f475Smrg HideCursor(); 3182d522f475Smrg ShowCursor(); 3183d522f475Smrg#if OPT_INPUT_METHOD 3184d522f475Smrg PreeditPosition(screen); 3185d522f475Smrg#endif 3186d522f475Smrg } else if (screen->cursor_set != screen->cursor_state) { 3187d522f475Smrg if (screen->cursor_set) 3188d522f475Smrg ShowCursor(); 3189d522f475Smrg else 3190d522f475Smrg HideCursor(); 3191d522f475Smrg } 3192d522f475Smrg 3193d522f475Smrg if (QLength(screen->display)) { 3194d522f475Smrg select_mask = X_mask; 3195d522f475Smrg } else { 3196d522f475Smrg write_mask = ptymask(); 3197d522f475Smrg XFlush(screen->display); 3198d522f475Smrg select_mask = Select_mask; 3199d522f475Smrg if (screen->eventMode != NORMAL) 3200d522f475Smrg select_mask = X_mask; 3201d522f475Smrg } 3202d522f475Smrg if (write_mask & ptymask()) { 3203d522f475Smrg v_write(screen->respond, 0, 0); /* flush buffer */ 3204d522f475Smrg } 3205d522f475Smrg 3206d522f475Smrg if (select_mask & X_mask) { 3207d522f475Smrg xevents(); 3208d522f475Smrg if (VTbuffer->update != update) 3209d522f475Smrg break; 3210d522f475Smrg } 3211d522f475Smrg } 3212d522f475Smrg} 3213d522f475Smrg#else /* VMS */ 3214d522f475Smrg 3215d522f475Smrgstatic void 3216d522f475Smrgin_put(XtermWidget xw) 3217d522f475Smrg{ 3218d522f475Smrg static PtySelect select_mask; 3219d522f475Smrg static PtySelect write_mask; 3220d522f475Smrg 3221d522f475Smrg TScreen *screen = &xw->screen; 3222d522f475Smrg int i, time_select; 3223d522f475Smrg int size; 3224d522f475Smrg int update = VTbuffer->update; 3225d522f475Smrg 3226d522f475Smrg static struct timeval select_timeout; 3227d522f475Smrg 3228d522f475Smrg#if OPT_BLINK_CURS 3229d522f475Smrg /* 3230d522f475Smrg * Compute the timeout for the blinking cursor to be much smaller than 3231d522f475Smrg * the "on" or "off" interval. 3232d522f475Smrg */ 3233d522f475Smrg int tick = ((screen->blink_on < screen->blink_off) 3234d522f475Smrg ? screen->blink_on 3235d522f475Smrg : screen->blink_off); 3236d522f475Smrg tick *= (1000 / 8); /* 1000 for msec/usec, 8 for "much" smaller */ 3237d522f475Smrg if (tick < 1) 3238d522f475Smrg tick = 1; 3239d522f475Smrg#endif 3240d522f475Smrg 3241d522f475Smrg for (;;) { 3242d522f475Smrg if (screen->eventMode == NORMAL 3243d522f475Smrg && (size = readPtyData(screen, &select_mask, VTbuffer)) != 0) { 3244d522f475Smrg if (screen->scrollWidget 3245d522f475Smrg && screen->scrollttyoutput 3246d522f475Smrg && screen->topline < 0) 3247d522f475Smrg WindowScroll(xw, 0); /* Scroll to bottom */ 3248d522f475Smrg /* stop speed reading at some point to look for X stuff */ 3249d522f475Smrg TRACE(("VTbuffer uses %d/%d\n", 3250d522f475Smrg VTbuffer->last - VTbuffer->buffer, 3251d522f475Smrg BUF_SIZE)); 3252d522f475Smrg if ((VTbuffer->last - VTbuffer->buffer) > BUF_SIZE) { 3253d522f475Smrg FD_CLR(screen->respond, &select_mask); 3254d522f475Smrg break; 3255d522f475Smrg } 3256d522f475Smrg#if defined(HAVE_SCHED_YIELD) 3257d522f475Smrg /* 3258d522f475Smrg * If we've read a full (small/fragment) buffer, let the operating 3259d522f475Smrg * system have a turn, and we'll resume reading until we've either 3260d522f475Smrg * read only a fragment of the buffer, or we've filled the large 3261d522f475Smrg * buffer (see above). Doing this helps keep up with large bursts 3262d522f475Smrg * of output. 3263d522f475Smrg */ 3264d522f475Smrg if (size == FRG_SIZE) { 3265d522f475Smrg select_timeout.tv_sec = 0; 3266d522f475Smrg i = Select(max_plus1, &select_mask, &write_mask, 0, 3267d522f475Smrg &select_timeout); 3268d522f475Smrg if (i > 0) { 3269d522f475Smrg sched_yield(); 3270d522f475Smrg } else 3271d522f475Smrg break; 3272d522f475Smrg } else { 3273d522f475Smrg break; 3274d522f475Smrg } 3275d522f475Smrg#else 3276d522f475Smrg (void) size; /* unused in this branch */ 3277d522f475Smrg break; 3278d522f475Smrg#endif 3279d522f475Smrg } 3280d522f475Smrg /* update the screen */ 3281d522f475Smrg if (screen->scroll_amt) 3282d522f475Smrg FlushScroll(xw); 3283d522f475Smrg if (screen->cursor_set && CursorMoved(screen)) { 3284d522f475Smrg if (screen->cursor_state) 3285d522f475Smrg HideCursor(); 3286d522f475Smrg ShowCursor(); 3287d522f475Smrg#if OPT_INPUT_METHOD 3288d522f475Smrg PreeditPosition(screen); 3289d522f475Smrg#endif 3290d522f475Smrg } else if (screen->cursor_set != screen->cursor_state) { 3291d522f475Smrg if (screen->cursor_set) 3292d522f475Smrg ShowCursor(); 3293d522f475Smrg else 3294d522f475Smrg HideCursor(); 3295d522f475Smrg } 3296d522f475Smrg 3297d522f475Smrg XFlush(screen->display); /* always flush writes before waiting */ 3298d522f475Smrg 3299d522f475Smrg /* Update the masks and, unless X events are already in the queue, 3300d522f475Smrg wait for I/O to be possible. */ 3301d522f475Smrg XFD_COPYSET(&Select_mask, &select_mask); 3302d522f475Smrg /* in selection mode xterm does not read pty */ 3303d522f475Smrg if (screen->eventMode != NORMAL) 3304d522f475Smrg FD_CLR(screen->respond, &select_mask); 3305d522f475Smrg 3306d522f475Smrg if (v_bufptr > v_bufstr) { 3307d522f475Smrg XFD_COPYSET(&pty_mask, &write_mask); 3308d522f475Smrg } else 3309d522f475Smrg FD_ZERO(&write_mask); 3310d522f475Smrg select_timeout.tv_sec = 0; 3311d522f475Smrg time_select = 0; 3312d522f475Smrg 3313d522f475Smrg /* 3314d522f475Smrg * if there's either an XEvent or an XtTimeout pending, just take 3315d522f475Smrg * a quick peek, i.e. timeout from the select() immediately. If 3316d522f475Smrg * there's nothing pending, let select() block a little while, but 3317d522f475Smrg * for a shorter interval than the arrow-style scrollbar timeout. 3318d522f475Smrg * The blocking is optional, because it tends to increase the load 3319d522f475Smrg * on the host. 3320d522f475Smrg */ 3321d522f475Smrg if (XtAppPending(app_con)) { 3322d522f475Smrg select_timeout.tv_usec = 0; 3323d522f475Smrg time_select = 1; 3324d522f475Smrg } else if (screen->awaitInput) { 3325d522f475Smrg select_timeout.tv_usec = 50000; 3326d522f475Smrg time_select = 1; 3327d522f475Smrg#if OPT_BLINK_CURS 3328d522f475Smrg } else if ((screen->blink_timer != 0 && 3329d522f475Smrg ((screen->select & FOCUS) || screen->always_highlight)) || 3330d522f475Smrg (screen->cursor_state == BLINKED_OFF)) { 3331d522f475Smrg select_timeout.tv_usec = tick; 3332d522f475Smrg while (select_timeout.tv_usec > 1000000) { 3333d522f475Smrg select_timeout.tv_usec -= 1000000; 3334d522f475Smrg select_timeout.tv_sec++; 3335d522f475Smrg } 3336d522f475Smrg time_select = 1; 3337d522f475Smrg#endif 3338d522f475Smrg#if OPT_SESSION_MGT 3339d522f475Smrg } else if (resource.sessionMgt) { 3340d522f475Smrg if (ice_fd >= 0) 3341d522f475Smrg FD_SET(ice_fd, &select_mask); 3342d522f475Smrg#endif 3343d522f475Smrg } 3344d522f475Smrg if (need_cleanup) 3345d522f475Smrg Cleanup(0); 3346d522f475Smrg i = Select(max_plus1, &select_mask, &write_mask, 0, 3347d522f475Smrg (time_select ? &select_timeout : 0)); 3348d522f475Smrg if (i < 0) { 3349d522f475Smrg if (errno != EINTR) 3350d522f475Smrg SysError(ERROR_SELECT); 3351d522f475Smrg continue; 3352d522f475Smrg } 3353d522f475Smrg 3354d522f475Smrg /* if there is room to write more data to the pty, go write more */ 3355d522f475Smrg if (FD_ISSET(screen->respond, &write_mask)) { 3356d522f475Smrg v_write(screen->respond, (Char *) 0, 0); /* flush buffer */ 3357d522f475Smrg } 3358d522f475Smrg 3359d522f475Smrg /* if there are X events already in our queue, it 3360d522f475Smrg counts as being readable */ 3361d522f475Smrg if (XtAppPending(app_con) || 3362d522f475Smrg FD_ISSET(ConnectionNumber(screen->display), &select_mask)) { 3363d522f475Smrg xevents(); 3364d522f475Smrg if (VTbuffer->update != update) /* HandleInterpret */ 3365d522f475Smrg break; 3366d522f475Smrg } 3367d522f475Smrg 3368d522f475Smrg } 3369d522f475Smrg} 3370d522f475Smrg#endif /* VMS */ 3371d522f475Smrg 3372d522f475Smrgstatic IChar 3373d522f475Smrgdoinput(void) 3374d522f475Smrg{ 3375d522f475Smrg TScreen *screen = TScreenOf(term); 3376d522f475Smrg 3377d522f475Smrg while (!morePtyData(screen, VTbuffer)) 3378d522f475Smrg in_put(term); 3379d522f475Smrg return nextPtyData(screen, VTbuffer); 3380d522f475Smrg} 3381d522f475Smrg 3382d522f475Smrg#if OPT_INPUT_METHOD 3383d522f475Smrg/* 3384d522f475Smrg * For OverTheSpot, client has to inform the position for XIM preedit. 3385d522f475Smrg */ 3386d522f475Smrgstatic void 3387d522f475SmrgPreeditPosition(TScreen * screen) 3388d522f475Smrg{ 3389d522f475Smrg XPoint spot; 3390d522f475Smrg XVaNestedList list; 3391d522f475Smrg 3392d522f475Smrg if (!screen->xic) 3393d522f475Smrg return; 33942eaa94a1Schristos spot.x = (short) CurCursorX(screen, screen->cur_row, screen->cur_col); 33952eaa94a1Schristos spot.y = (short) (CursorY(screen, screen->cur_row) + screen->fs_ascent); 3396d522f475Smrg list = XVaCreateNestedList(0, 3397d522f475Smrg XNSpotLocation, &spot, 3398d522f475Smrg XNForeground, T_COLOR(screen, TEXT_FG), 3399d522f475Smrg XNBackground, T_COLOR(screen, TEXT_BG), 3400d522f475Smrg NULL); 3401d522f475Smrg XSetICValues(screen->xic, XNPreeditAttributes, list, NULL); 3402d522f475Smrg XFree(list); 3403d522f475Smrg} 3404d522f475Smrg#endif 3405d522f475Smrg 3406d522f475Smrgstatic void 3407d522f475SmrgWrapLine(XtermWidget xw) 3408d522f475Smrg{ 3409d522f475Smrg TScreen *screen = &(xw->screen); 3410d522f475Smrg 3411d522f475Smrg /* mark that we had to wrap this line */ 3412d522f475Smrg ScrnSetFlag(screen, screen->cur_row, LINEWRAPPED); 3413d522f475Smrg xtermAutoPrint('\n'); 3414d522f475Smrg xtermIndex(xw, 1); 3415d522f475Smrg set_cur_col(screen, 0); 3416d522f475Smrg} 3417d522f475Smrg 3418d522f475Smrg/* 3419d522f475Smrg * process a string of characters according to the character set indicated 3420d522f475Smrg * by charset. worry about end of line conditions (wraparound if selected). 3421d522f475Smrg */ 3422d522f475Smrgvoid 3423d522f475Smrgdotext(XtermWidget xw, 3424d522f475Smrg int charset, 3425d522f475Smrg IChar * buf, /* start of characters to process */ 3426d522f475Smrg Cardinal len) /* end */ 3427d522f475Smrg{ 3428d522f475Smrg TScreen *screen = &(xw->screen); 3429d522f475Smrg#if OPT_WIDE_CHARS 3430d522f475Smrg Cardinal chars_chomped = 1; 3431d522f475Smrg int next_col = screen->cur_col; 3432d522f475Smrg#else 3433d522f475Smrg int next_col, last_col, this_col; /* must be signed */ 3434d522f475Smrg#endif 3435d522f475Smrg Cardinal offset; 3436d522f475Smrg 3437d522f475Smrg#if OPT_WIDE_CHARS 3438d522f475Smrg /* don't translate if we use UTF-8, and are not handling legacy support 3439d522f475Smrg * for line-drawing characters. 3440d522f475Smrg */ 3441d522f475Smrg if ((screen->utf8_mode == uFalse) 34422eaa94a1Schristos || (screen->vt100_graphics)) 3443d522f475Smrg#endif 34442eaa94a1Schristos if (!xtermCharSetOut(xw, buf, buf + len, charset)) 3445d522f475Smrg return; 3446d522f475Smrg 3447d522f475Smrg if_OPT_XMC_GLITCH(screen, { 3448d522f475Smrg Cardinal n; 3449d522f475Smrg if (charset != '?') { 3450d522f475Smrg for (n = 0; n < len; n++) { 3451d522f475Smrg if (buf[n] == XMC_GLITCH) 3452d522f475Smrg buf[n] = XMC_GLITCH + 1; 3453d522f475Smrg } 3454d522f475Smrg } 3455d522f475Smrg }); 3456d522f475Smrg 3457d522f475Smrg#if OPT_WIDE_CHARS 3458d522f475Smrg for (offset = 0; 3459d522f475Smrg offset < len && (chars_chomped > 0 || screen->do_wrap); 3460d522f475Smrg offset += chars_chomped) { 3461d522f475Smrg int width_available = MaxCols(screen) - screen->cur_col; 3462d522f475Smrg int width_here = 0; 34632eaa94a1Schristos Boolean need_wrap = False; 3464d522f475Smrg int last_chomp = 0; 3465d522f475Smrg chars_chomped = 0; 3466d522f475Smrg 3467d522f475Smrg if (screen->do_wrap) { 34682eaa94a1Schristos screen->do_wrap = False; 3469d522f475Smrg if ((xw->flags & WRAPAROUND)) { 3470d522f475Smrg WrapLine(xw); 3471d522f475Smrg width_available = MaxCols(screen) - screen->cur_col; 3472d522f475Smrg next_col = screen->cur_col; 3473d522f475Smrg } 3474d522f475Smrg } 3475d522f475Smrg 3476d522f475Smrg while (width_here <= width_available && chars_chomped < (len - offset)) { 3477d522f475Smrg if (!screen->utf8_mode 3478d522f475Smrg || (screen->vt100_graphics && charset == '0')) 3479d522f475Smrg last_chomp = 1; 3480d522f475Smrg else 3481d522f475Smrg last_chomp = my_wcwidth((int) buf[chars_chomped + offset]); 3482d522f475Smrg width_here += last_chomp; 3483d522f475Smrg chars_chomped++; 3484d522f475Smrg } 3485d522f475Smrg 3486d522f475Smrg if (width_here > width_available) { 3487d522f475Smrg if (last_chomp > MaxCols(screen)) 3488d522f475Smrg break; /* give up - it is too big */ 3489d522f475Smrg chars_chomped--; 3490d522f475Smrg width_here -= last_chomp; 3491d522f475Smrg if (chars_chomped > 0) { 34922eaa94a1Schristos need_wrap = True; 3493d522f475Smrg } 3494d522f475Smrg } else if (width_here == width_available) { 34952eaa94a1Schristos need_wrap = True; 3496d522f475Smrg } else if (chars_chomped != (len - offset)) { 34972eaa94a1Schristos need_wrap = True; 3498d522f475Smrg } 3499d522f475Smrg 3500d522f475Smrg /* 3501d522f475Smrg * Split the wide characters back into separate arrays of 8-bit 3502d522f475Smrg * characters so we can use the existing interface. 3503d522f475Smrg * 3504d522f475Smrg * FIXME: If we rewrote this interface, it would involve 3505d522f475Smrg * rewriting all of the memory-management for the screen 3506d522f475Smrg * buffers (perhaps this is simpler). 3507d522f475Smrg */ 3508d522f475Smrg if (chars_chomped != 0 && next_col <= screen->max_col) { 3509d522f475Smrg static unsigned limit; 3510d522f475Smrg static Char *hibyte, *lobyte; 3511d522f475Smrg Bool both = False; 3512d522f475Smrg unsigned j, k; 3513d522f475Smrg 3514d522f475Smrg if (chars_chomped >= limit) { 3515d522f475Smrg limit = (chars_chomped + 1) * 2; 3516d522f475Smrg lobyte = (Char *) XtRealloc((char *) lobyte, limit); 3517d522f475Smrg hibyte = (Char *) XtRealloc((char *) hibyte, limit); 3518d522f475Smrg } 3519d522f475Smrg for (j = offset, k = 0; j < offset + chars_chomped; j++) { 3520d522f475Smrg if (buf[j] == HIDDEN_CHAR) 3521d522f475Smrg continue; 3522d522f475Smrg lobyte[k] = LO_BYTE(buf[j]); 3523d522f475Smrg if (buf[j] > 255) { 3524d522f475Smrg hibyte[k] = HI_BYTE(buf[j]); 3525d522f475Smrg both = True; 3526d522f475Smrg } else { 3527d522f475Smrg hibyte[k] = 0; 3528d522f475Smrg } 3529d522f475Smrg ++k; 3530d522f475Smrg } 3531d522f475Smrg 3532d522f475Smrg WriteText(xw, PAIRED_CHARS(lobyte, 3533d522f475Smrg (both ? hibyte : 0)), 3534d522f475Smrg k); 3535d522f475Smrg#ifdef NO_LEAKS 3536d522f475Smrg if (limit != 0) { 3537d522f475Smrg limit = 0; 3538d522f475Smrg XtFree((char *) lobyte); 3539d522f475Smrg XtFree((char *) hibyte); 3540d522f475Smrg lobyte = 0; 3541d522f475Smrg hibyte = 0; 3542d522f475Smrg } 3543d522f475Smrg#endif 3544d522f475Smrg } 3545d522f475Smrg next_col += width_here; 3546d522f475Smrg screen->do_wrap = need_wrap; 3547d522f475Smrg } 3548d522f475Smrg#else /* ! OPT_WIDE_CHARS */ 3549d522f475Smrg 3550d522f475Smrg for (offset = 0; offset < len; offset += this_col) { 3551d522f475Smrg last_col = CurMaxCol(screen, screen->cur_row); 3552d522f475Smrg this_col = last_col - screen->cur_col + 1; 3553d522f475Smrg if (this_col <= 1) { 3554d522f475Smrg if (screen->do_wrap) { 35552eaa94a1Schristos screen->do_wrap = False; 3556d522f475Smrg if ((xw->flags & WRAPAROUND)) { 3557d522f475Smrg WrapLine(xw); 3558d522f475Smrg } 3559d522f475Smrg } 3560d522f475Smrg this_col = 1; 3561d522f475Smrg } 3562d522f475Smrg if (offset + this_col > len) { 3563d522f475Smrg this_col = len - offset; 3564d522f475Smrg } 3565d522f475Smrg next_col = screen->cur_col + this_col; 3566d522f475Smrg 3567d522f475Smrg WriteText(xw, PAIRED_CHARS(buf + offset, 3568d522f475Smrg buf2 ? buf2 + offset : 0), 3569d522f475Smrg (unsigned) this_col); 3570d522f475Smrg 3571d522f475Smrg /* 3572d522f475Smrg * The call to WriteText updates screen->cur_col. 3573d522f475Smrg * If screen->cur_col is less than next_col, we must have 3574d522f475Smrg * hit the right margin - so set the do_wrap flag. 3575d522f475Smrg */ 3576d522f475Smrg screen->do_wrap = (screen->cur_col < next_col); 3577d522f475Smrg } 3578d522f475Smrg 3579d522f475Smrg#endif /* OPT_WIDE_CHARS */ 3580d522f475Smrg} 3581d522f475Smrg 3582d522f475Smrg#if OPT_WIDE_CHARS 3583d522f475Smrgunsigned 3584d522f475Smrgvisual_width(PAIRED_CHARS(Char * str, Char * str2), Cardinal len) 3585d522f475Smrg{ 3586d522f475Smrg /* returns the visual width of a string (doublewide characters count 3587d522f475Smrg as 2, normalwide characters count as 1) */ 35882eaa94a1Schristos unsigned my_len = 0; 3589d522f475Smrg while (len) { 3590d522f475Smrg int ch = *str; 3591d522f475Smrg if (str2) 3592d522f475Smrg ch |= *str2 << 8; 3593d522f475Smrg if (str) 3594d522f475Smrg str++; 3595d522f475Smrg if (str2) 3596d522f475Smrg str2++; 3597d522f475Smrg if (iswide(ch)) 3598d522f475Smrg my_len += 2; 3599d522f475Smrg else 3600d522f475Smrg my_len++; 3601d522f475Smrg len--; 3602d522f475Smrg } 3603d522f475Smrg return my_len; 3604d522f475Smrg} 3605d522f475Smrg#endif 3606d522f475Smrg 3607d522f475Smrg#if HANDLE_STRUCT_NOTIFY 3608d522f475Smrg/* Flag icon name with "***" on window output when iconified. 3609d522f475Smrg */ 3610d522f475Smrgstatic void 3611d522f475SmrgHandleStructNotify(Widget w GCC_UNUSED, 3612d522f475Smrg XtPointer closure GCC_UNUSED, 3613d522f475Smrg XEvent * event, 3614d522f475Smrg Boolean * cont GCC_UNUSED) 3615d522f475Smrg{ 3616d522f475Smrg static char *icon_name; 3617d522f475Smrg static Arg args[] = 3618d522f475Smrg { 3619d522f475Smrg {XtNiconName, (XtArgVal) & icon_name} 3620d522f475Smrg }; 36212eaa94a1Schristos XtermWidget xw = term; 36222eaa94a1Schristos TScreen *screen = TScreenOf(xw); 3623d522f475Smrg 3624d522f475Smrg switch (event->type) { 3625d522f475Smrg case MapNotify: 3626d522f475Smrg TRACE(("HandleStructNotify(MapNotify)\n")); 3627d522f475Smrg#if OPT_ZICONBEEP 3628d522f475Smrg if (screen->zIconBeep_flagged) { 3629d522f475Smrg screen->zIconBeep_flagged = False; 3630d522f475Smrg icon_name = NULL; 3631d522f475Smrg XtGetValues(toplevel, args, XtNumber(args)); 3632d522f475Smrg if (icon_name != NULL) { 3633d522f475Smrg char *buf = CastMallocN(char, strlen(icon_name)); 3634d522f475Smrg if (buf == NULL) { 3635d522f475Smrg screen->zIconBeep_flagged = True; 3636d522f475Smrg return; 3637d522f475Smrg } 3638d522f475Smrg strcpy(buf, icon_name + 4); 3639d522f475Smrg ChangeIconName(buf); 3640d522f475Smrg free(buf); 3641d522f475Smrg } 3642d522f475Smrg } 3643d522f475Smrg#endif /* OPT_ZICONBEEP */ 3644d522f475Smrg mapstate = !IsUnmapped; 3645d522f475Smrg break; 3646d522f475Smrg case UnmapNotify: 3647d522f475Smrg TRACE(("HandleStructNotify(UnmapNotify)\n")); 3648d522f475Smrg mapstate = IsUnmapped; 3649d522f475Smrg break; 3650d522f475Smrg case ConfigureNotify: 3651d522f475Smrg if (event->xconfigure.window == XtWindow(toplevel)) { 36522eaa94a1Schristos int height, width; 36532eaa94a1Schristos 36542eaa94a1Schristos height = event->xconfigure.height; 36552eaa94a1Schristos width = event->xconfigure.width; 36562eaa94a1Schristos TRACE(("HandleStructNotify(ConfigureNotify) %d,%d %dx%d\n", 36572eaa94a1Schristos event->xconfigure.y, event->xconfigure.x, 36582eaa94a1Schristos event->xconfigure.height, event->xconfigure.width)); 36592eaa94a1Schristos 3660d522f475Smrg#if OPT_TOOLBAR 3661d522f475Smrg /* 3662d522f475Smrg * The notification is for the top-level widget, but we care about 3663d522f475Smrg * vt100 (ignore the tek4014 window). 3664d522f475Smrg */ 36652eaa94a1Schristos if (xw->screen.Vshow) { 36662eaa94a1Schristos VTwin *Vwin = WhichVWin(&(xw->screen)); 3667d522f475Smrg TbInfo *info = &(Vwin->tb_info); 3668d522f475Smrg TbInfo save = *info; 3669d522f475Smrg 3670d522f475Smrg if (info->menu_bar) { 3671d522f475Smrg XtVaGetValues(info->menu_bar, 3672d522f475Smrg XtNheight, &info->menu_height, 3673d522f475Smrg XtNborderWidth, &info->menu_border, 3674d522f475Smrg (XtPointer) 0); 3675d522f475Smrg 3676d522f475Smrg if (save.menu_height != info->menu_height 3677d522f475Smrg || save.menu_border != info->menu_border) { 3678d522f475Smrg 3679d522f475Smrg TRACE(("...menu_height %d\n", info->menu_height)); 3680d522f475Smrg TRACE(("...menu_border %d\n", info->menu_border)); 3681d522f475Smrg TRACE(("...had height %d, border %d\n", 3682d522f475Smrg save.menu_height, 3683d522f475Smrg save.menu_border)); 3684d522f475Smrg 3685d522f475Smrg /* 3686d522f475Smrg * FIXME: Window manager still may be using the old 3687d522f475Smrg * values. Try to fool it. 3688d522f475Smrg */ 36892eaa94a1Schristos REQ_RESIZE((Widget) xw, 36902eaa94a1Schristos screen->fullVwin.fullwidth, 36912eaa94a1Schristos (Dimension) (info->menu_height 36922eaa94a1Schristos - save.menu_height 36932eaa94a1Schristos + screen->fullVwin.fullheight), 36942eaa94a1Schristos NULL, NULL); 3695d522f475Smrg repairSizeHints(); 3696d522f475Smrg } 3697d522f475Smrg } 3698d522f475Smrg } 3699d522f475Smrg#else 37002eaa94a1Schristos if (height != xw->hints.height || width != xw->hints.width) 37012eaa94a1Schristos RequestResize(xw, height, width, False); 3702d522f475Smrg#endif /* OPT_TOOLBAR */ 3703d522f475Smrg } 3704d522f475Smrg break; 3705d522f475Smrg case ReparentNotify: 3706d522f475Smrg TRACE(("HandleStructNotify(ReparentNotify)\n")); 3707d522f475Smrg break; 3708d522f475Smrg default: 3709d522f475Smrg TRACE(("HandleStructNotify(event %s)\n", 3710d522f475Smrg visibleEventType(event->type))); 3711d522f475Smrg break; 3712d522f475Smrg } 3713d522f475Smrg} 3714d522f475Smrg#endif /* HANDLE_STRUCT_NOTIFY */ 3715d522f475Smrg 3716d522f475Smrg#if OPT_BLINK_CURS 3717d522f475Smrgstatic void 37182eaa94a1SchristosSetCursorBlink(TScreen * screen, Boolean enable) 3719d522f475Smrg{ 3720d522f475Smrg screen->cursor_blink = enable; 3721d522f475Smrg if (DoStartBlinking(screen)) { 3722d522f475Smrg StartBlinking(screen); 3723d522f475Smrg } else { 3724d522f475Smrg#if !OPT_BLINK_TEXT 3725d522f475Smrg StopBlinking(screen); 3726d522f475Smrg#endif 3727d522f475Smrg } 3728d522f475Smrg update_cursorblink(); 3729d522f475Smrg} 3730d522f475Smrg 3731d522f475Smrgvoid 3732d522f475SmrgToggleCursorBlink(TScreen * screen) 3733d522f475Smrg{ 37342eaa94a1Schristos SetCursorBlink(screen, (Boolean) (!(screen->cursor_blink))); 3735d522f475Smrg} 3736d522f475Smrg#endif 3737d522f475Smrg 3738d522f475Smrg/* 3739d522f475Smrg * process ANSI modes set, reset 3740d522f475Smrg */ 3741d522f475Smrgstatic void 3742d522f475Smrgansi_modes(XtermWidget xw, 3743d522f475Smrg void (*func) (unsigned *p, unsigned mask)) 3744d522f475Smrg{ 3745d522f475Smrg int i; 3746d522f475Smrg 3747d522f475Smrg for (i = 0; i < nparam; ++i) { 3748d522f475Smrg switch (param[i]) { 3749d522f475Smrg case 2: /* KAM (if set, keyboard locked */ 3750d522f475Smrg (*func) (&xw->keyboard.flags, MODE_KAM); 3751d522f475Smrg break; 3752d522f475Smrg 3753d522f475Smrg case 4: /* IRM */ 3754d522f475Smrg (*func) (&xw->flags, INSERT); 3755d522f475Smrg break; 3756d522f475Smrg 3757d522f475Smrg case 12: /* SRM (if set, local echo */ 3758d522f475Smrg (*func) (&xw->keyboard.flags, MODE_SRM); 3759d522f475Smrg break; 3760d522f475Smrg 3761d522f475Smrg case 20: /* LNM */ 3762d522f475Smrg (*func) (&xw->flags, LINEFEED); 3763d522f475Smrg update_autolinefeed(); 3764d522f475Smrg break; 3765d522f475Smrg } 3766d522f475Smrg } 3767d522f475Smrg} 3768d522f475Smrg 3769d522f475Smrg#define IsSM() (func == bitset) 3770d522f475Smrg 3771d522f475Smrg#define set_bool_mode(flag) \ 37722eaa94a1Schristos flag = (Boolean) IsSM() 3773d522f475Smrg 3774d522f475Smrgstatic void 3775d522f475Smrgreally_set_mousemode(XtermWidget xw, 3776d522f475Smrg Bool enabled, 37772eaa94a1Schristos XtermMouseModes mode) 3778d522f475Smrg{ 3779d522f475Smrg xw->screen.send_mouse_pos = enabled ? mode : MOUSE_OFF; 3780d522f475Smrg if (xw->screen.send_mouse_pos != MOUSE_OFF) 3781d522f475Smrg xtermShowPointer(xw, True); 3782d522f475Smrg} 3783d522f475Smrg 3784d522f475Smrg#define set_mousemode(mode) really_set_mousemode(xw, IsSM(), mode) 3785d522f475Smrg 3786d522f475Smrg#if OPT_READLINE 3787d522f475Smrg#define set_mouseflag(f) \ 3788d522f475Smrg (IsSM() \ 3789d522f475Smrg ? SCREEN_FLAG_set(screen, f) \ 3790d522f475Smrg : SCREEN_FLAG_unset(screen, f)) 3791d522f475Smrg#endif 3792d522f475Smrg 3793d522f475Smrg/* 3794d522f475Smrg * process DEC private modes set, reset 3795d522f475Smrg */ 3796d522f475Smrgstatic void 3797d522f475Smrgdpmodes(XtermWidget xw, 3798d522f475Smrg void (*func) (unsigned *p, unsigned mask)) 3799d522f475Smrg{ 3800d522f475Smrg TScreen *screen = &xw->screen; 3801d522f475Smrg int i, j; 38022eaa94a1Schristos unsigned myflags; 3803d522f475Smrg 3804d522f475Smrg for (i = 0; i < nparam; ++i) { 3805d522f475Smrg TRACE(("%s %d\n", IsSM()? "DECSET" : "DECRST", param[i])); 3806d522f475Smrg switch (param[i]) { 3807d522f475Smrg case 1: /* DECCKM */ 3808d522f475Smrg (*func) (&xw->keyboard.flags, MODE_DECCKM); 3809d522f475Smrg update_appcursor(); 3810d522f475Smrg break; 3811d522f475Smrg case 2: /* DECANM - ANSI/VT52 mode */ 3812d522f475Smrg if (IsSM()) { /* ANSI (VT100) */ 3813d522f475Smrg /* 3814d522f475Smrg * Setting DECANM should have no effect, since this function 3815d522f475Smrg * cannot be reached from vt52 mode. 3816d522f475Smrg */ 3817d522f475Smrg ; 3818d522f475Smrg } 3819d522f475Smrg#if OPT_VT52_MODE 3820d522f475Smrg else if (screen->terminal_id >= 100) { /* VT52 */ 3821d522f475Smrg TRACE(("DECANM terminal_id %d, vtXX_level %d\n", 3822d522f475Smrg screen->terminal_id, 3823d522f475Smrg screen->vtXX_level)); 3824d522f475Smrg screen->vt52_save_level = screen->vtXX_level; 3825d522f475Smrg screen->vtXX_level = 0; 3826d522f475Smrg screen->vt52_save_curgl = screen->curgl; 3827d522f475Smrg screen->vt52_save_curgr = screen->curgr; 3828d522f475Smrg screen->vt52_save_curss = screen->curss; 3829d522f475Smrg memmove(screen->vt52_save_gsets, screen->gsets, sizeof(screen->gsets)); 3830d522f475Smrg resetCharsets(screen); 3831d522f475Smrg nparam = 0; /* ignore the remaining params, if any */ 3832d522f475Smrg } 3833d522f475Smrg#endif 3834d522f475Smrg break; 3835d522f475Smrg case 3: /* DECCOLM */ 3836d522f475Smrg if (screen->c132) { 3837d522f475Smrg ClearScreen(xw); 3838d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 3839d522f475Smrg if ((j = IsSM()? 132 : 80) != 3840d522f475Smrg ((xw->flags & IN132COLUMNS) ? 132 : 80) || 3841d522f475Smrg j != MaxCols(screen)) 3842d522f475Smrg RequestResize(xw, -1, j, True); 3843d522f475Smrg (*func) (&xw->flags, IN132COLUMNS); 3844d522f475Smrg } 3845d522f475Smrg break; 3846d522f475Smrg case 4: /* DECSCLM (slow scroll) */ 3847d522f475Smrg if (IsSM()) { 3848d522f475Smrg screen->jumpscroll = 0; 3849d522f475Smrg if (screen->scroll_amt) 3850d522f475Smrg FlushScroll(xw); 3851d522f475Smrg } else 3852d522f475Smrg screen->jumpscroll = 1; 3853d522f475Smrg (*func) (&xw->flags, SMOOTHSCROLL); 3854d522f475Smrg update_jumpscroll(); 3855d522f475Smrg break; 3856d522f475Smrg case 5: /* DECSCNM */ 38572eaa94a1Schristos myflags = xw->flags; 3858d522f475Smrg (*func) (&xw->flags, REVERSE_VIDEO); 38592eaa94a1Schristos if ((xw->flags ^ myflags) & REVERSE_VIDEO) 3860d522f475Smrg ReverseVideo(xw); 3861d522f475Smrg /* update_reversevideo done in RevVid */ 3862d522f475Smrg break; 3863d522f475Smrg 3864d522f475Smrg case 6: /* DECOM */ 3865d522f475Smrg (*func) (&xw->flags, ORIGIN); 3866d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 3867d522f475Smrg break; 3868d522f475Smrg 3869d522f475Smrg case 7: /* DECAWM */ 3870d522f475Smrg (*func) (&xw->flags, WRAPAROUND); 3871d522f475Smrg update_autowrap(); 3872d522f475Smrg break; 3873d522f475Smrg case 8: /* DECARM */ 3874d522f475Smrg /* ignore autorepeat 3875d522f475Smrg * XAutoRepeatOn() and XAutoRepeatOff() can do this, but only 3876d522f475Smrg * for the whole display - not limited to a given window. 3877d522f475Smrg */ 3878d522f475Smrg break; 3879d522f475Smrg case SET_X10_MOUSE: /* MIT bogus sequence */ 3880d522f475Smrg MotionOff(screen, xw); 3881d522f475Smrg set_mousemode(X10_MOUSE); 3882d522f475Smrg break; 3883d522f475Smrg#if OPT_TOOLBAR 3884d522f475Smrg case 10: /* rxvt */ 3885d522f475Smrg ShowToolbar(IsSM()); 3886d522f475Smrg break; 3887d522f475Smrg#endif 3888d522f475Smrg#if OPT_BLINK_CURS 3889d522f475Smrg case 12: /* att610: Start/stop blinking cursor */ 3890d522f475Smrg if (screen->cursor_blink_res) { 3891d522f475Smrg set_bool_mode(screen->cursor_blink_esc); 3892d522f475Smrg SetCursorBlink(screen, screen->cursor_blink); 3893d522f475Smrg } 3894d522f475Smrg break; 3895d522f475Smrg#endif 3896d522f475Smrg case 18: /* DECPFF: print form feed */ 3897d522f475Smrg set_bool_mode(screen->printer_formfeed); 3898d522f475Smrg break; 3899d522f475Smrg case 19: /* DECPEX: print extent */ 3900d522f475Smrg set_bool_mode(screen->printer_extent); 3901d522f475Smrg break; 3902d522f475Smrg case 25: /* DECTCEM: Show/hide cursor (VT200) */ 3903d522f475Smrg set_bool_mode(screen->cursor_set); 3904d522f475Smrg break; 3905d522f475Smrg case 30: /* rxvt */ 3906d522f475Smrg if (screen->fullVwin.sb_info.width != (IsSM()? ON : OFF)) 3907d522f475Smrg ToggleScrollBar(xw); 3908d522f475Smrg break; 3909d522f475Smrg#if OPT_SHIFT_FONTS 3910d522f475Smrg case 35: /* rxvt */ 3911d522f475Smrg set_bool_mode(xw->misc.shift_fonts); 3912d522f475Smrg break; 3913d522f475Smrg#endif 3914d522f475Smrg case 38: /* DECTEK */ 3915d522f475Smrg#if OPT_TEK4014 3916d522f475Smrg if (IsSM() && !(screen->inhibit & I_TEK)) { 3917d522f475Smrg FlushLog(screen); 3918d522f475Smrg TEK4014_ACTIVE(xw) = True; 3919d522f475Smrg } 3920d522f475Smrg#endif 3921d522f475Smrg break; 3922d522f475Smrg case 40: /* 132 column mode */ 3923d522f475Smrg set_bool_mode(screen->c132); 3924d522f475Smrg update_allow132(); 3925d522f475Smrg break; 3926d522f475Smrg case 41: /* curses hack */ 3927d522f475Smrg set_bool_mode(screen->curses); 3928d522f475Smrg update_cursesemul(); 3929d522f475Smrg break; 3930d522f475Smrg case 42: /* DECNRCM national charset (VT220) */ 3931d522f475Smrg (*func) (&xw->flags, NATIONAL); 3932d522f475Smrg break; 3933d522f475Smrg case 44: /* margin bell */ 3934d522f475Smrg set_bool_mode(screen->marginbell); 3935d522f475Smrg if (!screen->marginbell) 3936d522f475Smrg screen->bellarmed = -1; 3937d522f475Smrg update_marginbell(); 3938d522f475Smrg break; 3939d522f475Smrg case 45: /* reverse wraparound */ 3940d522f475Smrg (*func) (&xw->flags, REVERSEWRAP); 3941d522f475Smrg update_reversewrap(); 3942d522f475Smrg break; 3943d522f475Smrg#ifdef ALLOWLOGGING 3944d522f475Smrg case 46: /* logging */ 3945d522f475Smrg#ifdef ALLOWLOGFILEONOFF 3946d522f475Smrg /* 3947d522f475Smrg * if this feature is enabled, logging may be 3948d522f475Smrg * enabled and disabled via escape sequences. 3949d522f475Smrg */ 3950d522f475Smrg if (IsSM()) 3951d522f475Smrg StartLog(screen); 3952d522f475Smrg else 3953d522f475Smrg CloseLog(screen); 3954d522f475Smrg#else 3955d522f475Smrg Bell(XkbBI_Info, 0); 3956d522f475Smrg Bell(XkbBI_Info, 0); 3957d522f475Smrg#endif /* ALLOWLOGFILEONOFF */ 3958d522f475Smrg break; 3959d522f475Smrg#endif 3960d522f475Smrg case 1049: /* alternate buffer & cursor */ 3961d522f475Smrg if (!xw->misc.titeInhibit) { 3962d522f475Smrg if (IsSM()) { 3963d522f475Smrg CursorSave(xw); 3964d522f475Smrg ToAlternate(xw); 3965d522f475Smrg ClearScreen(xw); 3966d522f475Smrg } else { 3967d522f475Smrg FromAlternate(xw); 3968d522f475Smrg CursorRestore(xw); 3969d522f475Smrg } 3970d522f475Smrg } else if (xw->misc.tiXtraScroll) { 3971d522f475Smrg if (IsSM()) { 3972d522f475Smrg xtermScroll(xw, screen->max_row); 3973d522f475Smrg } 3974d522f475Smrg } 3975d522f475Smrg break; 3976d522f475Smrg case 1047: 3977d522f475Smrg /* FALLTHRU */ 3978d522f475Smrg case 47: /* alternate buffer */ 3979d522f475Smrg if (!xw->misc.titeInhibit) { 3980d522f475Smrg if (IsSM()) { 3981d522f475Smrg ToAlternate(xw); 3982d522f475Smrg } else { 3983d522f475Smrg if (screen->alternate 3984d522f475Smrg && (param[i] == 1047)) 3985d522f475Smrg ClearScreen(xw); 3986d522f475Smrg FromAlternate(xw); 3987d522f475Smrg } 3988d522f475Smrg } else if (xw->misc.tiXtraScroll) { 3989d522f475Smrg if (IsSM()) { 3990d522f475Smrg xtermScroll(xw, screen->max_row); 3991d522f475Smrg } 3992d522f475Smrg } 3993d522f475Smrg break; 3994d522f475Smrg case 66: /* DECNKM */ 3995d522f475Smrg (*func) (&xw->keyboard.flags, MODE_DECKPAM); 3996d522f475Smrg update_appkeypad(); 3997d522f475Smrg break; 3998d522f475Smrg case 67: /* DECBKM */ 3999d522f475Smrg /* back-arrow mapped to backspace or delete(D) */ 4000d522f475Smrg (*func) (&xw->keyboard.flags, MODE_DECBKM); 4001d522f475Smrg TRACE(("DECSET DECBKM %s\n", 4002d522f475Smrg BtoS(xw->keyboard.flags & MODE_DECBKM))); 4003d522f475Smrg update_decbkm(); 4004d522f475Smrg break; 4005d522f475Smrg case SET_VT200_MOUSE: /* xterm bogus sequence */ 4006d522f475Smrg MotionOff(screen, xw); 4007d522f475Smrg set_mousemode(VT200_MOUSE); 4008d522f475Smrg break; 4009d522f475Smrg case SET_VT200_HIGHLIGHT_MOUSE: /* xterm sequence w/hilite tracking */ 4010d522f475Smrg MotionOff(screen, xw); 4011d522f475Smrg set_mousemode(VT200_HIGHLIGHT_MOUSE); 4012d522f475Smrg break; 4013d522f475Smrg case SET_BTN_EVENT_MOUSE: 4014d522f475Smrg MotionOff(screen, xw); 4015d522f475Smrg set_mousemode(BTN_EVENT_MOUSE); 4016d522f475Smrg break; 4017d522f475Smrg case SET_ANY_EVENT_MOUSE: 4018d522f475Smrg set_mousemode(ANY_EVENT_MOUSE); 4019d522f475Smrg if (screen->send_mouse_pos == MOUSE_OFF) { 4020d522f475Smrg MotionOff(screen, xw); 4021d522f475Smrg } else { 4022d522f475Smrg MotionOn(screen, xw); 4023d522f475Smrg } 4024d522f475Smrg break; 4025d522f475Smrg#if OPT_FOCUS_EVENT 4026d522f475Smrg case SET_FOCUS_EVENT_MOUSE: 4027d522f475Smrg set_bool_mode(screen->send_focus_pos); 4028d522f475Smrg break; 4029d522f475Smrg#endif 4030d522f475Smrg case 1010: /* rxvt */ 4031d522f475Smrg set_bool_mode(screen->scrollttyoutput); 4032d522f475Smrg update_scrollttyoutput(); 4033d522f475Smrg break; 4034d522f475Smrg case 1011: /* rxvt */ 4035d522f475Smrg set_bool_mode(screen->scrollkey); 4036d522f475Smrg update_scrollkey(); 4037d522f475Smrg break; 4038d522f475Smrg case 1034: 4039d522f475Smrg set_bool_mode(xw->screen.input_eight_bits); 4040d522f475Smrg update_alt_esc(); 4041d522f475Smrg break; 4042d522f475Smrg#if OPT_NUM_LOCK 4043d522f475Smrg case 1035: 4044d522f475Smrg set_bool_mode(xw->misc.real_NumLock); 4045d522f475Smrg update_num_lock(); 4046d522f475Smrg break; 4047d522f475Smrg case 1036: 4048d522f475Smrg set_bool_mode(screen->meta_sends_esc); 4049d522f475Smrg update_meta_esc(); 4050d522f475Smrg break; 4051d522f475Smrg#endif 4052d522f475Smrg case 1037: 4053d522f475Smrg set_bool_mode(screen->delete_is_del); 4054d522f475Smrg update_delete_del(); 4055d522f475Smrg break; 4056d522f475Smrg#if OPT_NUM_LOCK 4057d522f475Smrg case 1039: 4058d522f475Smrg set_bool_mode(screen->alt_sends_esc); 4059d522f475Smrg update_alt_esc(); 4060d522f475Smrg break; 4061d522f475Smrg#endif 4062d522f475Smrg case 1040: 4063d522f475Smrg set_bool_mode(screen->keepSelection); 4064d522f475Smrg update_keepSelection(); 4065d522f475Smrg break; 4066d522f475Smrg case 1041: 4067d522f475Smrg set_bool_mode(screen->selectToClipboard); 4068d522f475Smrg update_selectToClipboard(); 4069d522f475Smrg break; 4070d522f475Smrg case 1042: 4071d522f475Smrg set_bool_mode(screen->bellIsUrgent); 4072d522f475Smrg update_bellIsUrgent(); 4073d522f475Smrg break; 4074d522f475Smrg case 1043: 4075d522f475Smrg set_bool_mode(screen->poponbell); 4076d522f475Smrg update_poponbell(); 4077d522f475Smrg break; 4078d522f475Smrg case 1048: 4079d522f475Smrg if (!xw->misc.titeInhibit) { 4080d522f475Smrg if (IsSM()) 4081d522f475Smrg CursorSave(xw); 4082d522f475Smrg else 4083d522f475Smrg CursorRestore(xw); 4084d522f475Smrg } 4085d522f475Smrg break; 4086d522f475Smrg#if OPT_TCAP_FKEYS 4087d522f475Smrg case 1050: 4088d522f475Smrg set_keyboard_type(xw, keyboardIsTermcap, IsSM()); 4089d522f475Smrg break; 4090d522f475Smrg#endif 4091d522f475Smrg#if OPT_SUN_FUNC_KEYS 4092d522f475Smrg case 1051: 4093d522f475Smrg set_keyboard_type(xw, keyboardIsSun, IsSM()); 4094d522f475Smrg break; 4095d522f475Smrg#endif 4096d522f475Smrg#if OPT_HP_FUNC_KEYS 4097d522f475Smrg case 1052: 4098d522f475Smrg set_keyboard_type(xw, keyboardIsHP, IsSM()); 4099d522f475Smrg break; 4100d522f475Smrg#endif 4101d522f475Smrg#if OPT_SCO_FUNC_KEYS 4102d522f475Smrg case 1053: 4103d522f475Smrg set_keyboard_type(xw, keyboardIsSCO, IsSM()); 4104d522f475Smrg break; 4105d522f475Smrg#endif 4106d522f475Smrg case 1060: 4107d522f475Smrg set_keyboard_type(xw, keyboardIsLegacy, IsSM()); 4108d522f475Smrg break; 4109d522f475Smrg#if OPT_SUNPC_KBD 4110d522f475Smrg case 1061: 4111d522f475Smrg set_keyboard_type(xw, keyboardIsVT220, IsSM()); 4112d522f475Smrg break; 4113d522f475Smrg#endif 4114d522f475Smrg#if OPT_READLINE 4115d522f475Smrg case SET_BUTTON1_MOVE_POINT: 4116d522f475Smrg set_mouseflag(click1_moves); 4117d522f475Smrg break; 4118d522f475Smrg case SET_BUTTON2_MOVE_POINT: 4119d522f475Smrg set_mouseflag(paste_moves); 4120d522f475Smrg break; 4121d522f475Smrg case SET_DBUTTON3_DELETE: 4122d522f475Smrg set_mouseflag(dclick3_deletes); 4123d522f475Smrg break; 4124d522f475Smrg case SET_PASTE_IN_BRACKET: 4125d522f475Smrg set_mouseflag(paste_brackets); 4126d522f475Smrg break; 4127d522f475Smrg case SET_PASTE_QUOTE: 4128d522f475Smrg set_mouseflag(paste_quotes); 4129d522f475Smrg break; 4130d522f475Smrg case SET_PASTE_LITERAL_NL: 4131d522f475Smrg set_mouseflag(paste_literal_nl); 4132d522f475Smrg break; 4133d522f475Smrg#endif /* OPT_READLINE */ 4134d522f475Smrg } 4135d522f475Smrg } 4136d522f475Smrg} 4137d522f475Smrg 4138d522f475Smrg/* 4139d522f475Smrg * process xterm private modes save 4140d522f475Smrg */ 4141d522f475Smrgstatic void 4142d522f475Smrgsavemodes(XtermWidget xw) 4143d522f475Smrg{ 4144d522f475Smrg TScreen *screen = &xw->screen; 4145d522f475Smrg int i; 4146d522f475Smrg 4147d522f475Smrg for (i = 0; i < nparam; i++) { 4148d522f475Smrg TRACE(("savemodes %d\n", param[i])); 4149d522f475Smrg switch (param[i]) { 4150d522f475Smrg case 1: /* DECCKM */ 4151d522f475Smrg DoSM(DP_DECCKM, xw->keyboard.flags & MODE_DECCKM); 4152d522f475Smrg break; 4153d522f475Smrg case 3: /* DECCOLM */ 4154d522f475Smrg if (screen->c132) 4155d522f475Smrg DoSM(DP_DECCOLM, xw->flags & IN132COLUMNS); 4156d522f475Smrg break; 4157d522f475Smrg case 4: /* DECSCLM (slow scroll) */ 4158d522f475Smrg DoSM(DP_DECSCLM, xw->flags & SMOOTHSCROLL); 4159d522f475Smrg break; 4160d522f475Smrg case 5: /* DECSCNM */ 4161d522f475Smrg DoSM(DP_DECSCNM, xw->flags & REVERSE_VIDEO); 4162d522f475Smrg break; 4163d522f475Smrg case 6: /* DECOM */ 4164d522f475Smrg DoSM(DP_DECOM, xw->flags & ORIGIN); 4165d522f475Smrg break; 4166d522f475Smrg case 7: /* DECAWM */ 4167d522f475Smrg DoSM(DP_DECAWM, xw->flags & WRAPAROUND); 4168d522f475Smrg break; 4169d522f475Smrg case 8: /* DECARM */ 4170d522f475Smrg /* ignore autorepeat */ 4171d522f475Smrg break; 4172d522f475Smrg case SET_X10_MOUSE: /* mouse bogus sequence */ 4173d522f475Smrg DoSM(DP_X_X10MSE, screen->send_mouse_pos); 4174d522f475Smrg break; 4175d522f475Smrg#if OPT_TOOLBAR 4176d522f475Smrg case 10: /* rxvt */ 4177d522f475Smrg DoSM(DP_TOOLBAR, resource.toolBar); 4178d522f475Smrg break; 4179d522f475Smrg#endif 4180d522f475Smrg#if OPT_BLINK_CURS 4181d522f475Smrg case 12: /* att610: Start/stop blinking cursor */ 4182d522f475Smrg if (screen->cursor_blink_res) { 4183d522f475Smrg DoSM(DP_CRS_BLINK, screen->cursor_blink_esc); 4184d522f475Smrg } 4185d522f475Smrg break; 4186d522f475Smrg#endif 4187d522f475Smrg case 18: /* DECPFF: print form feed */ 4188d522f475Smrg DoSM(DP_PRN_FORMFEED, screen->printer_formfeed); 4189d522f475Smrg break; 4190d522f475Smrg case 19: /* DECPEX: print extent */ 4191d522f475Smrg DoSM(DP_PRN_EXTENT, screen->printer_extent); 4192d522f475Smrg break; 4193d522f475Smrg case 25: /* DECTCEM: Show/hide cursor (VT200) */ 4194d522f475Smrg DoSM(DP_CRS_VISIBLE, screen->cursor_set); 4195d522f475Smrg break; 4196d522f475Smrg case 40: /* 132 column mode */ 4197d522f475Smrg DoSM(DP_X_DECCOLM, screen->c132); 4198d522f475Smrg break; 4199d522f475Smrg case 41: /* curses hack */ 4200d522f475Smrg DoSM(DP_X_MORE, screen->curses); 4201d522f475Smrg break; 4202d522f475Smrg case 42: /* DECNRCM national charset (VT220) */ 4203d522f475Smrg /* do nothing */ 4204d522f475Smrg break; 4205d522f475Smrg case 44: /* margin bell */ 4206d522f475Smrg DoSM(DP_X_MARGIN, screen->marginbell); 4207d522f475Smrg break; 4208d522f475Smrg case 45: /* reverse wraparound */ 4209d522f475Smrg DoSM(DP_X_REVWRAP, xw->flags & REVERSEWRAP); 4210d522f475Smrg break; 4211d522f475Smrg#ifdef ALLOWLOGGING 4212d522f475Smrg case 46: /* logging */ 4213d522f475Smrg DoSM(DP_X_LOGGING, screen->logging); 4214d522f475Smrg break; 4215d522f475Smrg#endif 4216d522f475Smrg case 1047: /* alternate buffer */ 4217d522f475Smrg /* FALLTHRU */ 4218d522f475Smrg case 47: /* alternate buffer */ 4219d522f475Smrg DoSM(DP_X_ALTSCRN, screen->alternate); 4220d522f475Smrg break; 4221d522f475Smrg case SET_VT200_MOUSE: /* mouse bogus sequence */ 4222d522f475Smrg case SET_VT200_HIGHLIGHT_MOUSE: 4223d522f475Smrg case SET_BTN_EVENT_MOUSE: 4224d522f475Smrg case SET_ANY_EVENT_MOUSE: 4225d522f475Smrg DoSM(DP_X_MOUSE, screen->send_mouse_pos); 4226d522f475Smrg break; 4227d522f475Smrg#if OPT_FOCUS_EVENT 4228d522f475Smrg case SET_FOCUS_EVENT_MOUSE: 4229d522f475Smrg DoSM(DP_X_FOCUS, screen->send_focus_pos); 4230d522f475Smrg break; 4231d522f475Smrg#endif 4232d522f475Smrg case 1048: 4233d522f475Smrg if (!xw->misc.titeInhibit) { 4234d522f475Smrg CursorSave(xw); 4235d522f475Smrg } 4236d522f475Smrg break; 4237d522f475Smrg#if OPT_READLINE 4238d522f475Smrg case SET_BUTTON1_MOVE_POINT: 4239d522f475Smrg SCREEN_FLAG_save(screen, click1_moves); 4240d522f475Smrg break; 4241d522f475Smrg case SET_BUTTON2_MOVE_POINT: 4242d522f475Smrg SCREEN_FLAG_save(screen, paste_moves); 4243d522f475Smrg break; 4244d522f475Smrg case SET_DBUTTON3_DELETE: 4245d522f475Smrg SCREEN_FLAG_save(screen, dclick3_deletes); 4246d522f475Smrg break; 4247d522f475Smrg case SET_PASTE_IN_BRACKET: 4248d522f475Smrg SCREEN_FLAG_save(screen, paste_brackets); 4249d522f475Smrg break; 4250d522f475Smrg case SET_PASTE_QUOTE: 4251d522f475Smrg SCREEN_FLAG_save(screen, paste_quotes); 4252d522f475Smrg break; 4253d522f475Smrg case SET_PASTE_LITERAL_NL: 4254d522f475Smrg SCREEN_FLAG_save(screen, paste_literal_nl); 4255d522f475Smrg break; 4256d522f475Smrg#endif /* OPT_READLINE */ 4257d522f475Smrg } 4258d522f475Smrg } 4259d522f475Smrg} 4260d522f475Smrg 4261d522f475Smrg/* 4262d522f475Smrg * process xterm private modes restore 4263d522f475Smrg */ 4264d522f475Smrgstatic void 4265d522f475Smrgrestoremodes(XtermWidget xw) 4266d522f475Smrg{ 4267d522f475Smrg TScreen *screen = &xw->screen; 4268d522f475Smrg int i, j; 4269d522f475Smrg 4270d522f475Smrg for (i = 0; i < nparam; i++) { 4271d522f475Smrg TRACE(("restoremodes %d\n", param[i])); 4272d522f475Smrg switch (param[i]) { 4273d522f475Smrg case 1: /* DECCKM */ 4274d522f475Smrg bitcpy(&xw->keyboard.flags, 4275d522f475Smrg screen->save_modes[DP_DECCKM], MODE_DECCKM); 4276d522f475Smrg update_appcursor(); 4277d522f475Smrg break; 4278d522f475Smrg case 3: /* DECCOLM */ 4279d522f475Smrg if (screen->c132) { 4280d522f475Smrg ClearScreen(xw); 4281d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 4282d522f475Smrg if ((j = (screen->save_modes[DP_DECCOLM] & IN132COLUMNS) 4283d522f475Smrg ? 132 : 80) != ((xw->flags & IN132COLUMNS) 4284d522f475Smrg ? 132 : 80) || j != MaxCols(screen)) 4285d522f475Smrg RequestResize(xw, -1, j, True); 4286d522f475Smrg bitcpy(&xw->flags, 4287d522f475Smrg screen->save_modes[DP_DECCOLM], 4288d522f475Smrg IN132COLUMNS); 4289d522f475Smrg } 4290d522f475Smrg break; 4291d522f475Smrg case 4: /* DECSCLM (slow scroll) */ 4292d522f475Smrg if (screen->save_modes[DP_DECSCLM] & SMOOTHSCROLL) { 4293d522f475Smrg screen->jumpscroll = 0; 4294d522f475Smrg if (screen->scroll_amt) 4295d522f475Smrg FlushScroll(xw); 4296d522f475Smrg } else 4297d522f475Smrg screen->jumpscroll = 1; 4298d522f475Smrg bitcpy(&xw->flags, screen->save_modes[DP_DECSCLM], SMOOTHSCROLL); 4299d522f475Smrg update_jumpscroll(); 4300d522f475Smrg break; 4301d522f475Smrg case 5: /* DECSCNM */ 4302d522f475Smrg if ((screen->save_modes[DP_DECSCNM] ^ xw->flags) & REVERSE_VIDEO) { 4303d522f475Smrg bitcpy(&xw->flags, screen->save_modes[DP_DECSCNM], REVERSE_VIDEO); 4304d522f475Smrg ReverseVideo(xw); 4305d522f475Smrg /* update_reversevideo done in RevVid */ 4306d522f475Smrg } 4307d522f475Smrg break; 4308d522f475Smrg case 6: /* DECOM */ 4309d522f475Smrg bitcpy(&xw->flags, screen->save_modes[DP_DECOM], ORIGIN); 4310d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 4311d522f475Smrg break; 4312d522f475Smrg 4313d522f475Smrg case 7: /* DECAWM */ 4314d522f475Smrg bitcpy(&xw->flags, screen->save_modes[DP_DECAWM], WRAPAROUND); 4315d522f475Smrg update_autowrap(); 4316d522f475Smrg break; 4317d522f475Smrg case 8: /* DECARM */ 4318d522f475Smrg /* ignore autorepeat */ 4319d522f475Smrg break; 4320d522f475Smrg case SET_X10_MOUSE: /* MIT bogus sequence */ 43212eaa94a1Schristos DoRM0(DP_X_X10MSE, screen->send_mouse_pos); 4322d522f475Smrg break; 4323d522f475Smrg#if OPT_TOOLBAR 4324d522f475Smrg case 10: /* rxvt */ 4325d522f475Smrg DoRM(DP_TOOLBAR, resource.toolBar); 4326d522f475Smrg ShowToolbar(resource.toolBar); 4327d522f475Smrg break; 4328d522f475Smrg#endif 4329d522f475Smrg#if OPT_BLINK_CURS 4330d522f475Smrg case 12: /* att610: Start/stop blinking cursor */ 4331d522f475Smrg if (screen->cursor_blink_res) { 4332d522f475Smrg DoRM(DP_CRS_BLINK, screen->cursor_blink_esc); 4333d522f475Smrg SetCursorBlink(screen, screen->cursor_blink); 4334d522f475Smrg } 4335d522f475Smrg break; 4336d522f475Smrg#endif 4337d522f475Smrg case 18: /* DECPFF: print form feed */ 4338d522f475Smrg DoRM(DP_PRN_FORMFEED, screen->printer_formfeed); 4339d522f475Smrg break; 4340d522f475Smrg case 19: /* DECPEX: print extent */ 4341d522f475Smrg DoRM(DP_PRN_EXTENT, screen->printer_extent); 4342d522f475Smrg break; 4343d522f475Smrg case 25: /* DECTCEM: Show/hide cursor (VT200) */ 4344d522f475Smrg DoRM(DP_CRS_VISIBLE, screen->cursor_set); 4345d522f475Smrg break; 4346d522f475Smrg case 40: /* 132 column mode */ 4347d522f475Smrg DoRM(DP_X_DECCOLM, screen->c132); 4348d522f475Smrg update_allow132(); 4349d522f475Smrg break; 4350d522f475Smrg case 41: /* curses hack */ 4351d522f475Smrg DoRM(DP_X_MORE, screen->curses); 4352d522f475Smrg update_cursesemul(); 4353d522f475Smrg break; 4354d522f475Smrg case 44: /* margin bell */ 4355d522f475Smrg if ((DoRM(DP_X_MARGIN, screen->marginbell)) == 0) 4356d522f475Smrg screen->bellarmed = -1; 4357d522f475Smrg update_marginbell(); 4358d522f475Smrg break; 4359d522f475Smrg case 45: /* reverse wraparound */ 4360d522f475Smrg bitcpy(&xw->flags, screen->save_modes[DP_X_REVWRAP], REVERSEWRAP); 4361d522f475Smrg update_reversewrap(); 4362d522f475Smrg break; 4363d522f475Smrg#ifdef ALLOWLOGGING 4364d522f475Smrg case 46: /* logging */ 4365d522f475Smrg#ifdef ALLOWLOGFILEONOFF 4366d522f475Smrg if (screen->save_modes[DP_X_LOGGING]) 4367d522f475Smrg StartLog(screen); 4368d522f475Smrg else 4369d522f475Smrg CloseLog(screen); 4370d522f475Smrg#endif /* ALLOWLOGFILEONOFF */ 4371d522f475Smrg /* update_logging done by StartLog and CloseLog */ 4372d522f475Smrg break; 4373d522f475Smrg#endif 4374d522f475Smrg case 1047: /* alternate buffer */ 4375d522f475Smrg /* FALLTHRU */ 4376d522f475Smrg case 47: /* alternate buffer */ 4377d522f475Smrg if (!xw->misc.titeInhibit) { 4378d522f475Smrg if (screen->save_modes[DP_X_ALTSCRN]) 4379d522f475Smrg ToAlternate(xw); 4380d522f475Smrg else 4381d522f475Smrg FromAlternate(xw); 4382d522f475Smrg /* update_altscreen done by ToAlt and FromAlt */ 4383d522f475Smrg } else if (xw->misc.tiXtraScroll) { 4384d522f475Smrg if (screen->save_modes[DP_X_ALTSCRN]) { 4385d522f475Smrg xtermScroll(xw, screen->max_row); 4386d522f475Smrg } 4387d522f475Smrg } 4388d522f475Smrg break; 4389d522f475Smrg case SET_VT200_MOUSE: /* mouse bogus sequence */ 4390d522f475Smrg case SET_VT200_HIGHLIGHT_MOUSE: 4391d522f475Smrg case SET_BTN_EVENT_MOUSE: 4392d522f475Smrg case SET_ANY_EVENT_MOUSE: 43932eaa94a1Schristos DoRM0(DP_X_MOUSE, screen->send_mouse_pos); 4394d522f475Smrg break; 4395d522f475Smrg#if OPT_FOCUS_EVENT 4396d522f475Smrg case SET_FOCUS_EVENT_MOUSE: 4397d522f475Smrg DoRM(DP_X_FOCUS, screen->send_focus_pos); 4398d522f475Smrg break; 4399d522f475Smrg#endif 4400d522f475Smrg case 1048: 4401d522f475Smrg if (!xw->misc.titeInhibit) { 4402d522f475Smrg CursorRestore(xw); 4403d522f475Smrg } 4404d522f475Smrg break; 4405d522f475Smrg#if OPT_READLINE 4406d522f475Smrg case SET_BUTTON1_MOVE_POINT: 4407d522f475Smrg SCREEN_FLAG_restore(screen, click1_moves); 4408d522f475Smrg break; 4409d522f475Smrg case SET_BUTTON2_MOVE_POINT: 4410d522f475Smrg SCREEN_FLAG_restore(screen, paste_moves); 4411d522f475Smrg break; 4412d522f475Smrg case SET_DBUTTON3_DELETE: 4413d522f475Smrg SCREEN_FLAG_restore(screen, dclick3_deletes); 4414d522f475Smrg break; 4415d522f475Smrg case SET_PASTE_IN_BRACKET: 4416d522f475Smrg SCREEN_FLAG_restore(screen, paste_brackets); 4417d522f475Smrg break; 4418d522f475Smrg case SET_PASTE_QUOTE: 4419d522f475Smrg SCREEN_FLAG_restore(screen, paste_quotes); 4420d522f475Smrg break; 4421d522f475Smrg case SET_PASTE_LITERAL_NL: 4422d522f475Smrg SCREEN_FLAG_restore(screen, paste_literal_nl); 4423d522f475Smrg break; 4424d522f475Smrg#endif /* OPT_READLINE */ 4425d522f475Smrg } 4426d522f475Smrg } 4427d522f475Smrg} 4428d522f475Smrg 4429d522f475Smrg/* 4430d522f475Smrg * Report window label (icon or title) in dtterm protocol 4431d522f475Smrg * ESC ] code label ESC backslash 4432d522f475Smrg */ 4433d522f475Smrgstatic void 4434d522f475Smrgreport_win_label(XtermWidget xw, 4435d522f475Smrg int code, 4436d522f475Smrg XTextProperty * text, 4437d522f475Smrg Status ok) 4438d522f475Smrg{ 4439d522f475Smrg char **list; 4440d522f475Smrg int length = 0; 4441d522f475Smrg 4442d522f475Smrg reply.a_type = ANSI_ESC; 4443d522f475Smrg unparseputc(xw, ANSI_ESC); 4444d522f475Smrg unparseputc(xw, ']'); 4445d522f475Smrg unparseputc(xw, code); 4446d522f475Smrg 4447d522f475Smrg if (ok) { 4448d522f475Smrg if (XTextPropertyToStringList(text, &list, &length)) { 4449d522f475Smrg int n, c; 4450d522f475Smrg for (n = 0; n < length; n++) { 4451d522f475Smrg char *s = list[n]; 4452d522f475Smrg while ((c = *s++) != '\0') 4453d522f475Smrg unparseputc(xw, c); 4454d522f475Smrg } 4455d522f475Smrg XFreeStringList(list); 4456d522f475Smrg } 4457d522f475Smrg if (text->value != 0) 4458d522f475Smrg XFree(text->value); 4459d522f475Smrg } 4460d522f475Smrg 4461d522f475Smrg unparseputc(xw, ANSI_ESC); 4462d522f475Smrg unparseputc(xw, '\\'); /* should be ST */ 4463d522f475Smrg unparse_end(xw); 4464d522f475Smrg} 4465d522f475Smrg 4466d522f475Smrg/* 4467d522f475Smrg * Window operations (from CDE dtterm description, as well as extensions). 4468d522f475Smrg * See also "allowWindowOps" resource. 4469d522f475Smrg */ 4470d522f475Smrgstatic void 4471d522f475Smrgwindow_ops(XtermWidget xw) 4472d522f475Smrg{ 4473d522f475Smrg TScreen *screen = &xw->screen; 4474d522f475Smrg XWindowChanges values; 4475d522f475Smrg XWindowAttributes win_attrs; 4476d522f475Smrg XTextProperty text; 4477d522f475Smrg unsigned value_mask; 4478d522f475Smrg#if OPT_MAXIMIZE 4479d522f475Smrg unsigned root_width; 4480d522f475Smrg unsigned root_height; 4481d522f475Smrg#endif 4482d522f475Smrg 4483d522f475Smrg TRACE(("window_ops %d\n", param[0])); 4484d522f475Smrg switch (param[0]) { 4485d522f475Smrg case 1: /* Restore (de-iconify) window */ 4486d522f475Smrg XMapWindow(screen->display, 4487d522f475Smrg VShellWindow); 4488d522f475Smrg break; 4489d522f475Smrg 4490d522f475Smrg case 2: /* Minimize (iconify) window */ 4491d522f475Smrg XIconifyWindow(screen->display, 4492d522f475Smrg VShellWindow, 4493d522f475Smrg DefaultScreen(screen->display)); 4494d522f475Smrg break; 4495d522f475Smrg 4496d522f475Smrg case 3: /* Move the window to the given position */ 4497d522f475Smrg values.x = param[1]; 4498d522f475Smrg values.y = param[2]; 4499d522f475Smrg value_mask = (CWX | CWY); 4500d522f475Smrg XReconfigureWMWindow(screen->display, 4501d522f475Smrg VShellWindow, 4502d522f475Smrg DefaultScreen(screen->display), 4503d522f475Smrg value_mask, 4504d522f475Smrg &values); 4505d522f475Smrg break; 4506d522f475Smrg 4507d522f475Smrg case 4: /* Resize the window to given size in pixels */ 4508d522f475Smrg RequestResize(xw, param[1], param[2], False); 4509d522f475Smrg break; 4510d522f475Smrg 4511d522f475Smrg case 5: /* Raise the window to the front of the stack */ 4512d522f475Smrg XRaiseWindow(screen->display, VShellWindow); 4513d522f475Smrg break; 4514d522f475Smrg 4515d522f475Smrg case 6: /* Lower the window to the bottom of the stack */ 4516d522f475Smrg XLowerWindow(screen->display, VShellWindow); 4517d522f475Smrg break; 4518d522f475Smrg 4519d522f475Smrg case 7: /* Refresh the window */ 4520d522f475Smrg Redraw(); 4521d522f475Smrg break; 4522d522f475Smrg 4523d522f475Smrg case 8: /* Resize the text-area, in characters */ 4524d522f475Smrg RequestResize(xw, param[1], param[2], True); 4525d522f475Smrg break; 4526d522f475Smrg 4527d522f475Smrg#if OPT_MAXIMIZE 4528d522f475Smrg case 9: /* Maximize or restore */ 4529d522f475Smrg RequestMaximize(xw, param[1]); 4530d522f475Smrg break; 4531d522f475Smrg#endif 4532d522f475Smrg 4533d522f475Smrg case 11: /* Report the window's state */ 4534d522f475Smrg XGetWindowAttributes(screen->display, 4535d522f475Smrg VWindow(screen), 4536d522f475Smrg &win_attrs); 4537d522f475Smrg reply.a_type = ANSI_CSI; 4538d522f475Smrg reply.a_pintro = 0; 4539d522f475Smrg reply.a_nparam = 1; 45402eaa94a1Schristos reply.a_param[0] = (ParmType) ((win_attrs.map_state == IsViewable) 45412eaa94a1Schristos ? 1 45422eaa94a1Schristos : 2); 4543d522f475Smrg reply.a_inters = 0; 4544d522f475Smrg reply.a_final = 't'; 4545d522f475Smrg unparseseq(xw, &reply); 4546d522f475Smrg break; 4547d522f475Smrg 4548d522f475Smrg case 13: /* Report the window's position */ 4549d522f475Smrg XGetWindowAttributes(screen->display, 4550d522f475Smrg WMFrameWindow(xw), 4551d522f475Smrg &win_attrs); 4552d522f475Smrg reply.a_type = ANSI_CSI; 4553d522f475Smrg reply.a_pintro = 0; 4554d522f475Smrg reply.a_nparam = 3; 4555d522f475Smrg reply.a_param[0] = 3; 45562eaa94a1Schristos reply.a_param[1] = (ParmType) win_attrs.x; 45572eaa94a1Schristos reply.a_param[2] = (ParmType) win_attrs.y; 4558d522f475Smrg reply.a_inters = 0; 4559d522f475Smrg reply.a_final = 't'; 4560d522f475Smrg unparseseq(xw, &reply); 4561d522f475Smrg break; 4562d522f475Smrg 4563d522f475Smrg case 14: /* Report the window's size in pixels */ 4564d522f475Smrg XGetWindowAttributes(screen->display, 4565d522f475Smrg VWindow(screen), 4566d522f475Smrg &win_attrs); 4567d522f475Smrg reply.a_type = ANSI_CSI; 4568d522f475Smrg reply.a_pintro = 0; 4569d522f475Smrg reply.a_nparam = 3; 4570d522f475Smrg reply.a_param[0] = 4; 4571d522f475Smrg /*FIXME: find if dtterm uses 4572d522f475Smrg * win_attrs.height or Height 4573d522f475Smrg * win_attrs.width or Width 4574d522f475Smrg */ 45752eaa94a1Schristos reply.a_param[1] = (ParmType) Height(screen); 45762eaa94a1Schristos reply.a_param[2] = (ParmType) Width(screen); 4577d522f475Smrg reply.a_inters = 0; 4578d522f475Smrg reply.a_final = 't'; 4579d522f475Smrg unparseseq(xw, &reply); 4580d522f475Smrg break; 4581d522f475Smrg 4582d522f475Smrg case 18: /* Report the text's size in characters */ 4583d522f475Smrg reply.a_type = ANSI_CSI; 4584d522f475Smrg reply.a_pintro = 0; 4585d522f475Smrg reply.a_nparam = 3; 4586d522f475Smrg reply.a_param[0] = 8; 45872eaa94a1Schristos reply.a_param[1] = (ParmType) MaxRows(screen); 45882eaa94a1Schristos reply.a_param[2] = (ParmType) MaxCols(screen); 4589d522f475Smrg reply.a_inters = 0; 4590d522f475Smrg reply.a_final = 't'; 4591d522f475Smrg unparseseq(xw, &reply); 4592d522f475Smrg break; 4593d522f475Smrg 4594d522f475Smrg#if OPT_MAXIMIZE 4595d522f475Smrg case 19: /* Report the screen's size, in characters */ 4596d522f475Smrg if (!QueryMaximize(xw, &root_height, &root_width)) { 4597d522f475Smrg root_height = 0; 4598d522f475Smrg root_width = 0; 4599d522f475Smrg } 4600d522f475Smrg reply.a_type = ANSI_CSI; 4601d522f475Smrg reply.a_pintro = 0; 4602d522f475Smrg reply.a_nparam = 3; 4603d522f475Smrg reply.a_param[0] = 9; 46042eaa94a1Schristos reply.a_param[1] = (ParmType) (root_height / FontHeight(screen)); 46052eaa94a1Schristos reply.a_param[2] = (ParmType) (root_width / FontWidth(screen)); 4606d522f475Smrg reply.a_inters = 0; 4607d522f475Smrg reply.a_final = 't'; 4608d522f475Smrg unparseseq(xw, &reply); 4609d522f475Smrg break; 4610d522f475Smrg#endif 4611d522f475Smrg 4612d522f475Smrg case 20: /* Report the icon's label */ 4613d522f475Smrg report_win_label(xw, 'L', &text, 4614d522f475Smrg XGetWMIconName(screen->display, VShellWindow, &text)); 4615d522f475Smrg break; 4616d522f475Smrg 4617d522f475Smrg case 21: /* Report the window's title */ 4618d522f475Smrg report_win_label(xw, 'l', &text, 4619d522f475Smrg XGetWMName(screen->display, VShellWindow, &text)); 4620d522f475Smrg break; 4621d522f475Smrg 4622d522f475Smrg default: /* DECSLPP (24, 25, 36, 48, 72, 144) */ 4623d522f475Smrg if (param[0] >= 24) 4624d522f475Smrg RequestResize(xw, param[0], -1, True); 4625d522f475Smrg break; 4626d522f475Smrg } 4627d522f475Smrg} 4628d522f475Smrg 4629d522f475Smrg/* 4630d522f475Smrg * set a bit in a word given a pointer to the word and a mask. 4631d522f475Smrg */ 4632d522f475Smrgstatic void 4633d522f475Smrgbitset(unsigned *p, unsigned mask) 4634d522f475Smrg{ 4635d522f475Smrg *p |= mask; 4636d522f475Smrg} 4637d522f475Smrg 4638d522f475Smrg/* 4639d522f475Smrg * clear a bit in a word given a pointer to the word and a mask. 4640d522f475Smrg */ 4641d522f475Smrgstatic void 4642d522f475Smrgbitclr(unsigned *p, unsigned mask) 4643d522f475Smrg{ 4644d522f475Smrg *p &= ~mask; 4645d522f475Smrg} 4646d522f475Smrg 4647d522f475Smrg/* 4648d522f475Smrg * Copy bits from one word to another, given a mask 4649d522f475Smrg */ 4650d522f475Smrgstatic void 4651d522f475Smrgbitcpy(unsigned *p, unsigned q, unsigned mask) 4652d522f475Smrg{ 4653d522f475Smrg bitclr(p, mask); 4654d522f475Smrg bitset(p, q & mask); 4655d522f475Smrg} 4656d522f475Smrg 4657d522f475Smrgvoid 4658d522f475Smrgunparseputc1(XtermWidget xw, int c) 4659d522f475Smrg{ 4660d522f475Smrg if (c >= 0x80 && c <= 0x9F) { 4661d522f475Smrg if (!xw->screen.control_eight_bits) { 4662d522f475Smrg unparseputc(xw, A2E(ANSI_ESC)); 4663d522f475Smrg c = A2E(c - 0x40); 4664d522f475Smrg } 4665d522f475Smrg } 4666d522f475Smrg unparseputc(xw, c); 4667d522f475Smrg} 4668d522f475Smrg 4669d522f475Smrgvoid 4670d522f475Smrgunparseseq(XtermWidget xw, ANSI * ap) 4671d522f475Smrg{ 4672d522f475Smrg int c; 4673d522f475Smrg int i; 4674d522f475Smrg int inters; 4675d522f475Smrg 4676d522f475Smrg unparseputc1(xw, c = ap->a_type); 4677d522f475Smrg if (c == ANSI_ESC 4678d522f475Smrg || c == ANSI_DCS 4679d522f475Smrg || c == ANSI_CSI 4680d522f475Smrg || c == ANSI_OSC 4681d522f475Smrg || c == ANSI_PM 4682d522f475Smrg || c == ANSI_APC 4683d522f475Smrg || c == ANSI_SS3) { 4684d522f475Smrg if (ap->a_pintro != 0) 4685d522f475Smrg unparseputc(xw, ap->a_pintro); 4686d522f475Smrg for (i = 0; i < ap->a_nparam; ++i) { 4687d522f475Smrg if (i != 0) 4688d522f475Smrg unparseputc(xw, ';'); 4689d522f475Smrg unparseputn(xw, (unsigned int) ap->a_param[i]); 4690d522f475Smrg } 4691d522f475Smrg if ((inters = ap->a_inters) != 0) { 4692d522f475Smrg for (i = 3; i >= 0; --i) { 4693d522f475Smrg c = CharOf(inters >> (8 * i)); 4694d522f475Smrg if (c != 0) 4695d522f475Smrg unparseputc(xw, c); 4696d522f475Smrg } 4697d522f475Smrg } 4698d522f475Smrg unparseputc(xw, (char) ap->a_final); 4699d522f475Smrg } 4700d522f475Smrg unparse_end(xw); 4701d522f475Smrg} 4702d522f475Smrg 4703d522f475Smrgvoid 4704d522f475Smrgunparseputn(XtermWidget xw, unsigned int n) 4705d522f475Smrg{ 4706d522f475Smrg unsigned int q; 4707d522f475Smrg 4708d522f475Smrg q = n / 10; 4709d522f475Smrg if (q != 0) 4710d522f475Smrg unparseputn(xw, q); 4711d522f475Smrg unparseputc(xw, (char) ('0' + (n % 10))); 4712d522f475Smrg} 4713d522f475Smrg 4714d522f475Smrgvoid 4715d522f475Smrgunparseputs(XtermWidget xw, char *s) 4716d522f475Smrg{ 4717d522f475Smrg while (*s) 4718d522f475Smrg unparseputc(xw, *s++); 4719d522f475Smrg} 4720d522f475Smrg 4721d522f475Smrgvoid 4722d522f475Smrgunparseputc(XtermWidget xw, int c) 4723d522f475Smrg{ 4724d522f475Smrg IChar *buf = xw->screen.unparse_bfr; 4725d522f475Smrg unsigned len; 4726d522f475Smrg 4727d522f475Smrg if ((xw->screen.unparse_len + 2) >= sizeof(xw->screen.unparse_bfr)) 4728d522f475Smrg unparse_end(xw); 4729d522f475Smrg 4730d522f475Smrg len = xw->screen.unparse_len; 4731d522f475Smrg 4732d522f475Smrg#if OPT_TCAP_QUERY 4733d522f475Smrg /* 4734d522f475Smrg * If we're returning a termcap string, it has to be translated since 4735d522f475Smrg * a DCS must not contain any characters except for the normal 7-bit 4736d522f475Smrg * printable ASCII (counting tab, carriage return, etc). For now, 4737d522f475Smrg * just use hexadecimal for the whole thing. 4738d522f475Smrg */ 4739d522f475Smrg if (xw->screen.tc_query_code >= 0) { 4740d522f475Smrg char tmp[3]; 4741d522f475Smrg sprintf(tmp, "%02X", c & 0xFF); 47422eaa94a1Schristos buf[len++] = CharOf(tmp[0]); 47432eaa94a1Schristos buf[len++] = CharOf(tmp[1]); 4744d522f475Smrg } else 4745d522f475Smrg#endif 47462eaa94a1Schristos if ((buf[len++] = (IChar) c) == '\r' && (xw->flags & LINEFEED)) { 4747d522f475Smrg buf[len++] = '\n'; 4748d522f475Smrg } 4749d522f475Smrg 4750d522f475Smrg xw->screen.unparse_len = len; 4751d522f475Smrg 4752d522f475Smrg /* If send/receive mode is reset, we echo characters locally */ 4753d522f475Smrg if ((xw->keyboard.flags & MODE_SRM) == 0) { 4754d522f475Smrg (void) doparsing(xw, (unsigned) c, &myState); 4755d522f475Smrg } 4756d522f475Smrg} 4757d522f475Smrg 4758d522f475Smrgvoid 4759d522f475Smrgunparse_end(XtermWidget xw) 4760d522f475Smrg{ 4761d522f475Smrg if (xw->screen.unparse_len) { 4762d522f475Smrg#ifdef VMS 4763d522f475Smrg tt_write(xw->screen.unparse_bfr, xw->screen.unparse_len); 4764d522f475Smrg#else /* VMS */ 4765d522f475Smrg writePtyData(xw->screen.respond, xw->screen.unparse_bfr, xw->screen.unparse_len); 4766d522f475Smrg#endif /* VMS */ 4767d522f475Smrg xw->screen.unparse_len = 0; 4768d522f475Smrg } 4769d522f475Smrg} 4770d522f475Smrg 4771d522f475Smrgvoid 4772d522f475SmrgToggleAlternate(XtermWidget xw) 4773d522f475Smrg{ 4774d522f475Smrg if (xw->screen.alternate) 4775d522f475Smrg FromAlternate(xw); 4776d522f475Smrg else 4777d522f475Smrg ToAlternate(xw); 4778d522f475Smrg} 4779d522f475Smrg 4780d522f475Smrgstatic void 4781d522f475SmrgToAlternate(XtermWidget xw) 4782d522f475Smrg{ 4783d522f475Smrg TScreen *screen = &(xw->screen); 4784d522f475Smrg 4785d522f475Smrg if (!screen->alternate) { 4786d522f475Smrg TRACE(("ToAlternate\n")); 4787d522f475Smrg if (!screen->altbuf) 4788d522f475Smrg screen->altbuf = Allocate(MaxRows(screen), MaxCols(screen), 4789d522f475Smrg &screen->abuf_address); 4790d522f475Smrg SwitchBufs(xw); 4791d522f475Smrg screen->alternate = True; 4792d522f475Smrg update_altscreen(); 4793d522f475Smrg } 4794d522f475Smrg} 4795d522f475Smrg 4796d522f475Smrgstatic void 4797d522f475SmrgFromAlternate(XtermWidget xw) 4798d522f475Smrg{ 4799d522f475Smrg TScreen *screen = &(xw->screen); 4800d522f475Smrg 4801d522f475Smrg if (screen->alternate) { 4802d522f475Smrg TRACE(("FromAlternate\n")); 4803d522f475Smrg if (screen->scroll_amt) 4804d522f475Smrg FlushScroll(xw); 4805d522f475Smrg screen->alternate = False; 4806d522f475Smrg SwitchBufs(xw); 4807d522f475Smrg update_altscreen(); 4808d522f475Smrg } 4809d522f475Smrg} 4810d522f475Smrg 4811d522f475Smrgstatic void 4812d522f475SmrgSwitchBufs(XtermWidget xw) 4813d522f475Smrg{ 4814d522f475Smrg TScreen *screen = &(xw->screen); 4815d522f475Smrg int rows, top; 4816d522f475Smrg 4817d522f475Smrg if (screen->cursor_state) 4818d522f475Smrg HideCursor(); 4819d522f475Smrg 4820d522f475Smrg rows = MaxRows(screen); 4821d522f475Smrg SwitchBufPtrs(screen); 4822d522f475Smrg 4823d522f475Smrg if ((top = INX2ROW(screen, 0)) < rows) { 4824d522f475Smrg if (screen->scroll_amt) 4825d522f475Smrg FlushScroll(xw); 4826d522f475Smrg XClearArea(screen->display, 4827d522f475Smrg VWindow(screen), 4828d522f475Smrg (int) OriginX(screen), 4829d522f475Smrg (int) top * FontHeight(screen) + screen->border, 4830d522f475Smrg (unsigned) Width(screen), 48312eaa94a1Schristos (unsigned) ((rows - top) * FontHeight(screen)), 4832d522f475Smrg False); 4833d522f475Smrg } 4834d522f475Smrg ScrnUpdate(xw, 0, 0, rows, MaxCols(screen), False); 4835d522f475Smrg} 4836d522f475Smrg 4837d522f475SmrgBool 4838d522f475SmrgCheckBufPtrs(TScreen * screen) 4839d522f475Smrg{ 4840d522f475Smrg return (screen->visbuf != 0 4841d522f475Smrg && screen->altbuf != 0); 4842d522f475Smrg} 4843d522f475Smrg 4844d522f475Smrg/* 4845d522f475Smrg * Swap buffer line pointers between alternate and regular screens. 4846d522f475Smrg * visbuf contains pointers from allbuf or altbuf for the visible screen, 4847d522f475Smrg * and pointers from allbuf for the saved lines. That makes it simple to 4848d522f475Smrg * scroll back over the saved lines without juggling pointers for the 4849d522f475Smrg * regular and alternate screens. 4850d522f475Smrg */ 4851d522f475Smrgvoid 4852d522f475SmrgSwitchBufPtrs(TScreen * screen) 4853d522f475Smrg{ 4854d522f475Smrg if (CheckBufPtrs(screen)) { 4855d522f475Smrg size_t len = ScrnPointers(screen, (unsigned) MaxRows(screen)); 4856d522f475Smrg 4857d522f475Smrg memcpy((char *) screen->save_ptr, (char *) screen->visbuf, len); 4858d522f475Smrg memcpy((char *) screen->visbuf, (char *) screen->altbuf, len); 4859d522f475Smrg memcpy((char *) screen->altbuf, (char *) screen->save_ptr, len); 4860d522f475Smrg } 4861d522f475Smrg} 4862d522f475Smrg 4863d522f475Smrgvoid 4864d522f475SmrgVTRun(void) 4865d522f475Smrg{ 4866d522f475Smrg TScreen *screen = TScreenOf(term); 4867d522f475Smrg 4868d522f475Smrg TRACE(("VTRun ...\n")); 4869d522f475Smrg 4870d522f475Smrg if (!screen->Vshow) { 4871d522f475Smrg set_vt_visibility(True); 4872d522f475Smrg } 4873d522f475Smrg update_vttekmode(); 4874d522f475Smrg update_vtshow(); 4875d522f475Smrg update_tekshow(); 4876d522f475Smrg set_vthide_sensitivity(); 4877d522f475Smrg 4878d522f475Smrg if (screen->allbuf == NULL) 4879d522f475Smrg VTallocbuf(); 4880d522f475Smrg 4881d522f475Smrg screen->cursor_state = OFF; 4882d522f475Smrg screen->cursor_set = ON; 4883d522f475Smrg#if OPT_BLINK_CURS 4884d522f475Smrg if (DoStartBlinking(screen)) 4885d522f475Smrg StartBlinking(screen); 4886d522f475Smrg#endif 4887d522f475Smrg 4888d522f475Smrg#if OPT_TEK4014 4889d522f475Smrg if (Tpushb > Tpushback) { 4890d522f475Smrg fillPtyData(screen, VTbuffer, (char *) Tpushback, Tpushb - Tpushback); 4891d522f475Smrg Tpushb = Tpushback; 4892d522f475Smrg } 4893d522f475Smrg#endif 4894d522f475Smrg screen->is_running = True; 4895d522f475Smrg if (!setjmp(VTend)) 4896d522f475Smrg VTparse(term); 4897d522f475Smrg StopBlinking(screen); 4898d522f475Smrg HideCursor(); 4899d522f475Smrg screen->cursor_set = OFF; 4900d522f475Smrg TRACE(("... VTRun\n")); 4901d522f475Smrg} 4902d522f475Smrg 4903d522f475Smrg/*ARGSUSED*/ 4904d522f475Smrgstatic void 4905d522f475SmrgVTExpose(Widget w GCC_UNUSED, 4906d522f475Smrg XEvent * event, 4907d522f475Smrg Region region GCC_UNUSED) 4908d522f475Smrg{ 4909d522f475Smrg#ifdef DEBUG 4910d522f475Smrg if (debug) 4911d522f475Smrg fputs("Expose\n", stderr); 4912d522f475Smrg#endif /* DEBUG */ 4913d522f475Smrg if (event->type == Expose) 4914d522f475Smrg HandleExposure(term, event); 4915d522f475Smrg} 4916d522f475Smrg 4917d522f475Smrgstatic void 4918d522f475SmrgVTGraphicsOrNoExpose(XEvent * event) 4919d522f475Smrg{ 4920d522f475Smrg TScreen *screen = TScreenOf(term); 4921d522f475Smrg if (screen->incopy <= 0) { 4922d522f475Smrg screen->incopy = 1; 4923d522f475Smrg if (screen->scrolls > 0) 4924d522f475Smrg screen->scrolls--; 4925d522f475Smrg } 4926d522f475Smrg if (event->type == GraphicsExpose) 4927d522f475Smrg if (HandleExposure(term, event)) 4928d522f475Smrg screen->cursor_state = OFF; 4929d522f475Smrg if ((event->type == NoExpose) 4930d522f475Smrg || ((XGraphicsExposeEvent *) event)->count == 0) { 4931d522f475Smrg if (screen->incopy <= 0 && screen->scrolls > 0) 4932d522f475Smrg screen->scrolls--; 4933d522f475Smrg if (screen->scrolls) 4934d522f475Smrg screen->incopy = -1; 4935d522f475Smrg else 4936d522f475Smrg screen->incopy = 0; 4937d522f475Smrg } 4938d522f475Smrg} 4939d522f475Smrg 4940d522f475Smrg/*ARGSUSED*/ 4941d522f475Smrgstatic void 4942d522f475SmrgVTNonMaskableEvent(Widget w GCC_UNUSED, 4943d522f475Smrg XtPointer closure GCC_UNUSED, 4944d522f475Smrg XEvent * event, 4945d522f475Smrg Boolean * cont GCC_UNUSED) 4946d522f475Smrg{ 4947d522f475Smrg switch (event->type) { 4948d522f475Smrg case GraphicsExpose: 4949d522f475Smrg case NoExpose: 4950d522f475Smrg VTGraphicsOrNoExpose(event); 4951d522f475Smrg break; 4952d522f475Smrg } 4953d522f475Smrg} 4954d522f475Smrg 4955d522f475Smrgstatic void 4956d522f475SmrgVTResize(Widget w) 4957d522f475Smrg{ 4958d522f475Smrg if (XtIsRealized(w)) { 4959d522f475Smrg XtermWidget xw = (XtermWidget) w; 4960d522f475Smrg ScreenResize(xw, xw->core.width, xw->core.height, &xw->flags); 4961d522f475Smrg } 4962d522f475Smrg} 4963d522f475Smrg 49642eaa94a1Schristos#define okDimension(src,dst) ((src <= 32767) \ 49652eaa94a1Schristos && ((dst = (Dimension) src) == src)) 4966d522f475Smrg 4967d522f475Smrgstatic void 4968d522f475SmrgRequestResize(XtermWidget xw, int rows, int cols, Bool text) 4969d522f475Smrg{ 4970d522f475Smrg TScreen *screen = &xw->screen; 4971d522f475Smrg unsigned long value; 4972d522f475Smrg Dimension replyWidth, replyHeight; 4973d522f475Smrg Dimension askedWidth, askedHeight; 4974d522f475Smrg XtGeometryResult status; 4975d522f475Smrg XWindowAttributes attrs; 4976d522f475Smrg 4977d522f475Smrg TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text)); 4978d522f475Smrg 49792eaa94a1Schristos if ((askedWidth = (Dimension) cols) < cols 49802eaa94a1Schristos || (askedHeight = (Dimension) rows) < rows) 4981d522f475Smrg return; 4982d522f475Smrg 4983d522f475Smrg if (askedHeight == 0 4984d522f475Smrg || askedWidth == 0 4985d522f475Smrg || xw->misc.limit_resize > 0) { 4986d522f475Smrg XGetWindowAttributes(XtDisplay(xw), 4987d522f475Smrg RootWindowOfScreen(XtScreen(xw)), &attrs); 4988d522f475Smrg } 4989d522f475Smrg 4990d522f475Smrg if (text) { 49912eaa94a1Schristos if ((value = (unsigned long) rows) != 0) { 4992d522f475Smrg if (rows < 0) 49932eaa94a1Schristos value = (unsigned long) MaxRows(screen); 49942eaa94a1Schristos value *= (unsigned long) FontHeight(screen); 49952eaa94a1Schristos value += (unsigned long) (2 * screen->border); 4996d522f475Smrg if (!okDimension(value, askedHeight)) 4997d522f475Smrg return; 4998d522f475Smrg } 4999d522f475Smrg 50002eaa94a1Schristos if ((value = (unsigned long) cols) != 0) { 5001d522f475Smrg if (cols < 0) 50022eaa94a1Schristos value = (unsigned long) MaxCols(screen); 50032eaa94a1Schristos value *= (unsigned long) FontWidth(screen); 50042eaa94a1Schristos value += (unsigned long) ((2 * screen->border) 50052eaa94a1Schristos + ScrollbarWidth(screen)); 5006d522f475Smrg if (!okDimension(value, askedWidth)) 5007d522f475Smrg return; 5008d522f475Smrg } 5009d522f475Smrg 5010d522f475Smrg } else { 5011d522f475Smrg if (rows < 0) 5012d522f475Smrg askedHeight = FullHeight(screen); 5013d522f475Smrg if (cols < 0) 5014d522f475Smrg askedWidth = FullWidth(screen); 5015d522f475Smrg } 5016d522f475Smrg 5017d522f475Smrg if (rows == 0) 50182eaa94a1Schristos askedHeight = (Dimension) attrs.height; 5019d522f475Smrg if (cols == 0) 50202eaa94a1Schristos askedWidth = (Dimension) attrs.width; 5021d522f475Smrg 5022d522f475Smrg if (xw->misc.limit_resize > 0) { 50232eaa94a1Schristos Dimension high = (Dimension) (xw->misc.limit_resize * attrs.height); 50242eaa94a1Schristos Dimension wide = (Dimension) (xw->misc.limit_resize * attrs.width); 5025d522f475Smrg if (high < attrs.height) 50262eaa94a1Schristos high = (Dimension) attrs.height; 5027d522f475Smrg if (askedHeight > high) 5028d522f475Smrg askedHeight = high; 5029d522f475Smrg if (wide < attrs.width) 50302eaa94a1Schristos wide = (Dimension) attrs.width; 5031d522f475Smrg if (askedWidth > wide) 5032d522f475Smrg askedWidth = wide; 5033d522f475Smrg } 5034d522f475Smrg#ifndef nothack 5035d522f475Smrg getXtermSizeHints(xw); 5036d522f475Smrg#endif 5037d522f475Smrg 50382eaa94a1Schristos status = REQ_RESIZE((Widget) xw, 50392eaa94a1Schristos askedWidth, askedHeight, 50402eaa94a1Schristos &replyWidth, &replyHeight); 5041d522f475Smrg 5042d522f475Smrg if (status == XtGeometryYes || 5043d522f475Smrg status == XtGeometryDone) { 5044d522f475Smrg ScreenResize(xw, replyWidth, replyHeight, &xw->flags); 5045d522f475Smrg } 5046d522f475Smrg#ifndef nothack 5047d522f475Smrg /* 5048d522f475Smrg * XtMakeResizeRequest() has the undesirable side-effect of clearing 5049d522f475Smrg * the window manager's hints, even on a failed request. This would 5050d522f475Smrg * presumably be fixed if the shell did its own work. 5051d522f475Smrg */ 5052d522f475Smrg if (xw->hints.flags 5053d522f475Smrg && replyHeight 5054d522f475Smrg && replyWidth) { 5055d522f475Smrg xw->hints.height = replyHeight; 5056d522f475Smrg xw->hints.width = replyWidth; 5057d522f475Smrg 5058d522f475Smrg TRACE(("%s@%d -- ", __FILE__, __LINE__)); 5059d522f475Smrg TRACE_HINTS(&xw->hints); 5060d522f475Smrg XSetWMNormalHints(screen->display, VShellWindow, &xw->hints); 5061d522f475Smrg TRACE(("%s@%d -- ", __FILE__, __LINE__)); 5062d522f475Smrg TRACE_WM_HINTS(xw); 5063d522f475Smrg } 5064d522f475Smrg#endif 5065d522f475Smrg 5066d522f475Smrg XSync(screen->display, False); /* synchronize */ 5067d522f475Smrg if (XtAppPending(app_con)) 5068d522f475Smrg xevents(); 5069d522f475Smrg 5070d522f475Smrg TRACE(("...RequestResize done\n")); 5071d522f475Smrg} 5072d522f475Smrg 5073d522f475Smrgstatic String xterm_trans = 5074d522f475Smrg"<ClientMessage>WM_PROTOCOLS: DeleteWindow()\n\ 5075d522f475Smrg <MappingNotify>: KeyboardMapping()\n"; 5076d522f475Smrg 5077d522f475Smrgint 5078d522f475SmrgVTInit(void) 5079d522f475Smrg{ 5080d522f475Smrg TScreen *screen = TScreenOf(term); 5081d522f475Smrg Widget vtparent = SHELL_OF(term); 5082d522f475Smrg 5083d522f475Smrg TRACE(("VTInit {{\n")); 5084d522f475Smrg 5085d522f475Smrg XtRealizeWidget(vtparent); 5086d522f475Smrg XtOverrideTranslations(vtparent, XtParseTranslationTable(xterm_trans)); 5087d522f475Smrg (void) XSetWMProtocols(XtDisplay(vtparent), XtWindow(vtparent), 5088d522f475Smrg &wm_delete_window, 1); 5089d522f475Smrg TRACE_TRANS("shell", vtparent); 5090d522f475Smrg TRACE_TRANS("vt100", (Widget) (term)); 5091d522f475Smrg 5092d522f475Smrg if (screen->allbuf == NULL) 5093d522f475Smrg VTallocbuf(); 5094d522f475Smrg 5095d522f475Smrg TRACE(("...}} VTInit\n")); 5096d522f475Smrg return (1); 5097d522f475Smrg} 5098d522f475Smrg 5099d522f475Smrgstatic void 5100d522f475SmrgVTallocbuf(void) 5101d522f475Smrg{ 5102d522f475Smrg TScreen *screen = TScreenOf(term); 5103d522f475Smrg int nrows = MaxRows(screen); 5104d522f475Smrg 5105d522f475Smrg /* allocate screen buffer now, if necessary. */ 5106d522f475Smrg if (screen->scrollWidget) 5107d522f475Smrg nrows += screen->savelines; 5108d522f475Smrg screen->allbuf = Allocate(nrows, MaxCols(screen), 5109d522f475Smrg &screen->sbuf_address); 5110d522f475Smrg if (screen->scrollWidget) 5111d522f475Smrg screen->visbuf = &screen->allbuf[MAX_PTRS * screen->savelines]; 5112d522f475Smrg else 5113d522f475Smrg screen->visbuf = screen->allbuf; 5114d522f475Smrg return; 5115d522f475Smrg} 5116d522f475Smrg 5117d522f475Smrgstatic void 5118d522f475SmrgVTClassInit(void) 5119d522f475Smrg{ 5120d522f475Smrg XtAddConverter(XtRString, XtRGravity, XmuCvtStringToGravity, 5121d522f475Smrg (XtConvertArgList) NULL, (Cardinal) 0); 5122d522f475Smrg} 5123d522f475Smrg 5124d522f475Smrg/* 5125d522f475Smrg * The whole wnew->screen struct is zeroed in VTInitialize. Use these macros 5126d522f475Smrg * where applicable for copying the pieces from the request widget into the 5127d522f475Smrg * new widget. We do not have to use them for wnew->misc, but the associated 5128d522f475Smrg * traces are very useful for debugging. 5129d522f475Smrg */ 5130d522f475Smrg#if OPT_TRACE 5131d522f475Smrg#define init_Bres(name) \ 5132d522f475Smrg TRACE(("init " #name " = %s\n", \ 5133d522f475Smrg BtoS(wnew->name = request->name))) 51342eaa94a1Schristos#define init_Dres2(name,i) \ 51352eaa94a1Schristos TRACE(("init " #name "[%d] = %f\n", i, \ 51362eaa94a1Schristos wnew->name[i] = request->name[i])) 5137d522f475Smrg#define init_Ires(name) \ 5138d522f475Smrg TRACE(("init " #name " = %d\n", \ 5139d522f475Smrg wnew->name = request->name)) 5140d522f475Smrg#define init_Sres(name) \ 5141d522f475Smrg TRACE(("init " #name " = \"%s\"\n", \ 5142d522f475Smrg (wnew->name = x_strtrim(request->name)) != NULL \ 5143d522f475Smrg ? wnew->name : "<null>")) 51442eaa94a1Schristos#define init_Sres2(name,i) \ 51452eaa94a1Schristos TRACE(("init " #name "[%d] = \"%s\"\n", i, \ 51462eaa94a1Schristos (wnew->name(i) = x_strtrim(request->name(i))) != NULL \ 51472eaa94a1Schristos ? wnew->name(i) : "<null>")) 5148d522f475Smrg#define init_Tres(offset) \ 5149d522f475Smrg TRACE(("init screen.Tcolors[" #offset "] = %#lx\n", \ 5150d522f475Smrg fill_Tres(wnew, request, offset))) 5151d522f475Smrg#else 51522eaa94a1Schristos#define init_Bres(name) wnew->name = request->name 51532eaa94a1Schristos#define init_Dres2(name,i) wnew->name[i] = request->name[i] 51542eaa94a1Schristos#define init_Ires(name) wnew->name = request->name 51552eaa94a1Schristos#define init_Sres(name) wnew->name = x_strtrim(request->name) 51562eaa94a1Schristos#define init_Sres2(name,i) wnew->name(i) = x_strtrim(request->name(i)) 51572eaa94a1Schristos#define init_Tres(offset) fill_Tres(wnew, request, offset) 5158d522f475Smrg#endif 5159d522f475Smrg 5160d522f475Smrg#if OPT_COLOR_RES 5161d522f475Smrg/* 5162d522f475Smrg * Override the use of XtDefaultForeground/XtDefaultBackground to make some 5163d522f475Smrg * colors, such as cursor color, use the actual foreground/background value 5164d522f475Smrg * if there is no explicit resource value used. 5165d522f475Smrg */ 5166d522f475Smrgstatic Pixel 5167d522f475Smrgfill_Tres(XtermWidget target, XtermWidget source, int offset) 5168d522f475Smrg{ 5169d522f475Smrg char *name; 5170d522f475Smrg ScrnColors temp; 5171d522f475Smrg 5172d522f475Smrg target->screen.Tcolors[offset] = source->screen.Tcolors[offset]; 5173d522f475Smrg target->screen.Tcolors[offset].mode = False; 5174d522f475Smrg 5175d522f475Smrg if ((name = x_strtrim(target->screen.Tcolors[offset].resource)) != 0) 5176d522f475Smrg target->screen.Tcolors[offset].resource = name; 5177d522f475Smrg 5178d522f475Smrg if (name == 0) { 5179d522f475Smrg target->screen.Tcolors[offset].value = target->dft_foreground; 5180d522f475Smrg } else if (isDefaultForeground(name)) { 5181d522f475Smrg target->screen.Tcolors[offset].value = 5182d522f475Smrg ((offset == TEXT_FG || offset == TEXT_BG) 5183d522f475Smrg ? target->dft_foreground 5184d522f475Smrg : target->screen.Tcolors[TEXT_FG].value); 5185d522f475Smrg } else if (isDefaultBackground(name)) { 5186d522f475Smrg target->screen.Tcolors[offset].value = 5187d522f475Smrg ((offset == TEXT_FG || offset == TEXT_BG) 5188d522f475Smrg ? target->dft_background 5189d522f475Smrg : target->screen.Tcolors[TEXT_BG].value); 5190d522f475Smrg } else { 5191d522f475Smrg memset(&temp, 0, sizeof(temp)); 5192d522f475Smrg if (AllocateTermColor(target, &temp, offset, name)) { 5193d522f475Smrg if (COLOR_DEFINED(&(temp), offset)) 5194d522f475Smrg free(temp.names[offset]); 5195d522f475Smrg target->screen.Tcolors[offset].value = temp.colors[offset]; 5196d522f475Smrg } 5197d522f475Smrg } 5198d522f475Smrg return target->screen.Tcolors[offset].value; 5199d522f475Smrg} 5200d522f475Smrg#else 5201d522f475Smrg#define fill_Tres(target, source, offset) \ 5202d522f475Smrg target->screen.Tcolors[offset] = source->screen.Tcolors[offset] 5203d522f475Smrg#endif 5204d522f475Smrg 5205d522f475Smrg#if OPT_WIDE_CHARS 5206d522f475Smrgstatic void 5207d522f475SmrgVTInitialize_locale(XtermWidget request) 5208d522f475Smrg{ 5209d522f475Smrg Bool is_utf8 = xtermEnvUTF8(); 5210d522f475Smrg 5211d522f475Smrg TRACE(("VTInitialize_locale\n")); 5212d522f475Smrg TRACE(("... request screen.utf8_mode = %d\n", request->screen.utf8_mode)); 5213d522f475Smrg 5214d522f475Smrg if (request->screen.utf8_mode < 0) 5215d522f475Smrg request->screen.utf8_mode = uFalse; 5216d522f475Smrg 5217d522f475Smrg if (request->screen.utf8_mode > 3) 5218d522f475Smrg request->screen.utf8_mode = uDefault; 5219d522f475Smrg 5220d522f475Smrg request->screen.latin9_mode = 0; 5221d522f475Smrg request->screen.unicode_font = 0; 5222d522f475Smrg#if OPT_LUIT_PROG 5223d522f475Smrg request->misc.callfilter = 0; 5224d522f475Smrg request->misc.use_encoding = 0; 5225d522f475Smrg 5226d522f475Smrg TRACE(("... setup for luit:\n")); 5227d522f475Smrg TRACE(("... request misc.locale_str = \"%s\"\n", request->misc.locale_str)); 5228d522f475Smrg 5229d522f475Smrg if (request->screen.utf8_mode == uFalse) { 5230d522f475Smrg TRACE(("... command-line +u8 overrides\n")); 5231d522f475Smrg } else 5232d522f475Smrg#if OPT_MINI_LUIT 5233d522f475Smrg if (x_strcasecmp(request->misc.locale_str, "CHECKFONT") == 0) { 5234d522f475Smrg int fl = (request->misc.default_font.f_n 52352eaa94a1Schristos ? (int) strlen(request->misc.default_font.f_n) 5236d522f475Smrg : 0); 5237d522f475Smrg if (fl > 11 5238d522f475Smrg && x_strcasecmp(request->misc.default_font.f_n + fl - 11, 5239d522f475Smrg "-ISO10646-1") == 0) { 5240d522f475Smrg request->screen.unicode_font = 1; 5241d522f475Smrg /* unicode font, use True */ 5242d522f475Smrg#ifdef HAVE_LANGINFO_CODESET 5243d522f475Smrg if (!strcmp(xtermEnvEncoding(), "ANSI_X3.4-1968") 5244d522f475Smrg || !strcmp(xtermEnvEncoding(), "ISO-8859-1")) { 5245d522f475Smrg if (request->screen.utf8_mode == uDefault) 5246d522f475Smrg request->screen.utf8_mode = uFalse; 5247d522f475Smrg } else if (!strcmp(xtermEnvEncoding(), "ISO-8859-15")) { 5248d522f475Smrg if (request->screen.utf8_mode == uDefault) 5249d522f475Smrg request->screen.utf8_mode = uFalse; 5250d522f475Smrg request->screen.latin9_mode = 1; 5251d522f475Smrg } else { 52522eaa94a1Schristos request->misc.callfilter = (Boolean) (is_utf8 ? 0 : 1); 5253d522f475Smrg request->screen.utf8_mode = uAlways; 5254d522f475Smrg } 5255d522f475Smrg#else 5256d522f475Smrg request->misc.callfilter = is_utf8 ? 0 : 1; 5257d522f475Smrg request->screen.utf8_mode = uAlways; 5258d522f475Smrg#endif 5259d522f475Smrg } else { 5260d522f475Smrg /* other encoding, use False */ 5261d522f475Smrg if (request->screen.utf8_mode == uDefault) { 5262d522f475Smrg request->screen.utf8_mode = is_utf8 ? uAlways : uFalse; 5263d522f475Smrg } 5264d522f475Smrg } 5265d522f475Smrg } else 5266d522f475Smrg#endif /* OPT_MINI_LUIT */ 5267d522f475Smrg if (x_strcasecmp(request->misc.locale_str, "TRUE") == 0 || 5268d522f475Smrg x_strcasecmp(request->misc.locale_str, "ON") == 0 || 5269d522f475Smrg x_strcasecmp(request->misc.locale_str, "YES") == 0 || 5270d522f475Smrg x_strcasecmp(request->misc.locale_str, "AUTO") == 0 || 5271d522f475Smrg strcmp(request->misc.locale_str, "1") == 0) { 5272d522f475Smrg /* when true ... fully obeying LC_CTYPE locale */ 52732eaa94a1Schristos request->misc.callfilter = (Boolean) (is_utf8 ? 0 : 1); 5274d522f475Smrg request->screen.utf8_mode = uAlways; 5275d522f475Smrg } else if (x_strcasecmp(request->misc.locale_str, "FALSE") == 0 || 5276d522f475Smrg x_strcasecmp(request->misc.locale_str, "OFF") == 0 || 5277d522f475Smrg x_strcasecmp(request->misc.locale_str, "NO") == 0 || 5278d522f475Smrg strcmp(request->misc.locale_str, "0") == 0) { 5279d522f475Smrg /* when false ... original value of utf8_mode is effective */ 5280d522f475Smrg if (request->screen.utf8_mode == uDefault) { 5281d522f475Smrg request->screen.utf8_mode = is_utf8 ? uAlways : uFalse; 5282d522f475Smrg } 5283d522f475Smrg } else if (x_strcasecmp(request->misc.locale_str, "MEDIUM") == 0 || 5284d522f475Smrg x_strcasecmp(request->misc.locale_str, "SEMIAUTO") == 0) { 5285d522f475Smrg /* when medium ... obeying locale only for UTF-8 and Asian */ 5286d522f475Smrg if (is_utf8) { 5287d522f475Smrg request->screen.utf8_mode = uAlways; 5288d522f475Smrg } else if ( 5289d522f475Smrg#ifdef MB_CUR_MAX 5290d522f475Smrg MB_CUR_MAX > 1 || 5291d522f475Smrg#else 5292d522f475Smrg !strncmp(xtermEnvLocale(), "ja", 2) || 5293d522f475Smrg !strncmp(xtermEnvLocale(), "ko", 2) || 5294d522f475Smrg !strncmp(xtermEnvLocale(), "zh", 2) || 5295d522f475Smrg#endif 5296d522f475Smrg !strncmp(xtermEnvLocale(), "th", 2) || 5297d522f475Smrg !strncmp(xtermEnvLocale(), "vi", 2)) { 5298d522f475Smrg request->misc.callfilter = 1; 5299d522f475Smrg request->screen.utf8_mode = uAlways; 5300d522f475Smrg } else { 5301d522f475Smrg request->screen.utf8_mode = uFalse; 5302d522f475Smrg } 5303d522f475Smrg } else if (x_strcasecmp(request->misc.locale_str, "UTF-8") == 0 || 5304d522f475Smrg x_strcasecmp(request->misc.locale_str, "UTF8") == 0) { 5305d522f475Smrg /* when UTF-8 ... UTF-8 mode */ 5306d522f475Smrg request->screen.utf8_mode = uAlways; 5307d522f475Smrg } else { 5308d522f475Smrg /* other words are regarded as encoding name passed to luit */ 5309d522f475Smrg request->misc.callfilter = 1; 5310d522f475Smrg request->screen.utf8_mode = uAlways; 5311d522f475Smrg request->misc.use_encoding = 1; 5312d522f475Smrg } 5313d522f475Smrg TRACE(("... updated misc.callfilter = %s\n", BtoS(request->misc.callfilter))); 5314d522f475Smrg TRACE(("... updated misc.use_encoding = %s\n", BtoS(request->misc.use_encoding))); 5315d522f475Smrg#else 5316d522f475Smrg if (request->screen.utf8_mode == uDefault) { 5317d522f475Smrg request->screen.utf8_mode = is_utf8 ? uAlways : uFalse; 5318d522f475Smrg } 5319d522f475Smrg#endif /* OPT_LUIT_PROG */ 5320d522f475Smrg 53212eaa94a1Schristos request->screen.utf8_inparse = (Boolean) (request->screen.utf8_mode != uFalse); 5322d522f475Smrg 5323d522f475Smrg TRACE(("... updated screen.utf8_mode = %d\n", request->screen.utf8_mode)); 5324d522f475Smrg TRACE(("...VTInitialize_locale done\n")); 5325d522f475Smrg} 5326d522f475Smrg#endif 5327d522f475Smrg 5328d522f475Smrgstatic void 5329d522f475SmrgParseOnClicks(XtermWidget wnew, XtermWidget wreq, Cardinal item) 5330d522f475Smrg{ 5331d522f475Smrg /* *INDENT-OFF* */ 5332d522f475Smrg static struct { 5333d522f475Smrg const String name; 5334d522f475Smrg SelectUnit code; 5335d522f475Smrg } table[] = { 5336d522f475Smrg { "char", Select_CHAR }, 5337d522f475Smrg { "word", Select_WORD }, 5338d522f475Smrg { "line", Select_LINE }, 5339d522f475Smrg { "group", Select_GROUP }, 5340d522f475Smrg { "page", Select_PAGE }, 5341d522f475Smrg { "all", Select_ALL }, 5342d522f475Smrg#if OPT_SELECT_REGEX 5343d522f475Smrg { "regex", Select_REGEX }, 5344d522f475Smrg#endif 5345d522f475Smrg }; 5346d522f475Smrg /* *INDENT-ON* */ 5347d522f475Smrg 5348d522f475Smrg String res = wreq->screen.onClick[item]; 5349d522f475Smrg String next = x_skip_nonblanks(res); 5350d522f475Smrg Cardinal n; 5351d522f475Smrg 5352d522f475Smrg wnew->screen.selectMap[item] = NSELECTUNITS; 5353d522f475Smrg for (n = 0; n < XtNumber(table); ++n) { 5354d522f475Smrg if (!x_strncasecmp(table[n].name, res, (unsigned) (next - res))) { 5355d522f475Smrg wnew->screen.selectMap[item] = table[n].code; 5356d522f475Smrg#if OPT_SELECT_REGEX 5357d522f475Smrg if (table[n].code == Select_REGEX) { 5358d522f475Smrg wnew->screen.selectExpr[item] = x_strtrim(next); 5359d522f475Smrg TRACE(("Parsed regex \"%s\"\n", wnew->screen.selectExpr[item])); 5360d522f475Smrg } 5361d522f475Smrg#endif 5362d522f475Smrg break; 5363d522f475Smrg } 5364d522f475Smrg } 5365d522f475Smrg} 5366d522f475Smrg 5367d522f475Smrg/* ARGSUSED */ 5368d522f475Smrgstatic void 5369d522f475SmrgVTInitialize(Widget wrequest, 5370d522f475Smrg Widget new_arg, 5371d522f475Smrg ArgList args GCC_UNUSED, 5372d522f475Smrg Cardinal *num_args GCC_UNUSED) 5373d522f475Smrg{ 5374d522f475Smrg#define Kolor(name) wnew->screen.name.resource 5375d522f475Smrg#define TxtFg(name) !x_strcasecmp(Kolor(Tcolors[TEXT_FG]), Kolor(name)) 5376d522f475Smrg#define TxtBg(name) !x_strcasecmp(Kolor(Tcolors[TEXT_BG]), Kolor(name)) 5377d522f475Smrg#define DftFg(name) isDefaultForeground(Kolor(name)) 5378d522f475Smrg#define DftBg(name) isDefaultBackground(Kolor(name)) 5379d522f475Smrg 5380d522f475Smrg XtermWidget request = (XtermWidget) wrequest; 5381d522f475Smrg XtermWidget wnew = (XtermWidget) new_arg; 5382d522f475Smrg Widget my_parent = SHELL_OF(wnew); 5383d522f475Smrg int i; 5384d522f475Smrg char *s; 5385d522f475Smrg 5386d522f475Smrg#if OPT_ISO_COLORS 5387d522f475Smrg Bool color_ok; 5388d522f475Smrg#endif 5389d522f475Smrg 5390d522f475Smrg#if OPT_COLOR_RES2 && (MAXCOLORS > MIN_ANSI_COLORS) 5391d522f475Smrg static XtResource fake_resources[] = 5392d522f475Smrg { 5393d522f475Smrg#if OPT_256_COLORS 5394d522f475Smrg# include <256colres.h> 5395d522f475Smrg#elif OPT_88_COLORS 5396d522f475Smrg# include <88colres.h> 5397d522f475Smrg#endif 5398d522f475Smrg }; 5399d522f475Smrg#endif /* OPT_COLOR_RES2 */ 5400d522f475Smrg 5401d522f475Smrg TRACE(("VTInitialize\n")); 5402d522f475Smrg 5403d522f475Smrg /* Zero out the entire "screen" component of "wnew" widget, then do 5404d522f475Smrg * field-by-field assignment of "screen" fields that are named in the 5405d522f475Smrg * resource list. 5406d522f475Smrg */ 5407d522f475Smrg bzero((char *) &wnew->screen, sizeof(wnew->screen)); 5408d522f475Smrg 5409d522f475Smrg /* DESCO Sys#67660 5410d522f475Smrg * Zero out the entire "keyboard" component of "wnew" widget. 5411d522f475Smrg */ 5412d522f475Smrg bzero((char *) &wnew->keyboard, sizeof(wnew->keyboard)); 5413d522f475Smrg 5414d522f475Smrg /* dummy values so that we don't try to Realize the parent shell with height 5415d522f475Smrg * or width of 0, which is illegal in X. The real size is computed in the 5416d522f475Smrg * xtermWidget's Realize proc, but the shell's Realize proc is called first, 5417d522f475Smrg * and must see a valid size. 5418d522f475Smrg */ 5419d522f475Smrg wnew->core.height = wnew->core.width = 1; 5420d522f475Smrg 5421d522f475Smrg /* 5422d522f475Smrg * The definition of -rv now is that it changes the definition of 5423d522f475Smrg * XtDefaultForeground and XtDefaultBackground. So, we no longer 5424d522f475Smrg * need to do anything special. 5425d522f475Smrg */ 5426d522f475Smrg wnew->screen.display = wnew->core.screen->display; 5427d522f475Smrg 5428d522f475Smrg /* 5429d522f475Smrg * We use the default foreground/background colors to compare/check if a 5430d522f475Smrg * color-resource has been set. 5431d522f475Smrg */ 5432d522f475Smrg#define MyBlackPixel(dpy) BlackPixel(dpy,DefaultScreen(dpy)) 5433d522f475Smrg#define MyWhitePixel(dpy) WhitePixel(dpy,DefaultScreen(dpy)) 5434d522f475Smrg 5435d522f475Smrg if (request->misc.re_verse) { 5436d522f475Smrg wnew->dft_foreground = MyWhitePixel(wnew->screen.display); 5437d522f475Smrg wnew->dft_background = MyBlackPixel(wnew->screen.display); 5438d522f475Smrg } else { 5439d522f475Smrg wnew->dft_foreground = MyBlackPixel(wnew->screen.display); 5440d522f475Smrg wnew->dft_background = MyWhitePixel(wnew->screen.display); 5441d522f475Smrg } 5442d522f475Smrg init_Tres(TEXT_FG); 5443d522f475Smrg init_Tres(TEXT_BG); 5444d522f475Smrg 5445d522f475Smrg TRACE(("Color resource initialization:\n")); 5446d522f475Smrg TRACE((" Default foreground %#lx\n", wnew->dft_foreground)); 5447d522f475Smrg TRACE((" Default background %#lx\n", wnew->dft_background)); 5448d522f475Smrg TRACE((" Screen foreground %#lx\n", T_COLOR(&(wnew->screen), TEXT_FG))); 5449d522f475Smrg TRACE((" Screen background %#lx\n", T_COLOR(&(wnew->screen), TEXT_BG))); 5450d522f475Smrg 5451d522f475Smrg wnew->screen.mouse_button = -1; 5452d522f475Smrg wnew->screen.mouse_row = -1; 5453d522f475Smrg wnew->screen.mouse_col = -1; 5454d522f475Smrg 5455d522f475Smrg#if OPT_BOX_CHARS 5456d522f475Smrg init_Bres(screen.force_box_chars); 5457d522f475Smrg init_Bres(screen.force_all_chars); 5458d522f475Smrg#endif 5459d522f475Smrg init_Bres(screen.free_bold_box); 5460d522f475Smrg 5461d522f475Smrg init_Bres(screen.c132); 5462d522f475Smrg init_Bres(screen.curses); 5463d522f475Smrg init_Bres(screen.hp_ll_bc); 5464d522f475Smrg#if OPT_XMC_GLITCH 5465d522f475Smrg init_Ires(screen.xmc_glitch); 5466d522f475Smrg init_Ires(screen.xmc_attributes); 5467d522f475Smrg init_Bres(screen.xmc_inline); 5468d522f475Smrg init_Bres(screen.move_sgr_ok); 5469d522f475Smrg#endif 5470d522f475Smrg#if OPT_BLINK_CURS 5471d522f475Smrg init_Bres(screen.cursor_blink); 5472d522f475Smrg init_Ires(screen.blink_on); 5473d522f475Smrg init_Ires(screen.blink_off); 5474d522f475Smrg wnew->screen.cursor_blink_res = wnew->screen.cursor_blink; 5475d522f475Smrg#endif 54762eaa94a1Schristos init_Bres(screen.cursor_underline); 5477d522f475Smrg#if OPT_BLINK_TEXT 5478d522f475Smrg init_Ires(screen.blink_as_bold); 5479d522f475Smrg#endif 5480d522f475Smrg init_Ires(screen.border); 5481d522f475Smrg init_Bres(screen.jumpscroll); 5482d522f475Smrg init_Bres(screen.old_fkeys); 5483d522f475Smrg init_Bres(screen.delete_is_del); 5484d522f475Smrg wnew->keyboard.type = wnew->screen.old_fkeys 5485d522f475Smrg ? keyboardIsLegacy 5486d522f475Smrg : keyboardIsDefault; 5487d522f475Smrg#ifdef ALLOWLOGGING 5488d522f475Smrg init_Sres(screen.logfile); 5489d522f475Smrg#endif 5490d522f475Smrg init_Bres(screen.bellIsUrgent); 5491d522f475Smrg init_Bres(screen.bellOnReset); 5492d522f475Smrg init_Bres(screen.marginbell); 5493d522f475Smrg init_Bres(screen.multiscroll); 5494d522f475Smrg init_Ires(screen.nmarginbell); 5495d522f475Smrg init_Ires(screen.savelines); 5496d522f475Smrg init_Ires(screen.scrollBarBorder); 5497d522f475Smrg init_Ires(screen.scrolllines); 5498d522f475Smrg init_Bres(screen.scrollttyoutput); 5499d522f475Smrg init_Bres(screen.scrollkey); 5500d522f475Smrg 5501d522f475Smrg init_Sres(screen.term_id); 5502d522f475Smrg for (s = request->screen.term_id; *s; s++) { 5503d522f475Smrg if (!isalpha(CharOf(*s))) 5504d522f475Smrg break; 5505d522f475Smrg } 5506d522f475Smrg wnew->screen.terminal_id = atoi(s); 5507d522f475Smrg if (wnew->screen.terminal_id < MIN_DECID) 5508d522f475Smrg wnew->screen.terminal_id = MIN_DECID; 5509d522f475Smrg if (wnew->screen.terminal_id > MAX_DECID) 5510d522f475Smrg wnew->screen.terminal_id = MAX_DECID; 5511d522f475Smrg TRACE(("term_id '%s' -> terminal_id %d\n", 5512d522f475Smrg wnew->screen.term_id, 5513d522f475Smrg wnew->screen.terminal_id)); 5514d522f475Smrg 5515d522f475Smrg wnew->screen.vtXX_level = (wnew->screen.terminal_id / 100); 5516d522f475Smrg init_Bres(screen.visualbell); 5517d522f475Smrg init_Ires(screen.visualBellDelay); 5518d522f475Smrg init_Bres(screen.poponbell); 5519d522f475Smrg init_Ires(misc.limit_resize); 5520d522f475Smrg#if OPT_NUM_LOCK 5521d522f475Smrg init_Bres(misc.real_NumLock); 5522d522f475Smrg init_Bres(misc.alwaysUseMods); 5523d522f475Smrg wnew->misc.num_lock = 0; 5524d522f475Smrg wnew->misc.alt_mods = 0; 5525d522f475Smrg wnew->misc.meta_mods = 0; 5526d522f475Smrg wnew->misc.other_mods = 0; 5527d522f475Smrg#endif 5528d522f475Smrg#if OPT_SHIFT_FONTS 5529d522f475Smrg init_Bres(misc.shift_fonts); 5530d522f475Smrg#endif 5531d522f475Smrg#if OPT_SUNPC_KBD 5532d522f475Smrg init_Ires(misc.ctrl_fkeys); 5533d522f475Smrg#endif 5534d522f475Smrg#if OPT_TEK4014 5535d522f475Smrg TEK4014_SHOWN(wnew) = False; /* not a resource... */ 5536d522f475Smrg init_Bres(misc.tekInhibit); 5537d522f475Smrg init_Bres(misc.tekSmall); 5538d522f475Smrg init_Bres(misc.TekEmu); 5539d522f475Smrg#endif 5540d522f475Smrg#if OPT_TCAP_QUERY 5541d522f475Smrg wnew->screen.tc_query_code = -1; 5542d522f475Smrg#endif 5543d522f475Smrg wnew->misc.re_verse0 = request->misc.re_verse; 5544d522f475Smrg init_Bres(misc.re_verse); 5545d522f475Smrg init_Ires(screen.multiClickTime); 5546d522f475Smrg init_Ires(screen.bellSuppressTime); 5547d522f475Smrg init_Sres(screen.charClass); 5548d522f475Smrg 5549d522f475Smrg init_Bres(screen.always_highlight); 5550d522f475Smrg init_Bres(screen.brokenSelections); 5551d522f475Smrg init_Bres(screen.cutNewline); 5552d522f475Smrg init_Bres(screen.cutToBeginningOfLine); 5553d522f475Smrg init_Bres(screen.highlight_selection); 5554d522f475Smrg init_Bres(screen.i18nSelections); 5555d522f475Smrg init_Bres(screen.keepSelection); 5556d522f475Smrg init_Bres(screen.selectToClipboard); 5557d522f475Smrg init_Bres(screen.trim_selection); 5558d522f475Smrg 5559d522f475Smrg wnew->screen.pointer_cursor = request->screen.pointer_cursor; 5560d522f475Smrg init_Ires(screen.pointer_mode); 5561d522f475Smrg 5562d522f475Smrg init_Sres(screen.answer_back); 5563d522f475Smrg 5564d522f475Smrg init_Sres(screen.printer_command); 5565d522f475Smrg init_Bres(screen.printer_autoclose); 5566d522f475Smrg init_Bres(screen.printer_extent); 5567d522f475Smrg init_Bres(screen.printer_formfeed); 5568d522f475Smrg init_Ires(screen.printer_controlmode); 5569d522f475Smrg#if OPT_PRINT_COLORS 5570d522f475Smrg init_Ires(screen.print_attributes); 5571d522f475Smrg#endif 5572d522f475Smrg 5573d522f475Smrg init_Sres(screen.keyboard_dialect); 5574d522f475Smrg 5575d522f475Smrg init_Bres(screen.input_eight_bits); 5576d522f475Smrg init_Bres(screen.output_eight_bits); 5577d522f475Smrg init_Bres(screen.control_eight_bits); 5578d522f475Smrg init_Bres(screen.backarrow_key); 5579d522f475Smrg init_Bres(screen.alt_is_not_meta); 5580d522f475Smrg init_Bres(screen.alt_sends_esc); 5581d522f475Smrg init_Bres(screen.meta_sends_esc); 5582d522f475Smrg 5583d522f475Smrg init_Bres(screen.allowSendEvent0); 55842eaa94a1Schristos init_Bres(screen.allowFontOp0); 55852eaa94a1Schristos init_Bres(screen.allowTcapOp0); 5586d522f475Smrg init_Bres(screen.allowTitleOp0); 5587d522f475Smrg init_Bres(screen.allowWindowOp0); 5588d522f475Smrg 5589d522f475Smrg /* make a copy so that editres cannot change the resource after startup */ 5590d522f475Smrg wnew->screen.allowSendEvents = wnew->screen.allowSendEvent0; 55912eaa94a1Schristos wnew->screen.allowFontOps = wnew->screen.allowFontOp0; 55922eaa94a1Schristos wnew->screen.allowTcapOps = wnew->screen.allowTcapOp0; 5593d522f475Smrg wnew->screen.allowTitleOps = wnew->screen.allowTitleOp0; 5594d522f475Smrg wnew->screen.allowWindowOps = wnew->screen.allowWindowOp0; 5595d522f475Smrg 5596d522f475Smrg init_Bres(screen.quiet_grab); 5597d522f475Smrg 5598d522f475Smrg#ifndef NO_ACTIVE_ICON 5599d522f475Smrg wnew->screen.fnt_icon.fs = request->screen.fnt_icon.fs; 5600d522f475Smrg init_Bres(misc.active_icon); 5601d522f475Smrg init_Ires(misc.icon_border_width); 5602d522f475Smrg wnew->misc.icon_border_pixel = request->misc.icon_border_pixel; 5603d522f475Smrg#endif /* NO_ACTIVE_ICON */ 5604d522f475Smrg init_Bres(misc.titeInhibit); 5605d522f475Smrg init_Bres(misc.tiXtraScroll); 5606d522f475Smrg init_Bres(misc.dynamicColors); 5607d522f475Smrg for (i = fontMenu_font1; i <= fontMenu_lastBuiltin; i++) { 56082eaa94a1Schristos init_Sres2(screen.MenuFontName, i); 5609d522f475Smrg } 5610d522f475Smrg wnew->screen.MenuFontName(fontMenu_default) = wnew->misc.default_font.f_n; 5611d522f475Smrg wnew->screen.MenuFontName(fontMenu_fontescape) = NULL; 5612d522f475Smrg wnew->screen.MenuFontName(fontMenu_fontsel) = NULL; 5613d522f475Smrg 5614d522f475Smrg wnew->screen.menu_font_number = fontMenu_default; 5615d522f475Smrg init_Sres(screen.initial_font); 5616d522f475Smrg if (wnew->screen.initial_font != 0) { 5617d522f475Smrg int result = xtermGetFont(wnew->screen.initial_font); 5618d522f475Smrg if (result >= 0) 5619d522f475Smrg wnew->screen.menu_font_number = result; 5620d522f475Smrg } 5621d522f475Smrg#if OPT_BROKEN_OSC 5622d522f475Smrg init_Bres(screen.brokenLinuxOSC); 5623d522f475Smrg#endif 5624d522f475Smrg 5625d522f475Smrg#if OPT_BROKEN_ST 5626d522f475Smrg init_Bres(screen.brokenStringTerm); 5627d522f475Smrg#endif 5628d522f475Smrg 5629d522f475Smrg#if OPT_C1_PRINT 5630d522f475Smrg init_Bres(screen.c1_printable); 5631d522f475Smrg#endif 5632d522f475Smrg 5633d522f475Smrg#if OPT_CLIP_BOLD 5634d522f475Smrg init_Bres(screen.use_clipping); 5635d522f475Smrg#endif 5636d522f475Smrg 5637d522f475Smrg#if OPT_DEC_CHRSET 5638d522f475Smrg init_Bres(screen.font_doublesize); 5639d522f475Smrg init_Ires(screen.cache_doublesize); 5640d522f475Smrg if (wnew->screen.cache_doublesize > NUM_CHRSET) 5641d522f475Smrg wnew->screen.cache_doublesize = NUM_CHRSET; 5642d522f475Smrg if (wnew->screen.cache_doublesize == 0) 5643d522f475Smrg wnew->screen.font_doublesize = False; 5644d522f475Smrg TRACE(("Doublesize%s enabled, up to %d fonts\n", 5645d522f475Smrg wnew->screen.font_doublesize ? "" : " not", 5646d522f475Smrg wnew->screen.cache_doublesize)); 5647d522f475Smrg#endif 5648d522f475Smrg 5649d522f475Smrg#if OPT_WIDE_CHARS 5650d522f475Smrg wnew->num_ptrs = (OFF_CHARS + 1); /* minimum needed for cell */ 5651d522f475Smrg#endif 5652d522f475Smrg#if OPT_ISO_COLORS 5653d522f475Smrg init_Ires(screen.veryBoldColors); 5654d522f475Smrg init_Bres(screen.boldColors); 5655d522f475Smrg init_Bres(screen.colorAttrMode); 5656d522f475Smrg init_Bres(screen.colorBDMode); 5657d522f475Smrg init_Bres(screen.colorBLMode); 5658d522f475Smrg init_Bres(screen.colorMode); 5659d522f475Smrg init_Bres(screen.colorULMode); 5660d522f475Smrg init_Bres(screen.italicULMode); 5661d522f475Smrg init_Bres(screen.colorRVMode); 5662d522f475Smrg 5663d522f475Smrg for (i = 0, color_ok = False; i < MAXCOLORS; i++) { 5664d522f475Smrg 5665d522f475Smrg#if OPT_COLOR_RES2 && (MAXCOLORS > MIN_ANSI_COLORS) 5666d522f475Smrg /* 5667d522f475Smrg * Xt has a hardcoded limit on the maximum number of resources that can 5668d522f475Smrg * be used in a widget. If we configure both luit (which implies 5669d522f475Smrg * wide-characters) and 256-colors, it goes over that limit. Most 5670d522f475Smrg * people would not need a resource-file with 256-colors; the default 5671d522f475Smrg * values in our table are sufficient. In that case, fake the resource 5672d522f475Smrg * setting by copying the default value from the table. The #define's 5673d522f475Smrg * can be overridden to make these true resources. 5674d522f475Smrg */ 5675d522f475Smrg if (i >= MIN_ANSI_COLORS && i < NUM_ANSI_COLORS) { 5676d522f475Smrg wnew->screen.Acolors[i].resource 5677d522f475Smrg = ((char *) fake_resources[i - MIN_ANSI_COLORS].default_addr); 5678d522f475Smrg if (wnew->screen.Acolors[i].resource == 0) 5679d522f475Smrg wnew->screen.Acolors[i].resource = XtDefaultForeground; 5680d522f475Smrg } else 5681d522f475Smrg#endif /* OPT_COLOR_RES2 */ 5682d522f475Smrg wnew->screen.Acolors[i] = request->screen.Acolors[i]; 5683d522f475Smrg 5684d522f475Smrg#if OPT_COLOR_RES 5685d522f475Smrg TRACE(("Acolors[%d] = %s\n", i, wnew->screen.Acolors[i].resource)); 5686d522f475Smrg wnew->screen.Acolors[i].mode = False; 5687d522f475Smrg if (DftFg(Acolors[i])) { 5688d522f475Smrg wnew->screen.Acolors[i].value = T_COLOR(&(wnew->screen), TEXT_FG); 5689d522f475Smrg wnew->screen.Acolors[i].mode = True; 5690d522f475Smrg } else if (DftBg(Acolors[i])) { 5691d522f475Smrg wnew->screen.Acolors[i].value = T_COLOR(&(wnew->screen), TEXT_BG); 5692d522f475Smrg wnew->screen.Acolors[i].mode = True; 5693d522f475Smrg } else { 5694d522f475Smrg color_ok = True; 5695d522f475Smrg } 5696d522f475Smrg#else 5697d522f475Smrg TRACE(("Acolors[%d] = %#lx\n", i, request->screen.Acolors[i])); 5698d522f475Smrg if (wnew->screen.Acolors[i] != wnew->dft_foreground && 5699d522f475Smrg wnew->screen.Acolors[i] != T_COLOR(&(wnew->screen), TEXT_FG) && 5700d522f475Smrg wnew->screen.Acolors[i] != T_COLOR(&(wnew->screen), TEXT_BG)) 5701d522f475Smrg color_ok = True; 5702d522f475Smrg#endif 5703d522f475Smrg } 5704d522f475Smrg 5705d522f475Smrg /* 5706d522f475Smrg * Check if we're trying to use color in a monochrome screen. Disable 5707d522f475Smrg * color in that case, since that would make ANSI colors unusable. A 4-bit 5708d522f475Smrg * or 8-bit display is usable, so we do not have to check for anything more 5709d522f475Smrg * specific. 5710d522f475Smrg */ 5711d522f475Smrg if (color_ok) { 5712d522f475Smrg Display *display = wnew->screen.display; 5713d522f475Smrg XVisualInfo myTemplate, *visInfoPtr; 5714d522f475Smrg int numFound; 5715d522f475Smrg 5716d522f475Smrg myTemplate.visualid = XVisualIDFromVisual(DefaultVisual(display, 5717d522f475Smrg XDefaultScreen(display))); 5718d522f475Smrg visInfoPtr = XGetVisualInfo(display, (long) VisualIDMask, 5719d522f475Smrg &myTemplate, &numFound); 5720d522f475Smrg if (visInfoPtr == 0 5721d522f475Smrg || numFound == 0 5722d522f475Smrg || visInfoPtr->depth <= 1) { 5723d522f475Smrg TRACE(("disabling color since screen is monochrome\n")); 5724d522f475Smrg color_ok = False; 5725d522f475Smrg } else { 5726d522f475Smrg XFree(visInfoPtr); 5727d522f475Smrg } 5728d522f475Smrg } 5729d522f475Smrg 5730d522f475Smrg /* If none of the colors are anything other than the foreground or 5731d522f475Smrg * background, we'll assume this isn't color, no matter what the colorMode 5732d522f475Smrg * resource says. (There doesn't seem to be any good way to determine if 5733d522f475Smrg * the resource lookup failed versus the user having misconfigured this). 5734d522f475Smrg */ 5735d522f475Smrg if (!color_ok) { 5736d522f475Smrg wnew->screen.colorMode = False; 5737d522f475Smrg TRACE(("All colors are foreground or background: disable colorMode\n")); 5738d522f475Smrg } 5739d522f475Smrg wnew->sgr_foreground = -1; 5740d522f475Smrg wnew->sgr_background = -1; 5741d522f475Smrg wnew->sgr_extended = False; 5742d522f475Smrg#endif /* OPT_ISO_COLORS */ 5743d522f475Smrg 5744d522f475Smrg /* 5745d522f475Smrg * Decode the resources that control the behavior on multiple mouse clicks. 5746d522f475Smrg * A single click is always bound to normal character selection, but the 5747d522f475Smrg * other flavors can be changed. 5748d522f475Smrg */ 5749d522f475Smrg for (i = 0; i < NSELECTUNITS; ++i) { 5750d522f475Smrg int ck = (i + 1); 5751d522f475Smrg wnew->screen.maxClicks = ck; 5752d522f475Smrg if (i == Select_CHAR) 5753d522f475Smrg wnew->screen.selectMap[i] = Select_CHAR; 5754d522f475Smrg else if (request->screen.onClick[i] != 0) 5755d522f475Smrg ParseOnClicks(wnew, request, (unsigned) i); 5756d522f475Smrg else if (i <= Select_LINE) 5757d522f475Smrg wnew->screen.selectMap[i] = (SelectUnit) i; 5758d522f475Smrg else 5759d522f475Smrg break; 5760d522f475Smrg TRACE(("on%dClicks %s=%d\n", ck, 5761d522f475Smrg NonNull(request->screen.onClick[i]), 5762d522f475Smrg wnew->screen.selectMap[i])); 5763d522f475Smrg if (wnew->screen.selectMap[i] == NSELECTUNITS) 5764d522f475Smrg break; 5765d522f475Smrg } 5766d522f475Smrg TRACE(("maxClicks %d\n", wnew->screen.maxClicks)); 5767d522f475Smrg 5768d522f475Smrg init_Tres(MOUSE_FG); 5769d522f475Smrg init_Tres(MOUSE_BG); 5770d522f475Smrg init_Tres(TEXT_CURSOR); 5771d522f475Smrg#if OPT_HIGHLIGHT_COLOR 5772d522f475Smrg init_Tres(HIGHLIGHT_BG); 5773d522f475Smrg init_Tres(HIGHLIGHT_FG); 5774d522f475Smrg init_Bres(screen.hilite_reverse); 5775d522f475Smrg init_Bres(screen.hilite_color); 5776d522f475Smrg if (wnew->screen.hilite_color == Maybe) { 5777d522f475Smrg wnew->screen.hilite_color = False; 5778d522f475Smrg#if OPT_COLOR_RES 5779d522f475Smrg /* 5780d522f475Smrg * If the highlight text/background are both set, and if they are 5781d522f475Smrg * not equal to either the text/background or background/text, then 5782d522f475Smrg * set the highlightColorMode automatically. 5783d522f475Smrg */ 5784d522f475Smrg if (!DftFg(Tcolors[HIGHLIGHT_BG]) 5785d522f475Smrg && !DftBg(Tcolors[HIGHLIGHT_FG]) 5786d522f475Smrg && !TxtFg(Tcolors[HIGHLIGHT_BG]) 5787d522f475Smrg && !TxtBg(Tcolors[HIGHLIGHT_FG]) 5788d522f475Smrg && !TxtBg(Tcolors[HIGHLIGHT_BG]) 5789d522f475Smrg && !TxtFg(Tcolors[HIGHLIGHT_FG])) { 5790d522f475Smrg TRACE(("...setting hilite_color automatically\n")); 5791d522f475Smrg wnew->screen.hilite_color = True; 5792d522f475Smrg } 5793d522f475Smrg#endif 5794d522f475Smrg } 5795d522f475Smrg#endif 5796d522f475Smrg 5797d522f475Smrg#if OPT_TEK4014 5798d522f475Smrg /* 5799d522f475Smrg * The Tek4014 window has no separate resources for foreground, background 5800d522f475Smrg * and cursor color. Since xterm always creates the vt100 widget first, we 5801d522f475Smrg * can set the Tektronix colors here. That lets us use escape sequences to 5802d522f475Smrg * set its dynamic colors and get consistent behavior whether or not the 5803d522f475Smrg * window is displayed. 5804d522f475Smrg */ 5805d522f475Smrg T_COLOR(&(wnew->screen), TEK_BG) = T_COLOR(&(wnew->screen), TEXT_BG); 5806d522f475Smrg T_COLOR(&(wnew->screen), TEK_FG) = T_COLOR(&(wnew->screen), TEXT_FG); 5807d522f475Smrg T_COLOR(&(wnew->screen), TEK_CURSOR) = T_COLOR(&(wnew->screen), TEXT_CURSOR); 5808d522f475Smrg#endif 5809d522f475Smrg 5810d522f475Smrg#if OPT_WIDE_CHARS 5811d522f475Smrg VTInitialize_locale(request); 5812d522f475Smrg init_Bres(screen.utf8_latin1); 5813d522f475Smrg init_Bres(screen.utf8_title); 5814d522f475Smrg 5815d522f475Smrg#if OPT_LUIT_PROG 5816d522f475Smrg init_Bres(misc.callfilter); 5817d522f475Smrg init_Bres(misc.use_encoding); 5818d522f475Smrg init_Sres(misc.locale_str); 5819d522f475Smrg init_Sres(misc.localefilter); 5820d522f475Smrg#endif 5821d522f475Smrg 5822d522f475Smrg#if OPT_RENDERFONT 5823d522f475Smrg for (i = 0; i <= fontMenu_lastBuiltin; ++i) { 58242eaa94a1Schristos init_Dres2(misc.face_size, i); 5825d522f475Smrg } 5826d522f475Smrg init_Sres(misc.face_name); 5827d522f475Smrg init_Sres(misc.face_wide_name); 5828d522f475Smrg init_Bres(misc.render_font); 5829d522f475Smrg /* minor tweak to make debug traces consistent: */ 5830d522f475Smrg if (wnew->misc.render_font) { 5831d522f475Smrg if (wnew->misc.face_name == 0) { 5832d522f475Smrg wnew->misc.render_font = False; 5833d522f475Smrg TRACE(("reset render_font since there is no face_name\n")); 5834d522f475Smrg } 5835d522f475Smrg } 5836d522f475Smrg#endif 5837d522f475Smrg 5838d522f475Smrg init_Ires(screen.utf8_inparse); 5839d522f475Smrg init_Ires(screen.utf8_mode); 5840d522f475Smrg init_Ires(screen.max_combining); 5841d522f475Smrg 5842d522f475Smrg if (wnew->screen.max_combining < 0) { 5843d522f475Smrg wnew->screen.max_combining = 0; 5844d522f475Smrg } 5845d522f475Smrg if (wnew->screen.max_combining > 5) { 5846d522f475Smrg wnew->screen.max_combining = 5; 5847d522f475Smrg } 5848d522f475Smrg 5849d522f475Smrg init_Bres(screen.vt100_graphics); 5850d522f475Smrg init_Bres(screen.wide_chars); 5851d522f475Smrg init_Bres(misc.mk_width); 5852d522f475Smrg init_Bres(misc.cjk_width); 5853d522f475Smrg 5854d522f475Smrg init_Ires(misc.mk_samplesize); 5855d522f475Smrg init_Ires(misc.mk_samplepass); 5856d522f475Smrg 5857d522f475Smrg if (wnew->misc.mk_samplesize > 0xffff) 5858d522f475Smrg wnew->misc.mk_samplesize = 0xffff; 5859d522f475Smrg if (wnew->misc.mk_samplesize < 0) 5860d522f475Smrg wnew->misc.mk_samplesize = 0; 5861d522f475Smrg 5862d522f475Smrg if (wnew->misc.mk_samplepass > wnew->misc.mk_samplesize) 5863d522f475Smrg wnew->misc.mk_samplepass = wnew->misc.mk_samplesize; 5864d522f475Smrg if (wnew->misc.mk_samplepass < 0) 5865d522f475Smrg wnew->misc.mk_samplepass = 0; 5866d522f475Smrg 5867d522f475Smrg if (request->screen.utf8_mode) { 5868d522f475Smrg TRACE(("setting wide_chars on\n")); 5869d522f475Smrg wnew->screen.wide_chars = True; 5870d522f475Smrg } else { 5871d522f475Smrg TRACE(("setting utf8_mode to 0\n")); 5872d522f475Smrg wnew->screen.utf8_mode = uFalse; 5873d522f475Smrg } 5874d522f475Smrg TRACE(("initialized UTF-8 mode to %d\n", wnew->screen.utf8_mode)); 5875d522f475Smrg 5876d522f475Smrg#if OPT_MINI_LUIT 5877d522f475Smrg if (request->screen.latin9_mode) { 5878d522f475Smrg wnew->screen.latin9_mode = True; 5879d522f475Smrg } 5880d522f475Smrg if (request->screen.unicode_font) { 5881d522f475Smrg wnew->screen.unicode_font = True; 5882d522f475Smrg } 5883d522f475Smrg TRACE(("initialized Latin9 mode to %d\n", wnew->screen.latin9_mode)); 5884d522f475Smrg TRACE(("initialized unicode_font to %d\n", wnew->screen.unicode_font)); 5885d522f475Smrg#endif 5886d522f475Smrg 5887d522f475Smrg if (wnew->screen.wide_chars != False) 5888d522f475Smrg wnew->num_ptrs = OFF_FINAL + (wnew->screen.max_combining * 2); 5889d522f475Smrg 5890d522f475Smrg decode_wcwidth((wnew->misc.cjk_width ? 2 : 0) 5891d522f475Smrg + (wnew->misc.mk_width ? 1 : 0) 5892d522f475Smrg + 1, 5893d522f475Smrg wnew->misc.mk_samplesize, 5894d522f475Smrg wnew->misc.mk_samplepass); 5895d522f475Smrg#endif /* OPT_WIDE_CHARS */ 5896d522f475Smrg 5897d522f475Smrg init_Bres(screen.always_bold_mode); 5898d522f475Smrg init_Bres(screen.bold_mode); 5899d522f475Smrg init_Bres(screen.underline); 5900d522f475Smrg 5901d522f475Smrg wnew->cur_foreground = 0; 5902d522f475Smrg wnew->cur_background = 0; 5903d522f475Smrg 5904d522f475Smrg wnew->keyboard.flags = MODE_SRM; 5905d522f475Smrg if (wnew->screen.backarrow_key) 5906d522f475Smrg wnew->keyboard.flags |= MODE_DECBKM; 5907d522f475Smrg TRACE(("initialized DECBKM %s\n", 5908d522f475Smrg BtoS(wnew->keyboard.flags & MODE_DECBKM))); 5909d522f475Smrg 5910d522f475Smrg /* look for focus related events on the shell, because we need 5911d522f475Smrg * to care about the shell's border being part of our focus. 5912d522f475Smrg */ 5913d522f475Smrg XtAddEventHandler(my_parent, EnterWindowMask, False, 5914d522f475Smrg HandleEnterWindow, (Opaque) NULL); 5915d522f475Smrg XtAddEventHandler(my_parent, LeaveWindowMask, False, 5916d522f475Smrg HandleLeaveWindow, (Opaque) NULL); 5917d522f475Smrg XtAddEventHandler(my_parent, FocusChangeMask, False, 5918d522f475Smrg HandleFocusChange, (Opaque) NULL); 5919d522f475Smrg XtAddEventHandler((Widget) wnew, 0L, True, 5920d522f475Smrg VTNonMaskableEvent, (Opaque) NULL); 5921d522f475Smrg XtAddEventHandler((Widget) wnew, PropertyChangeMask, False, 5922d522f475Smrg HandleBellPropertyChange, (Opaque) NULL); 5923d522f475Smrg 5924d522f475Smrg#if HANDLE_STRUCT_NOTIFY 5925d522f475Smrg#if OPT_TOOLBAR 5926d522f475Smrg wnew->VT100_TB_INFO(menu_bar) = request->VT100_TB_INFO(menu_bar); 5927d522f475Smrg init_Ires(VT100_TB_INFO(menu_height)); 5928d522f475Smrg#else 5929d522f475Smrg /* Flag icon name with "***" on window output when iconified. 5930d522f475Smrg * Put in a handler that will tell us when we get Map/Unmap events. 5931d522f475Smrg */ 5932d522f475Smrg if (resource.zIconBeep) 5933d522f475Smrg#endif 5934d522f475Smrg XtAddEventHandler(my_parent, StructureNotifyMask, False, 5935d522f475Smrg HandleStructNotify, (Opaque) 0); 5936d522f475Smrg#endif /* HANDLE_STRUCT_NOTIFY */ 5937d522f475Smrg 5938d522f475Smrg wnew->screen.bellInProgress = False; 5939d522f475Smrg 5940d522f475Smrg set_character_class(wnew->screen.charClass); 5941d522f475Smrg 5942d522f475Smrg /* create it, but don't realize it */ 5943d522f475Smrg ScrollBarOn(wnew, True, False); 5944d522f475Smrg 5945d522f475Smrg /* make sure that the resize gravity acceptable */ 5946d522f475Smrg if (wnew->misc.resizeGravity != NorthWestGravity && 5947d522f475Smrg wnew->misc.resizeGravity != SouthWestGravity) { 5948d522f475Smrg char value[80]; 5949d522f475Smrg char *temp[2]; 5950d522f475Smrg Cardinal nparams = 1; 5951d522f475Smrg 5952d522f475Smrg sprintf(temp[0] = value, "%d", wnew->misc.resizeGravity); 5953d522f475Smrg temp[1] = 0; 5954d522f475Smrg XtAppWarningMsg(app_con, "rangeError", "resizeGravity", "XTermError", 5955d522f475Smrg "unsupported resizeGravity resource value (%s)", 5956d522f475Smrg temp, &nparams); 5957d522f475Smrg wnew->misc.resizeGravity = SouthWestGravity; 5958d522f475Smrg } 5959d522f475Smrg#ifndef NO_ACTIVE_ICON 5960d522f475Smrg wnew->screen.whichVwin = &wnew->screen.fullVwin; 5961d522f475Smrg#endif /* NO_ACTIVE_ICON */ 5962d522f475Smrg 5963d522f475Smrg if (wnew->screen.savelines < 0) 5964d522f475Smrg wnew->screen.savelines = 0; 5965d522f475Smrg 5966d522f475Smrg init_Bres(screen.awaitInput); 5967d522f475Smrg 5968d522f475Smrg wnew->flags = 0; 5969d522f475Smrg if (!wnew->screen.jumpscroll) 5970d522f475Smrg wnew->flags |= SMOOTHSCROLL; 5971d522f475Smrg if (wnew->misc.reverseWrap) 5972d522f475Smrg wnew->flags |= REVERSEWRAP; 5973d522f475Smrg if (wnew->misc.autoWrap) 5974d522f475Smrg wnew->flags |= WRAPAROUND; 5975d522f475Smrg if (wnew->misc.re_verse != wnew->misc.re_verse0) 5976d522f475Smrg wnew->flags |= REVERSE_VIDEO; 5977d522f475Smrg if (wnew->screen.c132) 5978d522f475Smrg wnew->flags |= IN132COLUMNS; 5979d522f475Smrg 5980d522f475Smrg wnew->initflags = wnew->flags; 5981d522f475Smrg 5982d522f475Smrg#if OPT_MOD_FKEYS 5983d522f475Smrg init_Ires(keyboard.modify_1st.cursor_keys); 5984d522f475Smrg init_Ires(keyboard.modify_1st.function_keys); 5985d522f475Smrg init_Ires(keyboard.modify_1st.keypad_keys); 5986d522f475Smrg init_Ires(keyboard.modify_1st.other_keys); 5987d522f475Smrg init_Ires(keyboard.modify_1st.string_keys); 5988d522f475Smrg init_Ires(keyboard.format_keys); 5989d522f475Smrg wnew->keyboard.modify_now = wnew->keyboard.modify_1st; 5990d522f475Smrg#endif 5991d522f475Smrg 5992d522f475Smrg init_Ires(misc.appcursorDefault); 5993d522f475Smrg if (wnew->misc.appcursorDefault) 5994d522f475Smrg wnew->keyboard.flags |= MODE_DECCKM; 5995d522f475Smrg 5996d522f475Smrg init_Ires(misc.appkeypadDefault); 5997d522f475Smrg if (wnew->misc.appkeypadDefault) 5998d522f475Smrg wnew->keyboard.flags |= MODE_DECKPAM; 5999d522f475Smrg 6000d522f475Smrg return; 6001d522f475Smrg} 6002d522f475Smrg 6003d522f475Smrgvoid 6004d522f475SmrgreleaseCursorGCs(XtermWidget xw) 6005d522f475Smrg{ 6006d522f475Smrg TScreen *screen = &xw->screen; 6007d522f475Smrg VTwin *win = WhichVWin(screen); 6008d522f475Smrg int n; 6009d522f475Smrg 6010d522f475Smrg for_each_curs_gc(n) { 6011d522f475Smrg freeCgs(xw, win, (CgsEnum) n); 6012d522f475Smrg } 6013d522f475Smrg} 6014d522f475Smrg 6015d522f475Smrgvoid 6016d522f475SmrgreleaseWindowGCs(XtermWidget xw, VTwin * win) 6017d522f475Smrg{ 6018d522f475Smrg int n; 6019d522f475Smrg 6020d522f475Smrg for_each_text_gc(n) { 6021d522f475Smrg freeCgs(xw, win, (CgsEnum) n); 6022d522f475Smrg } 6023d522f475Smrg} 6024d522f475Smrg 6025d522f475Smrg#define TRACE_FREE_LEAK(name) \ 6026d522f475Smrg if (name) { \ 6027d522f475Smrg free(name); \ 6028d522f475Smrg name = 0; \ 6029d522f475Smrg TRACE(("freed " #name "\n")); \ 6030d522f475Smrg } 6031d522f475Smrg 6032d522f475Smrg#define FREE_LEAK(name) \ 6033d522f475Smrg if (name) { \ 6034d522f475Smrg free(name); \ 6035d522f475Smrg name = 0; \ 6036d522f475Smrg } 6037d522f475Smrg 6038d522f475Smrg#ifdef NO_LEAKS 6039d522f475Smrg#if OPT_RENDERFONT 6040d522f475Smrgstatic void 6041d522f475SmrgxtermCloseXft(TScreen * screen, XftFont ** pub) 6042d522f475Smrg{ 6043d522f475Smrg if (*pub != 0) { 6044d522f475Smrg XftFontClose(screen->display, *pub); 6045d522f475Smrg *pub = 0; 6046d522f475Smrg } 6047d522f475Smrg} 6048d522f475Smrg#endif 6049d522f475Smrg#endif 6050d522f475Smrg 6051d522f475Smrgstatic void 6052d522f475SmrgVTDestroy(Widget w GCC_UNUSED) 6053d522f475Smrg{ 6054d522f475Smrg#ifdef NO_LEAKS 6055d522f475Smrg XtermWidget xw = (XtermWidget) w; 6056d522f475Smrg TScreen *screen = &xw->screen; 6057d522f475Smrg Cardinal n; 6058d522f475Smrg 6059d522f475Smrg StopBlinking(screen); 6060d522f475Smrg 60612eaa94a1Schristos if (screen->scrollWidget) { 60622eaa94a1Schristos XtUninstallTranslations(screen->scrollWidget); 6063d522f475Smrg XtDestroyWidget(screen->scrollWidget); 60642eaa94a1Schristos } 6065d522f475Smrg 6066d522f475Smrg TRACE_FREE_LEAK(screen->save_ptr); 6067d522f475Smrg TRACE_FREE_LEAK(screen->sbuf_address); 6068d522f475Smrg TRACE_FREE_LEAK(screen->allbuf); 6069d522f475Smrg TRACE_FREE_LEAK(screen->abuf_address); 6070d522f475Smrg TRACE_FREE_LEAK(screen->altbuf); 6071d522f475Smrg TRACE_FREE_LEAK(screen->keyboard_dialect); 6072d522f475Smrg TRACE_FREE_LEAK(screen->term_id); 6073d522f475Smrg#if OPT_WIDE_CHARS 6074d522f475Smrg TRACE_FREE_LEAK(screen->draw_buf); 6075d522f475Smrg#if OPT_LUIT_PROG 6076d522f475Smrg TRACE_FREE_LEAK(xw->misc.locale_str); 6077d522f475Smrg TRACE_FREE_LEAK(xw->misc.localefilter); 6078d522f475Smrg#endif 6079d522f475Smrg#endif 6080d522f475Smrg#if OPT_INPUT_METHOD 6081d522f475Smrg if (screen->xim) { 6082d522f475Smrg XCloseIM(screen->xim); 6083d522f475Smrg TRACE(("freed screen->xim\n")); 6084d522f475Smrg } 6085d522f475Smrg#endif 6086d522f475Smrg releaseCursorGCs(xw); 6087d522f475Smrg releaseWindowGCs(xw, &(screen->fullVwin)); 6088d522f475Smrg#ifndef NO_ACTIVE_ICON 6089d522f475Smrg releaseWindowGCs(xw, &(screen->iconVwin)); 6090d522f475Smrg#endif 60912eaa94a1Schristos XtUninstallTranslations((Widget) xw); 60922eaa94a1Schristos#if OPT_TOOLBAR 60932eaa94a1Schristos XtUninstallTranslations((Widget) XtParent(xw)); 60942eaa94a1Schristos#endif 60952eaa94a1Schristos XtUninstallTranslations((Widget) SHELL_OF(xw)); 6096d522f475Smrg 6097d522f475Smrg if (screen->hidden_cursor) 6098d522f475Smrg XFreeCursor(screen->display, screen->hidden_cursor); 6099d522f475Smrg 6100d522f475Smrg xtermCloseFonts(xw, screen->fnts); 6101d522f475Smrg noleaks_cachedCgs(xw); 6102d522f475Smrg 6103d522f475Smrg#if OPT_RENDERFONT 6104d522f475Smrg for (n = 0; n < NMENUFONTS; ++n) { 6105d522f475Smrg xtermCloseXft(screen, &(screen->renderFontNorm[n])); 6106d522f475Smrg xtermCloseXft(screen, &(screen->renderFontBold[n])); 6107d522f475Smrg xtermCloseXft(screen, &(screen->renderFontItal[n])); 6108d522f475Smrg xtermCloseXft(screen, &(screen->renderWideNorm[n])); 6109d522f475Smrg xtermCloseXft(screen, &(screen->renderWideBold[n])); 6110d522f475Smrg xtermCloseXft(screen, &(screen->renderWideItal[n])); 6111d522f475Smrg } 6112d522f475Smrg#endif 6113d522f475Smrg 6114d522f475Smrg#if 0 /* some strings may be owned by X libraries */ 6115d522f475Smrg for (n = 0; n <= fontMenu_lastBuiltin; ++n) { 6116d522f475Smrg int k; 6117d522f475Smrg for (k = 0; k < fMAX; ++k) { 6118d522f475Smrg char *s = screen->menu_font_names[n][k]; 6119d522f475Smrg if (s != 0) 6120d522f475Smrg free(s); 6121d522f475Smrg } 6122d522f475Smrg } 6123d522f475Smrg#endif 6124d522f475Smrg 6125d522f475Smrg#if OPT_COLOR_RES 6126d522f475Smrg /* free local copies of resource strings */ 6127d522f475Smrg for (n = 0; n < NCOLORS; ++n) { 6128d522f475Smrg FREE_LEAK(screen->Tcolors[n].resource); 6129d522f475Smrg } 6130d522f475Smrg#endif 6131d522f475Smrg#if OPT_SELECT_REGEX 6132d522f475Smrg for (n = 0; n < NSELECTUNITS; ++n) { 6133d522f475Smrg FREE_LEAK(screen->selectExpr[n]); 6134d522f475Smrg } 6135d522f475Smrg#endif 6136d522f475Smrg 6137d522f475Smrg if (screen->selection_atoms) 6138d522f475Smrg XtFree((char *) (screen->selection_atoms)); 6139d522f475Smrg 6140d522f475Smrg XtFree((char *) (screen->selection_data)); 6141d522f475Smrg 6142d522f475Smrg TRACE_FREE_LEAK(xw->keyboard.extra_translations); 6143d522f475Smrg TRACE_FREE_LEAK(xw->keyboard.shell_translations); 6144d522f475Smrg TRACE_FREE_LEAK(xw->keyboard.xterm_translations); 6145d522f475Smrg#endif /* defined(NO_LEAKS) */ 6146d522f475Smrg} 6147d522f475Smrg 6148d522f475Smrg/*ARGSUSED*/ 6149d522f475Smrgstatic void 6150d522f475SmrgVTRealize(Widget w, 6151d522f475Smrg XtValueMask * valuemask, 6152d522f475Smrg XSetWindowAttributes * values) 6153d522f475Smrg{ 6154d522f475Smrg XtermWidget xw = (XtermWidget) w; 6155d522f475Smrg TScreen *screen = &xw->screen; 6156d522f475Smrg 6157d522f475Smrg const VTFontNames *myfont; 6158d522f475Smrg unsigned width, height; 6159d522f475Smrg int xpos, ypos, pr; 6160d522f475Smrg Atom pid_atom; 6161d522f475Smrg int i; 6162d522f475Smrg 6163d522f475Smrg TRACE(("VTRealize\n")); 6164d522f475Smrg 6165d522f475Smrg TabReset(xw->tabs); 6166d522f475Smrg 6167d522f475Smrg if (screen->menu_font_number == fontMenu_default) { 6168d522f475Smrg myfont = &(xw->misc.default_font); 6169d522f475Smrg } else { 6170d522f475Smrg myfont = xtermFontName(screen->MenuFontName(screen->menu_font_number)); 6171d522f475Smrg } 6172d522f475Smrg memset(screen->fnts, 0, sizeof(screen->fnts)); 6173d522f475Smrg 6174d522f475Smrg if (!xtermLoadFont(xw, 6175d522f475Smrg myfont, 6176d522f475Smrg False, 6177d522f475Smrg screen->menu_font_number)) { 6178d522f475Smrg if (XmuCompareISOLatin1(myfont->f_n, DEFFONT) != 0) { 6179d522f475Smrg fprintf(stderr, 6180d522f475Smrg "%s: unable to open font \"%s\", trying \"%s\"....\n", 6181d522f475Smrg xterm_name, myfont->f_n, DEFFONT); 6182d522f475Smrg (void) xtermLoadFont(xw, 6183d522f475Smrg xtermFontName(DEFFONT), 6184d522f475Smrg False, 6185d522f475Smrg screen->menu_font_number); 6186d522f475Smrg screen->MenuFontName(screen->menu_font_number) = DEFFONT; 6187d522f475Smrg } 6188d522f475Smrg } 6189d522f475Smrg 6190d522f475Smrg /* really screwed if we couldn't open default font */ 6191d522f475Smrg if (!screen->fnts[fNorm].fs) { 6192d522f475Smrg fprintf(stderr, "%s: unable to locate a suitable font\n", 6193d522f475Smrg xterm_name); 6194d522f475Smrg Exit(1); 6195d522f475Smrg } 6196d522f475Smrg#if OPT_WIDE_CHARS 6197d522f475Smrg if (xw->screen.utf8_mode) { 6198d522f475Smrg TRACE(("check if this is a wide font, if not try again\n")); 6199d522f475Smrg if (xtermLoadWideFonts(xw, False)) 6200d522f475Smrg SetVTFont(xw, screen->menu_font_number, True, NULL); 6201d522f475Smrg } 6202d522f475Smrg#endif 6203d522f475Smrg 6204d522f475Smrg /* making cursor */ 6205d522f475Smrg if (!screen->pointer_cursor) { 6206d522f475Smrg screen->pointer_cursor = 6207d522f475Smrg make_colored_cursor(XC_xterm, 6208d522f475Smrg T_COLOR(screen, MOUSE_FG), 6209d522f475Smrg T_COLOR(screen, MOUSE_BG)); 6210d522f475Smrg } else { 6211d522f475Smrg recolor_cursor(screen, 6212d522f475Smrg screen->pointer_cursor, 6213d522f475Smrg T_COLOR(screen, MOUSE_FG), 6214d522f475Smrg T_COLOR(screen, MOUSE_BG)); 6215d522f475Smrg } 6216d522f475Smrg 6217d522f475Smrg /* set defaults */ 6218d522f475Smrg xpos = 1; 6219d522f475Smrg ypos = 1; 6220d522f475Smrg width = 80; 6221d522f475Smrg height = 24; 6222d522f475Smrg 6223d522f475Smrg TRACE(("parsing geo_metry %s\n", NonNull(xw->misc.geo_metry))); 6224d522f475Smrg pr = XParseGeometry(xw->misc.geo_metry, &xpos, &ypos, 6225d522f475Smrg &width, &height); 6226d522f475Smrg TRACE(("... position %d,%d size %dx%d\n", ypos, xpos, height, width)); 6227d522f475Smrg 6228d522f475Smrg set_max_col(screen, (int) (width - 1)); /* units in character cells */ 6229d522f475Smrg set_max_row(screen, (int) (height - 1)); /* units in character cells */ 6230d522f475Smrg xtermUpdateFontInfo(xw, False); 6231d522f475Smrg 6232d522f475Smrg width = screen->fullVwin.fullwidth; 6233d522f475Smrg height = screen->fullVwin.fullheight; 6234d522f475Smrg 6235d522f475Smrg TRACE(("... border widget %d parent %d shell %d\n", 6236d522f475Smrg BorderWidth(xw), 6237d522f475Smrg BorderWidth(XtParent(xw)), 6238d522f475Smrg BorderWidth(SHELL_OF(xw)))); 6239d522f475Smrg 6240d522f475Smrg if ((pr & XValue) && (XNegative & pr)) { 62412eaa94a1Schristos xpos += (DisplayWidth(screen->display, DefaultScreen(screen->display)) 62422eaa94a1Schristos - (int) width 62432eaa94a1Schristos - (BorderWidth(XtParent(xw)) * 2)); 6244d522f475Smrg } 6245d522f475Smrg if ((pr & YValue) && (YNegative & pr)) { 62462eaa94a1Schristos ypos += (DisplayHeight(screen->display, DefaultScreen(screen->display)) 62472eaa94a1Schristos - (int) height 62482eaa94a1Schristos - (BorderWidth(XtParent(xw)) * 2)); 6249d522f475Smrg } 6250d522f475Smrg 6251d522f475Smrg /* set up size hints for window manager; min 1 char by 1 char */ 6252d522f475Smrg getXtermSizeHints(xw); 6253d522f475Smrg xtermSizeHints(xw, (xw->misc.scrollbar 6254d522f475Smrg ? (screen->scrollWidget->core.width 6255d522f475Smrg + BorderWidth(screen->scrollWidget)) 6256d522f475Smrg : 0)); 6257d522f475Smrg 6258d522f475Smrg xw->hints.x = xpos; 6259d522f475Smrg xw->hints.y = ypos; 6260d522f475Smrg if ((XValue & pr) || (YValue & pr)) { 6261d522f475Smrg xw->hints.flags |= USSize | USPosition; 6262d522f475Smrg xw->hints.flags |= PWinGravity; 6263d522f475Smrg switch (pr & (XNegative | YNegative)) { 6264d522f475Smrg case 0: 6265d522f475Smrg xw->hints.win_gravity = NorthWestGravity; 6266d522f475Smrg break; 6267d522f475Smrg case XNegative: 6268d522f475Smrg xw->hints.win_gravity = NorthEastGravity; 6269d522f475Smrg break; 6270d522f475Smrg case YNegative: 6271d522f475Smrg xw->hints.win_gravity = SouthWestGravity; 6272d522f475Smrg break; 6273d522f475Smrg default: 6274d522f475Smrg xw->hints.win_gravity = SouthEastGravity; 6275d522f475Smrg break; 6276d522f475Smrg } 6277d522f475Smrg } else { 6278d522f475Smrg /* set a default size, but do *not* set position */ 6279d522f475Smrg xw->hints.flags |= PSize; 6280d522f475Smrg } 6281d522f475Smrg xw->hints.height = xw->hints.base_height 6282d522f475Smrg + xw->hints.height_inc * MaxRows(screen); 6283d522f475Smrg xw->hints.width = xw->hints.base_width 6284d522f475Smrg + xw->hints.width_inc * MaxCols(screen); 6285d522f475Smrg 6286d522f475Smrg if ((WidthValue & pr) || (HeightValue & pr)) 6287d522f475Smrg xw->hints.flags |= USSize; 6288d522f475Smrg else 6289d522f475Smrg xw->hints.flags |= PSize; 6290d522f475Smrg 6291d522f475Smrg /* 6292d522f475Smrg * Note that the size-hints are for the shell, while the resize-request 6293d522f475Smrg * is for the vt100 widget. They are not the same size. 6294d522f475Smrg */ 62952eaa94a1Schristos (void) REQ_RESIZE((Widget) xw, 62962eaa94a1Schristos (Dimension) width, (Dimension) height, 62972eaa94a1Schristos &xw->core.width, &xw->core.height); 6298d522f475Smrg 6299d522f475Smrg /* XXX This is bogus. We are parsing geometries too late. This 6300d522f475Smrg * is information that the shell widget ought to have before we get 6301d522f475Smrg * realized, so that it can do the right thing. 6302d522f475Smrg */ 6303d522f475Smrg if (xw->hints.flags & USPosition) 6304d522f475Smrg XMoveWindow(XtDisplay(xw), XtWindow(SHELL_OF(xw)), 6305d522f475Smrg xw->hints.x, xw->hints.y); 6306d522f475Smrg 6307d522f475Smrg TRACE(("%s@%d -- ", __FILE__, __LINE__)); 6308d522f475Smrg TRACE_HINTS(&xw->hints); 6309d522f475Smrg XSetWMNormalHints(XtDisplay(xw), XtWindow(SHELL_OF(xw)), &xw->hints); 6310d522f475Smrg TRACE(("%s@%d -- ", __FILE__, __LINE__)); 6311d522f475Smrg TRACE_WM_HINTS(xw); 6312d522f475Smrg 6313d522f475Smrg if ((pid_atom = XInternAtom(XtDisplay(xw), "_NET_WM_PID", False)) != None) { 6314d522f475Smrg /* XChangeProperty format 32 really is "long" */ 6315d522f475Smrg unsigned long pid_l = (unsigned long) getpid(); 6316d522f475Smrg TRACE(("Setting _NET_WM_PID property to %lu\n", pid_l)); 6317d522f475Smrg XChangeProperty(XtDisplay(xw), VShellWindow, 6318d522f475Smrg pid_atom, XA_CARDINAL, 32, PropModeReplace, 6319d522f475Smrg (unsigned char *) &pid_l, 1); 6320d522f475Smrg } 6321d522f475Smrg 6322d522f475Smrg XFlush(XtDisplay(xw)); /* get it out to window manager */ 6323d522f475Smrg 6324d522f475Smrg /* use ForgetGravity instead of SouthWestGravity because translating 6325d522f475Smrg the Expose events for ConfigureNotifys is too hard */ 6326d522f475Smrg values->bit_gravity = ((xw->misc.resizeGravity == NorthWestGravity) 6327d522f475Smrg ? NorthWestGravity 6328d522f475Smrg : ForgetGravity); 6329d522f475Smrg xw->screen.fullVwin.window = XtWindow(xw) = 6330d522f475Smrg XCreateWindow(XtDisplay(xw), XtWindow(XtParent(xw)), 6331d522f475Smrg xw->core.x, xw->core.y, 6332d522f475Smrg xw->core.width, xw->core.height, BorderWidth(xw), 6333d522f475Smrg (int) xw->core.depth, 6334d522f475Smrg InputOutput, CopyFromParent, 6335d522f475Smrg *valuemask | CWBitGravity, values); 6336d522f475Smrg screen->event_mask = values->event_mask; 6337d522f475Smrg 6338d522f475Smrg#ifndef NO_ACTIVE_ICON 6339d522f475Smrg if (xw->misc.active_icon && screen->fnt_icon.fs) { 6340d522f475Smrg int iconX = 0, iconY = 0; 6341d522f475Smrg Widget shell = SHELL_OF(xw); 6342d522f475Smrg VTwin *win = &(screen->iconVwin); 6343d522f475Smrg 6344d522f475Smrg TRACE(("Initializing active-icon\n")); 6345d522f475Smrg XtVaGetValues(shell, XtNiconX, &iconX, XtNiconY, &iconY, (XtPointer) 0); 6346d522f475Smrg xtermComputeFontInfo(xw, &(screen->iconVwin), screen->fnt_icon.fs, 0); 6347d522f475Smrg 6348d522f475Smrg /* since only one client is permitted to select for Button 6349d522f475Smrg * events, we have to let the window manager get 'em... 6350d522f475Smrg */ 6351d522f475Smrg values->event_mask &= ~(ButtonPressMask | ButtonReleaseMask); 6352d522f475Smrg values->border_pixel = xw->misc.icon_border_pixel; 6353d522f475Smrg 6354d522f475Smrg screen->iconVwin.window = 6355d522f475Smrg XCreateWindow(XtDisplay(xw), 6356d522f475Smrg RootWindowOfScreen(XtScreen(shell)), 6357d522f475Smrg iconX, iconY, 6358d522f475Smrg screen->iconVwin.fullwidth, 6359d522f475Smrg screen->iconVwin.fullheight, 6360d522f475Smrg xw->misc.icon_border_width, 6361d522f475Smrg (int) xw->core.depth, 6362d522f475Smrg InputOutput, CopyFromParent, 6363d522f475Smrg *valuemask | CWBitGravity | CWBorderPixel, 6364d522f475Smrg values); 6365d522f475Smrg XtVaSetValues(shell, 6366d522f475Smrg XtNiconWindow, screen->iconVwin.window, 6367d522f475Smrg (XtPointer) 0); 6368d522f475Smrg XtRegisterDrawable(XtDisplay(xw), screen->iconVwin.window, w); 6369d522f475Smrg 6370d522f475Smrg setCgsFont(xw, win, gcNorm, &(screen->fnt_icon)); 6371d522f475Smrg setCgsFore(xw, win, gcNorm, T_COLOR(screen, TEXT_FG)); 6372d522f475Smrg setCgsBack(xw, win, gcNorm, T_COLOR(screen, TEXT_BG)); 6373d522f475Smrg 6374d522f475Smrg copyCgs(xw, win, gcBold, gcNorm); 6375d522f475Smrg 6376d522f475Smrg setCgsFont(xw, win, gcNormReverse, &(screen->fnt_icon)); 6377d522f475Smrg setCgsFore(xw, win, gcNormReverse, T_COLOR(screen, TEXT_BG)); 6378d522f475Smrg setCgsBack(xw, win, gcNormReverse, T_COLOR(screen, TEXT_FG)); 6379d522f475Smrg 6380d522f475Smrg copyCgs(xw, win, gcBoldReverse, gcNormReverse); 6381d522f475Smrg 6382d522f475Smrg#if OPT_TOOLBAR 6383d522f475Smrg /* 6384d522f475Smrg * Toolbar is initialized before we get here. Enable the menu item 6385d522f475Smrg * and set it properly. 6386d522f475Smrg */ 6387d522f475Smrg SetItemSensitivity(vtMenuEntries[vtMenu_activeicon].widget, True); 6388d522f475Smrg update_activeicon(); 6389d522f475Smrg#endif 6390d522f475Smrg } else { 6391d522f475Smrg TRACE(("Disabled active-icon\n")); 6392d522f475Smrg xw->misc.active_icon = False; 6393d522f475Smrg } 6394d522f475Smrg#endif /* NO_ACTIVE_ICON */ 6395d522f475Smrg 6396d522f475Smrg#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD 6397d522f475Smrg VTInitI18N(); 6398d522f475Smrg#else 6399d522f475Smrg xw->screen.xic = NULL; 6400d522f475Smrg#endif 6401d522f475Smrg#if OPT_NUM_LOCK 6402d522f475Smrg VTInitModifiers(xw); 6403d522f475Smrg#if OPT_EXTRA_PASTE 6404d522f475Smrg if (xw->keyboard.extra_translations) { 6405d522f475Smrg XtOverrideTranslations((Widget) xw, 6406d522f475Smrg XtParseTranslationTable(xw->keyboard.extra_translations)); 6407d522f475Smrg } 6408d522f475Smrg#endif 6409d522f475Smrg#endif 6410d522f475Smrg 6411d522f475Smrg set_cursor_gcs(xw); 6412d522f475Smrg 6413d522f475Smrg /* Reset variables used by ANSI emulation. */ 6414d522f475Smrg 6415d522f475Smrg resetCharsets(screen); 6416d522f475Smrg 6417d522f475Smrg XDefineCursor(screen->display, VShellWindow, screen->pointer_cursor); 6418d522f475Smrg 6419d522f475Smrg set_cur_col(screen, 0); 6420d522f475Smrg set_cur_row(screen, 0); 6421d522f475Smrg set_max_col(screen, Width(screen) / screen->fullVwin.f_width - 1); 6422d522f475Smrg set_max_row(screen, Height(screen) / screen->fullVwin.f_height - 1); 6423d522f475Smrg set_tb_margins(screen, 0, screen->max_row); 6424d522f475Smrg 6425d522f475Smrg memset(screen->sc, 0, sizeof(screen->sc)); 6426d522f475Smrg 6427d522f475Smrg /* Mark screen buffer as unallocated. We wait until the run loop so 6428d522f475Smrg that the child process does not fork and exec with all the dynamic 6429d522f475Smrg memory it will never use. If we were to do it here, the 6430d522f475Smrg swap space for new process would be huge for huge savelines. */ 6431d522f475Smrg#if OPT_TEK4014 6432d522f475Smrg if (!tekWidget) /* if not called after fork */ 6433d522f475Smrg#endif 6434d522f475Smrg screen->visbuf = screen->allbuf = NULL; 6435d522f475Smrg 64362eaa94a1Schristos screen->do_wrap = False; 6437d522f475Smrg screen->scrolls = screen->incopy = 0; 6438d522f475Smrg xtermSetCursorBox(screen); 6439d522f475Smrg 6440d522f475Smrg screen->savedlines = 0; 6441d522f475Smrg 6442d522f475Smrg for (i = 0; i < 2; ++i) { 64432eaa94a1Schristos screen->alternate = (Boolean) (!screen->alternate); 6444d522f475Smrg CursorSave(xw); 6445d522f475Smrg } 6446d522f475Smrg 6447d522f475Smrg /* 6448d522f475Smrg * Do this last, since it may change the layout via a resize. 6449d522f475Smrg */ 6450d522f475Smrg if (xw->misc.scrollbar) { 6451d522f475Smrg screen->fullVwin.sb_info.width = 0; 6452d522f475Smrg ScrollBarOn(xw, False, True); 6453d522f475Smrg } 6454d522f475Smrg return; 6455d522f475Smrg} 6456d522f475Smrg 6457d522f475Smrg#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD 6458d522f475Smrg 6459d522f475Smrg/* limit this feature to recent XFree86 since X11R6.x core dumps */ 6460d522f475Smrg#if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && defined(X_HAVE_UTF8_STRING) 6461d522f475Smrg#define USE_XIM_INSTANTIATE_CB 6462d522f475Smrg 6463d522f475Smrgstatic void 6464d522f475Smrgxim_instantiate_cb(Display * display, 6465d522f475Smrg XPointer client_data GCC_UNUSED, 6466d522f475Smrg XPointer call_data GCC_UNUSED) 6467d522f475Smrg{ 6468d522f475Smrg if (display != XtDisplay(term)) 6469d522f475Smrg return; 6470d522f475Smrg 6471d522f475Smrg VTInitI18N(); 6472d522f475Smrg} 6473d522f475Smrg 6474d522f475Smrgstatic void 6475d522f475Smrgxim_destroy_cb(XIM im GCC_UNUSED, 6476d522f475Smrg XPointer client_data GCC_UNUSED, 6477d522f475Smrg XPointer call_data GCC_UNUSED) 6478d522f475Smrg{ 6479d522f475Smrg term->screen.xic = NULL; 6480d522f475Smrg 6481d522f475Smrg XRegisterIMInstantiateCallback(XtDisplay(term), NULL, NULL, NULL, 6482d522f475Smrg xim_instantiate_cb, NULL); 6483d522f475Smrg} 6484d522f475Smrg#endif /* X11R6+ */ 6485d522f475Smrg 6486d522f475Smrgstatic void 6487d522f475Smrgxim_real_init(void) 6488d522f475Smrg{ 6489d522f475Smrg unsigned i, j; 6490d522f475Smrg char *p, *s, *t, *ns, *end, buf[32]; 6491d522f475Smrg XIMStyles *xim_styles; 6492d522f475Smrg XIMStyle input_style = 0; 6493d522f475Smrg Bool found; 6494d522f475Smrg static struct { 6495d522f475Smrg char *name; 6496d522f475Smrg unsigned long code; 6497d522f475Smrg } known_style[] = { 6498d522f475Smrg { 6499d522f475Smrg "OverTheSpot", (XIMPreeditPosition | XIMStatusNothing) 6500d522f475Smrg }, 6501d522f475Smrg { 6502d522f475Smrg "OffTheSpot", (XIMPreeditArea | XIMStatusArea) 6503d522f475Smrg }, 6504d522f475Smrg { 6505d522f475Smrg "Root", (XIMPreeditNothing | XIMStatusNothing) 6506d522f475Smrg }, 6507d522f475Smrg }; 6508d522f475Smrg 6509d522f475Smrg term->screen.xic = NULL; 6510d522f475Smrg 6511d522f475Smrg if (term->misc.cannot_im) { 6512d522f475Smrg return; 6513d522f475Smrg } 6514d522f475Smrg 6515d522f475Smrg if (!term->misc.input_method || !*term->misc.input_method) { 6516d522f475Smrg if ((p = XSetLocaleModifiers("")) != NULL && *p) 6517d522f475Smrg term->screen.xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL); 6518d522f475Smrg } else { 6519d522f475Smrg s = term->misc.input_method; 6520d522f475Smrg i = 5 + strlen(s); 6521d522f475Smrg t = (char *) MyStackAlloc(i, buf); 6522d522f475Smrg if (t == NULL) 6523d522f475Smrg SysError(ERROR_VINIT); 6524d522f475Smrg 6525d522f475Smrg for (ns = s; ns && *s;) { 6526d522f475Smrg while (*s && isspace(CharOf(*s))) 6527d522f475Smrg s++; 6528d522f475Smrg if (!*s) 6529d522f475Smrg break; 6530d522f475Smrg if ((ns = end = strchr(s, ',')) == 0) 6531d522f475Smrg end = s + strlen(s); 6532d522f475Smrg while ((end != s) && isspace(CharOf(end[-1]))) 6533d522f475Smrg end--; 6534d522f475Smrg 6535d522f475Smrg if (end != s) { 6536d522f475Smrg strcpy(t, "@im="); 6537d522f475Smrg strncat(t, s, (unsigned) (end - s)); 6538d522f475Smrg 6539d522f475Smrg if ((p = XSetLocaleModifiers(t)) != 0 && *p 6540d522f475Smrg && (term->screen.xim = XOpenIM(XtDisplay(term), 6541d522f475Smrg NULL, 6542d522f475Smrg NULL, 6543d522f475Smrg NULL)) != 0) 6544d522f475Smrg break; 6545d522f475Smrg 6546d522f475Smrg } 6547d522f475Smrg s = ns + 1; 6548d522f475Smrg } 6549d522f475Smrg MyStackFree(t, buf); 6550d522f475Smrg } 6551d522f475Smrg 6552d522f475Smrg if (term->screen.xim == NULL 6553d522f475Smrg && (p = XSetLocaleModifiers("@im=none")) != NULL 6554d522f475Smrg && *p) { 6555d522f475Smrg term->screen.xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL); 6556d522f475Smrg } 6557d522f475Smrg 6558d522f475Smrg if (!term->screen.xim) { 6559d522f475Smrg fprintf(stderr, "Failed to open input method\n"); 6560d522f475Smrg return; 6561d522f475Smrg } 6562d522f475Smrg TRACE(("VTInitI18N opened input method\n")); 6563d522f475Smrg 6564d522f475Smrg if (XGetIMValues(term->screen.xim, XNQueryInputStyle, &xim_styles, NULL) 6565d522f475Smrg || !xim_styles 6566d522f475Smrg || !xim_styles->count_styles) { 6567d522f475Smrg fprintf(stderr, "input method doesn't support any style\n"); 6568d522f475Smrg XCloseIM(term->screen.xim); 6569d522f475Smrg term->misc.cannot_im = True; 6570d522f475Smrg return; 6571d522f475Smrg } 6572d522f475Smrg 6573d522f475Smrg found = False; 6574d522f475Smrg for (s = term->misc.preedit_type; s && !found;) { 6575d522f475Smrg while (*s && isspace(CharOf(*s))) 6576d522f475Smrg s++; 6577d522f475Smrg if (!*s) 6578d522f475Smrg break; 6579d522f475Smrg if ((ns = end = strchr(s, ',')) != 0) 6580d522f475Smrg ns++; 6581d522f475Smrg else 6582d522f475Smrg end = s + strlen(s); 6583d522f475Smrg while ((end != s) && isspace(CharOf(end[-1]))) 6584d522f475Smrg end--; 6585d522f475Smrg 6586d522f475Smrg if (end != s) { /* just in case we have a spurious comma */ 6587d522f475Smrg TRACE(("looking for style '%.*s'\n", end - s, s)); 6588d522f475Smrg for (i = 0; i < XtNumber(known_style); i++) { 6589d522f475Smrg if ((int) strlen(known_style[i].name) == (end - s) 6590d522f475Smrg && !strncmp(s, known_style[i].name, (unsigned) (end - s))) { 6591d522f475Smrg input_style = known_style[i].code; 6592d522f475Smrg for (j = 0; j < xim_styles->count_styles; j++) { 6593d522f475Smrg if (input_style == xim_styles->supported_styles[j]) { 6594d522f475Smrg found = True; 6595d522f475Smrg break; 6596d522f475Smrg } 6597d522f475Smrg } 6598d522f475Smrg if (found) 6599d522f475Smrg break; 6600d522f475Smrg } 6601d522f475Smrg } 6602d522f475Smrg } 6603d522f475Smrg 6604d522f475Smrg s = ns; 6605d522f475Smrg } 6606d522f475Smrg XFree(xim_styles); 6607d522f475Smrg 6608d522f475Smrg if (!found) { 6609d522f475Smrg fprintf(stderr, 6610d522f475Smrg "input method doesn't support my preedit type (%s)\n", 6611d522f475Smrg term->misc.preedit_type); 6612d522f475Smrg XCloseIM(term->screen.xim); 6613d522f475Smrg term->misc.cannot_im = True; 6614d522f475Smrg return; 6615d522f475Smrg } 6616d522f475Smrg 6617d522f475Smrg /* 6618d522f475Smrg * Check for styles we do not yet support. 6619d522f475Smrg */ 6620d522f475Smrg TRACE(("input_style %#lx\n", input_style)); 6621d522f475Smrg if (input_style == (XIMPreeditArea | XIMStatusArea)) { 6622d522f475Smrg fprintf(stderr, 6623d522f475Smrg "This program doesn't support the 'OffTheSpot' preedit type\n"); 6624d522f475Smrg XCloseIM(term->screen.xim); 6625d522f475Smrg term->misc.cannot_im = True; 6626d522f475Smrg return; 6627d522f475Smrg } 6628d522f475Smrg 6629d522f475Smrg /* 6630d522f475Smrg * For XIMPreeditPosition (or OverTheSpot), XIM client has to 6631d522f475Smrg * prepare a font. 6632d522f475Smrg * The font has to be locale-dependent XFontSet, whereas 6633d522f475Smrg * XTerm use Unicode font. This leads a problem that the 6634d522f475Smrg * same font cannot be used for XIM preedit. 6635d522f475Smrg */ 6636d522f475Smrg if (input_style != (XIMPreeditNothing | XIMStatusNothing)) { 6637d522f475Smrg char **missing_charset_list; 6638d522f475Smrg int missing_charset_count; 6639d522f475Smrg char *def_string; 6640d522f475Smrg XVaNestedList p_list; 6641d522f475Smrg XPoint spot = 6642d522f475Smrg {0, 0}; 6643d522f475Smrg XFontStruct **fonts; 6644d522f475Smrg char **font_name_list; 6645d522f475Smrg 6646d522f475Smrg term->screen.fs = XCreateFontSet(XtDisplay(term), 6647d522f475Smrg term->misc.f_x, 6648d522f475Smrg &missing_charset_list, 6649d522f475Smrg &missing_charset_count, 6650d522f475Smrg &def_string); 6651d522f475Smrg if (term->screen.fs == NULL) { 6652d522f475Smrg fprintf(stderr, "Preparation of font set " 6653d522f475Smrg "\"%s\" for XIM failed.\n", term->misc.f_x); 6654d522f475Smrg term->screen.fs = XCreateFontSet(XtDisplay(term), 6655d522f475Smrg DEFXIMFONT, 6656d522f475Smrg &missing_charset_list, 6657d522f475Smrg &missing_charset_count, 6658d522f475Smrg &def_string); 6659d522f475Smrg } 6660d522f475Smrg if (term->screen.fs == NULL) { 6661d522f475Smrg fprintf(stderr, "Preparation of default font set " 6662d522f475Smrg "\"%s\" for XIM failed.\n", DEFXIMFONT); 6663d522f475Smrg XCloseIM(term->screen.xim); 6664d522f475Smrg term->misc.cannot_im = True; 6665d522f475Smrg return; 6666d522f475Smrg } 6667d522f475Smrg (void) XExtentsOfFontSet(term->screen.fs); 66682eaa94a1Schristos j = (unsigned) XFontsOfFontSet(term->screen.fs, &fonts, &font_name_list); 6669d522f475Smrg for (i = 0, term->screen.fs_ascent = 0; i < j; i++) { 6670d522f475Smrg if (term->screen.fs_ascent < (*fonts)->ascent) 6671d522f475Smrg term->screen.fs_ascent = (*fonts)->ascent; 6672d522f475Smrg } 6673d522f475Smrg p_list = XVaCreateNestedList(0, 6674d522f475Smrg XNSpotLocation, &spot, 6675d522f475Smrg XNFontSet, term->screen.fs, 6676d522f475Smrg NULL); 6677d522f475Smrg term->screen.xic = XCreateIC(term->screen.xim, 6678d522f475Smrg XNInputStyle, input_style, 6679d522f475Smrg XNClientWindow, XtWindow(term), 6680d522f475Smrg XNFocusWindow, XtWindow(term), 6681d522f475Smrg XNPreeditAttributes, p_list, 6682d522f475Smrg NULL); 6683d522f475Smrg } else { 6684d522f475Smrg term->screen.xic = XCreateIC(term->screen.xim, XNInputStyle, input_style, 6685d522f475Smrg XNClientWindow, XtWindow(term), 6686d522f475Smrg XNFocusWindow, XtWindow(term), 6687d522f475Smrg NULL); 6688d522f475Smrg } 6689d522f475Smrg 6690d522f475Smrg if (!term->screen.xic) { 6691d522f475Smrg fprintf(stderr, "Failed to create input context\n"); 6692d522f475Smrg XCloseIM(term->screen.xim); 6693d522f475Smrg } 6694d522f475Smrg#if defined(USE_XIM_INSTANTIATE_CB) 6695d522f475Smrg else { 6696d522f475Smrg XIMCallback destroy_cb; 6697d522f475Smrg 6698d522f475Smrg destroy_cb.callback = xim_destroy_cb; 6699d522f475Smrg destroy_cb.client_data = NULL; 6700d522f475Smrg if (XSetIMValues(term->screen.xim, XNDestroyCallback, &destroy_cb, NULL)) 6701d522f475Smrg fprintf(stderr, "Could not set destroy callback to IM\n"); 6702d522f475Smrg } 6703d522f475Smrg#endif 6704d522f475Smrg 6705d522f475Smrg return; 6706d522f475Smrg} 6707d522f475Smrg 6708d522f475Smrgstatic void 6709d522f475SmrgVTInitI18N(void) 6710d522f475Smrg{ 6711d522f475Smrg if (term->misc.open_im) { 6712d522f475Smrg xim_real_init(); 6713d522f475Smrg 6714d522f475Smrg#if defined(USE_XIM_INSTANTIATE_CB) 6715d522f475Smrg if (term->screen.xic == NULL && !term->misc.cannot_im) { 6716d522f475Smrg sleep(3); 6717d522f475Smrg XRegisterIMInstantiateCallback(XtDisplay(term), NULL, NULL, NULL, 6718d522f475Smrg xim_instantiate_cb, NULL); 6719d522f475Smrg } 6720d522f475Smrg#endif 6721d522f475Smrg } 6722d522f475Smrg} 6723d522f475Smrg#endif /* OPT_I18N_SUPPORT && OPT_INPUT_METHOD */ 6724d522f475Smrg 6725d522f475Smrgstatic Boolean 6726d522f475SmrgVTSetValues(Widget cur, 6727d522f475Smrg Widget request GCC_UNUSED, 6728d522f475Smrg Widget wnew, 6729d522f475Smrg ArgList args GCC_UNUSED, 6730d522f475Smrg Cardinal *num_args GCC_UNUSED) 6731d522f475Smrg{ 6732d522f475Smrg XtermWidget curvt = (XtermWidget) cur; 6733d522f475Smrg XtermWidget newvt = (XtermWidget) wnew; 67342eaa94a1Schristos Boolean refresh_needed = False; 67352eaa94a1Schristos Boolean fonts_redone = False; 6736d522f475Smrg 6737d522f475Smrg if ((T_COLOR(&(curvt->screen), TEXT_BG) != 6738d522f475Smrg T_COLOR(&(newvt->screen), TEXT_BG)) || 6739d522f475Smrg (T_COLOR(&(curvt->screen), TEXT_FG) != 6740d522f475Smrg T_COLOR(&(newvt->screen), TEXT_FG)) || 6741d522f475Smrg (curvt->screen.MenuFontName(curvt->screen.menu_font_number) != 6742d522f475Smrg newvt->screen.MenuFontName(newvt->screen.menu_font_number)) || 6743d522f475Smrg (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n)) { 6744d522f475Smrg if (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n) 6745d522f475Smrg newvt->screen.MenuFontName(fontMenu_default) = newvt->misc.default_font.f_n; 6746d522f475Smrg if (xtermLoadFont(newvt, 6747d522f475Smrg xtermFontName(newvt->screen.MenuFontName(curvt->screen.menu_font_number)), 6748d522f475Smrg True, newvt->screen.menu_font_number)) { 6749d522f475Smrg /* resizing does the redisplay, so don't ask for it here */ 6750d522f475Smrg refresh_needed = True; 6751d522f475Smrg fonts_redone = True; 6752d522f475Smrg } else if (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n) 6753d522f475Smrg newvt->screen.MenuFontName(fontMenu_default) = curvt->misc.default_font.f_n; 6754d522f475Smrg } 6755d522f475Smrg if (!fonts_redone 6756d522f475Smrg && (T_COLOR(&(curvt->screen), TEXT_CURSOR) != 6757d522f475Smrg T_COLOR(&(newvt->screen), TEXT_CURSOR))) { 6758d522f475Smrg set_cursor_gcs(newvt); 6759d522f475Smrg refresh_needed = True; 6760d522f475Smrg } 6761d522f475Smrg if (curvt->misc.re_verse != newvt->misc.re_verse) { 6762d522f475Smrg newvt->flags ^= REVERSE_VIDEO; 6763d522f475Smrg ReverseVideo(newvt); 67642eaa94a1Schristos /* ReverseVideo toggles */ 67652eaa94a1Schristos newvt->misc.re_verse = (Boolean) (!newvt->misc.re_verse); 6766d522f475Smrg refresh_needed = True; 6767d522f475Smrg } 6768d522f475Smrg if ((T_COLOR(&(curvt->screen), MOUSE_FG) != 6769d522f475Smrg T_COLOR(&(newvt->screen), MOUSE_FG)) || 6770d522f475Smrg (T_COLOR(&(curvt->screen), MOUSE_BG) != 6771d522f475Smrg T_COLOR(&(newvt->screen), MOUSE_BG))) { 6772d522f475Smrg recolor_cursor(&(newvt->screen), 6773d522f475Smrg newvt->screen.pointer_cursor, 6774d522f475Smrg T_COLOR(&(newvt->screen), MOUSE_FG), 6775d522f475Smrg T_COLOR(&(newvt->screen), MOUSE_BG)); 6776d522f475Smrg refresh_needed = True; 6777d522f475Smrg } 6778d522f475Smrg if (curvt->misc.scrollbar != newvt->misc.scrollbar) { 6779d522f475Smrg ToggleScrollBar(newvt); 6780d522f475Smrg } 6781d522f475Smrg 6782d522f475Smrg return refresh_needed; 6783d522f475Smrg} 6784d522f475Smrg 6785d522f475Smrg#define setGC(code) set_at = __LINE__, currentCgs = code 6786d522f475Smrg 6787d522f475Smrg#define OutsideSelection(screen,srow,scol) \ 6788d522f475Smrg ((srow) > (screen)->endH.row || \ 6789d522f475Smrg ((srow) == (screen)->endH.row && \ 6790d522f475Smrg (scol) >= (screen)->endH.col) || \ 6791d522f475Smrg (srow) < (screen)->startH.row || \ 6792d522f475Smrg ((srow) == (screen)->startH.row && \ 6793d522f475Smrg (scol) < (screen)->startH.col)) 6794d522f475Smrg 6795d522f475Smrg/* 6796d522f475Smrg * Shows cursor at new cursor position in screen. 6797d522f475Smrg */ 6798d522f475Smrgvoid 6799d522f475SmrgShowCursor(void) 6800d522f475Smrg{ 6801d522f475Smrg XtermWidget xw = term; 6802d522f475Smrg TScreen *screen = &xw->screen; 6803d522f475Smrg int x, y; 6804d522f475Smrg Char clo; 6805d522f475Smrg unsigned flags; 6806d522f475Smrg unsigned fg_bg = 0; 6807d522f475Smrg GC currentGC; 6808d522f475Smrg CgsEnum currentCgs = gcMAX; 6809d522f475Smrg VTwin *currentWin = WhichVWin(screen); 6810d522f475Smrg int set_at; 6811d522f475Smrg Bool in_selection; 6812d522f475Smrg Bool reversed; 6813d522f475Smrg Bool filled; 6814d522f475Smrg Pixel fg_pix; 6815d522f475Smrg Pixel bg_pix; 6816d522f475Smrg Pixel tmp; 6817d522f475Smrg#if OPT_HIGHLIGHT_COLOR 6818d522f475Smrg Pixel selbg_pix = T_COLOR(screen, HIGHLIGHT_BG); 6819d522f475Smrg Pixel selfg_pix = T_COLOR(screen, HIGHLIGHT_FG); 6820d522f475Smrg Boolean use_selbg; 6821d522f475Smrg Boolean use_selfg; 6822d522f475Smrg#endif 6823d522f475Smrg#if OPT_WIDE_CHARS 6824d522f475Smrg Char chi = 0; 6825d522f475Smrg int base; 6826d522f475Smrg int off; 6827d522f475Smrg int my_col = 0; 6828d522f475Smrg#endif 6829d522f475Smrg int cursor_col; 6830d522f475Smrg 6831d522f475Smrg if (screen->cursor_state == BLINKED_OFF) 6832d522f475Smrg return; 6833d522f475Smrg 6834d522f475Smrg if (screen->eventMode != NORMAL) 6835d522f475Smrg return; 6836d522f475Smrg 6837d522f475Smrg if (INX2ROW(screen, screen->cur_row) > screen->max_row) 6838d522f475Smrg return; 6839d522f475Smrg 6840d522f475Smrg screen->cursorp.row = screen->cur_row; 6841d522f475Smrg cursor_col = screen->cursorp.col = screen->cur_col; 6842d522f475Smrg screen->cursor_moved = False; 6843d522f475Smrg 6844d522f475Smrg#ifndef NO_ACTIVE_ICON 6845d522f475Smrg if (IsIcon(screen)) { 6846d522f475Smrg screen->cursor_state = ON; 6847d522f475Smrg return; 6848d522f475Smrg } 6849d522f475Smrg#endif /* NO_ACTIVE_ICON */ 6850d522f475Smrg 6851d522f475Smrg#if OPT_WIDE_CHARS 6852d522f475Smrg base = 6853d522f475Smrg#endif 6854d522f475Smrg clo = SCRN_BUF_CHARS(screen, screen->cursorp.row)[cursor_col]; 6855d522f475Smrg 6856d522f475Smrg if_OPT_WIDE_CHARS(screen, { 6857d522f475Smrg chi = SCRN_BUF_WIDEC(screen, screen->cursorp.row)[cursor_col]; 6858d522f475Smrg if (clo == HIDDEN_LO && chi == HIDDEN_HI && cursor_col > 0) { 6859d522f475Smrg /* if cursor points to non-initial part of wide character, 6860d522f475Smrg * back it up 6861d522f475Smrg */ 6862d522f475Smrg --cursor_col; 6863d522f475Smrg clo = SCRN_BUF_CHARS(screen, screen->cursorp.row)[cursor_col]; 6864d522f475Smrg chi = SCRN_BUF_WIDEC(screen, screen->cursorp.row)[cursor_col]; 6865d522f475Smrg } 6866d522f475Smrg my_col = cursor_col; 6867d522f475Smrg base = (chi << 8) | clo; 6868d522f475Smrg if (iswide(base)) 6869d522f475Smrg my_col += 1; 6870d522f475Smrg }); 6871d522f475Smrg 6872d522f475Smrg flags = SCRN_BUF_ATTRS(screen, screen->cursorp.row)[cursor_col]; 6873d522f475Smrg 6874d522f475Smrg if (clo == 0 6875d522f475Smrg#if OPT_WIDE_CHARS 6876d522f475Smrg && chi == 0 6877d522f475Smrg#endif 6878d522f475Smrg ) { 6879d522f475Smrg clo = ' '; 6880d522f475Smrg } 6881d522f475Smrg 6882d522f475Smrg /* 6883d522f475Smrg * If the cursor happens to be on blanks, and the foreground color is set 6884d522f475Smrg * but not the background, do not treat it as a colored cell. 6885d522f475Smrg */ 6886d522f475Smrg#if OPT_ISO_COLORS 6887d522f475Smrg if ((flags & TERM_COLOR_FLAGS(xw)) == BG_COLOR 6888d522f475Smrg#if OPT_WIDE_CHARS 6889d522f475Smrg && chi == 0 6890d522f475Smrg#endif 6891d522f475Smrg && clo == ' ') { 6892d522f475Smrg flags &= ~TERM_COLOR_FLAGS(xw); 6893d522f475Smrg } 6894d522f475Smrg#endif 6895d522f475Smrg 6896d522f475Smrg /* 6897d522f475Smrg * Compare the current cell to the last set of colors used for the 6898d522f475Smrg * cursor and update the GC's if needed. 6899d522f475Smrg */ 6900d522f475Smrg (void) fg_bg; 6901d522f475Smrg if_OPT_EXT_COLORS(screen, { 69022eaa94a1Schristos fg_bg = PACK_FGBG(screen, screen->cursorp.row, cursor_col); 6903d522f475Smrg }); 6904d522f475Smrg if_OPT_ISO_TRADITIONAL_COLORS(screen, { 6905d522f475Smrg fg_bg = SCRN_BUF_COLOR(screen, screen->cursorp.row)[cursor_col]; 6906d522f475Smrg }); 6907d522f475Smrg fg_pix = getXtermForeground(xw, flags, extract_fg(xw, fg_bg, flags)); 6908d522f475Smrg bg_pix = getXtermBackground(xw, flags, extract_bg(xw, fg_bg, flags)); 6909d522f475Smrg 6910d522f475Smrg if (OutsideSelection(screen, screen->cur_row, screen->cur_col)) 6911d522f475Smrg in_selection = False; 6912d522f475Smrg else 6913d522f475Smrg in_selection = True; 6914d522f475Smrg 6915d522f475Smrg reversed = ReverseOrHilite(screen, flags, in_selection); 6916d522f475Smrg 6917d522f475Smrg /* This is like updatedXtermGC(), except that we have to worry about 6918d522f475Smrg * whether the window has focus, since in that case we want just an 6919d522f475Smrg * outline for the cursor. 6920d522f475Smrg */ 69212eaa94a1Schristos filled = (screen->select || screen->always_highlight) && !screen->cursor_underline; 6922d522f475Smrg#if OPT_HIGHLIGHT_COLOR 6923d522f475Smrg use_selbg = isNotForeground(xw, fg_pix, bg_pix, selbg_pix); 6924d522f475Smrg use_selfg = isNotBackground(xw, fg_pix, bg_pix, selfg_pix); 6925d522f475Smrg#endif 6926d522f475Smrg if (filled) { 6927d522f475Smrg if (reversed) { /* text is reverse video */ 6928d522f475Smrg if (getCgsGC(xw, currentWin, gcVTcursNormal)) { 6929d522f475Smrg setGC(gcVTcursNormal); 6930d522f475Smrg } else { 6931d522f475Smrg if (flags & BOLDATTR(screen)) { 6932d522f475Smrg setGC(gcBold); 6933d522f475Smrg } else { 6934d522f475Smrg setGC(gcNorm); 6935d522f475Smrg } 6936d522f475Smrg } 6937d522f475Smrg EXCHANGE(fg_pix, bg_pix, tmp); 6938d522f475Smrg#if OPT_HIGHLIGHT_COLOR 6939d522f475Smrg if (screen->hilite_reverse) { 6940d522f475Smrg if (use_selbg && !use_selfg) 6941d522f475Smrg fg_pix = bg_pix; 6942d522f475Smrg if (use_selfg && !use_selbg) 6943d522f475Smrg bg_pix = fg_pix; 6944d522f475Smrg if (use_selbg) 6945d522f475Smrg bg_pix = selbg_pix; 6946d522f475Smrg if (use_selfg) 6947d522f475Smrg fg_pix = selfg_pix; 6948d522f475Smrg } 6949d522f475Smrg#endif 6950d522f475Smrg } else { /* normal video */ 6951d522f475Smrg if (getCgsGC(xw, currentWin, gcVTcursReverse)) { 6952d522f475Smrg setGC(gcVTcursReverse); 6953d522f475Smrg } else { 6954d522f475Smrg if (flags & BOLDATTR(screen)) { 6955d522f475Smrg setGC(gcBoldReverse); 6956d522f475Smrg } else { 6957d522f475Smrg setGC(gcNormReverse); 6958d522f475Smrg } 6959d522f475Smrg } 6960d522f475Smrg } 6961d522f475Smrg if (T_COLOR(screen, TEXT_CURSOR) == xw->dft_foreground) { 6962d522f475Smrg setCgsBack(xw, currentWin, currentCgs, fg_pix); 6963d522f475Smrg } 6964d522f475Smrg setCgsFore(xw, currentWin, currentCgs, bg_pix); 6965d522f475Smrg } else { /* not selected */ 6966d522f475Smrg if (reversed) { /* text is reverse video */ 6967d522f475Smrg EXCHANGE(fg_pix, bg_pix, tmp); 6968d522f475Smrg setGC(gcNormReverse); 6969d522f475Smrg } else { /* normal video */ 6970d522f475Smrg setGC(gcNorm); 6971d522f475Smrg } 6972d522f475Smrg#if OPT_HIGHLIGHT_COLOR 6973d522f475Smrg if (screen->hilite_reverse) { 6974d522f475Smrg if (in_selection && !reversed) { 6975d522f475Smrg ; /* really INVERSE ... */ 6976d522f475Smrg } else if (in_selection || reversed) { 6977d522f475Smrg if (use_selbg) { 6978d522f475Smrg if (use_selfg) { 6979d522f475Smrg bg_pix = fg_pix; 6980d522f475Smrg } else { 6981d522f475Smrg fg_pix = bg_pix; 6982d522f475Smrg } 6983d522f475Smrg } 6984d522f475Smrg if (use_selbg) { 6985d522f475Smrg bg_pix = selbg_pix; 6986d522f475Smrg } 6987d522f475Smrg if (use_selfg) { 6988d522f475Smrg fg_pix = selfg_pix; 6989d522f475Smrg } 6990d522f475Smrg } 6991d522f475Smrg } else { 6992d522f475Smrg if (in_selection) { 6993d522f475Smrg if (use_selbg) { 6994d522f475Smrg bg_pix = selbg_pix; 6995d522f475Smrg } 6996d522f475Smrg if (use_selfg) { 6997d522f475Smrg fg_pix = selfg_pix; 6998d522f475Smrg } 6999d522f475Smrg } 7000d522f475Smrg } 7001d522f475Smrg#endif 7002d522f475Smrg setCgsFore(xw, currentWin, currentCgs, fg_pix); 7003d522f475Smrg setCgsBack(xw, currentWin, currentCgs, bg_pix); 7004d522f475Smrg } 7005d522f475Smrg 7006d522f475Smrg if (screen->cursor_busy == 0 7007d522f475Smrg && (screen->cursor_state != ON || screen->cursor_GC != set_at)) { 7008d522f475Smrg 7009d522f475Smrg screen->cursor_GC = set_at; 7010d522f475Smrg TRACE(("ShowCursor calling drawXtermText cur(%d,%d) %s\n", 7011d522f475Smrg screen->cur_row, screen->cur_col, 7012d522f475Smrg (filled ? "filled" : "outline"))); 7013d522f475Smrg 7014d522f475Smrg currentGC = getCgsGC(xw, currentWin, currentCgs); 7015d522f475Smrg drawXtermText(xw, flags & DRAWX_MASK, currentGC, 7016d522f475Smrg x = CurCursorX(screen, screen->cur_row, cursor_col), 7017d522f475Smrg y = CursorY(screen, screen->cur_row), 7018d522f475Smrg curXtermChrSet(xw, screen->cur_row), 7019d522f475Smrg PAIRED_CHARS(&clo, &chi), 1, 0); 7020d522f475Smrg 7021d522f475Smrg#if OPT_WIDE_CHARS 7022d522f475Smrg if_OPT_WIDE_CHARS(screen, { 7023d522f475Smrg for (off = OFF_FINAL; off < MAX_PTRS; off += 2) { 7024d522f475Smrg clo = SCREEN_PTR(screen, screen->cursorp.row, off + 0)[my_col]; 7025d522f475Smrg chi = SCREEN_PTR(screen, screen->cursorp.row, off + 1)[my_col]; 7026d522f475Smrg if (!(clo || chi)) 7027d522f475Smrg break; 7028d522f475Smrg drawXtermText(xw, (flags & DRAWX_MASK) | NOBACKGROUND, 7029d522f475Smrg currentGC, x, y, 7030d522f475Smrg curXtermChrSet(xw, screen->cur_row), 7031d522f475Smrg PAIRED_CHARS(&clo, &chi), 1, iswide(base)); 7032d522f475Smrg } 7033d522f475Smrg }); 7034d522f475Smrg#endif 7035d522f475Smrg 7036d522f475Smrg if (!filled) { 7037d522f475Smrg GC outlineGC = getCgsGC(xw, currentWin, gcVTcursOutline); 7038d522f475Smrg if (outlineGC == 0) 7039d522f475Smrg outlineGC = currentGC; 7040d522f475Smrg 70412eaa94a1Schristos screen->box->x = (short) x; 70422eaa94a1Schristos if (!screen->cursor_underline) 70432eaa94a1Schristos screen->box->y = (short) y; 70442eaa94a1Schristos else 70452eaa94a1Schristos screen->box->y = (short) (y + FontHeight(screen) - 2); 7046d522f475Smrg XDrawLines(screen->display, VWindow(screen), outlineGC, 7047d522f475Smrg screen->box, NBOX, CoordModePrevious); 7048d522f475Smrg } 7049d522f475Smrg } 7050d522f475Smrg screen->cursor_state = ON; 7051d522f475Smrg} 7052d522f475Smrg 7053d522f475Smrg/* 7054d522f475Smrg * hide cursor at previous cursor position in screen. 7055d522f475Smrg */ 7056d522f475Smrgvoid 7057d522f475SmrgHideCursor(void) 7058d522f475Smrg{ 7059d522f475Smrg XtermWidget xw = term; 7060d522f475Smrg TScreen *screen = &xw->screen; 7061d522f475Smrg GC currentGC; 7062d522f475Smrg unsigned flags; 7063d522f475Smrg unsigned fg_bg = 0; 7064d522f475Smrg int x, y; 7065d522f475Smrg Char clo; 7066d522f475Smrg Bool in_selection; 7067d522f475Smrg#if OPT_WIDE_CHARS 7068d522f475Smrg Char chi = 0; 7069d522f475Smrg int base; 7070d522f475Smrg int off; 7071d522f475Smrg int my_col = 0; 7072d522f475Smrg#endif 7073d522f475Smrg int cursor_col; 7074d522f475Smrg 7075d522f475Smrg if (screen->cursor_state == OFF) /* FIXME */ 7076d522f475Smrg return; 7077d522f475Smrg if (INX2ROW(screen, screen->cursorp.row) > screen->max_row) 7078d522f475Smrg return; 7079d522f475Smrg 7080d522f475Smrg cursor_col = screen->cursorp.col; 7081d522f475Smrg 7082d522f475Smrg#ifndef NO_ACTIVE_ICON 7083d522f475Smrg if (IsIcon(screen)) { 7084d522f475Smrg screen->cursor_state = OFF; 7085d522f475Smrg return; 7086d522f475Smrg } 7087d522f475Smrg#endif /* NO_ACTIVE_ICON */ 7088d522f475Smrg 7089d522f475Smrg#if OPT_WIDE_CHARS 7090d522f475Smrg base = 7091d522f475Smrg#endif 7092d522f475Smrg clo = SCRN_BUF_CHARS(screen, screen->cursorp.row)[cursor_col]; 7093d522f475Smrg flags = SCRN_BUF_ATTRS(screen, screen->cursorp.row)[cursor_col]; 7094d522f475Smrg 7095d522f475Smrg if_OPT_WIDE_CHARS(screen, { 7096d522f475Smrg chi = SCRN_BUF_WIDEC(screen, screen->cursorp.row)[cursor_col]; 7097d522f475Smrg if (clo == HIDDEN_LO && chi == HIDDEN_HI) { 7098d522f475Smrg /* if cursor points to non-initial part of wide character, 7099d522f475Smrg * back it up 7100d522f475Smrg */ 7101d522f475Smrg --cursor_col; 7102d522f475Smrg clo = SCRN_BUF_CHARS(screen, screen->cursorp.row)[cursor_col]; 7103d522f475Smrg chi = SCRN_BUF_WIDEC(screen, screen->cursorp.row)[cursor_col]; 7104d522f475Smrg } 7105d522f475Smrg my_col = cursor_col; 7106d522f475Smrg base = (chi << 8) | clo; 7107d522f475Smrg if (iswide(base)) 7108d522f475Smrg my_col += 1; 7109d522f475Smrg }); 7110d522f475Smrg 7111d522f475Smrg if_OPT_EXT_COLORS(screen, { 71122eaa94a1Schristos fg_bg = PACK_FGBG(screen, screen->cursorp.row, cursor_col); 7113d522f475Smrg }); 7114d522f475Smrg if_OPT_ISO_TRADITIONAL_COLORS(screen, { 7115d522f475Smrg fg_bg = SCRN_BUF_COLOR(screen, screen->cursorp.row)[cursor_col]; 7116d522f475Smrg }); 7117d522f475Smrg 7118d522f475Smrg if (OutsideSelection(screen, screen->cursorp.row, screen->cursorp.col)) 7119d522f475Smrg in_selection = False; 7120d522f475Smrg else 7121d522f475Smrg in_selection = True; 7122d522f475Smrg 7123d522f475Smrg currentGC = updatedXtermGC(xw, flags, fg_bg, in_selection); 7124d522f475Smrg 7125d522f475Smrg if (clo == 0 7126d522f475Smrg#if OPT_WIDE_CHARS 7127d522f475Smrg && chi == 0 7128d522f475Smrg#endif 7129d522f475Smrg ) { 7130d522f475Smrg clo = ' '; 7131d522f475Smrg } 7132d522f475Smrg 7133d522f475Smrg TRACE(("HideCursor calling drawXtermText cur(%d,%d)\n", 7134d522f475Smrg screen->cursorp.row, screen->cursorp.col)); 7135d522f475Smrg drawXtermText(xw, flags & DRAWX_MASK, currentGC, 7136d522f475Smrg x = CurCursorX(screen, screen->cursorp.row, cursor_col), 7137d522f475Smrg y = CursorY(screen, screen->cursorp.row), 7138d522f475Smrg curXtermChrSet(xw, screen->cursorp.row), 7139d522f475Smrg PAIRED_CHARS(&clo, &chi), 1, 0); 7140d522f475Smrg 7141d522f475Smrg#if OPT_WIDE_CHARS 7142d522f475Smrg if_OPT_WIDE_CHARS(screen, { 7143d522f475Smrg for (off = OFF_FINAL; off < MAX_PTRS; off += 2) { 7144d522f475Smrg clo = SCREEN_PTR(screen, screen->cursorp.row, off + 0)[my_col]; 7145d522f475Smrg chi = SCREEN_PTR(screen, screen->cursorp.row, off + 1)[my_col]; 7146d522f475Smrg if (!(clo || chi)) 7147d522f475Smrg break; 7148d522f475Smrg drawXtermText(xw, (flags & DRAWX_MASK) | NOBACKGROUND, 7149d522f475Smrg currentGC, x, y, 7150d522f475Smrg curXtermChrSet(xw, screen->cur_row), 7151d522f475Smrg PAIRED_CHARS(&clo, &chi), 1, iswide(base)); 7152d522f475Smrg } 7153d522f475Smrg }); 7154d522f475Smrg#endif 7155d522f475Smrg screen->cursor_state = OFF; 7156d522f475Smrg resetXtermGC(xw, flags, in_selection); 7157d522f475Smrg} 7158d522f475Smrg 7159d522f475Smrg#if OPT_BLINK_CURS || OPT_BLINK_TEXT 7160d522f475Smrgstatic void 7161d522f475SmrgStartBlinking(TScreen * screen) 7162d522f475Smrg{ 7163d522f475Smrg if (screen->blink_timer == 0) { 71642eaa94a1Schristos unsigned long interval = (unsigned long) ((screen->cursor_state == ON) 71652eaa94a1Schristos ? screen->blink_on 71662eaa94a1Schristos : screen->blink_off); 7167d522f475Smrg if (interval == 0) /* wow! */ 7168d522f475Smrg interval = 1; /* let's humor him anyway */ 7169d522f475Smrg screen->blink_timer = XtAppAddTimeOut(app_con, 7170d522f475Smrg interval, 7171d522f475Smrg HandleBlinking, 7172d522f475Smrg screen); 7173d522f475Smrg } 7174d522f475Smrg} 7175d522f475Smrg 7176d522f475Smrgstatic void 7177d522f475SmrgStopBlinking(TScreen * screen) 7178d522f475Smrg{ 7179d522f475Smrg if (screen->blink_timer) 7180d522f475Smrg XtRemoveTimeOut(screen->blink_timer); 7181d522f475Smrg screen->blink_timer = 0; 7182d522f475Smrg} 7183d522f475Smrg 7184d522f475Smrg#if OPT_BLINK_TEXT 7185d522f475Smrgstatic Bool 7186d522f475SmrgScrnHasBlinking(TScreen * screen, int row) 7187d522f475Smrg{ 7188d522f475Smrg Char *attrs = SCRN_BUF_ATTRS(screen, row); 7189d522f475Smrg int col; 7190d522f475Smrg Bool result = False; 7191d522f475Smrg 7192d522f475Smrg for (col = 0; col < MaxCols(screen); ++col) { 7193d522f475Smrg if (attrs[col] & BLINK) { 7194d522f475Smrg result = True; 7195d522f475Smrg break; 7196d522f475Smrg } 7197d522f475Smrg } 7198d522f475Smrg return result; 7199d522f475Smrg} 7200d522f475Smrg#endif 7201d522f475Smrg 7202d522f475Smrg/* 7203d522f475Smrg * Blink the cursor by alternately showing/hiding cursor. We leave the timer 7204d522f475Smrg * running all the time (even though that's a little inefficient) to make the 7205d522f475Smrg * logic simple. 7206d522f475Smrg */ 7207d522f475Smrgstatic void 7208d522f475SmrgHandleBlinking(XtPointer closure, XtIntervalId * id GCC_UNUSED) 7209d522f475Smrg{ 7210d522f475Smrg TScreen *screen = (TScreen *) closure; 7211d522f475Smrg Bool resume = False; 7212d522f475Smrg 7213d522f475Smrg screen->blink_timer = 0; 7214d522f475Smrg screen->blink_state = !screen->blink_state; 7215d522f475Smrg 7216d522f475Smrg#if OPT_BLINK_CURS 7217d522f475Smrg if (DoStartBlinking(screen)) { 7218d522f475Smrg if (screen->cursor_state == ON) { 7219d522f475Smrg if (screen->select || screen->always_highlight) { 7220d522f475Smrg HideCursor(); 7221d522f475Smrg if (screen->cursor_state == OFF) 7222d522f475Smrg screen->cursor_state = BLINKED_OFF; 7223d522f475Smrg } 7224d522f475Smrg } else if (screen->cursor_state == BLINKED_OFF) { 7225d522f475Smrg screen->cursor_state = OFF; 7226d522f475Smrg ShowCursor(); 7227d522f475Smrg if (screen->cursor_state == OFF) 7228d522f475Smrg screen->cursor_state = BLINKED_OFF; 7229d522f475Smrg } 7230d522f475Smrg resume = True; 7231d522f475Smrg } 7232d522f475Smrg#endif 7233d522f475Smrg 7234d522f475Smrg#if OPT_BLINK_TEXT 7235d522f475Smrg /* 7236d522f475Smrg * Inspect the line on the current screen to see if any have the BLINK flag 7237d522f475Smrg * associated with them. Prune off any that have had the corresponding 7238d522f475Smrg * cells reset. If any are left, repaint those lines with ScrnRefresh(). 7239d522f475Smrg */ 7240d522f475Smrg if (!(screen->blink_as_bold)) { 7241d522f475Smrg int row; 7242d522f475Smrg int first_row = screen->max_row; 7243d522f475Smrg int last_row = -1; 7244d522f475Smrg 7245d522f475Smrg for (row = screen->max_row; row >= 0; row--) { 7246d522f475Smrg if (ScrnTstBlinked(screen, row)) { 7247d522f475Smrg if (ScrnHasBlinking(screen, row)) { 7248d522f475Smrg resume = True; 7249d522f475Smrg if (row > last_row) 7250d522f475Smrg last_row = row; 7251d522f475Smrg if (row < first_row) 7252d522f475Smrg first_row = row; 7253d522f475Smrg } else { 7254d522f475Smrg ScrnClrBlinked(screen, row); 7255d522f475Smrg } 7256d522f475Smrg } 7257d522f475Smrg } 7258d522f475Smrg /* 7259d522f475Smrg * FIXME: this could be a little more efficient, e.g,. by limiting the 7260d522f475Smrg * columns which are updated. 7261d522f475Smrg */ 7262d522f475Smrg if (first_row <= last_row) { 7263d522f475Smrg ScrnRefresh(term, 7264d522f475Smrg first_row, 7265d522f475Smrg 0, 7266d522f475Smrg last_row + 1 - first_row, 7267d522f475Smrg MaxCols(screen), 7268d522f475Smrg True); 7269d522f475Smrg } 7270d522f475Smrg } 7271d522f475Smrg#endif 7272d522f475Smrg 7273d522f475Smrg /* 7274d522f475Smrg * If either the cursor or text is blinking, restart the timer. 7275d522f475Smrg */ 7276d522f475Smrg if (resume) 7277d522f475Smrg StartBlinking(screen); 7278d522f475Smrg} 7279d522f475Smrg#endif /* OPT_BLINK_CURS || OPT_BLINK_TEXT */ 7280d522f475Smrg 7281d522f475Smrg/* 7282d522f475Smrg * Implement soft or hard (full) reset of the VTxxx emulation. There are a 7283d522f475Smrg * couple of differences from real DEC VTxxx terminals (to avoid breaking 7284d522f475Smrg * applications which have come to rely on xterm doing this): 7285d522f475Smrg * 7286d522f475Smrg * + autowrap mode should be reset (instead it's reset to the resource 7287d522f475Smrg * default). 7288d522f475Smrg * + the popup menu offers a choice of resetting the savedLines, or not. 7289d522f475Smrg * (but the control sequence does this anyway). 7290d522f475Smrg */ 7291d522f475Smrgvoid 7292d522f475SmrgVTReset(XtermWidget xw, Bool full, Bool saved) 7293d522f475Smrg{ 7294d522f475Smrg TScreen *screen = &xw->screen; 7295d522f475Smrg 7296d522f475Smrg if (!XtIsRealized((Widget) xw) || (CURRENT_EMU() != (Widget) xw)) { 7297d522f475Smrg Bell(XkbBI_MinorError, 0); 7298d522f475Smrg return; 7299d522f475Smrg } 7300d522f475Smrg 7301d522f475Smrg if (saved) { 7302d522f475Smrg screen->savedlines = 0; 7303d522f475Smrg ScrollBarDrawThumb(screen->scrollWidget); 7304d522f475Smrg } 7305d522f475Smrg 7306d522f475Smrg /* make cursor visible */ 7307d522f475Smrg screen->cursor_set = ON; 7308d522f475Smrg 7309d522f475Smrg /* reset scrolling region */ 7310d522f475Smrg set_tb_margins(screen, 0, screen->max_row); 7311d522f475Smrg 7312d522f475Smrg bitclr(&xw->flags, ORIGIN); 7313d522f475Smrg 7314d522f475Smrg if_OPT_ISO_COLORS(screen, { 7315d522f475Smrg reset_SGR_Colors(xw); 7316d522f475Smrg }); 7317d522f475Smrg 7318d522f475Smrg /* Reset character-sets to initial state */ 7319d522f475Smrg resetCharsets(screen); 7320d522f475Smrg 7321d522f475Smrg#if OPT_MOD_FKEYS 7322d522f475Smrg /* Reset modifier-resources to initial state */ 7323d522f475Smrg xw->keyboard.modify_now = xw->keyboard.modify_1st; 7324d522f475Smrg#endif 7325d522f475Smrg 7326d522f475Smrg /* Reset DECSCA */ 7327d522f475Smrg bitclr(&xw->flags, PROTECTED); 7328d522f475Smrg screen->protected_mode = OFF_PROTECT; 7329d522f475Smrg 7330d522f475Smrg if (full) { /* RIS */ 7331d522f475Smrg if (screen->bellOnReset) 7332d522f475Smrg Bell(XkbBI_TerminalBell, 0); 7333d522f475Smrg 7334d522f475Smrg /* reset the mouse mode */ 7335d522f475Smrg screen->send_mouse_pos = MOUSE_OFF; 7336d522f475Smrg screen->send_focus_pos = OFF; 7337d522f475Smrg screen->waitingForTrackInfo = False; 7338d522f475Smrg screen->eventMode = NORMAL; 7339d522f475Smrg 7340d522f475Smrg xtermShowPointer(xw, True); 7341d522f475Smrg 7342d522f475Smrg TabReset(xw->tabs); 7343d522f475Smrg xw->keyboard.flags = MODE_SRM; 7344d522f475Smrg#if OPT_INITIAL_ERASE 7345d522f475Smrg if (xw->keyboard.reset_DECBKM == 1) 7346d522f475Smrg xw->keyboard.flags |= MODE_DECBKM; 7347d522f475Smrg else if (xw->keyboard.reset_DECBKM == 2) 7348d522f475Smrg#endif 7349d522f475Smrg if (xw->screen.backarrow_key) 7350d522f475Smrg xw->keyboard.flags |= MODE_DECBKM; 7351d522f475Smrg TRACE(("full reset DECBKM %s\n", 7352d522f475Smrg BtoS(xw->keyboard.flags & MODE_DECBKM))); 7353d522f475Smrg update_appcursor(); 7354d522f475Smrg update_appkeypad(); 7355d522f475Smrg update_decbkm(); 7356d522f475Smrg show_8bit_control(False); 7357d522f475Smrg reset_decudk(); 7358d522f475Smrg 7359d522f475Smrg FromAlternate(xw); 7360d522f475Smrg ClearScreen(xw); 7361d522f475Smrg screen->cursor_state = OFF; 7362d522f475Smrg if (xw->flags & REVERSE_VIDEO) 7363d522f475Smrg ReverseVideo(xw); 7364d522f475Smrg 7365d522f475Smrg xw->flags = xw->initflags; 7366d522f475Smrg update_reversevideo(); 7367d522f475Smrg update_autowrap(); 7368d522f475Smrg update_reversewrap(); 7369d522f475Smrg update_autolinefeed(); 7370d522f475Smrg 73712eaa94a1Schristos screen->jumpscroll = (Boolean) (!(xw->flags & SMOOTHSCROLL)); 7372d522f475Smrg update_jumpscroll(); 7373d522f475Smrg 7374d522f475Smrg if (screen->c132 && (xw->flags & IN132COLUMNS)) { 73752eaa94a1Schristos Dimension reqWidth = (Dimension) (80 * FontWidth(screen) 73762eaa94a1Schristos + 2 * screen->border 73772eaa94a1Schristos + ScrollbarWidth(screen)); 73782eaa94a1Schristos Dimension reqHeight = (Dimension) (FontHeight(screen) 73792eaa94a1Schristos * MaxRows(screen) 73802eaa94a1Schristos + 2 * screen->border); 7381d522f475Smrg Dimension replyWidth; 7382d522f475Smrg Dimension replyHeight; 7383d522f475Smrg 7384d522f475Smrg TRACE(("Making resize-request to restore 80-columns %dx%d\n", 7385d522f475Smrg reqHeight, reqWidth)); 73862eaa94a1Schristos REQ_RESIZE((Widget) xw, 73872eaa94a1Schristos reqWidth, 73882eaa94a1Schristos reqHeight, 73892eaa94a1Schristos &replyWidth, &replyHeight); 7390d522f475Smrg repairSizeHints(); 7391d522f475Smrg XSync(screen->display, False); /* synchronize */ 7392d522f475Smrg if (XtAppPending(app_con)) 7393d522f475Smrg xevents(); 7394d522f475Smrg } 7395d522f475Smrg 7396d522f475Smrg CursorSet(screen, 0, 0, xw->flags); 7397d522f475Smrg CursorSave(xw); 7398d522f475Smrg } else { /* DECSTR */ 7399d522f475Smrg /* 7400d522f475Smrg * There's a tiny difference, to accommodate usage of xterm. 7401d522f475Smrg * We reset autowrap to the resource values rather than turning 7402d522f475Smrg * it off. 7403d522f475Smrg */ 7404d522f475Smrg xw->keyboard.flags &= ~(MODE_DECCKM | MODE_KAM | MODE_DECKPAM); 7405d522f475Smrg bitcpy(&xw->flags, xw->initflags, WRAPAROUND | REVERSEWRAP); 7406d522f475Smrg bitclr(&xw->flags, INSERT | INVERSE | BOLD | BLINK | UNDERLINE | INVISIBLE); 7407d522f475Smrg if_OPT_ISO_COLORS(screen, { 7408d522f475Smrg reset_SGR_Colors(xw); 7409d522f475Smrg }); 7410d522f475Smrg update_appcursor(); 7411d522f475Smrg update_autowrap(); 7412d522f475Smrg update_reversewrap(); 7413d522f475Smrg 7414d522f475Smrg CursorSave(xw); 7415d522f475Smrg screen->sc[screen->alternate != False].row = 7416d522f475Smrg screen->sc[screen->alternate != False].col = 0; 7417d522f475Smrg } 7418d522f475Smrg longjmp(vtjmpbuf, 1); /* force ground state in parser */ 7419d522f475Smrg} 7420d522f475Smrg 7421d522f475Smrg/* 7422d522f475Smrg * set_character_class - takes a string of the form 7423d522f475Smrg * 7424d522f475Smrg * low[-high]:val[,low[-high]:val[...]] 7425d522f475Smrg * 7426d522f475Smrg * and sets the indicated ranges to the indicated values. 7427d522f475Smrg */ 7428d522f475Smrgstatic int 7429d522f475Smrgset_character_class(char *s) 7430d522f475Smrg{ 7431d522f475Smrg int i; /* iterator, index into s */ 7432d522f475Smrg int len; /* length of s */ 7433d522f475Smrg int acc; /* accumulator */ 7434d522f475Smrg int low, high; /* bounds of range [0..127] */ 7435d522f475Smrg int base; /* 8, 10, 16 (octal, decimal, hex) */ 7436d522f475Smrg int numbers; /* count of numbers per range */ 7437d522f475Smrg int digits; /* count of digits in a number */ 7438d522f475Smrg static char *errfmt = "%s: %s in range string \"%s\" (position %d)\n"; 7439d522f475Smrg 7440d522f475Smrg if (!s || !s[0]) 7441d522f475Smrg return -1; 7442d522f475Smrg 7443d522f475Smrg base = 10; /* in case we ever add octal, hex */ 7444d522f475Smrg low = high = -1; /* out of range */ 7445d522f475Smrg 74462eaa94a1Schristos for (i = 0, len = (int) strlen(s), acc = 0, numbers = digits = 0; 7447d522f475Smrg i < len; i++) { 74482eaa94a1Schristos Char c = CharOf(s[i]); 7449d522f475Smrg 7450d522f475Smrg if (isspace(c)) { 7451d522f475Smrg continue; 7452d522f475Smrg } else if (isdigit(c)) { 7453d522f475Smrg acc = acc * base + (c - '0'); 7454d522f475Smrg digits++; 7455d522f475Smrg continue; 7456d522f475Smrg } else if (c == '-') { 7457d522f475Smrg low = acc; 7458d522f475Smrg acc = 0; 7459d522f475Smrg if (digits == 0) { 7460d522f475Smrg fprintf(stderr, errfmt, ProgramName, "missing number", s, i); 7461d522f475Smrg return (-1); 7462d522f475Smrg } 7463d522f475Smrg digits = 0; 7464d522f475Smrg numbers++; 7465d522f475Smrg continue; 7466d522f475Smrg } else if (c == ':') { 7467d522f475Smrg if (numbers == 0) 7468d522f475Smrg low = acc; 7469d522f475Smrg else if (numbers == 1) 7470d522f475Smrg high = acc; 7471d522f475Smrg else { 7472d522f475Smrg fprintf(stderr, errfmt, ProgramName, "too many numbers", 7473d522f475Smrg s, i); 7474d522f475Smrg return (-1); 7475d522f475Smrg } 7476d522f475Smrg digits = 0; 7477d522f475Smrg numbers++; 7478d522f475Smrg acc = 0; 7479d522f475Smrg continue; 7480d522f475Smrg } else if (c == ',') { 7481d522f475Smrg /* 7482d522f475Smrg * now, process it 7483d522f475Smrg */ 7484d522f475Smrg 7485d522f475Smrg if (high < 0) { 7486d522f475Smrg high = low; 7487d522f475Smrg numbers++; 7488d522f475Smrg } 7489d522f475Smrg if (numbers != 2) { 7490d522f475Smrg fprintf(stderr, errfmt, ProgramName, "bad value number", 7491d522f475Smrg s, i); 7492d522f475Smrg } else if (SetCharacterClassRange(low, high, acc) != 0) { 7493d522f475Smrg fprintf(stderr, errfmt, ProgramName, "bad range", s, i); 7494d522f475Smrg } 7495d522f475Smrg 7496d522f475Smrg low = high = -1; 7497d522f475Smrg acc = 0; 7498d522f475Smrg digits = 0; 7499d522f475Smrg numbers = 0; 7500d522f475Smrg continue; 7501d522f475Smrg } else { 7502d522f475Smrg fprintf(stderr, errfmt, ProgramName, "bad character", s, i); 7503d522f475Smrg return (-1); 7504d522f475Smrg } /* end if else if ... else */ 7505d522f475Smrg 7506d522f475Smrg } 7507d522f475Smrg 7508d522f475Smrg if (low < 0 && high < 0) 7509d522f475Smrg return (0); 7510d522f475Smrg 7511d522f475Smrg /* 7512d522f475Smrg * now, process it 7513d522f475Smrg */ 7514d522f475Smrg 7515d522f475Smrg if (high < 0) 7516d522f475Smrg high = low; 7517d522f475Smrg if (numbers < 1 || numbers > 2) { 7518d522f475Smrg fprintf(stderr, errfmt, ProgramName, "bad value number", s, i); 7519d522f475Smrg } else if (SetCharacterClassRange(low, high, acc) != 0) { 7520d522f475Smrg fprintf(stderr, errfmt, ProgramName, "bad range", s, i); 7521d522f475Smrg } 7522d522f475Smrg 7523d522f475Smrg return (0); 7524d522f475Smrg} 7525d522f475Smrg 7526d522f475Smrg/* ARGSUSED */ 7527d522f475Smrgstatic void 7528d522f475SmrgHandleKeymapChange(Widget w, 7529d522f475Smrg XEvent * event GCC_UNUSED, 7530d522f475Smrg String * params, 7531d522f475Smrg Cardinal *param_count) 7532d522f475Smrg{ 7533d522f475Smrg static XtTranslations keymap, original; 7534d522f475Smrg static XtResource key_resources[] = 7535d522f475Smrg { 7536d522f475Smrg {XtNtranslations, XtCTranslations, XtRTranslationTable, 7537d522f475Smrg sizeof(XtTranslations), 0, XtRTranslationTable, (XtPointer) NULL} 7538d522f475Smrg }; 7539d522f475Smrg char mapName[1000]; 7540d522f475Smrg char mapClass[1000]; 7541d522f475Smrg char *pmapName; 7542d522f475Smrg char *pmapClass; 7543d522f475Smrg size_t len; 7544d522f475Smrg 7545d522f475Smrg if (*param_count != 1) 7546d522f475Smrg return; 7547d522f475Smrg 7548d522f475Smrg if (original == NULL) 7549d522f475Smrg original = w->core.tm.translations; 7550d522f475Smrg 7551d522f475Smrg if (strcmp(params[0], "None") == 0) { 7552d522f475Smrg XtOverrideTranslations(w, original); 7553d522f475Smrg return; 7554d522f475Smrg } 7555d522f475Smrg 7556d522f475Smrg len = strlen(params[0]) + 7; 7557d522f475Smrg 7558d522f475Smrg pmapName = (char *) MyStackAlloc(len, mapName); 7559d522f475Smrg pmapClass = (char *) MyStackAlloc(len, mapClass); 7560d522f475Smrg if (pmapName == NULL 7561d522f475Smrg || pmapClass == NULL) 7562d522f475Smrg SysError(ERROR_KMMALLOC1); 7563d522f475Smrg 7564d522f475Smrg (void) sprintf(pmapName, "%sKeymap", params[0]); 7565d522f475Smrg (void) strcpy(pmapClass, pmapName); 7566d522f475Smrg if (islower(CharOf(pmapClass[0]))) 75672eaa94a1Schristos pmapClass[0] = x_toupper(pmapClass[0]); 7568d522f475Smrg XtGetSubresources(w, (XtPointer) &keymap, pmapName, pmapClass, 7569d522f475Smrg key_resources, (Cardinal) 1, NULL, (Cardinal) 0); 7570d522f475Smrg if (keymap != NULL) 7571d522f475Smrg XtOverrideTranslations(w, keymap); 7572d522f475Smrg 7573d522f475Smrg MyStackFree(pmapName, mapName); 7574d522f475Smrg MyStackFree(pmapClass, mapClass); 7575d522f475Smrg} 7576d522f475Smrg 7577d522f475Smrg/* ARGSUSED */ 7578d522f475Smrgstatic void 7579d522f475SmrgHandleBell(Widget w GCC_UNUSED, 7580d522f475Smrg XEvent * event GCC_UNUSED, 7581d522f475Smrg String * params, /* [0] = volume */ 7582d522f475Smrg Cardinal *param_count) /* 0 or 1 */ 7583d522f475Smrg{ 7584d522f475Smrg int percent = (*param_count) ? atoi(params[0]) : 0; 7585d522f475Smrg 7586d522f475Smrg Bell(XkbBI_TerminalBell, percent); 7587d522f475Smrg} 7588d522f475Smrg 7589d522f475Smrg/* ARGSUSED */ 7590d522f475Smrgstatic void 7591d522f475SmrgHandleVisualBell(Widget w GCC_UNUSED, 7592d522f475Smrg XEvent * event GCC_UNUSED, 7593d522f475Smrg String * params GCC_UNUSED, 7594d522f475Smrg Cardinal *param_count GCC_UNUSED) 7595d522f475Smrg{ 7596d522f475Smrg VisualBell(); 7597d522f475Smrg} 7598d522f475Smrg 7599d522f475Smrg/* ARGSUSED */ 7600d522f475Smrgstatic void 7601d522f475SmrgHandleIgnore(Widget w, 7602d522f475Smrg XEvent * event, 7603d522f475Smrg String * params GCC_UNUSED, 7604d522f475Smrg Cardinal *param_count GCC_UNUSED) 7605d522f475Smrg{ 7606d522f475Smrg if (IsXtermWidget(w)) { 7607d522f475Smrg /* do nothing, but check for funny escape sequences */ 7608d522f475Smrg (void) SendMousePosition((XtermWidget) w, event); 7609d522f475Smrg } 7610d522f475Smrg} 7611d522f475Smrg 7612d522f475Smrg/* ARGSUSED */ 7613d522f475Smrgstatic void 7614d522f475SmrgDoSetSelectedFont(Widget w, 7615d522f475Smrg XtPointer client_data GCC_UNUSED, 7616d522f475Smrg Atom * selection GCC_UNUSED, 7617d522f475Smrg Atom * type, 7618d522f475Smrg XtPointer value, 7619d522f475Smrg unsigned long *length, 7620d522f475Smrg int *format) 7621d522f475Smrg{ 7622d522f475Smrg if (!IsXtermWidget(w) || *type != XA_STRING || *format != 8) { 7623d522f475Smrg Bell(XkbBI_MinorError, 0); 7624d522f475Smrg } else { 7625d522f475Smrg Boolean failed = False; 7626d522f475Smrg XtermWidget xw = (XtermWidget) w; 7627d522f475Smrg int oldFont = xw->screen.menu_font_number; 7628d522f475Smrg char *save = xw->screen.MenuFontName(fontMenu_fontsel); 7629d522f475Smrg char *val; 7630d522f475Smrg char *test = 0; 7631d522f475Smrg char *used = 0; 7632d522f475Smrg unsigned len = *length; 7633d522f475Smrg unsigned tst; 7634d522f475Smrg 7635d522f475Smrg /* 7636d522f475Smrg * Some versions of X deliver null-terminated selections, some do not. 7637d522f475Smrg */ 7638d522f475Smrg for (tst = 0; tst < len; ++tst) { 7639d522f475Smrg if (((char *) value)[tst] == '\0') { 7640d522f475Smrg len = tst; 7641d522f475Smrg break; 7642d522f475Smrg } 7643d522f475Smrg } 7644d522f475Smrg 7645d522f475Smrg if (len > 0 && (val = TypeMallocN(char, len + 1)) != 0) { 7646d522f475Smrg memcpy(val, value, len); 7647d522f475Smrg val[len] = '\0'; 7648d522f475Smrg used = x_strtrim(val); 7649d522f475Smrg TRACE(("DoSetSelectedFont(%s)\n", val)); 7650d522f475Smrg /* Do some sanity checking to avoid sending a long selection 7651d522f475Smrg back to the server in an OpenFont that is unlikely to succeed. 7652d522f475Smrg XLFD allows up to 255 characters and no control characters; 7653d522f475Smrg we are a little more liberal here. */ 7654d522f475Smrg if (len < 1000 7655d522f475Smrg && !strchr(val, '\n') 7656d522f475Smrg && (test = x_strdup(val)) != 0) { 7657d522f475Smrg xw->screen.MenuFontName(fontMenu_fontsel) = test; 7658d522f475Smrg if (!xtermLoadFont(term, 7659d522f475Smrg xtermFontName(val), 7660d522f475Smrg True, 7661d522f475Smrg fontMenu_fontsel)) { 7662d522f475Smrg failed = True; 7663d522f475Smrg free(test); 7664d522f475Smrg xw->screen.MenuFontName(fontMenu_fontsel) = save; 7665d522f475Smrg } 7666d522f475Smrg } else { 7667d522f475Smrg failed = True; 7668d522f475Smrg } 7669d522f475Smrg if (failed) { 7670d522f475Smrg (void) xtermLoadFont(term, 7671d522f475Smrg xtermFontName(xw->screen.MenuFontName(oldFont)), 7672d522f475Smrg True, 7673d522f475Smrg oldFont); 7674d522f475Smrg Bell(XkbBI_MinorError, 0); 7675d522f475Smrg } 7676d522f475Smrg if (used != val) 7677d522f475Smrg free(used); 7678d522f475Smrg free(val); 7679d522f475Smrg } 7680d522f475Smrg } 7681d522f475Smrg} 7682d522f475Smrg 7683d522f475Smrgvoid 7684d522f475SmrgFindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe) 7685d522f475Smrg{ 7686d522f475Smrg static AtomPtr *atoms; 76872eaa94a1Schristos unsigned int atomCount = 0; 7688d522f475Smrg AtomPtr *pAtom; 76892eaa94a1Schristos unsigned a; 7690d522f475Smrg Atom target; 7691d522f475Smrg 7692d522f475Smrg if (!atom_name) 7693d522f475Smrg atom_name = (xw->screen.mappedSelect 7694d522f475Smrg ? xw->screen.mappedSelect[0] 7695d522f475Smrg : "PRIMARY"); 7696d522f475Smrg TRACE(("FindFontSelection(%s)\n", atom_name)); 7697d522f475Smrg 7698d522f475Smrg for (pAtom = atoms, a = atomCount; a; a--, pAtom++) { 7699d522f475Smrg if (strcmp(atom_name, XmuNameOfAtom(*pAtom)) == 0) 7700d522f475Smrg break; 7701d522f475Smrg } 7702d522f475Smrg if (!a) { 7703d522f475Smrg atoms = (AtomPtr *) XtRealloc((char *) atoms, 7704d522f475Smrg sizeof(AtomPtr) * (atomCount + 1)); 7705d522f475Smrg *(pAtom = &atoms[atomCount++]) = XmuMakeAtom(atom_name); 7706d522f475Smrg } 7707d522f475Smrg 7708d522f475Smrg target = XmuInternAtom(XtDisplay(xw), *pAtom); 7709d522f475Smrg if (justprobe) { 7710d522f475Smrg xw->screen.MenuFontName(fontMenu_fontsel) = 7711d522f475Smrg XGetSelectionOwner(XtDisplay(xw), target) ? _Font_Selected_ : 0; 7712d522f475Smrg } else { 7713d522f475Smrg XtGetSelectionValue((Widget) xw, target, XA_STRING, 7714d522f475Smrg DoSetSelectedFont, NULL, 7715d522f475Smrg XtLastTimestampProcessed(XtDisplay(xw))); 7716d522f475Smrg } 7717d522f475Smrg return; 7718d522f475Smrg} 7719d522f475Smrg 7720d522f475Smrgvoid 7721d522f475Smrgset_cursor_gcs(XtermWidget xw) 7722d522f475Smrg{ 7723d522f475Smrg TScreen *screen = &(xw->screen); 7724d522f475Smrg VTwin *win = WhichVWin(screen); 7725d522f475Smrg 7726d522f475Smrg Pixel cc = T_COLOR(screen, TEXT_CURSOR); 7727d522f475Smrg Pixel fg = T_COLOR(screen, TEXT_FG); 7728d522f475Smrg Pixel bg = T_COLOR(screen, TEXT_BG); 7729d522f475Smrg Boolean changed = False; 7730d522f475Smrg 7731d522f475Smrg /* 7732d522f475Smrg * Let's see, there are three things that have "color": 7733d522f475Smrg * 7734d522f475Smrg * background 7735d522f475Smrg * text 7736d522f475Smrg * cursorblock 7737d522f475Smrg * 7738d522f475Smrg * And, there are four situations when drawing a cursor, if we decide 7739d522f475Smrg * that we like have a solid block of cursor color with the letter 7740d522f475Smrg * that it is highlighting shown in the background color to make it 7741d522f475Smrg * stand out: 7742d522f475Smrg * 7743d522f475Smrg * selected window, normal video - background on cursor 7744d522f475Smrg * selected window, reverse video - foreground on cursor 7745d522f475Smrg * unselected window, normal video - foreground on background 7746d522f475Smrg * unselected window, reverse video - background on foreground 7747d522f475Smrg * 7748d522f475Smrg * Since the last two are really just normalGC and reverseGC, we only 7749d522f475Smrg * need two new GC's. Under monochrome, we get the same effect as 7750d522f475Smrg * above by setting cursor color to foreground. 7751d522f475Smrg */ 7752d522f475Smrg 7753d522f475Smrg TRACE(("set_cursor_gcs cc=%#lx, fg=%#lx, bg=%#lx\n", cc, fg, bg)); 7754d522f475Smrg if (win != 0 && (cc != bg)) { 7755d522f475Smrg /* set the fonts to the current one */ 7756d522f475Smrg setCgsFont(xw, win, gcVTcursNormal, 0); 7757d522f475Smrg setCgsFont(xw, win, gcVTcursFilled, 0); 7758d522f475Smrg setCgsFont(xw, win, gcVTcursReverse, 0); 7759d522f475Smrg setCgsFont(xw, win, gcVTcursOutline, 0); 7760d522f475Smrg 7761d522f475Smrg /* we have a colored cursor */ 7762d522f475Smrg setCgsFore(xw, win, gcVTcursNormal, fg); 7763d522f475Smrg setCgsBack(xw, win, gcVTcursNormal, cc); 7764d522f475Smrg 7765d522f475Smrg setCgsFore(xw, win, gcVTcursFilled, cc); 7766d522f475Smrg setCgsBack(xw, win, gcVTcursFilled, fg); 7767d522f475Smrg 7768d522f475Smrg if (screen->always_highlight) { 7769d522f475Smrg /* both GC's use the same color */ 7770d522f475Smrg setCgsFore(xw, win, gcVTcursReverse, bg); 7771d522f475Smrg setCgsBack(xw, win, gcVTcursReverse, cc); 7772d522f475Smrg 7773d522f475Smrg setCgsFore(xw, win, gcVTcursOutline, bg); 7774d522f475Smrg setCgsBack(xw, win, gcVTcursOutline, cc); 7775d522f475Smrg } else { 7776d522f475Smrg setCgsFore(xw, win, gcVTcursReverse, bg); 7777d522f475Smrg setCgsBack(xw, win, gcVTcursReverse, cc); 7778d522f475Smrg 7779d522f475Smrg setCgsFore(xw, win, gcVTcursOutline, cc); 7780d522f475Smrg setCgsBack(xw, win, gcVTcursOutline, bg); 7781d522f475Smrg } 7782d522f475Smrg changed = True; 7783d522f475Smrg } 7784d522f475Smrg 7785d522f475Smrg if (changed) { 7786d522f475Smrg TRACE(("...set_cursor_gcs - done\n")); 7787d522f475Smrg } 7788d522f475Smrg} 7789d522f475Smrg 7790d522f475Smrg#ifdef NO_LEAKS 7791d522f475Smrgvoid 7792d522f475Smrgnoleaks_charproc(void) 7793d522f475Smrg{ 7794d522f475Smrg if (v_buffer != 0) 7795d522f475Smrg free(v_buffer); 7796d522f475Smrg} 7797d522f475Smrg#endif 7798