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